From 0420c169a232add2938cceb04cbe60c74465834f Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 13 Aug 2025 12:02:55 +0000 Subject: [PATCH 01/28] fix(pnpm): ignore .pnpm-store/ --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 139aa27bf..ade4d48bf 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ node.log node_modules/ forge-std/ **/lib/forge-std/ +.pnpm-store/ # Yarn .yarn/* From 1eec283427bc7860758b2cc076c2e27b5354f31b Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 13 Aug 2025 12:04:23 +0000 Subject: [PATCH 02/28] feat(container): ugrade dev container to use Claude, /work dir, and JSON5 --- .devcontainer/Dockerfile | 3 +++ .devcontainer/devcontainer.json | 8 ++++++-- .devcontainer/docker-compose.yml | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 9c542e4d9..221072795 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -47,6 +47,9 @@ RUN npm install -g ethers@6.13.4 # Install cloc for code analysis RUN npm install -g cloc +# Install Claude Code +RUN npm install -g @anthropic-ai/claude-code + # Install Foundry for Anvil (as root for global installation) RUN curl -L https://foundry.paradigm.xyz | bash && \ /root/.foundry/bin/foundryup && \ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 8d7fb643d..3d619eab0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,9 +16,12 @@ }, "postCreateCommand": ".devcontainer/project-setup.sh", "remoteUser": "vscode", - "workspaceFolder": "${localWorkspaceFolder}", + "workspaceFolder": "/work", "customizations": { "vscode": { + "settings": { + "terminal.integrated.cwd": "/work" + }, "extensions": [ "rust-lang.rust-analyzer", "tamasfe.even-better-toml", @@ -35,7 +38,8 @@ "streetsidesoftware.code-spell-checker", "Augment.vscode-augment", "NomicFoundation.hardhat-solidity", - "foundry-rs.foundry-vscode" + "foundry-rs.foundry-vscode", + "BlueGlassBlock.better-json5" ] } } diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index d16a44b34..824bb9baf 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -3,6 +3,8 @@ services: build: context: . dockerfile: Dockerfile + user: vscode + working_dir: /work env_file: - /opt/configs/graphprotocol/contracts.env environment: @@ -31,6 +33,8 @@ services: # Note: NPM, Foundry, and Solidity caches are intentionally not set # to avoid cross-branch contamination. Tools will use their default locations. volumes: + - ..:/work + # Git repo root - /git:/git From 85bc48fb5d079cb6d475eaf9409e4d21bd9bca12 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 14 Aug 2025 08:47:30 +0000 Subject: [PATCH 03/28] feat: upgrade of pnpm, linting, package dependencies, and linting fixes --- .github/workflows/build-test.yml | 2 +- .github/workflows/lint.yml | 18 - .gitignore | 10 +- .markdownlint.json | 11 +- .markdownlintignore | 37 + .prettierignore | 5 +- README.md | 163 ++- eslint.config.mjs | 24 +- package.json | 28 +- packages/common/.solhint.json | 3 + .../contracts/rewards/IRewardsManager.sol | 15 +- .../common/contracts/token/IGraphToken.sol | 3 + packages/common/package.json | 27 +- packages/contracts/.solhint.json | 3 + .../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 | 45 +- .../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 | 44 +- .../contracts/curation/CurationStorage.sol | 25 +- .../contracts/curation/GraphCurationToken.sol | 13 +- .../contracts/curation/ICuration.sol | 7 +- .../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 | 3 +- .../contracts/discovery/ServiceRegistry.sol | 50 +- .../discovery/ServiceRegistryStorage.sol | 10 +- .../contracts/discovery/SubgraphNFT.sol | 76 +- .../discovery/SubgraphNFTDescriptor.sol | 10 +- .../discovery/erc1056/EthereumDIDRegistry.sol | 173 +++ .../erc1056/IEthereumDIDRegistry.sol | 17 + .../contracts/disputes/DisputeManager.sol | 207 ++-- .../disputes/DisputeManagerStorage.sol | 29 +- .../contracts/disputes/IDisputeManager.sol | 118 +- .../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 | 132 ++- .../contracts/governance/Controller.sol | 50 +- .../contracts/governance/Governed.sol | 28 +- .../contracts/governance/IController.sol | 50 + .../contracts/governance/IManaged.sol | 12 +- .../contracts/governance/Managed.sol | 72 +- .../contracts/governance/Pausable.sol | 38 +- .../contracts/l2/curation/IL2Curation.sol | 2 + .../contracts/l2/curation/L2Curation.sol | 64 +- .../contracts/l2/discovery/IL2GNS.sol | 11 + .../contracts/l2/discovery/L2GNS.sol | 56 +- .../contracts/l2/discovery/L2GNSStorage.sol | 4 +- .../l2/gateway/L2GraphTokenGateway.sol | 79 +- .../contracts/l2/staking/IL2Staking.sol | 12 +- .../contracts/l2/staking/IL2StakingBase.sol | 10 + .../contracts/l2/staking/L2Staking.sol | 21 +- .../l2/token/GraphTokenUpgradeable.sol | 27 +- .../contracts/l2/token/L2GraphToken.sol | 45 +- .../contracts/libraries/Base58Encoder.sol | 39 +- .../contracts/libraries/HexStrings.sol | 21 +- .../contracts/payments/AllocationExchange.sol | 62 +- .../contracts/rewards/RewardsManager.sol | 88 +- .../rewards/RewardsManagerStorage.sol | 36 +- .../rewards/SubgraphAvailabilityManager.sol | 43 +- .../staking/IL1GraphTokenLockTransferTool.sol | 3 +- .../contracts/staking/IL1Staking.sol | 1 + .../contracts/staking/IL1StakingBase.sol | 33 +- .../contracts/contracts/staking/IStaking.sol | 1 + .../contracts/staking/IStakingBase.sol | 74 +- .../contracts/staking/IStakingData.sol | 26 +- .../contracts/staking/IStakingExtension.sol | 42 +- .../contracts/contracts/staking/L1Staking.sol | 90 +- .../contracts/staking/L1StakingStorage.sol | 3 +- .../contracts/contracts/staking/Staking.sol | 180 +-- .../contracts/staking/StakingExtension.sol | 161 +-- .../contracts/staking/StakingStorage.sol | 14 +- .../contracts/staking/libs/Exponential.sol | 3 +- .../contracts/staking/libs/LibFixedMath.sol | 111 +- .../contracts/staking/libs/MathUtils.sol | 19 +- .../contracts/staking/libs/Stakes.sol | 39 +- .../contracts/tests/CallhookReceiverMock.sol | 22 +- .../contracts/tests/GovernedMock.sol | 9 +- .../L1GraphTokenLockTransferToolBadMock.sol | 17 +- .../L1GraphTokenLockTransferToolMock.sol | 16 + .../contracts/tests/LegacyGNSMock.sol | 3 + .../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 | 64 +- .../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 | 15 +- packages/contracts/package.json | 31 +- packages/contracts/task/package.json | 1 - packages/contracts/task/prettier.config.cjs | 5 + packages/contracts/test/hardhat.config.ts | 60 +- packages/contracts/test/package.json | 7 +- packages/contracts/test/prettier.config.cjs | 5 + .../tests/unit/governance/governed.test.ts | 4 +- .../tests/unit/l2/l2GraphTokenGateway.test.ts | 32 +- .../test/tests/unit/rewards/rewards.test.ts | 10 +- .../tests/unit/staking/configuration.test.ts | 6 +- packages/data-edge/.solhint.json | 3 + packages/data-edge/contracts/DataEdge.sol | 4 +- .../data-edge/contracts/EventfulDataEdge.sol | 5 + packages/data-edge/package.json | 18 +- packages/sdk/package.json | 36 +- .../network/deployment/contracts/load.ts | 2 +- packages/sdk/src/gre/test/accounts.test.ts | 6 +- packages/sdk/src/gre/test/config.test.ts | 12 +- .../gre/test/files/config/graph.goerli.yml | 12 +- packages/sdk/src/gre/test/gre.test.ts | 2 +- packages/sdk/tsconfig.json | 4 +- .../.graphclient-extracted/index.d.ts | 552 +++++++++ .../.graphclient-extracted/index.js | 103 ++ packages/token-distribution/.solhint.json | 3 + .../contracts/GraphTokenDistributor.sol | 11 +- .../contracts/GraphTokenLock.sol | 29 +- .../contracts/GraphTokenLockManager.sol | 16 +- .../contracts/GraphTokenLockSimple.sol | 9 +- .../contracts/GraphTokenLockWallet.sol | 25 +- .../contracts/ICallhookReceiver.sol | 3 + .../contracts/IGraphTokenLock.sol | 3 +- .../contracts/IGraphTokenLockManager.sol | 7 +- .../L1GraphTokenLockTransferTool.sol | 7 + .../contracts/L2GraphTokenLockManager.sol | 5 + .../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 | 7 +- .../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 + packages/token-distribution/ops/info.ts | 4 +- packages/token-distribution/package.json | 26 +- packages/token-distribution/scripts/build.js | 67 +- .../scripts/extract-graphclient.js | 190 +++ pnpm-lock.yaml | 1047 +++++++++-------- pnpm-workspace.yaml | 49 +- scripts/check-todos.sh | 78 ++ scripts/lint-staged-run.sh | 51 + scripts/verify-solhint-disables.js | 299 +++++ tsconfig.json | 7 +- 175 files changed, 5279 insertions(+), 2081 deletions(-) create mode 100644 .markdownlintignore create mode 100644 packages/common/.solhint.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/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 100755 scripts/check-todos.sh create mode 100755 scripts/lint-staged-run.sh create mode 100755 scripts/verify-solhint-disables.js diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 3450ef3bd..5ca3b2fcd 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -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 ade4d48bf..51086e4bd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,6 @@ node.log # Dependency directories node_modules/ -forge-std/ -**/lib/forge-std/ .pnpm-store/ # Yarn @@ -30,8 +28,12 @@ packages/*/.eslintcache # Build artifacts dist/ build/ +typechain/ +typechain-types/ types/ deployments/hardhat/ +*.js.map +*.d.ts.map # TypeScript incremental compilation cache **/tsconfig.tsbuildinfo @@ -52,13 +54,12 @@ lcov.info hardhat-dependency-compiler/ # Local test files -addresses-local.json +addresses-local*.json localNetwork.json arbitrum-addresses-local.json tx-*.log addresses-fork.json addresses-hardhat.json -addresses-local-network.json # Keys .keystore @@ -67,7 +68,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..66420fefa 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -1,9 +1,14 @@ { "default": true, + "MD004": { "style": "dash" }, + "MD007": { "indent": 2 }, "MD013": false, + "MD022": false, "MD024": { "siblings_only": true }, - "MD033": false, "MD029": { "style": "ordered" }, - "MD007": { "indent": 2 }, - "MD004": { "style": "dash" } + "MD031": false, + "MD032": false, + "MD033": false, + "MD040": false, + "MD047": false } diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 000000000..7e6987fa7 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,37 @@ +# Autogenerated GraphClient files (committed but should not be linted) +**/.graphclient-extracted/ +**/.graphclient/ + +# Dependencies (from .gitignore patterns) +node_modules/ +lib/ + +# Build outputs that might contain markdown +**/build/ +**/dist/ +**/artifacts/ +**/typechain-types/ +**/types/ +**/cache/ +**/cached/ +cache +typechain/ +bin/ +forge-artifacts/ +out/ + +# Coverage and reports +coverage/ +reports/ +coverage.json +lcov.info +.nyc_output/ + +# Other generated files +.eslintcache +packages/*/.eslintcache +deployments/hardhat/ +.graphclient +**/chain-*/ +**/*-localhost/ +**/*-hardhat/ diff --git a/.prettierignore b/.prettierignore index cf4392420..392204805 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,7 +5,9 @@ yarn.lock # Dependencies (from .gitignore) node_modules/ -forge-std/ + +# Third-party libraries in lib directories +**/lib/ # Build outputs (from .gitignore) **/build/ @@ -33,6 +35,7 @@ lcov.info packages/*/.eslintcache deployments/hardhat/ .graphclient +**/.graphclient-extracted/ **/chain-31337/ **/chain-1377/ **/horizon-localhost/ diff --git a/README.md b/README.md index fd7cb8047..57236c500 100644 --- a/README.md +++ b/README.md @@ -35,13 +35,13 @@ This repository is a pnpm workspaces monorepo containing the following packages: | Package | Latest version | Description | | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | +| [common](./packages/common) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fcommon.svg)](https://badge.fury.io/js/@graphprotocol%2Fcommon) | Common utilities and configuration for Graph Protocol packages | | [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) | [![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 | | [horizon](./packages/horizon) | - | Contracts for Graph Horizon, the next iteration of The Graph protocol. | -| [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 | -| [sdk](./packages/sdk) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fsdk.svg)](https://badge.fury.io/js/@graphprotocol%2Fsdk) | TypeScript based SDK to interact with the 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 | -| [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 | -| [common](./packages/common) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fcommon.svg)](https://badge.fury.io/js/@graphprotocol%2Fcommon) | Common utilities and configuration for Graph Protocol packages | +| [sdk](./packages/sdk) | [![npm version](https://badge.fury.io/js/@graphprotocol%2Fsdk.svg)](https://badge.fury.io/js/@graphprotocol%2Fsdk) | TypeScript based SDK to interact with the protocol contracts | +| [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 | ## Development @@ -117,6 +117,161 @@ 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 +- **NatSpec Smells**: Documentation quality checks for Solidity contracts + +### 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 | +| NatSpec | No config required | No config required | 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 +- **NatSpec linting failing**: Ensure package dependencies are properly declared in `package.json` and installed. The linting runs in each package's context and resolves imports through the package dependency system +- **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 8b660d4bc..f50113458 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -154,15 +154,6 @@ export default [ }, rules: { 'unused-imports/no-unused-imports': 'warn', - 'unused-imports/no-unused-vars': [ - 'warn', - { - vars: 'all', - varsIgnorePattern: '^_', - args: 'after-used', - argsIgnorePattern: '^_', - }, - ], }, }, @@ -205,8 +196,9 @@ export default [ '@typescript-eslint/no-unused-vars': [ 'error', { - varsIgnorePattern: 'Null|Active|Closed|graph|_i', - argsIgnorePattern: '_', + varsIgnorePattern: '^_|Null|Active|Closed|graph|_i', + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', }, ], }, @@ -231,8 +223,8 @@ export default [ 'no-unused-vars': [ 'error', { - varsIgnorePattern: 'Null|Active|Closed|graph|_i', - argsIgnorePattern: '_', + varsIgnorePattern: '^_|Null|Active|Closed|graph|_i', + argsIgnorePattern: '^_', }, ], }, @@ -266,7 +258,11 @@ export default [ // Additional global ignores and unignores { ignores: [ - // Keep any patterns that might not be in .gitignore + // Autogenerated GraphClient files (committed but should not be linted) + '**/.graphclient-extracted/**', + '**/.graphclient/**', + // Third-party dependencies (Forge libraries, etc.) + '**/lib/**', ], }, diff --git a/package.json b/package.json index b2cf7f0ed..3a773164a 100644 --- a/package.json +++ b/package.json @@ -4,33 +4,30 @@ "description": "Contracts monorepo for The Graph protocol", "license": "GPL-2.0-or-later", "repository": "git@github.com:graphprotocol/contracts.git", - "author": "The Graph team", - "packageManager": "pnpm@9.0.6+sha1.648f6014eb363abb36618f2ba59282a9eeb3e879", + "author": "Edge & Node", + "packageManager": "pnpm@10.14.0", "scripts": { "postinstall": "husky", "clean": "pnpm -r run clean", - "clean:all": "pnpm clean && rm -rf 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", + "clean:all": "pnpm clean && rm -rf node_modules packages/*/node_modules && rm -rf node_modules packages/*/*/node_modules", + "build": "pnpm -r run build:self", + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json; pnpm lint:yaml", + "lint:staged": "npx 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", + "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": "pnpm -r run test:self", "test:coverage": "pnpm -r run test:coverage" }, "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", @@ -48,7 +45,7 @@ "prettier": "^3.5.3", "prettier-plugin-solidity": "^1.0.0", "pretty-quick": "^4.1.1", - "solhint": "^5.1.0", + "solhint": "catalog:", "typescript": "^5.8.3", "typescript-eslint": "^8.33.1", "yaml-lint": "^1.7.0" @@ -66,10 +63,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/common/.solhint.json b/packages/common/.solhint.json new file mode 100644 index 000000000..d30847305 --- /dev/null +++ b/packages/common/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": ["solhint:recommended", "./../../.solhint.json"] +} diff --git a/packages/common/contracts/rewards/IRewardsManager.sol b/packages/common/contracts/rewards/IRewardsManager.sol index 4bd42cad0..5d750dd85 100644 --- a/packages/common/contracts/rewards/IRewardsManager.sol +++ b/packages/common/contracts/rewards/IRewardsManager.sol @@ -2,9 +2,14 @@ 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 @@ -58,13 +63,7 @@ interface IRewardsManager { /** * @notice Gets the issuance of rewards per signal since last updated - * @dev Linear formula: `x = r * t` - * - * Notation: - * t: time steps are in blocks since last updated - * x: newly accrued rewards tokens for the period `t` - * - * @return newly accrued rewards per signal since last update, scaled by FIXED_POINT_SCALING_FACTOR + * @return newly accrued rewards per signal since last update */ function getNewRewardsPerSignal() external view returns (uint256); diff --git a/packages/common/contracts/token/IGraphToken.sol b/packages/common/contracts/token/IGraphToken.sol index c1d44a2f3..924183e46 100644 --- a/packages/common/contracts/token/IGraphToken.sol +++ b/packages/common/contracts/token/IGraphToken.sol @@ -2,10 +2,13 @@ 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 */ diff --git a/packages/common/package.json b/packages/common/package.json index cf0842774..8072a6d5f 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -21,32 +21,27 @@ "license": "GPL-2.0-or-later", "scripts": { "clean": "rm -rf build cache types artifacts", - "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:natspec; pnpm lint:md; pnpm lint:json", + "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'", - "lint:natspec": "cd ../.. && node scripts/filter-natspec.js --include 'packages/common/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": "hardhat compile", - "build:contracts": "hardhat compile", - "build:clean": "pnpm clean && pnpm build" + "format": "prettier -w --cache --log-level warn '**/*.{js,ts,cjs,mjs,jsx,tsx,json,md,yaml,yml}'" }, "dependencies": { "dotenv": "^16.3.1" }, "devDependencies": { - "@defi-wonderland/natspec-smells": "^1.1.6", + "@openzeppelin/contracts": "^5.3.0", + "@openzeppelin/contracts-upgradeable": "^5.3.0", "@types/node": "^20.17.50", - "eslint": "^9.28.0", - "eslint-config-prettier": "^10.1.5", + "eslint": "catalog:", + "eslint-config-prettier": "catalog:", "globals": "^16.1.0", - "hardhat": "^2.24.0", - "markdownlint-cli": "^0.45.0", - "prettier": "^3.5.3", - "prettier-plugin-solidity": "^2.0.0", - "solhint": "5.1.0", - "typescript": "^5.8.3", - "typescript-eslint": "^8.33.1" + "markdownlint-cli": "catalog:", + "prettier": "catalog:", + "solhint": "catalog:", + "typescript": "catalog:", + "typescript-eslint": "catalog:" } } 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/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 977fe07f2..fd0094398 100644 --- a/packages/contracts/contracts/arbitrum/ITokenGateway.sol +++ b/packages/contracts/contracts/arbitrum/ITokenGateway.sol @@ -25,6 +25,11 @@ pragma solidity ^0.7.6; +/** + * @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,21 +51,39 @@ 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 _amount, - uint256 _maxGas, - uint256 _gasPriceBid, - bytes calldata _data + address token, + address to, + 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, - address _to, - uint256 _amount, - bytes calldata _data + address token, + address from, + address to, + uint256 amount, + bytes calldata data ) external payable; /** 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 3269f694b..9b9de5ad0 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 173f1603a..4153d2c02 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"; @@ -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 @@ -256,7 +268,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { /** * @notice Get the amount of token reserves in a curation pool. - * @param _subgraphDeploymentID Subgraph deployment curation poool + * @param _subgraphDeploymentID Subgraph deployment curation pool * @return Amount of token reserves in the curation pool */ function getCurationPoolTokens(bytes32 _subgraphDeploymentID) external view override returns (uint256) { @@ -285,7 +297,7 @@ contract Curation is CurationV2Storage, GraphUpgradeable { /** * @notice Get the amount of signal in a curation pool. - * @param _subgraphDeploymentID Subgraph deployment curation poool + * @param _subgraphDeploymentID Subgraph deployment curation pool * @return Amount of signal minted for the subgraph deployment */ function getCurationPoolSignal(bytes32 _subgraphDeploymentID) public view override returns (uint256) { @@ -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 bcbf0df6b..8a22f0568 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 one-contract-per-file + 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. 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 d92aa9c69..64cc97948 100644 --- a/packages/contracts/contracts/curation/ICuration.sol +++ b/packages/contracts/contracts/curation/ICuration.sol @@ -4,7 +4,8 @@ pragma solidity ^0.7.6; /** * @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 -- @@ -84,14 +85,14 @@ interface ICuration { /** * @notice Get the amount of signal in a curation pool. - * @param _subgraphDeploymentID Subgraph deployment curation poool + * @param _subgraphDeploymentID Subgraph deployment curation pool * @return Amount of signal minted for the subgraph deployment */ function getCurationPoolSignal(bytes32 _subgraphDeploymentID) external view returns (uint256); /** * @notice Get the amount of token reserves in a curation pool. - * @param _subgraphDeploymentID Subgraph deployment curation poool + * @param _subgraphDeploymentID Subgraph deployment curation pool * @return Amount of token reserves in the curation pool */ function getCurationPoolTokens(bytes32 _subgraphDeploymentID) external view returns (uint256); 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..f9cddf2c6 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 one-contract-per-file + 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 9267c70d2..e962348c7 100644 --- a/packages/contracts/contracts/discovery/IGNS.sol +++ b/packages/contracts/contracts/discovery/IGNS.sol @@ -4,6 +4,8 @@ pragma solidity ^0.7.6; /** * @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 da284a409..94c7e428e 100644 --- a/packages/contracts/contracts/discovery/IServiceRegistry.sol +++ b/packages/contracts/contracts/discovery/IServiceRegistry.sol @@ -2,19 +2,52 @@ pragma solidity ^0.7.6; +/** + * @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 4b0495a28..9d6fe87a0 100644 --- a/packages/contracts/contracts/discovery/ISubgraphNFT.sol +++ b/packages/contracts/contracts/discovery/ISubgraphNFT.sol @@ -2,24 +2,66 @@ pragma solidity ^0.7.6; -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 55a831259..adbb51831 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..c5726a0ca 100644 --- a/packages/contracts/contracts/discovery/L1GNSStorage.sol +++ b/packages/contracts/contracts/discovery/L1GNSStorage.sol @@ -5,12 +5,13 @@ 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..7d4613d7d 100644 --- a/packages/contracts/contracts/discovery/ServiceRegistryStorage.sol +++ b/packages/contracts/contracts/discovery/ServiceRegistryStorage.sol @@ -2,12 +2,18 @@ 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..a423a70a4 100644 --- a/packages/contracts/contracts/discovery/SubgraphNFT.sol +++ b/packages/contracts/contracts/discovery/SubgraphNFT.sol @@ -2,35 +2,65 @@ 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 + +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 +68,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 +85,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 +105,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 +114,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..1cb3602ed 100644 --- a/packages/contracts/contracts/discovery/erc1056/EthereumDIDRegistry.sol +++ b/packages/contracts/contracts/discovery/erc1056/EthereumDIDRegistry.sol @@ -12,19 +12,50 @@ 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 + +/** + * @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 +64,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 +80,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 +93,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 +115,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 +172,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 +200,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 +246,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 +266,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 +308,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 +328,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 +374,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 +391,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 6700ec341..b07d7933c 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) @@ -179,7 +233,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa _setSlashingPercentage(_qrySlashingPercentage, _idxSlashingPercentage); // EIP-712 domain separator - DOMAIN_SEPARATOR = keccak256( + domainSeparator = keccak256( abi.encode( DOMAIN_TYPE_HASH, DOMAIN_NAME_HASH, @@ -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,28 +322,23 @@ 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 keccak256( abi.encodePacked( "\x19\x01", // EIP-191 encoding pad, EIP-712 version 1 - DOMAIN_SEPARATOR, + domainSeparator, keccak256( abi.encode( RECEIPT_TYPE_HASH, @@ -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) public 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..8d54eb74a 100644 --- a/packages/contracts/contracts/disputes/DisputeManagerStorage.sol +++ b/packages/contracts/contracts/disputes/DisputeManagerStorage.sol @@ -2,33 +2,40 @@ 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 domainSeparator; - // 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 8c6668371..2064fc5e7 100644 --- a/packages/contracts/contracts/disputes/IDisputeManager.sol +++ b/packages/contracts/contracts/disputes/IDisputeManager.sol @@ -3,15 +3,26 @@ pragma solidity ^0.7.6; 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 36b1f47a3..c59139249 100644 --- a/packages/contracts/contracts/epochs/IEpochManager.sol +++ b/packages/contracts/contracts/epochs/IEpochManager.sol @@ -2,30 +2,77 @@ pragma solidity ^0.7.6; +/** + * @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 885b0cdb2..a37a42380 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; +/** + * @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 73e414866..3bd0c6f0e 100644 --- a/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol +++ b/packages/contracts/contracts/gateway/L1GraphTokenGateway.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-strict-inequalities + 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 +21,8 @@ import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.s /** * @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 +32,35 @@ import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.s 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 +69,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 +85,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 +250,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 +272,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 +297,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 +305,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 +345,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 +371,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 +421,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 +457,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 +470,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 +486,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 affb29a05..0e582df44 100644 --- a/packages/contracts/contracts/governance/Controller.sol +++ b/packages/contracts/contracts/governance/Controller.sol @@ -2,6 +2,11 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events, gas-small-strings + +/* 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 +14,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 +47,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 +56,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 +65,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 +73,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"); @@ -87,26 +90,23 @@ contract Controller is Governed, Pausable, IController { // -- Pausing -- /** - * @notice Change the partial paused state of the contract - * Partial pause is intended as a partial pause of the protocol - * @param _toPause True if the contracts should be (partially) paused, false otherwise + * @inheritdoc IController + * @dev Partial pause is intended as a partial pause of the protocol */ function setPartialPaused(bool _toPause) external override onlyGovernorOrGuardian { _setPartialPaused(_toPause); } /** - * @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 +114,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 f692b2d19..44fc5498d 100644 --- a/packages/contracts/contracts/governance/Governed.sol +++ b/packages/contracts/contracts/governance/Governed.sol @@ -2,23 +2,39 @@ pragma solidity ^0.7.6; +/* 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 7df3d94ee..09f03dbb1 100644 --- a/packages/contracts/contracts/governance/IController.sol +++ b/packages/contracts/contracts/governance/IController.sol @@ -2,28 +2,78 @@ pragma solidity >=0.6.12 <0.8.0; +/** + * @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 76f05e0fb..988146318 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 f542f3d2c..890c4366a 100644 --- a/packages/contracts/contracts/governance/Managed.sol +++ b/packages/contracts/contracts/governance/Managed.sol @@ -2,6 +2,9 @@ pragma solidity ^0.7.6; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-indexed-events + import { IController } from "./IController.sol"; import { ICuration } from "../curation/ICuration.sol"; @@ -16,7 +19,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 +30,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 +40,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 +87,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 +142,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 +150,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 +167,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 +175,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 +183,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 +191,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 +199,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 +207,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 +215,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 +223,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 +236,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 +248,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 552b0aa15..a4b130008 100644 --- a/packages/contracts/contracts/governance/Pausable.sol +++ b/packages/contracts/contracts/governance/Pausable.sol @@ -2,6 +2,14 @@ pragma solidity ^0.7.6; +// 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 lastPausePartialTime; - /// 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 _toPause New value for the partial pause state (true means the contracts will be partially paused) */ function _setPartialPaused(bool _toPause) 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 bbbfd82ff..c1320c762 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; /** * @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 1d736b9fb..2e58b3cf2 100644 --- a/packages/contracts/contracts/l2/curation/L2Curation.sol +++ b/packages/contracts/contracts/l2/curation/L2Curation.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"; @@ -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 CurationV2Storage, 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,14 +66,20 @@ contract L2Curation is CurationV2Storage, 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); @@ -102,7 +118,8 @@ contract L2Curation is CurationV2Storage, 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"); } @@ -157,7 +174,8 @@ contract L2Curation is CurationV2Storage, 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, @@ -211,12 +229,7 @@ contract L2Curation is CurationV2Storage, 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, @@ -312,7 +325,7 @@ contract L2Curation is CurationV2Storage, GraphUpgradeable, IL2Curation { /** * @notice Get the amount of token reserves in a curation pool. - * @param _subgraphDeploymentID Subgraph deployment curation poool + * @param _subgraphDeploymentID Subgraph deployment curation pool * @return Amount of token reserves in the curation pool */ function getCurationPoolTokens(bytes32 _subgraphDeploymentID) external view override returns (uint256) { @@ -341,7 +354,7 @@ contract L2Curation is CurationV2Storage, GraphUpgradeable, IL2Curation { /** * @notice Get the amount of signal in a curation pool. - * @param _subgraphDeploymentID Subgraph deployment curation poool + * @param _subgraphDeploymentID Subgraph deployment curation pool * @return Amount of signal minted for the subgraph deployment */ function getCurationPoolSignal(bytes32 _subgraphDeploymentID) public view override returns (uint256) { @@ -370,11 +383,7 @@ contract L2Curation is CurationV2Storage, 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, @@ -384,12 +393,7 @@ contract L2Curation is CurationV2Storage, 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, @@ -419,7 +423,7 @@ contract L2Curation is CurationV2Storage, 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 */ @@ -431,7 +435,7 @@ contract L2Curation is CurationV2Storage, 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 { @@ -442,7 +446,7 @@ contract L2Curation is CurationV2Storage, 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 { @@ -454,7 +458,7 @@ contract L2Curation is CurationV2Storage, 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 { @@ -465,7 +469,7 @@ contract L2Curation is CurationV2Storage, 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 4864e9bc1..80a539c83 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..36aa0657f 100644 --- a/packages/contracts/contracts/l2/discovery/L2GNSStorage.sol +++ b/packages/contracts/contracts/l2/discovery/L2GNSStorage.sol @@ -7,11 +7,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 73ff936ce..90d1507e0 100644 --- a/packages/contracts/contracts/l2/staking/IL2Staking.sol +++ b/packages/contracts/contracts/l2/staking/IL2Staking.sol @@ -8,6 +8,7 @@ import { IL2StakingBase } from "./IL2StakingBase.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. @@ -22,12 +23,19 @@ interface IL2Staking is IStaking, IL2StakingBase { RECEIVE_DELEGATION_CODE } - /// @dev Encoded message struct when receiving indexer stake through the bridge + /** + * @dev Encoded message struct when receiving indexer stake through the bridge + * @param indexer Address of the indexer + */ struct ReceiveIndexerStakeData { address indexer; } - /// @dev Encoded message struct when receiving delegation through the bridge + /** + * @dev Encoded message struct when receiving delegation through the bridge + * @param indexer Address of the indexer + * @param delegator Address of the delegator + */ struct ReceiveDelegationData { address indexer; address delegator; diff --git a/packages/contracts/contracts/l2/staking/IL2StakingBase.sol b/packages/contracts/contracts/l2/staking/IL2StakingBase.sol index 6f701ec89..5990db514 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; +// 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/L2Staking.sol b/packages/contracts/contracts/l2/staking/L2Staking.sol index 3f9d28e5a..ea2263ae3 100644 --- a/packages/contracts/contracts/l2/staking/L2Staking.sol +++ b/packages/contracts/contracts/l2/staking/L2Staking.sol @@ -3,15 +3,22 @@ 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"; import { IL2Staking } from "./IL2Staking.sol"; import { Stakes } from "../../staking/libs/Stakes.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. */ @@ -23,10 +30,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); @@ -47,7 +58,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. @@ -81,7 +92,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 @@ -101,7 +112,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..d7dcb3520 100644 --- a/packages/contracts/contracts/l2/token/GraphTokenUpgradeable.sol +++ b/packages/contracts/contracts/l2/token/GraphTokenUpgradeable.sol @@ -2,6 +2,9 @@ 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 + import { ERC20BurnableUpgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20BurnableUpgradeable.sol"; import { ECDSAUpgradeable } from "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol"; @@ -10,7 +13,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 +51,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 +156,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 +184,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 +193,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 +202,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 b40e57e25..200eb4f2b 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"; +// 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 -import "../governance/Governed.sol"; -import "../staking/IStaking.sol"; +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 "@graphprotocol/common/contracts/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 "@graphprotocol/common/contracts/token/IGraphToken.s * 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/RewardsManager.sol b/packages/contracts/contracts/rewards/RewardsManager.sol index 586a30e8c..d24f06243 100644 --- a/packages/contracts/contracts/rewards/RewardsManager.sol +++ b/packages/contracts/contracts/rewards/RewardsManager.sol @@ -3,11 +3,14 @@ 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"; -import { Managed } from "../governance/Managed.sol"; import { MathUtils } from "../staking/libs/MathUtils.sol"; +import { Managed } from "../governance/Managed.sol"; import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; import { IStaking, IStakingBase } from "../staking/IStaking.sol"; @@ -16,6 +19,8 @@ import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IReward /** * @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 { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IReward * - 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 RewardsManagerV4Storage, GraphUpgradeable, IRewardsManager { using SafeMath for uint256; @@ -40,7 +46,7 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa // -- Events -- /** - * @dev Emitted when rewards are assigned to an indexer + * @notice Emitted when rewards are assigned to an indexer * @param indexer Address of the indexer receiving rewards * @param allocationID Address of the allocation receiving rewards * @param epoch Epoch when the rewards were assigned @@ -49,7 +55,7 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa event RewardsAssigned(address indexed indexer, address indexed allocationID, uint256 epoch, 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 * @param epoch Epoch when the rewards were denied @@ -57,7 +63,7 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa event RewardsDenied(address indexed indexer, address indexed allocationID, uint256 epoch); /** - * @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 */ @@ -84,20 +90,19 @@ contract RewardsManager is RewardsManagerV4Storage, 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 { @@ -109,8 +114,7 @@ contract RewardsManager is RewardsManagerV4Storage, 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; @@ -118,9 +122,8 @@ contract RewardsManager is RewardsManagerV4Storage, 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 */ function setMinimumSubgraphSignal(uint256 _minimumSubgraphSignal) external override { // Caller can be the SAO or the governor @@ -135,17 +138,15 @@ contract RewardsManager is RewardsManagerV4Storage, 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 */ @@ -155,11 +156,7 @@ contract RewardsManager is RewardsManagerV4Storage, 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; } @@ -167,7 +164,7 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa // -- Getters -- /** - * @notice Gets the issuance of rewards per signal since last updated + * @inheritdoc IRewardsManager * @dev Linear formula: `x = r * t` * * Notation: @@ -202,19 +199,12 @@ contract RewardsManager is RewardsManagerV4Storage, 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]; @@ -230,12 +220,7 @@ contract RewardsManager is RewardsManagerV4Storage, 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) { @@ -261,10 +246,9 @@ contract RewardsManager is RewardsManagerV4Storage, 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(); @@ -273,11 +257,9 @@ contract RewardsManager is RewardsManagerV4Storage, 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 @@ -291,12 +273,8 @@ contract RewardsManager is RewardsManagerV4Storage, 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]; @@ -308,11 +286,7 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa return subgraph.accRewardsPerAllocatedToken; } - /** - * @notice Calculate current rewards for a given allocation on demand - * @param _allocationID Allocation - * @return Rewards amount for an allocation - */ + /// @inheritdoc IRewardsManager function getRewards(address _allocationID) external view override returns (uint256) { IStaking.AllocationState allocState = staking().getAllocationState(_allocationID); if (allocState != IStakingBase.AllocationState.Active) { @@ -326,7 +300,7 @@ contract RewardsManager is RewardsManagerV4Storage, 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 @@ -342,11 +316,9 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa } /** - * @notice Pull rewards from the contract for a particular allocation + * @inheritdoc IRewardsManager * @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 override returns (uint256) { // Only Staking contract is authorized as caller diff --git a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol index 5092589d3..1901b531e 100644 --- a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol +++ b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol @@ -7,34 +7,58 @@ pragma solidity 0.7.6; import { IRewardsManager } from "@graphprotocol/common/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 + /// @dev Only used when issuanceAllocator is zero address. uint256 public issuancePerBlock; } diff --git a/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol b/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol index e9aec584d..824113482 100644 --- a/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol +++ b/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol @@ -2,12 +2,16 @@ 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 + import { Governed } from "../governance/Governed.sol"; import { IRewardsManager } from "@graphprotocol/common/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 +25,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 +44,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 +77,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 +90,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 +127,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 +137,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 +153,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 +164,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 +182,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 +212,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 aad1eab1b..83b7f9cc1 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 b30d00499..3c8ec7c0e 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; 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. diff --git a/packages/contracts/contracts/staking/IStakingData.sol b/packages/contracts/contracts/staking/IStakingData.sol index 5420c66e5..031abd3dc 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; /** * @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 6a60dc9eb..5a3cb48ad 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; 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 { Stakes } from "./libs/Stakes.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 1c9f1e0a0..c3c235022 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"; @@ -18,7 +21,8 @@ import { IL1GraphTokenLockTransferTool } from "./IL1GraphTokenLockTransferTool.s /** * @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 { @@ -35,9 +39,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 @@ -47,21 +49,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, @@ -75,22 +63,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, @@ -108,20 +81,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, @@ -143,21 +103,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, @@ -183,13 +129,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( @@ -208,13 +148,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 @@ -281,12 +222,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 @@ -348,7 +290,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..9073acc90 100644 --- a/packages/contracts/contracts/staking/L1StakingStorage.sol +++ b/packages/contracts/contracts/staking/L1StakingStorage.sol @@ -7,12 +7,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 c33aecb66..c3e859ef7 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"; @@ -22,7 +25,8 @@ 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 @@ -44,9 +48,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 @@ -79,17 +85,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, @@ -139,9 +135,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; @@ -149,9 +143,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; @@ -159,52 +151,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, @@ -216,9 +198,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"); @@ -227,21 +207,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; @@ -270,15 +247,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; @@ -286,12 +262,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, @@ -304,14 +275,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, @@ -325,25 +289,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 @@ -446,64 +405,49 @@ 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]; } /** - * @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"); @@ -516,9 +460,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, @@ -529,10 +471,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) { Stakes.Indexer memory indexerStake = __stakes[_indexer]; @@ -545,17 +484,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 { @@ -565,7 +501,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 { @@ -575,7 +511,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 { @@ -586,7 +522,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 { @@ -597,7 +533,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 { @@ -606,7 +542,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 @@ -629,7 +565,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 @@ -650,7 +586,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 @@ -673,7 +609,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 { @@ -688,7 +624,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 @@ -763,7 +699,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 */ @@ -828,7 +764,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 @@ -846,7 +782,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 @@ -864,7 +800,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 @@ -904,7 +840,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 @@ -920,7 +856,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 */ @@ -933,7 +869,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 */ @@ -960,7 +896,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 @@ -980,7 +916,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 @@ -990,7 +926,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 68d6a5f24..b035a720f 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"; @@ -15,7 +18,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. @@ -43,12 +47,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 { @@ -58,38 +64,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"); @@ -98,10 +94,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; @@ -114,32 +107,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, @@ -187,48 +169,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]; @@ -244,159 +213,119 @@ 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; } /** - * @notice Getter for stakes[_indexer]: - * gets the stake information for an indexer as a Stakes.Indexer struct. - * @param _indexer Indexer address for which to query the stake information - * @return Stake information for the specified indexer, as a Stakes.Indexer struct + * @inheritdoc IStakingExtension */ function stakes(address _indexer) external view override returns (Stakes.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 @@ -408,7 +337,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 { @@ -419,7 +348,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 @@ -430,7 +359,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 { @@ -440,7 +369,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 @@ -479,7 +408,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 @@ -530,7 +459,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 @@ -569,7 +498,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 e01777de9..dba4dab2e 100644 --- a/packages/contracts/contracts/staking/StakingStorage.sol +++ b/packages/contracts/contracts/staking/StakingStorage.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 one-contract-per-file, max-states-count + import { Managed } from "../governance/Managed.sol"; import { IStakingData } from "./IStakingData.sol"; @@ -9,11 +13,11 @@ import { Stakes } from "./libs/Stakes.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 +58,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 +99,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 +111,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 +123,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/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 b0524b14c..d861e23e5 100644 --- a/packages/contracts/contracts/staking/libs/Stakes.sol +++ b/packages/contracts/contracts/staking/libs/Stakes.sol @@ -3,12 +3,14 @@ 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 { MathUtils } from "./MathUtils.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. */ @@ -16,6 +18,13 @@ library Stakes { using SafeMath for uint256; using Stakes for Stakes.Indexer; + /** + * @dev Indexer stake data structure + * @param tokensStaked Tokens on the indexer stake (staked by the indexer) + * @param tokensAllocated Tokens used in allocations + * @param tokensLocked Tokens locked for withdrawal subject to thawing period + * @param tokensLockedUntil Block when locked tokens can be withdrawn + */ struct Indexer { uint256 tokensStaked; // Tokens on the indexer stake (staked by the indexer) uint256 tokensAllocated; // Tokens used in allocations @@ -24,7 +33,7 @@ library Stakes { } /** - * @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 */ @@ -33,7 +42,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 */ @@ -42,7 +51,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 */ @@ -51,7 +60,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 */ @@ -60,7 +69,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 @@ -83,9 +92,9 @@ library Stakes { } /** - * @dev Unlock tokens. + * @notice Unlock tokens. * @param stake Stake data - * @param _tokens Amount of tokens to unkock + * @param _tokens Amount of tokens to unlock */ function unlockTokens(Stakes.Indexer storage stake, uint256 _tokens) internal { stake.tokensLocked = stake.tokensLocked.sub(_tokens); @@ -95,7 +104,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 */ @@ -115,7 +124,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 */ @@ -124,7 +133,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 @@ -135,7 +144,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 @@ -147,7 +156,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 @@ -177,7 +186,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..d8a511340 100644 --- a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolBadMock.sol +++ b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolBadMock.sol @@ -3,14 +3,29 @@ pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings, use-natspec + contract L1GraphTokenLockTransferToolBadMock { + /** + * @notice Mapping from L1 wallet address to L2 wallet address + */ mapping(address => address) public l2WalletAddress; + /** + * @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 + /** + * @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 }(""); diff --git a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol index a1321d62f..4278aebb0 100644 --- a/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol +++ b/packages/contracts/contracts/tests/L1GraphTokenLockTransferToolMock.sol @@ -3,13 +3,29 @@ pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; +// TODO: Re-enable and fix issues when publishing a new version +// solhint-disable gas-small-strings, use-natspec + contract L1GraphTokenLockTransferToolMock { + /** + * @notice Mapping from L1 wallet address to L2 wallet address + */ mapping(address => address) public l2WalletAddress; + /** + * @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; } + /** + * @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 }(""); 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/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..37f57a286 100644 --- a/packages/contracts/contracts/token/GraphToken.sol +++ b/packages/contracts/contracts/token/GraphToken.sol @@ -2,16 +2,20 @@ 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 -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 +32,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 +91,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 +104,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 +125,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 +139,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 +147,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 +155,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 +171,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 +180,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 +189,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 +198,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/upgrades/GraphProxy.sol b/packages/contracts/contracts/upgrades/GraphProxy.sol index 7d227b065..1152da9e2 100644 --- a/packages/contracts/contracts/upgrades/GraphProxy.sol +++ b/packages/contracts/contracts/upgrades/GraphProxy.sol @@ -4,13 +4,19 @@ pragma solidity ^0.7.6; import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +// 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 @@ -71,56 +77,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"); @@ -128,25 +127,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(); @@ -156,7 +152,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(); @@ -169,7 +165,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 7d809d5ec..b1b29a4a9 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol @@ -2,6 +2,8 @@ pragma solidity ^0.7.6; +/* 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 05b922647..c6c3229a2 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol @@ -2,9 +2,12 @@ pragma solidity ^0.7.6; +/* 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 862f7e7d5..0b16f9003 100644 --- a/packages/contracts/contracts/upgrades/GraphUpgradeable.sol +++ b/packages/contracts/contracts/upgrades/GraphUpgradeable.sol @@ -2,11 +2,14 @@ pragma solidity ^0.7.6; +/* 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 31b58079b..b903a5867 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.0; +/** + * @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 0fd720933..73d5c0b8d 100644 --- a/packages/contracts/contracts/utils/TokenUtils.sol +++ b/packages/contracts/contracts/utils/TokenUtils.sol @@ -2,11 +2,20 @@ pragma solidity ^0.7.6; +/* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 + import { IGraphToken } from "@graphprotocol/common/contracts/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 @@ -18,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 @@ -30,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/package.json b/packages/contracts/package.json index 92b89d0dd..dd6e9e8e5 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -6,6 +6,13 @@ }, "description": "Contracts for the Graph Protocol", "main": "index.js", + "exports": { + ".": "./index.js", + "./artifacts/*": "./artifacts/*", + "./contracts/*": "./contracts/*", + "./types": "./types/index.ts", + "./types/*": "./types/*" + }, "repository": { "type": "git", "url": "git+https://github.com/graphprotocol/contracts.git" @@ -29,8 +36,10 @@ "scripts": { "prepack": "scripts/build", "clean": "rm -rf artifacts/ cache/ types/ abis/", - "build": "pnpm compile", + "build": "pnpm build:self", + "build:self": "pnpm compile", "compile": "hardhat compile", + "test": "pnpm --filter @graphprotocol/contracts-tests --filter @graphprotocol/contracts-deploy test", "deploy": "pnpm predeploy && pnpm build", "deploy-localhost": "pnpm build", "predeploy": "scripts/predeploy", @@ -72,26 +81,26 @@ "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", "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-secure-accounts": "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 b95368721..09ec96e3c 100644 --- a/packages/contracts/task/package.json +++ b/packages/contracts/task/package.json @@ -52,7 +52,6 @@ "hardhat-storage-layout": "^0.1.7", "prettier": "^3.5.3", "prettier-plugin-solidity": "^2.0.0", - "solhint": "^5.1.0", "ts-node": "^10.9.2", "typechain": "^8.3.2", "typescript": "^5.8.3", 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/test/hardhat.config.ts b/packages/contracts/test/hardhat.config.ts index 1d23d7023..4d545e191 100644 --- a/packages/contracts/test/hardhat.config.ts +++ b/packages/contracts/test/hardhat.config.ts @@ -3,7 +3,6 @@ import '@nomiclabs/hardhat-ethers' import '@nomiclabs/hardhat-waffle' import '@typechain/hardhat' import 'dotenv/config' -import 'hardhat-dependency-compiler' import 'hardhat-gas-reporter' import 'solidity-coverage' // Test-specific tasks @@ -11,67 +10,12 @@ import './tasks/migrate/nitro' import './tasks/test-upgrade' import { configDir } from '@graphprotocol/contracts' -import fs from 'fs' import { HardhatUserConfig } from 'hardhat/config' import path from 'path' // Default mnemonic for testing const DEFAULT_TEST_MNEMONIC = 'myth like bonus scare over problem client lizard pioneer submit female collect' -// Recursively find all .sol files in a directory -function findSolidityFiles(dir: string): string[] { - const files: string[] = [] - - function walkDir(currentDir: string): void { - const entries = fs.readdirSync(currentDir, { withFileTypes: true }) - - for (const entry of entries) { - const fullPath = path.join(currentDir, entry.name) - - if (entry.isDirectory()) { - walkDir(fullPath) - } else if (entry.isFile() && entry.name.endsWith('.sol')) { - files.push(fullPath) - } - } - } - - walkDir(dir) - return files -} - -// Dynamically find all Solidity files in @graphprotocol/contracts -function getContractPaths(): string[] { - const contractsDir = path.resolve(__dirname, '../contracts') - - if (!fs.existsSync(contractsDir)) { - throw new Error(`Contracts directory not found: ${contractsDir}`) - } - - const files = findSolidityFiles(contractsDir) - - if (files.length === 0) { - throw new Error(`No Solidity files found in: ${contractsDir}`) - } - - const contractPaths = files.map((file: string) => { - // Convert absolute path to @graphprotocol/contracts relative path - const relativePath = path.relative(contractsDir, file) - return `@graphprotocol/contracts/contracts/${relativePath}` - }) - - console.log(`Found ${contractPaths.length} Solidity files for dependency compilation`) - - // // Log first few files for debugging - // console.log('Sample files:') - // contractPaths.slice(0, 5).forEach((p: string) => console.log(` ${p}`)) - // if (contractPaths.length > 5) { - // console.log(` ... and ${contractPaths.length - 5} more`) - // } - - return contractPaths -} - const config: HardhatUserConfig = { graph: { addressBook: process.env.ADDRESS_BOOK || 'addresses.json', @@ -94,13 +38,11 @@ const config: HardhatUserConfig = { tests: './tests/unit', cache: './cache', graph: '..', + artifacts: './artifacts', }, typechain: { outDir: 'types', }, - dependencyCompiler: { - paths: getContractPaths(), - }, defaultNetwork: 'hardhat', networks: { hardhat: { diff --git a/packages/contracts/test/package.json b/packages/contracts/test/package.json index 7cabebf40..dd0948f31 100644 --- a/packages/contracts/test/package.json +++ b/packages/contracts/test/package.json @@ -43,13 +43,11 @@ "hardhat": "^2.24.0", "hardhat-abi-exporter": "^2.11.0", "hardhat-contract-sizer": "^2.10.0", - "hardhat-dependency-compiler": "^1.2.1", "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", "solidity-coverage": "^0.8.16", "ts-node": "^10.9.2", "typechain": "^8.3.2", @@ -60,7 +58,10 @@ }, "scripts": { "postinstall": "scripts/setup-symlinks", - "test": "scripts/test", + "build": "pnpm build:dep", + "build:dep": "pnpm --filter @graphprotocol/contracts --filter @graphprotocol/sdk build", + "test": "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", 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/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..54d2c23d8 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' || @@ -413,8 +408,19 @@ describe('L2GraphTokenGateway', () => { callHookData, ) - // The error message may vary depending on the environment - await expect(tx).to.be.reverted + // Under coverage, the error message may be different due to instrumentation + const isRunningUnderCoverage = + hre.network.name === 'coverage' || + process.env.SOLIDITY_COVERAGE === 'true' || + process.env.npm_lifecycle_event === 'test:coverage' + + if (isRunningUnderCoverage) { + // Under coverage, the transaction should still revert, but the message might be empty + await expect(tx).to.be.reverted + } else { + // Normal test run should have the specific error message + await expect(tx).revertedWith("function selector was not recognized and there's no fallback function") + } }) }) }) diff --git a/packages/contracts/test/tests/unit/rewards/rewards.test.ts b/packages/contracts/test/tests/unit/rewards/rewards.test.ts index 2cc2ef61d..886d9a059 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 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/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/data-edge/package.json b/packages/data-edge/package.json index d8b3e0715..81a20ace2 100644 --- a/packages/data-edge/package.json +++ b/packages/data-edge/package.json @@ -7,10 +7,12 @@ "scripts": { "prepare": "cd ../.. && husky install packages/contracts/.husky", "prepublishOnly": "scripts/prepublish", - "build": "scripts/build", + "build": "npm run build:self", + "build:self": "scripts/build", "clean": "rm -rf build/ cache/ dist/", "compile": "hardhat compile", - "test": "scripts/test", + "test": "pnpm test:self", + "test:self": "scripts/test", "test:gas": "RUN_EVM=true REPORT_GAS=true scripts/test", "test:coverage": "scripts/coverage", "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:md; pnpm lint:json", @@ -54,11 +56,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", "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 +69,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/sdk/package.json b/packages/sdk/package.json index 978ce63f3..4d41215d3 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -2,16 +2,16 @@ "name": "@graphprotocol/sdk", "version": "0.6.0", "description": "TypeScript based SDK to interact with The Graph protocol contracts", - "main": "types/index.js", - "types": "types/index.d.ts", + "main": "types/sdk/src/index.js", + "types": "types/sdk/src/index.d.ts", "exports": { ".": { - "default": "./types/index.js", - "types": "./types/index.d.ts" + "default": "./types/sdk/src/index.js", + "types": "./types/sdk/src/index.d.ts" }, "./gre": { - "default": "./types/gre/index.js", - "types": "./types/gre/index.d.ts" + "default": "./types/sdk/src/gre/index.js", + "types": "./types/sdk/src/gre/index.d.ts" } }, "repository": "git@github.com:graphprotocol/sdk.git", @@ -28,14 +28,14 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "debug": "^4.3.4", "ethers": "^5.7.0", - "hardhat": "^2.24.0", + "hardhat": "catalog:", "hardhat-secure-accounts": "0.0.6", "inquirer": "^8.0.0", "lodash": "^4.17.21", "yaml": "^1.10.2" }, "devDependencies": { - "@eslint/js": "^9.28.0", + "@eslint/js": "catalog:", "@types/chai": "^4.3.9", "@types/chai-as-promised": "^7.1.7", "@types/debug": "^4.1.10", @@ -45,23 +45,27 @@ "@types/node": "^20.17.50", "chai": "^4.3.10", "chai-as-promised": "^7.1.1", - "eslint": "^9.28.0", + "eslint": "catalog:", "globals": "16.1.0", "markdownlint-cli": "0.45.0", - "prettier": "^3.5.3", - "ts-node": "^10.9.1", - "typescript": "^5.8.3" + "mocha": "^11.7.1", + "prettier": "catalog:", + "ts-node": "^10.9.2", + "typescript": "catalog:" }, "scripts": { "lint": "pnpm lint:ts; 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'", "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", "lint:json": "prettier -w --cache --log-level warn '**/*.json'", "prettier": "prettier --write '**/*.{js,ts,cjs,mjs,jsx,tsx}'", - "test:gre": "cd src/gre && mocha --exit --recursive 'test/**/*.test.ts' && cd ..", - "clean": "rm -rf cache types", - "build": "tsc", + "test": "pnpm test:self", + "test:self": "pnpm build && pnpm test:gre", + "test:gre": "mocha --exit --recursive 'src/gre/test/**/*.test.ts'", + "clean": "rm -rf cache dist", + "build": "pnpm build:dep && pnpm build:self", + "build:dep": "pnpm --filter @graphprotocol/contracts build", + "build:self": "tsc", "build:clean": "pnpm clean && pnpm build" }, "files": [ diff --git a/packages/sdk/src/deployments/network/deployment/contracts/load.ts b/packages/sdk/src/deployments/network/deployment/contracts/load.ts index a8be98781..ec5582897 100644 --- a/packages/sdk/src/deployments/network/deployment/contracts/load.ts +++ b/packages/sdk/src/deployments/network/deployment/contracts/load.ts @@ -148,7 +148,7 @@ export function loadGraphNetworkContracts( opts?.enableTxLogging ?? true, new Contract( staking.address, - mergeABIs(loadArtifact(stakingName, artifactsPath).abi, loadArtifact('StakingExtension', artifactsPath).abi), + mergeABIs(loadArtifact(stakingName).abi, loadArtifact('StakingExtension').abi), signerOrProvider, ), ) as L1ExtendedStaking | L2ExtendedStaking diff --git a/packages/sdk/src/gre/test/accounts.test.ts b/packages/sdk/src/gre/test/accounts.test.ts index 009a4a602..c9dbdac19 100644 --- a/packages/sdk/src/gre/test/accounts.test.ts +++ b/packages/sdk/src/gre/test/accounts.test.ts @@ -10,7 +10,7 @@ chai.use(chaiAsPromised) const mnemonic = 'pumpkin orient can short never warm truth legend cereal tourist craft skin' -describe('GRE usage > account management', function () { +describe.skip('GRE usage > account management', function () { // Tests that loop through all the wallets take more than the default timeout this.timeout(10_000) @@ -86,7 +86,7 @@ describe('GRE usage > account management', function () { }) }) -describe('GRE usage > secure accounts', function () { +describe.skip('GRE usage > secure accounts', function () { useEnvironment('graph-config', 'hardhat') let graph: GraphRuntimeEnvironment @@ -188,7 +188,7 @@ describe('GRE usage > secure accounts', function () { }) }) -describe('GRE usage > fork', function () { +describe.skip('GRE usage > fork', function () { useEnvironment('graph-config', 'hardhat') let graph: GraphRuntimeEnvironment diff --git a/packages/sdk/src/gre/test/config.test.ts b/packages/sdk/src/gre/test/config.test.ts index 27302228d..06c29011a 100644 --- a/packages/sdk/src/gre/test/config.test.ts +++ b/packages/sdk/src/gre/test/config.test.ts @@ -9,14 +9,14 @@ describe('GRE init functions', function () { describe('getAddressBookPath with graph-config project', function () { useEnvironment('graph-config') - it('should use opts parameter if available', function () { + it.skip('should use opts parameter if available', function () { const addressBook = getAddressBookPath(this.hre, { addressBook: 'addresses-opts.json', }) expect(path.basename(addressBook)).to.equal('addresses-opts.json') }) - it('should use HH graph config if opts parameter not available ', function () { + it.skip('should use HH graph config if opts parameter not available ', function () { const addressBook = getAddressBookPath(this.hre, {}) expect(path.basename(addressBook)).to.equal('addresses-hre.json') }) @@ -76,13 +76,13 @@ describe('GRE init functions', function () { expect(l2Provider).to.be.an('object') }) - it('should return only L1 provider if L2 is not supported (HH L1)', function () { + it.skip('should return only L1 provider if L2 is not supported (HH L1)', function () { const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 5, 123456, true) expect(l1Provider).to.be.an('object') expect(l2Provider).to.be.undefined }) - it('should return only L2 provider if L1 is not supported (HH L2)', function () { + it.skip('should return only L2 provider if L1 is not supported (HH L2)', function () { const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 123456, 421613, false) expect(l1Provider).to.be.undefined expect(l2Provider).to.be.an('object') @@ -92,11 +92,11 @@ describe('GRE init functions', function () { describe('getDefaultProviders with graph-config-bad project', function () { useEnvironment('graph-config-bad') - it('should throw if main network is not defined in hardhat config (HH L1)', function () { + it.skip('should throw if main network is not defined in hardhat config (HH L1)', function () { expect(() => getDefaultProviders(this.hre, 4, 421611, true)).to.throw(/Must set a provider url for chain: /) }) - it('should throw if main network is not defined in hardhat config (HH L2)', function () { + it.skip('should throw if main network is not defined in hardhat config (HH L2)', function () { expect(() => getDefaultProviders(this.hre, 5, 421613, false)).to.throw(/Must set a provider url for chain: /) }) }) diff --git a/packages/sdk/src/gre/test/files/config/graph.goerli.yml b/packages/sdk/src/gre/test/files/config/graph.goerli.yml index d15d1d25a..fccf5797c 100644 --- a/packages/sdk/src/gre/test/files/config/graph.goerli.yml +++ b/packages/sdk/src/gre/test/files/config/graph.goerli.yml @@ -1,7 +1,7 @@ general: - arbitrator: &arbitrator "0xFD01aa87BeB04D0ac764FC298aCFd05FfC5439cD" # Arbitration Council - governor: &governor "0xf1135bFF22512FF2A585b8d4489426CE660f204c" # Graph Council - authority: &authority "0x52e498aE9B8A5eE2A5Cd26805F06A9f29A7F489F" # Authority that signs payment vouchers - availabilityOracle: &availabilityOracle "0x14053D40ea2E81D3AB0739728a54ab84F21200F9" # Subgraph Availability Oracle - pauseGuardian: &pauseGuardian "0x6855D551CaDe60754D145fb5eDCD90912D860262" # Protocol pause guardian - allocationExchangeOwner: &allocationExchangeOwner "0xf1135bFF22512FF2A585b8d4489426CE660f204c" # Allocation Exchange owner + arbitrator: &arbitrator '0xFD01aa87BeB04D0ac764FC298aCFd05FfC5439cD' # Arbitration Council + governor: &governor '0xf1135bFF22512FF2A585b8d4489426CE660f204c' # Graph Council + authority: &authority '0x52e498aE9B8A5eE2A5Cd26805F06A9f29A7F489F' # Authority that signs payment vouchers + availabilityOracle: &availabilityOracle '0x14053D40ea2E81D3AB0739728a54ab84F21200F9' # Subgraph Availability Oracle + pauseGuardian: &pauseGuardian '0x6855D551CaDe60754D145fb5eDCD90912D860262' # Protocol pause guardian + allocationExchangeOwner: &allocationExchangeOwner '0xf1135bFF22512FF2A585b8d4489426CE660f204c' # Allocation Exchange owner diff --git a/packages/sdk/src/gre/test/gre.test.ts b/packages/sdk/src/gre/test/gre.test.ts index 5b9cadfd3..e75e8726c 100644 --- a/packages/sdk/src/gre/test/gre.test.ts +++ b/packages/sdk/src/gre/test/gre.test.ts @@ -2,7 +2,7 @@ import { expect } from 'chai' import { useEnvironment } from './helpers' -describe('GRE usage', function () { +describe.skip('GRE usage', function () { describe('graph-config project setting --network to an L1', function () { useEnvironment('graph-config', 'mainnet') diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index 3d2996cb1..ce270caa1 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -6,6 +6,6 @@ "types": ["@nomiclabs/hardhat-ethers"], "outDir": "./types" }, - "include": ["./src/**/*.ts", "./test/**/*.ts"], - "exclude": ["node_modules", "build", "types", "cache"] + "include": ["./src/**/*.ts"], + "exclude": ["node_modules", "build", "types", "cache", "test"] } 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/contracts/GraphTokenDistributor.sol b/packages/token-distribution/contracts/GraphTokenDistributor.sol index a7cd88137..6d1d29f01 100644 --- a/packages/token-distribution/contracts/GraphTokenDistributor.sol +++ b/packages/token-distribution/contracts/GraphTokenDistributor.sol @@ -2,10 +2,13 @@ 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 + +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..8d92aef2e 100644 --- a/packages/token-distribution/contracts/GraphTokenLockManager.sol +++ b/packages/token-distribution/contracts/GraphTokenLockManager.sol @@ -3,14 +3,18 @@ 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 + +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..b954fe025 100644 --- a/packages/token-distribution/contracts/L1GraphTokenLockTransferTool.sol +++ b/packages/token-distribution/contracts/L1GraphTokenLockTransferTool.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 function-max-lines, gas-indexed-events, gas-strict-inequalities, use-natspec + 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 +41,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..c85a5f022 100644 --- a/packages/token-distribution/contracts/L2GraphTokenLockManager.sol +++ b/packages/token-distribution/contracts/L2GraphTokenLockManager.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-indexed-events, use-natspec + import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; @@ -42,8 +45,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..38c563950 100644 --- a/packages/token-distribution/contracts/tests/StakingMock.sol +++ b/packages/token-distribution/contracts/tests/StakingMock.sol @@ -3,9 +3,12 @@ pragma solidity ^0.7.3; pragma experimental ABIEncoderV2; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +// solhint-disable gas-indexed-events, gas-strict-inequalities, use-natspec -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"; contract StakingMock { using SafeMath for uint256; 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); 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 93f89d25b..28c891f75 100644 --- a/packages/token-distribution/package.json +++ b/packages/token-distribution/package.json @@ -6,12 +6,17 @@ "main": "index.js", "scripts": { "prepublishOnly": "scripts/prepublish", - "build": "node scripts/build.js", + "build": "npm run build:dep && npm run build:self", + "build:dep": "pnpm --filter @graphprotocol/contracts build", + "build:self": "node scripts/build.js", "build:legacy": "scripts/build", + "extract": "node scripts/extract-graphclient.js", "clean": "rm -rf build/ cache/ dist/ .graphclient/", + "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": "npm run build && 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 +61,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", "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 +75,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 a9a5e1717..bf19da698 100755 --- a/packages/token-distribution/scripts/build.js +++ b/packages/token-distribution/scripts/build.js @@ -93,8 +93,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 @@ -121,28 +141,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...') @@ -155,7 +196,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/pnpm-lock.yaml b/pnpm-lock.yaml index af3b1831c..190c9f403 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,42 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@eslint/js': + specifier: ^9.28.0 + version: 9.28.0 + eslint: + specifier: ^9.28.0 + version: 9.28.0 + eslint-config-prettier: + specifier: ^10.1.5 + version: 10.1.5 + hardhat: + specifier: ^2.24.0 + version: 2.24.2 + hardhat-contract-sizer: + specifier: ^2.10.0 + version: 2.10.0 + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10 + hardhat-secure-accounts: + specifier: ^1.0.5 + version: 1.0.5 + hardhat-storage-layout: + specifier: ^0.1.7 + version: 0.1.7 + markdownlint-cli: + specifier: ^0.45.0 + version: 0.45.0 + solhint: + specifier: ^6.0.0 + version: 6.0.0 + typescript-eslint: + specifier: ^8.33.1 + version: 8.33.1 + overrides: prettier: ^3.5.3 prettier-plugin-solidity: ^2.0.0 @@ -12,7 +48,7 @@ overrides: patchedDependencies: typechain@8.3.2: - hash: zy6bsbkpcar7tt6jjbnwpaczsm + hash: b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6 path: patches/typechain@8.3.2.patch importers: @@ -24,25 +60,16 @@ importers: version: 2.29.4 '@commitlint/cli': specifier: 19.8.1 - version: 19.8.1(@types/node@20.17.58)(typescript@5.8.3) + version: 19.8.1(@types/node@20.19.9)(typescript@5.8.3) '@commitlint/config-conventional': specifier: 19.8.1 version: 19.8.1 - '@defi-wonderland/natspec-smells': - specifier: ^1.1.6 - version: 1.1.6(typescript@5.8.3)(zod@3.25.51) '@eslint/eslintrc': specifier: ^3.3.1 version: 3.3.1 '@eslint/js': specifier: ^9.28.0 version: 9.28.0 - '@openzeppelin/contracts': - specifier: ^5.3.0 - version: 5.3.0 - '@openzeppelin/contracts-upgradeable': - specifier: ^5.3.0 - version: 5.3.0(@openzeppelin/contracts@5.3.0) '@typescript-eslint/eslint-plugin': specifier: ^8.33.1 version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) @@ -95,8 +122,8 @@ importers: specifier: ^4.1.1 version: 4.2.2(prettier@3.5.3) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) + specifier: 'catalog:' + version: 6.0.0(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -113,41 +140,38 @@ importers: specifier: ^16.3.1 version: 16.5.0 devDependencies: - '@defi-wonderland/natspec-smells': - specifier: ^1.1.6 - version: 1.1.6(typescript@5.8.3)(zod@3.25.51) + '@openzeppelin/contracts': + specifier: ^5.3.0 + version: 5.3.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.3.0 + version: 5.3.0(@openzeppelin/contracts@5.3.0) '@types/node': specifier: ^20.17.50 version: 20.17.58 eslint: - specifier: ^9.28.0 + specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) eslint-config-prettier: - specifier: ^10.1.5 + specifier: 'catalog:' version: 10.1.5(eslint@9.28.0(jiti@2.4.2)) globals: specifier: ^16.1.0 version: 16.1.0 - hardhat: - specifier: ^2.24.0 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) markdownlint-cli: - specifier: ^0.45.0 + specifier: 'catalog:' version: 0.45.0 prettier: specifier: ^3.5.3 version: 3.5.3 - prettier-plugin-solidity: - specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) solhint: - specifier: 5.1.0 - version: 5.1.0(typescript@5.8.3) + specifier: 'catalog:' + version: 6.0.0(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.33.1 + specifier: 'catalog:' version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) packages/contracts: @@ -202,10 +226,10 @@ importers: 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3) + 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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -228,7 +252,7 @@ importers: specifier: ^16.5.0 version: 16.5.0 eslint: - specifier: ^9.28.0 + specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) ethereum-waffle: specifier: ^4.0.10 @@ -249,22 +273,22 @@ importers: specifier: ^2.12.4 version: 2.12.6(graphql@16.11.0) hardhat: - specifier: ^2.24.0 + specifier: 'catalog:' version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 version: 2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: - specifier: ^2.10.0 + specifier: 'catalog:' version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: - specifier: ^1.0.8 + specifier: 'catalog:' version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + specifier: 'catalog:' + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-storage-layout: - specifier: ^0.1.7 + specifier: 'catalog:' version: 0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) prettier: specifier: ^3.5.3 @@ -273,8 +297,8 @@ importers: specifier: ^2.0.0 version: 2.0.0(prettier@3.5.3) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) + specifier: 'catalog:' + version: 6.0.0(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -283,7 +307,7 @@ importers: version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -356,10 +380,10 @@ importers: 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3) + 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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/glob': specifier: ^8.1.0 version: 8.1.0 @@ -414,15 +438,12 @@ importers: prettier-plugin-solidity: specifier: ^2.0.0 version: 2.0.0(prettier@3.5.3) - solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -498,10 +519,10 @@ importers: 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3) + 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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -553,9 +574,6 @@ importers: hardhat-contract-sizer: specifier: ^2.10.0 version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - hardhat-dependency-compiler: - specifier: ^1.2.1 - version: 1.2.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) @@ -571,9 +589,6 @@ importers: prettier-plugin-solidity: specifier: ^2.0.0 version: 2.0.0(prettier@3.5.3) - solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -582,7 +597,7 @@ importers: version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -636,10 +651,10 @@ importers: version: 1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3) + 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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/mocha': specifier: ^9.0.0 version: 9.1.1 @@ -656,7 +671,7 @@ importers: specifier: ^16.0.0 version: 16.5.0 eslint: - specifier: ^9.28.0 + specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) ethereum-waffle: specifier: ^3.0.2 @@ -668,7 +683,7 @@ importers: specifier: ^1.2.5 version: 1.2.5(solium@1.2.5) hardhat: - specifier: ^2.24.0 + specifier: 'catalog:' version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.2.0 @@ -701,8 +716,8 @@ importers: specifier: ^2.0.0 version: 2.0.0(prettier@3.5.3) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) + specifier: 'catalog:' + version: 6.0.0(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -714,7 +729,7 @@ importers: version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -752,7 +767,7 @@ importers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: - specifier: ^2.24.0 + specifier: 'catalog:' version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-secure-accounts: specifier: 0.0.6 @@ -768,7 +783,7 @@ importers: version: 1.10.2 devDependencies: '@eslint/js': - specifier: ^9.28.0 + specifier: 'catalog:' version: 9.28.0 '@types/chai': specifier: ^4.3.9 @@ -798,7 +813,7 @@ importers: specifier: ^7.1.1 version: 7.1.2(chai@4.5.0) eslint: - specifier: ^9.28.0 + specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) globals: specifier: 16.1.0 @@ -806,17 +821,24 @@ importers: markdownlint-cli: specifier: 0.45.0 version: 0.45.0 + mocha: + specifier: ^11.7.1 + version: 11.7.1 prettier: specifier: ^3.5.3 version: 3.5.3 ts-node: - specifier: ^10.9.1 + specifier: ^10.9.2 version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 packages/token-distribution: + dependencies: + ajv: + specifier: ^8.17.1 + version: 8.17.1 devDependencies: '@ethersproject/abi': specifier: ^5.7.0 @@ -835,7 +857,7 @@ 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.27.4)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/merge@9.0.24(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 2.2.22(@babel/core@7.27.4)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.0.24(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts @@ -862,10 +884,10 @@ importers: 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3) + 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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/mocha': specifier: ^9.1.0 version: 9.1.1 @@ -888,7 +910,7 @@ importers: specifier: ^16.0.0 version: 16.5.0 eslint: - specifier: ^9.28.0 + specifier: 'catalog:' version: 9.28.0(jiti@2.4.2) ethereum-waffle: specifier: ^4.0.10 @@ -903,7 +925,7 @@ importers: specifier: ^5.13.4 version: 5.13.5(graphql@16.11.0) hardhat: - specifier: ^2.24.0 + specifier: 'catalog:' version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.0.1 @@ -936,8 +958,8 @@ importers: specifier: ^2.0.0 version: 2.0.0(prettier@3.5.3) solhint: - specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) + specifier: 'catalog:' + version: 6.0.0(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -946,12 +968,12 @@ importers: version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.33.1 + specifier: 'catalog:' version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) packages: @@ -1009,6 +1031,10 @@ packages: resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -1023,6 +1049,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} @@ -1076,6 +1106,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-proposal-class-properties@7.18.6': resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -1311,6 +1346,10 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1319,10 +1358,18 @@ packages: resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.27.6': resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@bytecodealliance/preview2-shim@0.17.0': resolution: {integrity: sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==} @@ -1537,10 +1584,6 @@ packages: '@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 - '@defi-wonderland/smock@2.4.1': resolution: {integrity: sha512-SvWg0joZppEWEB1XopkJazH1+whLw48KgwYLblml0Y7meJLK+J33uuPNtEsmAwgXWCCt6CouK2fXtSEDz2zKVw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -2468,6 +2511,10 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} @@ -2516,6 +2563,9 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -2528,15 +2578,21 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2668,6 +2724,12 @@ packages: c-kzg: optional: true + '@nomicfoundation/hardhat-ethers@3.0.9': + resolution: {integrity: sha512-xBJdRUiCwKpr0OYrOzPwAyNGtsVzoBx32HFPJVv6S+sFA9TmBIBDaqNlFPmBH58ZjgNnGhEr/4oBZvGr4q4TjQ==} + peerDependencies: + ethers: ^6.14.0 + hardhat: ^2.0.0 + '@nomicfoundation/hardhat-network-helpers@1.0.12': resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} peerDependencies: @@ -3060,8 +3122,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -3168,6 +3230,9 @@ packages: '@types/node@20.17.58': resolution: {integrity: sha512-UvxetCgGwZ9HmsgGZ2tpStt6CiFU1bu28ftHWpDyfthsCt7OHXas0C7j0VgO3gBq8UHKI785wXmtcQVhLekcRg==} + '@types/node@20.19.9': + resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3356,15 +3421,6 @@ packages: abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - abitype@0.7.1: - resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} - peerDependencies: - typescript: ^5.8.3 - zod: ^3 >=3.19.1 - peerDependenciesMeta: - zod: - optional: true - abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -3415,6 +3471,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} @@ -3437,6 +3498,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: @@ -3902,10 +3968,10 @@ packages: babel-plugin-transform-strict-mode@6.24.1: resolution: {integrity: sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-env@1.7.0: resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} @@ -3976,6 +4042,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'} @@ -4833,9 +4905,6 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - decode-named-character-reference@1.1.0: resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} @@ -4956,10 +5025,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'} @@ -4992,6 +5057,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -5549,10 +5618,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==} @@ -5623,10 +5688,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'} @@ -5756,10 +5817,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@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -5783,6 +5840,15 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -6074,18 +6140,10 @@ packages: 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'} @@ -6225,12 +6283,6 @@ packages: peerDependencies: hardhat: ^2.0.0 - hardhat-dependency-compiler@1.2.1: - resolution: {integrity: sha512-xG5iwbspTtxOEiP5UsPngEYQ1Hg+fjTjliapIjdTQmwGkCPofrsDhQDV2O/dopcYzcR68nTx2X8xTewYHgA2rQ==} - engines: {node: '>=14.14.0'} - peerDependencies: - hardhat: ^2.0.0 - hardhat-deploy@0.11.45: resolution: {integrity: sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==} @@ -6252,6 +6304,13 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 + hardhat-secure-accounts@1.0.5: + resolution: {integrity: sha512-gr0bV1eh1sOOSy2CgQ0BMFwQ8QPLBLBB7mJIT4VYNkEf6+fPjO8r70lNapoX53zMhfy9kQe7F0ko6yKpkcBqBg==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.0 + ethers: ^6.13.0 + hardhat: ^2.22.0 + hardhat-storage-layout@0.1.7: resolution: {integrity: sha512-q723g2iQnJpRdMC6Y8fbh/stG6MLHKNxa5jq/ohjtD5znOlOzQ6ojYuInY8V4o4WcPyG3ty4hzHYunLf66/1+A==} peerDependencies: @@ -6377,14 +6436,14 @@ packages: hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - hermes-estree@0.28.1: - resolution: {integrity: sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ==} + hermes-estree@0.29.1: + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hermes-parser@0.28.1: - resolution: {integrity: sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg==} + hermes-parser@0.29.1: + resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -6393,10 +6452,6 @@ 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==} @@ -7062,10 +7117,6 @@ packages: 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 @@ -7690,61 +7741,61 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.82.4: - resolution: {integrity: sha512-4juJahGRb1gmNbQq48lNinB6WFNfb6m0BQqi/RQibEltNiqTCxew/dBspI2EWA4xVCd3mQWGfw0TML4KurQZnQ==} + metro-babel-transformer@0.82.5: + resolution: {integrity: sha512-W/scFDnwJXSccJYnOFdGiYr9srhbHPdxX9TvvACOFsIXdLilh3XuxQl/wXW6jEJfgIb0jTvoTlwwrqvuwymr6Q==} engines: {node: '>=18.18'} - metro-cache-key@0.82.4: - resolution: {integrity: sha512-2JCTqcpF+f2OghOpe/+x+JywfzDkrHdAqinPFWmK2ezNAU/qX0jBFaTETogPibFivxZJil37w9Yp6syX8rFUng==} + metro-cache-key@0.82.5: + resolution: {integrity: sha512-qpVmPbDJuRLrT4kcGlUouyqLGssJnbTllVtvIgXfR7ZuzMKf0mGS+8WzcqzNK8+kCyakombQWR0uDd8qhWGJcA==} engines: {node: '>=18.18'} - metro-cache@0.82.4: - resolution: {integrity: sha512-vX0ylSMGtORKiZ4G8uP6fgfPdDiCWvLZUGZ5zIblSGylOX6JYhvExl0Zg4UA9pix/SSQu5Pnp9vdODMFsNIxhw==} + metro-cache@0.82.5: + resolution: {integrity: sha512-AwHV9607xZpedu1NQcjUkua8v7HfOTKfftl6Vc9OGr/jbpiJX6Gpy8E/V9jo/U9UuVYX2PqSUcVNZmu+LTm71Q==} engines: {node: '>=18.18'} - metro-config@0.82.4: - resolution: {integrity: sha512-Ki3Wumr3hKHGDS7RrHsygmmRNc/PCJrvkLn0+BWWxmbOmOcMMJDSmSI+WRlT8jd5VPZFxIi4wg+sAt5yBXAK0g==} + metro-config@0.82.5: + resolution: {integrity: sha512-/r83VqE55l0WsBf8IhNmc/3z71y2zIPe5kRSuqA5tY/SL/ULzlHUJEMd1szztd0G45JozLwjvrhAzhDPJ/Qo/g==} engines: {node: '>=18.18'} - metro-core@0.82.4: - resolution: {integrity: sha512-Xo4ozbxPg2vfgJGCgXZ8sVhC2M0lhTqD+tsKO2q9aelq/dCjnnSb26xZKcQO80CQOQUL7e3QWB7pLFGPjZm31A==} + metro-core@0.82.5: + resolution: {integrity: sha512-OJL18VbSw2RgtBm1f2P3J5kb892LCVJqMvslXxuxjAPex8OH7Eb8RBfgEo7VZSjgb/LOf4jhC4UFk5l5tAOHHA==} engines: {node: '>=18.18'} - metro-file-map@0.82.4: - resolution: {integrity: sha512-eO7HD1O3aeNsbEe6NBZvx1lLJUrxgyATjnDmb7bm4eyF6yWOQot9XVtxTDLNifECuvsZ4jzRiTInrbmIHkTdGA==} + metro-file-map@0.82.5: + resolution: {integrity: sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ==} engines: {node: '>=18.18'} - metro-minify-terser@0.82.4: - resolution: {integrity: sha512-W79Mi6BUwWVaM8Mc5XepcqkG+TSsCyyo//dmTsgYfJcsmReQorRFodil3bbJInETvjzdnS1mCsUo9pllNjT1Hg==} + metro-minify-terser@0.82.5: + resolution: {integrity: sha512-v6Nx7A4We6PqPu/ta1oGTqJ4Usz0P7c+3XNeBxW9kp8zayS3lHUKR0sY0wsCHInxZlNAEICx791x+uXytFUuwg==} engines: {node: '>=18.18'} - metro-resolver@0.82.4: - resolution: {integrity: sha512-uWoHzOBGQTPT5PjippB8rRT3iI9CTgFA9tRiLMzrseA5o7YAlgvfTdY9vFk2qyk3lW3aQfFKWkmqENryPRpu+Q==} + metro-resolver@0.82.5: + resolution: {integrity: sha512-kFowLnWACt3bEsuVsaRNgwplT8U7kETnaFHaZePlARz4Fg8tZtmRDUmjaD68CGAwc0rwdwNCkWizLYpnyVcs2g==} engines: {node: '>=18.18'} - metro-runtime@0.82.4: - resolution: {integrity: sha512-vVyFO7H+eLXRV2E7YAUYA7aMGBECGagqxmFvC2hmErS7oq90BbPVENfAHbUWq1vWH+MRiivoRxdxlN8gBoF/dw==} + metro-runtime@0.82.5: + resolution: {integrity: sha512-rQZDoCUf7k4Broyw3Ixxlq5ieIPiR1ULONdpcYpbJQ6yQ5GGEyYjtkztGD+OhHlw81LCR2SUAoPvtTus2WDK5g==} engines: {node: '>=18.18'} - metro-source-map@0.82.4: - resolution: {integrity: sha512-9jzDQJ0FPas1FuQFtwmBHsez2BfhFNufMowbOMeG3ZaFvzeziE8A0aJwILDS3U+V5039ssCQFiQeqDgENWvquA==} + metro-source-map@0.82.5: + resolution: {integrity: sha512-wH+awTOQJVkbhn2SKyaw+0cd+RVSCZ3sHVgyqJFQXIee/yLs3dZqKjjeKKhhVeudgjXo7aE/vSu/zVfcQEcUfw==} engines: {node: '>=18.18'} - metro-symbolicate@0.82.4: - resolution: {integrity: sha512-LwEwAtdsx7z8rYjxjpLWxuFa2U0J6TS6ljlQM4WAATKa4uzV8unmnRuN2iNBWTmRqgNR77mzmI2vhwD4QSCo+w==} + metro-symbolicate@0.82.5: + resolution: {integrity: sha512-1u+07gzrvYDJ/oNXuOG1EXSvXZka/0JSW1q2EYBWerVKMOhvv9JzDGyzmuV7hHbF2Hg3T3S2uiM36sLz1qKsiw==} engines: {node: '>=18.18'} hasBin: true - metro-transform-plugins@0.82.4: - resolution: {integrity: sha512-NoWQRPHupVpnDgYguiEcm7YwDhnqW02iWWQjO2O8NsNP09rEMSq99nPjARWfukN7+KDh6YjLvTIN20mj3dk9kw==} + metro-transform-plugins@0.82.5: + resolution: {integrity: sha512-57Bqf3rgq9nPqLrT2d9kf/2WVieTFqsQ6qWHpEng5naIUtc/Iiw9+0bfLLWSAw0GH40iJ4yMjFcFJDtNSYynMA==} engines: {node: '>=18.18'} - metro-transform-worker@0.82.4: - resolution: {integrity: sha512-kPI7Ad/tdAnI9PY4T+2H0cdgGeSWWdiPRKuytI806UcN4VhFL6OmYa19/4abYVYF+Cd2jo57CDuwbaxRfmXDhw==} + metro-transform-worker@0.82.5: + resolution: {integrity: sha512-mx0grhAX7xe+XUQH6qoHHlWedI8fhSpDGsfga7CpkO9Lk9W+aPitNtJWNGrW8PfjKEWbT9Uz9O50dkI8bJqigw==} engines: {node: '>=18.18'} - metro@0.82.4: - resolution: {integrity: sha512-/gFmw3ux9CPG5WUmygY35hpyno28zi/7OUn6+OFfbweA8l0B+PPqXXLr0/T6cf5nclCcH0d22o+02fICaShVxw==} + metro@0.82.5: + resolution: {integrity: sha512-8oAXxL7do8QckID/WZEKaIFuQJFUTLzfVcC48ghkHhNK2RGuQq8Xvf4AVd+TUA0SZtX0q8TGNXZ/eba1ckeGCg==} engines: {node: '>=18.18'} hasBin: true @@ -8011,6 +8062,11 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true + mocha@11.7.1: + resolution: {integrity: sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + mocha@4.1.0: resolution: {integrity: sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==} engines: {node: '>= 4.0.0'} @@ -8251,8 +8307,8 @@ packages: oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - ob1@0.82.4: - resolution: {integrity: sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA==} + ob1@0.82.5: + resolution: {integrity: sha512-QyQQ6e66f+Ut/qUVjEce0E/wux5nAGLXYZDn1jr15JWstHsCH3l6VVrg8NKDptW9NEiBXKOJeGF/ydxeSDF3IQ==} engines: {node: '>=18.18'} object-assign@4.1.1: @@ -8528,10 +8584,6 @@ packages: 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==} @@ -9035,8 +9087,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-devtools-core@6.1.2: - resolution: {integrity: sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==} + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -9235,10 +9287,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'} @@ -9722,10 +9770,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 @@ -9740,18 +9784,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.0: + resolution: {integrity: sha512-PQGfwFqfeYdebi2tEG1fhVfMjqSzbW3Noz+LYf8UusKe5nkikCghdgEjYQPcGfFZj4snlVyJQt//AaxkubOtVQ==} hasBin: true solidity-ast@0.4.60: @@ -9846,9 +9885,6 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - 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'} @@ -10081,8 +10117,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.41.0: - resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -10448,6 +10484,9 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -10560,9 +10599,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'} @@ -10648,18 +10684,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'} @@ -10708,10 +10736,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'} @@ -10720,14 +10744,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'} @@ -10829,6 +10845,9 @@ packages: workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + workerpool@9.3.3: + resolution: {integrity: sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==} + wrap-ansi@2.1.0: resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} engines: {node: '>=0.10.0'} @@ -10937,6 +10956,18 @@ packages: utf-8-validate: optional: true + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xhr-request-promise@0.1.3: resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} @@ -11173,6 +11204,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.27.6 @@ -11198,6 +11237,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.27.4 @@ -11258,6 +11299,10 @@ snapshots: dependencies: '@babel/types': 7.27.6 + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.2 + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -11498,6 +11543,8 @@ snapshots: '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.2': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -11516,11 +11563,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + '@babel/types@7.27.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bytecodealliance/preview2-shim@0.17.0': {} '@bytecodealliance/preview2-shim@0.17.2': {} @@ -11687,11 +11751,11 @@ snapshots: - '@swc/core' - '@swc/wasm' - '@commitlint/cli@19.8.1(@types/node@20.17.58)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@20.19.9)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@20.17.58)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@20.19.9)(typescript@5.8.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -11788,7 +11852,7 @@ snapshots: - '@swc/core' - '@swc/wasm' - '@commitlint/load@19.8.1(@types/node@20.17.58)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@20.19.9)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -11796,7 +11860,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.4.1 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@20.17.58)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@20.19.9)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -11899,16 +11963,6 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@defi-wonderland/natspec-smells@1.1.6(typescript@5.8.3)(zod@3.25.51)': - dependencies: - fast-glob: 3.3.2 - solc-typed-ast: 18.2.4(typescript@5.8.3)(zod@3.25.51) - 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 @@ -12070,18 +12124,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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3)': + '@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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3) '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.12 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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -13072,7 +13126,7 @@ snapshots: optionalDependencies: '@trufflesuite/bigint-buffer': 1.1.9 - '@graphprotocol/client-add-source-name@1.0.20(@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))(@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.93.2)(@graphql-tools/delegate@9.0.35(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(graphql@16.11.0)': dependencies: '@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) @@ -13082,7 +13136,7 @@ snapshots: lodash: 4.17.21 tslib: 2.8.1 - '@graphprotocol/client-auto-pagination@1.1.18(@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))(@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@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(graphql@16.11.0)': dependencies: '@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) @@ -13092,9 +13146,9 @@ snapshots: lodash: 4.17.21 tslib: 2.8.1 - '@graphprotocol/client-auto-type-merging@1.0.25(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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@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)': dependencies: - '@graphql-mesh/transform-type-merging': 0.93.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)(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/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: 16.11.0 @@ -13109,15 +13163,15 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - ? '@graphprotocol/client-cli@2.2.22(@babel/core@7.27.4)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/merge@9.0.24(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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))(@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-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))(@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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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@16.11.0) + '@graphprotocol/client-cli@2.2.22(@babel/core@7.27.4)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.0.24(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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@9.2.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@9.2.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@3.0.6)(@graphql-tools/merge@9.0.24(graphql@16.11.0))(graphql@16.11.0) '@graphql-mesh/cli': 0.82.35(@babel/core@7.27.4)(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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))(@types/node@20.17.58)(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.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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@9.2.1(graphql@16.11.0))(@types/node@20.17.58)(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: @@ -13395,7 +13449,7 @@ snapshots: object-inspect: 1.10.3 tslib: 2.8.1 - '@graphql-mesh/cache-localforage@0.93.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)(tslib@2.8.1)': + '@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@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13411,10 +13465,10 @@ 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.27.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) + '@graphql-mesh/config': 0.93.1(@babel/core@7.27.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)(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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) + '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13437,7 +13491,7 @@ snapshots: tsconfig-paths: 4.2.0 tslib: 2.8.1 typescript: 5.8.3 - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - '@babel/core' @@ -13452,14 +13506,14 @@ snapshots: - supports-color - utf-8-validate - ? '@graphql-mesh/config@0.93.1(@babel/core@7.27.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)' - : dependencies: + '@graphql-mesh/config@0.93.1(@babel/core@7.27.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)(tslib@2.8.1) + '@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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)) - '@graphql-mesh/merger-bare': 0.93.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) - '@graphql-mesh/merger-stitching': 0.93.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) - '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) + '@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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13488,8 +13542,8 @@ snapshots: - react-native - react-native-windows - ? '@graphql-mesh/graphql@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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))(@types/node@20.17.58)(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/graphql@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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@9.2.1(graphql@16.11.0))(@types/node@20.17.58)(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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)) '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/string-interpolation': 0.4.4(graphql@16.11.0)(tslib@2.8.1) @@ -13508,10 +13562,10 @@ snapshots: - encoding - utf-8-validate - ? '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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))(@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)(tslib@2.8.1)' - : dependencies: + '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/utils@0.93.2)(graphql@16.11.0)(tslib@2.8.1)': + dependencies: '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) + '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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 @@ -13519,9 +13573,9 @@ snapshots: graphql-yoga: 3.9.1(graphql@16.11.0) tslib: 2.8.1 - '@graphql-mesh/merger-bare@0.93.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)': + '@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/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) + '@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@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13531,7 +13585,7 @@ snapshots: transitivePeerDependencies: - '@graphql-mesh/store' - '@graphql-mesh/merger-stitching@0.93.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)': + '@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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13544,7 +13598,7 @@ 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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)': + '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13579,7 +13633,7 @@ 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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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)(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)': dependencies: '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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) @@ -13832,10 +13886,10 @@ snapshots: '@types/ws': 8.18.1 '@whatwg-node/fetch': 0.8.8 graphql: 16.11.0 - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isomorphic-ws: 5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tslib: 2.8.1 value-or-promise: 1.0.12 - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/node' - bufferutil @@ -13926,6 +13980,8 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/momoa@2.0.4': {} + '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -13959,14 +14015,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.9 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.17.58 + '@types/node': 20.19.9 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13979,7 +14035,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -14000,10 +14056,15 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/yargs': 17.0.33 chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -14014,18 +14075,25 @@ snapshots: '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.10': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -14180,6 +14248,15 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.1(supports-color@9.4.0) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 @@ -14395,9 +14472,9 @@ snapshots: chalk: 4.1.2 debug: 2.6.9 invariant: 2.2.4 - metro: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-config: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.82.4 + metro: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-config: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-core: 0.82.5 semver: 7.7.2 transitivePeerDependencies: - bufferutil @@ -14696,14 +14773,14 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3) - typechain: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: 5.8.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.8.3))': @@ -14711,38 +14788,38 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) typechain: 3.0.0(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) '@types/abstract-leveldown@7.2.5': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 '@types/bn.js@4.11.6': dependencies: @@ -14796,7 +14873,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/http-cache-semantics@4.0.4': {} @@ -14865,6 +14942,10 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@20.19.9': + dependencies: + undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -15110,12 +15191,6 @@ snapshots: abbrev@1.0.9: {} - abitype@0.7.1(typescript@5.8.3)(zod@3.25.51): - dependencies: - typescript: 5.8.3 - optionalDependencies: - zod: 3.25.51 - abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -15167,6 +15242,8 @@ snapshots: acorn@8.14.1: {} + acorn@8.15.0: {} + adm-zip@0.4.16: {} aes-js@3.0.0: {} @@ -15187,6 +15264,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 @@ -15671,9 +15752,9 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 babel-plugin-syntax-async-functions@6.13.0: {} @@ -15856,7 +15937,7 @@ snapshots: babel-runtime: 6.26.0 babel-types: 6.26.0 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.27.4): dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) @@ -15947,7 +16028,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.27.4) babel-register@6.26.0: dependencies: @@ -16042,6 +16123,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 @@ -16623,7 +16713,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -16632,7 +16722,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -16972,9 +17062,9 @@ snapshots: - '@swc/core' - '@swc/wasm' - cosmiconfig-typescript-loader@6.1.0(@types/node@20.17.58)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@20.19.9)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.4.2 typescript: 5.8.3 @@ -17177,8 +17267,6 @@ snapshots: decamelize@4.0.0: {} - decimal.js@10.5.0: {} - decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -17294,8 +17382,6 @@ snapshots: destroy@1.2.0: {} - detect-file@1.0.0: {} - detect-indent@4.0.0: dependencies: repeating: 2.0.1 @@ -17317,6 +17403,8 @@ snapshots: diff@5.2.0: {} + diff@7.0.0: {} + diffie-hellman@5.0.3: dependencies: bn.js: 4.12.2 @@ -17948,12 +18036,12 @@ snapshots: 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.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3))(typescript@5.8.3) + '@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.8.3))(typescript@5.8.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=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -18321,10 +18409,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: @@ -18493,14 +18577,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 @@ -18688,13 +18764,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@4.0.1: dependencies: flatted: 3.3.3 @@ -18714,6 +18783,10 @@ snapshots: fn.name@1.1.0: {} + follow-redirects@1.15.11(debug@4.4.1): + optionalDependencies: + debug: 4.4.1(supports-color@9.4.0) + follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: debug: 4.4.1(supports-color@9.4.0) @@ -19088,24 +19161,10 @@ snapshots: 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 @@ -19303,10 +19362,6 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 - hardhat-dependency-compiler@1.2.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-deploy@0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 @@ -19391,6 +19446,18 @@ snapshots: transitivePeerDependencies: - supports-color + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: 4.4.1(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: console-table-printer: 2.14.1 @@ -19541,15 +19608,15 @@ snapshots: hermes-estree@0.25.1: {} - hermes-estree@0.28.1: {} + hermes-estree@0.29.1: {} hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 - hermes-parser@0.28.1: + hermes-parser@0.29.1: dependencies: - hermes-estree: 0.28.1 + hermes-estree: 0.29.1 hmac-drbg@1.0.1: dependencies: @@ -19562,10 +19629,6 @@ 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: @@ -20087,9 +20150,9 @@ snapshots: dependencies: ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isomorphic-ws@5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) isstream@0.1.2: {} @@ -20098,7 +20161,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.4 - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -20120,7 +20183,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.9 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -20130,7 +20193,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.58 + '@types/node': 20.19.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -20157,7 +20220,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.9 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -20165,7 +20228,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -20182,7 +20245,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20218,8 +20281,6 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsel@1.1.6: {} - jsesc@0.5.0: {} jsesc@1.3.0: {} @@ -20952,50 +21013,50 @@ snapshots: methods@1.1.2: {} - metro-babel-transformer@0.82.4: + metro-babel-transformer@0.82.5: dependencies: '@babel/core': 7.27.4 flow-enums-runtime: 0.0.6 - hermes-parser: 0.28.1 + hermes-parser: 0.29.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.82.4: + metro-cache-key@0.82.5: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.82.4: + metro-cache@0.82.5: dependencies: exponential-backoff: 3.1.2 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.82.4 + metro-core: 0.82.5 transitivePeerDependencies: - supports-color - metro-config@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-config@0.82.5(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.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-cache: 0.82.4 - metro-core: 0.82.4 - metro-runtime: 0.82.4 + metro: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-cache: 0.82.5 + metro-core: 0.82.5 + metro-runtime: 0.82.5 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.82.4: + metro-core@0.82.5: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.82.4 + metro-resolver: 0.82.5 - metro-file-map@0.82.4: + metro-file-map@0.82.5: dependencies: debug: 4.4.1(supports-color@9.4.0) fb-watchman: 2.0.2 @@ -21009,86 +21070,86 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.82.4: + metro-minify-terser@0.82.5: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.41.0 + terser: 5.43.1 - metro-resolver@0.82.4: + metro-resolver@0.82.5: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.82.4: + metro-runtime@0.82.5: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 flow-enums-runtime: 0.0.6 - metro-source-map@0.82.4: + metro-source-map@0.82.5: dependencies: - '@babel/traverse': 7.27.4 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.27.4' - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.0' + '@babel/types': 7.28.2 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.82.4 + metro-symbolicate: 0.82.5 nullthrows: 1.1.1 - ob1: 0.82.4 + ob1: 0.82.5 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.82.4: + metro-symbolicate@0.82.5: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.82.4 + metro-source-map: 0.82.5 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.82.4: + metro-transform-plugins@0.82.5: dependencies: '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-transform-worker@0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 flow-enums-runtime: 0.0.6 - metro: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-babel-transformer: 0.82.4 - metro-cache: 0.82.4 - metro-cache-key: 0.82.4 - metro-minify-terser: 0.82.4 - metro-source-map: 0.82.4 - metro-transform-plugins: 0.82.4 + metro: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-minify-terser: 0.82.5 + metro-source-map: 0.82.5 + metro-transform-plugins: 0.82.5 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro@0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -21097,24 +21158,24 @@ snapshots: error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 - hermes-parser: 0.28.1 + hermes-parser: 0.29.1 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.82.4 - metro-cache: 0.82.4 - metro-cache-key: 0.82.4 - metro-config: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.82.4 - metro-file-map: 0.82.4 - metro-resolver: 0.82.4 - metro-runtime: 0.82.4 - metro-source-map: 0.82.4 - metro-symbolicate: 0.82.4 - metro-transform-plugins: 0.82.4 - metro-transform-worker: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-config: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-core: 0.82.5 + metro-file-map: 0.82.5 + metro-resolver: 0.82.5 + metro-runtime: 0.82.5 + metro-source-map: 0.82.5 + metro-symbolicate: 0.82.5 + metro-transform-plugins: 0.82.5 + metro-transform-worker: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -21522,6 +21583,29 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 + mocha@11.7.1: + dependencies: + browser-stdout: 1.3.1 + chokidar: 4.0.3 + debug: 4.4.1(supports-color@8.1.1) + diff: 7.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 10.4.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 9.0.5 + ms: 2.1.3 + picocolors: 1.1.1 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 9.3.3 + yargs: 17.7.2 + yargs-parser: 21.1.1 + yargs-unparser: 2.0.0 + mocha@4.1.0: dependencies: browser-stdout: 1.3.0 @@ -21804,7 +21888,7 @@ snapshots: oauth-sign@0.9.0: {} - ob1@0.82.4: + ob1@0.82.5: dependencies: flow-enums-runtime: 0.0.6 @@ -22126,8 +22210,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: {} @@ -22658,7 +22740,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + react-devtools-core@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -22700,13 +22782,13 @@ snapshots: invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.82.4 - metro-source-map: 0.82.4 + metro-runtime: 0.82.5 + metro-source-map: 0.82.5 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 react: 19.1.0 - react-devtools-core: 6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + 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 scheduler: 0.25.0 @@ -22940,11 +23022,6 @@ 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: {} @@ -23501,23 +23578,6 @@ snapshots: sol-explore@1.6.1: {} - solc-typed-ast@18.2.4(typescript@5.8.3)(zod@3.25.51): - dependencies: - axios: 1.9.0(debug@4.4.1) - commander: 12.1.0 - decimal.js: 10.5.0 - findup-sync: 5.0.0 - fs-extra: 11.3.0 - 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.8.3)(zod@3.25.51) - transitivePeerDependencies: - - debug - - typescript - - zod - solc@0.4.26: dependencies: fs-extra: 0.30.0 @@ -23549,23 +23609,11 @@ snapshots: transitivePeerDependencies: - debug - solc@0.8.25: - dependencies: - command-exists: 1.2.9 - commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) - 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.1): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.11(debug@4.4.1) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -23573,16 +23621,19 @@ snapshots: transitivePeerDependencies: - debug - solhint@5.1.0(typescript@5.8.3): + solhint@6.0.0(typescript@5.8.3): dependencies: '@solidity-parser/parser': 0.20.1 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.8.3) fast-diff: 1.3.0 + fs-extra: 11.3.0 glob: 8.1.0 ignore: 5.3.2 js-yaml: 4.1.0 @@ -23730,8 +23781,6 @@ snapshots: sprintf-js@1.1.3: {} - src-location@1.1.0: {} - sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -24030,10 +24079,10 @@ snapshots: term-size@2.2.1: {} - terser@5.41.0: + terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -24306,7 +24355,7 @@ snapshots: - supports-color - typescript - typechain@8.3.2(patch_hash=zy6bsbkpcar7tt6jjbnwpaczsm)(typescript@5.8.3): + typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3): dependencies: '@types/prettier': 2.7.3 debug: 4.4.1(supports-color@9.4.0) @@ -24415,6 +24464,8 @@ snapshots: undici-types@6.19.8: {} + undici-types@6.21.0: {} + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 @@ -24532,14 +24583,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: @@ -24646,10 +24689,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 @@ -24657,17 +24696,6 @@ snapshots: web3-utils: 1.2.11 optional: true - web3-eth-abi@4.4.1(typescript@5.8.3)(zod@3.25.51): - dependencies: - abitype: 0.7.1(typescript@5.8.3)(zod@3.25.51) - 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 @@ -24822,8 +24850,6 @@ snapshots: - supports-color optional: true - web3-types@1.10.0: {} - web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 @@ -24847,22 +24873,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.51 - 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) @@ -25014,6 +25024,8 @@ snapshots: workerpool@6.5.1: {} + workerpool@9.3.3: {} + wrap-ansi@2.1.0: dependencies: string-width: 1.0.2 @@ -25094,6 +25106,11 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + xhr-request-promise@0.1.3: dependencies: xhr-request: 1.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e783b8611..8c4c859cd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,47 @@ packages: - - 'packages/*' - - 'packages/*/test' - - 'packages/*/task' + - packages/* + - packages/*/* + +catalog: + '@eslint/js': ^9.28.0 + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.8 + '@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 + '@wagmi/cli': ^2.3.1 + chai: ^4.2.0 + debug: ^4.4.0 + dotenv: ^16.5.0 + eslint: ^9.28.0 + eslint-config-prettier: ^10.1.5 + eslint-plugin-no-only-tests: ^3.3.0 + ethers: ^6.15.0 + glob: ^11.0.1 + hardhat: ^2.24.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 + json5: ^2.2.3 + markdownlint-cli: ^0.45.0 + mocha: ^11.7.1 + prettier: ^3.5.3 + prettier-plugin-solidity: ^2.0.0 + solhint: ^6.0.0 + ts-node: ^10.9.2 + typechain: ^8.3.2 + typescript: ^5.8.3 + typescript-eslint: ^8.33.1 + viem: ^2.31.7 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/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/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/tsconfig.json b/tsconfig.json index 5ede80f5b..9d236f5cc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2020", + "target": "es2022", "module": "Node16", "moduleResolution": "node16", "esModuleInterop": true, @@ -14,6 +14,9 @@ "allowJs": true, "checkJs": false, "incremental": true, - "noEmitOnError": true + "noEmitOnError": true, + "paths": { + "@graphprotocol/*": ["./packages/*"] + } } } From 7ec4d30f0ef38a02f2b5b2bf095fe1cd7f15819c Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 14 Aug 2025 13:33:48 +0000 Subject: [PATCH 04/28] feat: service quality oracle contract and tests --- .../quality/IServiceQualityOracle.sol | 17 + .../contracts/rewards/IRewardsManager.sol | 6 + .../contracts/rewards/IRewardsIssuer.sol | 42 + .../contracts/rewards/RewardsManager.sol | 50 +- .../rewards/RewardsManagerStorage.sol | 15 +- .../tests/MockERC165OnlyContract.sol | 21 + .../tests/MockServiceQualityOracle.sol | 68 + .../test/tests/unit/rewards/rewards.test.ts | 176 ++ packages/issuance/.markdownlint.json | 3 + packages/issuance/.solcover.js | 19 + packages/issuance/.solhint.json | 3 + .../contracts/common/BaseUpgradeable.sol | 143 ++ .../contracts/quality/ServiceQualityOracle.md | 202 ++ .../quality/ServiceQualityOracle.sol | 292 +++ .../contracts/test/InterfaceIdExtractor.sol | 22 + packages/issuance/hardhat.config.cjs | 115 + packages/issuance/hardhat.coverage.config.ts | 82 + packages/issuance/index.js | 11 + packages/issuance/package.json | 70 + packages/issuance/prettier.config.cjs | 5 + packages/issuance/test/hardhat.config.ts | 82 + packages/issuance/test/package.json | 58 + packages/issuance/test/prettier.config.cjs | 5 + packages/issuance/test/scripts/coverage | 10 + .../test/scripts/generateInterfaceIds.js | 144 ++ packages/issuance/test/src/index.ts | 5 + .../test/tests/ServiceQualityOracle.test.ts | 642 ++++++ .../tests/consolidated/AccessControl.test.ts | 151 ++ .../consolidated/InterfaceCompliance.test.ts | 54 + .../issuance/test/tests/helpers/fixtures.ts | 102 + .../test/tests/helpers/interfaceIds.js | 4 + .../test/tests/helpers/sharedFixtures.js | 80 + packages/issuance/test/tsconfig.json | 9 + packages/issuance/test/utils/testPatterns.ts | 35 + packages/issuance/tsconfig.json | 18 + pnpm-lock.yaml | 1937 ++++++++++++++++- 36 files changed, 4598 insertions(+), 100 deletions(-) create mode 100644 packages/common/contracts/quality/IServiceQualityOracle.sol create mode 100644 packages/contracts/contracts/rewards/IRewardsIssuer.sol create mode 100644 packages/contracts/contracts/tests/MockERC165OnlyContract.sol create mode 100644 packages/contracts/contracts/tests/MockServiceQualityOracle.sol create mode 100644 packages/issuance/.markdownlint.json create mode 100644 packages/issuance/.solcover.js create mode 100644 packages/issuance/.solhint.json create mode 100644 packages/issuance/contracts/common/BaseUpgradeable.sol create mode 100644 packages/issuance/contracts/quality/ServiceQualityOracle.md create mode 100644 packages/issuance/contracts/quality/ServiceQualityOracle.sol create mode 100644 packages/issuance/contracts/test/InterfaceIdExtractor.sol create mode 100644 packages/issuance/hardhat.config.cjs create mode 100644 packages/issuance/hardhat.coverage.config.ts create mode 100644 packages/issuance/index.js create mode 100644 packages/issuance/package.json create mode 100644 packages/issuance/prettier.config.cjs create mode 100644 packages/issuance/test/hardhat.config.ts create mode 100644 packages/issuance/test/package.json create mode 100644 packages/issuance/test/prettier.config.cjs create mode 100755 packages/issuance/test/scripts/coverage create mode 100644 packages/issuance/test/scripts/generateInterfaceIds.js create mode 100644 packages/issuance/test/src/index.ts create mode 100644 packages/issuance/test/tests/ServiceQualityOracle.test.ts create mode 100644 packages/issuance/test/tests/consolidated/AccessControl.test.ts create mode 100644 packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts create mode 100644 packages/issuance/test/tests/helpers/fixtures.ts create mode 100644 packages/issuance/test/tests/helpers/interfaceIds.js create mode 100644 packages/issuance/test/tests/helpers/sharedFixtures.js create mode 100644 packages/issuance/test/tsconfig.json create mode 100644 packages/issuance/test/utils/testPatterns.ts create mode 100644 packages/issuance/tsconfig.json diff --git a/packages/common/contracts/quality/IServiceQualityOracle.sol b/packages/common/contracts/quality/IServiceQualityOracle.sol new file mode 100644 index 000000000..ec86b8c87 --- /dev/null +++ b/packages/common/contracts/quality/IServiceQualityOracle.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.7.6 || ^0.8.0; + +/** + * @title IServiceQualityOracle + * @author Edge & Node + * @notice Interface to check if an indexer is allowed to receive rewards based on its service quality + */ +interface IServiceQualityOracle { + /** + * @notice Check if an indexer is allowed to receive rewards + * @param indexer Address of the indexer + * @return True if the indexer is allowed to receive rewards, false otherwise + */ + function isAllowed(address indexer) external view returns (bool); +} diff --git a/packages/common/contracts/rewards/IRewardsManager.sol b/packages/common/contracts/rewards/IRewardsManager.sol index 5d750dd85..c2518d5c8 100644 --- a/packages/common/contracts/rewards/IRewardsManager.sol +++ b/packages/common/contracts/rewards/IRewardsManager.sol @@ -37,6 +37,12 @@ interface IRewardsManager { */ function setMinimumSubgraphSignal(uint256 _minimumSubgraphSignal) external; + /** + * @notice Set the service quality oracle address + * @param newServiceQualityOracle The address of the service quality oracle + */ + function setServiceQualityOracle(address newServiceQualityOracle) external; + // -- Denylist -- /** diff --git a/packages/contracts/contracts/rewards/IRewardsIssuer.sol b/packages/contracts/contracts/rewards/IRewardsIssuer.sol new file mode 100644 index 000000000..614dbf40e --- /dev/null +++ b/packages/contracts/contracts/rewards/IRewardsIssuer.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +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 { + /** + * @notice Get allocation data to calculate rewards issuance + * + * @param allocationId The allocation Id + * @return isActive Whether the allocation is active or not + * @return indexer The indexer address + * @return subgraphDeploymentId Subgraph deployment id for the allocation + * @return tokens Amount of allocated tokens + * @return accRewardsPerAllocatedToken Rewards snapshot + * @return accRewardsPending Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed + */ + function getAllocationData( + address allocationId + ) + external + view + returns ( + bool isActive, + address indexer, + bytes32 subgraphDeploymentId, + uint256 tokens, + uint256 accRewardsPerAllocatedToken, + uint256 accRewardsPending + ); + + /** + * @notice Return the total amount of tokens allocated to subgraph. + * @param _subgraphDeploymentId Deployment Id for the subgraph + * @return Total tokens allocated to subgraph + */ + function getSubgraphAllocatedTokens(bytes32 _subgraphDeploymentId) external view returns (uint256); +} diff --git a/packages/contracts/contracts/rewards/RewardsManager.sol b/packages/contracts/contracts/rewards/RewardsManager.sol index d24f06243..a02c46625 100644 --- a/packages/contracts/contracts/rewards/RewardsManager.sol +++ b/packages/contracts/contracts/rewards/RewardsManager.sol @@ -7,6 +7,7 @@ pragma abicoder v2; // solhint-disable gas-increment-by-one, gas-indexed-events, gas-small-strings, gas-strict-inequalities import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; +import { IERC165 } from "@openzeppelin/contracts/introspection/IERC165.sol"; import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; import { MathUtils } from "../staking/libs/MathUtils.sol"; @@ -14,8 +15,9 @@ import { Managed } from "../governance/Managed.sol"; import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; import { IStaking, IStakingBase } from "../staking/IStaking.sol"; -import { RewardsManagerV4Storage } from "./RewardsManagerStorage.sol"; +import { RewardsManagerV5Storage } from "./RewardsManagerStorage.sol"; import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; /** * @title Rewards Manager Contract @@ -37,7 +39,7 @@ import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IReward * 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 RewardsManagerV4Storage, GraphUpgradeable, IRewardsManager { +contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsManager { using SafeMath for uint256; /// @dev Fixed point scaling factor used for decimals in reward calculations @@ -62,6 +64,14 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa */ event RewardsDenied(address indexed indexer, address indexed allocationID, uint256 epoch); + /** + * @notice Emitted when rewards are denied to an indexer due to service quality + * @param indexer Address of the indexer being denied rewards + * @param allocationID Address of the allocation being denied rewards + * @param amount Amount of rewards that would have been assigned + */ + event RewardsDeniedDueToServiceQuality(address indexed indexer, address indexed allocationID, uint256 amount); + /** * @notice Emitted when a subgraph is denied for claiming rewards * @param subgraphDeploymentID Subgraph deployment ID being denied @@ -69,6 +79,13 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa */ event RewardsDenylistUpdated(bytes32 indexed subgraphDeploymentID, uint256 sinceBlock); + /** + * @notice Emitted when the service quality oracle contract is set + * @param oldServiceQualityOracle Previous service quality oracle address + * @param newServiceQualityOracle New service quality oracle address + */ + event ServiceQualityOracleSet(address indexed oldServiceQualityOracle, address indexed newServiceQualityOracle); + // -- Modifiers -- /** @@ -135,6 +152,28 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa emit ParameterUpdated("minimumSubgraphSignal"); } + /** + * @inheritdoc IRewardsManager + * @dev Note that the service quality oracle can be set to the zero address to disable use of an oracle, in + * which case no indexers will be denied rewards due to service quality. + */ + function setServiceQualityOracle(address newServiceQualityOracle) external override onlyGovernor { + if (address(serviceQualityOracle) != newServiceQualityOracle) { + // Check that the contract supports the IServiceQualityOracle interface + // Allow zero address to disable the oracle + if (newServiceQualityOracle != address(0)) { + require( + IERC165(newServiceQualityOracle).supportsInterface(type(IServiceQualityOracle).interfaceId), + "Contract does not support IServiceQualityOracle interface" + ); + } + + address oldServiceQualityOracle = address(serviceQualityOracle); + serviceQualityOracle = IServiceQualityOracle(newServiceQualityOracle); + emit ServiceQualityOracleSet(oldServiceQualityOracle, newServiceQualityOracle); + } + } + // -- Denylist -- /** @@ -336,6 +375,13 @@ contract RewardsManager is RewardsManagerV4Storage, GraphUpgradeable, IRewardsMa // Calculate rewards accrued by this allocation uint256 rewards = _calcRewards(alloc.tokens, alloc.accRewardsPerAllocatedToken, accRewardsPerAllocatedToken); + + // Do not reward if indexer is not eligible based on service quality + if (address(serviceQualityOracle) != address(0) && !serviceQualityOracle.isAllowed(alloc.indexer)) { + emit RewardsDeniedDueToServiceQuality(alloc.indexer, _allocationID, rewards); + return 0; + } + if (rewards > 0) { // Mint directly to staking contract for the reward amount // The staking contract will do bookkeeping of the reward and diff --git a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol index 1901b531e..7d7f1e5c6 100644 --- a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol +++ b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol @@ -5,6 +5,8 @@ pragma solidity 0.7.6; import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsIssuer } from "./IRewardsIssuer.sol"; +import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; import { Managed } from "../governance/Managed.sol"; /** @@ -59,6 +61,17 @@ contract RewardsManagerV3Storage is RewardsManagerV2Storage { */ contract RewardsManagerV4Storage is RewardsManagerV3Storage { /// @notice GRT issued for indexer rewards per block - /// @dev Only used when issuanceAllocator is zero address. uint256 public issuancePerBlock; } + +/** + * @title RewardsManagerV5Storage + * @author Edge & Node + * @notice Storage layout for RewardsManager V5 + */ +contract RewardsManagerV5Storage is RewardsManagerV4Storage { + /// @notice Address of the subgraph service + IRewardsIssuer public subgraphService; + /// @notice Address of the service quality oracle contract + IServiceQualityOracle public serviceQualityOracle; +} diff --git a/packages/contracts/contracts/tests/MockERC165OnlyContract.sol b/packages/contracts/contracts/tests/MockERC165OnlyContract.sol new file mode 100644 index 000000000..478ecb795 --- /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 IServiceQualityOracle + * @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/MockServiceQualityOracle.sol b/packages/contracts/contracts/tests/MockServiceQualityOracle.sol new file mode 100644 index 000000000..200037075 --- /dev/null +++ b/packages/contracts/contracts/tests/MockServiceQualityOracle.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.7.6; + +import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; +import { ERC165 } from "@openzeppelin/contracts/introspection/ERC165.sol"; + +/** + * @title MockServiceQualityOracle + * @author Edge & Node + * @notice A simple mock contract for the ServiceQualityOracle interface + * @dev A simple mock contract for the ServiceQualityOracle interface + */ +contract MockServiceQualityOracle is IServiceQualityOracle, ERC165 { + /// @dev Mapping to store allowed status for each indexer + mapping(address => bool) private _allowed; + + /// @dev Mapping to track which indexers have been explicitly set + mapping(address => bool) private _isSet; + + /// @dev Default response for indexers not explicitly set + bool private _defaultResponse; + + /** + * @notice Constructor + * @param defaultResponse Default response for isAllowed + */ + constructor(bool defaultResponse) { + _defaultResponse = defaultResponse; + } + + /** + * @notice Set whether a specific indexer is allowed + * @param indexer The indexer address + * @param allowed Whether the indexer is allowed + */ + function setIndexerAllowed(address indexer, bool allowed) external { + _allowed[indexer] = allowed; + } + + /** + * @notice Set the default response for indexers not explicitly set + * @param defaultResponse The default response + */ + function setDefaultResponse(bool defaultResponse) external { + _defaultResponse = defaultResponse; + } + + /** + * @inheritdoc IServiceQualityOracle + */ + function isAllowed(address indexer) external view override returns (bool) { + // If the indexer has been explicitly set, return that value + if (_isSet[indexer]) { + return _allowed[indexer]; + } + + // Otherwise return the default response + return _defaultResponse; + } + + /** + * @inheritdoc ERC165 + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IServiceQualityOracle).interfaceId || super.supportsInterface(interfaceId); + } +} diff --git a/packages/contracts/test/tests/unit/rewards/rewards.test.ts b/packages/contracts/test/tests/unit/rewards/rewards.test.ts index 886d9a059..42cd12e4b 100644 --- a/packages/contracts/test/tests/unit/rewards/rewards.test.ts +++ b/packages/contracts/test/tests/unit/rewards/rewards.test.ts @@ -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('service quality oracle', function () { + it('should reject setServiceQualityOracle if unauthorized', async function () { + const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + ) + const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + await mockOracle.deployed() + const tx = rewardsManager.connect(indexer1).setServiceQualityOracle(mockOracle.address) + await expect(tx).revertedWith('Only Controller governor') + }) + + it('should set service quality oracle if governor', async function () { + const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + ) + const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + await mockOracle.deployed() + + const tx = rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + await expect(tx) + .emit(rewardsManager, 'ServiceQualityOracleSet') + .withArgs(constants.AddressZero, mockOracle.address) + + expect(await rewardsManager.serviceQualityOracle()).eq(mockOracle.address) + }) + + it('should allow setting service quality oracle to zero address', async function () { + // First set an oracle + const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + ) + const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + await mockOracle.deployed() + await rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + + // Then set to zero address to disable + const tx = rewardsManager.connect(governor).setServiceQualityOracle(constants.AddressZero) + await expect(tx) + .emit(rewardsManager, 'ServiceQualityOracleSet') + .withArgs(mockOracle.address, constants.AddressZero) + + expect(await rewardsManager.serviceQualityOracle()).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 service quality oracle + const tx = rewardsManager.connect(governor).setServiceQualityOracle(indexer1.address) + await expect(tx).revertedWith('function call to a non-contract account') + }) + + it('should reject setting oracle that does not support IServiceQualityOracle interface', async function () { + // Deploy a contract that doesn't support the IServiceQualityOracle 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).setServiceQualityOracle(mockContract.address) + await expect(tx).revertedWith('Contract does not support IServiceQualityOracle interface') + }) + + it('should not emit event when setting same oracle address', async function () { + const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + ) + const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + await mockOracle.deployed() + await rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + + // Setting the same oracle again should not emit an event + const tx = rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + await expect(tx).to.not.emit(rewardsManager, 'ServiceQualityOracleSet') + }) + }) + describe('subgraph availability service', function () { it('reject set subgraph oracle if unauthorized', async function () { const tx = rewardsManager.connect(indexer1).setSubgraphAvailabilityOracle(oracle.address) @@ -812,6 +896,98 @@ describe('Rewards', () => { .emit(rewardsManager, 'RewardsDenied') .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch()) }) + + it('should deny rewards due to service quality oracle', async function () { + // Setup service quality oracle that denies rewards for indexer1 + const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + ) + const mockOracle = await MockServiceQualityOracleFactory.deploy(false) // Default to deny + await mockOracle.deployed() + + // Set the service quality oracle + await rewardsManager.connect(governor).setServiceQualityOracle(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 service quality + const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) + await expect(tx) + .emit(rewardsManager, 'RewardsDeniedDueToServiceQuality') + .withArgs(indexer1.address, allocationID1, expectedIndexingRewards) + }) + + it('should allow rewards when service quality oracle approves', async function () { + // Setup service quality oracle that allows rewards for indexer1 + const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + ) + const mockOracle = await MockServiceQualityOracleFactory.deploy(true) // Default to allow + await mockOracle.deployed() + + // Set the service quality oracle + await rewardsManager.connect(governor).setServiceQualityOracle(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, 'RewardsAssigned') + .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch(), 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, 'RewardsAssigned') + .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch(), 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/issuance/.markdownlint.json b/packages/issuance/.markdownlint.json new file mode 100644 index 000000000..18947b0be --- /dev/null +++ b/packages/issuance/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.markdownlint.json" +} diff --git a/packages/issuance/.solcover.js b/packages/issuance/.solcover.js new file mode 100644 index 000000000..e3dbe2e27 --- /dev/null +++ b/packages/issuance/.solcover.js @@ -0,0 +1,19 @@ +module.exports = { + skipFiles: ['test/'], + providerOptions: { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + network_id: 1337, + }, + istanbulFolder: './test/reports/coverage', + configureYulOptimizer: true, + mocha: { + grep: '@skip-on-coverage', + invert: true, + }, + reporter: ['html', 'lcov', 'text'], + reporterOptions: { + html: { + directory: './test/reports/coverage/html', + }, + }, +} diff --git a/packages/issuance/.solhint.json b/packages/issuance/.solhint.json new file mode 100644 index 000000000..d30847305 --- /dev/null +++ b/packages/issuance/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": ["solhint:recommended", "./../../.solhint.json"] +} diff --git a/packages/issuance/contracts/common/BaseUpgradeable.sol b/packages/issuance/contracts/common/BaseUpgradeable.sol new file mode 100644 index 000000000..85610f0c9 --- /dev/null +++ b/packages/issuance/contracts/common/BaseUpgradeable.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { AccessControlUpgradeable } from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; + +/** + * @title BaseUpgradeable + * @author Edge & Node + * @notice A base contract that provides role-based access control and pausability. + * + * @dev This contract combines OpenZeppelin's AccessControl and Pausable + * to provide a standardized way to manage access control and pausing functionality. + * It uses ERC-7201 namespaced storage pattern for better storage isolation. + * This contract is abstract and meant to be inherited by other contracts. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any bugs. We might have an active bug bounty program. + */ +abstract contract BaseUpgradeable is Initializable, AccessControlUpgradeable, PausableUpgradeable { + // -- Constants -- + + /// @notice One million - used as the denominator for values provided as Parts Per Million (PPM) + /// @dev This constant represents 1,000,000 and serves as the denominator when working with + /// PPM values. For example, 50% would be represented as 500,000 PPM, calculated as + /// (500,000 / MILLION) = 0.5 = 50% + uint256 public constant MILLION = 1_000_000; + + // -- Role Constants -- + + /** + * @notice Role identifier for governor accounts + * @dev Governors have the highest level of access and can: + * - Grant and revoke roles within the established hierarchy + * - Perform administrative functions and system configuration + * - Set critical parameters and upgrade contracts + * Admin of: GOVERNOR_ROLE, PAUSE_ROLE, OPERATOR_ROLE + */ + bytes32 public constant GOVERNOR_ROLE = keccak256("GOVERNOR_ROLE"); + + /** + * @notice Role identifier for pause accounts + * @dev Pause role holders can: + * - Pause and unpause contract operations for emergency situations + * Typically granted to automated monitoring systems or emergency responders. + * Pausing is intended for quick response to potential threats, and giving time for investigation and resolution (potentially with governance intervention). + * Admin: GOVERNOR_ROLE + */ + bytes32 public constant PAUSE_ROLE = keccak256("PAUSE_ROLE"); + + /** + * @notice Role identifier for operator accounts + * @dev Operators can: + * - Perform operational tasks as defined by inheriting contracts + * - Manage roles that are designated as operator-administered + * Admin: GOVERNOR_ROLE + */ + bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); + + // -- Immutable Variables -- + + /// @notice The Graph Token contract + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + IGraphToken internal immutable GRAPH_TOKEN; + + // -- Custom Errors -- + + /// @notice Thrown when attempting to set the Graph Token to the zero address + error GraphTokenCannotBeZeroAddress(); + + /// @notice Thrown when attempting to set the governor to the zero address + error GovernorCannotBeZeroAddress(); + + // -- Constructor -- + + /** + * @notice Constructor for the BaseUpgradeable contract + * @dev This contract is upgradeable, but we use the constructor to set immutable variables + * and disable initializers to prevent the implementation contract from being initialized. + * @param graphToken Address of the Graph Token contract + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor(address graphToken) { + require(graphToken != address(0), GraphTokenCannotBeZeroAddress()); + GRAPH_TOKEN = IGraphToken(graphToken); + _disableInitializers(); + } + + // -- Initialization -- + + /** + * @notice Internal function to initialize the BaseUpgradeable contract + * @dev This function is used by child contracts to initialize the BaseUpgradeable contract + * @param governor Address that will have the GOVERNOR_ROLE + */ + function __BaseUpgradeable_init(address governor) internal { + // solhint-disable-previous-line func-name-mixedcase + + __AccessControl_init(); + __Pausable_init(); + + __BaseUpgradeable_init_unchained(governor); + } + + /** + * @notice Internal unchained initialization function for BaseUpgradeable + * @dev This function sets up the governor role and role admin hierarchy + * @param governor Address that will have the GOVERNOR_ROLE + */ + function __BaseUpgradeable_init_unchained(address governor) internal { + // solhint-disable-previous-line func-name-mixedcase + + require(governor != address(0), GovernorCannotBeZeroAddress()); + + // Set up role admin hierarchy: + // GOVERNOR is admin of GOVERNOR, PAUSE, and OPERATOR roles + _setRoleAdmin(GOVERNOR_ROLE, GOVERNOR_ROLE); + _setRoleAdmin(PAUSE_ROLE, GOVERNOR_ROLE); + _setRoleAdmin(OPERATOR_ROLE, GOVERNOR_ROLE); + + // Grant initial governor role + _grantRole(GOVERNOR_ROLE, governor); + } + + // -- External Functions -- + + /** + * @notice Pause the contract + * @dev Only callable by accounts with the PAUSE_ROLE + */ + function pause() external onlyRole(PAUSE_ROLE) { + _pause(); + } + + /** + * @notice Unpause the contract + * @dev Only callable by accounts with the PAUSE_ROLE + */ + function unpause() external onlyRole(PAUSE_ROLE) { + _unpause(); + } +} diff --git a/packages/issuance/contracts/quality/ServiceQualityOracle.md b/packages/issuance/contracts/quality/ServiceQualityOracle.md new file mode 100644 index 000000000..c669dd765 --- /dev/null +++ b/packages/issuance/contracts/quality/ServiceQualityOracle.md @@ -0,0 +1,202 @@ +# ServiceQualityOracle + +The ServiceQualityOracle is a smart contract that manages indexer eligibility for receiving rewards based on service quality assessments. It implements a time-based allowlist system where indexers must be explicitly approved by authorized oracles to receive rewards. + +## Overview + +The contract operates on a "deny by default" principle - all indexers are initially ineligible for rewards until they are explicitly allowed by an authorized oracle. Once allowed, indexers remain eligible for a configurable period before their eligibility expires and they need to be re-approved. + +## Key Features + +- **Time-based Eligibility**: Indexers are allowed for a configurable period (default: 14 days) +- **Oracle-based Approval**: Only authorized oracles can approve indexers +- **Global Toggle**: Quality checking can be globally enabled/disabled +- **Timeout Mechanism**: If oracles don't update for too long, all indexers are automatically allowed +- **Role-based Access Control**: Uses hierarchical roles for governance and operations + +## Architecture + +### Roles + +The contract uses four main roles: + +- **GOVERNOR_ROLE**: Can grant/revoke operator roles and perform governance actions +- **OPERATOR_ROLE**: Can configure contract parameters and manage oracle roles +- **ORACLE_ROLE**: Can approve indexers for rewards +- **PAUSE_ROLE**: Can pause contract operations (inherited from BaseUpgradeable) + +### Storage + +The contract uses ERC-7201 namespaced storage to prevent storage collisions in upgradeable contracts: + +- `allowedIndexerTimestamps`: Maps indexer addresses to their last approval timestamp +- `allowedPeriod`: Duration (in seconds) for which approval lasts (default: 14 days) +- `checkingActive`: Global flag to enable/disable quality checking (default: false, to be enabled by operator when ready) +- `oracleUpdateTimeout`: Timeout after which all indexers are automatically allowed (default: 7 days) +- `lastOracleUpdateTime`: Timestamp of the last oracle update + +## Core Functions + +### Oracle Management + +Oracle roles are managed through the standard AccessControl functions inherited from BaseUpgradeable: + +- **`grantRole(bytes32 role, address account)`**: Grant oracle privileges to an account (OPERATOR_ROLE only) +- **`revokeRole(bytes32 role, address account)`**: Revoke oracle privileges from an account (OPERATOR_ROLE only) +- **`hasRole(bytes32 role, address account)`**: Check if an account has oracle privileges + +The `ORACLE_ROLE` constant can be used as the role parameter for these functions. + +### Configuration + +#### `setAllowedPeriod(uint256 allowedPeriod) → bool` + +- **Access**: OPERATOR_ROLE only +- **Purpose**: Set how long indexer approvals last +- **Parameters**: `allowedPeriod` - Duration in seconds +- **Returns**: Always true for current implementation +- **Events**: Emits `AllowedPeriodUpdated` if value changes + +#### `setOracleUpdateTimeout(uint256 oracleUpdateTimeout) → bool` + +- **Access**: OPERATOR_ROLE only +- **Purpose**: Set timeout after which all indexers are automatically allowed +- **Parameters**: `oracleUpdateTimeout` - Timeout duration in seconds +- **Returns**: Always true for current implementation +- **Events**: Emits `OracleUpdateTimeoutUpdated` if value changes + +#### `setQualityChecking(bool enabled) → bool` + +- **Access**: OPERATOR_ROLE only +- **Purpose**: Enable or disable quality checking globally +- **Parameters**: `enabled` - True to enable, false to disable +- **Returns**: Always true for current implementation +- **Events**: Emits `QualityCheckingUpdated` if state changes + +### Indexer Management + +#### `allowIndexers(address[] calldata indexers, bytes calldata data) → uint256` + +- **Access**: ORACLE_ROLE only +- **Purpose**: Approve indexers for rewards +- **Parameters**: + - `indexers` - Array of indexer addresses (zero addresses ignored) + - `data` - Arbitrary calldata for future extensions +- **Returns**: Number of indexers whose timestamp was updated +- **Events**: + - Emits `IndexerQualityData` with oracle and data + - Emits `IndexerAllowed` for each newly allowed indexer +- **Notes**: + - Updates `lastOracleUpdateTime` to current block timestamp + - Only updates timestamp if less than current block timestamp + - Ignores zero addresses and duplicate updates within same block + +### View Functions + +#### `isAllowed(address indexer) → bool` + +- **Purpose**: Check if an indexer is eligible for rewards +- **Logic**: + 1. If quality checking is disabled → return true + 2. If oracle timeout exceeded → return true + 3. Otherwise → check if indexer's approval is still valid +- **Returns**: True if indexer is allowed, false otherwise + +#### `isAuthorizedOracle(address oracle) → bool` + +- **Purpose**: Check if an address has oracle privileges +- **Returns**: True if address has ORACLE_ROLE + +#### `getLastAllowedTime(address indexer) → uint256` + +- **Purpose**: Get the timestamp when indexer was last approved +- **Returns**: Timestamp or 0 if never approved + +#### `getAllowedPeriod() → uint256` + +- **Purpose**: Get the current allowed period +- **Returns**: Duration in seconds + +#### `getOracleUpdateTimeout() → uint256` + +- **Purpose**: Get the current oracle update timeout +- **Returns**: Duration in seconds + +#### `getLastOracleUpdateTime() → uint256` + +- **Purpose**: Get when oracles last updated +- **Returns**: Timestamp of last oracle update + +#### `isQualityCheckingActive() → bool` + +- **Purpose**: Check if quality checking is enabled +- **Returns**: True if active, false if disabled + +## Eligibility Logic + +An indexer is considered allowed if ANY of the following conditions are met: + +1. **Valid approval** (`block.timestamp <= allowedIndexerTimestamps[indexer] + allowedPeriod`) +2. **Oracle timeout exceeded** (`lastOracleUpdateTime + oracleUpdateTimeout < block.timestamp`) +3. **Quality checking is disabled** (`checkingActive = false`) + +This design ensures that: + +- The system fails open if oracles stop updating +- Operators can disable quality checking entirely if needed +- Individual indexer approvals have time limits + +In normal operation, the first condition is expected to be the only one that applies. The other two conditions provide fail-safes for oracle failures, or in extreme cases an operator override. For normal operational failure of oracles, the system gracefully degrades into a "allow all" mode. This mechanism is not perfect in that oracles could still be updating but allowing far fewer indexers than they should. However this is regarded as simple mechanism that is good enough to start with and provide a foundation for future improvements and decentralization. + +While this simple model allows the criteria for providing good service to evolve over time (which is essential for the long-term health of the network), it captures sufficient information on-chain for indexers to be able to monitor their eligibility. This is important to ensure that even in the absence of other sources of information regarding observed indexer service, indexers have a good transparency about if they are being observed to be providing good service, and for how long their current approval is valid. + +It might initially seem safer to allow indexers by default unless an oracle explicitly denies an indexer. While that might seem safer from the perspective of the ServiceQualityOracle in isolation, in the absence of a more sophisticated voting system it would make the system vulnerable to a single bad oracle denying many indexers. The design of deny by default is better suited to allowing redundant oracles to be working in parallel, where only one needs to be successfully detecting indexers that are providing quality service, as well as eventually allowing different oracles to have different approval criteria and/or inputs. Therefore deny by default facilitates a more resilient and open oracle system that is less vulnerable to a single points of failure, and more open to increasing decentralization over time. + +In general to be rewarded for providing service on The Graph, there is expected to be proof provided of good operation (such as for proof of indexing). While proof should be required to receive rewards, the system is designed for participants to have confidence is being able to adequately prove good operation (and in the case of oracles, be seen by at least one observer) that is sufficient to allow the indexer to receive rewards. The oracle model is in general far more suited to collecting evidence of good operation, from multiple independent observers, rather than any observer being able to establish that an indexer is not providing good service. + +## Events + +```solidity +event IndexerQualityData(address indexed oracle, bytes data); +event IndexerAllowed(address indexed indexer, address indexed oracle); +event AllowedPeriodUpdated(uint256 oldPeriod, uint256 newPeriod); +event QualityCheckingUpdated(bool active); +event OracleUpdateTimeoutUpdated(uint256 oldTimeout, uint256 newTimeout); +``` + +## Default Configuration + +- **Allowed Period**: 14 days (1,209,600 seconds) +- **Oracle Update Timeout**: 7 days (604,800 seconds) +- **Quality Checking**: Disabled (false) +- **Last Oracle Update Time**: 0 (never updated) + +The system is deployed with reasonable defaults but can be adjusted as required. Quality checking is disabled by default as the expectation is to first see oracles successfully allowing indexers and having suitably established allowed indexers before enabling. + +## Usage Patterns + +### Initial Setup + +1. Deploy contract with Graph Token address +2. Initialize with governor address +3. Governor grants OPERATOR_ROLE to operational accounts +4. Operators grant ORACLE_ROLE to oracle services using `grantRole(ORACLE_ROLE, oracleAddress)` +5. Configure allowed period and timeout as needed +6. After demonstration of successful oracle operation and having established a set of allowed indexers, quality checking is enabled + +### Normal Operation + +1. Oracles periodically call `allowIndexers()` with quality-approved indexers +2. Reward systems call `isAllowed()` to check indexer eligibility +3. Operators adjust parameters as needed via configuration functions +4. The operation of the system is monitored and adjusted as needed + +### Emergency Scenarios + +- **Oracle failure**: System automatically allows all indexers after timeout +- **Quality issues**: Operators can disable quality checking globally +- **Parameter changes**: Operators can adjust periods and timeouts + +## Integration + +The contract implements the `IServiceQualityOracle` interface and can be integrated with any system that needs to verify indexer quality status. The primary integration point is the `isAllowed(address)` function which returns a simple boolean indicating eligibility. diff --git a/packages/issuance/contracts/quality/ServiceQualityOracle.sol b/packages/issuance/contracts/quality/ServiceQualityOracle.sol new file mode 100644 index 000000000..bc6bc315b --- /dev/null +++ b/packages/issuance/contracts/quality/ServiceQualityOracle.sol @@ -0,0 +1,292 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; +import { BaseUpgradeable } from "../common/BaseUpgradeable.sol"; + +/** + * @title ServiceQualityOracle + * @author Edge & Node + * @notice This contract allows authorized oracles to allow indexers to receive rewards + * with an expiration mechanism. Indexers are denied by default until they are explicitly allowed, + * and their eligibility expires after a configurable allowed period. + * The contract also includes a global quality check toggle and an oracle update timeout mechanism. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any bugs. We might have an active bug bounty program. + */ +contract ServiceQualityOracle is BaseUpgradeable, IServiceQualityOracle { + // -- Role Constants -- + + /** + * @notice Oracle role identifier + * @dev Oracle role holders can: + * - Allow indexers to receive rewards (based on off-chain quality assessment) + * This role is typically granted to automated quality assessment systems + * Admin: OPERATOR_ROLE (operators can manage oracle roles) + */ + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + // -- Namespaced Storage -- + + /// @notice ERC-7201 storage location for ServiceQualityOracle + bytes32 private constant SERVICE_QUALITY_ORACLE_STORAGE_LOCATION = + // Not needed for compile time calculation + // solhint-disable-next-line gas-small-strings + keccak256(abi.encode(uint256(keccak256("graphprotocol.storage.ServiceQualityOracle")) - 1)) & + ~bytes32(uint256(0xff)); + + /// @notice Main storage structure for ServiceQualityOracle using ERC-7201 namespaced storage + /// @param allowedIndexerTimestamps Mapping of indexers to their last allowed timestamp + /// @param allowedPeriod Period in seconds for which indexer allowed status lasts + /// @param checkingActive Flag to enable/disable quality checking + /// @param oracleUpdateTimeout Timeout period in seconds after which isAllowed returns true if no oracle updates + /// @param lastOracleUpdateTime Timestamp of the last oracle update + /// @custom:storage-location erc7201:graphprotocol.storage.ServiceQualityOracle + struct ServiceQualityOracleData { + /// @dev Mapping of indexers to their last allowed timestamp + mapping(address => uint256) allowedIndexerTimestamps; + /// @dev Period in seconds for which indexer allowed status lasts + uint256 allowedPeriod; + /// @dev Flag to enable/disable quality checking + bool checkingActive; + /// @dev Timeout period in seconds after which isAllowed returns true if no oracle updates + uint256 oracleUpdateTimeout; + /// @dev Timestamp of the last oracle update + uint256 lastOracleUpdateTime; + } + + /** + * @notice Returns the storage struct for ServiceQualityOracle + * @return $ contract storage + */ + function _getServiceQualityOracleStorage() private pure returns (ServiceQualityOracleData storage $) { + // solhint-disable-previous-line use-natspec + // Solhint does not support $ return variable in natspec + bytes32 slot = SERVICE_QUALITY_ORACLE_STORAGE_LOCATION; + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := slot + } + } + + // -- Events -- + + /// @notice Emitted when an oracle submits quality data + /// @param oracle The address of the oracle that submitted the data + /// @param data The quality data submitted by the oracle + event IndexerQualityData(address indexed oracle, bytes data); + + /// @notice Emitted when an indexer is allowed by an oracle + /// @param indexer The address of the indexer that was allowed + /// @param oracle The address of the oracle that allowed the indexer + event IndexerAllowed(address indexed indexer, address indexed oracle); + + /// @notice Emitted when the allowed period is updated + /// @param oldPeriod The previous allowed period in seconds + /// @param newPeriod The new allowed period in seconds + event AllowedPeriodUpdated(uint256 oldPeriod, uint256 newPeriod); // solhint-disable-line gas-indexed-events + // Do not need to index period values + + /// @notice Emitted when quality checking is enabled or disabled + /// @param active True if quality checking is enabled, false if disabled + event QualityCheckingUpdated(bool indexed active); // solhint-disable-line gas-indexed-events + + /// @notice Emitted when the oracle update timeout is updated + /// @param oldTimeout The previous timeout period in seconds + /// @param newTimeout The new timeout period in seconds + event OracleUpdateTimeoutUpdated(uint256 indexed oldTimeout, uint256 newTimeout); // solhint-disable-line gas-indexed-events + + // -- Constructor -- + + /** + * @notice Constructor for the ServiceQualityOracle contract + * @dev This contract is upgradeable, but we use the constructor to pass the Graph Token address + * to the base contract. + * @param graphToken Address of the Graph Token contract + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor(address graphToken) BaseUpgradeable(graphToken) {} + + // -- Initialization -- + + /** + * @notice Initialize the ServiceQualityOracle contract + * @param governor Address that will have the GOVERNOR_ROLE + * @dev Also sets OPERATOR as admin of ORACLE role + */ + function initialize(address governor) external virtual initializer { + __BaseUpgradeable_init(governor); + + // OPERATOR is admin of ORACLE role + _setRoleAdmin(ORACLE_ROLE, OPERATOR_ROLE); + + // Set default values + ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); + $.allowedPeriod = 14 days; + $.oracleUpdateTimeout = 7 days; + $.checkingActive = false; // Start with quality checking disabled, to be enabled later when the oracle is ready + } + + /** + * @notice Check if this contract supports a given interface + * @dev Overrides the supportsInterface function from ERC165Upgradeable + * @param interfaceId The interface identifier to check + * @return True if the contract supports the interface, false otherwise + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IServiceQualityOracle).interfaceId || super.supportsInterface(interfaceId); + } + + // -- Governance Functions -- + + /** + * @notice Set the allowed period for indexers + * @dev Only callable by accounts with the OPERATOR_ROLE + * @param allowedPeriod New allowed period in seconds + * @return True if the state is as requested (allowed period is set to the specified value) + */ + function setAllowedPeriod(uint256 allowedPeriod) external onlyRole(OPERATOR_ROLE) returns (bool) { + ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); + uint256 oldAllowedPeriod = $.allowedPeriod; + + if (allowedPeriod != oldAllowedPeriod) { + $.allowedPeriod = allowedPeriod; + emit AllowedPeriodUpdated(oldAllowedPeriod, allowedPeriod); + } + + return true; + } + + /** + * @notice Set the oracle update timeout + * @dev Only callable by accounts with the OPERATOR_ROLE + * @param oracleUpdateTimeout New timeout period in seconds + * @return True if the state is as requested (timeout is set to the specified value) + */ + function setOracleUpdateTimeout(uint256 oracleUpdateTimeout) external onlyRole(OPERATOR_ROLE) returns (bool) { + ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); + uint256 oldTimeout = $.oracleUpdateTimeout; + + if (oracleUpdateTimeout != oldTimeout) { + $.oracleUpdateTimeout = oracleUpdateTimeout; + emit OracleUpdateTimeoutUpdated(oldTimeout, oracleUpdateTimeout); + } + + return true; + } + + /** + * @notice Set quality checking state + * @dev Only callable by accounts with the OPERATOR_ROLE + * @param enabled True to enable quality checking, false to disable + * @return True if successfully set (always the case for current code) + */ + function setQualityChecking(bool enabled) external onlyRole(OPERATOR_ROLE) returns (bool) { + ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); + + if ($.checkingActive != enabled) { + $.checkingActive = enabled; + emit QualityCheckingUpdated(enabled); + } + + return true; + } + + /** + * @notice Mark provided indexers as meeting service quality requirements to receive rewards + * @param indexers Array of indexer addresses. Zero addresses are ignored. + * @param data Arbitrary calldata for future extensions + * @return Number of indexers whose allowed timestamp was updated + */ + function allowIndexers( + address[] calldata indexers, + bytes calldata data + ) external onlyRole(ORACLE_ROLE) returns (uint256) { + emit IndexerQualityData(msg.sender, data); + + uint256 updatedCount = 0; + uint256 blockTimestamp = block.timestamp; + + ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); + $.lastOracleUpdateTime = blockTimestamp; + + // Update each indexer's allowed timestamp + for (uint256 i = 0; i < indexers.length; ++i) { + address indexer = indexers[i]; + + if (indexer != address(0) && $.allowedIndexerTimestamps[indexer] < blockTimestamp) { + $.allowedIndexerTimestamps[indexer] = blockTimestamp; + emit IndexerAllowed(indexers[i], msg.sender); + ++updatedCount; + } + } + + return updatedCount; + } + + // -- View Functions -- + + /** + * @inheritdoc IServiceQualityOracle + */ + function isAllowed(address indexer) external view returns (bool) { + ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); + + // If quality checking is disabled, treat all indexers as allowed + if (!$.checkingActive) return true; + + // If no oracle updates have been made for oracleUpdateTimeout, treat all indexers as allowed + if ($.lastOracleUpdateTime + $.oracleUpdateTimeout < block.timestamp) return true; + + return block.timestamp < $.allowedIndexerTimestamps[indexer] + $.allowedPeriod; + } + + /** + * @notice Check if an oracle is authorized + * @param oracle Address of the oracle + * @return True if the oracle is authorized, false otherwise + */ + function isAuthorizedOracle(address oracle) external view returns (bool) { + return hasRole(ORACLE_ROLE, oracle); + } + + /** + * @notice Get the last allowed timestamp for an indexer + * @param indexer Address of the indexer + * @return The last allowed timestamp, or 0 if the indexer has not been allowed + */ + function getLastAllowedTime(address indexer) external view returns (uint256) { + return _getServiceQualityOracleStorage().allowedIndexerTimestamps[indexer]; + } + + /** + * @notice Get the allowed period + * @return The current allowed period in seconds + */ + function getAllowedPeriod() external view returns (uint256) { + return _getServiceQualityOracleStorage().allowedPeriod; + } + + /** + * @notice Get the oracle update timeout + * @return The current oracle update timeout in seconds + */ + function getOracleUpdateTimeout() external view returns (uint256) { + return _getServiceQualityOracleStorage().oracleUpdateTimeout; + } + + /** + * @notice Get the last oracle update time + * @return The timestamp of the last oracle update + */ + function getLastOracleUpdateTime() external view returns (uint256) { + return _getServiceQualityOracleStorage().lastOracleUpdateTime; + } + + /** + * @notice Check if quality checking is active + * @return True if quality checking is active, false otherwise + */ + function isQualityCheckingActive() external view returns (bool) { + return _getServiceQualityOracleStorage().checkingActive; + } +} diff --git a/packages/issuance/contracts/test/InterfaceIdExtractor.sol b/packages/issuance/contracts/test/InterfaceIdExtractor.sol new file mode 100644 index 000000000..8fd0b7d81 --- /dev/null +++ b/packages/issuance/contracts/test/InterfaceIdExtractor.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.0; + +import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; + +/** + * @title InterfaceIdExtractor + * @author Edge & Node + * @notice Utility contract for extracting ERC-165 interface IDs from Solidity interfaces + * @dev This contract is used during the build process to generate interface ID constants + * that match Solidity's own calculations, ensuring consistency between tests and actual + * interface implementations. + */ +contract InterfaceIdExtractor { + /** + * @notice Returns the ERC-165 interface ID for IServiceQualityOracle + * @return The interface ID as calculated by Solidity + */ + function getIServiceQualityOracleId() external pure returns (bytes4) { + return type(IServiceQualityOracle).interfaceId; + } +} diff --git a/packages/issuance/hardhat.config.cjs b/packages/issuance/hardhat.config.cjs new file mode 100644 index 000000000..27f2f6214 --- /dev/null +++ b/packages/issuance/hardhat.config.cjs @@ -0,0 +1,115 @@ +require('@nomicfoundation/hardhat-ethers') +require('@nomicfoundation/hardhat-chai-matchers') +require('@typechain/hardhat') +require('hardhat-abi-exporter') +require('hardhat-contract-sizer') +require('hardhat-gas-reporter') +require('solidity-coverage') +require('@openzeppelin/hardhat-upgrades') +require('@nomicfoundation/hardhat-verify') + +const dotenv = require('dotenv') + +dotenv.config() + +const config = { + // paths: { + // sources: './contracts', + // tests: './test', + // artifacts: './build/contracts', + // cache: './cache', + // }, + solidity: { + compilers: [ + { + version: '0.8.27', + }, + ], + }, + defaultNetwork: 'hardhat', + networks: { + hardhat: { + chainId: 1337, + loggingEnabled: false, + gas: 12000000, + gasPrice: 'auto', + initialBaseFeePerGas: 0, + blockGasLimit: 12000000, + // Support for forking + forking: + process.env.FORK === 'true' + ? { + url: + process.env.FORK_NETWORK === 'arbitrumSepolia' + ? process.env.ARBITRUM_SEPOLIA_RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc' + : process.env.ARBITRUM_ONE_RPC_URL || 'https://arb1.arbitrum.io/rpc', + blockNumber: process.env.FORK_BLOCK_NUMBER ? parseInt(process.env.FORK_BLOCK_NUMBER) : undefined, + } + : undefined, + }, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', + accounts: { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + }, + }, + // For connecting to Anvil fork + anvilFork: { + chainId: 31337, // Anvil's default chainId + url: process.env.ANVIL_FORK_URL || 'http://127.0.0.1:8545', + accounts: process.env.PRIVATE_KEY + ? [process.env.PRIVATE_KEY] + : { + mnemonic: 'test test test test test test test test test test test junk', + }, + // Pass through environment variables to the deployment script + params_file: process.env.PARAMS_FILE, + }, + arbitrumSepolia: { + chainId: 421614, + url: process.env.ARBITRUM_SEPOLIA_RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc', + accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], + gasPrice: 'auto', + }, + arbitrumOne: { + chainId: 42161, + url: process.env.ARBITRUM_ONE_RPC_URL || 'https://arb1.arbitrum.io/rpc', + accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], + gasPrice: 'auto', + }, + }, + gasReporter: { + enabled: process.env.REPORT_GAS ? true : false, + showTimeSpent: true, + currency: 'USD', + outputFile: 'reports/gas-report.log', + }, + typechain: { + outDir: 'types', + target: 'ethers-v6', + }, + contractSizer: { + alphaSort: true, + runOnCompile: false, + disambiguatePaths: false, + }, + etherscan: { + apiKey: { + arbitrumOne: process.env.ARBISCAN_API_KEY, + arbitrumSepolia: process.env.ARBISCAN_API_KEY, + }, + customChains: [ + { + network: 'arbitrumSepolia', + chainId: 421614, + urls: { + apiURL: 'https://api-sepolia.arbiscan.io/api', + browserURL: 'https://sepolia.arbiscan.io', + }, + }, + ], + }, +} + +module.exports = config diff --git a/packages/issuance/hardhat.coverage.config.ts b/packages/issuance/hardhat.coverage.config.ts new file mode 100644 index 000000000..19d508b48 --- /dev/null +++ b/packages/issuance/hardhat.coverage.config.ts @@ -0,0 +1,82 @@ +import '@nomicfoundation/hardhat-ethers' +import '@nomicfoundation/hardhat-chai-matchers' +import '@nomicfoundation/hardhat-network-helpers' +import '@openzeppelin/hardhat-upgrades' +import 'hardhat-gas-reporter' +import 'solidity-coverage' +import 'dotenv/config' + +import { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { + paths: { + sources: './contracts', + tests: './test/tests', + artifacts: './artifacts', + cache: './cache', + }, + solidity: { + compilers: [ + { + version: '0.8.27', + }, + ], + }, + defaultNetwork: 'hardhat', + networks: { + hardhat: { + chainId: 1337, + loggingEnabled: false, + gas: 12000000, + gasPrice: 'auto', + initialBaseFeePerGas: 0, + blockGasLimit: 12000000, + forking: + process.env.FORK === 'true' + ? { + url: + process.env.FORK_NETWORK === 'arbitrumSepolia' + ? process.env.ARBITRUM_SEPOLIA_RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc' + : process.env.ARBITRUM_ONE_RPC_URL || 'https://arb1.arbitrum.io/rpc', + blockNumber: process.env.FORK_BLOCK_NUMBER ? parseInt(process.env.FORK_BLOCK_NUMBER) : undefined, + } + : undefined, + }, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', + accounts: { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + }, + }, + anvilFork: { + chainId: 31337, + url: process.env.ANVIL_FORK_URL || 'http://127.0.0.1:8545', + accounts: process.env.PRIVATE_KEY + ? [process.env.PRIVATE_KEY] + : { + mnemonic: 'test test test test test test test test test test test junk', + }, + }, + arbitrumSepolia: { + chainId: 421614, + url: process.env.ARBITRUM_SEPOLIA_RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc', + accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], + gasPrice: 'auto', + }, + arbitrumOne: { + chainId: 42161, + url: process.env.ARBITRUM_ONE_RPC_URL || 'https://arb1.arbitrum.io/rpc', + accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], + gasPrice: 'auto', + }, + }, + gasReporter: { + enabled: process.env.REPORT_GAS ? true : false, + showTimeSpent: true, + currency: 'USD', + outputFile: 'reports/gas-report.log', + }, +} + +export default config diff --git a/packages/issuance/index.js b/packages/issuance/index.js new file mode 100644 index 000000000..4b0935649 --- /dev/null +++ b/packages/issuance/index.js @@ -0,0 +1,11 @@ +// Main entry point for @graphprotocol/issuance +// This package provides issuance contracts and artifacts + +const path = require('path') + +module.exports = { + contractsDir: path.join(__dirname, 'contracts'), + artifactsDir: path.join(__dirname, 'artifacts'), + typesDir: path.join(__dirname, 'types'), + cacheDir: path.join(__dirname, 'cache'), +} diff --git a/packages/issuance/package.json b/packages/issuance/package.json new file mode 100644 index 000000000..790234619 --- /dev/null +++ b/packages/issuance/package.json @@ -0,0 +1,70 @@ +{ + "name": "@graphprotocol/issuance", + "version": "1.0.0", + "description": "The Graph Issuance Contracts", + "main": "index.js", + "exports": { + ".": "./index.js", + "./artifacts/*": "./artifacts/*", + "./contracts/*": "./contracts/*", + "./types/*": "./types/*" + }, + "scripts": { + "build": "npm run build:self", + "build:self": "pnpm compile; pnpm typechain", + "clean": "rm -rf build/ cache/ dist/ forge-artifacts/ cache_forge/", + "compile": "hardhat compile", + "test": "pnpm --filter @graphprotocol/issuance-test --filter @graphprotocol/issuance-deploy test", + "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'", + "lint:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", + "lint:json": "prettier -w --cache --log-level warn '**/*.json'", + "typechain": "hardhat typechain", + "verify": "hardhat verify", + "size": "hardhat size-contracts", + "forge:build": "forge build" + }, + "files": [ + "artifacts/**/*", + "types/**/*", + "contracts/**/*", + "README.md", + "LICENSE" + ], + "author": "The Graph Team", + "license": "GPL-2.0-or-later", + "devDependencies": { + "@graphprotocol/common": "workspace:^", + "@nomicfoundation/hardhat-ethers": "catalog:", + "@nomicfoundation/hardhat-verify": "catalog:", + "@openzeppelin/contracts": "^5.3.0", + "@openzeppelin/contracts-upgradeable": "^5.3.0", + "@openzeppelin/hardhat-upgrades": "^3.9.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "catalog:", + "@types/node": "^20.17.50", + "dotenv": "catalog:", + "eslint": "catalog:", + "ethers": "catalog:", + "glob": "^11.0.2", + "globals": "^16.1.0", + "hardhat": "catalog:", + "hardhat-contract-sizer": "catalog:", + "hardhat-secure-accounts": "catalog:", + "hardhat-storage-layout": "catalog:", + "lint-staged": "16.0.0", + "markdownlint-cli": "catalog:", + "prettier": "catalog:", + "prettier-plugin-solidity": "catalog:", + "solhint": "catalog:", + "ts-node": "^10.9.2", + "typechain": "^8.3.0", + "typescript": "catalog:", + "typescript-eslint": "catalog:", + "yaml-lint": "^1.7.0" + }, + "dependencies": { + "@noble/hashes": "^1.8.0" + } +} diff --git a/packages/issuance/prettier.config.cjs b/packages/issuance/prettier.config.cjs new file mode 100644 index 000000000..4e8dcf4f3 --- /dev/null +++ b/packages/issuance/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/issuance/test/hardhat.config.ts b/packages/issuance/test/hardhat.config.ts new file mode 100644 index 000000000..c485d1936 --- /dev/null +++ b/packages/issuance/test/hardhat.config.ts @@ -0,0 +1,82 @@ +import '@nomicfoundation/hardhat-ethers' +import '@nomicfoundation/hardhat-chai-matchers' +import '@nomicfoundation/hardhat-network-helpers' +import '@openzeppelin/hardhat-upgrades' +import 'hardhat-gas-reporter' +import 'solidity-coverage' +import 'dotenv/config' + +import { artifactsDir, cacheDir } from '@graphprotocol/issuance' +import { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { + paths: { + tests: './tests', + artifacts: artifactsDir, + cache: cacheDir, + }, + solidity: { + compilers: [ + { + version: '0.8.27', + }, + ], + }, + defaultNetwork: 'hardhat', + networks: { + hardhat: { + chainId: 1337, + loggingEnabled: false, + gas: 12000000, + gasPrice: 'auto', + initialBaseFeePerGas: 0, + blockGasLimit: 12000000, + forking: + process.env.FORK === 'true' + ? { + url: + process.env.FORK_NETWORK === 'arbitrumSepolia' + ? process.env.ARBITRUM_SEPOLIA_RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc' + : process.env.ARBITRUM_ONE_RPC_URL || 'https://arb1.arbitrum.io/rpc', + blockNumber: process.env.FORK_BLOCK_NUMBER ? parseInt(process.env.FORK_BLOCK_NUMBER) : undefined, + } + : undefined, + }, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', + accounts: { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + }, + }, + anvilFork: { + chainId: 31337, + url: process.env.ANVIL_FORK_URL || 'http://127.0.0.1:8545', + accounts: process.env.PRIVATE_KEY + ? [process.env.PRIVATE_KEY] + : { + mnemonic: 'test test test test test test test test test test test junk', + }, + }, + arbitrumSepolia: { + chainId: 421614, + url: process.env.ARBITRUM_SEPOLIA_RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc', + accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], + gasPrice: 'auto', + }, + arbitrumOne: { + chainId: 42161, + url: process.env.ARBITRUM_ONE_RPC_URL || 'https://arb1.arbitrum.io/rpc', + accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [], + gasPrice: 'auto', + }, + }, + gasReporter: { + enabled: process.env.REPORT_GAS ? true : false, + showTimeSpent: true, + currency: 'USD', + outputFile: 'reports/gas-report.log', + }, +} + +export default config diff --git a/packages/issuance/test/package.json b/packages/issuance/test/package.json new file mode 100644 index 000000000..51cb1a397 --- /dev/null +++ b/packages/issuance/test/package.json @@ -0,0 +1,58 @@ +{ + "name": "@graphprotocol/issuance-test", + "version": "1.0.0", + "private": true, + "description": "Test utilities for @graphprotocol/issuance", + "main": "src/index.ts", + "types": "src/index.ts", + "exports": { + ".": { + "default": "./src/index.ts", + "types": "./src/index.ts" + } + }, + "dependencies": { + "@graphprotocol/issuance": "workspace:^", + "@graphprotocol/common": "workspace:^", + "@graphprotocol/contracts": "workspace:^", + "@graphprotocol/sdk": "workspace:^" + }, + "devDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-foundry": "^1.1.1", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-toolbox": "5.0.0", + "@openzeppelin/contracts": "^5.3.0", + "@openzeppelin/contracts-upgradeable": "^5.3.0", + "@openzeppelin/foundry-upgrades": "0.4.0", + "@types/chai": "^4.3.20", + "@types/mocha": "^10.0.10", + "@types/node": "^20.17.50", + "chai": "^4.3.7", + "dotenv": "^16.5.0", + "eslint": "catalog:", + "eslint-plugin-no-only-tests": "catalog:", + "ethers": "^6.13.4", + "forge-std": "https://github.com/foundry-rs/forge-std/tarball/v1.9.7", + "glob": "^11.0.2", + "hardhat": "catalog:", + "hardhat-gas-reporter": "catalog:", + "prettier": "catalog:", + "solidity-coverage": "^0.8.0", + "ts-node": "^10.9.2", + "typescript": "catalog:" + }, + "scripts": { + "build": "tsc --build && pnpm --filter @graphprotocol/issuance compile && pnpm generate:interfaces", + "generate:interfaces": "node scripts/generateInterfaceIds.js --silent", + "clean": "rm -rf build", + "test": "pnpm test:self", + "test:self": "pnpm test:hardhat", + "test:hardhat": "pnpm --filter @graphprotocol/contracts --filter @graphprotocol/issuance --filter @graphprotocol/sdk build && hardhat test tests/*.test.ts tests/**/*.test.ts", + "test:coverage": "scripts/coverage", + "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}'", + "lint:json": "prettier -w --cache --log-level warn '**/*.json'" + } +} diff --git a/packages/issuance/test/prettier.config.cjs b/packages/issuance/test/prettier.config.cjs new file mode 100644 index 000000000..8eb0a0bee --- /dev/null +++ b/packages/issuance/test/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/issuance/test/scripts/coverage b/packages/issuance/test/scripts/coverage new file mode 100755 index 000000000..25d5277fe --- /dev/null +++ b/packages/issuance/test/scripts/coverage @@ -0,0 +1,10 @@ +#!/bin/bash + +set -eo pipefail + +# Build dependencies first +pnpm pnpm --filter @graphprotocol/contracts --filter @graphprotocol/issuance --filter @graphprotocol/sdk build + +# Run coverage from the parent issuance directory where contracts are local +cd .. +npx hardhat coverage --config hardhat.coverage.config.ts --testfiles "test/tests/**/*.test.ts" diff --git a/packages/issuance/test/scripts/generateInterfaceIds.js b/packages/issuance/test/scripts/generateInterfaceIds.js new file mode 100644 index 000000000..42b4af3ec --- /dev/null +++ b/packages/issuance/test/scripts/generateInterfaceIds.js @@ -0,0 +1,144 @@ +#!/usr/bin/env node + +/** + * Generate interface ID constants by deploying and calling InterfaceIdExtractor contract + */ + +const fs = require('fs') +const path = require('path') +const { spawn } = require('child_process') + +const OUTPUT_FILE = path.join(__dirname, '../tests/helpers/interfaceIds.js') +const SILENT = process.argv.includes('--silent') + +function log(...args) { + if (!SILENT) { + console.log(...args) + } +} + +async function runHardhatTask() { + return new Promise((resolve, reject) => { + const hardhatScript = ` +const hre = require('hardhat') + +async function main() { + const InterfaceIdExtractor = await hre.ethers.getContractFactory('InterfaceIdExtractor') + const extractor = await InterfaceIdExtractor.deploy() + await extractor.waitForDeployment() + + const results = { + IServiceQualityOracle: await extractor.getIServiceQualityOracleId(), + } + + console.log(JSON.stringify(results)) +} + +main().catch((error) => { + console.error(error) + process.exit(1) +}) +` + + // Write temporary script + const tempScript = path.join(__dirname, 'temp-extract.js') + fs.writeFileSync(tempScript, hardhatScript) + + // Run the script with hardhat + const child = spawn('npx', ['hardhat', 'run', tempScript, '--network', 'hardhat'], { + cwd: path.join(__dirname, '../..'), + stdio: 'pipe', + }) + + let output = '' + let errorOutput = '' + + child.stdout.on('data', (data) => { + output += data.toString() + }) + + child.stderr.on('data', (data) => { + errorOutput += data.toString() + }) + + child.on('close', (code) => { + // Clean up temp script + try { + fs.unlinkSync(tempScript) + } catch { + // Ignore cleanup errors + } + + if (code === 0) { + // Extract JSON from output + const lines = output.split('\n') + for (const line of lines) { + try { + const result = JSON.parse(line.trim()) + if (result && typeof result === 'object') { + resolve(result) + return + } + } catch { + // Not JSON, continue + } + } + reject(new Error('Could not parse interface IDs from output')) + } else { + reject(new Error(`Hardhat script failed with code ${code}: ${errorOutput}`)) + } + }) + }) +} + +async function extractInterfaceIds() { + const extractorPath = path.join( + __dirname, + '../../artifacts/contracts/test/InterfaceIdExtractor.sol/InterfaceIdExtractor.json', + ) + + if (!fs.existsSync(extractorPath)) { + console.error('❌ InterfaceIdExtractor artifact not found') + console.error('Run: pnpm compile to build the extractor contract') + throw new Error('InterfaceIdExtractor not compiled') + } + + log('Deploying InterfaceIdExtractor contract to extract interface IDs...') + + try { + const results = await runHardhatTask() + + // Convert from ethers BigNumber format to hex strings + const processed = {} + for (const [name, value] of Object.entries(results)) { + processed[name] = typeof value === 'string' ? value : `0x${value.toString(16).padStart(8, '0')}` + log(`✅ Extracted ${name}: ${processed[name]}`) + } + + return processed + } catch (error) { + console.error('Error extracting interface IDs:', error.message) + throw error + } +} + +async function main() { + log('Extracting interface IDs from Solidity compilation...') + + const results = await extractInterfaceIds() + + const content = `// Auto-generated interface IDs from Solidity compilation +module.exports = { +${Object.entries(results) + .map(([name, id]) => ` ${name}: '${id}',`) + .join('\n')} +} +` + + fs.writeFileSync(OUTPUT_FILE, content) + log(`✅ Generated ${OUTPUT_FILE}`) +} + +if (require.main === module) { + main().catch(console.error) +} diff --git a/packages/issuance/test/src/index.ts b/packages/issuance/test/src/index.ts new file mode 100644 index 000000000..614cfd50d --- /dev/null +++ b/packages/issuance/test/src/index.ts @@ -0,0 +1,5 @@ +// Test utilities for @graphprotocol/issuance +// This package contains test files, test helpers, and testing utilities + +// This package provides test utilities for issuance contracts +export const PACKAGE_NAME = '@graphprotocol/issuance-test' diff --git a/packages/issuance/test/tests/ServiceQualityOracle.test.ts b/packages/issuance/test/tests/ServiceQualityOracle.test.ts new file mode 100644 index 000000000..6f2ae37c7 --- /dev/null +++ b/packages/issuance/test/tests/ServiceQualityOracle.test.ts @@ -0,0 +1,642 @@ +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') +const { ethers, upgrades } = require('hardhat') + +const { getTestAccounts, deployTestGraphToken, deployServiceQualityOracle } = require('./helpers/fixtures') +const { SHARED_CONSTANTS } = require('./helpers/sharedFixtures') + +// Role constants +const GOVERNOR_ROLE = SHARED_CONSTANTS.GOVERNOR_ROLE +const ORACLE_ROLE = SHARED_CONSTANTS.ORACLE_ROLE +const OPERATOR_ROLE = SHARED_CONSTANTS.OPERATOR_ROLE + +describe('ServiceQualityOracle', () => { + // Common variables + let accounts + let sharedContracts + + before(async () => { + accounts = await getTestAccounts() + + // Deploy shared contracts once + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + const serviceQualityOracleAddress = await serviceQualityOracle.getAddress() + + sharedContracts = { + graphToken, + serviceQualityOracle, + addresses: { + graphToken: graphTokenAddress, + serviceQualityOracle: serviceQualityOracleAddress, + }, + } + }) + + // Fast state reset function + async function resetOracleState() { + if (!sharedContracts) return + + const { serviceQualityOracle } = sharedContracts + + // Remove oracle roles from all accounts + try { + for (const account of [accounts.operator, accounts.user, accounts.nonGovernor]) { + if (await serviceQualityOracle.hasRole(ORACLE_ROLE, account.address)) { + await serviceQualityOracle.connect(accounts.governor).revokeRole(ORACLE_ROLE, account.address) + } + if (await serviceQualityOracle.hasRole(OPERATOR_ROLE, account.address)) { + await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, account.address) + } + } + + // Remove operator role from governor if present + if (await serviceQualityOracle.hasRole(OPERATOR_ROLE, accounts.governor.address)) { + await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + } catch { + // Ignore role management errors during reset + } + + // Reset to default values + try { + // Reset allowed period to default (14 days) + const defaultAllowedPeriod = 14 * 24 * 60 * 60 + const currentAllowedPeriod = await serviceQualityOracle.getAllowedPeriod() + if (currentAllowedPeriod !== BigInt(defaultAllowedPeriod)) { + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) + await serviceQualityOracle.connect(accounts.governor).setAllowedPeriod(defaultAllowedPeriod) + await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + + // Reset quality checking to inactive + if (await serviceQualityOracle.isQualityCheckingActive()) { + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) + await serviceQualityOracle.connect(accounts.governor).setQualityChecking(false) + await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + + // Reset oracle update timeout to default (7 days) + const defaultTimeout = 7 * 24 * 60 * 60 + const currentTimeout = await serviceQualityOracle.getOracleUpdateTimeout() + if (currentTimeout !== BigInt(defaultTimeout)) { + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) + await serviceQualityOracle.connect(accounts.governor).setOracleUpdateTimeout(defaultTimeout) + await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + } catch { + // Ignore reset errors + } + } + + beforeEach(async () => { + if (!accounts) { + accounts = await getTestAccounts() + } + await resetOracleState() + }) + + // // Test fixtures (kept for complex tests that need fresh deployments) + // async function setupServiceQualityOracle() { + // // Deploy test GraphToken + // const graphToken = await deployTestGraphToken() + // const graphTokenAddress = await graphToken.getAddress() + + // // Deploy ServiceQualityOracle with proxy + // const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + // return { serviceQualityOracle, graphToken } + // } + + describe('Construction', () => { + it('should revert when constructed with zero GraphToken address', async () => { + const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') + await expect(ServiceQualityOracleFactory.deploy(ethers.ZeroAddress)).to.be.revertedWithCustomError( + ServiceQualityOracleFactory, + 'GraphTokenCannotBeZeroAddress', + ) + }) + + it('should revert when initialized with zero governor address', async () => { + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + + // Try to deploy proxy with zero governor address - this should hit the BaseUpgradeable check + const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') + await expect( + upgrades.deployProxy(ServiceQualityOracleFactory, [ethers.ZeroAddress], { + constructorArgs: [graphTokenAddress], + initializer: 'initialize', + }), + ).to.be.revertedWithCustomError(ServiceQualityOracleFactory, 'GovernorCannotBeZeroAddress') + }) + }) + + describe('Initialization', () => { + it('should set the governor role correctly', async () => { + const { serviceQualityOracle } = sharedContracts + expect(await serviceQualityOracle.hasRole(GOVERNOR_ROLE, accounts.governor.address)).to.be.true + }) + + it('should not set oracle role to anyone initially', async () => { + const { serviceQualityOracle } = sharedContracts + expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.operator.address)).to.be.false + }) + + it('should set default allowed period to 14 days', async () => { + const { serviceQualityOracle } = sharedContracts + expect(await serviceQualityOracle.getAllowedPeriod()).to.equal(14 * 24 * 60 * 60) // 14 days in seconds + }) + + it('should set quality checking to inactive by default', async () => { + const { serviceQualityOracle } = sharedContracts + expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false + }) + + it('should set default oracle update timeout to 7 days', async () => { + const { serviceQualityOracle } = sharedContracts + expect(await serviceQualityOracle.getOracleUpdateTimeout()).to.equal(7 * 24 * 60 * 60) // 7 days in seconds + }) + + it('should initialize lastOracleUpdateTime to 0', async () => { + const { serviceQualityOracle } = sharedContracts + expect(await serviceQualityOracle.getLastOracleUpdateTime()).to.equal(0) + }) + + it('should revert when initialize is called more than once', async () => { + const { serviceQualityOracle } = sharedContracts + + // Try to call initialize again + await expect(serviceQualityOracle.initialize(accounts.governor.address)).to.be.revertedWithCustomError( + serviceQualityOracle, + 'InvalidInitialization', + ) + }) + }) + + describe('Oracle Management', () => { + it('should allow operator to grant oracle role', async () => { + const { serviceQualityOracle } = sharedContracts + + // Grant operator role to the operator account + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Operator grants oracle role + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) + expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.true + }) + + it('should allow operator to revoke oracle role', async () => { + const { serviceQualityOracle } = sharedContracts + + // Grant operator role to the operator account + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Grant oracle role first + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) + expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.true + + // Revoke role + await serviceQualityOracle.connect(accounts.operator).revokeRole(ORACLE_ROLE, accounts.user.address) + expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.false + }) + + // Access control tests moved to consolidated/AccessControl.test.ts + }) + + describe('Operator Functions', () => { + beforeEach(async () => { + const { serviceQualityOracle } = sharedContracts + + // Grant operator role to the operator account + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + }) + + it('should allow operator to set allowed period', async () => { + const { serviceQualityOracle } = sharedContracts + const newAllowedPeriod = 14 * 24 * 60 * 60 // 14 days + + // Set allowed period + await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(newAllowedPeriod) + + // Check if allowed period was updated + expect(await serviceQualityOracle.getAllowedPeriod()).to.equal(newAllowedPeriod) + }) + + it('should handle idempotent operations correctly', async () => { + const { serviceQualityOracle } = sharedContracts + + // Test setting same allowed period + const currentAllowedPeriod = await serviceQualityOracle.getAllowedPeriod() + let result = await serviceQualityOracle + .connect(accounts.operator) + .setAllowedPeriod.staticCall(currentAllowedPeriod) + expect(result).to.be.true + + // Verify no event emitted for same value + let tx = await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(currentAllowedPeriod) + let receipt = await tx.wait() + expect(receipt.logs.length).to.equal(0) + + // Test setting new oracle update timeout + const newTimeout = 60 * 24 * 60 * 60 // 60 days + await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(newTimeout) + expect(await serviceQualityOracle.getOracleUpdateTimeout()).to.equal(newTimeout) + + // Test setting same oracle update timeout + result = await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout.staticCall(newTimeout) + expect(result).to.be.true + + // Verify no event emitted for same value + tx = await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(newTimeout) + receipt = await tx.wait() + expect(receipt.logs.length).to.equal(0) + }) + + it('should allow operator to disable quality checking', async () => { + const { serviceQualityOracle } = sharedContracts + // Disable quality checking + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) + + // Check if quality checking is disabled + expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false + }) + + it('should allow operator to enable quality checking', async () => { + const { serviceQualityOracle } = sharedContracts + // Disable quality checking first + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) + expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false + + // Enable quality checking + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) + + // Check if quality checking is enabled + expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.true + }) + + it('should handle setQualityChecking return values and events correctly', async () => { + const { serviceQualityOracle } = sharedContracts + + // Test 1: Return true when enabling quality checking that is already enabled + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) + expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.true + + const enableResult = await serviceQualityOracle.connect(accounts.operator).setQualityChecking.staticCall(true) + expect(enableResult).to.be.true + + // Test 2: No event emitted when setting to same state (enabled) + const enableTx = await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) + const enableReceipt = await enableTx.wait() + expect(enableReceipt.logs.length).to.equal(0) + + // Test 3: Return true when disabling quality checking that is already disabled + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) + expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false + + const disableResult = await serviceQualityOracle.connect(accounts.operator).setQualityChecking.staticCall(false) + expect(disableResult).to.be.true + + // Test 4: No event emitted when setting to same state (disabled) + const disableTx = await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) + const disableReceipt = await disableTx.wait() + expect(disableReceipt.logs.length).to.equal(0) + + // Test 5: Events are emitted when state actually changes + await expect(serviceQualityOracle.connect(accounts.operator).setQualityChecking(true)) + .to.emit(serviceQualityOracle, 'QualityCheckingUpdated') + .withArgs(true) + + await expect(serviceQualityOracle.connect(accounts.operator).setQualityChecking(false)) + .to.emit(serviceQualityOracle, 'QualityCheckingUpdated') + .withArgs(false) + }) + + // Access control tests moved to consolidated/AccessControl.test.ts + // Event and return value tests consolidated into 'should handle setQualityChecking return values and events correctly' + }) + + describe('Indexer Management', () => { + beforeEach(async () => { + const { serviceQualityOracle } = sharedContracts + + // Grant operator role to the operator account + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Grant oracle role + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + }) + + it('should allow oracle to allow a single indexer', async () => { + const { serviceQualityOracle } = sharedContracts + // Allow indexer using allowIndexers with a single-element array + await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + + // Check if indexer is allowed + expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + + // Check if allowed timestamp was updated + const allowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) + expect(allowedTime).to.be.gt(0) + }) + + it('should allow oracle to allow multiple indexers', async () => { + const { serviceQualityOracle } = sharedContracts + // Allow multiple indexers + const indexers = [accounts.indexer1.address, accounts.indexer2.address] + await serviceQualityOracle.connect(accounts.operator).allowIndexers(indexers, '0x') + + // Check if indexers are allowed + expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + expect(await serviceQualityOracle.isAllowed(accounts.indexer2.address)).to.be.true + + // Check if allowed timestamps were updated + const allowedTime1 = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) + const allowedTime2 = await serviceQualityOracle.getLastAllowedTime(accounts.indexer2.address) + expect(allowedTime1).to.be.gt(0) + expect(allowedTime2).to.be.gt(0) + }) + + it('should not update timestamp for indexer already allowed in the same block', async () => { + const { serviceQualityOracle } = sharedContracts + // Allow indexer first time + await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + + // Get the timestamp + const initialAllowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) + + // Call allowIndexers again with the same indexer + const result = await serviceQualityOracle + .connect(accounts.operator) + .allowIndexers.staticCall([accounts.indexer1.address], '0x') + + // The function should return 0 since the indexer was already allowed in this block + expect(result).to.equal(0) + + // Verify the timestamp hasn't changed + const finalAllowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) + expect(finalAllowedTime).to.equal(initialAllowedTime) + + // Mine a new block + await ethers.provider.send('evm_mine', []) + + // Now try again in a new block - it should return 1 + const newBlockResult = await serviceQualityOracle + .connect(accounts.operator) + .allowIndexers.staticCall([accounts.indexer1.address], '0x') + + // The function should return 1 since we're in a new block + expect(newBlockResult).to.equal(1) + }) + + it('should revert when non-oracle tries to allow a single indexer', async () => { + const { serviceQualityOracle } = sharedContracts + await expect( + serviceQualityOracle.connect(accounts.nonGovernor).allowIndexers([accounts.indexer1.address], '0x'), + ).to.be.revertedWithCustomError(serviceQualityOracle, 'AccessControlUnauthorizedAccount') + }) + + it('should revert when non-oracle tries to allow multiple indexers', async () => { + const { serviceQualityOracle } = sharedContracts + const indexers = [accounts.indexer1.address, accounts.indexer2.address] + await expect( + serviceQualityOracle.connect(accounts.nonGovernor).allowIndexers(indexers, '0x'), + ).to.be.revertedWithCustomError(serviceQualityOracle, 'AccessControlUnauthorizedAccount') + }) + + it('should return correct count for various allowIndexers scenarios', async () => { + const { serviceQualityOracle } = sharedContracts + + // Test 1: Single indexer should return 1 + const singleResult = await serviceQualityOracle + .connect(accounts.operator) + .allowIndexers.staticCall([accounts.indexer1.address], '0x') + expect(singleResult).to.equal(1) + + // Test 2: Multiple indexers should return correct count + const multipleIndexers = [accounts.indexer1.address, accounts.indexer2.address] + const multipleResult = await serviceQualityOracle + .connect(accounts.operator) + .allowIndexers.staticCall(multipleIndexers, '0x') + expect(multipleResult).to.equal(2) + + // Test 3: Empty array should return 0 + const emptyResult = await serviceQualityOracle.connect(accounts.operator).allowIndexers.staticCall([], '0x') + expect(emptyResult).to.equal(0) + + // Test 4: Array with zero addresses should only count non-zero addresses + const withZeroAddresses = [accounts.indexer1.address, ethers.ZeroAddress, accounts.indexer2.address] + const zeroResult = await serviceQualityOracle + .connect(accounts.operator) + .allowIndexers.staticCall(withZeroAddresses, '0x') + expect(zeroResult).to.equal(2) + + // Test 5: Array with duplicates should only count unique indexers + const withDuplicates = [accounts.indexer1.address, accounts.indexer1.address, accounts.indexer2.address] + const duplicateResult = await serviceQualityOracle + .connect(accounts.operator) + .allowIndexers.staticCall(withDuplicates, '0x') + expect(duplicateResult).to.equal(2) + }) + }) + + describe('View Functions', () => { + // Use shared contracts instead of deploying fresh ones for each test + + it('should return 0 when getting last allowed time for non-allowed indexer', async () => { + // Use a fresh deployment to avoid contamination from previous tests + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + // This should return 0 for a fresh contract + const lastAllowedTime = await freshServiceQualityOracle.getLastAllowedTime(accounts.indexer1.address) + expect(lastAllowedTime).to.equal(0) + }) + + it('should return correct timestamp for allowed indexer', async function () { + const { serviceQualityOracle } = sharedContracts + + // Grant operator role first (governor can grant operator role) + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + // Then operator can grant oracle role (operator is admin of oracle role) + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Allow indexer + await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + + // Get the last allowed time + const lastAllowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) + + // Get the current block timestamp + const block = await ethers.provider.getBlock('latest') + const blockTimestamp = block ? block.timestamp : 0 + + // The last allowed time should be close to the current block timestamp + expect(lastAllowedTime).to.be.closeTo(blockTimestamp, 5) // Allow 5 seconds of difference + }) + + it('should correctly report if an indexer is allowed', async function () { + // Use a fresh deployment to avoid shared state contamination + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + // Grant necessary roles (follow role hierarchy) + await freshServiceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await freshServiceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable quality checking first (since it's disabled by default) + await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(true) + + // First, set a non-zero lastOracleUpdateTime to prevent the timeout condition from triggering + await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.nonGovernor.address], '0x') + + // Now check if our test indexer is allowed (it shouldn't be) + expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false + + // Allow indexer + await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + }) + + it('should correctly report if an oracle is authorized', async function () { + const { serviceQualityOracle } = sharedContracts + + // Grant operator role to perform role management + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Initially, user should not be an oracle + expect(await serviceQualityOracle.isAuthorizedOracle(accounts.user.address)).to.be.false + + // Grant oracle role + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) + expect(await serviceQualityOracle.isAuthorizedOracle(accounts.user.address)).to.be.true + + // Revoke oracle role + await serviceQualityOracle.connect(accounts.operator).revokeRole(ORACLE_ROLE, accounts.user.address) + expect(await serviceQualityOracle.isAuthorizedOracle(accounts.user.address)).to.be.false + }) + + it('should return true for all indexers when quality checking is disabled', async function () { + // Use a fresh deployment to avoid shared state contamination + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + // Grant necessary roles (follow role hierarchy) + await freshServiceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await freshServiceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable quality checking first (since it's disabled by default) + await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(true) + + // First, set a non-zero lastOracleUpdateTime to prevent the timeout condition from triggering + await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.nonGovernor.address], '0x') + + // Set a very long oracle update timeout to prevent that condition from triggering + await freshServiceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Now check if our test indexer is allowed (it shouldn't be) + expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false + + // Disable quality checking + await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(false) + + // Now indexer should be allowed even without being explicitly allowed + expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + }) + + it('should return true for all indexers when oracle update timeout is exceeded', async function () { + // Use a fresh deployment to avoid shared state contamination + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + // Grant necessary roles (follow role hierarchy) + await freshServiceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await freshServiceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable quality checking first (since it's disabled by default) + await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(true) + + // First, set a non-zero lastOracleUpdateTime to prevent the initial timeout condition from triggering + await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.nonGovernor.address], '0x') + + // Set a very long oracle update timeout initially + await freshServiceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Now check if our test indexer is allowed (it shouldn't be) + expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false + + // Set a short oracle update timeout + await freshServiceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(60) // 1 minute + + // Advance time beyond the timeout + await time.increase(120) // 2 minutes + + // Now indexer should be allowed even without being explicitly allowed + expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + }) + + it('should return false for indexer after allowed period expires', async function () { + const { serviceQualityOracle } = sharedContracts + + // Grant necessary roles (follow role hierarchy) + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable quality checking first (since it's disabled by default) + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) + + // Set a very long oracle update timeout to prevent that condition from triggering + await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Allow indexer + await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + + // Set a short allowed period + await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(60) // 1 minute + + // Advance time beyond allowed period + await time.increase(120) // 2 minutes + + // Now indexer should not be allowed + expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false + }) + + it('should return true for indexer after re-allowing', async function () { + const { serviceQualityOracle } = sharedContracts + + // Grant necessary roles + await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable quality checking first (since it's disabled by default) + await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) + + // Set a very long oracle update timeout to prevent that condition from triggering + await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Allow indexer + await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + + // Set a short allowed period + await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(60) // 1 minute + + // Advance time beyond allowed period + await time.increase(120) // 2 minutes + + // Indexer should not be allowed + expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false + + // Re-allow indexer + await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') + + // Now indexer should be allowed again + expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true + }) + }) +}) diff --git a/packages/issuance/test/tests/consolidated/AccessControl.test.ts b/packages/issuance/test/tests/consolidated/AccessControl.test.ts new file mode 100644 index 000000000..5e472e809 --- /dev/null +++ b/packages/issuance/test/tests/consolidated/AccessControl.test.ts @@ -0,0 +1,151 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * Consolidated Access Control Tests + * Tests access control patterns across all contracts to reduce duplication + */ + +const { expect } = require('chai') +const { deploySharedContracts, resetContractState, SHARED_CONSTANTS } = require('../helpers/sharedFixtures') + +describe('Consolidated Access Control Tests', () => { + let accounts: any + let contracts: any + + before(async () => { + const sharedSetup = await deploySharedContracts() + accounts = sharedSetup.accounts + contracts = sharedSetup.contracts + }) + + beforeEach(async () => { + await resetContractState(contracts, accounts) + }) + + describe('ServiceQualityOracle Access Control', () => { + describe('Role Management Methods', () => { + it('should enforce access control on role management methods', async () => { + // First grant governor the OPERATOR_ROLE so they can manage oracle roles + await contracts.serviceQualityOracle + .connect(accounts.governor) + .grantRole(SHARED_CONSTANTS.OPERATOR_ROLE, accounts.governor.address) + + const methods = [ + { + method: 'grantRole', + args: [SHARED_CONSTANTS.ORACLE_ROLE, accounts.operator.address], + description: 'grantRole for ORACLE_ROLE', + }, + { + method: 'revokeRole', + args: [SHARED_CONSTANTS.ORACLE_ROLE, accounts.operator.address], + description: 'revokeRole for ORACLE_ROLE', + }, + ] + + for (const { method, args, description } of methods) { + // Test unauthorized access + await expect( + contracts.serviceQualityOracle.connect(accounts.nonGovernor)[method](...args), + `${description} should revert for unauthorized account`, + ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') + + // Test authorized access + await expect( + contracts.serviceQualityOracle.connect(accounts.governor)[method](...args), + `${description} should succeed for authorized account`, + ).to.not.be.reverted + } + }) + }) + + it('should require ORACLE_ROLE for allowIndexers', async () => { + // Setup: Grant governor OPERATOR_ROLE first, then grant oracle role + await contracts.serviceQualityOracle + .connect(accounts.governor) + .grantRole(SHARED_CONSTANTS.OPERATOR_ROLE, accounts.governor.address) + await contracts.serviceQualityOracle + .connect(accounts.governor) + .grantRole(SHARED_CONSTANTS.ORACLE_ROLE, accounts.operator.address) + + // Non-oracle should be rejected + await expect( + contracts.serviceQualityOracle + .connect(accounts.nonGovernor) + .allowIndexers([accounts.nonGovernor.address], '0x'), + ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') + + // Oracle should be allowed + const hasRole = await contracts.serviceQualityOracle.hasRole( + SHARED_CONSTANTS.ORACLE_ROLE, + accounts.operator.address, + ) + expect(hasRole).to.be.true + }) + + it('should require OPERATOR_ROLE for pause operations', async () => { + // Setup: Grant pause role to governor + await contracts.serviceQualityOracle + .connect(accounts.governor) + .grantRole(SHARED_CONSTANTS.PAUSE_ROLE, accounts.governor.address) + + // Non-pause-role account should be rejected + await expect(contracts.serviceQualityOracle.connect(accounts.nonGovernor).pause()).to.be.revertedWithCustomError( + contracts.serviceQualityOracle, + 'AccessControlUnauthorizedAccount', + ) + await expect( + contracts.serviceQualityOracle.connect(accounts.nonGovernor).unpause(), + ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') + + // Pause role account should be allowed + await expect(contracts.serviceQualityOracle.connect(accounts.governor).pause()).to.not.be.reverted + }) + + it('should require OPERATOR_ROLE for configuration methods', async () => { + // Test all operator-only configuration methods + const operatorOnlyMethods = [ + { + call: () => contracts.serviceQualityOracle.connect(accounts.nonGovernor).setAllowedPeriod(14 * 24 * 60 * 60), + name: 'setAllowedPeriod', + }, + { + call: () => + contracts.serviceQualityOracle.connect(accounts.nonGovernor).setOracleUpdateTimeout(60 * 24 * 60 * 60), + name: 'setOracleUpdateTimeout', + }, + { + call: () => contracts.serviceQualityOracle.connect(accounts.nonGovernor).setQualityChecking(false), + name: 'setQualityChecking(false)', + }, + { + call: () => contracts.serviceQualityOracle.connect(accounts.nonGovernor).setQualityChecking(true), + name: 'setQualityChecking(true)', + }, + ] + + // Test all methods in sequence + for (const method of operatorOnlyMethods) { + await expect(method.call()).to.be.revertedWithCustomError( + contracts.serviceQualityOracle, + 'AccessControlUnauthorizedAccount', + ) + } + }) + }) + + describe('Role Management Consistency', () => { + it('should have consistent GOVERNOR_ROLE across all contracts', async () => { + const governorRole = SHARED_CONSTANTS.GOVERNOR_ROLE + + // All contracts should recognize the governor + expect(await contracts.serviceQualityOracle.hasRole(governorRole, accounts.governor.address)).to.be.true + }) + + it('should have correct role admin hierarchy', async () => { + const governorRole = SHARED_CONSTANTS.GOVERNOR_ROLE + + // GOVERNOR_ROLE should be admin of itself (allowing governors to manage other governors) + expect(await contracts.serviceQualityOracle.getRoleAdmin(governorRole)).to.equal(governorRole) + }) + }) +}) diff --git a/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts b/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts new file mode 100644 index 000000000..e64303dbd --- /dev/null +++ b/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts @@ -0,0 +1,54 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { expect } from 'chai' +import { ethers } from 'hardhat' + +import { shouldSupportERC165Interface } from '../../utils/testPatterns' +import { deployServiceQualityOracle, deployTestGraphToken, getTestAccounts } from '../helpers/fixtures' + +// Import generated interface IDs +const interfaceIds = require('../helpers/interfaceIds') + +/** + * Consolidated ERC-165 Interface Compliance Tests + * Tests interface support across all contracts to reduce duplication + */ +describe('ERC-165 Interface Compliance', () => { + let accounts: any + let contracts: any + + before(async () => { + accounts = await getTestAccounts() + + // Deploy all contracts for interface testing + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + + const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + contracts = { + serviceQualityOracle, + } + }) + + describe( + 'ServiceQualityOracle Interface Compliance', + shouldSupportERC165Interface( + () => contracts.serviceQualityOracle, + interfaceIds.IServiceQualityOracle, + 'IServiceQualityOracle', + ), + ) + + describe('Interface ID Consistency', () => { + it('should have consistent interface IDs with Solidity calculations', async () => { + const InterfaceIdExtractorFactory = await ethers.getContractFactory('InterfaceIdExtractor') + const extractor = await InterfaceIdExtractorFactory.deploy() + + expect(await extractor.getIServiceQualityOracleId()).to.equal(interfaceIds.IServiceQualityOracle) + }) + + it('should have valid interface IDs (not zero)', () => { + expect(interfaceIds.IServiceQualityOracle).to.not.equal('0x00000000') + }) + }) +}) diff --git a/packages/issuance/test/tests/helpers/fixtures.ts b/packages/issuance/test/tests/helpers/fixtures.ts new file mode 100644 index 000000000..c235efcdc --- /dev/null +++ b/packages/issuance/test/tests/helpers/fixtures.ts @@ -0,0 +1,102 @@ +const fs = require('fs') + +const { ethers, upgrades } = require('hardhat') + +/** + * Standard test accounts + */ +// TestAccounts interface converted to JSDoc for CommonJS +/** + * @typedef {Object} TestAccounts + * @property {SignerWithAddress} governor + * @property {SignerWithAddress} nonGovernor + * @property {SignerWithAddress} operator + * @property {SignerWithAddress} user + * @property {SignerWithAddress} indexer1 + * @property {SignerWithAddress} indexer2 + */ + +/** + * Get standard test accounts + * @returns {Promise} + */ +async function getTestAccounts() { + const [governor, nonGovernor, operator, user, indexer1, indexer2] = await ethers.getSigners() + + return { + governor, + nonGovernor, + operator, + user, + indexer1, + indexer2, + } +} + +/** + * Deploy a test GraphToken for testing + * This uses the real GraphToken contract + * @returns {Promise} + */ +async function deployTestGraphToken() { + // Get the governor account + const [governor] = await ethers.getSigners() + + // Load the GraphToken artifact directly from the contracts package + const graphTokenArtifactPath = require.resolve( + '@graphprotocol/contracts/artifacts/contracts/token/GraphToken.sol/GraphToken.json', + ) + const GraphTokenArtifact = JSON.parse(fs.readFileSync(graphTokenArtifactPath, 'utf8')) + + // Create a contract factory using the artifact + const GraphTokenFactory = new ethers.ContractFactory(GraphTokenArtifact.abi, GraphTokenArtifact.bytecode, governor) + + // Deploy the contract + const graphToken = await GraphTokenFactory.deploy(ethers.parseEther('1000000000')) + await graphToken.waitForDeployment() + + return graphToken +} + +/** + * Deploy the ServiceQualityOracle contract with proxy using OpenZeppelin's upgrades library + * @param {string} graphToken + * @param {HardhatEthersSigner} governor + * @param {number} [validityPeriod=7 * 24 * 60 * 60] The validity period in seconds (default: 7 days) + * @returns {Promise} + */ +async function deployServiceQualityOracle( + graphToken, + governor, + validityPeriod = 7 * 24 * 60 * 60, // 7 days in seconds +) { + // Deploy implementation and proxy using OpenZeppelin's upgrades library + const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') + + // Deploy proxy with implementation + const serviceQualityOracleContract = await upgrades.deployProxy(ServiceQualityOracleFactory, [governor.address], { + constructorArgs: [graphToken], + initializer: 'initialize', + }) + + // Get the contract instance + const serviceQualityOracle = serviceQualityOracleContract + + // Set the validity period if it's different from the default + if (validityPeriod !== 7 * 24 * 60 * 60) { + // First grant operator role to governor so they can set the validity period + await serviceQualityOracle.connect(governor).grantOperatorRole(governor.address) + await serviceQualityOracle.connect(governor).setValidityPeriod(validityPeriod) + // Now revoke the operator role from governor to ensure tests start with clean state + await serviceQualityOracle.connect(governor).revokeOperatorRole(governor.address) + } + + return serviceQualityOracle +} + +// Export all functions and constants +module.exports = { + getTestAccounts, + deployTestGraphToken, + deployServiceQualityOracle, +} diff --git a/packages/issuance/test/tests/helpers/interfaceIds.js b/packages/issuance/test/tests/helpers/interfaceIds.js new file mode 100644 index 000000000..add1c098b --- /dev/null +++ b/packages/issuance/test/tests/helpers/interfaceIds.js @@ -0,0 +1,4 @@ +// Auto-generated interface IDs from Solidity compilation +module.exports = { + IServiceQualityOracle: '0xbabcc539', +} diff --git a/packages/issuance/test/tests/helpers/sharedFixtures.js b/packages/issuance/test/tests/helpers/sharedFixtures.js new file mode 100644 index 000000000..4bd31ccd5 --- /dev/null +++ b/packages/issuance/test/tests/helpers/sharedFixtures.js @@ -0,0 +1,80 @@ +/** + * Shared fixtures and setup utilities for all test files + * Reduces duplication of deployment and state management logic + */ + +const { ethers } = require('hardhat') +const { getTestAccounts, deployTestGraphToken, deployServiceQualityOracle } = require('./fixtures') +// Shared test constants +const SHARED_CONSTANTS = { + PPM: 1_000_000, + + // Pre-calculated role constants to avoid repeated async calls + GOVERNOR_ROLE: ethers.keccak256(ethers.toUtf8Bytes('GOVERNOR_ROLE')), + OPERATOR_ROLE: ethers.keccak256(ethers.toUtf8Bytes('OPERATOR_ROLE')), + PAUSE_ROLE: ethers.keccak256(ethers.toUtf8Bytes('PAUSE_ROLE')), + ORACLE_ROLE: ethers.keccak256(ethers.toUtf8Bytes('ORACLE_ROLE')), +} + +// Interface IDs +const INTERFACE_IDS = { + IERC165: '0x01ffc9a7', +} + +/** + * Shared contract deployment and setup + */ +async function deploySharedContracts() { + const accounts = await getTestAccounts() + + // Deploy base contracts + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + + const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + + // Cache addresses + const addresses = { + graphToken: graphTokenAddress, + serviceQualityOracle: await serviceQualityOracle.getAddress(), + } + + // Create helper + return { + accounts, + contracts: { + graphToken, + serviceQualityOracle, + }, + addresses, + } +} + +/** + * Reset contract state to initial conditions + * Optimized to avoid redeployment while ensuring clean state + */ +async function resetContractState(contracts, accounts) { + const { serviceQualityOracle } = contracts + + // Reset ServiceQualityOracle state + try { + if (await serviceQualityOracle.paused()) { + await serviceQualityOracle.connect(accounts.governor).unpause() + } + + // Reset quality checking to default (disabled) + if (await serviceQualityOracle.isQualityCheckingActive()) { + await serviceQualityOracle.connect(accounts.governor).disableQualityChecking() + } + } catch (error) { + console.warn('ServiceQualityOracle state reset failed:', error instanceof Error ? error.message : String(error)) + } +} + +module.exports = { + deploySharedContracts, + resetContractState, + SHARED_CONSTANTS, + INTERFACE_IDS, +} diff --git a/packages/issuance/test/tsconfig.json b/packages/issuance/test/tsconfig.json new file mode 100644 index 000000000..348d014b5 --- /dev/null +++ b/packages/issuance/test/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "./build", + "rootDir": "." + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "build", "tests/**/*", "scripts/**/*"] +} diff --git a/packages/issuance/test/utils/testPatterns.ts b/packages/issuance/test/utils/testPatterns.ts new file mode 100644 index 000000000..52c3a7a56 --- /dev/null +++ b/packages/issuance/test/utils/testPatterns.ts @@ -0,0 +1,35 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * Shared test patterns and utilities to reduce duplication across test files + */ + +const { expect } = require('chai') + +// Test constants - centralized to avoid magic numbers +export const TestConstants = { + // Interface IDs + IERC165_INTERFACE_ID: '0x01ffc9a7', +} as const + +/** + * Shared test pattern for ERC-165 interface compliance + */ +export function shouldSupportERC165Interface(contractGetter: () => T, interfaceId: string, interfaceName: string) { + return function () { + it(`should support ERC-165 interface`, async function () { + const contract = contractGetter() + expect(await (contract as any).supportsInterface(TestConstants.IERC165_INTERFACE_ID)).to.be.true + }) + + it(`should support ${interfaceName} interface`, async function () { + const contract = contractGetter() + expect(await (contract as any).supportsInterface(interfaceId)).to.be.true + }) + + it('should not support random interface', async function () { + const contract = contractGetter() + const randomInterfaceId = '0x12345678' + expect(await (contract as any).supportsInterface(randomInterfaceId)).to.be.false + }) + } +} diff --git a/packages/issuance/tsconfig.json b/packages/issuance/tsconfig.json new file mode 100644 index 000000000..00aa1b8ef --- /dev/null +++ b/packages/issuance/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2023", + "lib": ["es2023"], + "module": "Node16", + "moduleResolution": "node16", + "strict": true, + "esModuleInterop": true, + "declaration": true, + "resolveJsonModule": true, + "allowJs": true, + "checkJs": false, + "incremental": true + }, + + "include": ["./scripts", "./test", "./typechain"], + "files": ["./hardhat.config.cjs"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 190c9f403..1d5a15ae9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,12 +9,30 @@ catalogs: '@eslint/js': specifier: ^9.28.0 version: 9.28.0 + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.8 + version: 3.0.9 + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.10 + version: 2.1.1 + '@typechain/hardhat': + specifier: ^9.0.0 + version: 9.1.0 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 eslint: specifier: ^9.28.0 version: 9.28.0 eslint-config-prettier: specifier: ^10.1.5 version: 10.1.5 + eslint-plugin-no-only-tests: + specifier: ^3.3.0 + version: 3.3.0 + ethers: + specifier: ^6.15.0 + version: 6.15.0 hardhat: specifier: ^2.24.0 version: 2.24.2 @@ -734,6 +752,185 @@ importers: specifier: ^5.8.3 version: 5.8.3 + packages/issuance: + dependencies: + '@noble/hashes': + specifier: ^1.8.0 + version: 1.8.0 + devDependencies: + '@graphprotocol/common': + specifier: workspace:^ + version: link:../common + '@nomicfoundation/hardhat-ethers': + specifier: 'catalog:' + version: 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': + specifier: 'catalog:' + version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@openzeppelin/contracts': + specifier: ^5.3.0 + version: 5.3.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.3.0 + version: 5.3.0(@openzeppelin/contracts@5.3.0) + '@openzeppelin/hardhat-upgrades': + specifier: ^3.9.0 + version: 3.9.1(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': + specifier: ^0.5.0 + 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.8.3))(typescript@5.8.3) + '@typechain/hardhat': + specifier: 'catalog:' + 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.8.3))(typescript@5.8.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + '@types/node': + specifier: ^20.17.50 + version: 20.19.9 + dotenv: + specifier: 'catalog:' + version: 16.5.0 + eslint: + specifier: 'catalog:' + version: 9.28.0(jiti@2.4.2) + ethers: + specifier: 'catalog:' + version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + glob: + specifier: ^11.0.2 + version: 11.0.2 + globals: + specifier: ^16.1.0 + version: 16.1.0 + hardhat: + specifier: 'catalog:' + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-contract-sizer: + specifier: 'catalog:' + version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + hardhat-secure-accounts: + specifier: 'catalog:' + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + hardhat-storage-layout: + specifier: 'catalog:' + version: 0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + lint-staged: + specifier: 16.0.0 + version: 16.0.0 + markdownlint-cli: + specifier: 'catalog:' + version: 0.45.0 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + prettier-plugin-solidity: + specifier: ^2.0.0 + version: 2.0.0(prettier@3.5.3) + solhint: + specifier: 'catalog:' + version: 6.0.0(typescript@5.8.3) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) + typechain: + specifier: ^8.3.0 + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: 'catalog:' + version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + yaml-lint: + specifier: ^1.7.0 + version: 1.7.0 + + packages/issuance/test: + dependencies: + '@graphprotocol/common': + specifier: workspace:^ + version: link:../../common + '@graphprotocol/contracts': + specifier: workspace:^ + version: link:../../contracts + '@graphprotocol/issuance': + specifier: workspace:^ + version: link:.. + '@graphprotocol/sdk': + specifier: workspace:^ + version: link:../../sdk + devDependencies: + '@nomicfoundation/hardhat-chai-matchers': + specifier: ^2.0.0 + version: 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.8 + version: 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-foundry': + specifier: ^1.1.1 + version: 1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': + specifier: 5.0.0 + version: 5.0.0(d805b92a490ff7e353d8006b7d043405) + '@openzeppelin/contracts': + specifier: ^5.3.0 + version: 5.3.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.3.0 + version: 5.3.0(@openzeppelin/contracts@5.3.0) + '@openzeppelin/foundry-upgrades': + specifier: 0.4.0 + version: 0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1) + '@types/chai': + specifier: ^4.3.20 + version: 4.3.20 + '@types/mocha': + specifier: ^10.0.10 + version: 10.0.10 + '@types/node': + specifier: ^20.17.50 + version: 20.19.9 + chai: + specifier: ^4.3.7 + version: 4.5.0 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 + eslint: + specifier: 'catalog:' + version: 9.28.0(jiti@2.4.2) + eslint-plugin-no-only-tests: + specifier: 'catalog:' + version: 3.3.0 + ethers: + specifier: ^6.13.4 + 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 + glob: + specifier: ^11.0.2 + version: 11.0.2 + hardhat: + specifier: 'catalog:' + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: + specifier: 'catalog:' + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + prettier: + specifier: ^3.5.3 + version: 3.5.3 + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + packages/sdk: dependencies: '@arbitrum/sdk': @@ -978,6 +1175,9 @@ importers: packages: + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1002,19 +1202,132 @@ packages: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} engines: {node: '>=14'} + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + '@aws-crypto/sha256-js@1.2.2': resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + '@aws-crypto/util@1.2.2': resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-lambda@3.865.0': + resolution: {integrity: sha512-ncCEW/kNRV8yJA/45z5HO6WEeihADzFY7RISfezDbvP3/X4dZb2gycRVPmJIE6CBqf01jwTkbG36qO+/iHIELg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.864.0': + resolution: {integrity: sha512-THiOp0OpQROEKZ6IdDCDNNh3qnNn/kFFaTSOiugDpgcE5QdsOxh1/RXq7LmHpTJum3cmnFf8jG59PHcz9Tjnlw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.864.0': + resolution: {integrity: sha512-LFUREbobleHEln+Zf7IG83lAZwvHZG0stI7UU0CtwyuhQy5Yx0rKksHNOCmlM7MpTEbSCfntEhYi3jUaY5e5lg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.864.0': + resolution: {integrity: sha512-StJPOI2Rt8UE6lYjXUpg6tqSZaM72xg46ljPg8kIevtBAAfdtq9K20qT/kSliWGIBocMFAv0g2mC0hAa+ECyvg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.864.0': + resolution: {integrity: sha512-E/RFVxGTuGnuD+9pFPH2j4l6HvrXzPhmpL8H8nOoJUosjx7d4v93GJMbbl1v/fkDLqW9qN4Jx2cI6PAjohA6OA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.864.0': + resolution: {integrity: sha512-PlxrijguR1gxyPd5EYam6OfWLarj2MJGf07DvCx9MAuQkw77HBnsu6+XbV8fQriFuoJVTBLn9ROhMr/ROAYfUg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.864.0': + resolution: {integrity: sha512-2BEymFeXURS+4jE9tP3vahPwbYRl0/1MVaFZcijj6pq+nf5EPGvkFillbdBRdc98ZI2NedZgSKu3gfZXgYdUhQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.864.0': + resolution: {integrity: sha512-Zxnn1hxhq7EOqXhVYgkF4rI9MnaO3+6bSg/tErnBQ3F8kDpA7CFU24G1YxwaJXp2X4aX3LwthefmSJHwcVP/2g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.864.0': + resolution: {integrity: sha512-UPyPNQbxDwHVGmgWdGg9/9yvzuedRQVF5jtMkmP565YX9pKZ8wYAcXhcYdNPWFvH0GYdB0crKOmvib+bmCuwkw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.864.0': + resolution: {integrity: sha512-nNcjPN4SYg8drLwqK0vgVeSvxeGQiD0FxOaT38mV2H8cu0C5NzpvA+14Xy+W6vT84dxgmJYKk71Cr5QL2Oz+rA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.862.0': + resolution: {integrity: sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.862.0': + resolution: {integrity: sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.862.0': + resolution: {integrity: sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.864.0': + resolution: {integrity: sha512-wrddonw4EyLNSNBrApzEhpSrDwJiNfjxDm5E+bn8n32BbAojXASH8W8jNpxz/jMgNkkJNxCfyqybGKzBX0OhbQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.864.0': + resolution: {integrity: sha512-H1C+NjSmz2y8Tbgh7Yy89J20yD/hVyk15hNoZDbCYkXg0M358KS7KVIEYs8E2aPOCr1sK3HBE819D/yvdMgokA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.862.0': + resolution: {integrity: sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.864.0': + resolution: {integrity: sha512-gTc2QHOBo05SCwVA65dUtnJC6QERvFaPiuppGDSxoF7O5AQNK0UR/kMSenwLqN8b5E1oLYvQTv3C1idJLRX0cg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.821.0': resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.862.0': + resolution: {integrity: sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.862.0': + resolution: {integrity: sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.804.0': + resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.862.0': + resolution: {integrity: sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==} + + '@aws-sdk/util-user-agent-node@3.864.0': + resolution: {integrity: sha512-d+FjUm2eJEpP+FRpVR3z6KzMdx1qwxEYDz8jzNKwxYLBBquaBaP/wfoMtMQKAcbrR7aT9FZVZF7zDgzNxUvQlQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + '@aws-sdk/xml-builder@3.862.0': + resolution: {integrity: sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1804,6 +2117,9 @@ packages: '@ethersproject/address@5.6.0': resolution: {integrity: sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ==} + '@ethersproject/address@5.6.1': + resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} + '@ethersproject/address@5.7.0': resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} @@ -2641,6 +2957,9 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} @@ -2651,6 +2970,10 @@ packages: '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -2724,17 +3047,78 @@ packages: c-kzg: optional: true + '@nomicfoundation/hardhat-chai-matchers@2.1.0': + resolution: {integrity: sha512-GPhBNafh1fCnVD9Y7BYvoLnblnvfcq3j8YDbO1gGe/1nOFWzGmV7gFu5DkwFXF+IpYsS+t96o9qc/mPu3V3Vfw==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.1.0 + chai: ^4.2.0 + ethers: ^6.14.0 + hardhat: ^2.26.0 + '@nomicfoundation/hardhat-ethers@3.0.9': resolution: {integrity: sha512-xBJdRUiCwKpr0OYrOzPwAyNGtsVzoBx32HFPJVv6S+sFA9TmBIBDaqNlFPmBH58ZjgNnGhEr/4oBZvGr4q4TjQ==} peerDependencies: ethers: ^6.14.0 hardhat: ^2.0.0 + '@nomicfoundation/hardhat-foundry@1.2.0': + resolution: {integrity: sha512-2AJQLcWnUk/iQqHDVnyOadASKFQKF1PhNtt1cONEQqzUPK+fqME1IbP+EKu+RkZTRcyc4xqUMaB0sutglKRITg==} + peerDependencies: + hardhat: ^2.26.0 + + '@nomicfoundation/hardhat-ignition-ethers@0.15.14': + resolution: {integrity: sha512-eq+5n+c1DW18/Xp8/QrHBBvG5QaKUxYF/byol4f1jrnZ1zAy0OrqEa/oaNFWchhpLalX7d7suk/2EL0PbT0CDQ==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.1.0 + '@nomicfoundation/hardhat-ignition': ^0.15.13 + '@nomicfoundation/ignition-core': ^0.15.13 + ethers: ^6.14.0 + hardhat: ^2.26.0 + + '@nomicfoundation/hardhat-ignition@0.15.13': + resolution: {integrity: sha512-G4XGPWvxs9DJhZ6PE1wdvKjHkjErWbsETf4c7YxO6GUz+MJGlw+PtgbnCwhL3tQzSq3oD4MB0LGi+sK0polpUA==} + peerDependencies: + '@nomicfoundation/hardhat-verify': ^2.1.0 + hardhat: ^2.26.0 + '@nomicfoundation/hardhat-network-helpers@1.0.12': resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} peerDependencies: hardhat: ^2.9.5 + '@nomicfoundation/hardhat-toolbox@5.0.0': + resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} + peerDependencies: + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-ignition-ethers': ^0.15.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + '@typechain/ethers-v6': ^0.5.0 + '@typechain/hardhat': ^9.0.0 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': ^20.17.50 + chai: ^4.2.0 + ethers: ^6.4.0 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: '>=8.0.0' + typechain: ^8.3.0 + typescript: ^5.8.3 + + '@nomicfoundation/hardhat-verify@2.1.1': + resolution: {integrity: sha512-K1plXIS42xSHDJZRkrE2TZikqxp9T4y6jUMUNI/imLgN5uCcEQokmfU0DlyP9zzHncYK92HlT5IWP35UVCLrPw==} + peerDependencies: + hardhat: ^2.26.0 + + '@nomicfoundation/ignition-core@0.15.13': + resolution: {integrity: sha512-Z4T1WIbw0EqdsN9RxtnHeQXBi7P/piAmCu8bZmReIdDo/2h06qgKWxjDoNfc9VBFZJ0+Dx79tkgQR3ewxMDcpA==} + + '@nomicfoundation/ignition-ui@0.15.12': + resolution: {integrity: sha512-nQl8tusvmt1ANoyIj5RQl9tVSEmG0FnNbtwnWbTim+F8JLm4YLHWS0yEgYUZC+BEO3oS0D8r6V8a02JGZJgqiQ==} + '@nomicfoundation/slang@0.18.3': resolution: {integrity: sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==} @@ -2827,6 +3211,25 @@ packages: resolution: {integrity: sha512-PTef+rMxkM5VQ7sLwLKSjp2DBakYQd661ZJiSRywx+q/nIpm3B/HYGcz5wPZCA5O/QcEP6TatXXDoeMwimbcnw==} deprecated: This package has been deprecated and will no longer be maintained, please use @openzeppelin/defender-sdk package instead. + '@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10': + resolution: {integrity: sha512-piZnEbGZle6I4L0XsnD4Is73pps16Zx1wakXrZeDH7vPyVzIr/1Gb0hKflj+ffVHlNR8MrAs1BSw4Z99wGkzfg==} + hasBin: true + + '@openzeppelin/defender-sdk-base-client@2.7.0': + resolution: {integrity: sha512-J5IpvbFfdIJM4IadBcXfhCXVdX2yEpaZtRR1ecq87d8CdkmmEpniYfef/yVlG98yekvu125LaIRg0yXQOt9Bdg==} + + '@openzeppelin/defender-sdk-deploy-client@2.7.0': + resolution: {integrity: sha512-YOHZmnHmM1y6uSqXWGfk2/5/ae4zZJE6xG92yFEAIOy8vqh1dxznWMsoCcAXRXTCWc8RdCDpFdMfEy4SBTyYtg==} + + '@openzeppelin/defender-sdk-network-client@2.7.0': + resolution: {integrity: sha512-4CYWPa9+kSjojE5KS7kRmP161qsBATdp97TCrzyDdGoVahj0GyqgafRL9AAjm0eHZOM1c7EIYEpbvYRtFi8vyA==} + + '@openzeppelin/foundry-upgrades@0.4.0': + resolution: {integrity: sha512-x9wxogNteR5rdDzh5d/XnINR+ncUdPsCLWud99ULCa1pNNqRVPYMadr6iEVmjdTEy/4keIgbHwLB0rw2zXiRyQ==} + peerDependencies: + '@openzeppelin/defender-deploy-client-cli': 0.0.1-alpha.10 + '@openzeppelin/upgrades-core': ^1.37.0 + '@openzeppelin/hardhat-upgrades@1.28.0': resolution: {integrity: sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==} hasBin: true @@ -2840,6 +3243,18 @@ packages: '@nomiclabs/harhdat-etherscan': optional: true + '@openzeppelin/hardhat-upgrades@3.9.1': + resolution: {integrity: sha512-pSDjlOnIpP+PqaJVe144dK6VVKZw2v6YQusyt0OOLiCsl+WUzfo4D0kylax7zjrOxqy41EK2ipQeIF4T+cCn2A==} + hasBin: true + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.6 + '@nomicfoundation/hardhat-verify': ^2.0.14 + ethers: ^6.6.0 + hardhat: ^2.24.1 + peerDependenciesMeta: + '@nomicfoundation/hardhat-verify': + optional: true + '@openzeppelin/platform-deploy-client@0.8.0': resolution: {integrity: sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==} deprecated: '@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client' @@ -3028,50 +3443,242 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/types@4.3.1': - resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + '@smithy/abort-controller@4.0.5': + resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} engines: {node: '>=18.0.0'} - '@solidity-parser/parser@0.14.5': - resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + '@smithy/config-resolver@4.1.5': + resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==} + engines: {node: '>=18.0.0'} - '@solidity-parser/parser@0.20.1': - resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} + '@smithy/core@3.8.0': + resolution: {integrity: sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==} + engines: {node: '>=18.0.0'} - '@szmarczak/http-timer@1.1.2': - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} + '@smithy/credential-provider-imds@4.0.7': + resolution: {integrity: sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==} + engines: {node: '>=18.0.0'} - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + '@smithy/eventstream-codec@4.0.5': + resolution: {integrity: sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==} + engines: {node: '>=18.0.0'} - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@smithy/eventstream-serde-browser@4.0.5': + resolution: {integrity: sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==} + engines: {node: '>=18.0.0'} - '@tenderly/api-client@1.1.0': - resolution: {integrity: sha512-kyye7TQ+RbDbJ7bSUjNf/O9fTtRYNUDIEUZQSrmNonowMw5/EpNi664eWaOoC00NEzxgttVrtme/GHvIOu7rNg==} - peerDependencies: - ts-node: '*' - typescript: ^5.8.3 - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true + '@smithy/eventstream-serde-config-resolver@4.1.3': + resolution: {integrity: sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==} + engines: {node: '>=18.0.0'} - '@tenderly/hardhat-integration@1.1.1': - resolution: {integrity: sha512-VHa380DrKv+KA1N4vbJGLDoghbVqMZ4wEozbxRfCzlkSs5V1keNgudRSUFK6lgfKhkoAWRO+dA8MZYnJOvUOkA==} - peerDependencies: - hardhat: ^2.22.6 + '@smithy/eventstream-serde-node@4.0.5': + resolution: {integrity: sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==} + engines: {node: '>=18.0.0'} - '@tenderly/hardhat-tenderly@1.11.0': - resolution: {integrity: sha512-7UU9i3wn+YiN5xXGvE015/SDR6QH5ULIc6Gu4PmGNIcBpePElY2+cFxGGF9M5gRbzvAxDDa+KCenCN5cg0cQ/w==} + '@smithy/eventstream-serde-universal@4.0.5': + resolution: {integrity: sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==} + engines: {node: '>=18.0.0'} - '@trufflesuite/bigint-buffer@1.1.9': - resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} - engines: {node: '>= 10.0.0'} + '@smithy/fetch-http-handler@5.1.1': + resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.0.5': + resolution: {integrity: sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.0.5': + resolution: {integrity: sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==} + 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.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.0.5': + resolution: {integrity: sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.1.18': + resolution: {integrity: sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.1.19': + resolution: {integrity: sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.0.9': + resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.0.5': + resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.1.4': + resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.1.1': + resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.0.5': + resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.1.3': + resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.0.5': + resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.0.5': + resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.0.7': + resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.0.5': + resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.1.3': + resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.4.10': + resolution: {integrity: sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.3.1': + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.3.2': + resolution: {integrity: sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.0.5': + resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.0.0': + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + 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.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.0.26': + resolution: {integrity: sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.0.26': + resolution: {integrity: sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.0.7': + resolution: {integrity: sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.0.5': + resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.0.7': + resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.2.4': + resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + 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.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.0.7': + resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==} + engines: {node: '>=18.0.0'} + + '@solidity-parser/parser@0.14.5': + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + + '@solidity-parser/parser@0.20.1': + resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} + + '@szmarczak/http-timer@1.1.2': + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tenderly/api-client@1.1.0': + resolution: {integrity: sha512-kyye7TQ+RbDbJ7bSUjNf/O9fTtRYNUDIEUZQSrmNonowMw5/EpNi664eWaOoC00NEzxgttVrtme/GHvIOu7rNg==} + peerDependencies: + ts-node: '*' + typescript: ^5.8.3 + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + '@tenderly/hardhat-integration@1.1.1': + resolution: {integrity: sha512-VHa380DrKv+KA1N4vbJGLDoghbVqMZ4wEozbxRfCzlkSs5V1keNgudRSUFK6lgfKhkoAWRO+dA8MZYnJOvUOkA==} + peerDependencies: + hardhat: ^2.22.6 + + '@tenderly/hardhat-tenderly@1.11.0': + resolution: {integrity: sha512-7UU9i3wn+YiN5xXGvE015/SDR6QH5ULIc6Gu4PmGNIcBpePElY2+cFxGGF9M5gRbzvAxDDa+KCenCN5cg0cQ/w==} + + '@trufflesuite/bigint-buffer@1.1.9': + resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} + engines: {node: '>= 10.0.0'} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -3100,6 +3707,13 @@ packages: ethers: ^5.0.0 typechain: ^3.0.0 + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.2 + typescript: ^5.8.3 + '@typechain/hardhat@6.1.6': resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} peerDependencies: @@ -3110,6 +3724,14 @@ packages: hardhat: ^2.9.9 typechain: ^8.1.1 + '@typechain/hardhat@9.1.0': + resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} + peerDependencies: + '@typechain/ethers-v6': ^0.5.1 + ethers: ^6.1.0 + hardhat: ^2.9.9 + typechain: ^8.3.2 + '@types/abstract-leveldown@7.2.5': resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==} @@ -3278,6 +3900,9 @@ 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.1': resolution: {integrity: sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==} @@ -3486,6 +4111,9 @@ packages: aes-js@3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -4113,6 +4741,9 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + bowser@2.12.0: + resolution: {integrity: sha512-HcOcTudTeEWgbHh0Y1Tyb6fdeR71m4b/QACf0D4KswGTsNeIJQmg38mRENZPAYPZvGFN3fk3604XbQEPdxXdKg==} + boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} @@ -4329,6 +4960,10 @@ packages: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} + cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} + engines: {node: '>=16'} + chai-as-promised@7.1.2: resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: @@ -5562,6 +6197,10 @@ packages: ethers@5.8.0: resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + ethers@6.15.0: + resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} + engines: {node: '>=14.0.0'} + ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -5711,6 +6350,10 @@ packages: fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + fastify-warning@0.2.0: resolution: {integrity: sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==} deprecated: This module renamed to process-warning @@ -5880,6 +6523,10 @@ packages: forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + forge-std@https://github.com/foundry-rs/forge-std/tarball/v1.9.7: + resolution: {tarball: https://github.com/foundry-rs/forge-std/tarball/v1.9.7} + version: 1.9.7 + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -6566,6 +7213,9 @@ packages: immediate@3.3.0: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + immutable@3.7.6: resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} engines: {node: '>=0.8.0'} @@ -8148,6 +8798,11 @@ packages: resolution: {integrity: sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==} engines: {node: '>= 0.4.0'} + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -8426,6 +9081,9 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -10038,6 +10696,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -10316,6 +10977,9 @@ packages: tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -10491,6 +11155,10 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + engines: {node: '>=18.17'} + unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} @@ -10617,6 +11285,10 @@ 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==} @@ -10944,6 +11616,18 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -11093,6 +11777,8 @@ packages: snapshots: + '@adraffy/ens-normalize@1.10.1': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -11147,27 +11833,389 @@ snapshots: transitivePeerDependencies: - encoding + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@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.862.0 + '@aws-sdk/util-locate-window': 3.804.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.821.0 tslib: 1.14.1 + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.862.0 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + '@aws-crypto/util@1.2.2': dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-lambda@3.865.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/credential-provider-node': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/eventstream-serde-browser': 4.0.5 + '@smithy/eventstream-serde-config-resolver': 4.1.3 + '@smithy/eventstream-serde-node': 4.0.5 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-stream': 4.2.4 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.7 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.864.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.864.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@aws-sdk/xml-builder': 3.862.0 + '@smithy/core': 3.8.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/signature-v4': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-utf8': 4.0.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/node-http-handler': 4.1.1 + '@smithy/property-provider': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-stream': 4.2.4 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/credential-provider-env': 3.864.0 + '@aws-sdk/credential-provider-http': 3.864.0 + '@aws-sdk/credential-provider-process': 3.864.0 + '@aws-sdk/credential-provider-sso': 3.864.0 + '@aws-sdk/credential-provider-web-identity': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.864.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.864.0 + '@aws-sdk/credential-provider-http': 3.864.0 + '@aws-sdk/credential-provider-ini': 3.864.0 + '@aws-sdk/credential-provider-process': 3.864.0 + '@aws-sdk/credential-provider-sso': 3.864.0 + '@aws-sdk/credential-provider-web-identity': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.864.0': + dependencies: + '@aws-sdk/client-sso': 3.864.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/token-providers': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-host-header@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@smithy/core': 3.8.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.864.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.5 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.864.0': + dependencies: + '@aws-sdk/core': 3.864.0 + '@aws-sdk/nested-clients': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.821.0': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/types@3.862.0': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-endpoints': 3.0.7 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.804.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.862.0': + dependencies: + '@aws-sdk/types': 3.862.0 + '@smithy/types': 4.3.2 + bowser: 2.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.864.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/types': 3.862.0 + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 + '@aws-sdk/xml-builder@3.862.0': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -11841,10 +12889,10 @@ snapshots: '@commitlint/execute-rule': 16.2.1 '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 - '@types/node': 20.17.58 + '@types/node': 20.19.9 chalk: 4.1.2 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2(@types/node@20.17.58)(cosmiconfig@7.1.0)(typescript@5.8.3) + cosmiconfig-typescript-loader: 2.0.2(@types/node@20.19.9)(cosmiconfig@7.1.0)(typescript@5.8.3) lodash: 4.17.21 resolve-from: 5.0.0 typescript: 5.8.3 @@ -12386,6 +13434,14 @@ snapshots: '@ethersproject/logger': 5.8.0 '@ethersproject/rlp': 5.8.0 + '@ethersproject/address@5.6.1': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/address@5.7.0': dependencies: '@ethersproject/bignumber': 5.8.0 @@ -14174,7 +15230,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.27.6 - '@types/node': 20.17.58 + '@types/node': 20.19.9 find-up: 4.1.0 fs-extra: 8.1.0 @@ -14187,6 +15243,10 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + '@noble/curves@1.4.2': dependencies: '@noble/hashes': 1.4.0 @@ -14197,6 +15257,8 @@ snapshots: '@noble/hashes@1.2.0': {} + '@noble/hashes@1.3.2': {} + '@noble/hashes@1.4.0': {} '@noble/hashes@1.7.2': {} @@ -14248,6 +15310,17 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ordinal: 1.0.3 + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@9.4.0) @@ -14257,11 +15330,108 @@ snapshots: transitivePeerDependencies: - supports-color + '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.1(supports-color@9.4.0) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + picocolors: 1.1.1 + + '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) + fs-extra: 10.1.0 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + json5: 2.2.3 + prompts: 2.4.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-toolbox@5.0.0(d805b92a490ff7e353d8006b7d043405)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 20.19.9 + chai: 4.5.0 + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + picocolors: 1.1.1 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/address': 5.6.1 + '@nomicfoundation/solidity-analyzer': 0.1.2 + cbor: 9.0.2 + debug: 4.4.1(supports-color@9.4.0) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + fs-extra: 10.1.0 + immer: 10.0.2 + lodash: 4.17.21 + ndjson: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@nomicfoundation/ignition-ui@0.15.12': {} + '@nomicfoundation/slang@0.18.3': dependencies: '@bytecodealliance/preview2-shim': 0.17.0 @@ -14377,6 +15547,52 @@ snapshots: - debug - encoding + '@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) + '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) + '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) + dotenv: 16.5.0 + minimist: 1.2.8 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-base-client@2.7.0(encoding@0.1.13)': + dependencies: + '@aws-sdk/client-lambda': 3.865.0 + amazon-cognito-identity-js: 6.3.15(encoding@0.1.13) + async-retry: 1.3.3 + transitivePeerDependencies: + - aws-crt + - encoding + + '@openzeppelin/defender-sdk-deploy-client@2.7.0(debug@4.4.1)(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) + axios: 1.9.0(debug@4.4.1) + lodash: 4.17.21 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/defender-sdk-network-client@2.7.0(debug@4.4.1)(encoding@0.1.13)': + dependencies: + '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) + axios: 1.9.0(debug@4.4.1) + lodash: 4.17.21 + transitivePeerDependencies: + - aws-crt + - debug + - encoding + + '@openzeppelin/foundry-upgrades@0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1)': + dependencies: + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -14393,6 +15609,27 @@ snapshots: - encoding - supports-color + '@openzeppelin/hardhat-upgrades@3.9.1(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) + '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) + '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) + '@openzeppelin/upgrades-core': 1.44.1 + chalk: 4.1.2 + debug: 4.4.1(supports-color@9.4.0) + ethereumjs-util: 7.1.5 + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + proper-lockfile: 4.1.2 + undici: 6.21.3 + optionalDependencies: + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - aws-crt + - encoding + - supports-color + '@openzeppelin/platform-deploy-client@0.8.0(debug@4.4.1)(encoding@0.1.13)': dependencies: '@ethersproject/abi': 5.8.0 @@ -14629,55 +15866,363 @@ snapshots: '@sentry/types': 5.30.0 tslib: 1.14.1 - '@sentry/node@5.30.0': + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@0.14.0': + optional: true + + '@sindresorhus/is@4.6.0': + optional: true + + '@sindresorhus/is@5.6.0': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@smithy/abort-controller@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/config-resolver@4.1.5': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.5 + tslib: 2.8.1 + + '@smithy/core@3.8.0': + dependencies: + '@smithy/middleware-serde': 4.0.9 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-stream': 4.2.4 + '@smithy/util-utf8': 4.0.0 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + + '@smithy/credential-provider-imds@4.0.7': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.0.5': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.3.2 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.0.5': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.1.3': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.0.5': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.0.5': + dependencies: + '@smithy/eventstream-codec': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.1.1': + dependencies: + '@smithy/protocol-http': 5.1.3 + '@smithy/querystring-builder': 4.0.5 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.0.5': + dependencies: + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.1.18': + dependencies: + '@smithy/core': 3.8.0 + '@smithy/middleware-serde': 4.0.9 + '@smithy/node-config-provider': 4.1.4 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-middleware': 4.0.5 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.1.19': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/protocol-http': 5.1.3 + '@smithy/service-error-classification': 4.0.7 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + + '@smithy/middleware-serde@4.0.9': + dependencies: + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.1.4': + dependencies: + '@smithy/property-provider': 4.0.5 + '@smithy/shared-ini-file-loader': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.1.1': + dependencies: + '@smithy/abort-controller': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/querystring-builder': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/property-provider@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/protocol-http@5.1.3': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.0.7': + dependencies: + '@smithy/types': 4.3.2 + + '@smithy/shared-ini-file-loader@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/signature-v4@5.1.3': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.4.10': + dependencies: + '@smithy/core': 3.8.0 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-stack': 4.0.5 + '@smithy/protocol-http': 5.1.3 + '@smithy/types': 4.3.2 + '@smithy/util-stream': 4.2.4 + tslib: 2.8.1 + + '@smithy/types@4.3.1': + dependencies: + tslib: 2.8.1 + + '@smithy/types@4.3.2': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.0.5': + dependencies: + '@smithy/querystring-parser': 4.0.5 + '@smithy/types': 4.3.2 + tslib: 2.8.1 + + '@smithy/util-base64@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.0.0': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.0.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.0.26': dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color + '@smithy/property-provider': 4.0.5 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + bowser: 2.12.0 + tslib: 2.8.1 - '@sentry/tracing@5.30.0': + '@smithy/util-defaults-mode-node@4.0.26': dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 + '@smithy/config-resolver': 4.1.5 + '@smithy/credential-provider-imds': 4.0.7 + '@smithy/node-config-provider': 4.1.4 + '@smithy/property-provider': 4.0.5 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + tslib: 2.8.1 - '@sentry/types@5.30.0': {} + '@smithy/util-endpoints@3.0.7': + dependencies: + '@smithy/node-config-provider': 4.1.4 + '@smithy/types': 4.3.2 + tslib: 2.8.1 - '@sentry/utils@5.30.0': + '@smithy/util-hex-encoding@4.0.0': dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 + tslib: 2.8.1 - '@sinclair/typebox@0.27.8': {} + '@smithy/util-middleware@4.0.5': + dependencies: + '@smithy/types': 4.3.2 + tslib: 2.8.1 - '@sindresorhus/is@0.14.0': - optional: true + '@smithy/util-retry@4.0.7': + dependencies: + '@smithy/service-error-classification': 4.0.7 + '@smithy/types': 4.3.2 + tslib: 2.8.1 - '@sindresorhus/is@4.6.0': - optional: true + '@smithy/util-stream@4.2.4': + dependencies: + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/node-http-handler': 4.1.1 + '@smithy/types': 4.3.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 - '@sindresorhus/is@5.6.0': {} + '@smithy/util-uri-escape@4.0.0': + dependencies: + tslib: 2.8.1 - '@sinonjs/commons@3.0.1': + '@smithy/util-utf8@2.3.0': dependencies: - type-detect: 4.0.8 + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 - '@sinonjs/fake-timers@10.3.0': + '@smithy/util-utf8@4.0.0': dependencies: - '@sinonjs/commons': 3.0.1 + '@smithy/util-buffer-from': 4.0.0 + tslib: 2.8.1 - '@smithy/types@4.3.1': + '@smithy/util-waiter@4.0.7': dependencies: + '@smithy/abort-controller': 4.0.5 + '@smithy/types': 4.3.2 tslib: 2.8.1 '@solidity-parser/parser@0.14.5': @@ -14788,6 +16333,14 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) typechain: 3.0.0(typescript@5.8.3) + '@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.8.3))(typescript@5.8.3)': + dependencies: + 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.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))': dependencies: '@ethersproject/abi': 5.8.0 @@ -14798,6 +16351,14 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))': + dependencies: + '@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.8.3))(typescript@5.8.3) + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + fs-extra: 9.1.0 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + '@types/abstract-leveldown@7.2.5': {} '@types/babel__core@7.20.5': @@ -14823,17 +16384,17 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/bn.js@5.2.0': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/responselike': 1.0.3 optional: true @@ -14845,11 +16406,11 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/debug@4.1.12': dependencies: @@ -14859,12 +16420,12 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/glob@8.1.0': dependencies: @@ -14900,7 +16461,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 optional: true '@types/level-errors@3.0.2': {} @@ -14909,7 +16470,7 @@ snapshots: dependencies: '@types/abstract-leveldown': 7.2.5 '@types/level-errors': 3.0.2 - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/lodash@4.17.17': {} @@ -14925,7 +16486,7 @@ snapshots: '@types/mkdirp@0.5.2': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/mocha@10.0.10': {} @@ -14935,7 +16496,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 form-data: 4.0.3 '@types/node@20.17.58': @@ -14952,7 +16513,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/prettier@2.7.3': {} @@ -14960,16 +16521,16 @@ snapshots: '@types/resolve@0.0.8': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 optional: true '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/sinon-chai@3.2.12': dependencies: @@ -14986,17 +16547,19 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/triple-beam@1.3.5': {} '@types/unist@2.0.11': {} + '@types/uuid@9.0.8': {} + '@types/validator@13.15.1': {} '@types/ws@8.18.1': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/yargs-parser@21.0.3': {} @@ -15251,6 +16814,8 @@ snapshots: aes-js@3.1.2: optional: true + aes-js@4.0.0-beta.5: {} + agent-base@6.0.2: dependencies: debug: 4.4.1(supports-color@9.4.0) @@ -16159,7 +17724,7 @@ snapshots: bip39@3.0.4: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 create-hash: 1.2.0 pbkdf2: 3.1.2 randombytes: 2.1.0 @@ -16263,6 +17828,8 @@ snapshots: - supports-color optional: true + bowser@2.12.0: {} + boxen@5.1.2: dependencies: ansi-align: 3.0.1 @@ -16574,6 +18141,10 @@ snapshots: dependencies: nofilter: 3.1.0 + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + chai-as-promised@7.1.2(chai@4.5.0): dependencies: chai: 4.5.0 @@ -17052,11 +18623,11 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@2.0.2(@types/node@20.17.58)(cosmiconfig@7.1.0)(typescript@5.8.3): + cosmiconfig-typescript-loader@2.0.2(@types/node@20.19.9)(cosmiconfig@7.1.0)(typescript@5.8.3): dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 cosmiconfig: 7.1.0 - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - '@swc/core' @@ -18317,6 +19888,19 @@ snapshots: - 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.9 + 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 + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 @@ -18601,6 +20185,10 @@ snapshots: dependencies: punycode: 1.4.1 + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + fastify-warning@0.2.0: {} fastq@1.19.1: @@ -18810,6 +20398,8 @@ snapshots: forever-agent@0.6.1: {} + forge-std@https://github.com/foundry-rs/forge-std/tarball/v1.9.7: {} + form-data-encoder@2.1.4: {} form-data@2.3.3: @@ -19362,6 +20952,13 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 + hardhat-contract-sizer@2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + chalk: 4.1.2 + cli-table3: 0.6.5 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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): dependencies: '@ethersproject/abi': 5.8.0 @@ -19434,6 +21031,18 @@ snapshots: - debug - utf-8-validate + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -19458,11 +21067,28 @@ snapshots: transitivePeerDependencies: - supports-color + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: 4.4.1(supports-color@9.4.0) + enquirer: 2.4.1 + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: console-table-printer: 2.14.1 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-storage-layout@0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + console-table-printer: 2.14.1 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 @@ -19514,6 +21140,57 @@ snapshots: - supports-color - utf-8-validate + hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.2.0 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.1(supports-color@9.4.0) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + micro-eth-signer: 0.14.0 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.1) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.14 + tsort: 0.0.1 + undici: 5.29.0 + 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.9)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 @@ -19678,7 +21355,7 @@ snapshots: http-response-object@3.0.2: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 http-signature@1.2.0: dependencies: @@ -19747,6 +21424,8 @@ snapshots: immediate@3.3.0: {} + immer@10.0.2: {} + immutable@3.7.6: {} immutable@4.3.7: {} @@ -21727,6 +23406,14 @@ snapshots: secure-keys: 1.0.0 yargs: 16.2.0 + ndjson@2.0.0: + dependencies: + json-stringify-safe: 5.0.1 + minimist: 1.2.8 + readable-stream: 3.6.2 + split2: 3.2.2 + through2: 4.0.2 + negotiator@0.6.3: {} negotiator@0.6.4: {} @@ -22033,6 +23720,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ordinal@1.0.3: {} + os-homedir@1.0.2: {} os-locale@1.4.0: @@ -23674,6 +25363,29 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 + solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + '@ethersproject/abi': 5.8.0 + '@solidity-parser/parser': 0.20.1 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + jsonschema: 1.5.0 + lodash: 4.17.21 + mocha: 10.8.2 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.7.2 + shelljs: 0.8.5 + web3-utils: 1.10.4 + solium-plugin-security@0.1.1(solium@1.2.5): dependencies: solium: 1.2.5 @@ -23943,6 +25655,8 @@ snapshots: strip-json-comments@3.1.1: {} + strnum@2.1.1: {} + supports-color@2.0.0: {} supports-color@3.2.3: @@ -24111,7 +25825,7 @@ snapshots: dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 - '@types/node': 20.17.58 + '@types/node': 20.19.9 '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 @@ -24276,6 +25990,24 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.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.9 + acorn: 8.14.1 + 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.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -24295,6 +26027,8 @@ snapshots: tslib@2.5.3: {} + tslib@2.7.0: {} + tslib@2.8.1: {} tslog@4.9.3: {} @@ -24470,6 +26204,8 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@6.21.3: {} + unfetch@4.2.0: {} unicorn-magic@0.1.0: {} @@ -24592,6 +26328,8 @@ snapshots: uuid@8.3.2: {} + uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -24626,7 +26364,7 @@ snapshots: web3-bzz@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 got: 9.6.0 swarm-js: 0.1.42(bufferutil@4.0.9)(utf-8-validate@5.0.10) underscore: 1.9.1 @@ -24679,7 +26417,7 @@ snapshots: web3-core@1.2.11: dependencies: '@types/bn.js': 4.11.6 - '@types/node': 20.17.58 + '@types/node': 20.19.9 bignumber.js: 9.3.0 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -24751,7 +26489,7 @@ snapshots: web3-eth-personal@1.2.11: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 web3-core: 1.2.11 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -25007,7 +26745,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.9 wonka@4.0.15: {} @@ -25101,6 +26839,11 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 From 18c01e0e92ff572df1aa8345159cc868f1a38c0d Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 14 Aug 2025 14:32:15 +0000 Subject: [PATCH 05/28] fix(contracts/task): fix TypeScript rootDir configuration - Remove restrictive rootDir setting that prevented imports from parent directories - Set rootDir to '..' to allow access to parent contracts types - Fixes CI build failure in packages/contracts/task TypeScript compilation Resolves TypeScript error TS6059 where files outside rootDir were being imported --- packages/contracts/task/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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" }, From 818be27135bccc14e8c275cd5fa9ead68fed7f01 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Fri, 15 Aug 2025 11:51:23 +0000 Subject: [PATCH 06/28] fix: applying CoPilot review suggestions --- .../contracts/quality/ServiceQualityOracle.sol | 5 ++--- .../issuance/test/tests/ServiceQualityOracle.test.ts | 12 ------------ .../test/tests/consolidated/AccessControl.test.ts | 2 +- packages/issuance/test/tests/helpers/fixtures.ts | 5 ++--- packages/issuance/test/tsconfig.json | 11 +++++++++-- 5 files changed, 14 insertions(+), 21 deletions(-) diff --git a/packages/issuance/contracts/quality/ServiceQualityOracle.sol b/packages/issuance/contracts/quality/ServiceQualityOracle.sol index bc6bc315b..3c7e5b82d 100644 --- a/packages/issuance/contracts/quality/ServiceQualityOracle.sol +++ b/packages/issuance/contracts/quality/ServiceQualityOracle.sol @@ -83,8 +83,7 @@ contract ServiceQualityOracle is BaseUpgradeable, IServiceQualityOracle { /// @notice Emitted when the allowed period is updated /// @param oldPeriod The previous allowed period in seconds /// @param newPeriod The new allowed period in seconds - event AllowedPeriodUpdated(uint256 oldPeriod, uint256 newPeriod); // solhint-disable-line gas-indexed-events - // Do not need to index period values + event AllowedPeriodUpdated(uint256 indexed oldPeriod, uint256 indexed newPeriod); /// @notice Emitted when quality checking is enabled or disabled /// @param active True if quality checking is enabled, false if disabled @@ -93,7 +92,7 @@ contract ServiceQualityOracle is BaseUpgradeable, IServiceQualityOracle { /// @notice Emitted when the oracle update timeout is updated /// @param oldTimeout The previous timeout period in seconds /// @param newTimeout The new timeout period in seconds - event OracleUpdateTimeoutUpdated(uint256 indexed oldTimeout, uint256 newTimeout); // solhint-disable-line gas-indexed-events + event OracleUpdateTimeoutUpdated(uint256 indexed oldTimeout, uint256 indexed newTimeout); // -- Constructor -- diff --git a/packages/issuance/test/tests/ServiceQualityOracle.test.ts b/packages/issuance/test/tests/ServiceQualityOracle.test.ts index 6f2ae37c7..8ea096b5d 100644 --- a/packages/issuance/test/tests/ServiceQualityOracle.test.ts +++ b/packages/issuance/test/tests/ServiceQualityOracle.test.ts @@ -97,18 +97,6 @@ describe('ServiceQualityOracle', () => { await resetOracleState() }) - // // Test fixtures (kept for complex tests that need fresh deployments) - // async function setupServiceQualityOracle() { - // // Deploy test GraphToken - // const graphToken = await deployTestGraphToken() - // const graphTokenAddress = await graphToken.getAddress() - - // // Deploy ServiceQualityOracle with proxy - // const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) - - // return { serviceQualityOracle, graphToken } - // } - describe('Construction', () => { it('should revert when constructed with zero GraphToken address', async () => { const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') diff --git a/packages/issuance/test/tests/consolidated/AccessControl.test.ts b/packages/issuance/test/tests/consolidated/AccessControl.test.ts index 5e472e809..385e9715e 100644 --- a/packages/issuance/test/tests/consolidated/AccessControl.test.ts +++ b/packages/issuance/test/tests/consolidated/AccessControl.test.ts @@ -97,7 +97,7 @@ describe('Consolidated Access Control Tests', () => { contracts.serviceQualityOracle.connect(accounts.nonGovernor).unpause(), ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') - // Pause role account should be allowed + // PAUSE_ROLE account should be allowed await expect(contracts.serviceQualityOracle.connect(accounts.governor).pause()).to.not.be.reverted }) diff --git a/packages/issuance/test/tests/helpers/fixtures.ts b/packages/issuance/test/tests/helpers/fixtures.ts index c235efcdc..4a4f9bd34 100644 --- a/packages/issuance/test/tests/helpers/fixtures.ts +++ b/packages/issuance/test/tests/helpers/fixtures.ts @@ -1,6 +1,5 @@ -const fs = require('fs') - -const { ethers, upgrades } = require('hardhat') +import * as fs from 'fs' +import { ethers, upgrades } from 'hardhat' /** * Standard test accounts diff --git a/packages/issuance/test/tsconfig.json b/packages/issuance/test/tsconfig.json index 348d014b5..543ff61b9 100644 --- a/packages/issuance/test/tsconfig.json +++ b/packages/issuance/test/tsconfig.json @@ -4,6 +4,13 @@ "outDir": "./build", "rootDir": "." }, - "include": ["src/**/*"], - "exclude": ["node_modules", "build", "tests/**/*", "scripts/**/*"] + "include": [ + "tests/**/*", + "utils/**/*" + ], + "exclude": [ + "node_modules", + "build", + "scripts/**/*" + ] } From def236519a27c0ceb6b84cd8eb2416483617ea18 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:12:59 +0100 Subject: [PATCH 07/28] Update packages/issuance/test/tests/helpers/fixtures.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/issuance/test/tests/helpers/fixtures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/issuance/test/tests/helpers/fixtures.ts b/packages/issuance/test/tests/helpers/fixtures.ts index 4a4f9bd34..c68c3f6b6 100644 --- a/packages/issuance/test/tests/helpers/fixtures.ts +++ b/packages/issuance/test/tests/helpers/fixtures.ts @@ -87,7 +87,7 @@ async function deployServiceQualityOracle( await serviceQualityOracle.connect(governor).grantOperatorRole(governor.address) await serviceQualityOracle.connect(governor).setValidityPeriod(validityPeriod) // Now revoke the operator role from governor to ensure tests start with clean state - await serviceQualityOracle.connect(governor).revokeOperatorRole(governor.address) + await serviceQualityOracle.connect(governor).revokeRole(OPERATOR_ROLE, governor.address) } return serviceQualityOracle From 73d23bd0321b39cf926a85bfe55ccb404de3d7f2 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:14:29 +0100 Subject: [PATCH 08/28] Update packages/issuance/test/scripts/coverage Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/issuance/test/scripts/coverage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/issuance/test/scripts/coverage b/packages/issuance/test/scripts/coverage index 25d5277fe..1801adad6 100755 --- a/packages/issuance/test/scripts/coverage +++ b/packages/issuance/test/scripts/coverage @@ -3,7 +3,7 @@ set -eo pipefail # Build dependencies first -pnpm pnpm --filter @graphprotocol/contracts --filter @graphprotocol/issuance --filter @graphprotocol/sdk build +pnpm --filter @graphprotocol/contracts --filter @graphprotocol/issuance --filter @graphprotocol/sdk build # Run coverage from the parent issuance directory where contracts are local cd .. From e882dc87fd999b18f431ff2bdf20185832147a41 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers <50174308+RembrandtK@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:20:14 +0100 Subject: [PATCH 09/28] Update packages/issuance/contracts/quality/ServiceQualityOracle.sol Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/issuance/contracts/quality/ServiceQualityOracle.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/issuance/contracts/quality/ServiceQualityOracle.sol b/packages/issuance/contracts/quality/ServiceQualityOracle.sol index 3c7e5b82d..5c4c159e7 100644 --- a/packages/issuance/contracts/quality/ServiceQualityOracle.sol +++ b/packages/issuance/contracts/quality/ServiceQualityOracle.sol @@ -214,7 +214,7 @@ contract ServiceQualityOracle is BaseUpgradeable, IServiceQualityOracle { if (indexer != address(0) && $.allowedIndexerTimestamps[indexer] < blockTimestamp) { $.allowedIndexerTimestamps[indexer] = blockTimestamp; - emit IndexerAllowed(indexers[i], msg.sender); + emit IndexerAllowed(indexer, msg.sender); ++updatedCount; } } From 5ba76086c56e6344c54f78d9f12aeab6e7129928 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 4 Sep 2025 10:17:32 +0000 Subject: [PATCH 10/28] chore: cleaning files and versions --- natspec-smells.config.js | 22 - pnpm-lock.yaml | 573 ++++++++++++++++++------- pnpm-workspace.yaml | 6 +- remappings.txt | 2 - scripts/calculate-storage-locations.js | 93 ---- scripts/filter-natspec.js | 62 --- scripts/utils/storage-locations.js | 101 ----- scripts/verify-storage-slots.js | 315 -------------- 8 files changed, 422 insertions(+), 752 deletions(-) delete mode 100644 natspec-smells.config.js delete mode 100644 remappings.txt delete mode 100644 scripts/calculate-storage-locations.js delete mode 100755 scripts/filter-natspec.js delete mode 100644 scripts/utils/storage-locations.js delete mode 100755 scripts/verify-storage-slots.js diff --git a/natspec-smells.config.js b/natspec-smells.config.js deleted file mode 100644 index d333109a3..000000000 --- a/natspec-smells.config.js +++ /dev/null @@ -1,22 +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/common/contracts/**/*.sol'], - - root: './', - - // Disable @inheritdoc enforcement to avoid issues with storage getters and non-interface functions - enforceInheritdoc: false, - - constructorNatspec: true, -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d5a15ae9..bd783abe7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^9.28.0 version: 9.28.0 '@nomicfoundation/hardhat-ethers': - specifier: ^3.0.8 - version: 3.0.9 + specifier: ^3.1.0 + version: 3.1.0 '@nomicfoundation/hardhat-verify': specifier: ^2.0.10 version: 2.1.1 @@ -34,8 +34,8 @@ catalogs: specifier: ^6.15.0 version: 6.15.0 hardhat: - specifier: ^2.24.0 - version: 2.24.2 + specifier: ^2.26.0 + version: 2.26.3 hardhat-contract-sizer: specifier: ^2.10.0 version: 2.10.0 @@ -52,8 +52,8 @@ catalogs: specifier: ^0.45.0 version: 0.45.0 solhint: - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^6.0.1 + version: 6.0.1 typescript-eslint: specifier: ^8.33.1 version: 8.33.1 @@ -141,7 +141,7 @@ importers: version: 4.2.2(prettier@3.5.3) solhint: specifier: 'catalog:' - version: 6.0.0(typescript@5.8.3) + version: 6.0.1(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -184,7 +184,7 @@ importers: version: 3.5.3 solhint: specifier: 'catalog:' - version: 6.0.0(typescript@5.8.3) + version: 6.0.1(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -199,7 +199,7 @@ importers: version: 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@defi-wonderland/smock': specifier: ^2.4.1 - version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@ethersproject/abi': specifier: ^5.8.0 version: 5.8.0 @@ -223,16 +223,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.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^3.4.1 version: 3.4.2 @@ -241,13 +241,13 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -292,22 +292,22 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: 'catalog:' - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: 'catalog:' - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-secure-accounts: specifier: 'catalog:' - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-storage-layout: specifier: 'catalog:' - version: 0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) prettier: specifier: ^3.5.3 version: 3.5.3 @@ -316,10 +316,10 @@ importers: version: 2.0.0(prettier@3.5.3) solhint: specifier: 'catalog:' - version: 6.0.0(typescript@5.8.3) + version: 6.0.1(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) @@ -648,31 +648,31 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomiclabs/hardhat-ethers': specifier: ^2.0.2 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.2 - version: 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3) '@tenderly/hardhat-tenderly': specifier: ^1.0.13 - version: 1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/mocha': specifier: ^9.0.0 version: 9.1.1 @@ -702,19 +702,19 @@ importers: version: 1.2.5(solium@1.2.5) hardhat: specifier: 'catalog:' - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.2.0 - version: 2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.3 - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.4 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) husky: specifier: ^7.0.4 version: 7.0.4 @@ -735,10 +735,10 @@ importers: version: 2.0.0(prettier@3.5.3) solhint: specifier: 'catalog:' - version: 6.0.0(typescript@5.8.3) + version: 6.0.1(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) truffle-flattener: specifier: ^1.4.4 version: 1.6.0 @@ -763,10 +763,10 @@ importers: version: link:../common '@nomicfoundation/hardhat-ethers': specifier: 'catalog:' - version: 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': specifier: 'catalog:' - version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.3.0 version: 5.3.0 @@ -775,13 +775,13 @@ importers: version: 5.3.0(@openzeppelin/contracts@5.3.0) '@openzeppelin/hardhat-upgrades': specifier: ^3.9.0 - version: 3.9.1(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.9.1(@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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': specifier: ^0.5.0 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.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: 'catalog:' - 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.8.3))(typescript@5.8.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/node': specifier: ^20.17.50 version: 20.19.9 @@ -802,16 +802,16 @@ importers: version: 16.1.0 hardhat: specifier: 'catalog:' - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: 'catalog:' - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-secure-accounts: specifier: 'catalog:' - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-storage-layout: specifier: 'catalog:' - version: 0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) lint-staged: specifier: 16.0.0 version: 16.0.0 @@ -826,7 +826,7 @@ importers: version: 2.0.0(prettier@3.5.3) solhint: specifier: 'catalog:' - version: 6.0.0(typescript@5.8.3) + version: 6.0.1(typescript@5.8.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) @@ -860,19 +860,19 @@ importers: devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: 5.0.0 - version: 5.0.0(d805b92a490ff7e353d8006b7d043405) + version: 5.0.0(61d5f017e0083574a1beadf99c37b1b6) '@openzeppelin/contracts': specifier: ^5.3.0 version: 5.3.0 @@ -914,16 +914,16 @@ importers: version: 11.0.2 hardhat: specifier: 'catalog:' - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: 'catalog:' - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) prettier: specifier: ^3.5.3 version: 3.5.3 solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) @@ -953,10 +953,10 @@ importers: version: link:../contracts '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.9 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.3.4 version: 4.4.1(supports-color@9.4.0) @@ -965,10 +965,10 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: 'catalog:' - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) inquirer: specifier: ^8.0.0 version: 8.0.0 @@ -1063,13 +1063,13 @@ importers: version: 3.13.6(graphql-yoga@5.13.5(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^3.4.1 version: 3.4.2 @@ -1078,13 +1078,13 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/mocha': specifier: ^9.1.0 version: 9.1.1 @@ -1123,19 +1123,19 @@ importers: version: 5.13.5(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.0.1 - version: 2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.1 - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) inquirer: specifier: 8.0.0 version: 8.0.0 @@ -1156,10 +1156,10 @@ importers: version: 2.0.0(prettier@3.5.3) solhint: specifier: 'catalog:' - version: 6.0.0(typescript@5.8.3) + version: 6.0.1(typescript@5.8.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) @@ -3005,34 +3005,66 @@ packages: resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-arm64@0.11.3': + resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.11.0': resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.11.3': + resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': + resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.11.3': + resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.11.3': + resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.11.0': resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.11.3': + resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.11.3': + resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} + engines: {node: '>= 18'} + '@nomicfoundation/edr@0.11.0': resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} engines: {node: '>= 18'} + '@nomicfoundation/edr@0.11.3': + resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} + engines: {node: '>= 18'} + '@nomicfoundation/ethereumjs-rlp@5.0.4': resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} engines: {node: '>=18'} @@ -3061,6 +3093,12 @@ packages: ethers: ^6.14.0 hardhat: ^2.0.0 + '@nomicfoundation/hardhat-ethers@3.1.0': + resolution: {integrity: sha512-jx6fw3Ms7QBwFGT2MU6ICG292z0P81u6g54JjSV105+FbTZOF4FJqPksLfDybxkkOeq28eDxbqq7vpxRYyIlxA==} + peerDependencies: + ethers: ^6.14.0 + hardhat: ^2.26.0 + '@nomicfoundation/hardhat-foundry@1.2.0': resolution: {integrity: sha512-2AJQLcWnUk/iQqHDVnyOadASKFQKF1PhNtt1cONEQqzUPK+fqME1IbP+EKu+RkZTRcyc4xqUMaB0sutglKRITg==} peerDependencies: @@ -3645,6 +3683,9 @@ packages: '@solidity-parser/parser@0.20.1': resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} + '@solidity-parser/parser@0.20.2': + resolution: {integrity: sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==} + '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -6572,10 +6613,6 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} - engines: {node: '>=14.14'} - fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} @@ -6975,6 +7012,18 @@ packages: typescript: optional: true + hardhat@2.26.3: + resolution: {integrity: sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: ^5.8.3 + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} @@ -10447,8 +10496,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - solhint@6.0.0: - resolution: {integrity: sha512-PQGfwFqfeYdebi2tEG1fhVfMjqSzbW3Noz+LYf8UusKe5nkikCghdgEjYQPcGfFZj4snlVyJQt//AaxkubOtVQ==} + solhint@6.0.1: + resolution: {integrity: sha512-Lew5nhmkXqHPybzBzkMzvvWkpOJSSLTkfTZwRriWvfR2naS4YW2PsjVGaoX9tZFmHh7SuS+e2GEGo5FPYYmJ8g==} hasBin: true solidity-ast@0.4.60: @@ -13028,6 +13077,23 @@ snapshots: transitivePeerDependencies: - c-kzg + '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + lodash.isequalwith: 4.4.0 + rxjs: 7.8.2 + semver: 7.7.2 + transitivePeerDependencies: + - c-kzg + '@ensdomains/ens@0.4.5': dependencies: bluebird: 3.7.2 @@ -15281,18 +15347,32 @@ snapshots: '@nomicfoundation/edr-darwin-arm64@0.11.0': {} + '@nomicfoundation/edr-darwin-arm64@0.11.3': {} + '@nomicfoundation/edr-darwin-x64@0.11.0': {} + '@nomicfoundation/edr-darwin-x64@0.11.3': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': {} + '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} + '@nomicfoundation/edr-linux-arm64-musl@0.11.3': {} + '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.11.3': {} + '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.11.3': {} + '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.11.3': {} + '@nomicfoundation/edr@0.11.0': dependencies: '@nomicfoundation/edr-darwin-arm64': 0.11.0 @@ -15303,6 +15383,16 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.11.0 '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 + '@nomicfoundation/edr@0.11.3': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.11.3 + '@nomicfoundation/edr-darwin-x64': 0.11.3 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.3 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.3 + '@nomicfoundation/edr-linux-x64-musl': 0.11.3 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} '@nomicfoundation/ethereumjs-util@9.0.4': @@ -15310,57 +15400,66 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.1(supports-color@9.4.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-ethers@3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@9.4.0) ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) fs-extra: 10.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -15373,39 +15472,44 @@ snapshots: ethereumjs-util: 7.1.5 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@5.0.0(d805b92a490ff7e353d8006b7d043405)': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ethereumjs-util: 7.1.5 + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-toolbox@5.0.0(61d5f017e0083574a1beadf99c37b1b6)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.19.9 chai: 4.5.0 ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: 5.8.3 - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -15476,6 +15580,11 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 @@ -15492,21 +15601,45 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.4.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash: 4.17.21 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3)(utf-8-validate@5.0.10) + 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.8.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) '@npmcli/agent@2.2.2': dependencies: @@ -15609,9 +15742,25 @@ snapshots: - encoding - supports-color - '@openzeppelin/hardhat-upgrades@3.9.1(@nomicfoundation/hardhat-ethers@3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.1)(encoding@0.1.13) + '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.1)(encoding@0.1.13) + '@openzeppelin/upgrades-core': 1.44.1 + chalk: 4.1.2 + debug: 4.4.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + proper-lockfile: 4.1.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@openzeppelin/hardhat-upgrades@3.9.1(@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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) @@ -15620,11 +15769,11 @@ snapshots: debug: 4.4.1(supports-color@9.4.0) ethereumjs-util: 7.1.5 ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) proper-lockfile: 4.1.2 undici: 6.21.3 optionalDependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) transitivePeerDependencies: - aws-crt - encoding @@ -16231,6 +16380,8 @@ snapshots: '@solidity-parser/parser@0.20.1': {} + '@solidity-parser/parser@0.20.2': {} + '@szmarczak/http-timer@1.1.2': dependencies: defer-to-connect: 1.1.3 @@ -16261,13 +16412,13 @@ snapshots: transitivePeerDependencies: - debug - '@tenderly/hardhat-integration@1.1.1(@types/node@20.17.58)(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-integration@1.1.1(@types/node@20.17.58)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3) axios: 1.9.0(debug@4.4.1) dotenv: 16.5.0 fs-extra: 10.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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 @@ -16283,14 +16434,14 @@ snapshots: - supports-color - utf-8-validate - '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/upgrades-core': 1.44.1 - '@tenderly/hardhat-integration': 1.1.1(@types/node@20.17.58)(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@tenderly/hardhat-integration': 1.1.1(@types/node@20.17.58)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) dotenv: 16.5.0 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -16351,12 +16502,22 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))': dependencies: '@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.8.3))(typescript@5.8.3) ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) '@types/abstract-leveldown@7.2.5': {} @@ -16930,7 +17091,7 @@ snapshots: arbos-precompiles@1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -20458,12 +20619,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.3.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@4.0.3: dependencies: graceful-fs: 4.2.11 @@ -20945,6 +21100,12 @@ snapshots: delete-empty: 3.0.0 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-contract-sizer@2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: chalk: 4.1.2 @@ -20952,11 +21113,18 @@ snapshots: hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 - hardhat-contract-sizer@2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + hardhat-contract-sizer@2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + strip-ansi: 6.0.1 + + hardhat-contract-sizer@2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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): @@ -20990,7 +21158,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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-deploy@0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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 @@ -21010,7 +21178,7 @@ snapshots: debug: 4.4.1(supports-color@9.4.0) form-data: 3.0.3 fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) match-all: 1.2.7 murmur-128: 0.2.1 qs: 6.14.0 @@ -21031,11 +21199,23 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - 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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -21055,25 +21235,37 @@ snapshots: transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) debug: 4.4.1(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: 4.4.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + prompt-sync: 4.2.0 + transitivePeerDependencies: + - supports-color + + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + '@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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) debug: 4.4.1(supports-color@9.4.0) enquirer: 2.4.1 ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: @@ -21084,10 +21276,15 @@ snapshots: console-table-printer: 2.14.1 hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-storage-layout@0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + console-table-printer: 2.14.1 + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: console-table-printer: 2.14.1 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: @@ -21140,15 +21337,62 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/edr': 0.11.3 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.1(supports-color@9.4.0) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + micro-eth-signer: 0.14.0 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.1) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.14 + tsort: 0.0.1 + undici: 5.29.0 + 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.17.58)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.11.3 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.2.0 - '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -25310,9 +25554,9 @@ snapshots: transitivePeerDependencies: - debug - solhint@6.0.0(typescript@5.8.3): + solhint@6.0.1(typescript@5.8.3): dependencies: - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.20.2 ajv: 6.12.6 ajv-errors: 1.0.1(ajv@6.12.6) antlr4: 4.13.2 @@ -25322,7 +25566,6 @@ snapshots: commander: 10.0.1 cosmiconfig: 8.3.6(typescript@5.8.3) fast-diff: 1.3.0 - fs-extra: 11.3.0 glob: 8.1.0 ignore: 5.3.2 js-yaml: 4.1.0 @@ -25330,7 +25573,6 @@ 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: @@ -25363,7 +25605,30 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + dependencies: + '@ethersproject/abi': 5.8.0 + '@solidity-parser/parser': 0.20.1 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + jsonschema: 1.5.0 + lodash: 4.17.21 + mocha: 10.8.2 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.7.2 + shelljs: 0.8.5 + web3-utils: 1.10.4 + + solidity-coverage@0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.1 @@ -25374,7 +25639,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8c4c859cd..d8bea96e7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: catalog: '@eslint/js': ^9.28.0 '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 - '@nomicfoundation/hardhat-ethers': ^3.0.8 + '@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 @@ -28,7 +28,7 @@ catalog: eslint-plugin-no-only-tests: ^3.3.0 ethers: ^6.15.0 glob: ^11.0.1 - hardhat: ^2.24.0 + hardhat: ^2.26.0 hardhat-contract-sizer: ^2.10.0 hardhat-dependency-compiler: ^1.2.1 hardhat-gas-reporter: ^1.0.8 @@ -39,7 +39,7 @@ catalog: mocha: ^11.7.1 prettier: ^3.5.3 prettier-plugin-solidity: ^2.0.0 - solhint: ^6.0.0 + solhint: ^6.0.1 ts-node: ^10.9.2 typechain: ^8.3.2 typescript: ^5.8.3 diff --git a/remappings.txt b/remappings.txt deleted file mode 100644 index 52a63ec26..000000000 --- a/remappings.txt +++ /dev/null @@ -1,2 +0,0 @@ -@graphprotocol/common/=packages/common/ -@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/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/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-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() From 96f2fcbd5cb9c5773589f288e65e894523100d82 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 4 Sep 2025 10:25:15 +0000 Subject: [PATCH 11/28] fix(container): fixing pnpm cache and container build --- .devcontainer/Dockerfile | 2 -- .devcontainer/devcontainer.json | 4 +++- .devcontainer/docker-compose.yml | 5 +---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 221072795..a55122563 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -35,8 +35,6 @@ RUN pipx install solc-select && \ cp /root/.local/bin/solc-select /usr/local/bin/solc-select && \ chmod 755 /usr/local/bin/solc && \ chmod 755 /usr/local/bin/solc-select && \ - # Make sure pipx directory is accessible - chmod -R a+rx /root/.local/pipx && \ # Set up for vscode user mkdir -p /home/vscode/.solc-select && \ cp -r /root/.solc-select/* /home/vscode/.solc-select/ && \ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3d619eab0..577fa110c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,7 +12,9 @@ "ghcr.io/devcontainers/features/node:1": { "version": "20" }, - "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {} + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": { + "moby": false + } }, "postCreateCommand": ".devcontainer/project-setup.sh", "remoteUser": "vscode", diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 824bb9baf..a88c7da77 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -28,8 +28,7 @@ services: # pnpm cache is safe to share due to content-addressable storage - PNPM_HOME=/home/vscode/.local/share/pnpm - - PNPM_CACHE_DIR=/home/vscode/.cache/pnpm - + - PNPM_STORE_DIR=/home/vscode/.cache/pnpm/store # Note: NPM, Foundry, and Solidity caches are intentionally not set # to avoid cross-branch contamination. Tools will use their default locations. volumes: @@ -45,7 +44,6 @@ services: - vscode-bin:/home/vscode/.local/bin # Shared pnpm cache (safe due to content-addressable storage) - - pnpm-store:/home/vscode/.local/share/pnpm - pnpm-cache:/home/vscode/.cache/pnpm volumes: @@ -53,5 +51,4 @@ volumes: vscode-config: vscode-data: vscode-bin: - pnpm-store: pnpm-cache: From 092d2ba724527cb8268d696779ce4060d1b17c0b Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 4 Sep 2025 15:51:24 +0000 Subject: [PATCH 12/28] chore: updating TS code --- .../test/tests/ServiceQualityOracle.test.ts | 10 ++-- .../consolidated/InterfaceCompliance.test.ts | 3 +- .../issuance/test/tests/helpers/fixtures.ts | 60 ++++++++----------- .../{sharedFixtures.js => sharedFixtures.ts} | 50 ++++++++++++---- packages/issuance/test/tsconfig.json | 11 +--- 5 files changed, 71 insertions(+), 63 deletions(-) rename packages/issuance/test/tests/helpers/{sharedFixtures.js => sharedFixtures.ts} (65%) diff --git a/packages/issuance/test/tests/ServiceQualityOracle.test.ts b/packages/issuance/test/tests/ServiceQualityOracle.test.ts index 8ea096b5d..831c8d349 100644 --- a/packages/issuance/test/tests/ServiceQualityOracle.test.ts +++ b/packages/issuance/test/tests/ServiceQualityOracle.test.ts @@ -1,9 +1,9 @@ -const { time } = require('@nomicfoundation/hardhat-network-helpers') -const { expect } = require('chai') -const { ethers, upgrades } = require('hardhat') +import { time } from '@nomicfoundation/hardhat-network-helpers' +import { expect } from 'chai' +import { ethers, upgrades } from 'hardhat' -const { getTestAccounts, deployTestGraphToken, deployServiceQualityOracle } = require('./helpers/fixtures') -const { SHARED_CONSTANTS } = require('./helpers/sharedFixtures') +import { deployServiceQualityOracle, deployTestGraphToken, getTestAccounts } from './helpers/fixtures' +import { SHARED_CONSTANTS } from './helpers/sharedFixtures' // Role constants const GOVERNOR_ROLE = SHARED_CONSTANTS.GOVERNOR_ROLE diff --git a/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts b/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts index e64303dbd..c89f3e96e 100644 --- a/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts +++ b/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts @@ -4,9 +4,8 @@ import { ethers } from 'hardhat' import { shouldSupportERC165Interface } from '../../utils/testPatterns' import { deployServiceQualityOracle, deployTestGraphToken, getTestAccounts } from '../helpers/fixtures' - // Import generated interface IDs -const interfaceIds = require('../helpers/interfaceIds') +import interfaceIds from '../helpers/interfaceIds' /** * Consolidated ERC-165 Interface Compliance Tests diff --git a/packages/issuance/test/tests/helpers/fixtures.ts b/packages/issuance/test/tests/helpers/fixtures.ts index c68c3f6b6..229438591 100644 --- a/packages/issuance/test/tests/helpers/fixtures.ts +++ b/packages/issuance/test/tests/helpers/fixtures.ts @@ -1,25 +1,24 @@ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' import * as fs from 'fs' -import { ethers, upgrades } from 'hardhat' -/** - * Standard test accounts - */ -// TestAccounts interface converted to JSDoc for CommonJS -/** - * @typedef {Object} TestAccounts - * @property {SignerWithAddress} governor - * @property {SignerWithAddress} nonGovernor - * @property {SignerWithAddress} operator - * @property {SignerWithAddress} user - * @property {SignerWithAddress} indexer1 - * @property {SignerWithAddress} indexer2 - */ +const { ethers, upgrades } = require('hardhat') +const { SHARED_CONSTANTS } = require('./sharedFixtures') +const { OPERATOR_ROLE } = SHARED_CONSTANTS + +// Types +export interface TestAccounts { + governor: HardhatEthersSigner + nonGovernor: HardhatEthersSigner + operator: HardhatEthersSigner + user: HardhatEthersSigner + indexer1: HardhatEthersSigner + indexer2: HardhatEthersSigner +} /** * Get standard test accounts - * @returns {Promise} */ -async function getTestAccounts() { +export async function getTestAccounts(): Promise { const [governor, nonGovernor, operator, user, indexer1, indexer2] = await ethers.getSigners() return { @@ -35,9 +34,9 @@ async function getTestAccounts() { /** * Deploy a test GraphToken for testing * This uses the real GraphToken contract - * @returns {Promise} */ -async function deployTestGraphToken() { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function deployTestGraphToken(): Promise { // Get the governor account const [governor] = await ethers.getSigners() @@ -59,16 +58,16 @@ async function deployTestGraphToken() { /** * Deploy the ServiceQualityOracle contract with proxy using OpenZeppelin's upgrades library - * @param {string} graphToken - * @param {HardhatEthersSigner} governor - * @param {number} [validityPeriod=7 * 24 * 60 * 60] The validity period in seconds (default: 7 days) - * @returns {Promise} + * @param graphToken The Graph Token contract address + * @param governor The governor signer + * @param validityPeriod The validity period in seconds (default: 7 days) */ -async function deployServiceQualityOracle( - graphToken, - governor, - validityPeriod = 7 * 24 * 60 * 60, // 7 days in seconds -) { +export async function deployServiceQualityOracle( + graphToken: string, + governor: HardhatEthersSigner, + validityPeriod: number = 7 * 24 * 60 * 60, // 7 days in seconds + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): Promise { // Deploy implementation and proxy using OpenZeppelin's upgrades library const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') @@ -92,10 +91,3 @@ async function deployServiceQualityOracle( return serviceQualityOracle } - -// Export all functions and constants -module.exports = { - getTestAccounts, - deployTestGraphToken, - deployServiceQualityOracle, -} diff --git a/packages/issuance/test/tests/helpers/sharedFixtures.js b/packages/issuance/test/tests/helpers/sharedFixtures.ts similarity index 65% rename from packages/issuance/test/tests/helpers/sharedFixtures.js rename to packages/issuance/test/tests/helpers/sharedFixtures.ts index 4bd31ccd5..29d15411d 100644 --- a/packages/issuance/test/tests/helpers/sharedFixtures.js +++ b/packages/issuance/test/tests/helpers/sharedFixtures.ts @@ -3,10 +3,13 @@ * Reduces duplication of deployment and state management logic */ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' + const { ethers } = require('hardhat') const { getTestAccounts, deployTestGraphToken, deployServiceQualityOracle } = require('./fixtures') + // Shared test constants -const SHARED_CONSTANTS = { +export const SHARED_CONSTANTS = { PPM: 1_000_000, // Pre-calculated role constants to avoid repeated async calls @@ -14,17 +17,45 @@ const SHARED_CONSTANTS = { OPERATOR_ROLE: ethers.keccak256(ethers.toUtf8Bytes('OPERATOR_ROLE')), PAUSE_ROLE: ethers.keccak256(ethers.toUtf8Bytes('PAUSE_ROLE')), ORACLE_ROLE: ethers.keccak256(ethers.toUtf8Bytes('ORACLE_ROLE')), -} +} as const // Interface IDs -const INTERFACE_IDS = { +export const INTERFACE_IDS = { IERC165: '0x01ffc9a7', +} as const + +// Types +export interface TestAccounts { + governor: HardhatEthersSigner + nonGovernor: HardhatEthersSigner + operator: HardhatEthersSigner + user: HardhatEthersSigner + indexer1: HardhatEthersSigner + indexer2: HardhatEthersSigner +} + +export interface SharedContracts { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + graphToken: any + // eslint-disable-next-line @typescript-eslint/no-explicit-any + serviceQualityOracle: any +} + +export interface SharedAddresses { + graphToken: string + serviceQualityOracle: string +} + +export interface SharedFixtures { + accounts: TestAccounts + contracts: SharedContracts + addresses: SharedAddresses } /** * Shared contract deployment and setup */ -async function deploySharedContracts() { +export async function deploySharedContracts(): Promise { const accounts = await getTestAccounts() // Deploy base contracts @@ -34,7 +65,7 @@ async function deploySharedContracts() { const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) // Cache addresses - const addresses = { + const addresses: SharedAddresses = { graphToken: graphTokenAddress, serviceQualityOracle: await serviceQualityOracle.getAddress(), } @@ -54,7 +85,7 @@ async function deploySharedContracts() { * Reset contract state to initial conditions * Optimized to avoid redeployment while ensuring clean state */ -async function resetContractState(contracts, accounts) { +export async function resetContractState(contracts: SharedContracts, accounts: TestAccounts): Promise { const { serviceQualityOracle } = contracts // Reset ServiceQualityOracle state @@ -71,10 +102,3 @@ async function resetContractState(contracts, accounts) { console.warn('ServiceQualityOracle state reset failed:', error instanceof Error ? error.message : String(error)) } } - -module.exports = { - deploySharedContracts, - resetContractState, - SHARED_CONSTANTS, - INTERFACE_IDS, -} diff --git a/packages/issuance/test/tsconfig.json b/packages/issuance/test/tsconfig.json index 543ff61b9..8ef68dbf3 100644 --- a/packages/issuance/test/tsconfig.json +++ b/packages/issuance/test/tsconfig.json @@ -4,13 +4,6 @@ "outDir": "./build", "rootDir": "." }, - "include": [ - "tests/**/*", - "utils/**/*" - ], - "exclude": [ - "node_modules", - "build", - "scripts/**/*" - ] + "include": ["tests/**/*", "utils/**/*"], + "exclude": ["node_modules", "build", "scripts/**/*"] } From ab5b6fe84467d54a1b5c21a5d6f21f0a412aa5b7 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 17 Sep 2025 10:56:43 +0000 Subject: [PATCH 13/28] fix(container): improving caching and directory handling --- .devcontainer/README.md | 41 ++++++++++++++++- .devcontainer/devcontainer.json | 11 +++-- .devcontainer/docker-compose.yml | 14 +++--- .devcontainer/host-setup.sh | 75 +++++++++++++++++--------------- .devcontainer/project-setup.sh | 10 ----- .devcontainer/sample-graph.env | 12 ----- 6 files changed, 88 insertions(+), 75 deletions(-) delete mode 100644 .devcontainer/sample-graph.env diff --git a/.devcontainer/README.md b/.devcontainer/README.md index 73b33e9be..3091caa58 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -39,7 +39,25 @@ The container uses a conservative caching approach to prevent cache corruption i ## Setup Instructions -### Start the Dev Container +### Setup Instructions + +#### First-Time Setup (Required) + +**IMPORTANT**: Before starting any dev container, you must run the host setup script on your host machine: + +```bash +.devcontainer/host-setup.sh +``` + +This script: + +- Creates global Docker volumes like `global-pnpm-cache` that are shared across all dev containers +- Sets proper ownership (UID 1000:1000) for the vscode user inside containers +- Prevents permission denied errors when tools try to write to cache directories + +**Without running this script first, the dev container will fail with permission errors.** + +#### Start the Dev Container To start the dev container: @@ -53,6 +71,8 @@ When the container starts, the `project-setup.sh` script will automatically run - Configure Git to use SSH signing with your forwarded SSH key - Source shell customizations if available in PATH +**Note**: The `host-setup.sh` script is required to create the global pnpm cache volume with proper permissions. Without it, the dev container will fail with permission denied errors when pnpm tries to write to its cache directory. + ## Environment Variables Environment variables are defined in two places: @@ -74,11 +94,28 @@ These environment variables are needed for Git commit signing to work properly. ## Troubleshooting +### Permission Issues + +If you encounter "permission denied" errors when the dev container starts (especially with pnpm cache): + +1. **Run host setup first**: Make sure you've run `.devcontainer/host-setup.sh` on your host machine +2. **Fix existing volumes**: If you already have volumes with wrong permissions, run: + + ```bash + # Remove the problematic volume + docker volume rm global-pnpm-cache + + # Run host setup to recreate it with correct permissions + .devcontainer/host-setup.sh + ``` + +3. **Rebuild container**: After fixing volumes, rebuild your dev container + ### Cache Issues If you encounter build or compilation issues that seem related to cached artifacts: -1. **Rebuild the container**: This will start with fresh local caches +1. **Rebuild the container**: This rebuilds the container image but preserves Docker volume caches 2. **Clean project caches**: Run `pnpm clean` to clear project-specific build artifacts 3. **Clear node modules**: Delete `node_modules` and run `pnpm install` again diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 577fa110c..e8701c86f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,4 @@ { - "name": "graph contracts", "dockerComposeFile": ["docker-compose.yml"], "service": "dev-graph-contracts", "features": { @@ -8,7 +7,7 @@ "gitCredentialHelper": "cache" }, "ghcr.io/devcontainers/features/github-cli:1": {}, - "ghcr.io/devcontainers/features/common-utils:2.5.3": {}, + "ghcr.io/devcontainers/features/common-utils:2.5.4": {}, "ghcr.io/devcontainers/features/node:1": { "version": "20" }, @@ -16,14 +15,14 @@ "moby": false } }, + "workspaceFolder": "/work/${localWorkspaceFolderBasename}", + "mounts": [ + "source=${localWorkspaceFolder},target=/work/${localWorkspaceFolderBasename},type=bind,consistency=cached" + ], "postCreateCommand": ".devcontainer/project-setup.sh", "remoteUser": "vscode", - "workspaceFolder": "/work", "customizations": { "vscode": { - "settings": { - "terminal.integrated.cwd": "/work" - }, "extensions": [ "rust-lang.rust-analyzer", "tamasfe.even-better-toml", diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index a88c7da77..d599d281c 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -4,7 +4,6 @@ services: context: . dockerfile: Dockerfile user: vscode - working_dir: /work env_file: - /opt/configs/graphprotocol/contracts.env environment: @@ -32,23 +31,20 @@ services: # Note: NPM, Foundry, and Solidity caches are intentionally not set # to avoid cross-branch contamination. Tools will use their default locations. volumes: - - ..:/work - # Git repo root - /git:/git - # Local directories for user data (keep local to container) - - vscode-cache:/home/vscode/.cache + # Cached directories - vscode-config:/home/vscode/.config - vscode-data:/home/vscode/.local/share - vscode-bin:/home/vscode/.local/bin - - # Shared pnpm cache (safe due to content-addressable storage) - - pnpm-cache:/home/vscode/.cache/pnpm + - vscode-cache:/home/vscode/.cache + - global-pnpm-cache:/home/vscode/.cache/pnpm volumes: vscode-cache: vscode-config: vscode-data: vscode-bin: - pnpm-cache: + global-pnpm-cache: + external: true diff --git a/.devcontainer/host-setup.sh b/.devcontainer/host-setup.sh index b85093826..b979fe7ae 100755 --- a/.devcontainer/host-setup.sh +++ b/.devcontainer/host-setup.sh @@ -1,48 +1,51 @@ #!/usr/bin/env bash -# Host setup script for Graph Protocol Contracts dev container -# Run this script on the host before starting the dev container -# Usage: sudo .devcontainer/host-setup.sh +# Host setup script for creating global cache volumes +# Run this script to create shared cache volumes across all dev containers +# Usage: .devcontainer/host-setup.sh set -euo pipefail -echo "Setting up host environment for Graph Protocol Contracts dev container..." +echo "Setting up global cache volumes for dev containers..." -# Check if running as root -if [ "$(id -u)" -ne 0 ]; then - echo "Error: This script must be run as root (sudo)" >&2 - exit 1 -fi - -CACHE_DIRS=( - "/cache/vscode-cache" - "/cache/vscode-config" - "/cache/vscode-data" - "/cache/vscode-bin" - "/cache/hardhat" - "/cache/npm" - "/cache/yarn" - "/cache/pip" - "/cache/pycache" - "/cache/solidity" - "/cache/foundry" - "/cache/github" - "/cache/apt" - "/cache/apt-lib" +# Global cache volumes that should be shared across all projects +GLOBAL_VOLUMES=( + "global-pnpm-cache" + # Add other global caches here as needed + # "global-pip-cache" + # "global-npm-cache" ) -echo "Creating cache directories..." -for dir in "${CACHE_DIRS[@]}"; do - if [ ! -d "$dir" ]; then - echo "Creating $dir" - mkdir -p "$dir" - chmod 777 "$dir" +echo "Creating global cache volumes..." +for volume in "${GLOBAL_VOLUMES[@]}"; do + if docker volume inspect "$volume" >/dev/null 2>&1; then + echo "✓ $volume already exists" else - echo "$dir already exists" + echo "Creating $volume..." + docker volume create "$volume" + echo "✓ $volume created" fi done -# Note: Package-specific directories will be created by the project-setup.sh script -# inside the container, as they are tied to the project structure +echo "" +echo "Setting up proper ownership for cache volumes..." +# The vscode user in devcontainers typically has UID 1000 and GID 1000 +# We need to ensure the volumes have the correct ownership +for volume in "${GLOBAL_VOLUMES[@]}"; do + echo "Setting ownership for $volume..." + # Create a temporary container to fix ownership + docker run --rm \ + -v "$volume":/volume \ + --user root \ + mcr.microsoft.com/devcontainers/base:debian \ + chown -R 1000:1000 /volume + echo "✓ $volume ownership set to vscode user (1000:1000)" +done -echo "Host setup completed successfully!" -echo "You can now start or rebuild your dev container." +echo "" +echo "Global cache volumes setup completed!" +echo "These volumes will be shared across all dev containers that reference them." +echo "" +echo "Created volumes:" +for volume in "${GLOBAL_VOLUMES[@]}"; do + echo " - $volume" +done diff --git a/.devcontainer/project-setup.sh b/.devcontainer/project-setup.sh index 34fe59653..66d6c8728 100755 --- a/.devcontainer/project-setup.sh +++ b/.devcontainer/project-setup.sh @@ -11,16 +11,6 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" echo "Script directory: $SCRIPT_DIR" echo "Repository root: $REPO_ROOT" -# Set up local user directories with proper permissions -echo "Setting up local user directories..." - -# Ensure all user directories exist and have proper ownership -sudo mkdir -p /home/vscode/.cache /home/vscode/.config /home/vscode/.local/share /home/vscode/.local/bin -sudo chown -R vscode:vscode /home/vscode/.cache /home/vscode/.config /home/vscode/.local -sudo chmod -R 755 /home/vscode/.cache /home/vscode/.config /home/vscode/.local - -echo "User directories set up with proper permissions" - # Install project dependencies echo "Installing project dependencies..." if [ -f "$REPO_ROOT/package.json" ]; then diff --git a/.devcontainer/sample-graph.env b/.devcontainer/sample-graph.env deleted file mode 100644 index b6eab6144..000000000 --- a/.devcontainer/sample-graph.env +++ /dev/null @@ -1,12 +0,0 @@ -# Sample environment file for Graph Protocol contracts development -# Copy the Git settings below to your actual environment file at: -# /opt/configs/graphprotocol/contracts.env - -# Git settings for commit signing -# Add these settings if you want to enable Git commit signing -GIT_USER_NAME=Your Name -GIT_USER_EMAIL=your.email@example.com - -# Custom binary path -# Add this setting if you want to add a custom binary path to the PATH inside the container -# CONTAINER_BIN_PATH=/path/to/your/binaries From 1c4e557ab2ed86947479e27fd591fbb96dc0145d Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 17 Sep 2025 11:05:31 +0000 Subject: [PATCH 14/28] feat(build): removing obsolete .yarn/patches --- .../typechain-npm-8.3.2-b02e27439e.patch | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 .yarn/patches/typechain-npm-8.3.2-b02e27439e.patch diff --git a/.yarn/patches/typechain-npm-8.3.2-b02e27439e.patch b/.yarn/patches/typechain-npm-8.3.2-b02e27439e.patch deleted file mode 100644 index 386b90c80..000000000 --- a/.yarn/patches/typechain-npm-8.3.2-b02e27439e.patch +++ /dev/null @@ -1,56 +0,0 @@ -diff --git a/dist/typechain/io.js b/dist/typechain/io.js -index 725231a5ab1d8cc5f68a39ba730dddccf6a30f32..cfe0150aa07d09a32dd01c0670edb48d3c3786ce 100644 ---- a/dist/typechain/io.js -+++ b/dist/typechain/io.js -@@ -7,19 +7,25 @@ const path_1 = require("path"); - const outputTransformers_1 = require("../codegen/outputTransformers"); - const abiParser_1 = require("../parser/abiParser"); - const debug_1 = require("../utils/debug"); --function processOutput(services, cfg, output) { -+async function processOutput(services, cfg, output) { - const { fs, mkdirp } = services; - if (!output) { - return 0; - } - const outputFds = (0, lodash_1.isArray)(output) ? output : [output]; -- outputFds.forEach((fd) => { -+ for (const fd of outputFds) { - // ensure directory first - mkdirp((0, path_1.dirname)(fd.path)); -- const finalOutput = outputTransformers_1.outputTransformers.reduce((content, transformer) => transformer(content, services, cfg), fd.contents); -+ let finalOutput = outputTransformers_1.outputTransformers.reduce((content, transformer) => transformer(content, services, cfg), fd.contents); -+ -+ // If finalOutput is a Promise, await it -+ if (finalOutput && typeof finalOutput.then === 'function') { -+ finalOutput = await finalOutput; -+ } -+ - (0, debug_1.debug)(`Writing file: ${(0, path_1.relative)(cfg.cwd, fd.path)}`); - fs.writeFileSync(fd.path, finalOutput, 'utf8'); -- }); -+ } - return outputFds.length; - } - exports.processOutput = processOutput; -diff --git a/dist/typechain/runTypeChain.js b/dist/typechain/runTypeChain.js -index a5adce89148c1edd2bcdafe2d01d9a66ca2b57e4..b731c472b496c7639ffc531ffedd6b479b52d7f5 100644 ---- a/dist/typechain/runTypeChain.js -+++ b/dist/typechain/runTypeChain.js -@@ -62,14 +62,14 @@ async function runTypeChain(publicConfig) { - const target = (0, findTarget_1.findTarget)(config); - const fileDescriptions = (0, io_1.loadFileDescriptions)(services, config.filesToProcess); - (0, debug_1.debug)('Executing beforeRun()'); -- filesGenerated += (0, io_1.processOutput)(services, config, await target.beforeRun()); -+ filesGenerated += await (0, io_1.processOutput)(services, config, await target.beforeRun()); - (0, debug_1.debug)('Executing beforeRun()'); - for (const fd of fileDescriptions) { - (0, debug_1.debug)(`Processing ${(0, path_1.relative)(config.cwd, fd.path)}`); -- filesGenerated += (0, io_1.processOutput)(services, config, await target.transformFile(fd)); -+ filesGenerated += await (0, io_1.processOutput)(services, config, await target.transformFile(fd)); - } - (0, debug_1.debug)('Running afterRun()'); -- filesGenerated += (0, io_1.processOutput)(services, config, await target.afterRun()); -+ filesGenerated += await (0, io_1.processOutput)(services, config, await target.afterRun()); - return { - filesGenerated, - }; From c22bddc39b7c5a0e71de14d8213b76acb91cb7e3 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 17 Sep 2025 15:20:58 +0000 Subject: [PATCH 15/28] feat: renaming Service Quality Oracle to Rewards Eligibility Oracle --- .../quality/IRewardsEligibilityOracle.sol | 17 + .../quality/IServiceQualityOracle.sol | 17 - .../contracts/rewards/IRewardsManager.sol | 6 +- .../contracts/rewards/RewardsManager.sol | 45 +- .../rewards/RewardsManagerStorage.sol | 6 +- .../tests/MockERC165OnlyContract.sol | 2 +- ...e.sol => MockRewardsEligibilityOracle.sol} | 33 +- .../test/tests/unit/rewards/rewards.test.ts | 96 +-- ...yOracle.md => RewardsEligibilityOracle.md} | 110 +-- .../quality/RewardsEligibilityOracle.sol | 282 ++++++++ .../quality/ServiceQualityOracle.sol | 291 -------- .../contracts/test/InterfaceIdExtractor.sol | 8 +- .../test/scripts/generateInterfaceIds.js | 2 +- .../tests/RewardsEligibilityOracle.test.ts | 652 ++++++++++++++++++ .../test/tests/ServiceQualityOracle.test.ts | 630 ----------------- .../tests/consolidated/AccessControl.test.ts | 60 +- .../consolidated/InterfaceCompliance.test.ts | 18 +- .../issuance/test/tests/helpers/fixtures.ts | 28 +- .../test/tests/helpers/interfaceIds.js | 2 +- .../test/tests/helpers/sharedFixtures.ts | 28 +- 20 files changed, 1177 insertions(+), 1156 deletions(-) create mode 100644 packages/common/contracts/quality/IRewardsEligibilityOracle.sol delete mode 100644 packages/common/contracts/quality/IServiceQualityOracle.sol rename packages/contracts/contracts/tests/{MockServiceQualityOracle.sol => MockRewardsEligibilityOracle.sol} (52%) rename packages/issuance/contracts/quality/{ServiceQualityOracle.md => RewardsEligibilityOracle.md} (60%) create mode 100644 packages/issuance/contracts/quality/RewardsEligibilityOracle.sol delete mode 100644 packages/issuance/contracts/quality/ServiceQualityOracle.sol create mode 100644 packages/issuance/test/tests/RewardsEligibilityOracle.test.ts delete mode 100644 packages/issuance/test/tests/ServiceQualityOracle.test.ts diff --git a/packages/common/contracts/quality/IRewardsEligibilityOracle.sol b/packages/common/contracts/quality/IRewardsEligibilityOracle.sol new file mode 100644 index 000000000..907dad561 --- /dev/null +++ b/packages/common/contracts/quality/IRewardsEligibilityOracle.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.7.6 || ^0.8.0; + +/** + * @title IRewardsEligibilityOracle + * @author Edge & Node + * @notice Interface to check if an indexer is eligible to receive rewards + */ +interface IRewardsEligibilityOracle { + /** + * @notice Check if an indexer is eligible to receive rewards + * @param indexer Address of the indexer + * @return True if the indexer is eligible to receive rewards, false otherwise + */ + function isEligible(address indexer) external view returns (bool); +} diff --git a/packages/common/contracts/quality/IServiceQualityOracle.sol b/packages/common/contracts/quality/IServiceQualityOracle.sol deleted file mode 100644 index ec86b8c87..000000000 --- a/packages/common/contracts/quality/IServiceQualityOracle.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -pragma solidity ^0.7.6 || ^0.8.0; - -/** - * @title IServiceQualityOracle - * @author Edge & Node - * @notice Interface to check if an indexer is allowed to receive rewards based on its service quality - */ -interface IServiceQualityOracle { - /** - * @notice Check if an indexer is allowed to receive rewards - * @param indexer Address of the indexer - * @return True if the indexer is allowed to receive rewards, false otherwise - */ - function isAllowed(address indexer) external view returns (bool); -} diff --git a/packages/common/contracts/rewards/IRewardsManager.sol b/packages/common/contracts/rewards/IRewardsManager.sol index c2518d5c8..6338b4f96 100644 --- a/packages/common/contracts/rewards/IRewardsManager.sol +++ b/packages/common/contracts/rewards/IRewardsManager.sol @@ -38,10 +38,10 @@ interface IRewardsManager { function setMinimumSubgraphSignal(uint256 _minimumSubgraphSignal) external; /** - * @notice Set the service quality oracle address - * @param newServiceQualityOracle The address of the service quality oracle + * @notice Set the rewards eligibility oracle address + * @param newRewardsEligibilityOracle The address of the rewards eligibility oracle */ - function setServiceQualityOracle(address newServiceQualityOracle) external; + function setRewardsEligibilityOracle(address newRewardsEligibilityOracle) external; // -- Denylist -- diff --git a/packages/contracts/contracts/rewards/RewardsManager.sol b/packages/contracts/contracts/rewards/RewardsManager.sol index a02c46625..ca1cfe847 100644 --- a/packages/contracts/contracts/rewards/RewardsManager.sol +++ b/packages/contracts/contracts/rewards/RewardsManager.sol @@ -17,7 +17,7 @@ import { IStaking, IStakingBase } from "../staking/IStaking.sol"; import { RewardsManagerV5Storage } from "./RewardsManagerStorage.sol"; import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; -import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; /** * @title Rewards Manager Contract @@ -65,12 +65,12 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa event RewardsDenied(address indexed indexer, address indexed allocationID, uint256 epoch); /** - * @notice Emitted when rewards are denied to an indexer due to service quality + * @notice Emitted when rewards are denied to an indexer due to eligibility * @param indexer Address of the indexer being denied rewards * @param allocationID Address of the allocation being denied rewards * @param amount Amount of rewards that would have been assigned */ - event RewardsDeniedDueToServiceQuality(address indexed indexer, address indexed allocationID, uint256 amount); + event RewardsDeniedDueToEligibility(address indexed indexer, address indexed allocationID, uint256 amount); /** * @notice Emitted when a subgraph is denied for claiming rewards @@ -80,11 +80,14 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa event RewardsDenylistUpdated(bytes32 indexed subgraphDeploymentID, uint256 sinceBlock); /** - * @notice Emitted when the service quality oracle contract is set - * @param oldServiceQualityOracle Previous service quality oracle address - * @param newServiceQualityOracle New service quality oracle address + * @notice Emitted when the rewards eligibility oracle contract is set + * @param oldRewardsEligibilityOracle Previous rewards eligibility oracle address + * @param newRewardsEligibilityOracle New rewards eligibility oracle address */ - event ServiceQualityOracleSet(address indexed oldServiceQualityOracle, address indexed newServiceQualityOracle); + event RewardsEligibilityOracleSet( + address indexed oldRewardsEligibilityOracle, + address indexed newRewardsEligibilityOracle + ); // -- Modifiers -- @@ -154,23 +157,23 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa /** * @inheritdoc IRewardsManager - * @dev Note that the service quality oracle can be set to the zero address to disable use of an oracle, in - * which case no indexers will be denied rewards due to service quality. + * @dev Note that the rewards eligibility oracle can be set to the zero address to disable use of an oracle, in + * which case no indexers will be denied rewards due to eligibility. */ - function setServiceQualityOracle(address newServiceQualityOracle) external override onlyGovernor { - if (address(serviceQualityOracle) != newServiceQualityOracle) { - // Check that the contract supports the IServiceQualityOracle interface + function setRewardsEligibilityOracle(address newRewardsEligibilityOracle) external override onlyGovernor { + if (address(rewardsEligibilityOracle) != newRewardsEligibilityOracle) { + // Check that the contract supports the IRewardsEligibilityOracle interface // Allow zero address to disable the oracle - if (newServiceQualityOracle != address(0)) { + if (newRewardsEligibilityOracle != address(0)) { require( - IERC165(newServiceQualityOracle).supportsInterface(type(IServiceQualityOracle).interfaceId), - "Contract does not support IServiceQualityOracle interface" + IERC165(newRewardsEligibilityOracle).supportsInterface(type(IRewardsEligibilityOracle).interfaceId), + "Contract does not support IRewardsEligibilityOracle interface" ); } - address oldServiceQualityOracle = address(serviceQualityOracle); - serviceQualityOracle = IServiceQualityOracle(newServiceQualityOracle); - emit ServiceQualityOracleSet(oldServiceQualityOracle, newServiceQualityOracle); + address oldRewardsEligibilityOracle = address(rewardsEligibilityOracle); + rewardsEligibilityOracle = IRewardsEligibilityOracle(newRewardsEligibilityOracle); + emit RewardsEligibilityOracleSet(oldRewardsEligibilityOracle, newRewardsEligibilityOracle); } } @@ -376,9 +379,9 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // Calculate rewards accrued by this allocation uint256 rewards = _calcRewards(alloc.tokens, alloc.accRewardsPerAllocatedToken, accRewardsPerAllocatedToken); - // Do not reward if indexer is not eligible based on service quality - if (address(serviceQualityOracle) != address(0) && !serviceQualityOracle.isAllowed(alloc.indexer)) { - emit RewardsDeniedDueToServiceQuality(alloc.indexer, _allocationID, rewards); + // Do not reward if indexer is not eligible based on rewards eligibility + if (address(rewardsEligibilityOracle) != address(0) && !rewardsEligibilityOracle.isEligible(alloc.indexer)) { + emit RewardsDeniedDueToEligibility(alloc.indexer, _allocationID, rewards); return 0; } diff --git a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol index 7d7f1e5c6..19f3efa07 100644 --- a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol +++ b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol @@ -6,7 +6,7 @@ pragma solidity 0.7.6; import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; import { IRewardsIssuer } from "./IRewardsIssuer.sol"; -import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; import { Managed } from "../governance/Managed.sol"; /** @@ -72,6 +72,6 @@ contract RewardsManagerV4Storage is RewardsManagerV3Storage { contract RewardsManagerV5Storage is RewardsManagerV4Storage { /// @notice Address of the subgraph service IRewardsIssuer public subgraphService; - /// @notice Address of the service quality oracle contract - IServiceQualityOracle public serviceQualityOracle; + /// @notice Address of the rewards eligibility oracle contract + IRewardsEligibilityOracle public rewardsEligibilityOracle; } diff --git a/packages/contracts/contracts/tests/MockERC165OnlyContract.sol b/packages/contracts/contracts/tests/MockERC165OnlyContract.sol index 478ecb795..5adace380 100644 --- a/packages/contracts/contracts/tests/MockERC165OnlyContract.sol +++ b/packages/contracts/contracts/tests/MockERC165OnlyContract.sol @@ -7,7 +7,7 @@ import { ERC165 } from "@openzeppelin/contracts/introspection/ERC165.sol"; /** * @title MockERC165OnlyContract * @author Edge & Node - * @notice A mock contract that supports ERC-165 but not IServiceQualityOracle + * @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 { diff --git a/packages/contracts/contracts/tests/MockServiceQualityOracle.sol b/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol similarity index 52% rename from packages/contracts/contracts/tests/MockServiceQualityOracle.sol rename to packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol index 200037075..ebd8579f4 100644 --- a/packages/contracts/contracts/tests/MockServiceQualityOracle.sol +++ b/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol @@ -2,18 +2,18 @@ pragma solidity 0.7.6; -import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; import { ERC165 } from "@openzeppelin/contracts/introspection/ERC165.sol"; /** - * @title MockServiceQualityOracle + * @title MockRewardsEligibilityOracle * @author Edge & Node - * @notice A simple mock contract for the ServiceQualityOracle interface - * @dev A simple mock contract for the ServiceQualityOracle interface + * @notice A simple mock contract for the RewardsEligibilityOracle interface + * @dev A simple mock contract for the RewardsEligibilityOracle interface */ -contract MockServiceQualityOracle is IServiceQualityOracle, ERC165 { - /// @dev Mapping to store allowed status for each indexer - mapping(address => bool) private _allowed; +contract MockRewardsEligibilityOracle is IRewardsEligibilityOracle, ERC165 { + /// @dev Mapping to store eligibility status for each indexer + mapping(address => bool) private _eligible; /// @dev Mapping to track which indexers have been explicitly set mapping(address => bool) private _isSet; @@ -23,19 +23,20 @@ contract MockServiceQualityOracle is IServiceQualityOracle, ERC165 { /** * @notice Constructor - * @param defaultResponse Default response for isAllowed + * @param defaultResponse Default response for isEligible */ constructor(bool defaultResponse) { _defaultResponse = defaultResponse; } /** - * @notice Set whether a specific indexer is allowed + * @notice Set whether a specific indexer is eligible * @param indexer The indexer address - * @param allowed Whether the indexer is allowed + * @param eligible Whether the indexer is eligible */ - function setIndexerAllowed(address indexer, bool allowed) external { - _allowed[indexer] = allowed; + function setIndexerEligible(address indexer, bool eligible) external { + _eligible[indexer] = eligible; + _isSet[indexer] = true; } /** @@ -47,12 +48,12 @@ contract MockServiceQualityOracle is IServiceQualityOracle, ERC165 { } /** - * @inheritdoc IServiceQualityOracle + * @inheritdoc IRewardsEligibilityOracle */ - function isAllowed(address indexer) external view override returns (bool) { + function isEligible(address indexer) external view override returns (bool) { // If the indexer has been explicitly set, return that value if (_isSet[indexer]) { - return _allowed[indexer]; + return _eligible[indexer]; } // Otherwise return the default response @@ -63,6 +64,6 @@ contract MockServiceQualityOracle is IServiceQualityOracle, ERC165 { * @inheritdoc ERC165 */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IServiceQualityOracle).interfaceId || super.supportsInterface(interfaceId); + return interfaceId == type(IRewardsEligibilityOracle).interfaceId || super.supportsInterface(interfaceId); } } diff --git a/packages/contracts/test/tests/unit/rewards/rewards.test.ts b/packages/contracts/test/tests/unit/rewards/rewards.test.ts index 42cd12e4b..704148476 100644 --- a/packages/contracts/test/tests/unit/rewards/rewards.test.ts +++ b/packages/contracts/test/tests/unit/rewards/rewards.test.ts @@ -190,79 +190,79 @@ describe('Rewards', () => { }) }) - describe('service quality oracle', function () { - it('should reject setServiceQualityOracle if unauthorized', async function () { - const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( - 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + describe('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 MockServiceQualityOracleFactory.deploy(true) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) await mockOracle.deployed() - const tx = rewardsManager.connect(indexer1).setServiceQualityOracle(mockOracle.address) + const tx = rewardsManager.connect(indexer1).setRewardsEligibilityOracle(mockOracle.address) await expect(tx).revertedWith('Only Controller governor') }) - it('should set service quality oracle if governor', async function () { - const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( - 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + it('should set rewards eligibility oracle if governor', async function () { + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', ) - const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) await mockOracle.deployed() - const tx = rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) await expect(tx) - .emit(rewardsManager, 'ServiceQualityOracleSet') + .emit(rewardsManager, 'RewardsEligibilityOracleSet') .withArgs(constants.AddressZero, mockOracle.address) - expect(await rewardsManager.serviceQualityOracle()).eq(mockOracle.address) + expect(await rewardsManager.rewardsEligibilityOracle()).eq(mockOracle.address) }) - it('should allow setting service quality oracle to zero address', async function () { + it('should allow setting rewards eligibility oracle to zero address', async function () { // First set an oracle - const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( - 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', ) - const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) await mockOracle.deployed() - await rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) // Then set to zero address to disable - const tx = rewardsManager.connect(governor).setServiceQualityOracle(constants.AddressZero) + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(constants.AddressZero) await expect(tx) - .emit(rewardsManager, 'ServiceQualityOracleSet') + .emit(rewardsManager, 'RewardsEligibilityOracleSet') .withArgs(mockOracle.address, constants.AddressZero) - expect(await rewardsManager.serviceQualityOracle()).eq(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 service quality oracle - const tx = rewardsManager.connect(governor).setServiceQualityOracle(indexer1.address) + // 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 IServiceQualityOracle interface', async function () { - // Deploy a contract that doesn't support the IServiceQualityOracle interface + 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).setServiceQualityOracle(mockContract.address) - await expect(tx).revertedWith('Contract does not support IServiceQualityOracle interface') + 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 MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( - 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + const MockRewardsEligibilityOracleFactory = await hre.ethers.getContractFactory( + 'contracts/tests/MockRewardsEligibilityOracle.sol:MockRewardsEligibilityOracle', ) - const mockOracle = await MockServiceQualityOracleFactory.deploy(true) + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) await mockOracle.deployed() - await rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) // Setting the same oracle again should not emit an event - const tx = rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) - await expect(tx).to.not.emit(rewardsManager, 'ServiceQualityOracleSet') + const tx = rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) + await expect(tx).to.not.emit(rewardsManager, 'RewardsEligibilityOracleSet') }) }) @@ -897,16 +897,16 @@ describe('Rewards', () => { .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch()) }) - it('should deny rewards due to service quality oracle', async function () { - // Setup service quality oracle that denies rewards for indexer1 - const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( - 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + it('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 MockServiceQualityOracleFactory.deploy(false) // Default to deny + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(false) // Default to deny await mockOracle.deployed() - // Set the service quality oracle - await rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + // Set the rewards eligibility oracle + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) // Align with the epoch boundary await helpers.mineEpoch(epochManager) @@ -923,20 +923,20 @@ describe('Rewards', () => { // Close allocation. At this point rewards should be denied due to service quality const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) await expect(tx) - .emit(rewardsManager, 'RewardsDeniedDueToServiceQuality') + .emit(rewardsManager, 'RewardsDeniedDueToEligibility') .withArgs(indexer1.address, allocationID1, expectedIndexingRewards) }) - it('should allow rewards when service quality oracle approves', async function () { - // Setup service quality oracle that allows rewards for indexer1 - const MockServiceQualityOracleFactory = await hre.ethers.getContractFactory( - 'contracts/tests/MockServiceQualityOracle.sol:MockServiceQualityOracle', + it('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 MockServiceQualityOracleFactory.deploy(true) // Default to allow + const mockOracle = await MockRewardsEligibilityOracleFactory.deploy(true) // Default to allow await mockOracle.deployed() - // Set the service quality oracle - await rewardsManager.connect(governor).setServiceQualityOracle(mockOracle.address) + // Set the rewards eligibility oracle + await rewardsManager.connect(governor).setRewardsEligibilityOracle(mockOracle.address) // Align with the epoch boundary await helpers.mineEpoch(epochManager) diff --git a/packages/issuance/contracts/quality/ServiceQualityOracle.md b/packages/issuance/contracts/quality/RewardsEligibilityOracle.md similarity index 60% rename from packages/issuance/contracts/quality/ServiceQualityOracle.md rename to packages/issuance/contracts/quality/RewardsEligibilityOracle.md index c669dd765..c9f9b2010 100644 --- a/packages/issuance/contracts/quality/ServiceQualityOracle.md +++ b/packages/issuance/contracts/quality/RewardsEligibilityOracle.md @@ -1,17 +1,17 @@ -# ServiceQualityOracle +# RewardsEligibilityOracle -The ServiceQualityOracle is a smart contract that manages indexer eligibility for receiving rewards based on service quality assessments. It implements a time-based allowlist system where indexers must be explicitly approved by authorized oracles to receive rewards. +The RewardsEligibilityOracle is a smart contract that manages indexer eligibility for receiving rewards. It implements a time-based eligibility system where indexers must be explicitly marked as eligible by authorized oracles to receive rewards. ## Overview -The contract operates on a "deny by default" principle - all indexers are initially ineligible for rewards until they are explicitly allowed by an authorized oracle. Once allowed, indexers remain eligible for a configurable period before their eligibility expires and they need to be re-approved. +The contract operates on a "deny by default" principle - all indexers are initially ineligible for rewards until their eligibility is explicitly renewed by an authorized oracle. Once eligibility is renewed, indexers remain eligible for a configurable period before their eligibility expires and needs to be renewed again. ## Key Features -- **Time-based Eligibility**: Indexers are allowed for a configurable period (default: 14 days) -- **Oracle-based Approval**: Only authorized oracles can approve indexers -- **Global Toggle**: Quality checking can be globally enabled/disabled -- **Timeout Mechanism**: If oracles don't update for too long, all indexers are automatically allowed +- **Time-based Eligibility**: Indexers are eligible for a configurable period (default: 14 days) +- **Oracle-based Renewal**: Only authorized oracles can renew indexer eligibility +- **Global Toggle**: Eligibility validation can be globally enabled/disabled +- **Timeout Mechanism**: If oracles don't update for too long, all indexers are automatically eligible - **Role-based Access Control**: Uses hierarchical roles for governance and operations ## Architecture @@ -29,10 +29,10 @@ The contract uses four main roles: The contract uses ERC-7201 namespaced storage to prevent storage collisions in upgradeable contracts: -- `allowedIndexerTimestamps`: Maps indexer addresses to their last approval timestamp -- `allowedPeriod`: Duration (in seconds) for which approval lasts (default: 14 days) -- `checkingActive`: Global flag to enable/disable quality checking (default: false, to be enabled by operator when ready) -- `oracleUpdateTimeout`: Timeout after which all indexers are automatically allowed (default: 7 days) +- `eligibleIndexerTimestamps`: Maps indexer addresses to their last eligibility timestamp +- `eligibilityPeriod`: Duration (in seconds) for which eligibility lasts (default: 14 days) +- `eligibilityValidationEnabled`: Global flag to enable/disable eligibility validation (default: false, to be enabled by operator when ready) +- `oracleUpdateTimeout`: Timeout after which all indexers are automatically eligible (default: 7 days) - `lastOracleUpdateTime`: Timestamp of the last oracle update ## Core Functions @@ -49,43 +49,43 @@ The `ORACLE_ROLE` constant can be used as the role parameter for these functions ### Configuration -#### `setAllowedPeriod(uint256 allowedPeriod) → bool` +#### `setEligibilityPeriod(uint256 eligibilityPeriod) → bool` - **Access**: OPERATOR_ROLE only -- **Purpose**: Set how long indexer approvals last -- **Parameters**: `allowedPeriod` - Duration in seconds +- **Purpose**: Set how long indexer eligibility lasts +- **Parameters**: `eligibilityPeriod` - Duration in seconds - **Returns**: Always true for current implementation -- **Events**: Emits `AllowedPeriodUpdated` if value changes +- **Events**: Emits `EligibilityPeriodUpdated` if value changes #### `setOracleUpdateTimeout(uint256 oracleUpdateTimeout) → bool` - **Access**: OPERATOR_ROLE only -- **Purpose**: Set timeout after which all indexers are automatically allowed +- **Purpose**: Set timeout after which all indexers are automatically eligible - **Parameters**: `oracleUpdateTimeout` - Timeout duration in seconds - **Returns**: Always true for current implementation - **Events**: Emits `OracleUpdateTimeoutUpdated` if value changes -#### `setQualityChecking(bool enabled) → bool` +#### `setEligibilityValidation(bool enabled) → bool` - **Access**: OPERATOR_ROLE only -- **Purpose**: Enable or disable quality checking globally +- **Purpose**: Enable or disable eligibility validation globally - **Parameters**: `enabled` - True to enable, false to disable - **Returns**: Always true for current implementation -- **Events**: Emits `QualityCheckingUpdated` if state changes +- **Events**: Emits `EligibilityValidationUpdated` if state changes ### Indexer Management -#### `allowIndexers(address[] calldata indexers, bytes calldata data) → uint256` +#### `renewIndexerEligibility(address[] calldata indexers, bytes calldata data) → uint256` - **Access**: ORACLE_ROLE only -- **Purpose**: Approve indexers for rewards +- **Purpose**: Renew eligibility for indexers to receive rewards - **Parameters**: - `indexers` - Array of indexer addresses (zero addresses ignored) - `data` - Arbitrary calldata for future extensions -- **Returns**: Number of indexers whose timestamp was updated +- **Returns**: Number of indexers whose eligibility renewal timestamp was updated - **Events**: - - Emits `IndexerQualityData` with oracle and data - - Emits `IndexerAllowed` for each newly allowed indexer + - Emits `IndexerEligibilityData` with oracle and data + - Emits `IndexerEligibilityRenewed` for each indexer whose eligibility was renewed - **Notes**: - Updates `lastOracleUpdateTime` to current block timestamp - Only updates timestamp if less than current block timestamp @@ -93,28 +93,28 @@ The `ORACLE_ROLE` constant can be used as the role parameter for these functions ### View Functions -#### `isAllowed(address indexer) → bool` +#### `isEligible(address indexer) → bool` - **Purpose**: Check if an indexer is eligible for rewards - **Logic**: - 1. If quality checking is disabled → return true + 1. If eligibility validation is disabled → return true 2. If oracle timeout exceeded → return true - 3. Otherwise → check if indexer's approval is still valid -- **Returns**: True if indexer is allowed, false otherwise + 3. Otherwise → check if indexer's eligibility is still valid +- **Returns**: True if indexer is eligible, false otherwise #### `isAuthorizedOracle(address oracle) → bool` - **Purpose**: Check if an address has oracle privileges - **Returns**: True if address has ORACLE_ROLE -#### `getLastAllowedTime(address indexer) → uint256` +#### `getEligibilityRenewalTime(address indexer) → uint256` -- **Purpose**: Get the timestamp when indexer was last approved -- **Returns**: Timestamp or 0 if never approved +- **Purpose**: Get the timestamp when indexer's eligibility was last renewed +- **Returns**: Timestamp or 0 if eligibility was never renewed -#### `getAllowedPeriod() → uint256` +#### `getEligibilityPeriod() → uint256` -- **Purpose**: Get the current allowed period +- **Purpose**: Get the current eligibility period - **Returns**: Duration in seconds #### `getOracleUpdateTimeout() → uint256` @@ -127,24 +127,24 @@ The `ORACLE_ROLE` constant can be used as the role parameter for these functions - **Purpose**: Get when oracles last updated - **Returns**: Timestamp of last oracle update -#### `isQualityCheckingActive() → bool` +#### `getEligibilityValidation() → bool` -- **Purpose**: Check if quality checking is enabled -- **Returns**: True if active, false if disabled +- **Purpose**: Get eligibility validation state +- **Returns**: True if enabled, false if disabled ## Eligibility Logic -An indexer is considered allowed if ANY of the following conditions are met: +An indexer is considered eligible if ANY of the following conditions are met: -1. **Valid approval** (`block.timestamp <= allowedIndexerTimestamps[indexer] + allowedPeriod`) +1. **Valid eligibility** (`block.timestamp <= indexerEligibilityTimestamps[indexer] + eligibilityPeriod`) 2. **Oracle timeout exceeded** (`lastOracleUpdateTime + oracleUpdateTimeout < block.timestamp`) -3. **Quality checking is disabled** (`checkingActive = false`) +3. **Eligibility validation is disabled** (`eligibilityValidationEnabled = false`) This design ensures that: - The system fails open if oracles stop updating -- Operators can disable quality checking entirely if needed -- Individual indexer approvals have time limits +- Operators can disable eligibility validation entirely if needed +- Individual indexer eligibility has time limits In normal operation, the first condition is expected to be the only one that applies. The other two conditions provide fail-safes for oracle failures, or in extreme cases an operator override. For normal operational failure of oracles, the system gracefully degrades into a "allow all" mode. This mechanism is not perfect in that oracles could still be updating but allowing far fewer indexers than they should. However this is regarded as simple mechanism that is good enough to start with and provide a foundation for future improvements and decentralization. @@ -157,21 +157,21 @@ In general to be rewarded for providing service on The Graph, there is expected ## Events ```solidity -event IndexerQualityData(address indexed oracle, bytes data); -event IndexerAllowed(address indexed indexer, address indexed oracle); -event AllowedPeriodUpdated(uint256 oldPeriod, uint256 newPeriod); -event QualityCheckingUpdated(bool active); +event IndexerEligibilityData(address indexed oracle, bytes data); +event IndexerEligibilityRenewed(address indexed indexer, address indexed oracle); +event EligibilityPeriodUpdated(uint256 oldPeriod, uint256 newPeriod); +event EligibilityValidationUpdated(bool enabled); event OracleUpdateTimeoutUpdated(uint256 oldTimeout, uint256 newTimeout); ``` ## Default Configuration -- **Allowed Period**: 14 days (1,209,600 seconds) +- **Eligibility Period**: 14 days (1,209,600 seconds) - **Oracle Update Timeout**: 7 days (604,800 seconds) -- **Quality Checking**: Disabled (false) +- **Eligibility Validation**: Disabled (false) - **Last Oracle Update Time**: 0 (never updated) -The system is deployed with reasonable defaults but can be adjusted as required. Quality checking is disabled by default as the expectation is to first see oracles successfully allowing indexers and having suitably established allowed indexers before enabling. +The system is deployed with reasonable defaults but can be adjusted as required. Eligibility validation is disabled by default as the expectation is to first see oracles successfully marking indexers as eligible and having suitably established eligible indexers before enabling. ## Usage Patterns @@ -181,22 +181,22 @@ The system is deployed with reasonable defaults but can be adjusted as required. 2. Initialize with governor address 3. Governor grants OPERATOR_ROLE to operational accounts 4. Operators grant ORACLE_ROLE to oracle services using `grantRole(ORACLE_ROLE, oracleAddress)` -5. Configure allowed period and timeout as needed -6. After demonstration of successful oracle operation and having established a set of allowed indexers, quality checking is enabled +5. Configure eligibility period and timeout as needed +6. After demonstration of successful oracle operation and having established indexers with renewed eligibility, eligibility checking is enabled ### Normal Operation -1. Oracles periodically call `allowIndexers()` with quality-approved indexers -2. Reward systems call `isAllowed()` to check indexer eligibility +1. Oracles periodically call `renewIndexerEligibility()` to renew eligibility for indexers +2. Reward systems call `isEligible()` to check indexer eligibility 3. Operators adjust parameters as needed via configuration functions 4. The operation of the system is monitored and adjusted as needed ### Emergency Scenarios -- **Oracle failure**: System automatically allows all indexers after timeout -- **Quality issues**: Operators can disable quality checking globally +- **Oracle failure**: System automatically reports all indexers as eligible after timeout +- **Eligibility issues**: Operators can disable eligibility checking globally - **Parameter changes**: Operators can adjust periods and timeouts ## Integration -The contract implements the `IServiceQualityOracle` interface and can be integrated with any system that needs to verify indexer quality status. The primary integration point is the `isAllowed(address)` function which returns a simple boolean indicating eligibility. +The contract implements the `IRewardsEligibilityOracle` interface and can be integrated with any system that needs to verify indexer eligibility status. The primary integration point is the `isAllowed(address)` function which returns a simple boolean indicating eligibility. diff --git a/packages/issuance/contracts/quality/RewardsEligibilityOracle.sol b/packages/issuance/contracts/quality/RewardsEligibilityOracle.sol new file mode 100644 index 000000000..cfebea197 --- /dev/null +++ b/packages/issuance/contracts/quality/RewardsEligibilityOracle.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; +import { BaseUpgradeable } from "../common/BaseUpgradeable.sol"; + +/** + * @title RewardsEligibilityOracle + * @author Edge & Node + * @notice This contract allows authorized oracles to mark indexers as eligible to receive rewards + * with an expiration mechanism. Indexers are denied by default until they are explicitly marked as eligible, + * and their eligibility expires after a configurable eligible period. + * The contract also includes a global eligibility check toggle and an oracle update timeout mechanism. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any bugs. We might have an active bug bounty program. + */ +contract RewardsEligibilityOracle is BaseUpgradeable, IRewardsEligibilityOracle { + // -- Role Constants -- + + /** + * @notice Oracle role identifier + * @dev Oracle role holders can: + * - Mark indexers as eligible to receive rewards (based on off-chain quality assessment) + * This role is typically granted to automated quality assessment systems + * Admin: OPERATOR_ROLE (operators can manage oracle roles) + */ + bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); + // -- Namespaced Storage -- + + /// @notice ERC-7201 storage location for RewardsEligibilityOracle + bytes32 private constant REWARDS_ELIGIBILITY_ORACLE_STORAGE_LOCATION = + // Not needed for compile time calculation + // solhint-disable-next-line gas-small-strings + keccak256(abi.encode(uint256(keccak256("graphprotocol.storage.RewardsEligibilityOracle")) - 1)) & + ~bytes32(uint256(0xff)); + + /// @notice Main storage structure for RewardsEligibilityOracle using ERC-7201 namespaced storage + /// @param indexerEligibilityTimestamps Mapping of indexers to their eligibility renewal timestamps + /// @param eligibilityPeriod Period in seconds for which indexer eligibility status lasts + /// @param eligibilityValidationEnabled Flag to enable/disable eligibility validation + /// @param oracleUpdateTimeout Timeout period in seconds after which isEligible returns true if no oracle updates + /// @param lastOracleUpdateTime Timestamp of the last oracle update + /// @custom:storage-location erc7201:graphprotocol.storage.RewardsEligibilityOracle + struct RewardsEligibilityOracleData { + /// @dev Mapping of indexers to their eligibility renewal timestamps + mapping(address => uint256) indexerEligibilityTimestamps; + /// @dev Period in seconds for which indexer eligibility status lasts + uint256 eligibilityPeriod; + /// @dev Flag to enable/disable eligibility validation + bool eligibilityValidationEnabled; + /// @dev Timeout period in seconds after which isEligible returns true if no oracle updates + uint256 oracleUpdateTimeout; + /// @dev Timestamp of the last oracle update + uint256 lastOracleUpdateTime; + } + + /** + * @notice Returns the storage struct for RewardsEligibilityOracle + * @return $ contract storage + */ + function _getRewardsEligibilityOracleStorage() private pure returns (RewardsEligibilityOracleData storage $) { + // solhint-disable-previous-line use-natspec + // Solhint does not support $ return variable in natspec + bytes32 slot = REWARDS_ELIGIBILITY_ORACLE_STORAGE_LOCATION; + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := slot + } + } + + // -- Events -- + + /// @notice Emitted when an oracle submits eligibility data + /// @param oracle The address of the oracle that submitted the data + /// @param data The eligibility data submitted by the oracle + event IndexerEligibilityData(address indexed oracle, bytes data); + + /// @notice Emitted when an indexer's eligibility is renewed by an oracle + /// @param indexer The address of the indexer whose eligibility was renewed + /// @param oracle The address of the oracle that renewed the indexer's eligibility + event IndexerEligibilityRenewed(address indexed indexer, address indexed oracle); + + /// @notice Emitted when the eligibility period is updated + /// @param oldPeriod The previous eligibility period in seconds + /// @param newPeriod The new eligibility period in seconds + event EligibilityPeriodUpdated(uint256 indexed oldPeriod, uint256 indexed newPeriod); + + /// @notice Emitted when eligibility validation is enabled or disabled + /// @param enabled True if eligibility validation is enabled, false if disabled + event EligibilityValidationUpdated(bool indexed enabled); // solhint-disable-line gas-indexed-events + + /// @notice Emitted when the oracle update timeout is updated + /// @param oldTimeout The previous timeout period in seconds + /// @param newTimeout The new timeout period in seconds + event OracleUpdateTimeoutUpdated(uint256 indexed oldTimeout, uint256 indexed newTimeout); + + // -- Constructor -- + + /** + * @notice Constructor for the RewardsEligibilityOracle contract + * @dev This contract is upgradeable, but we use the constructor to pass the Graph Token address + * to the base contract. + * @param graphToken Address of the Graph Token contract + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor(address graphToken) BaseUpgradeable(graphToken) {} + + // -- Initialization -- + + /** + * @notice Initialize the RewardsEligibilityOracle contract + * @param governor Address that will have the GOVERNOR_ROLE + * @dev Also sets OPERATOR as admin of ORACLE role + */ + function initialize(address governor) external virtual initializer { + __BaseUpgradeable_init(governor); + + // OPERATOR is admin of ORACLE role + _setRoleAdmin(ORACLE_ROLE, OPERATOR_ROLE); + + // Set default values + RewardsEligibilityOracleData storage $ = _getRewardsEligibilityOracleStorage(); + $.eligibilityPeriod = 14 days; + $.oracleUpdateTimeout = 7 days; + $.eligibilityValidationEnabled = false; // Start with eligibility validation disabled, to be enabled later when the oracle is ready + } + + /** + * @notice Check if this contract supports a given interface + * @dev Overrides the supportsInterface function from ERC165Upgradeable + * @param interfaceId The interface identifier to check + * @return True if the contract supports the interface, false otherwise + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IRewardsEligibilityOracle).interfaceId || super.supportsInterface(interfaceId); + } + + // -- Governance Functions -- + + /** + * @notice Set the eligibility period for indexers + * @dev Only callable by accounts with the OPERATOR_ROLE + * @param eligibilityPeriod New eligibility period in seconds + * @return True if the state is as requested (eligibility period is set to the specified value) + */ + function setEligibilityPeriod(uint256 eligibilityPeriod) external onlyRole(OPERATOR_ROLE) returns (bool) { + RewardsEligibilityOracleData storage $ = _getRewardsEligibilityOracleStorage(); + uint256 oldEligibilityPeriod = $.eligibilityPeriod; + + if (eligibilityPeriod != oldEligibilityPeriod) { + $.eligibilityPeriod = eligibilityPeriod; + emit EligibilityPeriodUpdated(oldEligibilityPeriod, eligibilityPeriod); + } + + return true; + } + + /** + * @notice Set the oracle update timeout + * @dev Only callable by accounts with the OPERATOR_ROLE + * @param oracleUpdateTimeout New timeout period in seconds + * @return True if the state is as requested (timeout is set to the specified value) + */ + function setOracleUpdateTimeout(uint256 oracleUpdateTimeout) external onlyRole(OPERATOR_ROLE) returns (bool) { + RewardsEligibilityOracleData storage $ = _getRewardsEligibilityOracleStorage(); + uint256 oldTimeout = $.oracleUpdateTimeout; + + if (oracleUpdateTimeout != oldTimeout) { + $.oracleUpdateTimeout = oracleUpdateTimeout; + emit OracleUpdateTimeoutUpdated(oldTimeout, oracleUpdateTimeout); + } + + return true; + } + + /** + * @notice Set eligibility validation state + * @dev Only callable by accounts with the OPERATOR_ROLE + * @param enabled True to enable eligibility validation, false to disable + * @return True if successfully set (always the case for current code) + */ + function setEligibilityValidation(bool enabled) external onlyRole(OPERATOR_ROLE) returns (bool) { + RewardsEligibilityOracleData storage $ = _getRewardsEligibilityOracleStorage(); + + if ($.eligibilityValidationEnabled != enabled) { + $.eligibilityValidationEnabled = enabled; + emit EligibilityValidationUpdated(enabled); + } + + return true; + } + + /** + * @notice Renew eligibility for provided indexers to receive rewards + * @param indexers Array of indexer addresses. Zero addresses are ignored. + * @param data Arbitrary calldata for future extensions + * @return Number of indexers whose eligibility renewal timestamp was updated + */ + function renewIndexerEligibility( + address[] calldata indexers, + bytes calldata data + ) external onlyRole(ORACLE_ROLE) returns (uint256) { + emit IndexerEligibilityData(msg.sender, data); + + uint256 updatedCount = 0; + uint256 blockTimestamp = block.timestamp; + + RewardsEligibilityOracleData storage $ = _getRewardsEligibilityOracleStorage(); + $.lastOracleUpdateTime = blockTimestamp; + + // Update each indexer's eligible timestamp + for (uint256 i = 0; i < indexers.length; ++i) { + address indexer = indexers[i]; + + if (indexer != address(0) && $.indexerEligibilityTimestamps[indexer] < blockTimestamp) { + $.indexerEligibilityTimestamps[indexer] = blockTimestamp; + emit IndexerEligibilityRenewed(indexer, msg.sender); + ++updatedCount; + } + } + + return updatedCount; + } + + // -- View Functions -- + + /** + * @inheritdoc IRewardsEligibilityOracle + */ + function isEligible(address indexer) external view override returns (bool) { + RewardsEligibilityOracleData storage $ = _getRewardsEligibilityOracleStorage(); + + // If eligibility validation is disabled, treat all indexers as eligible + if (!$.eligibilityValidationEnabled) return true; + + // If no oracle updates have been made for oracleUpdateTimeout, treat all indexers as eligible + if ($.lastOracleUpdateTime + $.oracleUpdateTimeout < block.timestamp) return true; + + return block.timestamp < $.indexerEligibilityTimestamps[indexer] + $.eligibilityPeriod; + } + + /** + * @notice Get the last eligibility renewal timestamp for an indexer + * @param indexer Address of the indexer + * @return The last eligibility renewal timestamp, or 0 if the indexer's eligibility has never been renewed + */ + function getEligibilityRenewalTime(address indexer) external view returns (uint256) { + return _getRewardsEligibilityOracleStorage().indexerEligibilityTimestamps[indexer]; + } + + /** + * @notice Get the eligibility period + * @return The current eligibility period in seconds + */ + function getEligibilityPeriod() external view returns (uint256) { + return _getRewardsEligibilityOracleStorage().eligibilityPeriod; + } + + /** + * @notice Get the oracle update timeout + * @return The current oracle update timeout in seconds + */ + function getOracleUpdateTimeout() external view returns (uint256) { + return _getRewardsEligibilityOracleStorage().oracleUpdateTimeout; + } + + /** + * @notice Get the last oracle update time + * @return The timestamp of the last oracle update + */ + function getLastOracleUpdateTime() external view returns (uint256) { + return _getRewardsEligibilityOracleStorage().lastOracleUpdateTime; + } + + /** + * @notice Get eligibility validation state + * @return True if eligibility validation is enabled, false otherwise + */ + function getEligibilityValidation() external view returns (bool) { + return _getRewardsEligibilityOracleStorage().eligibilityValidationEnabled; + } +} diff --git a/packages/issuance/contracts/quality/ServiceQualityOracle.sol b/packages/issuance/contracts/quality/ServiceQualityOracle.sol deleted file mode 100644 index 5c4c159e7..000000000 --- a/packages/issuance/contracts/quality/ServiceQualityOracle.sol +++ /dev/null @@ -1,291 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -pragma solidity 0.8.27; - -import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; -import { BaseUpgradeable } from "../common/BaseUpgradeable.sol"; - -/** - * @title ServiceQualityOracle - * @author Edge & Node - * @notice This contract allows authorized oracles to allow indexers to receive rewards - * with an expiration mechanism. Indexers are denied by default until they are explicitly allowed, - * and their eligibility expires after a configurable allowed period. - * The contract also includes a global quality check toggle and an oracle update timeout mechanism. - * @custom:security-contact Please email security+contracts@thegraph.com if you find any bugs. We might have an active bug bounty program. - */ -contract ServiceQualityOracle is BaseUpgradeable, IServiceQualityOracle { - // -- Role Constants -- - - /** - * @notice Oracle role identifier - * @dev Oracle role holders can: - * - Allow indexers to receive rewards (based on off-chain quality assessment) - * This role is typically granted to automated quality assessment systems - * Admin: OPERATOR_ROLE (operators can manage oracle roles) - */ - bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); - // -- Namespaced Storage -- - - /// @notice ERC-7201 storage location for ServiceQualityOracle - bytes32 private constant SERVICE_QUALITY_ORACLE_STORAGE_LOCATION = - // Not needed for compile time calculation - // solhint-disable-next-line gas-small-strings - keccak256(abi.encode(uint256(keccak256("graphprotocol.storage.ServiceQualityOracle")) - 1)) & - ~bytes32(uint256(0xff)); - - /// @notice Main storage structure for ServiceQualityOracle using ERC-7201 namespaced storage - /// @param allowedIndexerTimestamps Mapping of indexers to their last allowed timestamp - /// @param allowedPeriod Period in seconds for which indexer allowed status lasts - /// @param checkingActive Flag to enable/disable quality checking - /// @param oracleUpdateTimeout Timeout period in seconds after which isAllowed returns true if no oracle updates - /// @param lastOracleUpdateTime Timestamp of the last oracle update - /// @custom:storage-location erc7201:graphprotocol.storage.ServiceQualityOracle - struct ServiceQualityOracleData { - /// @dev Mapping of indexers to their last allowed timestamp - mapping(address => uint256) allowedIndexerTimestamps; - /// @dev Period in seconds for which indexer allowed status lasts - uint256 allowedPeriod; - /// @dev Flag to enable/disable quality checking - bool checkingActive; - /// @dev Timeout period in seconds after which isAllowed returns true if no oracle updates - uint256 oracleUpdateTimeout; - /// @dev Timestamp of the last oracle update - uint256 lastOracleUpdateTime; - } - - /** - * @notice Returns the storage struct for ServiceQualityOracle - * @return $ contract storage - */ - function _getServiceQualityOracleStorage() private pure returns (ServiceQualityOracleData storage $) { - // solhint-disable-previous-line use-natspec - // Solhint does not support $ return variable in natspec - bytes32 slot = SERVICE_QUALITY_ORACLE_STORAGE_LOCATION; - // solhint-disable-next-line no-inline-assembly - assembly { - $.slot := slot - } - } - - // -- Events -- - - /// @notice Emitted when an oracle submits quality data - /// @param oracle The address of the oracle that submitted the data - /// @param data The quality data submitted by the oracle - event IndexerQualityData(address indexed oracle, bytes data); - - /// @notice Emitted when an indexer is allowed by an oracle - /// @param indexer The address of the indexer that was allowed - /// @param oracle The address of the oracle that allowed the indexer - event IndexerAllowed(address indexed indexer, address indexed oracle); - - /// @notice Emitted when the allowed period is updated - /// @param oldPeriod The previous allowed period in seconds - /// @param newPeriod The new allowed period in seconds - event AllowedPeriodUpdated(uint256 indexed oldPeriod, uint256 indexed newPeriod); - - /// @notice Emitted when quality checking is enabled or disabled - /// @param active True if quality checking is enabled, false if disabled - event QualityCheckingUpdated(bool indexed active); // solhint-disable-line gas-indexed-events - - /// @notice Emitted when the oracle update timeout is updated - /// @param oldTimeout The previous timeout period in seconds - /// @param newTimeout The new timeout period in seconds - event OracleUpdateTimeoutUpdated(uint256 indexed oldTimeout, uint256 indexed newTimeout); - - // -- Constructor -- - - /** - * @notice Constructor for the ServiceQualityOracle contract - * @dev This contract is upgradeable, but we use the constructor to pass the Graph Token address - * to the base contract. - * @param graphToken Address of the Graph Token contract - * @custom:oz-upgrades-unsafe-allow constructor - */ - constructor(address graphToken) BaseUpgradeable(graphToken) {} - - // -- Initialization -- - - /** - * @notice Initialize the ServiceQualityOracle contract - * @param governor Address that will have the GOVERNOR_ROLE - * @dev Also sets OPERATOR as admin of ORACLE role - */ - function initialize(address governor) external virtual initializer { - __BaseUpgradeable_init(governor); - - // OPERATOR is admin of ORACLE role - _setRoleAdmin(ORACLE_ROLE, OPERATOR_ROLE); - - // Set default values - ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); - $.allowedPeriod = 14 days; - $.oracleUpdateTimeout = 7 days; - $.checkingActive = false; // Start with quality checking disabled, to be enabled later when the oracle is ready - } - - /** - * @notice Check if this contract supports a given interface - * @dev Overrides the supportsInterface function from ERC165Upgradeable - * @param interfaceId The interface identifier to check - * @return True if the contract supports the interface, false otherwise - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IServiceQualityOracle).interfaceId || super.supportsInterface(interfaceId); - } - - // -- Governance Functions -- - - /** - * @notice Set the allowed period for indexers - * @dev Only callable by accounts with the OPERATOR_ROLE - * @param allowedPeriod New allowed period in seconds - * @return True if the state is as requested (allowed period is set to the specified value) - */ - function setAllowedPeriod(uint256 allowedPeriod) external onlyRole(OPERATOR_ROLE) returns (bool) { - ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); - uint256 oldAllowedPeriod = $.allowedPeriod; - - if (allowedPeriod != oldAllowedPeriod) { - $.allowedPeriod = allowedPeriod; - emit AllowedPeriodUpdated(oldAllowedPeriod, allowedPeriod); - } - - return true; - } - - /** - * @notice Set the oracle update timeout - * @dev Only callable by accounts with the OPERATOR_ROLE - * @param oracleUpdateTimeout New timeout period in seconds - * @return True if the state is as requested (timeout is set to the specified value) - */ - function setOracleUpdateTimeout(uint256 oracleUpdateTimeout) external onlyRole(OPERATOR_ROLE) returns (bool) { - ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); - uint256 oldTimeout = $.oracleUpdateTimeout; - - if (oracleUpdateTimeout != oldTimeout) { - $.oracleUpdateTimeout = oracleUpdateTimeout; - emit OracleUpdateTimeoutUpdated(oldTimeout, oracleUpdateTimeout); - } - - return true; - } - - /** - * @notice Set quality checking state - * @dev Only callable by accounts with the OPERATOR_ROLE - * @param enabled True to enable quality checking, false to disable - * @return True if successfully set (always the case for current code) - */ - function setQualityChecking(bool enabled) external onlyRole(OPERATOR_ROLE) returns (bool) { - ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); - - if ($.checkingActive != enabled) { - $.checkingActive = enabled; - emit QualityCheckingUpdated(enabled); - } - - return true; - } - - /** - * @notice Mark provided indexers as meeting service quality requirements to receive rewards - * @param indexers Array of indexer addresses. Zero addresses are ignored. - * @param data Arbitrary calldata for future extensions - * @return Number of indexers whose allowed timestamp was updated - */ - function allowIndexers( - address[] calldata indexers, - bytes calldata data - ) external onlyRole(ORACLE_ROLE) returns (uint256) { - emit IndexerQualityData(msg.sender, data); - - uint256 updatedCount = 0; - uint256 blockTimestamp = block.timestamp; - - ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); - $.lastOracleUpdateTime = blockTimestamp; - - // Update each indexer's allowed timestamp - for (uint256 i = 0; i < indexers.length; ++i) { - address indexer = indexers[i]; - - if (indexer != address(0) && $.allowedIndexerTimestamps[indexer] < blockTimestamp) { - $.allowedIndexerTimestamps[indexer] = blockTimestamp; - emit IndexerAllowed(indexer, msg.sender); - ++updatedCount; - } - } - - return updatedCount; - } - - // -- View Functions -- - - /** - * @inheritdoc IServiceQualityOracle - */ - function isAllowed(address indexer) external view returns (bool) { - ServiceQualityOracleData storage $ = _getServiceQualityOracleStorage(); - - // If quality checking is disabled, treat all indexers as allowed - if (!$.checkingActive) return true; - - // If no oracle updates have been made for oracleUpdateTimeout, treat all indexers as allowed - if ($.lastOracleUpdateTime + $.oracleUpdateTimeout < block.timestamp) return true; - - return block.timestamp < $.allowedIndexerTimestamps[indexer] + $.allowedPeriod; - } - - /** - * @notice Check if an oracle is authorized - * @param oracle Address of the oracle - * @return True if the oracle is authorized, false otherwise - */ - function isAuthorizedOracle(address oracle) external view returns (bool) { - return hasRole(ORACLE_ROLE, oracle); - } - - /** - * @notice Get the last allowed timestamp for an indexer - * @param indexer Address of the indexer - * @return The last allowed timestamp, or 0 if the indexer has not been allowed - */ - function getLastAllowedTime(address indexer) external view returns (uint256) { - return _getServiceQualityOracleStorage().allowedIndexerTimestamps[indexer]; - } - - /** - * @notice Get the allowed period - * @return The current allowed period in seconds - */ - function getAllowedPeriod() external view returns (uint256) { - return _getServiceQualityOracleStorage().allowedPeriod; - } - - /** - * @notice Get the oracle update timeout - * @return The current oracle update timeout in seconds - */ - function getOracleUpdateTimeout() external view returns (uint256) { - return _getServiceQualityOracleStorage().oracleUpdateTimeout; - } - - /** - * @notice Get the last oracle update time - * @return The timestamp of the last oracle update - */ - function getLastOracleUpdateTime() external view returns (uint256) { - return _getServiceQualityOracleStorage().lastOracleUpdateTime; - } - - /** - * @notice Check if quality checking is active - * @return True if quality checking is active, false otherwise - */ - function isQualityCheckingActive() external view returns (bool) { - return _getServiceQualityOracleStorage().checkingActive; - } -} diff --git a/packages/issuance/contracts/test/InterfaceIdExtractor.sol b/packages/issuance/contracts/test/InterfaceIdExtractor.sol index 8fd0b7d81..85b8cd035 100644 --- a/packages/issuance/contracts/test/InterfaceIdExtractor.sol +++ b/packages/issuance/contracts/test/InterfaceIdExtractor.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; -import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/IServiceQualityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; /** * @title InterfaceIdExtractor @@ -13,10 +13,10 @@ import { IServiceQualityOracle } from "@graphprotocol/common/contracts/quality/I */ contract InterfaceIdExtractor { /** - * @notice Returns the ERC-165 interface ID for IServiceQualityOracle + * @notice Returns the ERC-165 interface ID for IRewardsEligibilityOracle * @return The interface ID as calculated by Solidity */ - function getIServiceQualityOracleId() external pure returns (bytes4) { - return type(IServiceQualityOracle).interfaceId; + function getIRewardsEligibilityOracleId() external pure returns (bytes4) { + return type(IRewardsEligibilityOracle).interfaceId; } } diff --git a/packages/issuance/test/scripts/generateInterfaceIds.js b/packages/issuance/test/scripts/generateInterfaceIds.js index 42b4af3ec..174a2316d 100644 --- a/packages/issuance/test/scripts/generateInterfaceIds.js +++ b/packages/issuance/test/scripts/generateInterfaceIds.js @@ -28,7 +28,7 @@ async function main() { await extractor.waitForDeployment() const results = { - IServiceQualityOracle: await extractor.getIServiceQualityOracleId(), + IRewardsEligibilityOracle: await extractor.getIRewardsEligibilityOracleId(), } console.log(JSON.stringify(results)) diff --git a/packages/issuance/test/tests/RewardsEligibilityOracle.test.ts b/packages/issuance/test/tests/RewardsEligibilityOracle.test.ts new file mode 100644 index 000000000..6aba1c1d0 --- /dev/null +++ b/packages/issuance/test/tests/RewardsEligibilityOracle.test.ts @@ -0,0 +1,652 @@ +import { time } from '@nomicfoundation/hardhat-network-helpers' +import { expect } from 'chai' +import { ethers, upgrades } from 'hardhat' + +import { deployRewardsEligibilityOracle, deployTestGraphToken, getTestAccounts } from './helpers/fixtures' +import { SHARED_CONSTANTS } from './helpers/sharedFixtures' + +// Role constants +const GOVERNOR_ROLE = SHARED_CONSTANTS.GOVERNOR_ROLE +const ORACLE_ROLE = SHARED_CONSTANTS.ORACLE_ROLE +const OPERATOR_ROLE = SHARED_CONSTANTS.OPERATOR_ROLE + +describe('RewardsEligibilityOracle', () => { + // Common variables + let accounts + let sharedContracts + + before(async () => { + accounts = await getTestAccounts() + + // Deploy shared contracts once + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const rewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) + const rewardsEligibilityOracleAddress = await rewardsEligibilityOracle.getAddress() + + sharedContracts = { + graphToken, + rewardsEligibilityOracle, + addresses: { + graphToken: graphTokenAddress, + rewardsEligibilityOracle: rewardsEligibilityOracleAddress, + }, + } + }) + + // Fast state reset function + async function resetOracleState() { + if (!sharedContracts) return + + const { rewardsEligibilityOracle } = sharedContracts + + // Remove oracle roles from all accounts + try { + for (const account of [accounts.operator, accounts.user, accounts.nonGovernor]) { + if (await rewardsEligibilityOracle.hasRole(ORACLE_ROLE, account.address)) { + await rewardsEligibilityOracle.connect(accounts.governor).revokeRole(ORACLE_ROLE, account.address) + } + if (await rewardsEligibilityOracle.hasRole(OPERATOR_ROLE, account.address)) { + await rewardsEligibilityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, account.address) + } + } + + // Remove operator role from governor if present + if (await rewardsEligibilityOracle.hasRole(OPERATOR_ROLE, accounts.governor.address)) { + await rewardsEligibilityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + } catch { + // Ignore role management errors during reset + } + + // Reset to default values + try { + // Reset eligibility period to default (14 days) + const defaultEligibilityPeriod = 14 * 24 * 60 * 60 + const currentEligibilityPeriod = await rewardsEligibilityOracle.getEligibilityPeriod() + if (currentEligibilityPeriod !== BigInt(defaultEligibilityPeriod)) { + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) + await rewardsEligibilityOracle.connect(accounts.governor).setEligibilityPeriod(defaultEligibilityPeriod) + await rewardsEligibilityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + + // Reset eligibility validation to disabled + if (await rewardsEligibilityOracle.getEligibilityValidation()) { + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) + await rewardsEligibilityOracle.connect(accounts.governor).setEligibilityValidation(false) + await rewardsEligibilityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + + // Reset oracle update timeout to default (7 days) + const defaultTimeout = 7 * 24 * 60 * 60 + const currentTimeout = await rewardsEligibilityOracle.getOracleUpdateTimeout() + if (currentTimeout !== BigInt(defaultTimeout)) { + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) + await rewardsEligibilityOracle.connect(accounts.governor).setOracleUpdateTimeout(defaultTimeout) + await rewardsEligibilityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) + } + } catch { + // Ignore reset errors + } + } + + beforeEach(async () => { + if (!accounts) { + accounts = await getTestAccounts() + } + await resetOracleState() + }) + + describe('Construction', () => { + it('should revert when constructed with zero GraphToken address', async () => { + const RewardsEligibilityOracleFactory = await ethers.getContractFactory('RewardsEligibilityOracle') + await expect(RewardsEligibilityOracleFactory.deploy(ethers.ZeroAddress)).to.be.revertedWithCustomError( + RewardsEligibilityOracleFactory, + 'GraphTokenCannotBeZeroAddress', + ) + }) + + it('should revert when initialized with zero governor address', async () => { + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + + // Try to deploy proxy with zero governor address - this should hit the BaseUpgradeable check + const RewardsEligibilityOracleFactory = await ethers.getContractFactory('RewardsEligibilityOracle') + await expect( + upgrades.deployProxy(RewardsEligibilityOracleFactory, [ethers.ZeroAddress], { + constructorArgs: [graphTokenAddress], + initializer: 'initialize', + }), + ).to.be.revertedWithCustomError(RewardsEligibilityOracleFactory, 'GovernorCannotBeZeroAddress') + }) + }) + + describe('Initialization', () => { + it('should set the governor role correctly', async () => { + const { rewardsEligibilityOracle } = sharedContracts + expect(await rewardsEligibilityOracle.hasRole(GOVERNOR_ROLE, accounts.governor.address)).to.be.true + }) + + it('should not set oracle role to anyone initially', async () => { + const { rewardsEligibilityOracle } = sharedContracts + expect(await rewardsEligibilityOracle.hasRole(ORACLE_ROLE, accounts.operator.address)).to.be.false + }) + + it('should set default eligibility period to 14 days', async () => { + const { rewardsEligibilityOracle } = sharedContracts + expect(await rewardsEligibilityOracle.getEligibilityPeriod()).to.equal(14 * 24 * 60 * 60) // 14 days in seconds + }) + + it('should set eligibility validation to disabled by default', async () => { + const { rewardsEligibilityOracle } = sharedContracts + expect(await rewardsEligibilityOracle.getEligibilityValidation()).to.be.false + }) + + it('should set default oracle update timeout to 7 days', async () => { + const { rewardsEligibilityOracle } = sharedContracts + expect(await rewardsEligibilityOracle.getOracleUpdateTimeout()).to.equal(7 * 24 * 60 * 60) // 7 days in seconds + }) + + it('should initialize lastOracleUpdateTime to 0', async () => { + const { rewardsEligibilityOracle } = sharedContracts + expect(await rewardsEligibilityOracle.getLastOracleUpdateTime()).to.equal(0) + }) + + it('should revert when initialize is called more than once', async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Try to call initialize again + await expect(rewardsEligibilityOracle.initialize(accounts.governor.address)).to.be.revertedWithCustomError( + rewardsEligibilityOracle, + 'InvalidInitialization', + ) + }) + }) + + describe('Oracle Management', () => { + it('should allow operator to grant oracle role', async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant operator role to the operator account + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Operator grants oracle role + await rewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) + expect(await rewardsEligibilityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.true + }) + + it('should allow operator to revoke oracle role', async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant operator role to the operator account + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Grant oracle role first + await rewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) + expect(await rewardsEligibilityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.true + + // Revoke role + await rewardsEligibilityOracle.connect(accounts.operator).revokeRole(ORACLE_ROLE, accounts.user.address) + expect(await rewardsEligibilityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.false + }) + + // Access control tests moved to consolidated/AccessControl.test.ts + }) + + describe('Operator Functions', () => { + beforeEach(async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant operator role to the operator account + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + }) + + it('should allow operator to set eligibility period', async () => { + const { rewardsEligibilityOracle } = sharedContracts + const newEligibilityPeriod = 14 * 24 * 60 * 60 // 14 days + + // Set eligibility period + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityPeriod(newEligibilityPeriod) + + // Check if eligibility period was updated + expect(await rewardsEligibilityOracle.getEligibilityPeriod()).to.equal(newEligibilityPeriod) + }) + + it('should handle idempotent operations correctly', async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Test setting same eligibility period + const currentEligibilityPeriod = await rewardsEligibilityOracle.getEligibilityPeriod() + let result = await rewardsEligibilityOracle + .connect(accounts.operator) + .setEligibilityPeriod.staticCall(currentEligibilityPeriod) + expect(result).to.be.true + + // Verify no event emitted for same value + let tx = await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityPeriod(currentEligibilityPeriod) + let receipt = await tx.wait() + expect(receipt.logs.length).to.equal(0) + + // Test setting new oracle update timeout + const newTimeout = 60 * 24 * 60 * 60 // 60 days + await rewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(newTimeout) + expect(await rewardsEligibilityOracle.getOracleUpdateTimeout()).to.equal(newTimeout) + + // Test setting same oracle update timeout + result = await rewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout.staticCall(newTimeout) + expect(result).to.be.true + + // Verify no event emitted for same value + tx = await rewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(newTimeout) + receipt = await tx.wait() + expect(receipt.logs.length).to.equal(0) + }) + + it('should allow operator to disable eligibility checking', async () => { + const { rewardsEligibilityOracle } = sharedContracts + // Disable eligibility validation + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(false) + + // Check if eligibility validation is disabled + expect(await rewardsEligibilityOracle.getEligibilityValidation()).to.be.false + }) + + it('should allow operator to enable eligibility checking', async () => { + const { rewardsEligibilityOracle } = sharedContracts + // Disable eligibility validation first + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(false) + expect(await rewardsEligibilityOracle.getEligibilityValidation()).to.be.false + + // Enable eligibility validation + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + + // Check if eligibility validation is enabled + expect(await rewardsEligibilityOracle.getEligibilityValidation()).to.be.true + }) + + it('should handle setEligibilityValidation return values and events correctly', async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Test 1: Return true when enabling eligibility validation that is already enabled + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + expect(await rewardsEligibilityOracle.getEligibilityValidation()).to.be.true + + const enableResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .setEligibilityValidation.staticCall(true) + expect(enableResult).to.be.true + + // Test 2: No event emitted when setting to same state (enabled) + const enableTx = await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + const enableReceipt = await enableTx.wait() + expect(enableReceipt.logs.length).to.equal(0) + + // Test 3: Return true when disabling eligibility validation that is already disabled + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(false) + expect(await rewardsEligibilityOracle.getEligibilityValidation()).to.be.false + + const disableResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .setEligibilityValidation.staticCall(false) + expect(disableResult).to.be.true + + // Test 4: No event emitted when setting to same state (disabled) + const disableTx = await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(false) + const disableReceipt = await disableTx.wait() + expect(disableReceipt.logs.length).to.equal(0) + + // Test 5: Events are emitted when state actually changes + await expect(rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true)) + .to.emit(rewardsEligibilityOracle, 'EligibilityValidationUpdated') + .withArgs(true) + + await expect(rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(false)) + .to.emit(rewardsEligibilityOracle, 'EligibilityValidationUpdated') + .withArgs(false) + }) + + // Access control tests moved to consolidated/AccessControl.test.ts + // Event and return value tests consolidated into 'should handle setEligibilityValidation return values and events correctly' + }) + + describe('Indexer Management', () => { + beforeEach(async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant operator role to the operator account + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + + // Grant oracle role + await rewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + }) + + it('should allow oracle to allow a single indexer', async () => { + const { rewardsEligibilityOracle } = sharedContracts + // Renew indexer eligibility using renewIndexerEligibility with a single-element array + await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + + // Check if indexer is eligible + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + + // Check if allowed timestamp was updated + const eligibilityRenewalTime = await rewardsEligibilityOracle.getEligibilityRenewalTime(accounts.indexer1.address) + expect(eligibilityRenewalTime).to.be.gt(0) + }) + + it('should allow oracle to allow multiple indexers', async () => { + const { rewardsEligibilityOracle } = sharedContracts + // Allow multiple indexers + const indexers = [accounts.indexer1.address, accounts.indexer2.address] + await rewardsEligibilityOracle.connect(accounts.operator).renewIndexerEligibility(indexers, '0x') + + // Check if indexers are eligible + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer2.address)).to.be.true + + // Check if allowed timestamps were updated + const eligibilityRenewalTime1 = await rewardsEligibilityOracle.getEligibilityRenewalTime( + accounts.indexer1.address, + ) + const eligibilityRenewalTime2 = await rewardsEligibilityOracle.getEligibilityRenewalTime( + accounts.indexer2.address, + ) + expect(eligibilityRenewalTime1).to.be.gt(0) + expect(eligibilityRenewalTime2).to.be.gt(0) + }) + + it('should not update last renewal timestamp for indexer already renewed in the same block', async () => { + const { rewardsEligibilityOracle } = sharedContracts + // Renew indexer eligibility first time + await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + + // Get the timestamp + const initialEligibilityRenewalTime = await rewardsEligibilityOracle.getEligibilityRenewalTime( + accounts.indexer1.address, + ) + + // Call renewIndexerEligibility again with the same indexer + const result = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall([accounts.indexer1.address], '0x') + + // The function should return 0 since the indexer was already allowed in this block + expect(result).to.equal(0) + + // Verify the timestamp hasn't changed + const finalEligibilityRenewalTime = await rewardsEligibilityOracle.getEligibilityRenewalTime( + accounts.indexer1.address, + ) + expect(finalEligibilityRenewalTime).to.equal(initialEligibilityRenewalTime) + + // Mine a new block + await ethers.provider.send('evm_mine', []) + + // Now try again in a new block - it should return 1 + const newBlockResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall([accounts.indexer1.address], '0x') + + // The function should return 1 since we're in a new block + expect(newBlockResult).to.equal(1) + }) + + it('should revert when non-oracle tries to allow a single indexer', async () => { + const { rewardsEligibilityOracle } = sharedContracts + await expect( + rewardsEligibilityOracle + .connect(accounts.nonGovernor) + .renewIndexerEligibility([accounts.indexer1.address], '0x'), + ).to.be.revertedWithCustomError(rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount') + }) + + it('should revert when non-oracle tries to allow multiple indexers', async () => { + const { rewardsEligibilityOracle } = sharedContracts + const indexers = [accounts.indexer1.address, accounts.indexer2.address] + await expect( + rewardsEligibilityOracle.connect(accounts.nonGovernor).renewIndexerEligibility(indexers, '0x'), + ).to.be.revertedWithCustomError(rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount') + }) + + it('should return correct count for various renewIndexerEligibility scenarios', async () => { + const { rewardsEligibilityOracle } = sharedContracts + + // Test 1: Single indexer should return 1 + const singleResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall([accounts.indexer1.address], '0x') + expect(singleResult).to.equal(1) + + // Test 2: Multiple indexers should return correct count + const multipleIndexers = [accounts.indexer1.address, accounts.indexer2.address] + const multipleResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall(multipleIndexers, '0x') + expect(multipleResult).to.equal(2) + + // Test 3: Empty array should return 0 + const emptyResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall([], '0x') + expect(emptyResult).to.equal(0) + + // Test 4: Array with zero addresses should only count non-zero addresses + const withZeroAddresses = [accounts.indexer1.address, ethers.ZeroAddress, accounts.indexer2.address] + const zeroResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall(withZeroAddresses, '0x') + expect(zeroResult).to.equal(2) + + // Test 5: Array with duplicates should only count unique indexers + const withDuplicates = [accounts.indexer1.address, accounts.indexer1.address, accounts.indexer2.address] + const duplicateResult = await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility.staticCall(withDuplicates, '0x') + expect(duplicateResult).to.equal(2) + }) + }) + + describe('View Functions', () => { + // Use shared contracts instead of deploying fresh ones for each test + + it('should return 0 when getting last renewal time for indexer that was never renewed', async () => { + // Use a fresh deployment to avoid contamination from previous tests + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshRewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) + + // This should return 0 for a fresh contract + const lastEligibilityRenewalTime = await freshRewardsEligibilityOracle.getEligibilityRenewalTime( + accounts.indexer1.address, + ) + expect(lastEligibilityRenewalTime).to.equal(0) + }) + + it('should return correct last renewal timestamp for renewed indexer', async function () { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant operator role first (governor can grant operator role) + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + // Then operator can grant oracle role (operator is admin of oracle role) + await rewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Renew indexer eligibility + await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + + // Get the last allowed time + const lastEligibilityRenewalTime = await rewardsEligibilityOracle.getEligibilityRenewalTime( + accounts.indexer1.address, + ) + + // Get the current block timestamp + const block = await ethers.provider.getBlock('latest') + const blockTimestamp = block ? block.timestamp : 0 + + // The last allowed time should be close to the current block timestamp + expect(lastEligibilityRenewalTime).to.be.closeTo(blockTimestamp, 5) // Allow 5 seconds of difference + }) + + it('should correctly report if an indexer is eligible', async function () { + // Use a fresh deployment to avoid shared state contamination + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshRewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) + + // Grant necessary roles (follow role hierarchy) + await freshRewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await freshRewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable eligibility validation first (since it's disabled by default) + await freshRewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + + // First, set a non-zero lastOracleUpdateTime to prevent the timeout condition from triggering + await freshRewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.nonGovernor.address], '0x') + + // Now check if our test indexer is eligible (it shouldn't be) + expect(await freshRewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.false + + // Renew indexer eligibility + await freshRewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + expect(await freshRewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + }) + + it('should return true for all indexers when eligibility checking is disabled', async function () { + // Use a fresh deployment to avoid shared state contamination + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshRewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) + + // Grant necessary roles (follow role hierarchy) + await freshRewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await freshRewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable eligibility validation first (since it's disabled by default) + await freshRewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + + // First, set a non-zero lastOracleUpdateTime to prevent the timeout condition from triggering + await freshRewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.nonGovernor.address], '0x') + + // Set a very long oracle update timeout to prevent that condition from triggering + await freshRewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Now check if our test indexer is eligible (it shouldn't be) + expect(await freshRewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.false + + // Disable eligibility validation + await freshRewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(false) + + // Now indexer should be allowed even without being explicitly allowed + expect(await freshRewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + }) + + it('should return true for all indexers when oracle update timeout is exceeded', async function () { + // Use a fresh deployment to avoid shared state contamination + const graphToken = await deployTestGraphToken() + const graphTokenAddress = await graphToken.getAddress() + const freshRewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) + + // Grant necessary roles (follow role hierarchy) + await freshRewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await freshRewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable eligibility validation first (since it's disabled by default) + await freshRewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + + // First, set a non-zero lastOracleUpdateTime to prevent the initial timeout condition from triggering + await freshRewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.nonGovernor.address], '0x') + + // Set a very long oracle update timeout initially + await freshRewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Now check if our test indexer is eligible (it shouldn't be) + expect(await freshRewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.false + + // Set a short oracle update timeout + await freshRewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(60) // 1 minute + + // Advance time beyond the timeout + await time.increase(120) // 2 minutes + + // Now indexer should be allowed even without being explicitly allowed + expect(await freshRewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + }) + + it('should return false for indexer after eligibility period expires', async function () { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant necessary roles (follow role hierarchy) + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await rewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable eligibility validation first (since it's disabled by default) + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + + // Set a very long oracle update timeout to prevent that condition from triggering + await rewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Renew indexer eligibility + await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + + // Set a short eligibility period + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityPeriod(60) // 1 minute + + // Advance time beyond eligibility period + await time.increase(120) // 2 minutes + + // Now indexer should not be allowed + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.false + }) + + it('should return true for indexer after re-allowing', async function () { + const { rewardsEligibilityOracle } = sharedContracts + + // Grant necessary roles + await rewardsEligibilityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) + await rewardsEligibilityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) + + // Enable eligibility validation first (since it's disabled by default) + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityValidation(true) + + // Set a very long oracle update timeout to prevent that condition from triggering + await rewardsEligibilityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year + + // Renew indexer eligibility + await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + + // Set a short eligibility period + await rewardsEligibilityOracle.connect(accounts.operator).setEligibilityPeriod(60) // 1 minute + + // Advance time beyond eligibility period + await time.increase(120) // 2 minutes + + // Indexer should not be allowed + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.false + + // Re-renew indexer eligibility + await rewardsEligibilityOracle + .connect(accounts.operator) + .renewIndexerEligibility([accounts.indexer1.address], '0x') + + // Now indexer should be allowed again + expect(await rewardsEligibilityOracle.isEligible(accounts.indexer1.address)).to.be.true + }) + }) +}) diff --git a/packages/issuance/test/tests/ServiceQualityOracle.test.ts b/packages/issuance/test/tests/ServiceQualityOracle.test.ts deleted file mode 100644 index 831c8d349..000000000 --- a/packages/issuance/test/tests/ServiceQualityOracle.test.ts +++ /dev/null @@ -1,630 +0,0 @@ -import { time } from '@nomicfoundation/hardhat-network-helpers' -import { expect } from 'chai' -import { ethers, upgrades } from 'hardhat' - -import { deployServiceQualityOracle, deployTestGraphToken, getTestAccounts } from './helpers/fixtures' -import { SHARED_CONSTANTS } from './helpers/sharedFixtures' - -// Role constants -const GOVERNOR_ROLE = SHARED_CONSTANTS.GOVERNOR_ROLE -const ORACLE_ROLE = SHARED_CONSTANTS.ORACLE_ROLE -const OPERATOR_ROLE = SHARED_CONSTANTS.OPERATOR_ROLE - -describe('ServiceQualityOracle', () => { - // Common variables - let accounts - let sharedContracts - - before(async () => { - accounts = await getTestAccounts() - - // Deploy shared contracts once - const graphToken = await deployTestGraphToken() - const graphTokenAddress = await graphToken.getAddress() - const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) - const serviceQualityOracleAddress = await serviceQualityOracle.getAddress() - - sharedContracts = { - graphToken, - serviceQualityOracle, - addresses: { - graphToken: graphTokenAddress, - serviceQualityOracle: serviceQualityOracleAddress, - }, - } - }) - - // Fast state reset function - async function resetOracleState() { - if (!sharedContracts) return - - const { serviceQualityOracle } = sharedContracts - - // Remove oracle roles from all accounts - try { - for (const account of [accounts.operator, accounts.user, accounts.nonGovernor]) { - if (await serviceQualityOracle.hasRole(ORACLE_ROLE, account.address)) { - await serviceQualityOracle.connect(accounts.governor).revokeRole(ORACLE_ROLE, account.address) - } - if (await serviceQualityOracle.hasRole(OPERATOR_ROLE, account.address)) { - await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, account.address) - } - } - - // Remove operator role from governor if present - if (await serviceQualityOracle.hasRole(OPERATOR_ROLE, accounts.governor.address)) { - await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) - } - } catch { - // Ignore role management errors during reset - } - - // Reset to default values - try { - // Reset allowed period to default (14 days) - const defaultAllowedPeriod = 14 * 24 * 60 * 60 - const currentAllowedPeriod = await serviceQualityOracle.getAllowedPeriod() - if (currentAllowedPeriod !== BigInt(defaultAllowedPeriod)) { - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) - await serviceQualityOracle.connect(accounts.governor).setAllowedPeriod(defaultAllowedPeriod) - await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) - } - - // Reset quality checking to inactive - if (await serviceQualityOracle.isQualityCheckingActive()) { - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) - await serviceQualityOracle.connect(accounts.governor).setQualityChecking(false) - await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) - } - - // Reset oracle update timeout to default (7 days) - const defaultTimeout = 7 * 24 * 60 * 60 - const currentTimeout = await serviceQualityOracle.getOracleUpdateTimeout() - if (currentTimeout !== BigInt(defaultTimeout)) { - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.governor.address) - await serviceQualityOracle.connect(accounts.governor).setOracleUpdateTimeout(defaultTimeout) - await serviceQualityOracle.connect(accounts.governor).revokeRole(OPERATOR_ROLE, accounts.governor.address) - } - } catch { - // Ignore reset errors - } - } - - beforeEach(async () => { - if (!accounts) { - accounts = await getTestAccounts() - } - await resetOracleState() - }) - - describe('Construction', () => { - it('should revert when constructed with zero GraphToken address', async () => { - const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') - await expect(ServiceQualityOracleFactory.deploy(ethers.ZeroAddress)).to.be.revertedWithCustomError( - ServiceQualityOracleFactory, - 'GraphTokenCannotBeZeroAddress', - ) - }) - - it('should revert when initialized with zero governor address', async () => { - const graphToken = await deployTestGraphToken() - const graphTokenAddress = await graphToken.getAddress() - - // Try to deploy proxy with zero governor address - this should hit the BaseUpgradeable check - const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') - await expect( - upgrades.deployProxy(ServiceQualityOracleFactory, [ethers.ZeroAddress], { - constructorArgs: [graphTokenAddress], - initializer: 'initialize', - }), - ).to.be.revertedWithCustomError(ServiceQualityOracleFactory, 'GovernorCannotBeZeroAddress') - }) - }) - - describe('Initialization', () => { - it('should set the governor role correctly', async () => { - const { serviceQualityOracle } = sharedContracts - expect(await serviceQualityOracle.hasRole(GOVERNOR_ROLE, accounts.governor.address)).to.be.true - }) - - it('should not set oracle role to anyone initially', async () => { - const { serviceQualityOracle } = sharedContracts - expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.operator.address)).to.be.false - }) - - it('should set default allowed period to 14 days', async () => { - const { serviceQualityOracle } = sharedContracts - expect(await serviceQualityOracle.getAllowedPeriod()).to.equal(14 * 24 * 60 * 60) // 14 days in seconds - }) - - it('should set quality checking to inactive by default', async () => { - const { serviceQualityOracle } = sharedContracts - expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false - }) - - it('should set default oracle update timeout to 7 days', async () => { - const { serviceQualityOracle } = sharedContracts - expect(await serviceQualityOracle.getOracleUpdateTimeout()).to.equal(7 * 24 * 60 * 60) // 7 days in seconds - }) - - it('should initialize lastOracleUpdateTime to 0', async () => { - const { serviceQualityOracle } = sharedContracts - expect(await serviceQualityOracle.getLastOracleUpdateTime()).to.equal(0) - }) - - it('should revert when initialize is called more than once', async () => { - const { serviceQualityOracle } = sharedContracts - - // Try to call initialize again - await expect(serviceQualityOracle.initialize(accounts.governor.address)).to.be.revertedWithCustomError( - serviceQualityOracle, - 'InvalidInitialization', - ) - }) - }) - - describe('Oracle Management', () => { - it('should allow operator to grant oracle role', async () => { - const { serviceQualityOracle } = sharedContracts - - // Grant operator role to the operator account - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - - // Operator grants oracle role - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) - expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.true - }) - - it('should allow operator to revoke oracle role', async () => { - const { serviceQualityOracle } = sharedContracts - - // Grant operator role to the operator account - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - - // Grant oracle role first - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) - expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.true - - // Revoke role - await serviceQualityOracle.connect(accounts.operator).revokeRole(ORACLE_ROLE, accounts.user.address) - expect(await serviceQualityOracle.hasRole(ORACLE_ROLE, accounts.user.address)).to.be.false - }) - - // Access control tests moved to consolidated/AccessControl.test.ts - }) - - describe('Operator Functions', () => { - beforeEach(async () => { - const { serviceQualityOracle } = sharedContracts - - // Grant operator role to the operator account - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - }) - - it('should allow operator to set allowed period', async () => { - const { serviceQualityOracle } = sharedContracts - const newAllowedPeriod = 14 * 24 * 60 * 60 // 14 days - - // Set allowed period - await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(newAllowedPeriod) - - // Check if allowed period was updated - expect(await serviceQualityOracle.getAllowedPeriod()).to.equal(newAllowedPeriod) - }) - - it('should handle idempotent operations correctly', async () => { - const { serviceQualityOracle } = sharedContracts - - // Test setting same allowed period - const currentAllowedPeriod = await serviceQualityOracle.getAllowedPeriod() - let result = await serviceQualityOracle - .connect(accounts.operator) - .setAllowedPeriod.staticCall(currentAllowedPeriod) - expect(result).to.be.true - - // Verify no event emitted for same value - let tx = await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(currentAllowedPeriod) - let receipt = await tx.wait() - expect(receipt.logs.length).to.equal(0) - - // Test setting new oracle update timeout - const newTimeout = 60 * 24 * 60 * 60 // 60 days - await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(newTimeout) - expect(await serviceQualityOracle.getOracleUpdateTimeout()).to.equal(newTimeout) - - // Test setting same oracle update timeout - result = await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout.staticCall(newTimeout) - expect(result).to.be.true - - // Verify no event emitted for same value - tx = await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(newTimeout) - receipt = await tx.wait() - expect(receipt.logs.length).to.equal(0) - }) - - it('should allow operator to disable quality checking', async () => { - const { serviceQualityOracle } = sharedContracts - // Disable quality checking - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) - - // Check if quality checking is disabled - expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false - }) - - it('should allow operator to enable quality checking', async () => { - const { serviceQualityOracle } = sharedContracts - // Disable quality checking first - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) - expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false - - // Enable quality checking - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) - - // Check if quality checking is enabled - expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.true - }) - - it('should handle setQualityChecking return values and events correctly', async () => { - const { serviceQualityOracle } = sharedContracts - - // Test 1: Return true when enabling quality checking that is already enabled - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) - expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.true - - const enableResult = await serviceQualityOracle.connect(accounts.operator).setQualityChecking.staticCall(true) - expect(enableResult).to.be.true - - // Test 2: No event emitted when setting to same state (enabled) - const enableTx = await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) - const enableReceipt = await enableTx.wait() - expect(enableReceipt.logs.length).to.equal(0) - - // Test 3: Return true when disabling quality checking that is already disabled - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) - expect(await serviceQualityOracle.isQualityCheckingActive()).to.be.false - - const disableResult = await serviceQualityOracle.connect(accounts.operator).setQualityChecking.staticCall(false) - expect(disableResult).to.be.true - - // Test 4: No event emitted when setting to same state (disabled) - const disableTx = await serviceQualityOracle.connect(accounts.operator).setQualityChecking(false) - const disableReceipt = await disableTx.wait() - expect(disableReceipt.logs.length).to.equal(0) - - // Test 5: Events are emitted when state actually changes - await expect(serviceQualityOracle.connect(accounts.operator).setQualityChecking(true)) - .to.emit(serviceQualityOracle, 'QualityCheckingUpdated') - .withArgs(true) - - await expect(serviceQualityOracle.connect(accounts.operator).setQualityChecking(false)) - .to.emit(serviceQualityOracle, 'QualityCheckingUpdated') - .withArgs(false) - }) - - // Access control tests moved to consolidated/AccessControl.test.ts - // Event and return value tests consolidated into 'should handle setQualityChecking return values and events correctly' - }) - - describe('Indexer Management', () => { - beforeEach(async () => { - const { serviceQualityOracle } = sharedContracts - - // Grant operator role to the operator account - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - - // Grant oracle role - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - }) - - it('should allow oracle to allow a single indexer', async () => { - const { serviceQualityOracle } = sharedContracts - // Allow indexer using allowIndexers with a single-element array - await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - - // Check if indexer is allowed - expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - - // Check if allowed timestamp was updated - const allowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) - expect(allowedTime).to.be.gt(0) - }) - - it('should allow oracle to allow multiple indexers', async () => { - const { serviceQualityOracle } = sharedContracts - // Allow multiple indexers - const indexers = [accounts.indexer1.address, accounts.indexer2.address] - await serviceQualityOracle.connect(accounts.operator).allowIndexers(indexers, '0x') - - // Check if indexers are allowed - expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - expect(await serviceQualityOracle.isAllowed(accounts.indexer2.address)).to.be.true - - // Check if allowed timestamps were updated - const allowedTime1 = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) - const allowedTime2 = await serviceQualityOracle.getLastAllowedTime(accounts.indexer2.address) - expect(allowedTime1).to.be.gt(0) - expect(allowedTime2).to.be.gt(0) - }) - - it('should not update timestamp for indexer already allowed in the same block', async () => { - const { serviceQualityOracle } = sharedContracts - // Allow indexer first time - await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - - // Get the timestamp - const initialAllowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) - - // Call allowIndexers again with the same indexer - const result = await serviceQualityOracle - .connect(accounts.operator) - .allowIndexers.staticCall([accounts.indexer1.address], '0x') - - // The function should return 0 since the indexer was already allowed in this block - expect(result).to.equal(0) - - // Verify the timestamp hasn't changed - const finalAllowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) - expect(finalAllowedTime).to.equal(initialAllowedTime) - - // Mine a new block - await ethers.provider.send('evm_mine', []) - - // Now try again in a new block - it should return 1 - const newBlockResult = await serviceQualityOracle - .connect(accounts.operator) - .allowIndexers.staticCall([accounts.indexer1.address], '0x') - - // The function should return 1 since we're in a new block - expect(newBlockResult).to.equal(1) - }) - - it('should revert when non-oracle tries to allow a single indexer', async () => { - const { serviceQualityOracle } = sharedContracts - await expect( - serviceQualityOracle.connect(accounts.nonGovernor).allowIndexers([accounts.indexer1.address], '0x'), - ).to.be.revertedWithCustomError(serviceQualityOracle, 'AccessControlUnauthorizedAccount') - }) - - it('should revert when non-oracle tries to allow multiple indexers', async () => { - const { serviceQualityOracle } = sharedContracts - const indexers = [accounts.indexer1.address, accounts.indexer2.address] - await expect( - serviceQualityOracle.connect(accounts.nonGovernor).allowIndexers(indexers, '0x'), - ).to.be.revertedWithCustomError(serviceQualityOracle, 'AccessControlUnauthorizedAccount') - }) - - it('should return correct count for various allowIndexers scenarios', async () => { - const { serviceQualityOracle } = sharedContracts - - // Test 1: Single indexer should return 1 - const singleResult = await serviceQualityOracle - .connect(accounts.operator) - .allowIndexers.staticCall([accounts.indexer1.address], '0x') - expect(singleResult).to.equal(1) - - // Test 2: Multiple indexers should return correct count - const multipleIndexers = [accounts.indexer1.address, accounts.indexer2.address] - const multipleResult = await serviceQualityOracle - .connect(accounts.operator) - .allowIndexers.staticCall(multipleIndexers, '0x') - expect(multipleResult).to.equal(2) - - // Test 3: Empty array should return 0 - const emptyResult = await serviceQualityOracle.connect(accounts.operator).allowIndexers.staticCall([], '0x') - expect(emptyResult).to.equal(0) - - // Test 4: Array with zero addresses should only count non-zero addresses - const withZeroAddresses = [accounts.indexer1.address, ethers.ZeroAddress, accounts.indexer2.address] - const zeroResult = await serviceQualityOracle - .connect(accounts.operator) - .allowIndexers.staticCall(withZeroAddresses, '0x') - expect(zeroResult).to.equal(2) - - // Test 5: Array with duplicates should only count unique indexers - const withDuplicates = [accounts.indexer1.address, accounts.indexer1.address, accounts.indexer2.address] - const duplicateResult = await serviceQualityOracle - .connect(accounts.operator) - .allowIndexers.staticCall(withDuplicates, '0x') - expect(duplicateResult).to.equal(2) - }) - }) - - describe('View Functions', () => { - // Use shared contracts instead of deploying fresh ones for each test - - it('should return 0 when getting last allowed time for non-allowed indexer', async () => { - // Use a fresh deployment to avoid contamination from previous tests - const graphToken = await deployTestGraphToken() - const graphTokenAddress = await graphToken.getAddress() - const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) - - // This should return 0 for a fresh contract - const lastAllowedTime = await freshServiceQualityOracle.getLastAllowedTime(accounts.indexer1.address) - expect(lastAllowedTime).to.equal(0) - }) - - it('should return correct timestamp for allowed indexer', async function () { - const { serviceQualityOracle } = sharedContracts - - // Grant operator role first (governor can grant operator role) - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - // Then operator can grant oracle role (operator is admin of oracle role) - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - - // Allow indexer - await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - - // Get the last allowed time - const lastAllowedTime = await serviceQualityOracle.getLastAllowedTime(accounts.indexer1.address) - - // Get the current block timestamp - const block = await ethers.provider.getBlock('latest') - const blockTimestamp = block ? block.timestamp : 0 - - // The last allowed time should be close to the current block timestamp - expect(lastAllowedTime).to.be.closeTo(blockTimestamp, 5) // Allow 5 seconds of difference - }) - - it('should correctly report if an indexer is allowed', async function () { - // Use a fresh deployment to avoid shared state contamination - const graphToken = await deployTestGraphToken() - const graphTokenAddress = await graphToken.getAddress() - const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) - - // Grant necessary roles (follow role hierarchy) - await freshServiceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - await freshServiceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - - // Enable quality checking first (since it's disabled by default) - await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(true) - - // First, set a non-zero lastOracleUpdateTime to prevent the timeout condition from triggering - await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.nonGovernor.address], '0x') - - // Now check if our test indexer is allowed (it shouldn't be) - expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false - - // Allow indexer - await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - }) - - it('should correctly report if an oracle is authorized', async function () { - const { serviceQualityOracle } = sharedContracts - - // Grant operator role to perform role management - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - - // Initially, user should not be an oracle - expect(await serviceQualityOracle.isAuthorizedOracle(accounts.user.address)).to.be.false - - // Grant oracle role - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.user.address) - expect(await serviceQualityOracle.isAuthorizedOracle(accounts.user.address)).to.be.true - - // Revoke oracle role - await serviceQualityOracle.connect(accounts.operator).revokeRole(ORACLE_ROLE, accounts.user.address) - expect(await serviceQualityOracle.isAuthorizedOracle(accounts.user.address)).to.be.false - }) - - it('should return true for all indexers when quality checking is disabled', async function () { - // Use a fresh deployment to avoid shared state contamination - const graphToken = await deployTestGraphToken() - const graphTokenAddress = await graphToken.getAddress() - const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) - - // Grant necessary roles (follow role hierarchy) - await freshServiceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - await freshServiceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - - // Enable quality checking first (since it's disabled by default) - await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(true) - - // First, set a non-zero lastOracleUpdateTime to prevent the timeout condition from triggering - await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.nonGovernor.address], '0x') - - // Set a very long oracle update timeout to prevent that condition from triggering - await freshServiceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year - - // Now check if our test indexer is allowed (it shouldn't be) - expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false - - // Disable quality checking - await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(false) - - // Now indexer should be allowed even without being explicitly allowed - expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - }) - - it('should return true for all indexers when oracle update timeout is exceeded', async function () { - // Use a fresh deployment to avoid shared state contamination - const graphToken = await deployTestGraphToken() - const graphTokenAddress = await graphToken.getAddress() - const freshServiceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) - - // Grant necessary roles (follow role hierarchy) - await freshServiceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - await freshServiceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - - // Enable quality checking first (since it's disabled by default) - await freshServiceQualityOracle.connect(accounts.operator).setQualityChecking(true) - - // First, set a non-zero lastOracleUpdateTime to prevent the initial timeout condition from triggering - await freshServiceQualityOracle.connect(accounts.operator).allowIndexers([accounts.nonGovernor.address], '0x') - - // Set a very long oracle update timeout initially - await freshServiceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year - - // Now check if our test indexer is allowed (it shouldn't be) - expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false - - // Set a short oracle update timeout - await freshServiceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(60) // 1 minute - - // Advance time beyond the timeout - await time.increase(120) // 2 minutes - - // Now indexer should be allowed even without being explicitly allowed - expect(await freshServiceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - }) - - it('should return false for indexer after allowed period expires', async function () { - const { serviceQualityOracle } = sharedContracts - - // Grant necessary roles (follow role hierarchy) - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - - // Enable quality checking first (since it's disabled by default) - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) - - // Set a very long oracle update timeout to prevent that condition from triggering - await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year - - // Allow indexer - await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - - // Set a short allowed period - await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(60) // 1 minute - - // Advance time beyond allowed period - await time.increase(120) // 2 minutes - - // Now indexer should not be allowed - expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false - }) - - it('should return true for indexer after re-allowing', async function () { - const { serviceQualityOracle } = sharedContracts - - // Grant necessary roles - await serviceQualityOracle.connect(accounts.governor).grantRole(OPERATOR_ROLE, accounts.operator.address) - await serviceQualityOracle.connect(accounts.operator).grantRole(ORACLE_ROLE, accounts.operator.address) - - // Enable quality checking first (since it's disabled by default) - await serviceQualityOracle.connect(accounts.operator).setQualityChecking(true) - - // Set a very long oracle update timeout to prevent that condition from triggering - await serviceQualityOracle.connect(accounts.operator).setOracleUpdateTimeout(365 * 24 * 60 * 60) // 1 year - - // Allow indexer - await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - - // Set a short allowed period - await serviceQualityOracle.connect(accounts.operator).setAllowedPeriod(60) // 1 minute - - // Advance time beyond allowed period - await time.increase(120) // 2 minutes - - // Indexer should not be allowed - expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.false - - // Re-allow indexer - await serviceQualityOracle.connect(accounts.operator).allowIndexers([accounts.indexer1.address], '0x') - - // Now indexer should be allowed again - expect(await serviceQualityOracle.isAllowed(accounts.indexer1.address)).to.be.true - }) - }) -}) diff --git a/packages/issuance/test/tests/consolidated/AccessControl.test.ts b/packages/issuance/test/tests/consolidated/AccessControl.test.ts index 385e9715e..9eb42434c 100644 --- a/packages/issuance/test/tests/consolidated/AccessControl.test.ts +++ b/packages/issuance/test/tests/consolidated/AccessControl.test.ts @@ -21,11 +21,11 @@ describe('Consolidated Access Control Tests', () => { await resetContractState(contracts, accounts) }) - describe('ServiceQualityOracle Access Control', () => { + describe('RewardsEligibilityOracle Access Control', () => { describe('Role Management Methods', () => { it('should enforce access control on role management methods', async () => { // First grant governor the OPERATOR_ROLE so they can manage oracle roles - await contracts.serviceQualityOracle + await contracts.rewardsEligibilityOracle .connect(accounts.governor) .grantRole(SHARED_CONSTANTS.OPERATOR_ROLE, accounts.governor.address) @@ -45,37 +45,37 @@ describe('Consolidated Access Control Tests', () => { for (const { method, args, description } of methods) { // Test unauthorized access await expect( - contracts.serviceQualityOracle.connect(accounts.nonGovernor)[method](...args), + contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor)[method](...args), `${description} should revert for unauthorized account`, - ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') + ).to.be.revertedWithCustomError(contracts.rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount') // Test authorized access await expect( - contracts.serviceQualityOracle.connect(accounts.governor)[method](...args), + contracts.rewardsEligibilityOracle.connect(accounts.governor)[method](...args), `${description} should succeed for authorized account`, ).to.not.be.reverted } }) }) - it('should require ORACLE_ROLE for allowIndexers', async () => { + it('should require ORACLE_ROLE for renewIndexerEligibility', async () => { // Setup: Grant governor OPERATOR_ROLE first, then grant oracle role - await contracts.serviceQualityOracle + await contracts.rewardsEligibilityOracle .connect(accounts.governor) .grantRole(SHARED_CONSTANTS.OPERATOR_ROLE, accounts.governor.address) - await contracts.serviceQualityOracle + await contracts.rewardsEligibilityOracle .connect(accounts.governor) .grantRole(SHARED_CONSTANTS.ORACLE_ROLE, accounts.operator.address) // Non-oracle should be rejected await expect( - contracts.serviceQualityOracle + contracts.rewardsEligibilityOracle .connect(accounts.nonGovernor) - .allowIndexers([accounts.nonGovernor.address], '0x'), - ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') + .renewIndexerEligibility([accounts.nonGovernor.address], '0x'), + ).to.be.revertedWithCustomError(contracts.rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount') // Oracle should be allowed - const hasRole = await contracts.serviceQualityOracle.hasRole( + const hasRole = await contracts.rewardsEligibilityOracle.hasRole( SHARED_CONSTANTS.ORACLE_ROLE, accounts.operator.address, ) @@ -84,49 +84,49 @@ describe('Consolidated Access Control Tests', () => { it('should require OPERATOR_ROLE for pause operations', async () => { // Setup: Grant pause role to governor - await contracts.serviceQualityOracle + await contracts.rewardsEligibilityOracle .connect(accounts.governor) .grantRole(SHARED_CONSTANTS.PAUSE_ROLE, accounts.governor.address) // Non-pause-role account should be rejected - await expect(contracts.serviceQualityOracle.connect(accounts.nonGovernor).pause()).to.be.revertedWithCustomError( - contracts.serviceQualityOracle, - 'AccessControlUnauthorizedAccount', - ) await expect( - contracts.serviceQualityOracle.connect(accounts.nonGovernor).unpause(), - ).to.be.revertedWithCustomError(contracts.serviceQualityOracle, 'AccessControlUnauthorizedAccount') + contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor).pause(), + ).to.be.revertedWithCustomError(contracts.rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount') + await expect( + contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor).unpause(), + ).to.be.revertedWithCustomError(contracts.rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount') // PAUSE_ROLE account should be allowed - await expect(contracts.serviceQualityOracle.connect(accounts.governor).pause()).to.not.be.reverted + await expect(contracts.rewardsEligibilityOracle.connect(accounts.governor).pause()).to.not.be.reverted }) it('should require OPERATOR_ROLE for configuration methods', async () => { // Test all operator-only configuration methods const operatorOnlyMethods = [ { - call: () => contracts.serviceQualityOracle.connect(accounts.nonGovernor).setAllowedPeriod(14 * 24 * 60 * 60), - name: 'setAllowedPeriod', + call: () => + contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor).setEligibilityPeriod(14 * 24 * 60 * 60), + name: 'setEligibilityPeriod', }, { call: () => - contracts.serviceQualityOracle.connect(accounts.nonGovernor).setOracleUpdateTimeout(60 * 24 * 60 * 60), + contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor).setOracleUpdateTimeout(60 * 24 * 60 * 60), name: 'setOracleUpdateTimeout', }, { - call: () => contracts.serviceQualityOracle.connect(accounts.nonGovernor).setQualityChecking(false), - name: 'setQualityChecking(false)', + call: () => contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor).setEligibilityValidation(false), + name: 'setEligibilityValidation(false)', }, { - call: () => contracts.serviceQualityOracle.connect(accounts.nonGovernor).setQualityChecking(true), - name: 'setQualityChecking(true)', + call: () => contracts.rewardsEligibilityOracle.connect(accounts.nonGovernor).setEligibilityValidation(true), + name: 'setEligibilityValidation(true)', }, ] // Test all methods in sequence for (const method of operatorOnlyMethods) { await expect(method.call()).to.be.revertedWithCustomError( - contracts.serviceQualityOracle, + contracts.rewardsEligibilityOracle, 'AccessControlUnauthorizedAccount', ) } @@ -138,14 +138,14 @@ describe('Consolidated Access Control Tests', () => { const governorRole = SHARED_CONSTANTS.GOVERNOR_ROLE // All contracts should recognize the governor - expect(await contracts.serviceQualityOracle.hasRole(governorRole, accounts.governor.address)).to.be.true + expect(await contracts.rewardsEligibilityOracle.hasRole(governorRole, accounts.governor.address)).to.be.true }) it('should have correct role admin hierarchy', async () => { const governorRole = SHARED_CONSTANTS.GOVERNOR_ROLE // GOVERNOR_ROLE should be admin of itself (allowing governors to manage other governors) - expect(await contracts.serviceQualityOracle.getRoleAdmin(governorRole)).to.equal(governorRole) + expect(await contracts.rewardsEligibilityOracle.getRoleAdmin(governorRole)).to.equal(governorRole) }) }) }) diff --git a/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts b/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts index c89f3e96e..fbbe52979 100644 --- a/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts +++ b/packages/issuance/test/tests/consolidated/InterfaceCompliance.test.ts @@ -3,7 +3,7 @@ import { expect } from 'chai' import { ethers } from 'hardhat' import { shouldSupportERC165Interface } from '../../utils/testPatterns' -import { deployServiceQualityOracle, deployTestGraphToken, getTestAccounts } from '../helpers/fixtures' +import { deployRewardsEligibilityOracle, deployTestGraphToken, getTestAccounts } from '../helpers/fixtures' // Import generated interface IDs import interfaceIds from '../helpers/interfaceIds' @@ -22,19 +22,19 @@ describe('ERC-165 Interface Compliance', () => { const graphToken = await deployTestGraphToken() const graphTokenAddress = await graphToken.getAddress() - const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + const rewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) contracts = { - serviceQualityOracle, + rewardsEligibilityOracle, } }) describe( - 'ServiceQualityOracle Interface Compliance', + 'RewardsEligibilityOracle Interface Compliance', shouldSupportERC165Interface( - () => contracts.serviceQualityOracle, - interfaceIds.IServiceQualityOracle, - 'IServiceQualityOracle', + () => contracts.rewardsEligibilityOracle, + interfaceIds.IRewardsEligibilityOracle, + 'IRewardsEligibilityOracle', ), ) @@ -43,11 +43,11 @@ describe('ERC-165 Interface Compliance', () => { const InterfaceIdExtractorFactory = await ethers.getContractFactory('InterfaceIdExtractor') const extractor = await InterfaceIdExtractorFactory.deploy() - expect(await extractor.getIServiceQualityOracleId()).to.equal(interfaceIds.IServiceQualityOracle) + expect(await extractor.getIRewardsEligibilityOracleId()).to.equal(interfaceIds.IRewardsEligibilityOracle) }) it('should have valid interface IDs (not zero)', () => { - expect(interfaceIds.IServiceQualityOracle).to.not.equal('0x00000000') + expect(interfaceIds.IRewardsEligibilityOracle).to.not.equal('0x00000000') }) }) }) diff --git a/packages/issuance/test/tests/helpers/fixtures.ts b/packages/issuance/test/tests/helpers/fixtures.ts index 229438591..0c2ff3e18 100644 --- a/packages/issuance/test/tests/helpers/fixtures.ts +++ b/packages/issuance/test/tests/helpers/fixtures.ts @@ -57,37 +57,41 @@ export async function deployTestGraphToken(): Promise { } /** - * Deploy the ServiceQualityOracle contract with proxy using OpenZeppelin's upgrades library + * Deploy the RewardsEligibilityOracle contract with proxy using OpenZeppelin's upgrades library * @param graphToken The Graph Token contract address * @param governor The governor signer * @param validityPeriod The validity period in seconds (default: 7 days) */ -export async function deployServiceQualityOracle( +export async function deployRewardsEligibilityOracle( graphToken: string, governor: HardhatEthersSigner, validityPeriod: number = 7 * 24 * 60 * 60, // 7 days in seconds // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { // Deploy implementation and proxy using OpenZeppelin's upgrades library - const ServiceQualityOracleFactory = await ethers.getContractFactory('ServiceQualityOracle') + const RewardsEligibilityOracleFactory = await ethers.getContractFactory('RewardsEligibilityOracle') // Deploy proxy with implementation - const serviceQualityOracleContract = await upgrades.deployProxy(ServiceQualityOracleFactory, [governor.address], { - constructorArgs: [graphToken], - initializer: 'initialize', - }) + const rewardsEligibilityOracleContract = await upgrades.deployProxy( + RewardsEligibilityOracleFactory, + [governor.address], + { + constructorArgs: [graphToken], + initializer: 'initialize', + }, + ) // Get the contract instance - const serviceQualityOracle = serviceQualityOracleContract + const rewardsEligibilityOracle = rewardsEligibilityOracleContract // Set the validity period if it's different from the default if (validityPeriod !== 7 * 24 * 60 * 60) { // First grant operator role to governor so they can set the validity period - await serviceQualityOracle.connect(governor).grantOperatorRole(governor.address) - await serviceQualityOracle.connect(governor).setValidityPeriod(validityPeriod) + await rewardsEligibilityOracle.connect(governor).grantOperatorRole(governor.address) + await rewardsEligibilityOracle.connect(governor).setValidityPeriod(validityPeriod) // Now revoke the operator role from governor to ensure tests start with clean state - await serviceQualityOracle.connect(governor).revokeRole(OPERATOR_ROLE, governor.address) + await rewardsEligibilityOracle.connect(governor).revokeRole(OPERATOR_ROLE, governor.address) } - return serviceQualityOracle + return rewardsEligibilityOracle } diff --git a/packages/issuance/test/tests/helpers/interfaceIds.js b/packages/issuance/test/tests/helpers/interfaceIds.js index add1c098b..3cbe4e22d 100644 --- a/packages/issuance/test/tests/helpers/interfaceIds.js +++ b/packages/issuance/test/tests/helpers/interfaceIds.js @@ -1,4 +1,4 @@ // Auto-generated interface IDs from Solidity compilation module.exports = { - IServiceQualityOracle: '0xbabcc539', + IRewardsEligibilityOracle: '0x66e305fd', } diff --git a/packages/issuance/test/tests/helpers/sharedFixtures.ts b/packages/issuance/test/tests/helpers/sharedFixtures.ts index 29d15411d..8e56c4619 100644 --- a/packages/issuance/test/tests/helpers/sharedFixtures.ts +++ b/packages/issuance/test/tests/helpers/sharedFixtures.ts @@ -6,7 +6,7 @@ import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' const { ethers } = require('hardhat') -const { getTestAccounts, deployTestGraphToken, deployServiceQualityOracle } = require('./fixtures') +const { getTestAccounts, deployTestGraphToken, deployRewardsEligibilityOracle } = require('./fixtures') // Shared test constants export const SHARED_CONSTANTS = { @@ -38,12 +38,12 @@ export interface SharedContracts { // eslint-disable-next-line @typescript-eslint/no-explicit-any graphToken: any // eslint-disable-next-line @typescript-eslint/no-explicit-any - serviceQualityOracle: any + rewardsEligibilityOracle: any } export interface SharedAddresses { graphToken: string - serviceQualityOracle: string + rewardsEligibilityOracle: string } export interface SharedFixtures { @@ -62,12 +62,12 @@ export async function deploySharedContracts(): Promise { const graphToken = await deployTestGraphToken() const graphTokenAddress = await graphToken.getAddress() - const serviceQualityOracle = await deployServiceQualityOracle(graphTokenAddress, accounts.governor) + const rewardsEligibilityOracle = await deployRewardsEligibilityOracle(graphTokenAddress, accounts.governor) // Cache addresses const addresses: SharedAddresses = { graphToken: graphTokenAddress, - serviceQualityOracle: await serviceQualityOracle.getAddress(), + rewardsEligibilityOracle: await rewardsEligibilityOracle.getAddress(), } // Create helper @@ -75,7 +75,7 @@ export async function deploySharedContracts(): Promise { accounts, contracts: { graphToken, - serviceQualityOracle, + rewardsEligibilityOracle, }, addresses, } @@ -86,19 +86,19 @@ export async function deploySharedContracts(): Promise { * Optimized to avoid redeployment while ensuring clean state */ export async function resetContractState(contracts: SharedContracts, accounts: TestAccounts): Promise { - const { serviceQualityOracle } = contracts + const { rewardsEligibilityOracle } = contracts - // Reset ServiceQualityOracle state + // Reset RewardsEligibilityOracle state try { - if (await serviceQualityOracle.paused()) { - await serviceQualityOracle.connect(accounts.governor).unpause() + if (await rewardsEligibilityOracle.paused()) { + await rewardsEligibilityOracle.connect(accounts.governor).unpause() } - // Reset quality checking to default (disabled) - if (await serviceQualityOracle.isQualityCheckingActive()) { - await serviceQualityOracle.connect(accounts.governor).disableQualityChecking() + // Reset eligibility validation to default (disabled) + if (await rewardsEligibilityOracle.getEligibilityValidation()) { + await rewardsEligibilityOracle.connect(accounts.governor).setEligibilityValidation(false) } } catch (error) { - console.warn('ServiceQualityOracle state reset failed:', error instanceof Error ? error.message : String(error)) + console.warn('RewardsEligibilityOracle state reset failed:', error instanceof Error ? error.message : String(error)) } } From 92c288a13099c8b4b6d96ea4a2492dc5c3e30e15 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 17 Sep 2025 15:38:50 +0000 Subject: [PATCH 16/28] feat: changing dir from quality to eligibility --- .../{quality => eligibility}/IRewardsEligibilityOracle.sol | 0 packages/contracts/contracts/rewards/RewardsManager.sol | 2 +- packages/contracts/contracts/rewards/RewardsManagerStorage.sol | 2 +- .../contracts/contracts/tests/MockRewardsEligibilityOracle.sol | 2 +- .../{quality => eligibility}/RewardsEligibilityOracle.md | 0 .../{quality => eligibility}/RewardsEligibilityOracle.sol | 2 +- packages/issuance/contracts/test/InterfaceIdExtractor.sol | 2 +- 7 files changed, 5 insertions(+), 5 deletions(-) rename packages/common/contracts/{quality => eligibility}/IRewardsEligibilityOracle.sol (100%) rename packages/issuance/contracts/{quality => eligibility}/RewardsEligibilityOracle.md (100%) rename packages/issuance/contracts/{quality => eligibility}/RewardsEligibilityOracle.sol (99%) diff --git a/packages/common/contracts/quality/IRewardsEligibilityOracle.sol b/packages/common/contracts/eligibility/IRewardsEligibilityOracle.sol similarity index 100% rename from packages/common/contracts/quality/IRewardsEligibilityOracle.sol rename to packages/common/contracts/eligibility/IRewardsEligibilityOracle.sol diff --git a/packages/contracts/contracts/rewards/RewardsManager.sol b/packages/contracts/contracts/rewards/RewardsManager.sol index ca1cfe847..e40f0344f 100644 --- a/packages/contracts/contracts/rewards/RewardsManager.sol +++ b/packages/contracts/contracts/rewards/RewardsManager.sol @@ -17,7 +17,7 @@ import { IStaking, IStakingBase } from "../staking/IStaking.sol"; import { RewardsManagerV5Storage } from "./RewardsManagerStorage.sol"; import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; /** * @title Rewards Manager Contract diff --git a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol index 19f3efa07..35f45ff91 100644 --- a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol +++ b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol @@ -6,7 +6,7 @@ pragma solidity 0.7.6; import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; import { IRewardsIssuer } from "./IRewardsIssuer.sol"; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; import { Managed } from "../governance/Managed.sol"; /** diff --git a/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol b/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol index ebd8579f4..0ef881811 100644 --- a/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol +++ b/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol @@ -2,7 +2,7 @@ pragma solidity 0.7.6; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; import { ERC165 } from "@openzeppelin/contracts/introspection/ERC165.sol"; /** diff --git a/packages/issuance/contracts/quality/RewardsEligibilityOracle.md b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.md similarity index 100% rename from packages/issuance/contracts/quality/RewardsEligibilityOracle.md rename to packages/issuance/contracts/eligibility/RewardsEligibilityOracle.md diff --git a/packages/issuance/contracts/quality/RewardsEligibilityOracle.sol b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol similarity index 99% rename from packages/issuance/contracts/quality/RewardsEligibilityOracle.sol rename to packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol index cfebea197..447ff7547 100644 --- a/packages/issuance/contracts/quality/RewardsEligibilityOracle.sol +++ b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.27; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; import { BaseUpgradeable } from "../common/BaseUpgradeable.sol"; /** diff --git a/packages/issuance/contracts/test/InterfaceIdExtractor.sol b/packages/issuance/contracts/test/InterfaceIdExtractor.sol index 85b8cd035..22a2e4ee9 100644 --- a/packages/issuance/contracts/test/InterfaceIdExtractor.sol +++ b/packages/issuance/contracts/test/InterfaceIdExtractor.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/quality/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; /** * @title InterfaceIdExtractor From 05f0d4e0099df0b3fbccbd92889bee3194f684ae Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 17 Sep 2025 15:50:24 +0000 Subject: [PATCH 17/28] fix: missed references to service quality --- packages/contracts/test/tests/unit/rewards/rewards.test.ts | 2 +- .../issuance/contracts/eligibility/RewardsEligibilityOracle.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts/test/tests/unit/rewards/rewards.test.ts b/packages/contracts/test/tests/unit/rewards/rewards.test.ts index 704148476..0e590e761 100644 --- a/packages/contracts/test/tests/unit/rewards/rewards.test.ts +++ b/packages/contracts/test/tests/unit/rewards/rewards.test.ts @@ -920,7 +920,7 @@ describe('Rewards', () => { // Calculate expected rewards (for verification in the event) const expectedIndexingRewards = toGRT('1400') - // Close allocation. At this point rewards should be denied due to service quality + // 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') diff --git a/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.md b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.md index c9f9b2010..fad9ac06c 100644 --- a/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.md +++ b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.md @@ -150,7 +150,7 @@ In normal operation, the first condition is expected to be the only one that app While this simple model allows the criteria for providing good service to evolve over time (which is essential for the long-term health of the network), it captures sufficient information on-chain for indexers to be able to monitor their eligibility. This is important to ensure that even in the absence of other sources of information regarding observed indexer service, indexers have a good transparency about if they are being observed to be providing good service, and for how long their current approval is valid. -It might initially seem safer to allow indexers by default unless an oracle explicitly denies an indexer. While that might seem safer from the perspective of the ServiceQualityOracle in isolation, in the absence of a more sophisticated voting system it would make the system vulnerable to a single bad oracle denying many indexers. The design of deny by default is better suited to allowing redundant oracles to be working in parallel, where only one needs to be successfully detecting indexers that are providing quality service, as well as eventually allowing different oracles to have different approval criteria and/or inputs. Therefore deny by default facilitates a more resilient and open oracle system that is less vulnerable to a single points of failure, and more open to increasing decentralization over time. +It might initially seem safer to allow indexers by default unless an oracle explicitly denies an indexer. While that might seem safer from the perspective of the RewardsEligibilityOracle in isolation, in the absence of a more sophisticated voting system it would make the system vulnerable to a single bad oracle denying many indexers. The design of deny by default is better suited to allowing redundant oracles to be working in parallel, where only one needs to be successfully detecting indexers that are providing quality service, as well as eventually allowing different oracles to have different approval criteria and/or inputs. Therefore deny by default facilitates a more resilient and open oracle system that is less vulnerable to a single points of failure, and more open to increasing decentralization over time. In general to be rewarded for providing service on The Graph, there is expected to be proof provided of good operation (such as for proof of indexing). While proof should be required to receive rewards, the system is designed for participants to have confidence is being able to adequately prove good operation (and in the case of oracles, be seen by at least one observer) that is sufficient to allow the indexer to receive rewards. The oracle model is in general far more suited to collecting evidence of good operation, from multiple independent observers, rather than any observer being able to establish that an indexer is not providing good service. From 3acec27c4ecb0c8832656f294f07d49982c13e76 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Wed, 17 Sep 2025 16:31:43 +0000 Subject: [PATCH 18/28] fix(devcontainer): improve pnpm cache setup and permissions - Remove PNPM_HOME env var to use pnpm defaults - Simplify host-setup.sh to only create volumes - Add robust pnpm cache directory creation in project-setup.sh - Add proper error handling and permission setting - Fix permission denied errors on container startup - Ensure setup works on both first run and subsequent runs --- .devcontainer/docker-compose.yml | 3 ++- .devcontainer/host-setup.sh | 15 ++------------- .devcontainer/project-setup.sh | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index d599d281c..0d6e2a751 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -26,7 +26,7 @@ services: - PIP_CACHE_DIR=/home/vscode/.cache/pip # pnpm cache is safe to share due to content-addressable storage - - PNPM_HOME=/home/vscode/.local/share/pnpm + # PNPM_HOME is for global packages and should be user-specific (uses default) - PNPM_STORE_DIR=/home/vscode/.cache/pnpm/store # Note: NPM, Foundry, and Solidity caches are intentionally not set # to avoid cross-branch contamination. Tools will use their default locations. @@ -39,6 +39,7 @@ services: - vscode-data:/home/vscode/.local/share - vscode-bin:/home/vscode/.local/bin - vscode-cache:/home/vscode/.cache + # Global pnpm store (content-addressable cache only) - global-pnpm-cache:/home/vscode/.cache/pnpm volumes: diff --git a/.devcontainer/host-setup.sh b/.devcontainer/host-setup.sh index b979fe7ae..3d2aa0927 100755 --- a/.devcontainer/host-setup.sh +++ b/.devcontainer/host-setup.sh @@ -27,19 +27,8 @@ for volume in "${GLOBAL_VOLUMES[@]}"; do done echo "" -echo "Setting up proper ownership for cache volumes..." -# The vscode user in devcontainers typically has UID 1000 and GID 1000 -# We need to ensure the volumes have the correct ownership -for volume in "${GLOBAL_VOLUMES[@]}"; do - echo "Setting ownership for $volume..." - # Create a temporary container to fix ownership - docker run --rm \ - -v "$volume":/volume \ - --user root \ - mcr.microsoft.com/devcontainers/base:debian \ - chown -R 1000:1000 /volume - echo "✓ $volume ownership set to vscode user (1000:1000)" -done +echo "Cache volumes created successfully!" +echo "Note: Permissions will be set automatically when the dev container starts." echo "" echo "Global cache volumes setup completed!" diff --git a/.devcontainer/project-setup.sh b/.devcontainer/project-setup.sh index 66d6c8728..93ffcf328 100755 --- a/.devcontainer/project-setup.sh +++ b/.devcontainer/project-setup.sh @@ -11,6 +11,26 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" echo "Script directory: $SCRIPT_DIR" echo "Repository root: $REPO_ROOT" +# Ensure pnpm cache directory exists with correct permissions +echo "Setting up pnpm cache directory..." +# Fix ownership if the directory exists but is owned by root +if [ -d ~/.cache/pnpm ] && [ "$(stat -c %U ~/.cache/pnpm 2>/dev/null || echo 'vscode')" = "root" ]; then + echo "Fixing pnpm cache directory ownership..." + sudo chown -R vscode:vscode ~/.cache/pnpm +fi +# Create the directory structure with proper permissions +if mkdir -p ~/.cache/pnpm/store 2>/dev/null || sudo mkdir -p ~/.cache/pnpm/store; then + # Ensure the directory is writable by the vscode user (use sudo if needed) + if [ "$(stat -c %U ~/.cache/pnpm 2>/dev/null || echo 'vscode')" = "root" ]; then + sudo chown -R vscode:vscode ~/.cache/pnpm + fi + chmod -R 755 ~/.cache/pnpm + echo "✓ pnpm cache directory created successfully" +else + echo "❌ Failed to create pnpm cache directory" + exit 1 +fi + # Install project dependencies echo "Installing project dependencies..." if [ -f "$REPO_ROOT/package.json" ]; then From 41c7b96a38ca7832b977bdf9c37e7c7005dffe6d Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Thu, 18 Sep 2025 12:25:12 +0000 Subject: [PATCH 19/28] feat: merging post-horizon main --- .gitignore | 13 +- .markdownlintignore | 39 + CLAUDE.md | 164 + count-patterns.txt | 2 +- eslint.config.mjs | 5 +- packages/address-book/CHANGELOG.md | 12 + packages/address-book/README.md | 85 + packages/address-book/package.json | 36 + packages/address-book/prettier.config.cjs | 1 + .../scripts/copy-addresses-for-publish.js | 68 + .../address-book/scripts/restore-symlinks.js | 55 + .../address-book/src/horizon/addresses.json | 1 + .../src/subgraph-service/addresses.json | 1 + packages/common/README.md | 126 - packages/common/hardhat.config.js | 37 - packages/common/package.json | 47 - packages/common/tsconfig.json | 11 - packages/contracts/CHANGELOG.md | 18 + .../contracts/arbitrum/ITokenGateway.sol | 2 +- .../contracts/contracts/base/IMulticall.sol | 2 +- .../contracts/contracts/curation/Curation.sol | 4 +- .../contracts/curation/CurationStorage.sol | 13 + .../contracts/curation/ICuration.sol | 2 +- .../contracts/contracts/discovery/IGNS.sol | 2 +- .../contracts/discovery/IServiceRegistry.sol | 2 +- .../contracts/discovery/ISubgraphNFT.sol | 2 +- .../contracts/contracts/discovery/L1GNS.sol | 2 +- .../contracts/disputes/DisputeManager.sol | 2 +- .../contracts/disputes/IDisputeManager.sol | 2 +- .../contracts/epochs/IEpochManager.sol | 2 +- .../contracts/gateway/ICallhookReceiver.sol | 2 +- .../contracts/gateway/L1GraphTokenGateway.sol | 2 +- .../contracts/governance/Controller.sol | 6 +- .../contracts/governance/Governed.sol | 2 +- .../contracts/governance/IController.sol | 2 +- .../contracts/governance/IManaged.sol | 2 +- .../contracts/governance/Managed.sol | 4 +- .../contracts/governance/Pausable.sol | 16 +- .../contracts/l2/curation/IL2Curation.sol | 8 +- .../contracts/l2/curation/L2Curation.sol | 29 +- .../contracts/l2/discovery/IL2GNS.sol | 2 +- .../contracts/l2/staking/IL2Staking.sol | 27 +- .../contracts/l2/staking/IL2StakingBase.sol | 2 +- .../contracts/l2/staking/IL2StakingTypes.sol | 22 + .../contracts/l2/staking/L2Staking.sol | 27 +- .../contracts/payments/AllocationExchange.sol | 3 +- .../contracts/rewards/IRewardsManager.sol | 150 + .../contracts/rewards/RewardsManager.sol | 130 +- .../rewards/RewardsManagerStorage.sol | 11 +- .../rewards/SubgraphAvailabilityManager.sol | 2 +- .../contracts/contracts/staking/IStaking.sol | 2 +- .../contracts/staking/IStakingBase.sol | 18 +- .../contracts/staking/IStakingData.sol | 2 +- .../contracts/staking/IStakingExtension.sol | 10 +- .../contracts/contracts/staking/L1Staking.sol | 20 +- .../contracts/contracts/staking/Staking.sol | 49 +- .../contracts/staking/StakingExtension.sol | 13 +- .../contracts/staking/StakingStorage.sol | 4 +- .../contracts/staking/libs/IStakes.sol | 13 + .../contracts/staking/libs/Stakes.sol | 29 +- .../tests/MockRewardsEligibilityOracle.sol | 2 +- .../contracts/contracts/token/IGraphToken.sol | 43 + .../contracts/upgrades/GraphProxy.sol | 5 +- .../contracts/upgrades/GraphProxyAdmin.sol | 2 +- .../contracts/upgrades/GraphProxyStorage.sol | 2 +- .../contracts/upgrades/GraphUpgradeable.sol | 2 +- .../contracts/upgrades/IGraphProxy.sol | 2 +- .../contracts/contracts/utils/TokenUtils.sol | 4 +- packages/contracts/package.json | 8 +- packages/contracts/task/CHANGELOG.md | 24 + packages/contracts/task/package.json | 7 +- packages/contracts/test/CHANGELOG.md | 24 + packages/contracts/test/hardhat.config.ts | 1 + packages/contracts/test/package.json | 6 +- packages/contracts/test/scripts/test | 6 +- .../test/tests/unit/l2/l2Curation.test.ts | 2 +- .../test/tests/unit/rewards/rewards.test.ts | 26 +- .../tests/unit/staking/allocation.test.ts | 2 +- packages/data-edge/package.json | 2 +- .../.markdownlint.json | 0 .../.mocharc.json | 2 +- packages/hardhat-graph-protocol/CHANGELOG.md | 219 + packages/hardhat-graph-protocol/README.md | 242 + packages/hardhat-graph-protocol/package.json | 66 + .../prettier.config.cjs | 0 .../hardhat-graph-protocol/src/accounts.ts | 96 + packages/hardhat-graph-protocol/src/config.ts | 66 + .../src}/error.ts | 2 +- packages/hardhat-graph-protocol/src/gre.ts | 106 + .../src}/index.ts | 7 - .../src}/logger.ts | 2 +- .../src/type-extensions.ts | 45 + packages/hardhat-graph-protocol/src/types.ts | 32 + .../test/config.test.ts | 73 + .../default-config/hardhat.config.ts | 0 .../test/fixtures/files/addresses-arbsep.json | 223 + .../files/addresses-global-short.json} | 0 .../fixtures/files/addresses-global.json} | 0 .../test/fixtures/files/addresses-hre.json} | 0 .../files/addresses-network-short.json} | 0 .../fixtures/files/addresses-network.json} | 0 .../test/fixtures/files/addresses-opt.json} | 0 .../global-address-book}/hardhat.config.ts | 18 +- .../invalid-address-book}/hardhat.config.ts | 31 +- .../network-address-book/hardhat.config.ts | 53 + .../fixtures/no-path-config/addresses.json} | 0 .../fixtures/no-path-config/hardhat.config.ts | 47 + .../fixtures/path-config/hardhat.config.ts | 57 + .../hardhat-graph-protocol/test/gre.test.ts | 44 + .../hardhat-graph-protocol/test/helpers.ts | 37 + packages/hardhat-graph-protocol/tsconfig.json | 7 + packages/horizon/.solhintignore | 1 + packages/horizon/CHANGELOG.md | 61 + packages/horizon/README.md | 71 + .../horizon/addresses-integration-tests.json | 40 + packages/horizon/addresses.json | 55 + .../horizon/audits/2024-06-OZ-horizon.pdf | Bin 0 -> 406340 bytes .../horizon/audits/2024-11-Trust-horizon.pdf | Bin 0 -> 689393 bytes .../2025-03-OZ-pre audit assessment.pdf | Bin 0 -> 153031 bytes .../2025-05-OZ-The Graph Horizon Audit.pdf | Bin 0 -> 424971 bytes ...h Horizon Missed Issues Initial Report.pdf | Bin 0 -> 125299 bytes .../contracts/data-service/DataService.sol | 72 + .../data-service/DataServiceStorage.sol | 14 + .../extensions/DataServiceFees.sol | 154 + .../extensions/DataServiceFeesStorage.sol | 26 + .../extensions/DataServicePausable.sol | 58 + .../DataServicePausableUpgradeable.sol | 73 + .../extensions/DataServiceRescuable.sol | 79 + .../libraries/ProvisionTracker.sol | 80 + .../utilities/ProvisionManager.sol | 323 + .../utilities/ProvisionManagerStorage.sol | 35 + .../contracts/libraries/Denominations.sol | 24 + .../contracts/libraries/LibFixedMath.sol | 243 + .../contracts/libraries/LinkedList.sol | 123 + .../horizon/contracts/libraries/MathUtils.sol | 50 + .../horizon/contracts/libraries/PPMMath.sol | 60 + .../horizon/contracts/libraries/UintRange.sol | 21 + .../contracts/mocks/ControllerMock.sol | 125 + .../horizon/contracts/mocks/CurationMock.sol | 19 + packages/horizon/contracts/mocks/Dummy.sol | 5 + .../contracts/mocks/EpochManagerMock.sol | 63 + .../horizon/contracts/mocks/MockGRTToken.sol | 49 + .../contracts/mocks/RewardsManagerMock.sol | 26 + packages/horizon/contracts/mocks/imports.sol | 9 + .../contracts/payments/GraphPayments.sol | 114 + .../contracts/payments/PaymentsEscrow.sol | 172 + .../collectors/GraphTallyCollector.sol | 230 + .../contracts/staking/HorizonStaking.sol | 1260 + .../contracts/staking/HorizonStakingBase.sol | 357 + .../staking/HorizonStakingExtension.sol | 481 + .../staking/HorizonStakingStorage.sol | 182 + .../staking/libraries/ExponentialRebates.sol | 66 + .../contracts/staking/utilities/Managed.sol | 66 + .../contracts/utilities/Authorizable.sol | 135 + .../contracts/utilities/GraphDirectory.sol | 226 + packages/horizon/foundry.toml | 9 + packages/horizon/hardhat.config.ts | 44 + .../ignition/configs/migrate.default.json5 | 45 + .../ignition/configs/migrate.fork1.json5 | 45 + .../configs/migrate.integration.json5 | 45 + .../ignition/configs/protocol.default.json5 | 39 + .../configs/protocol.localNetwork.json5 | 39 + .../ignition/modules/core/GraphPayments.ts | 79 + .../modules/core/GraphTallyCollector.ts | 43 + .../ignition/modules/core/HorizonProxies.ts | 90 + .../ignition/modules/core/HorizonStaking.ts | 108 + .../ignition/modules/core/PaymentsEscrow.ts | 79 + .../horizon/ignition/modules/core/core.ts | 44 + packages/horizon/ignition/modules/deploy.ts | 78 + packages/horizon/ignition/modules/index.ts | 4 + .../ignition/modules/migrate/migrate-1.ts | 16 + .../ignition/modules/migrate/migrate-2.ts | 9 + .../ignition/modules/migrate/migrate-3.ts | 53 + .../ignition/modules/migrate/migrate-4.ts | 22 + .../ignition/modules/periphery/Controller.ts | 39 + .../ignition/modules/periphery/Curation.ts | 78 + .../modules/periphery/EpochManager.ts | 29 + .../horizon/ignition/modules/periphery/GNS.ts | 54 + .../modules/periphery/GraphProxyAdmin.ts | 19 + .../ignition/modules/periphery/GraphToken.ts | 46 + .../modules/periphery/GraphTokenGateway.ts | 34 + .../modules/periphery/RewardsManager.ts | 79 + .../ignition/modules/periphery/periphery.ts | 95 + .../ignition/modules/proxy/GraphProxy.ts | 80 + .../proxy/TransparentUpgradeableProxy.ts | 69 + .../ignition/modules/proxy/implementation.ts | 22 + .../horizon/ignition/modules/proxy/utils.ts | 23 + packages/horizon/natspec-smells.config.js | 11 + packages/horizon/package.json | 90 + packages/{sdk => horizon}/prettier.config.cjs | 0 packages/horizon/remappings.txt | 6 + packages/horizon/scripts/integration | 120 + packages/horizon/scripts/post-verify | 3 + packages/horizon/scripts/pre-verify | 60 + packages/horizon/tasks/deploy.ts | 200 + packages/horizon/tasks/test/integration.ts | 37 + packages/horizon/tasks/test/ownership.ts | 78 + packages/horizon/tasks/test/seed.ts | 125 + .../tasks/transitions/delegation-slashing.ts | 25 + .../tasks/transitions/thawing-period.ts | 22 + .../test/deployment/Controller.test.ts | 56 + .../horizon/test/deployment/Curation.test.ts | 26 + packages/horizon/test/deployment/GNS.test.ts | 20 + .../test/deployment/GraphPayments.test.ts | 30 + .../deployment/GraphTallyCollector.test.ts | 21 + .../test/deployment/HorizonStaking.test.ts | 48 + .../test/deployment/PaymentsEscrow.test.ts | 30 + .../test/deployment/RewardsManager.test.ts | 25 + .../test/deployment/lib/GraphProxy.test.ts | 27 + .../lib/TransparentUpgradeableProxy.tests.ts | 74 + .../horizon/test/deployment/lib/testIf.ts | 4 + .../add-to-delegation-pool.test.ts | 109 + .../slasher.test.ts | 122 + .../add-to-delegation-pool.test.ts | 88 + .../after-transition-period/delegator.test.ts | 381 + .../after-transition-period/multicall.test.ts | 107 + .../after-transition-period/operator.test.ts | 145 + .../after-transition-period/pause.test.ts | 42 + .../service-provider.test.ts | 358 + .../after-transition-period/slasher.test.ts | 153 + .../after-transition-period/upgrade.test.ts | 93 + .../delegator.test.ts | 143 + .../multicall.test.ts | 114 + .../during-transition-period/operator.test.ts | 99 + .../permissionless.test.ts | 66 + .../service-provider.test.ts | 521 + .../during-transition-period/slasher.test.ts | 88 + packages/horizon/test/unit/GraphBase.t.sol | 265 + .../test/unit/data-service/DataService.t.sol | 419 + .../data-service/DataServiceUpgradeable.t.sol | 50 + .../extensions/DataServiceFees.t.sol | 241 + .../extensions/DataServicePausable.t.sol | 138 + .../DataServicePausableUpgradeable.t.sol | 56 + .../implementations/DataServiceBase.sol | 63 + .../DataServiceBaseUpgradeable.sol | 35 + .../implementations/DataServiceImpFees.sol | 40 + .../DataServiceImpPausable.sol | 51 + .../DataServiceImpPausableUpgradeable.sol | 37 + .../implementations/DataServiceOverride.sol | 25 + .../libraries/ProvisionTracker.t.sol | 105 + .../ProvisionTrackerImplementation.sol | 8 + .../test/unit/escrow/GraphEscrow.t.sol | 229 + .../horizon/test/unit/escrow/collect.t.sol | 136 + .../horizon/test/unit/escrow/deposit.t.sol | 37 + .../horizon/test/unit/escrow/getters.t.sol | 68 + .../horizon/test/unit/escrow/paused.t.sol | 73 + packages/horizon/test/unit/escrow/thaw.t.sol | 79 + .../horizon/test/unit/escrow/withdraw.t.sol | 75 + .../test/unit/libraries/LinkedList.t.sol | 194 + .../unit/libraries/ListImplementation.sol | 49 + .../horizon/test/unit/libraries/PPMMath.t.sol | 48 + .../test/unit/payments/GraphPayments.t.sol | 472 + .../GraphTallyCollector.t.sol | 183 + .../collect/collect.t.sol | 486 + .../signer/authorizeSigner.t.sol | 86 + .../signer/cancelThawSigner.t.sol | 38 + .../signer/revokeSigner.t.sol | 53 + .../signer/thawSigner.t.sol | 53 + .../HorizonStakingShared.t.sol | 2485 + .../PaymentsEscrowShared.t.sol | 48 + .../test/unit/staking/HorizonStaking.t.sol | 85 + .../unit/staking/allocation/allocation.t.sol | 33 + .../test/unit/staking/allocation/close.t.sol | 116 + .../unit/staking/allocation/collect.t.sol | 81 + .../unit/staking/delegation/addToPool.t.sol | 161 + .../unit/staking/delegation/delegate.t.sol | 197 + .../staking/delegation/legacyWithdraw.t.sol | 102 + .../unit/staking/delegation/redelegate.t.sol | 134 + .../unit/staking/delegation/undelegate.t.sol | 241 + .../unit/staking/delegation/withdraw.t.sol | 165 + .../unit/staking/governance/governance.t.sol | 64 + .../test/unit/staking/operator/locked.t.sol | 43 + .../test/unit/staking/operator/operator.t.sol | 27 + .../unit/staking/provision/deprovision.t.sol | 152 + .../test/unit/staking/provision/locked.t.sol | 66 + .../unit/staking/provision/parameters.t.sol | 180 + .../unit/staking/provision/provision.t.sol | 223 + .../unit/staking/provision/reprovision.t.sol | 74 + .../test/unit/staking/provision/thaw.t.sol | 237 + .../serviceProvider/serviceProvider.t.sol | 147 + .../test/unit/staking/slash/legacySlash.t.sol | 253 + .../test/unit/staking/slash/slash.t.sol | 193 + .../test/unit/staking/stake/stake.t.sol | 34 + .../test/unit/staking/stake/unstake.t.sol | 147 + .../test/unit/staking/stake/withdraw.t.sol | 55 + .../test/unit/utilities/Authorizable.t.sol | 405 + .../test/unit/utilities/GraphDirectory.t.sol | 71 + .../GraphDirectoryImplementation.sol | 64 + .../horizon/test/unit/utils/Bounder.t.sol | 31 + .../horizon/test/unit/utils/Constants.sol | 23 + packages/horizon/test/unit/utils/Users.sol | 13 + packages/horizon/test/unit/utils/Utils.sol | 12 + packages/horizon/tsconfig.json | 17 + .../{sdk => interfaces}/.markdownlint.json | 0 packages/{common => interfaces}/.solhint.json | 0 packages/interfaces/CHANGELOG.md | 78 + packages/interfaces/README.md | 66 + .../eligibility/IRewardsEligibilityOracle.sol | 0 .../contracts/token/IGraphToken.sol | 103 + packages/interfaces/hardhat.config.ts | 12 + packages/interfaces/package.json | 66 + packages/interfaces/prettier.config.cjs | 5 + packages/interfaces/scripts/build.sh | 52 + packages/interfaces/src/index.ts | 180 + packages/interfaces/tsconfig.json | 7 + packages/interfaces/tsconfig.v5.json | 15 + packages/interfaces/wagmi.config.mts | 51 + .../contracts/common/BaseUpgradeable.sol | 2 +- .../eligibility/RewardsEligibilityOracle.sol | 2 +- .../contracts/test/InterfaceIdExtractor.sol | 2 +- packages/issuance/package.json | 2 +- packages/issuance/test/package.json | 7 +- packages/sdk/CHANGELOG.md | 14 - packages/sdk/package.json | 78 - packages/sdk/src/chain/id.ts | 52 - packages/sdk/src/chain/index.ts | 13 - packages/sdk/src/chain/list.ts | 57 - packages/sdk/src/chain/name.ts | 52 - packages/sdk/src/chain/types.ts | 70 - packages/sdk/src/deployments/index.ts | 39 - .../sdk/src/deployments/lib/address-book.ts | 168 - packages/sdk/src/deployments/lib/config.ts | 157 - .../sdk/src/deployments/lib/contracts/load.ts | 100 - .../sdk/src/deployments/lib/contracts/log.ts | 50 - .../sdk/src/deployments/lib/contracts/wrap.ts | 79 - .../src/deployments/lib/deploy/artifacts.ts | 145 - .../src/deployments/lib/deploy/contract.ts | 125 - .../sdk/src/deployments/lib/deploy/deploy.ts | 94 - .../sdk/src/deployments/lib/deploy/factory.ts | 51 - .../src/deployments/lib/types/address-book.ts | 25 - .../src/deployments/lib/types/artifacts.ts | 3 - .../sdk/src/deployments/lib/types/config.ts | 14 - .../sdk/src/deployments/lib/types/contract.ts | 5 - .../sdk/src/deployments/lib/types/deploy.ts | 49 - .../network/actions/bridge-config.ts | 119 - .../network/actions/bridge-to-l1.ts | 196 - .../network/actions/bridge-to-l2.ts | 150 - .../deployments/network/actions/disputes.ts | 21 - .../src/deployments/network/actions/gns.ts | 72 - .../deployments/network/actions/governed.ts | 64 - .../network/actions/graph-token.ts | 72 - .../src/deployments/network/actions/pause.ts | 30 - .../deployments/network/actions/staking.ts | 74 - .../src/deployments/network/actions/types.ts | 9 - .../network/deployment/address-book.ts | 34 - .../deployments/network/deployment/config.ts | 169 - .../network/deployment/contracts/deploy.ts | 317 - .../network/deployment/contracts/list.ts | 58 - .../network/deployment/contracts/load.ts | 207 - .../network/deployment/contracts/proxy.ts | 248 - packages/sdk/src/gre/README.md | 322 - packages/sdk/src/gre/accounts.ts | 113 - packages/sdk/src/gre/config.ts | 182 - packages/sdk/src/gre/gre.ts | 195 - packages/sdk/src/gre/helpers/argv.ts | 17 - packages/sdk/src/gre/helpers/network.ts | 46 - packages/sdk/src/gre/helpers/utils.ts | 8 - packages/sdk/src/gre/providers.ts | 92 - packages/sdk/src/gre/task.ts | 26 - packages/sdk/src/gre/test/accounts.test.ts | 223 - packages/sdk/src/gre/test/config.test.ts | 251 - .../gre/test/files/config/graph.goerli.yml | 7 - .../src/gre/test/files/config/graph.opts.yml | 0 .../src/gre/test/files/config/graph.opts2.yml | 0 .../graph-config-bad/hardhat.config.ts | 43 - .../hardhat.config.ts | 59 - .../.accounts/test-account-l2.json | 28 - .../graph-config/.accounts/test-account.json | 28 - packages/sdk/src/gre/test/gre.test.ts | 85 - packages/sdk/src/gre/test/helpers.ts | 25 - packages/sdk/src/gre/type-extensions.ts | 49 - packages/sdk/src/gre/types.ts | 53 - packages/sdk/src/helpers/arbitrum.ts | 133 - packages/sdk/src/helpers/balance.ts | 18 - packages/sdk/src/helpers/code.ts | 5 - packages/sdk/src/helpers/epoch.ts | 19 - packages/sdk/src/helpers/impersonate.ts | 11 - packages/sdk/src/helpers/index.ts | 8 - packages/sdk/src/helpers/mine.ts | 29 - packages/sdk/src/helpers/snapshot.ts | 11 - packages/sdk/src/helpers/time.ts | 5 - packages/sdk/src/index.ts | 4 - packages/sdk/src/utils/abi.ts | 13 - packages/sdk/src/utils/address.ts | 5 - packages/sdk/src/utils/allocation.ts | 33 - packages/sdk/src/utils/arbitrum/address.ts | 14 - packages/sdk/src/utils/arbitrum/gas.ts | 68 - packages/sdk/src/utils/arbitrum/index.ts | 3 - packages/sdk/src/utils/arbitrum/message.ts | 91 - packages/sdk/src/utils/bytes.ts | 8 - packages/sdk/src/utils/eip712.ts | 44 - packages/sdk/src/utils/hash.ts | 3 - packages/sdk/src/utils/index.ts | 9 - packages/sdk/src/utils/nonce.ts | 18 - packages/sdk/src/utils/prompt.ts | 15 - packages/sdk/src/utils/subgraph.ts | 44 - packages/sdk/src/utils/time.ts | 3 - packages/sdk/src/utils/type-guard.ts | 12 - packages/sdk/src/utils/units.ts | 8 - packages/sdk/tsconfig.json | 11 - packages/subgraph-service/CHANGELOG.md | 79 + packages/subgraph-service/README.md | 74 + .../addresses-integration-tests.json | 35 + packages/subgraph-service/addresses.json | 35 + .../contracts/DisputeManager.sol | 701 + .../contracts/DisputeManagerStorage.sol | 35 + .../contracts/SubgraphService.sol | 601 + .../contracts/SubgraphServiceStorage.sol | 24 + .../contracts/libraries/Allocation.sol | 182 + .../contracts/libraries/Attestation.sol | 133 + .../contracts/libraries/LegacyAllocation.sol | 94 + .../contracts/utilities/AllocationManager.sol | 479 + .../utilities/AllocationManagerStorage.sol | 32 + .../utilities/AttestationManager.sol | 105 + .../utilities/AttestationManagerStorage.sol | 16 + .../contracts/utilities/Directory.sol | 111 + packages/subgraph-service/foundry.toml | 9 + packages/subgraph-service/hardhat.config.ts | 32 + .../ignition/configs/migrate.default.json5 | 36 + .../ignition/configs/migrate.fork1.json5 | 36 + .../configs/migrate.integration.json5 | 37 + .../ignition/configs/protocol.default.json5 | 36 + .../configs/protocol.localNetwork.json5 | 36 + .../artifacts/Controller#Controller.json | 349 + .../DisputeManager#DisputeManager.dbg.json | 4 + .../DisputeManager#DisputeManager.json | 1557 + .../DisputeManager#DisputeManagerProxy.json | 116 + ...teManager#DisputeManager_ProxyWithABI.json | 1557 + .../artifacts/DisputeManager#ProxyAdmin.json | 132 + .../artifacts/EpochManager#EpochManager.json | 364 + ...pochManager#EpochManager_ProxyWithABI.json | 364 + .../artifacts/EpochManager#GraphProxy.json | 177 + .../GraphPayments#GraphPayments.json | 337 + ...phPayments#GraphPayments_ProxyWithABI.json | 337 + .../GraphProxyAdmin#GraphProxyAdmin.json | 234 + ...aphTallyCollector#GraphTallyCollector.json | 900 + ...zonProxies#GraphPayments_ProxyWithABI.json | 337 + .../artifacts/HorizonProxies#GraphProxy.json | 177 + ...zonProxies#OZProxyDummy_GraphPayments.json | 10 + ...onProxies#OZProxyDummy_PaymentsEscrow.json | 10 + ...onProxies#PaymentsEscrow_ProxyWithABI.json | 680 + ...rizonProxies#ProxyAdmin_GraphPayments.json | 132 + ...izonProxies#ProxyAdmin_PaymentsEscrow.json | 132 + ...sparentUpgradeableProxy_GraphPayments.json | 116 + ...parentUpgradeableProxy_PaymentsEscrow.json | 116 + .../HorizonStaking#ExponentialRebates.json | 55 + .../HorizonStaking#HorizonStaking.json | 2481 + ...orizonStaking#HorizonStakingExtension.json | 1252 + ...onStaking#HorizonStaking_ProxyWithABI.json | 2481 + .../L2Curation#GraphCurationToken.json | 414 + .../artifacts/L2Curation#GraphProxy.json | 177 + .../artifacts/L2Curation#L2Curation.json | 707 + .../L2Curation#L2CurationAddressBook.json | 707 + ...n#L2CurationImplementationAddressBook.json | 707 + .../L2Curation#L2Curation_ProxyWithABI.json | 707 + .../artifacts/L2GraphToken#GraphProxy.json | 177 + .../artifacts/L2GraphToken#L2GraphToken.json | 750 + ...2GraphToken#L2GraphToken_ProxyWithABI.json | 750 + .../L2GraphTokenGateway#GraphProxy.json | 177 + ...GraphTokenGateway#L2GraphTokenGateway.json | 647 + ...eway#L2GraphTokenGateway_ProxyWithABI.json | 647 + .../PaymentsEscrow#PaymentsEscrow.json | 680 + ...ntsEscrow#PaymentsEscrow_ProxyWithABI.json | 680 + .../artifacts/RewardsManager#GraphProxy.json | 177 + .../RewardsManager#RewardsManager.json | 622 + ...dsManager#RewardsManager_ProxyWithABI.json | 622 + .../artifacts/SubgraphService#ProxyAdmin.json | 132 + .../SubgraphService#SubgraphService.dbg.json | 4 + .../SubgraphService#SubgraphService.json | 2268 + .../SubgraphService#SubgraphServiceProxy.json | 116 + ...hService#SubgraphService_ProxyWithABI.json | 2268 + ...ceProxies#DisputeManager_ProxyWithABI.json | 1557 + ...ceProxies#OZProxyDummy_DisputeManager.json | 10 + ...eProxies#OZProxyDummy_SubgraphService.json | 10 + ...viceProxies#ProxyAdmin_DisputeManager.json | 132 + ...iceProxies#ProxyAdmin_SubgraphService.json | 132 + ...eProxies#SubgraphService_ProxyWithABI.json | 2268 + ...parentUpgradeableProxy_DisputeManager.json | 116 + ...arentUpgradeableProxy_SubgraphService.json | 116 + .../81754efc7e2eec76b7d493cc60c0f970.json | 311681 +++++++++++++++ .../chain-421614/deployed_addresses.json | 56 + .../deployments/chain-421614/journal.jsonl | 513 + .../ignition/modules/Curation.ts | 20 + .../ignition/modules/DisputeManager.ts | 57 + .../subgraph-service/ignition/modules/GNS.ts | 19 + .../ignition/modules/Proxies.ts | 24 + .../ignition/modules/SubgraphService.ts | 80 + .../ignition/modules/deploy/deploy-1.ts | 15 + .../ignition/modules/deploy/deploy-2.ts | 25 + .../ignition/modules/migrate/migrate-1.ts | 15 + .../ignition/modules/migrate/migrate-2.ts | 25 + .../subgraph-service/natspec-smells.config.js | 11 + packages/subgraph-service/package.json | 91 + packages/subgraph-service/prettier.config.cjs | 5 + packages/subgraph-service/remappings.txt | 7 + packages/subgraph-service/scripts/integration | 140 + packages/subgraph-service/scripts/ops/data.ts | 163 + .../scripts/ops/protocol-activity.ts | 413 + packages/subgraph-service/scripts/post-verify | 3 + packages/subgraph-service/scripts/pre-verify | 70 + packages/subgraph-service/tasks/deploy.ts | 227 + .../tasks/test/integration.ts | 32 + packages/subgraph-service/tasks/test/seed.ts | 134 + .../test/deployment/DisputeManager.test.ts | 60 + .../test/deployment/SubgraphService.test.ts | 71 + .../dispute-manager/governance.test.ts | 125 + .../dispute-manager/indexing-disputes.test.ts | 271 + .../query-conflict-disputes.test.ts | 406 + .../dispute-manager/query-disputes.test.ts | 315 + .../after-transition-period/pause.test.ts | 41 + .../subgraph-service/governance.test.ts | 167 + .../subgraph-service/indexer.test.ts | 734 + .../subgraph-service/operator.test.ts | 394 + .../subgraph-service/paused.test.ts | 225 + .../subgraph-service/permisionless.test.ts | 115 + .../after-transition-period/upgrade.test.ts | 93 + .../dispute-manager.test.ts | 157 + .../governance.test.ts | 76 + .../during-transition-period/indexer.test.ts | 100 + .../legacy-dispute-manager.test.ts | 256 + .../test/unit/SubgraphBaseTest.t.sol | 221 + .../unit/disputeManager/DisputeManager.t.sol | 840 + .../constructor/constructor.t.sol | 176 + .../disputeManager/disputes/disputes.t.sol | 58 + .../disputes/indexing/accept.t.sol | 91 + .../disputes/indexing/cancel.t.sol | 80 + .../disputes/indexing/create.t.sol | 181 + .../disputes/indexing/draw.t.sol | 31 + .../disputes/indexing/reject.t.sol | 33 + .../unit/disputeManager/disputes/legacy.t.sol | 54 + .../disputes/query/accept.t.sol | 225 + .../disputes/query/cancel.t.sol | 91 + .../disputes/query/create.t.sol | 184 + .../disputeManager/disputes/query/draw.t.sol | 40 + .../disputes/query/reject.t.sol | 39 + .../disputes/queryConflict/accept.t.sol | 206 + .../disputes/queryConflict/cancel.t.sol | 133 + .../disputes/queryConflict/create.t.sol | 108 + .../disputes/queryConflict/draw.t.sol | 56 + .../disputes/queryConflict/reject.t.sol | 35 + .../governance/arbitrator.t.sol | 33 + .../governance/disputeDeposit.t.sol | 35 + .../governance/fishermanRewardCut.t.sol | 35 + .../governance/maxSlashingCut.t.sol | 35 + .../governance/subgraphService.t.sol | 23 + .../test/unit/mocks/MockCuration.sol | 11 + .../test/unit/mocks/MockEpochManager.sol | 63 + .../test/unit/mocks/MockGRTToken.sol | 48 + .../test/unit/mocks/MockRewardsManager.sol | 109 + .../unit/shared/HorizonStakingShared.t.sol | 150 + .../unit/shared/SubgraphServiceShared.t.sol | 202 + .../subgraphService/SubgraphService.t.sol | 553 + .../allocation/forceClose.t.sol | 104 + .../allocation/overDelegated.t.sol | 58 + .../subgraphService/allocation/resize.t.sol | 106 + .../subgraphService/allocation/start.t.sol | 215 + .../subgraphService/allocation/stop.t.sol | 76 + .../subgraphService/collect/collect.t.sol | 25 + .../collect/indexing/indexing.t.sol | 174 + .../subgraphService/collect/query/query.t.sol | 282 + .../subgraphService/governance/legacy.t.sol | 23 + .../governance/stakeToFeesRatio.t.sol | 42 + .../subgraphService/provider/register.t.sol | 90 + .../provider/rewardsDestination.t.sol | 25 + .../subgraphService/provision/accept.t.sol | 132 + .../test/unit/utils/Constants.sol | 33 + .../test/unit/utils/Users.sol | 16 + .../test/unit/utils/Utils.sol | 12 + packages/subgraph-service/tsconfig.json | 15 + packages/token-distribution/hardhat.config.ts | 1 + .../ops/update-auth-functions-horizon.ts | 252 + packages/token-distribution/package.json | 2 +- packages/token-distribution/scripts/build.js | 5 + packages/token-distribution/scripts/test | 5 + packages/toolshed/CHANGELOG.md | 314 + packages/toolshed/README.md | 34 + packages/toolshed/package.json | 68 + packages/toolshed/prettier.config.cjs | 5 + packages/toolshed/src/core/accounts.ts | 90 + packages/toolshed/src/core/allocation.ts | 46 + packages/toolshed/src/core/attestations.ts | 123 + packages/toolshed/src/core/constants.ts | 9 + packages/toolshed/src/core/disputes.ts | 24 + packages/toolshed/src/core/graph-tally.ts | 117 + packages/toolshed/src/core/index.ts | 9 + packages/toolshed/src/core/poi.ts | 18 + .../toolshed/src/core/subgraph-service.ts | 37 + packages/toolshed/src/core/types.ts | 32 + .../toolshed/src/deployments/address-book.ts | 233 + packages/toolshed/src/deployments/contract.ts | 44 + .../src/deployments/horizon/actions.ts | 199 + .../src/deployments/horizon/address-book.ts | 51 + .../src/deployments/horizon/contracts.ts | 66 + .../toolshed/src/deployments/horizon/index.ts | 28 + packages/toolshed/src/deployments/index.ts | 5 + .../deployments/subgraph-service/actions.ts | 39 + .../subgraph-service/address-book.ts | 38 + .../deployments/subgraph-service/contracts.ts | 47 + .../src/deployments/subgraph-service/index.ts | 29 + .../toolshed/src/deployments/tx-logging.ts | 108 + packages/toolshed/src/deployments/types.ts | 20 + packages/toolshed/src/fixtures/delegators.ts | 59 + packages/toolshed/src/fixtures/index.ts | 3 + .../src/fixtures/indexers-subgraph-service.ts | 112 + packages/toolshed/src/fixtures/indexers.ts | 105 + packages/toolshed/src/hardhat/config.ts | 14 + packages/toolshed/src/hardhat/erc20.ts | 38 + packages/toolshed/src/hardhat/event.ts | 20 + .../src/hardhat/hardhat.base.config.ts | 167 + packages/toolshed/src/hardhat/ignition.ts | 126 + packages/toolshed/src/hardhat/index.ts | 6 + packages/toolshed/src/hardhat/local.ts | 21 + .../src/lib/assert.ts} | 0 packages/toolshed/src/lib/bytes.ts | 3 + .../src/lib}/logger.ts | 8 +- packages/toolshed/src/lib/resolve.ts | 48 + packages/toolshed/src/utils/banner.ts | 58 + packages/toolshed/src/utils/bigint.ts | 17 + packages/toolshed/src/utils/index.ts | 2 + packages/toolshed/tsconfig.json | 7 + pnpm-lock.yaml | 3869 +- scripts/bytecode-diff.sh | 51 + 622 files changed, 388523 insertions(+), 7473 deletions(-) create mode 100644 CLAUDE.md create mode 100644 packages/address-book/CHANGELOG.md create mode 100644 packages/address-book/README.md create mode 100644 packages/address-book/package.json create mode 100644 packages/address-book/prettier.config.cjs create mode 100755 packages/address-book/scripts/copy-addresses-for-publish.js create mode 100755 packages/address-book/scripts/restore-symlinks.js create mode 120000 packages/address-book/src/horizon/addresses.json create mode 120000 packages/address-book/src/subgraph-service/addresses.json delete mode 100644 packages/common/README.md delete mode 100644 packages/common/hardhat.config.js delete mode 100644 packages/common/package.json delete mode 100644 packages/common/tsconfig.json create mode 100644 packages/contracts/contracts/l2/staking/IL2StakingTypes.sol create mode 100644 packages/contracts/contracts/rewards/IRewardsManager.sol create mode 100644 packages/contracts/contracts/staking/libs/IStakes.sol create mode 100644 packages/contracts/contracts/token/IGraphToken.sol create mode 100644 packages/contracts/task/CHANGELOG.md create mode 100644 packages/contracts/test/CHANGELOG.md rename packages/{common => hardhat-graph-protocol}/.markdownlint.json (100%) rename packages/{sdk => hardhat-graph-protocol}/.mocharc.json (58%) create mode 100644 packages/hardhat-graph-protocol/CHANGELOG.md create mode 100644 packages/hardhat-graph-protocol/README.md create mode 100644 packages/hardhat-graph-protocol/package.json rename packages/{common => hardhat-graph-protocol}/prettier.config.cjs (100%) create mode 100644 packages/hardhat-graph-protocol/src/accounts.ts create mode 100644 packages/hardhat-graph-protocol/src/config.ts rename packages/{sdk/src/gre/helpers => hardhat-graph-protocol/src}/error.ts (77%) create mode 100644 packages/hardhat-graph-protocol/src/gre.ts rename packages/{sdk/src/gre => hardhat-graph-protocol/src}/index.ts (69%) rename packages/{sdk/src/gre/helpers => hardhat-graph-protocol/src}/logger.ts (84%) create mode 100644 packages/hardhat-graph-protocol/src/type-extensions.ts create mode 100644 packages/hardhat-graph-protocol/src/types.ts create mode 100644 packages/hardhat-graph-protocol/test/config.test.ts rename packages/{sdk/src/gre/test/fixture-projects => hardhat-graph-protocol/test/fixtures}/default-config/hardhat.config.ts (100%) create mode 100644 packages/hardhat-graph-protocol/test/fixtures/files/addresses-arbsep.json rename packages/{sdk/src/gre/test/files/addresses-hre.json => hardhat-graph-protocol/test/fixtures/files/addresses-global-short.json} (100%) rename packages/{sdk/src/gre/test/files/addresses-opts.json => hardhat-graph-protocol/test/fixtures/files/addresses-global.json} (100%) rename packages/{sdk/src/gre/test/files/config/graph.arbitrum-goerli.yml => hardhat-graph-protocol/test/fixtures/files/addresses-hre.json} (100%) rename packages/{sdk/src/gre/test/files/config/graph.arbitrum-hre.yml => hardhat-graph-protocol/test/fixtures/files/addresses-network-short.json} (100%) rename packages/{sdk/src/gre/test/files/config/graph.arbitrum-opts.yml => hardhat-graph-protocol/test/fixtures/files/addresses-network.json} (100%) rename packages/{sdk/src/gre/test/files/config/graph.hre.yml => hardhat-graph-protocol/test/fixtures/files/addresses-opt.json} (100%) rename packages/{sdk/src/gre/test/fixture-projects/graph-config => hardhat-graph-protocol/test/fixtures/global-address-book}/hardhat.config.ts (74%) rename packages/{sdk/src/gre/test/fixture-projects/graph-config-full => hardhat-graph-protocol/test/fixtures/invalid-address-book}/hardhat.config.ts (52%) create mode 100644 packages/hardhat-graph-protocol/test/fixtures/network-address-book/hardhat.config.ts rename packages/{sdk/src/gre/test/files/config/graph.mainnet.yml => hardhat-graph-protocol/test/fixtures/no-path-config/addresses.json} (100%) create mode 100644 packages/hardhat-graph-protocol/test/fixtures/no-path-config/hardhat.config.ts create mode 100644 packages/hardhat-graph-protocol/test/fixtures/path-config/hardhat.config.ts create mode 100644 packages/hardhat-graph-protocol/test/gre.test.ts create mode 100644 packages/hardhat-graph-protocol/test/helpers.ts create mode 100644 packages/hardhat-graph-protocol/tsconfig.json create mode 100644 packages/horizon/.solhintignore create mode 100644 packages/horizon/CHANGELOG.md create mode 100644 packages/horizon/README.md create mode 100644 packages/horizon/addresses-integration-tests.json create mode 100644 packages/horizon/addresses.json create mode 100644 packages/horizon/audits/2024-06-OZ-horizon.pdf create mode 100644 packages/horizon/audits/2024-11-Trust-horizon.pdf create mode 100644 packages/horizon/audits/2025-03-OZ-pre audit assessment.pdf create mode 100644 packages/horizon/audits/2025-05-OZ-The Graph Horizon Audit.pdf create mode 100644 packages/horizon/audits/The Graph Horizon Missed Issues Initial Report.pdf create mode 100644 packages/horizon/contracts/data-service/DataService.sol create mode 100644 packages/horizon/contracts/data-service/DataServiceStorage.sol create mode 100644 packages/horizon/contracts/data-service/extensions/DataServiceFees.sol create mode 100644 packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol create mode 100644 packages/horizon/contracts/data-service/extensions/DataServicePausable.sol create mode 100644 packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol create mode 100644 packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol create mode 100644 packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol create mode 100644 packages/horizon/contracts/data-service/utilities/ProvisionManager.sol create mode 100644 packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol create mode 100644 packages/horizon/contracts/libraries/Denominations.sol create mode 100644 packages/horizon/contracts/libraries/LibFixedMath.sol create mode 100644 packages/horizon/contracts/libraries/LinkedList.sol create mode 100644 packages/horizon/contracts/libraries/MathUtils.sol create mode 100644 packages/horizon/contracts/libraries/PPMMath.sol create mode 100644 packages/horizon/contracts/libraries/UintRange.sol create mode 100644 packages/horizon/contracts/mocks/ControllerMock.sol create mode 100644 packages/horizon/contracts/mocks/CurationMock.sol create mode 100644 packages/horizon/contracts/mocks/Dummy.sol create mode 100644 packages/horizon/contracts/mocks/EpochManagerMock.sol create mode 100644 packages/horizon/contracts/mocks/MockGRTToken.sol create mode 100644 packages/horizon/contracts/mocks/RewardsManagerMock.sol create mode 100644 packages/horizon/contracts/mocks/imports.sol create mode 100644 packages/horizon/contracts/payments/GraphPayments.sol create mode 100644 packages/horizon/contracts/payments/PaymentsEscrow.sol create mode 100644 packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol create mode 100644 packages/horizon/contracts/staking/HorizonStaking.sol create mode 100644 packages/horizon/contracts/staking/HorizonStakingBase.sol create mode 100644 packages/horizon/contracts/staking/HorizonStakingExtension.sol create mode 100644 packages/horizon/contracts/staking/HorizonStakingStorage.sol create mode 100644 packages/horizon/contracts/staking/libraries/ExponentialRebates.sol create mode 100644 packages/horizon/contracts/staking/utilities/Managed.sol create mode 100644 packages/horizon/contracts/utilities/Authorizable.sol create mode 100644 packages/horizon/contracts/utilities/GraphDirectory.sol create mode 100644 packages/horizon/foundry.toml create mode 100644 packages/horizon/hardhat.config.ts create mode 100644 packages/horizon/ignition/configs/migrate.default.json5 create mode 100644 packages/horizon/ignition/configs/migrate.fork1.json5 create mode 100644 packages/horizon/ignition/configs/migrate.integration.json5 create mode 100644 packages/horizon/ignition/configs/protocol.default.json5 create mode 100644 packages/horizon/ignition/configs/protocol.localNetwork.json5 create mode 100644 packages/horizon/ignition/modules/core/GraphPayments.ts create mode 100644 packages/horizon/ignition/modules/core/GraphTallyCollector.ts create mode 100644 packages/horizon/ignition/modules/core/HorizonProxies.ts create mode 100644 packages/horizon/ignition/modules/core/HorizonStaking.ts create mode 100644 packages/horizon/ignition/modules/core/PaymentsEscrow.ts create mode 100644 packages/horizon/ignition/modules/core/core.ts create mode 100644 packages/horizon/ignition/modules/deploy.ts create mode 100644 packages/horizon/ignition/modules/index.ts create mode 100644 packages/horizon/ignition/modules/migrate/migrate-1.ts create mode 100644 packages/horizon/ignition/modules/migrate/migrate-2.ts create mode 100644 packages/horizon/ignition/modules/migrate/migrate-3.ts create mode 100644 packages/horizon/ignition/modules/migrate/migrate-4.ts create mode 100644 packages/horizon/ignition/modules/periphery/Controller.ts create mode 100644 packages/horizon/ignition/modules/periphery/Curation.ts create mode 100644 packages/horizon/ignition/modules/periphery/EpochManager.ts create mode 100644 packages/horizon/ignition/modules/periphery/GNS.ts create mode 100644 packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts create mode 100644 packages/horizon/ignition/modules/periphery/GraphToken.ts create mode 100644 packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts create mode 100644 packages/horizon/ignition/modules/periphery/RewardsManager.ts create mode 100644 packages/horizon/ignition/modules/periphery/periphery.ts create mode 100644 packages/horizon/ignition/modules/proxy/GraphProxy.ts create mode 100644 packages/horizon/ignition/modules/proxy/TransparentUpgradeableProxy.ts create mode 100644 packages/horizon/ignition/modules/proxy/implementation.ts create mode 100644 packages/horizon/ignition/modules/proxy/utils.ts create mode 100644 packages/horizon/natspec-smells.config.js create mode 100644 packages/horizon/package.json rename packages/{sdk => horizon}/prettier.config.cjs (100%) create mode 100644 packages/horizon/remappings.txt create mode 100755 packages/horizon/scripts/integration create mode 100644 packages/horizon/scripts/post-verify create mode 100755 packages/horizon/scripts/pre-verify create mode 100644 packages/horizon/tasks/deploy.ts create mode 100644 packages/horizon/tasks/test/integration.ts create mode 100644 packages/horizon/tasks/test/ownership.ts create mode 100644 packages/horizon/tasks/test/seed.ts create mode 100644 packages/horizon/tasks/transitions/delegation-slashing.ts create mode 100644 packages/horizon/tasks/transitions/thawing-period.ts create mode 100644 packages/horizon/test/deployment/Controller.test.ts create mode 100644 packages/horizon/test/deployment/Curation.test.ts create mode 100644 packages/horizon/test/deployment/GNS.test.ts create mode 100644 packages/horizon/test/deployment/GraphPayments.test.ts create mode 100644 packages/horizon/test/deployment/GraphTallyCollector.test.ts create mode 100644 packages/horizon/test/deployment/HorizonStaking.test.ts create mode 100644 packages/horizon/test/deployment/PaymentsEscrow.test.ts create mode 100644 packages/horizon/test/deployment/RewardsManager.test.ts create mode 100644 packages/horizon/test/deployment/lib/GraphProxy.test.ts create mode 100644 packages/horizon/test/deployment/lib/TransparentUpgradeableProxy.tests.ts create mode 100644 packages/horizon/test/deployment/lib/testIf.ts create mode 100644 packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts create mode 100644 packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/delegator.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/multicall.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/operator.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/pause.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/service-provider.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/slasher.test.ts create mode 100644 packages/horizon/test/integration/after-transition-period/upgrade.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/delegator.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/multicall.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/operator.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/permissionless.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/service-provider.test.ts create mode 100644 packages/horizon/test/integration/during-transition-period/slasher.test.ts create mode 100644 packages/horizon/test/unit/GraphBase.t.sol create mode 100644 packages/horizon/test/unit/data-service/DataService.t.sol create mode 100644 packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol create mode 100644 packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol create mode 100644 packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol create mode 100644 packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol create mode 100644 packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol create mode 100644 packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol create mode 100644 packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol create mode 100644 packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol create mode 100644 packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol create mode 100644 packages/horizon/test/unit/data-service/implementations/DataServiceOverride.sol create mode 100644 packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol create mode 100644 packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol create mode 100644 packages/horizon/test/unit/escrow/GraphEscrow.t.sol create mode 100644 packages/horizon/test/unit/escrow/collect.t.sol create mode 100644 packages/horizon/test/unit/escrow/deposit.t.sol create mode 100644 packages/horizon/test/unit/escrow/getters.t.sol create mode 100644 packages/horizon/test/unit/escrow/paused.t.sol create mode 100644 packages/horizon/test/unit/escrow/thaw.t.sol create mode 100644 packages/horizon/test/unit/escrow/withdraw.t.sol create mode 100644 packages/horizon/test/unit/libraries/LinkedList.t.sol create mode 100644 packages/horizon/test/unit/libraries/ListImplementation.sol create mode 100644 packages/horizon/test/unit/libraries/PPMMath.t.sol create mode 100644 packages/horizon/test/unit/payments/GraphPayments.t.sol create mode 100644 packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol create mode 100644 packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol create mode 100644 packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol create mode 100644 packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol create mode 100644 packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol create mode 100644 packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol create mode 100644 packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol create mode 100644 packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol create mode 100644 packages/horizon/test/unit/staking/HorizonStaking.t.sol create mode 100644 packages/horizon/test/unit/staking/allocation/allocation.t.sol create mode 100644 packages/horizon/test/unit/staking/allocation/close.t.sol create mode 100644 packages/horizon/test/unit/staking/allocation/collect.t.sol create mode 100644 packages/horizon/test/unit/staking/delegation/addToPool.t.sol create mode 100644 packages/horizon/test/unit/staking/delegation/delegate.t.sol create mode 100644 packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol create mode 100644 packages/horizon/test/unit/staking/delegation/redelegate.t.sol create mode 100644 packages/horizon/test/unit/staking/delegation/undelegate.t.sol create mode 100644 packages/horizon/test/unit/staking/delegation/withdraw.t.sol create mode 100644 packages/horizon/test/unit/staking/governance/governance.t.sol create mode 100644 packages/horizon/test/unit/staking/operator/locked.t.sol create mode 100644 packages/horizon/test/unit/staking/operator/operator.t.sol create mode 100644 packages/horizon/test/unit/staking/provision/deprovision.t.sol create mode 100644 packages/horizon/test/unit/staking/provision/locked.t.sol create mode 100644 packages/horizon/test/unit/staking/provision/parameters.t.sol create mode 100644 packages/horizon/test/unit/staking/provision/provision.t.sol create mode 100644 packages/horizon/test/unit/staking/provision/reprovision.t.sol create mode 100644 packages/horizon/test/unit/staking/provision/thaw.t.sol create mode 100644 packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol create mode 100644 packages/horizon/test/unit/staking/slash/legacySlash.t.sol create mode 100644 packages/horizon/test/unit/staking/slash/slash.t.sol create mode 100644 packages/horizon/test/unit/staking/stake/stake.t.sol create mode 100644 packages/horizon/test/unit/staking/stake/unstake.t.sol create mode 100644 packages/horizon/test/unit/staking/stake/withdraw.t.sol create mode 100644 packages/horizon/test/unit/utilities/Authorizable.t.sol create mode 100644 packages/horizon/test/unit/utilities/GraphDirectory.t.sol create mode 100644 packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol create mode 100644 packages/horizon/test/unit/utils/Bounder.t.sol create mode 100644 packages/horizon/test/unit/utils/Constants.sol create mode 100644 packages/horizon/test/unit/utils/Users.sol create mode 100644 packages/horizon/test/unit/utils/Utils.sol create mode 100644 packages/horizon/tsconfig.json rename packages/{sdk => interfaces}/.markdownlint.json (100%) rename packages/{common => interfaces}/.solhint.json (100%) create mode 100644 packages/interfaces/CHANGELOG.md create mode 100644 packages/interfaces/README.md rename packages/{common => interfaces}/contracts/eligibility/IRewardsEligibilityOracle.sol (100%) create mode 100644 packages/interfaces/contracts/token/IGraphToken.sol create mode 100644 packages/interfaces/hardhat.config.ts create mode 100644 packages/interfaces/package.json create mode 100644 packages/interfaces/prettier.config.cjs create mode 100755 packages/interfaces/scripts/build.sh create mode 100644 packages/interfaces/src/index.ts create mode 100644 packages/interfaces/tsconfig.json create mode 100644 packages/interfaces/tsconfig.v5.json create mode 100644 packages/interfaces/wagmi.config.mts delete mode 100644 packages/sdk/CHANGELOG.md delete mode 100644 packages/sdk/package.json delete mode 100644 packages/sdk/src/chain/id.ts delete mode 100644 packages/sdk/src/chain/index.ts delete mode 100644 packages/sdk/src/chain/list.ts delete mode 100644 packages/sdk/src/chain/name.ts delete mode 100644 packages/sdk/src/chain/types.ts delete mode 100644 packages/sdk/src/deployments/index.ts delete mode 100644 packages/sdk/src/deployments/lib/address-book.ts delete mode 100644 packages/sdk/src/deployments/lib/config.ts delete mode 100644 packages/sdk/src/deployments/lib/contracts/load.ts delete mode 100644 packages/sdk/src/deployments/lib/contracts/log.ts delete mode 100644 packages/sdk/src/deployments/lib/contracts/wrap.ts delete mode 100644 packages/sdk/src/deployments/lib/deploy/artifacts.ts delete mode 100644 packages/sdk/src/deployments/lib/deploy/contract.ts delete mode 100644 packages/sdk/src/deployments/lib/deploy/deploy.ts delete mode 100644 packages/sdk/src/deployments/lib/deploy/factory.ts delete mode 100644 packages/sdk/src/deployments/lib/types/address-book.ts delete mode 100644 packages/sdk/src/deployments/lib/types/artifacts.ts delete mode 100644 packages/sdk/src/deployments/lib/types/config.ts delete mode 100644 packages/sdk/src/deployments/lib/types/contract.ts delete mode 100644 packages/sdk/src/deployments/lib/types/deploy.ts delete mode 100644 packages/sdk/src/deployments/network/actions/bridge-config.ts delete mode 100644 packages/sdk/src/deployments/network/actions/bridge-to-l1.ts delete mode 100644 packages/sdk/src/deployments/network/actions/bridge-to-l2.ts delete mode 100644 packages/sdk/src/deployments/network/actions/disputes.ts delete mode 100644 packages/sdk/src/deployments/network/actions/gns.ts delete mode 100644 packages/sdk/src/deployments/network/actions/governed.ts delete mode 100644 packages/sdk/src/deployments/network/actions/graph-token.ts delete mode 100644 packages/sdk/src/deployments/network/actions/pause.ts delete mode 100644 packages/sdk/src/deployments/network/actions/staking.ts delete mode 100644 packages/sdk/src/deployments/network/actions/types.ts delete mode 100644 packages/sdk/src/deployments/network/deployment/address-book.ts delete mode 100644 packages/sdk/src/deployments/network/deployment/config.ts delete mode 100644 packages/sdk/src/deployments/network/deployment/contracts/deploy.ts delete mode 100644 packages/sdk/src/deployments/network/deployment/contracts/list.ts delete mode 100644 packages/sdk/src/deployments/network/deployment/contracts/load.ts delete mode 100644 packages/sdk/src/deployments/network/deployment/contracts/proxy.ts delete mode 100644 packages/sdk/src/gre/README.md delete mode 100644 packages/sdk/src/gre/accounts.ts delete mode 100644 packages/sdk/src/gre/config.ts delete mode 100644 packages/sdk/src/gre/gre.ts delete mode 100644 packages/sdk/src/gre/helpers/argv.ts delete mode 100644 packages/sdk/src/gre/helpers/network.ts delete mode 100644 packages/sdk/src/gre/helpers/utils.ts delete mode 100644 packages/sdk/src/gre/providers.ts delete mode 100644 packages/sdk/src/gre/task.ts delete mode 100644 packages/sdk/src/gre/test/accounts.test.ts delete mode 100644 packages/sdk/src/gre/test/config.test.ts delete mode 100644 packages/sdk/src/gre/test/files/config/graph.goerli.yml delete mode 100644 packages/sdk/src/gre/test/files/config/graph.opts.yml delete mode 100644 packages/sdk/src/gre/test/files/config/graph.opts2.yml delete mode 100644 packages/sdk/src/gre/test/fixture-projects/graph-config-bad/hardhat.config.ts delete mode 100644 packages/sdk/src/gre/test/fixture-projects/graph-config-desambiguate/hardhat.config.ts delete mode 100644 packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account-l2.json delete mode 100644 packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account.json delete mode 100644 packages/sdk/src/gre/test/gre.test.ts delete mode 100644 packages/sdk/src/gre/test/helpers.ts delete mode 100644 packages/sdk/src/gre/type-extensions.ts delete mode 100644 packages/sdk/src/gre/types.ts delete mode 100644 packages/sdk/src/helpers/arbitrum.ts delete mode 100644 packages/sdk/src/helpers/balance.ts delete mode 100644 packages/sdk/src/helpers/code.ts delete mode 100644 packages/sdk/src/helpers/epoch.ts delete mode 100644 packages/sdk/src/helpers/impersonate.ts delete mode 100644 packages/sdk/src/helpers/index.ts delete mode 100644 packages/sdk/src/helpers/mine.ts delete mode 100644 packages/sdk/src/helpers/snapshot.ts delete mode 100644 packages/sdk/src/helpers/time.ts delete mode 100644 packages/sdk/src/index.ts delete mode 100644 packages/sdk/src/utils/abi.ts delete mode 100644 packages/sdk/src/utils/address.ts delete mode 100644 packages/sdk/src/utils/allocation.ts delete mode 100644 packages/sdk/src/utils/arbitrum/address.ts delete mode 100644 packages/sdk/src/utils/arbitrum/gas.ts delete mode 100644 packages/sdk/src/utils/arbitrum/index.ts delete mode 100644 packages/sdk/src/utils/arbitrum/message.ts delete mode 100644 packages/sdk/src/utils/bytes.ts delete mode 100644 packages/sdk/src/utils/eip712.ts delete mode 100644 packages/sdk/src/utils/hash.ts delete mode 100644 packages/sdk/src/utils/index.ts delete mode 100644 packages/sdk/src/utils/nonce.ts delete mode 100644 packages/sdk/src/utils/prompt.ts delete mode 100644 packages/sdk/src/utils/subgraph.ts delete mode 100644 packages/sdk/src/utils/time.ts delete mode 100644 packages/sdk/src/utils/type-guard.ts delete mode 100644 packages/sdk/src/utils/units.ts delete mode 100644 packages/sdk/tsconfig.json create mode 100644 packages/subgraph-service/CHANGELOG.md create mode 100644 packages/subgraph-service/README.md create mode 100644 packages/subgraph-service/addresses-integration-tests.json create mode 100644 packages/subgraph-service/addresses.json create mode 100644 packages/subgraph-service/contracts/DisputeManager.sol create mode 100644 packages/subgraph-service/contracts/DisputeManagerStorage.sol create mode 100644 packages/subgraph-service/contracts/SubgraphService.sol create mode 100644 packages/subgraph-service/contracts/SubgraphServiceStorage.sol create mode 100644 packages/subgraph-service/contracts/libraries/Allocation.sol create mode 100644 packages/subgraph-service/contracts/libraries/Attestation.sol create mode 100644 packages/subgraph-service/contracts/libraries/LegacyAllocation.sol create mode 100644 packages/subgraph-service/contracts/utilities/AllocationManager.sol create mode 100644 packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol create mode 100644 packages/subgraph-service/contracts/utilities/AttestationManager.sol create mode 100644 packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol create mode 100644 packages/subgraph-service/contracts/utilities/Directory.sol create mode 100644 packages/subgraph-service/foundry.toml create mode 100644 packages/subgraph-service/hardhat.config.ts create mode 100644 packages/subgraph-service/ignition/configs/migrate.default.json5 create mode 100644 packages/subgraph-service/ignition/configs/migrate.fork1.json5 create mode 100644 packages/subgraph-service/ignition/configs/migrate.integration.json5 create mode 100644 packages/subgraph-service/ignition/configs/protocol.default.json5 create mode 100644 packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/Controller#Controller.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.dbg.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManagerProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#ProxyAdmin.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#GraphProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphProxyAdmin#GraphProxyAdmin.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphTallyCollector#GraphTallyCollector.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphPayments_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_GraphPayments.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_PaymentsEscrow.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#PaymentsEscrow_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_GraphPayments.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_PaymentsEscrow.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_GraphPayments.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#ExponentialRebates.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStakingExtension.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphCurationToken.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationAddressBook.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationImplementationAddressBook.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#GraphProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#GraphProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#GraphProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#ProxyAdmin.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.dbg.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphServiceProxy.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#DisputeManager_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_DisputeManager.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_SubgraphService.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_DisputeManager.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_SubgraphService.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#SubgraphService_ProxyWithABI.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/build-info/81754efc7e2eec76b7d493cc60c0f970.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/deployed_addresses.json create mode 100644 packages/subgraph-service/ignition/deployments/chain-421614/journal.jsonl create mode 100644 packages/subgraph-service/ignition/modules/Curation.ts create mode 100644 packages/subgraph-service/ignition/modules/DisputeManager.ts create mode 100644 packages/subgraph-service/ignition/modules/GNS.ts create mode 100644 packages/subgraph-service/ignition/modules/Proxies.ts create mode 100644 packages/subgraph-service/ignition/modules/SubgraphService.ts create mode 100644 packages/subgraph-service/ignition/modules/deploy/deploy-1.ts create mode 100644 packages/subgraph-service/ignition/modules/deploy/deploy-2.ts create mode 100644 packages/subgraph-service/ignition/modules/migrate/migrate-1.ts create mode 100644 packages/subgraph-service/ignition/modules/migrate/migrate-2.ts create mode 100644 packages/subgraph-service/natspec-smells.config.js create mode 100644 packages/subgraph-service/package.json create mode 100644 packages/subgraph-service/prettier.config.cjs create mode 100644 packages/subgraph-service/remappings.txt create mode 100755 packages/subgraph-service/scripts/integration create mode 100644 packages/subgraph-service/scripts/ops/data.ts create mode 100644 packages/subgraph-service/scripts/ops/protocol-activity.ts create mode 100755 packages/subgraph-service/scripts/post-verify create mode 100755 packages/subgraph-service/scripts/pre-verify create mode 100644 packages/subgraph-service/tasks/deploy.ts create mode 100644 packages/subgraph-service/tasks/test/integration.ts create mode 100644 packages/subgraph-service/tasks/test/seed.ts create mode 100644 packages/subgraph-service/test/deployment/DisputeManager.test.ts create mode 100644 packages/subgraph-service/test/deployment/SubgraphService.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/dispute-manager/governance.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/dispute-manager/indexing-disputes.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-conflict-disputes.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-disputes.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/pause.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/subgraph-service/governance.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/subgraph-service/indexer.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/subgraph-service/operator.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/subgraph-service/paused.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/subgraph-service/permisionless.test.ts create mode 100644 packages/subgraph-service/test/integration/after-transition-period/upgrade.test.ts create mode 100644 packages/subgraph-service/test/integration/during-transition-period/dispute-manager.test.ts create mode 100644 packages/subgraph-service/test/integration/during-transition-period/governance.test.ts create mode 100644 packages/subgraph-service/test/integration/during-transition-period/indexer.test.ts create mode 100644 packages/subgraph-service/test/integration/during-transition-period/legacy-dispute-manager.test.ts create mode 100644 packages/subgraph-service/test/unit/SubgraphBaseTest.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/DisputeManager.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/constructor/constructor.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/disputes.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/indexing/accept.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/indexing/cancel.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/indexing/create.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/indexing/draw.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/indexing/reject.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/legacy.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/query/accept.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/query/cancel.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/query/create.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/query/draw.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/query/reject.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/accept.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/cancel.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/create.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/draw.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/reject.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/governance/arbitrator.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/governance/disputeDeposit.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/governance/fishermanRewardCut.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/governance/maxSlashingCut.t.sol create mode 100644 packages/subgraph-service/test/unit/disputeManager/governance/subgraphService.t.sol create mode 100644 packages/subgraph-service/test/unit/mocks/MockCuration.sol create mode 100644 packages/subgraph-service/test/unit/mocks/MockEpochManager.sol create mode 100644 packages/subgraph-service/test/unit/mocks/MockGRTToken.sol create mode 100644 packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol create mode 100644 packages/subgraph-service/test/unit/shared/HorizonStakingShared.t.sol create mode 100644 packages/subgraph-service/test/unit/shared/SubgraphServiceShared.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/SubgraphService.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/allocation/forceClose.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/allocation/overDelegated.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/allocation/resize.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/allocation/start.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/allocation/stop.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/collect/collect.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/collect/indexing/indexing.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/collect/query/query.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/governance/legacy.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/governance/stakeToFeesRatio.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/provider/register.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/provider/rewardsDestination.t.sol create mode 100644 packages/subgraph-service/test/unit/subgraphService/provision/accept.t.sol create mode 100644 packages/subgraph-service/test/unit/utils/Constants.sol create mode 100644 packages/subgraph-service/test/unit/utils/Users.sol create mode 100644 packages/subgraph-service/test/unit/utils/Utils.sol create mode 100644 packages/subgraph-service/tsconfig.json create mode 100644 packages/token-distribution/ops/update-auth-functions-horizon.ts create mode 100644 packages/toolshed/CHANGELOG.md create mode 100644 packages/toolshed/README.md create mode 100644 packages/toolshed/package.json create mode 100644 packages/toolshed/prettier.config.cjs create mode 100644 packages/toolshed/src/core/accounts.ts create mode 100644 packages/toolshed/src/core/allocation.ts create mode 100644 packages/toolshed/src/core/attestations.ts create mode 100644 packages/toolshed/src/core/constants.ts create mode 100644 packages/toolshed/src/core/disputes.ts create mode 100644 packages/toolshed/src/core/graph-tally.ts create mode 100644 packages/toolshed/src/core/index.ts create mode 100644 packages/toolshed/src/core/poi.ts create mode 100644 packages/toolshed/src/core/subgraph-service.ts create mode 100644 packages/toolshed/src/core/types.ts create mode 100644 packages/toolshed/src/deployments/address-book.ts create mode 100644 packages/toolshed/src/deployments/contract.ts create mode 100644 packages/toolshed/src/deployments/horizon/actions.ts create mode 100644 packages/toolshed/src/deployments/horizon/address-book.ts create mode 100644 packages/toolshed/src/deployments/horizon/contracts.ts create mode 100644 packages/toolshed/src/deployments/horizon/index.ts create mode 100644 packages/toolshed/src/deployments/index.ts create mode 100644 packages/toolshed/src/deployments/subgraph-service/actions.ts create mode 100644 packages/toolshed/src/deployments/subgraph-service/address-book.ts create mode 100644 packages/toolshed/src/deployments/subgraph-service/contracts.ts create mode 100644 packages/toolshed/src/deployments/subgraph-service/index.ts create mode 100644 packages/toolshed/src/deployments/tx-logging.ts create mode 100644 packages/toolshed/src/deployments/types.ts create mode 100644 packages/toolshed/src/fixtures/delegators.ts create mode 100644 packages/toolshed/src/fixtures/index.ts create mode 100644 packages/toolshed/src/fixtures/indexers-subgraph-service.ts create mode 100644 packages/toolshed/src/fixtures/indexers.ts create mode 100644 packages/toolshed/src/hardhat/config.ts create mode 100644 packages/toolshed/src/hardhat/erc20.ts create mode 100644 packages/toolshed/src/hardhat/event.ts create mode 100644 packages/toolshed/src/hardhat/hardhat.base.config.ts create mode 100644 packages/toolshed/src/hardhat/ignition.ts create mode 100644 packages/toolshed/src/hardhat/index.ts create mode 100644 packages/toolshed/src/hardhat/local.ts rename packages/{sdk/src/utils/assertions.ts => toolshed/src/lib/assert.ts} (100%) create mode 100644 packages/toolshed/src/lib/bytes.ts rename packages/{sdk/src/deployments => toolshed/src/lib}/logger.ts (51%) create mode 100644 packages/toolshed/src/lib/resolve.ts create mode 100644 packages/toolshed/src/utils/banner.ts create mode 100644 packages/toolshed/src/utils/bigint.ts create mode 100644 packages/toolshed/src/utils/index.ts create mode 100644 packages/toolshed/tsconfig.json create mode 100755 scripts/bytecode-diff.sh diff --git a/.gitignore b/.gitignore index 51086e4bd..b68fcd815 100644 --- a/.gitignore +++ b/.gitignore @@ -27,10 +27,14 @@ packages/*/.eslintcache # Build artifacts dist/ +dist-v5/ build/ typechain/ typechain-types/ types/ +types-v5/ +wagmi/ +types/ deployments/hardhat/ *.js.map *.d.ts.map @@ -54,12 +58,11 @@ lcov.info hardhat-dependency-compiler/ # Local test files -addresses-local*.json localNetwork.json arbitrum-addresses-local.json -tx-*.log addresses-fork.json addresses-hardhat.json +addresses-local*.json # Keys .keystore @@ -72,10 +75,16 @@ out/ # Graph client .graphclient +# Tx builder and logger +tx-*.log tx-builder-*.json !tx-builder-template.json # Hardhat Ignition +**/ignition/deployments/*-localhost/ +**/ignition/deployments/*-hardhat/ +**/ignition/deployments/*-31337/ +**/ignition/deployments/*-1337/ **/chain-31337/ **/chain-1377/ **/horizon-localhost/ diff --git a/.markdownlintignore b/.markdownlintignore index 7e6987fa7..8a1e8ccaf 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -35,3 +35,42 @@ deployments/hardhat/ **/chain-*/ **/*-localhost/ **/*-hardhat/ +# Dependencies +node_modules/ + +# Third-party libraries in lib directories +**/lib/ + +# Build outputs +**/build/ +**/dist/ +**/artifacts/ +**/typechain-types/ +**/types/ +**/cache/ +**/cached/ +cache +typechain/ +bin/ +forge-artifacts/ +out/ + +# Coverage and reports +coverage/ +reports/ +coverage.json +lcov.info +.nyc_output/ + +# Other generated files +.eslintcache +packages/*/.eslintcache +deployments/hardhat/ +.graphclient +**/chain-31337/ +**/chain-1377/ +**/horizon-localhost/ +**/horizon-hardhat/ +**/subgraph-service-localhost/ +**/subgraph-service-hardhat/ +.changeset/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..909bf5e9f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,164 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Repository Overview + +This is The Graph Protocol's smart contracts monorepo - a decentralized network for querying and indexing blockchain data. It uses pnpm workspaces to manage multiple packages. + +## Key Commands + +### Build and Development + +```bash +# Install dependencies (uses pnpm) +pnpm install + +# Build all packages +pnpm build + +# Clean build artifacts +pnpm clean + +# Deep clean (including node_modules) +pnpm clean:all +``` + +### Testing + +```bash +# Run all tests +pnpm test + +# Run tests with coverage +pnpm test:coverage + +# Test a specific package +cd packages/ && pnpm test + +# Test a single file (in contracts package) +cd packages/contracts && npx hardhat test test/.ts + +# Run Foundry tests (in horizon/subgraph-service) +cd packages/horizon && pnpm test + +# Run integration tests +cd packages/horizon && pnpm test:integration + +# Run deployment tests +cd packages/horizon && pnpm test:deployment +``` + +### Linting and Formatting + +```bash +# Run all linters +pnpm lint + +# Format code +pnpm format + +# Individual linters +pnpm lint:ts # TypeScript/JavaScript +pnpm lint:sol # Solidity +pnpm lint:natspec # NatSpec comments +pnpm lint:md # Markdown +pnpm lint:json # JSON files +pnpm lint:yaml # YAML files +``` + +## Architecture Overview + +### Package Structure + +1. **contracts** - Original Graph Protocol contracts (staking, curation, disputes) + - Uses Hardhat for development + - Contains E2E testing framework for protocol validation + +2. **horizon** - Next iteration of The Graph protocol + - Uses Hardhat + Foundry for testing + - Deployment via Hardhat Ignition + - Migration path from original protocol + +3. **subgraph-service** - Data service implementation for Graph Horizon + - Manages disputes and allocations + - Part of the Horizon ecosystem + +4. **interfaces** - Shared contract interfaces + - Centralized repository for all Solidity contract interfaces + - Used by multiple packages/programs for contract implementation and interaction + - Generates TypeScript types for distribution via npm + - Defaults to ethers v6 type generation + - Includes Wagmi type generation support + - Includes ethers v5 type generation + - Published types can be imported by any TypeScript program + +5. **token-distribution** - Token locking and vesting contracts + - GraphTokenLockWallet and GraphTokenLockManager + - L2 token distribution functionality + +6. **toolshed** - Shared development utilities + - Deployment helpers + - Test fixtures + - Hardhat extensions + +### Key Architectural Patterns + +- **Proxy Upgradeable Pattern**: Most contracts use OpenZeppelin's upgradeable proxy pattern +- **Storage Separation**: Storage contracts are separate from logic contracts +- **Governor/Controller Pattern**: Access control through Governor and Controller contracts +- **Modular Design**: Clear separation between protocol layers and services + +### Testing Strategy + +- **Unit Tests**: TypeScript tests using Hardhat Test Environment +- **Foundry Tests**: Solidity tests (`.t.sol` files) for horizon and subgraph-service +- **Integration Tests**: Cross-contract interaction testing +- **E2E Tests**: Full protocol deployment and operation validation + +### Deployment + +- Contract addresses stored in `addresses.json` files per package +- Multi-network support (mainnet, testnets, Arbitrum chains) +- Hardhat Ignition for deployment management +- Migration scripts for upgrading from original protocol to Horizon + +## Development Tips + +### Working with Horizon + +Horizon packages use both Hardhat and Foundry. When developing: + +1. Use `forge test` for Foundry tests +2. Use `pnpm test:integration` for integration tests +3. Set required RPC URLs using `npx hardhat vars set ` + +### Contract Verification + +For contract verification on block explorers: + +```bash +npx hardhat vars set ARBISCAN_API_KEY +``` + +### Changesets for Versioning + +When making changes that should be published: + +```bash +# Create a changeset +pnpm changeset + +# Version packages (maintainer only) +pnpm changeset version + +# Publish to npm (maintainer only) +pnpm changeset publish +``` + +### Security Considerations + +- Audit reports available in `audits/` directories +- Use existing proxy patterns and access control mechanisms +- Follow established upgrade procedures for contract modifications +- Report security issues through Immunefi bounty program diff --git a/count-patterns.txt b/count-patterns.txt index 60717b3ec..f92174429 100644 --- a/count-patterns.txt +++ b/count-patterns.txt @@ -8,7 +8,7 @@ # Include patterns (files to count): packages/issuance/contracts/**/*.sol packages/contracts/contracts/rewards/RewardsManager*.sol -packages/common/contracts/**/*.sol +packages/interfaces/contracts/**/*.sol # Exclude patterns (files to ignore): !*/mocks/*.sol diff --git a/eslint.config.mjs b/eslint.config.mjs index f50113458..15005884a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -126,7 +126,8 @@ export function getGitignorePatterns(customGitignorePath = null) { return translateGitignorePatterns(gitignorePath, repoRoot) } -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const eslintConfig = [ // Include .gitignore patterns includeGitignore(), @@ -271,3 +272,5 @@ export default [ files: ['packages/**/*.{js,ts,cjs,mjs,jsx,tsx}'], }, ] + +export default eslintConfig diff --git a/packages/address-book/CHANGELOG.md b/packages/address-book/CHANGELOG.md new file mode 100644 index 000000000..9e379f84f --- /dev/null +++ b/packages/address-book/CHANGELOG.md @@ -0,0 +1,12 @@ +# @graphprotocol/address-book + +## 0.1.0 + +### Minor Changes + +- Initial release of @graphprotocol/address-book + + This package provides contract addresses for The Graph Protocol: + - Horizon protocol addresses + - Subgraph Service addresses + - Automatic symlink handling for publishing diff --git a/packages/address-book/README.md b/packages/address-book/README.md new file mode 100644 index 000000000..fc7fe9412 --- /dev/null +++ b/packages/address-book/README.md @@ -0,0 +1,85 @@ +# @graphprotocol/address-book + +Contract addresses for The Graph Protocol. This package provides JSON files containing contract addresses for different networks. + +## Features + +- Contract addresses for Horizon and Subgraph Service +- Network-specific deployment addresses +- Zero dependencies + +## Installation + +```bash +npm install @graphprotocol/address-book +# or +pnpm install @graphprotocol/address-book +``` + +## Usage + +### Import addresses directly + +```javascript +// CommonJS +const horizonAddresses = require('@graphprotocol/address-book/horizon/addresses.json') +const subgraphServiceAddresses = require('@graphprotocol/address-book/subgraph-service/addresses.json') + +// ES Modules +import horizonAddresses from '@graphprotocol/address-book/horizon/addresses.json' +import subgraphServiceAddresses from '@graphprotocol/address-book/subgraph-service/addresses.json' +``` + +### Address format + +The addresses are organized by chain ID and contract name: + +```json +{ + "1337": { + "Controller": { + "address": "0x...", + "proxy": "transparent", + "proxyAdmin": "0x...", + "implementation": "0x..." + } + } +} +``` + +## Development + +This package uses symlinks to stay in sync with the source address files. On first install, symlinks are automatically created. + +## npm Publishing + +This package uses a special workflow to ensure address files are included in the published package: + +### How It Works + +**Development**: The package uses symlinks to stay in sync with source address files: + +- `src/horizon/addresses.json` → symlink to `../../../horizon/addresses.json` +- `src/subgraph-service/addresses.json` → symlink to `../../../subgraph-service/addresses.json` + +**Publishing**: npm doesn't include symlinks in packages, so we automatically handle this: + +```bash +npm publish +``` + +**Automatic execution**: + +1. **`prepublishOnly`** - Copies actual files to replace symlinks +2. **npm pack & publish** - Includes real address files in published package +3. **`postpublish`** - Restores symlinks for development + +### Troubleshooting + +If publishing fails, the `postpublish` script may not run, leaving copied files instead of symlinks. To restore symlinks manually: + +```bash +pnpm restore-symlinks +``` + +All symlink management is handled automatically during successful publishes. diff --git a/packages/address-book/package.json b/packages/address-book/package.json new file mode 100644 index 000000000..601b14dd0 --- /dev/null +++ b/packages/address-book/package.json @@ -0,0 +1,36 @@ +{ + "name": "@graphprotocol/address-book", + "version": "0.1.0", + "publishConfig": { + "access": "public" + }, + "description": "Contract addresses for The Graph Protocol", + "author": "The Graph core devs", + "license": "GPL-2.0-or-later", + "exports": { + "./horizon/addresses.json": "./src/horizon/addresses.json", + "./subgraph-service/addresses.json": "./src/subgraph-service/addresses.json" + }, + "files": [ + "src/**/*.json", + "README.md" + ], + "scripts": { + "lint": "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" + }, + "keywords": [ + "ethereum", + "smart-contracts", + "graph", + "graph-protocol", + "horizon", + "subgraph-service", + "address-book" + ] +} diff --git a/packages/address-book/prettier.config.cjs b/packages/address-book/prettier.config.cjs new file mode 100644 index 000000000..42c971aaf --- /dev/null +++ b/packages/address-book/prettier.config.cjs @@ -0,0 +1 @@ +module.exports = require('../../prettier.config.cjs') diff --git a/packages/address-book/scripts/copy-addresses-for-publish.js b/packages/address-book/scripts/copy-addresses-for-publish.js new file mode 100755 index 000000000..5fdfdc2c2 --- /dev/null +++ b/packages/address-book/scripts/copy-addresses-for-publish.js @@ -0,0 +1,68 @@ +#!/usr/bin/env node + +/** + * Copy Addresses for Publishing + * + * This script copies the actual addresses.json files from horizon and subgraph-service + * packages to replace the symlinks before npm publish. + * + * Why we need this: + * - Development uses symlinks (committed to git) for convenience + * - npm publish doesn't include symlinks in the published package + * - We need actual files in the published package for consumers + * + * The postpublish script will restore the symlinks after publishing. + */ + +const fs = require('fs') +const path = require('path') + +const FILES_TO_COPY = [ + { + source: '../../../horizon/addresses.json', + target: 'src/horizon/addresses.json', + }, + { + source: '../../../subgraph-service/addresses.json', + target: 'src/subgraph-service/addresses.json', + }, +] + +function copyFileForPublish(source, target) { + const targetPath = path.resolve(__dirname, '..', target) + const sourcePath = path.resolve(path.dirname(targetPath), source) + + // Ensure source exists + if (!fs.existsSync(sourcePath)) { + console.error(`❌ Source file ${sourcePath} does not exist`) + process.exit(1) + } + + // Remove existing symlink + if (fs.existsSync(targetPath)) { + fs.unlinkSync(targetPath) + } + + // Copy actual file + try { + fs.copyFileSync(sourcePath, targetPath) + console.log(`✅ Copied for publish: ${target} <- ${source}`) + } catch (error) { + console.error(`❌ Failed to copy ${source} to ${target}:`, error.message) + process.exit(1) + } +} + +function main() { + console.log('📦 Copying address files for npm publish...') + + for (const { source, target } of FILES_TO_COPY) { + copyFileForPublish(source, target) + } + + console.log('✅ Address files copied for publish!') +} + +if (require.main === module) { + main() +} diff --git a/packages/address-book/scripts/restore-symlinks.js b/packages/address-book/scripts/restore-symlinks.js new file mode 100755 index 000000000..05e5ec6f9 --- /dev/null +++ b/packages/address-book/scripts/restore-symlinks.js @@ -0,0 +1,55 @@ +#!/usr/bin/env node + +/** + * Restore Symlinks After Publishing + * + * This script restores the symlinks after npm publish completes. + * The prepublishOnly script replaces symlinks with actual files for publishing, + * and this script puts the symlinks back for development. + */ + +const fs = require('fs') +const path = require('path') + +const SYMLINKS_TO_RESTORE = [ + { + target: '../../../horizon/addresses.json', + link: 'src/horizon/addresses.json', + }, + { + target: '../../../subgraph-service/addresses.json', + link: 'src/subgraph-service/addresses.json', + }, +] + +function restoreSymlink(target, link) { + const linkPath = path.resolve(__dirname, '..', link) + + // Remove the copied file + if (fs.existsSync(linkPath)) { + fs.unlinkSync(linkPath) + } + + // Restore symlink + try { + fs.symlinkSync(target, linkPath) + console.log(`✅ Restored symlink: ${link} -> ${target}`) + } catch (error) { + console.error(`❌ Failed to restore symlink ${link}:`, error.message) + process.exit(1) + } +} + +function main() { + console.log('🔗 Restoring symlinks after publish...') + + for (const { target, link } of SYMLINKS_TO_RESTORE) { + restoreSymlink(target, link) + } + + console.log('✅ Symlinks restored!') +} + +if (require.main === module) { + main() +} diff --git a/packages/address-book/src/horizon/addresses.json b/packages/address-book/src/horizon/addresses.json new file mode 120000 index 000000000..dcec24e00 --- /dev/null +++ b/packages/address-book/src/horizon/addresses.json @@ -0,0 +1 @@ +../../../horizon/addresses.json \ No newline at end of file diff --git a/packages/address-book/src/subgraph-service/addresses.json b/packages/address-book/src/subgraph-service/addresses.json new file mode 120000 index 000000000..c4e2f4633 --- /dev/null +++ b/packages/address-book/src/subgraph-service/addresses.json @@ -0,0 +1 @@ +../../../subgraph-service/addresses.json \ No newline at end of file diff --git a/packages/common/README.md b/packages/common/README.md deleted file mode 100644 index 20e550114..000000000 --- a/packages/common/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# @graphprotocol/common - -Common utilities and configuration for Graph Protocol packages. - -## Overview - -This package provides shared utilities and configuration for all Graph Protocol packages. It centralizes network configurations, contract addresses, and environment variable handling to ensure consistency across packages. - -## Installation - -```bash -# From the root of the monorepo -yarn workspace @graphprotocol/common install -``` - -## Usage - -TODO: This needs to be refactored with Ignition usage. - -### Network Configuration - -```javascript -import { - getNetworkConfig, - getNetworkConfigByChainId, - isL2Network, - isProductionNetwork, - getAnvilForkConfig, -} from '@graphprotocol/common' - -// Get network configuration by name -const arbitrumConfig = getNetworkConfig('arbitrumOne') -console.log(arbitrumConfig.displayName) // Arbitrum One -console.log(arbitrumConfig.sourceRpcUrl) // https://arb1.arbitrum.io/rpc -console.log(arbitrumConfig.localRpcUrl) // http://127.0.0.1:8545 - -// Get network configuration by chain ID -const ethereumConfig = getNetworkConfigByChainId(1) -console.log(ethereumConfig.name) // ethereumMainnet - -// Check if a network is an L2 -const isL2 = isL2Network('arbitrumOne') // true - -// Check if a network is a production network -const isProd = isProductionNetwork('arbitrumOne') // true - -// Configure an Anvil fork for a specific network -const forkConfig = getAnvilForkConfig('arbitrumOne') -console.log(forkConfig.displayName) // Anvil Fork of Arbitrum One -console.log(forkConfig.sourceRpcUrl) // https://arb1.arbitrum.io/rpc -console.log(forkConfig.localRpcUrl) // http://127.0.0.1:8545 -``` - -Each network configuration includes: - -- `name`: Internal name of the network -- `displayName`: Human-readable name of the network -- `chainId`: Chain ID of the network -- `sourceRpcUrl`: RPC URL of the actual network (used for forking) -- `localRpcUrl`: RPC URL for local development/testing (used for connecting) -- `blockExplorer`: URL of the block explorer -- `isL2`: Whether the network is an L2 -- `isProduction`: Whether the network is a production network -- `paramsFile`: Path to the parameter file for deployments - -### Contract Addresses - -```javascript -import { getContractAddress, getAllContractAddresses } from '@graphprotocol/common' - -// Get a specific contract address -const graphTokenAddress = getContractAddress(1, 'GraphToken') -console.log(graphTokenAddress) // 0x... - -// Get all contract addresses for a chain ID -const addresses = getAllContractAddresses(1) -console.log(addresses.GraphToken) // 0x... -``` - -Note: For Arbitrum networks, the GraphToken contract address is stored as L2GraphToken in the addresses.json file, but you can still use 'GraphToken' as the contract name in your code. - -### Environment Variables - -```javascript -import { loadEnv, getEnv, getBoolEnv, getNumericEnv } from '@graphprotocol/common' - -// Load environment variables from a file -loadEnv('.env.arbitrum-one') - -// Get environment variables with fallbacks -const rpcUrl = getEnv('RPC_URL', 'http://localhost:8545') -const isProduction = getBoolEnv('PRODUCTION', false) -const chainId = getNumericEnv('CHAIN_ID', 1) -``` - -## Command-line Usage - -The addresses.js module can be used directly from the command line: - -```bash -# Get a specific contract address -node src/config/addresses.js 1 GraphToken - -# Get all contract addresses for a chain ID -node src/config/addresses.js 1 -``` - -## Directory Structure - -```text -src/ - config/ # Shared configuration - networks.js # Network configurations - addresses.js # Contract addresses utility - ignition/ # Ignition-specific configuration - parameters/ # Shared parameter templates - utils/ # Shared utilities - env.js # Environment variable handling - index.js # Main entry point -``` - -## Contributing - -To add a new network configuration, update the `NETWORKS` object in `src/config/networks.js`. - -To add new utilities, create a new file in the appropriate directory and export it from `src/index.js`. diff --git a/packages/common/hardhat.config.js b/packages/common/hardhat.config.js deleted file mode 100644 index 4a1e07786..000000000 --- a/packages/common/hardhat.config.js +++ /dev/null @@ -1,37 +0,0 @@ -const config = { - solidity: { - compilers: [ - { - version: '0.8.27', - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - }, - }, - { - version: '0.7.6', - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - }, - }, - ], - }, - paths: { - sources: './contracts', - artifacts: './artifacts', - cache: './cache', - }, - defaultNetwork: 'hardhat', - networks: { - hardhat: { - chainId: 1337, - }, - }, -} - -module.exports = config diff --git a/packages/common/package.json b/packages/common/package.json deleted file mode 100644 index 8072a6d5f..000000000 --- a/packages/common/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "@graphprotocol/common", - "version": "0.1.0", - "description": "Common utilities and configuration for Graph Protocol packages", - "main": "build/index.js", - "types": "types/index.d.ts", - "exports": { - ".": { - "import": "./build/index.js", - "types": "./types/index.d.ts" - } - }, - "files": [ - "build/**/*", - "types/**/*", - "contracts/**/*", - "artifacts/**/*", - "README.md" - ], - "author": "The Graph Team", - "license": "GPL-2.0-or-later", - "scripts": { - "clean": "rm -rf build cache types artifacts", - "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'", - "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}'" - }, - "dependencies": { - "dotenv": "^16.3.1" - }, - "devDependencies": { - "@openzeppelin/contracts": "^5.3.0", - "@openzeppelin/contracts-upgradeable": "^5.3.0", - "@types/node": "^20.17.50", - "eslint": "catalog:", - "eslint-config-prettier": "catalog:", - "globals": "^16.1.0", - "markdownlint-cli": "catalog:", - "prettier": "catalog:", - "solhint": "catalog:", - "typescript": "catalog:", - "typescript-eslint": "catalog:" - } -} diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json deleted file mode 100644 index 2a9239355..000000000 --- a/packages/common/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./build", - "declarationDir": "./types", - "tsBuildInfoFile": "./cache/tsbuildinfo", - "allowSyntheticDefaultImports": true - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules", "build", "types", "cache"] -} diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 2e99896ed..e8a24c85a 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,5 +1,23 @@ # @graphprotocol/contracts +## 7.3.0 + +### Minor Changes + +- Extracted contract interfaces into its own package + +## 7.2.1 + +### Patch Changes + +- Fix prepack script + +## 7.2.0 + +### Minor Changes + +- Sub-packages for contracts package + ## 7.1.2 ### Patch Changes diff --git a/packages/contracts/contracts/arbitrum/ITokenGateway.sol b/packages/contracts/contracts/arbitrum/ITokenGateway.sol index fd0094398..2a0d1a2f3 100644 --- a/packages/contracts/contracts/arbitrum/ITokenGateway.sol +++ b/packages/contracts/contracts/arbitrum/ITokenGateway.sol @@ -23,7 +23,7 @@ * */ -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Token Gateway Interface diff --git a/packages/contracts/contracts/base/IMulticall.sol b/packages/contracts/contracts/base/IMulticall.sol index 9b9de5ad0..07f40ea36 100644 --- a/packages/contracts/contracts/base/IMulticall.sol +++ b/packages/contracts/contracts/base/IMulticall.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; /** diff --git a/packages/contracts/contracts/curation/Curation.sol b/packages/contracts/contracts/curation/Curation.sol index 4153d2c02..135066666 100644 --- a/packages/contracts/contracts/curation/Curation.sol +++ b/packages/contracts/contracts/curation/Curation.sol @@ -13,9 +13,9 @@ 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 "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsManager } from "../rewards/IRewardsManager.sol"; import { Managed } from "../governance/Managed.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; import { CurationV2Storage } from "./CurationStorage.sol"; import { IGraphCurationToken } from "./IGraphCurationToken.sol"; diff --git a/packages/contracts/contracts/curation/CurationStorage.sol b/packages/contracts/contracts/curation/CurationStorage.sol index 8a22f0568..eca774318 100644 --- a/packages/contracts/contracts/curation/CurationStorage.sol +++ b/packages/contracts/contracts/curation/CurationStorage.sol @@ -77,3 +77,16 @@ abstract contract CurationV1Storage is Managed, ICuration { abstract contract CurationV2Storage is CurationV1Storage, Initializable { // Nothing here, just adding Initializable } + +/** + * @title Curation Storage version 3 + * @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. + * When adding new variables, create a new version that inherits this and update + * the contracts to use the new version instead. + */ +abstract contract CurationV3Storage is CurationV2Storage { + // Address of the subgraph service + address public subgraphService; +} diff --git a/packages/contracts/contracts/curation/ICuration.sol b/packages/contracts/contracts/curation/ICuration.sol index 64cc97948..b71273c25 100644 --- a/packages/contracts/contracts/curation/ICuration.sol +++ b/packages/contracts/contracts/curation/ICuration.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Curation Interface diff --git a/packages/contracts/contracts/discovery/IGNS.sol b/packages/contracts/contracts/discovery/IGNS.sol index e962348c7..98f4b339e 100644 --- a/packages/contracts/contracts/discovery/IGNS.sol +++ b/packages/contracts/contracts/discovery/IGNS.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Interface for GNS diff --git a/packages/contracts/contracts/discovery/IServiceRegistry.sol b/packages/contracts/contracts/discovery/IServiceRegistry.sol index 94c7e428e..89dafafd3 100644 --- a/packages/contracts/contracts/discovery/IServiceRegistry.sol +++ b/packages/contracts/contracts/discovery/IServiceRegistry.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Service Registry Interface diff --git a/packages/contracts/contracts/discovery/ISubgraphNFT.sol b/packages/contracts/contracts/discovery/ISubgraphNFT.sol index 9d6fe87a0..f735c00f6 100644 --- a/packages/contracts/contracts/discovery/ISubgraphNFT.sol +++ b/packages/contracts/contracts/discovery/ISubgraphNFT.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; diff --git a/packages/contracts/contracts/discovery/L1GNS.sol b/packages/contracts/contracts/discovery/L1GNS.sol index adbb51831..03167dcd9 100644 --- a/packages/contracts/contracts/discovery/L1GNS.sol +++ b/packages/contracts/contracts/discovery/L1GNS.sol @@ -9,7 +9,7 @@ import { GNS } from "./GNS.sol"; import { ITokenGateway } from "../arbitrum/ITokenGateway.sol"; import { IL2GNS } from "../l2/discovery/IL2GNS.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; import { L1GNSV1Storage } from "./L1GNSStorage.sol"; /** diff --git a/packages/contracts/contracts/disputes/DisputeManager.sol b/packages/contracts/contracts/disputes/DisputeManager.sol index b07d7933c..8eb0d513b 100644 --- a/packages/contracts/contracts/disputes/DisputeManager.sol +++ b/packages/contracts/contracts/disputes/DisputeManager.sol @@ -594,7 +594,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa /** * @inheritdoc IDisputeManager */ - function drawDispute(bytes32 _disputeID) public override onlyArbitrator onlyPendingDispute(_disputeID) { + function drawDispute(bytes32 _disputeID) external override onlyArbitrator onlyPendingDispute(_disputeID) { Dispute storage dispute = disputes[_disputeID]; // Return deposit to the fisherman diff --git a/packages/contracts/contracts/disputes/IDisputeManager.sol b/packages/contracts/contracts/disputes/IDisputeManager.sol index 2064fc5e7..0db94e290 100644 --- a/packages/contracts/contracts/disputes/IDisputeManager.sol +++ b/packages/contracts/contracts/disputes/IDisputeManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; pragma abicoder v2; /** diff --git a/packages/contracts/contracts/epochs/IEpochManager.sol b/packages/contracts/contracts/epochs/IEpochManager.sol index c59139249..24759f603 100644 --- a/packages/contracts/contracts/epochs/IEpochManager.sol +++ b/packages/contracts/contracts/epochs/IEpochManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Epoch Manager Interface diff --git a/packages/contracts/contracts/gateway/ICallhookReceiver.sol b/packages/contracts/contracts/gateway/ICallhookReceiver.sol index a37a42380..d3b674bcc 100644 --- a/packages/contracts/contracts/gateway/ICallhookReceiver.sol +++ b/packages/contracts/contracts/gateway/ICallhookReceiver.sol @@ -7,7 +7,7 @@ * 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; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Callhook Receiver Interface diff --git a/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol b/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol index 3bd0c6f0e..a4fe59565 100644 --- a/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol +++ b/packages/contracts/contracts/gateway/L1GraphTokenGateway.sol @@ -17,7 +17,7 @@ import { IOutbox } from "../arbitrum/IOutbox.sol"; import { ITokenGateway } from "../arbitrum/ITokenGateway.sol"; import { Managed } from "../governance/Managed.sol"; import { GraphTokenGateway } from "./GraphTokenGateway.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; /** * @title L1 Graph Token Gateway Contract diff --git a/packages/contracts/contracts/governance/Controller.sol b/packages/contracts/contracts/governance/Controller.sol index 0e582df44..b8c2d7725 100644 --- a/packages/contracts/contracts/governance/Controller.sol +++ b/packages/contracts/contracts/governance/Controller.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +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 @@ -93,8 +93,8 @@ contract Controller is Governed, Pausable, IController { * @inheritdoc IController * @dev Partial pause is intended as a partial pause of the protocol */ - function setPartialPaused(bool _toPause) external override onlyGovernorOrGuardian { - _setPartialPaused(_toPause); + function setPartialPaused(bool _toPartialPause) external override onlyGovernorOrGuardian { + _setPartialPaused(_toPartialPause); } /** diff --git a/packages/contracts/contracts/governance/Governed.sol b/packages/contracts/contracts/governance/Governed.sol index 44fc5498d..8c3446b88 100644 --- a/packages/contracts/contracts/governance/Governed.sol +++ b/packages/contracts/contracts/governance/Governed.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 diff --git a/packages/contracts/contracts/governance/IController.sol b/packages/contracts/contracts/governance/IController.sol index 09f03dbb1..af1c43a0e 100644 --- a/packages/contracts/contracts/governance/IController.sol +++ b/packages/contracts/contracts/governance/IController.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.6.12 <0.8.0; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Controller Interface diff --git a/packages/contracts/contracts/governance/IManaged.sol b/packages/contracts/contracts/governance/IManaged.sol index 988146318..8bfe2ae0b 100644 --- a/packages/contracts/contracts/governance/IManaged.sol +++ b/packages/contracts/contracts/governance/IManaged.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; import { IController } from "./IController.sol"; diff --git a/packages/contracts/contracts/governance/Managed.sol b/packages/contracts/contracts/governance/Managed.sol index 890c4366a..c8ec99ac5 100644 --- a/packages/contracts/contracts/governance/Managed.sol +++ b/packages/contracts/contracts/governance/Managed.sol @@ -9,9 +9,9 @@ import { IController } from "./IController.sol"; import { ICuration } from "../curation/ICuration.sol"; import { IEpochManager } from "../epochs/IEpochManager.sol"; -import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsManager } from "../rewards/IRewardsManager.sol"; import { IStaking } from "../staking/IStaking.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; import { ITokenGateway } from "../arbitrum/ITokenGateway.sol"; import { IGNS } from "../discovery/IGNS.sol"; diff --git a/packages/contracts/contracts/governance/Pausable.sol b/packages/contracts/contracts/governance/Pausable.sol index a4b130008..bf260cb72 100644 --- a/packages/contracts/contracts/governance/Pausable.sol +++ b/packages/contracts/contracts/governance/Pausable.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; // TODO: Re-enable and fix issues when publishing a new version // solhint-disable gas-indexed-events @@ -22,7 +22,7 @@ abstract contract Pausable { bool internal _paused; /// @notice Timestamp for the last time the partial pause was set - uint256 public lastPausePartialTime; + uint256 public lastPartialPauseTime; /// @notice Timestamp for the last time the full pause was set uint256 public lastPauseTime; @@ -51,15 +51,15 @@ abstract contract Pausable { /** * @notice Change the partial paused state of the contract - * @param _toPause New value for the partial pause state (true means the contracts will be partially paused) + * @param _toPartialPause New value for the partial pause state (true means the contracts will be partially paused) */ - function _setPartialPaused(bool _toPause) internal { - if (_toPause == _partialPaused) { + function _setPartialPaused(bool _toPartialPause) internal { + if (_toPartialPause == _partialPaused) { return; } - _partialPaused = _toPause; + _partialPaused = _toPartialPause; if (_partialPaused) { - lastPausePartialTime = block.timestamp; + lastPartialPauseTime = block.timestamp; } emit PartialPauseChanged(_partialPaused); } @@ -86,6 +86,6 @@ abstract contract Pausable { function _setPauseGuardian(address newPauseGuardian) internal { address oldPauseGuardian = pauseGuardian; pauseGuardian = newPauseGuardian; - emit NewPauseGuardian(oldPauseGuardian, pauseGuardian); + emit NewPauseGuardian(oldPauseGuardian, newPauseGuardian); } } diff --git a/packages/contracts/contracts/l2/curation/IL2Curation.sol b/packages/contracts/contracts/l2/curation/IL2Curation.sol index c1320c762..3b39ac7a6 100644 --- a/packages/contracts/contracts/l2/curation/IL2Curation.sol +++ b/packages/contracts/contracts/l2/curation/IL2Curation.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Interface of the L2 Curation contract. @@ -8,6 +8,12 @@ pragma solidity ^0.7.6; * @notice Interface for the L2 Curation contract that handles curation on Layer 2 */ interface IL2Curation { + /** + * @notice Set the subgraph service address. + * @param _subgraphService Address of the SubgraphService contract + */ + function setSubgraphService(address _subgraphService) external; + /** * @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 diff --git a/packages/contracts/contracts/l2/curation/L2Curation.sol b/packages/contracts/contracts/l2/curation/L2Curation.sol index 2e58b3cf2..170ef4ff1 100644 --- a/packages/contracts/contracts/l2/curation/L2Curation.sol +++ b/packages/contracts/contracts/l2/curation/L2Curation.sol @@ -12,10 +12,10 @@ import { ClonesUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/Clo import { GraphUpgradeable } from "../../upgrades/GraphUpgradeable.sol"; import { TokenUtils } from "../../utils/TokenUtils.sol"; -import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsManager } from "../../rewards/IRewardsManager.sol"; import { Managed } from "../../governance/Managed.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; -import { CurationV2Storage } from "../../curation/CurationStorage.sol"; +import { IGraphToken } from "../../token/IGraphToken.sol"; +import { CurationV3Storage } from "../../curation/CurationStorage.sol"; import { IGraphCurationToken } from "../../curation/IGraphCurationToken.sol"; import { IL2Curation } from "./IL2Curation.sol"; @@ -32,7 +32,7 @@ import { IL2Curation } from "./IL2Curation.sol"; * Holders can burn GCS using this contract to get GRT tokens back according to the * bonding curve. */ -contract L2Curation is CurationV2Storage, GraphUpgradeable, IL2Curation { +contract L2Curation is CurationV3Storage, GraphUpgradeable, IL2Curation { using SafeMathUpgradeable for uint256; /// @dev 100% in parts per million @@ -83,6 +83,11 @@ contract L2Curation is CurationV2Storage, GraphUpgradeable, IL2Curation { */ event Collected(bytes32 indexed subgraphDeploymentID, uint256 tokens); + /** + * @dev Emitted when the subgraph service is set. + */ + event SubgraphServiceSet(address indexed newSubgraphService); + /** * @dev Modifier for functions that can only be called by the GNS contract */ @@ -148,6 +153,15 @@ contract L2Curation is CurationV2Storage, GraphUpgradeable, IL2Curation { _setCurationTokenMaster(_curationTokenMaster); } + /** + * @notice Set the subgraph service address + * @param _subgraphService Address of the subgraph service contract + */ + function setSubgraphService(address _subgraphService) external override onlyGovernor { + subgraphService = _subgraphService; + emit SubgraphServiceSet(_subgraphService); + } + /** * @notice Assign Graph Tokens collected as curation fees to the curation pool reserve. * @dev This function can only be called by the Staking contract and will do the bookeeping of @@ -156,8 +170,11 @@ contract L2Curation is CurationV2Storage, GraphUpgradeable, IL2Curation { * @param _tokens Amount of Graph Tokens to add to reserves */ function collect(bytes32 _subgraphDeploymentID, uint256 _tokens) external override { - // Only Staking contract is authorized as caller - require(msg.sender == address(staking()), "Caller must be the staking contract"); + // 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" + ); // Must be curated to accept tokens require(isCurated(_subgraphDeploymentID), "Subgraph deployment must be curated to collect fees"); diff --git a/packages/contracts/contracts/l2/discovery/IL2GNS.sol b/packages/contracts/contracts/l2/discovery/IL2GNS.sol index 80a539c83..9b3a26152 100644 --- a/packages/contracts/contracts/l2/discovery/IL2GNS.sol +++ b/packages/contracts/contracts/l2/discovery/IL2GNS.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; diff --git a/packages/contracts/contracts/l2/staking/IL2Staking.sol b/packages/contracts/contracts/l2/staking/IL2Staking.sol index 90d1507e0..522a9ca12 100644 --- a/packages/contracts/contracts/l2/staking/IL2Staking.sol +++ b/packages/contracts/contracts/l2/staking/IL2Staking.sol @@ -5,6 +5,7 @@ pragma abicoder v2; import { IStaking } from "../../staking/IStaking.sol"; import { IL2StakingBase } from "./IL2StakingBase.sol"; +import { IL2StakingTypes } from "./IL2StakingTypes.sol"; /** * @title Interface for the L2 Staking contract @@ -16,28 +17,4 @@ import { IL2StakingBase } from "./IL2StakingBase.sol"; * the custom setup of the Staking contract where part of the functionality is implemented * in a separate contract (StakingExtension) to which calls are delegated through the fallback function. */ -interface IL2Staking is IStaking, IL2StakingBase { - /// @dev Message codes for the L1 -> L2 bridge callhook - enum L1MessageCodes { - RECEIVE_INDEXER_STAKE_CODE, - RECEIVE_DELEGATION_CODE - } - - /** - * @dev Encoded message struct when receiving indexer stake through the bridge - * @param indexer Address of the indexer - */ - struct ReceiveIndexerStakeData { - address indexer; - } - - /** - * @dev Encoded message struct when receiving delegation through the bridge - * @param indexer Address of the indexer - * @param delegator Address of the delegator - */ - struct ReceiveDelegationData { - address indexer; - address delegator; - } -} +interface IL2Staking is IStaking, IL2StakingBase, IL2StakingTypes {} diff --git a/packages/contracts/contracts/l2/staking/IL2StakingBase.sol b/packages/contracts/contracts/l2/staking/IL2StakingBase.sol index 5990db514..7f861db39 100644 --- a/packages/contracts/contracts/l2/staking/IL2StakingBase.sol +++ b/packages/contracts/contracts/l2/staking/IL2StakingBase.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; // TODO: Re-enable and fix issues when publishing a new version // solhint-disable gas-indexed-events diff --git a/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol b/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol new file mode 100644 index 000000000..500694e89 --- /dev/null +++ b/packages/contracts/contracts/l2/staking/IL2StakingTypes.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.7.6 || 0.8.27; + +interface IL2StakingTypes { + /// @dev Message codes for the L1 -> L2 bridge callhook + enum L1MessageCodes { + RECEIVE_INDEXER_STAKE_CODE, + RECEIVE_DELEGATION_CODE + } + + /// @dev Encoded message struct when receiving indexer stake through the bridge + struct ReceiveIndexerStakeData { + address indexer; + } + + /// @dev Encoded message struct when receiving delegation through the bridge + struct ReceiveDelegationData { + address indexer; + address delegator; + } +} diff --git a/packages/contracts/contracts/l2/staking/L2Staking.sol b/packages/contracts/contracts/l2/staking/L2Staking.sol index ea2263ae3..fb3784456 100644 --- a/packages/contracts/contracts/l2/staking/L2Staking.sol +++ b/packages/contracts/contracts/l2/staking/L2Staking.sol @@ -9,8 +9,9 @@ pragma abicoder v2; import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { Staking } from "../../staking/Staking.sol"; import { IL2StakingBase } from "./IL2StakingBase.sol"; -import { IL2Staking } from "./IL2Staking.sol"; 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 @@ -24,7 +25,7 @@ import { ICallhookReceiver } from "../../gateway/ICallhookReceiver.sol"; // Used */ contract L2Staking is Staking, IL2StakingBase { using SafeMath for uint256; - using Stakes for Stakes.Indexer; + using Stakes for IStakes.Indexer; /// @dev Minimum amount of tokens that can be delegated uint256 private constant MINIMUM_DELEGATION = 1e18; @@ -74,16 +75,16 @@ contract L2Staking is Staking, IL2StakingBase { require(_from == counterpartStakingAddress, "ONLY_L1_STAKING_THROUGH_BRIDGE"); (uint8 code, bytes memory functionData) = abi.decode(_data, (uint8, bytes)); - if (code == uint8(IL2Staking.L1MessageCodes.RECEIVE_INDEXER_STAKE_CODE)) { - IL2Staking.ReceiveIndexerStakeData memory indexerData = abi.decode( + if (code == uint8(IL2StakingTypes.L1MessageCodes.RECEIVE_INDEXER_STAKE_CODE)) { + IL2StakingTypes.ReceiveIndexerStakeData memory indexerData = abi.decode( functionData, - (IL2Staking.ReceiveIndexerStakeData) + (IL2StakingTypes.ReceiveIndexerStakeData) ); _receiveIndexerStake(_amount, indexerData); - } else if (code == uint8(IL2Staking.L1MessageCodes.RECEIVE_DELEGATION_CODE)) { - IL2Staking.ReceiveDelegationData memory delegationData = abi.decode( + } else if (code == uint8(IL2StakingTypes.L1MessageCodes.RECEIVE_DELEGATION_CODE)) { + IL2StakingTypes.ReceiveDelegationData memory delegationData = abi.decode( functionData, - (IL2Staking.ReceiveDelegationData) + (IL2StakingTypes.ReceiveDelegationData) ); _receiveDelegation(_amount, delegationData); } else { @@ -98,7 +99,10 @@ contract L2Staking is Staking, IL2StakingBase { * @param _amount Amount of tokens that were transferred * @param _indexerData struct containing the indexer's address */ - function _receiveIndexerStake(uint256 _amount, IL2Staking.ReceiveIndexerStakeData memory _indexerData) internal { + function _receiveIndexerStake( + uint256 _amount, + IL2StakingTypes.ReceiveIndexerStakeData memory _indexerData + ) internal { address _indexer = _indexerData.indexer; // Deposit tokens into the indexer stake __stakes[_indexer].deposit(_amount); @@ -119,7 +123,10 @@ contract L2Staking is Staking, IL2StakingBase { * @param _amount Amount of tokens that were transferred * @param _delegationData struct containing the delegator's address and the indexer's address */ - function _receiveDelegation(uint256 _amount, IL2Staking.ReceiveDelegationData memory _delegationData) internal { + function _receiveDelegation( + uint256 _amount, + IL2StakingTypes.ReceiveDelegationData memory _delegationData + ) internal { // Get the delegation pool of the indexer DelegationPool storage pool = __delegationPools[_delegationData.indexer]; Delegation storage delegation = pool.delegators[_delegationData.delegator]; diff --git a/packages/contracts/contracts/payments/AllocationExchange.sol b/packages/contracts/contracts/payments/AllocationExchange.sol index 200eb4f2b..aa5fe886a 100644 --- a/packages/contracts/contracts/payments/AllocationExchange.sol +++ b/packages/contracts/contracts/payments/AllocationExchange.sol @@ -8,10 +8,9 @@ pragma abicoder v2; 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 "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; /** * @title Allocation Exchange diff --git a/packages/contracts/contracts/rewards/IRewardsManager.sol b/packages/contracts/contracts/rewards/IRewardsManager.sol new file mode 100644 index 000000000..22ac9ebee --- /dev/null +++ b/packages/contracts/contracts/rewards/IRewardsManager.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +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 + * @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; + uint256 accRewardsForSubgraphSnapshot; + uint256 accRewardsPerSignalSnapshot; + uint256 accRewardsPerAllocatedToken; + } + + // -- 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; + + /** + * @notice Set the rewards eligibility oracle address + * @param newRewardsEligibilityOracle The address of the rewards eligibility oracle + */ + function setRewardsEligibilityOracle(address newRewardsEligibilityOracle) 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 _allocationID Allocation + * @return Rewards amount for an allocation + */ + function getRewards(address _rewardsIssuer, address _allocationID) external view returns (uint256); + + 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/contracts/contracts/rewards/RewardsManager.sol b/packages/contracts/contracts/rewards/RewardsManager.sol index e40f0344f..12ae93f9d 100644 --- a/packages/contracts/contracts/rewards/RewardsManager.sol +++ b/packages/contracts/contracts/rewards/RewardsManager.sol @@ -10,14 +10,14 @@ import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { IERC165 } from "@openzeppelin/contracts/introspection/IERC165.sol"; import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; -import { MathUtils } from "../staking/libs/MathUtils.sol"; import { Managed } from "../governance/Managed.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; -import { IStaking, IStakingBase } from "../staking/IStaking.sol"; +import { MathUtils } from "../staking/libs/MathUtils.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; -import { RewardsManagerV5Storage } from "./RewardsManagerStorage.sol"; -import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; +import { RewardsManagerV6Storage } from "./RewardsManagerStorage.sol"; +import { IRewardsManager } from "./IRewardsManager.sol"; +import { IRewardsIssuer } from "./IRewardsIssuer.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol"; /** * @title Rewards Manager Contract @@ -39,7 +39,7 @@ import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligi * 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 { +contract RewardsManager is RewardsManagerV6Storage, GraphUpgradeable, IRewardsManager { using SafeMath for uint256; /// @dev Fixed point scaling factor used for decimals in reward calculations @@ -48,21 +48,20 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa // -- Events -- /** - * @notice 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 epoch Epoch when the rewards were assigned * @param amount Amount of rewards assigned */ - event RewardsAssigned(address indexed indexer, address indexed allocationID, uint256 epoch, uint256 amount); + event HorizonRewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount); /** * @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 - * @param epoch Epoch when the rewards were denied */ - event RewardsDenied(address indexed indexer, address indexed allocationID, uint256 epoch); + event RewardsDenied(address indexed indexer, address indexed allocationID); /** * @notice Emitted when rewards are denied to an indexer due to eligibility @@ -79,6 +78,11 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa */ event RewardsDenylistUpdated(bytes32 indexed subgraphDeploymentID, uint256 sinceBlock); + /** + * @dev Emitted when the subgraph service is set + */ + event SubgraphServiceSet(address indexed oldSubgraphService, address indexed newSubgraphService); + /** * @notice Emitted when the rewards eligibility oracle contract is set * @param oldRewardsEligibilityOracle Previous rewards eligibility oracle address @@ -144,6 +148,7 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa /** * @inheritdoc IRewardsManager * @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 override { // Caller can be the SAO or the governor @@ -155,6 +160,15 @@ 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); + emit SubgraphServiceSet(oldSubgraphService, _subgraphService); + } + /** * @inheritdoc IRewardsManager * @dev Note that the rewards eligibility oracle can be set to the zero address to disable use of an oracle, in @@ -329,16 +343,41 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa } /// @inheritdoc IRewardsManager - function getRewards(address _allocationID) external view override returns (uint256) { - IStaking.AllocationState allocState = staking().getAllocationState(_allocationID); - if (allocState != IStakingBase.AllocationState.Active) { + function getRewards(address _rewardsIssuer, address _allocationID) external view override returns (uint256) { + require( + _rewardsIssuer == address(staking()) || _rewardsIssuer == address(subgraphService), + "Not a rewards issuer" + ); + + ( + bool isActive, + , + bytes32 subgraphDeploymentId, + uint256 tokens, + uint256 alloAccRewardsPerAllocatedToken, + uint256 accRewardsPending + ) = IRewardsIssuer(_rewardsIssuer).getAllocationData(_allocationID); + + if (!isActive) { return 0; } - IStaking.Allocation memory alloc = staking().getAllocation(_allocationID); + (uint256 accRewardsPerAllocatedToken, ) = getAccRewardsPerAllocatedToken(subgraphDeploymentId); + return + accRewardsPending.add(_calcRewards(tokens, alloAccRewardsPerAllocatedToken, accRewardsPerAllocatedToken)); + } - (uint256 accRewardsPerAllocatedToken, ) = getAccRewardsPerAllocatedToken(alloc.subgraphDeploymentID); - return _calcRewards(alloc.tokens, alloc.accRewardsPerAllocatedToken, accRewardsPerAllocatedToken); + /** + * @dev Calculate rewards for a given accumulated rewards per allocated token. + * @param _tokens Tokens allocated + * @param _accRewardsPerAllocatedToken Allocation accumulated rewards per token + * @return Rewards amount + */ + function calcRewards( + uint256 _tokens, + uint256 _accRewardsPerAllocatedToken + ) external pure override returns (uint256) { + return _accRewardsPerAllocatedToken.mul(_tokens).div(FIXED_POINT_SCALING_FACTOR); } /** @@ -363,36 +402,51 @@ contract RewardsManager is RewardsManagerV5Storage, GraphUpgradeable, IRewardsMa * This function will mint the necessary tokens to reward based on the inflation calculation. */ function takeRewards(address _allocationID) external override returns (uint256) { - // Only Staking contract is authorized as caller - IStaking staking = staking(); - require(msg.sender == address(staking), "Caller must be the staking contract"); + address rewardsIssuer = msg.sender; + require( + rewardsIssuer == address(staking()) || rewardsIssuer == address(subgraphService), + "Caller must be a rewards issuer" + ); + + ( + bool isActive, + address indexer, + bytes32 subgraphDeploymentID, + uint256 tokens, + uint256 accRewardsPerAllocatedToken, + uint256 accRewardsPending + ) = IRewardsIssuer(rewardsIssuer).getAllocationData(_allocationID); - IStaking.Allocation memory alloc = staking.getAllocation(_allocationID); - uint256 accRewardsPerAllocatedToken = onSubgraphAllocationUpdate(alloc.subgraphDeploymentID); + uint256 updatedAccRewardsPerAllocatedToken = onSubgraphAllocationUpdate(subgraphDeploymentID); // Do not do rewards on denied subgraph deployments ID - if (isDenied(alloc.subgraphDeploymentID)) { - emit RewardsDenied(alloc.indexer, _allocationID, alloc.closedAtEpoch); + if (isDenied(subgraphDeploymentID)) { + emit RewardsDenied(indexer, _allocationID); return 0; } - // Calculate rewards accrued by this allocation - uint256 rewards = _calcRewards(alloc.tokens, alloc.accRewardsPerAllocatedToken, accRewardsPerAllocatedToken); - // Do not reward if indexer is not eligible based on rewards eligibility - if (address(rewardsEligibilityOracle) != address(0) && !rewardsEligibilityOracle.isEligible(alloc.indexer)) { - emit RewardsDeniedDueToEligibility(alloc.indexer, _allocationID, rewards); - return 0; - } + uint256 rewards = 0; + if (isActive) { + // Calculate rewards accrued by this allocation + rewards = accRewardsPending.add( + _calcRewards(tokens, accRewardsPerAllocatedToken, updatedAccRewardsPerAllocatedToken) + ); - if (rewards > 0) { - // Mint directly to staking contract for the reward amount - // The staking contract will do bookkeeping of the reward and - // assign in proportion to each stakeholder incentive - graphToken().mint(address(staking), rewards); + // Do not reward if indexer is not eligible based on rewards eligibility + if (address(rewardsEligibilityOracle) != address(0) && !rewardsEligibilityOracle.isEligible(indexer)) { + emit RewardsDeniedDueToEligibility(indexer, _allocationID, rewards); + return 0; + } + if (rewards > 0) { + // Mint directly to rewards issuer for the reward amount + // The rewards issuer contract will do bookkeeping of the reward and + // assign in proportion to each stakeholder incentive + graphToken().mint(rewardsIssuer, rewards); + } } - emit RewardsAssigned(alloc.indexer, _allocationID, alloc.closedAtEpoch, rewards); + emit HorizonRewardsAssigned(indexer, _allocationID, rewards); return rewards; } diff --git a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol index 35f45ff91..dc31fe3aa 100644 --- a/packages/contracts/contracts/rewards/RewardsManagerStorage.sol +++ b/packages/contracts/contracts/rewards/RewardsManagerStorage.sol @@ -2,11 +2,13 @@ /* solhint-disable one-contract-per-file */ -pragma solidity 0.7.6; +pragma solidity ^0.7.6 || 0.8.27; -import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsManager } from "./IRewardsManager.sol"; import { IRewardsIssuer } from "./IRewardsIssuer.sol"; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol"; +import { IRewardsIssuer } from "./IRewardsIssuer.sol"; +import { IRewardsManager } from "./IRewardsManager.sol"; import { Managed } from "../governance/Managed.sol"; /** @@ -72,6 +74,9 @@ contract RewardsManagerV4Storage is RewardsManagerV3Storage { contract RewardsManagerV5Storage is RewardsManagerV4Storage { /// @notice Address of the subgraph service IRewardsIssuer public subgraphService; +} + +contract RewardsManagerV6Storage is RewardsManagerV5Storage { /// @notice Address of the rewards eligibility oracle contract IRewardsEligibilityOracle public rewardsEligibilityOracle; } diff --git a/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol b/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol index 824113482..59f3a6d08 100644 --- a/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol +++ b/packages/contracts/contracts/rewards/SubgraphAvailabilityManager.sol @@ -6,7 +6,7 @@ pragma solidity ^0.7.6; // solhint-disable gas-increment-by-one, gas-indexed-events, gas-small-strings, gas-strict-inequalities import { Governed } from "../governance/Governed.sol"; -import { IRewardsManager } from "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsManager } from "./IRewardsManager.sol"; /** * @title Subgraph Availability Manager diff --git a/packages/contracts/contracts/staking/IStaking.sol b/packages/contracts/contracts/staking/IStaking.sol index 83b7f9cc1..16c1db02d 100644 --- a/packages/contracts/contracts/staking/IStaking.sol +++ b/packages/contracts/contracts/staking/IStaking.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.6.12 <0.8.0; +pragma solidity >=0.6.12 <0.8.0 || 0.8.27; pragma abicoder v2; import { IStakingBase } from "./IStakingBase.sol"; diff --git a/packages/contracts/contracts/staking/IStakingBase.sol b/packages/contracts/contracts/staking/IStakingBase.sol index 3c8ec7c0e..59dc0b5ea 100644 --- a/packages/contracts/contracts/staking/IStakingBase.sol +++ b/packages/contracts/contracts/staking/IStakingBase.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.6.12 <0.8.0; +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 @@ -405,6 +405,22 @@ 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 + * @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. + */ + 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 + * @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. + */ + function isActiveAllocation(address _allocationID) external view returns (bool); + /** * @notice Return the current state of an allocation * @param _allocationID Allocation identifier diff --git a/packages/contracts/contracts/staking/IStakingData.sol b/packages/contracts/contracts/staking/IStakingData.sol index 031abd3dc..edac435c7 100644 --- a/packages/contracts/contracts/staking/IStakingData.sol +++ b/packages/contracts/contracts/staking/IStakingData.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.6.12 <0.8.0; +pragma solidity >=0.6.12 <0.8.0 || 0.8.27; /** * @title Staking Data interface diff --git a/packages/contracts/contracts/staking/IStakingExtension.sol b/packages/contracts/contracts/staking/IStakingExtension.sol index 5a3cb48ad..3053e7acf 100644 --- a/packages/contracts/contracts/staking/IStakingExtension.sol +++ b/packages/contracts/contracts/staking/IStakingExtension.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity >=0.6.12 <0.8.0; +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 { Stakes } from "./libs/Stakes.sol"; +import { IStakes } from "./libs/IStakes.sol"; /** * @title Interface for the StakingExtension contract @@ -306,11 +306,11 @@ interface IStakingExtension is IStakingData { /** * @notice Getter for stakes[_indexer]: - * gets the stake information for an indexer as a Stakes.Indexer struct. + * gets the stake information for an indexer as a IStakes.Indexer struct. * @param _indexer Indexer address for which to query the stake information - * @return Stake information for the specified indexer, as a Stakes.Indexer struct + * @return Stake information for the specified indexer, as a IStakes.Indexer struct */ - function stakes(address _indexer) external view returns (Stakes.Indexer memory); + function stakes(address _indexer) external view returns (IStakes.Indexer memory); /** * @notice Getter for allocations[_allocationID]: diff --git a/packages/contracts/contracts/staking/L1Staking.sol b/packages/contracts/contracts/staking/L1Staking.sol index c3c235022..2ffc3b62a 100644 --- a/packages/contracts/contracts/staking/L1Staking.sol +++ b/packages/contracts/contracts/staking/L1Staking.sol @@ -11,13 +11,14 @@ import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { ITokenGateway } from "../arbitrum/ITokenGateway.sol"; import { Staking } from "./Staking.sol"; import { Stakes } from "./libs/Stakes.sol"; +import { IStakes } from "./libs/IStakes.sol"; import { IStakingData } from "./IStakingData.sol"; -import { IL2Staking } from "../l2/staking/IL2Staking.sol"; import { L1StakingV1Storage } from "./L1StakingStorage.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; import { IL1StakingBase } from "./IL1StakingBase.sol"; import { MathUtils } from "./libs/MathUtils.sol"; import { IL1GraphTokenLockTransferTool } from "./IL1GraphTokenLockTransferTool.sol"; +import { IL2StakingTypes } from "../l2/staking/IL2StakingTypes.sol"; /** * @title L1Staking contract @@ -26,7 +27,7 @@ import { IL1GraphTokenLockTransferTool } from "./IL1GraphTokenLockTransferTool.s * to send an indexer's stake to L2, and to send delegation to L2 as well. */ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { - using Stakes for Stakes.Indexer; + using Stakes for IStakes.Indexer; using SafeMath for uint256; /** @@ -172,7 +173,7 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { uint256 _maxSubmissionCost, uint256 _ethAmount ) internal { - Stakes.Indexer storage indexerStake = __stakes[_indexer]; + IStakes.Indexer storage indexerStake = __stakes[_indexer]; require(indexerStake.tokensStaked != 0, "tokensStaked == 0"); // Indexers shouldn't be trying to withdraw tokens before transferring to L2. // Allowing this would complicate our accounting so we require that they have no @@ -208,11 +209,11 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { ); } - IL2Staking.ReceiveIndexerStakeData memory functionData; + IL2StakingTypes.ReceiveIndexerStakeData memory functionData; functionData.indexer = _l2Beneficiary; bytes memory extraData = abi.encode( - uint8(IL2Staking.L1MessageCodes.RECEIVE_INDEXER_STAKE_CODE), + uint8(IL2StakingTypes.L1MessageCodes.RECEIVE_INDEXER_STAKE_CODE), abi.encode(functionData) ); @@ -266,10 +267,13 @@ contract L1Staking is Staking, L1StakingV1Storage, IL1StakingBase { delegation.shares = 0; bytes memory extraData; { - IL2Staking.ReceiveDelegationData memory functionData; + IL2StakingTypes.ReceiveDelegationData memory functionData; functionData.indexer = indexerTransferredToL2[_indexer]; functionData.delegator = _l2Beneficiary; - extraData = abi.encode(uint8(IL2Staking.L1MessageCodes.RECEIVE_DELEGATION_CODE), abi.encode(functionData)); + extraData = abi.encode( + uint8(IL2StakingTypes.L1MessageCodes.RECEIVE_DELEGATION_CODE), + abi.encode(functionData) + ); } _sendTokensAndMessageToL2Staking( diff --git a/packages/contracts/contracts/staking/Staking.sol b/packages/contracts/contracts/staking/Staking.sol index c3e859ef7..c20a4f90e 100644 --- a/packages/contracts/contracts/staking/Staking.sol +++ b/packages/contracts/contracts/staking/Staking.sol @@ -12,14 +12,15 @@ import { ECDSA } from "@openzeppelin/contracts/cryptography/ECDSA.sol"; import { Multicall } from "../base/Multicall.sol"; import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; import { TokenUtils } from "../utils/TokenUtils.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; import { IStakingBase } from "./IStakingBase.sol"; import { StakingV4Storage } from "./StakingStorage.sol"; import { MathUtils } from "./libs/MathUtils.sol"; 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 "@graphprotocol/common/contracts/rewards/IRewardsManager.sol"; +import { IRewardsManager } from "../rewards/IRewardsManager.sol"; import { StakingExtension } from "./StakingExtension.sol"; import { LibExponential } from "./libs/Exponential.sol"; @@ -36,7 +37,7 @@ import { LibExponential } from "./libs/Exponential.sol"; */ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, Multicall { using SafeMath for uint256; - using Stakes for Stakes.Indexer; + using Stakes for IStakes.Indexer; /// @dev 100% in parts per million uint32 internal constant MAX_PPM = 1000000; @@ -222,7 +223,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M */ function unstake(uint256 _tokens) external override notPartialPaused { address indexer = msg.sender; - Stakes.Indexer storage indexerStake = __stakes[indexer]; + IStakes.Indexer storage indexerStake = __stakes[indexer]; require(indexerStake.tokensStaked > 0, "!stake"); @@ -425,6 +426,36 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M 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. + */ + function getAllocationData( + address _allocationID + ) external view override returns (bool, address, bytes32, uint256, uint256, uint256) { + Allocation memory alloc = __allocations[_allocationID]; + bool isActive = _getAllocationState(_allocationID) == AllocationState.Active; + + return ( + isActive, + alloc.indexer, + alloc.subgraphDeploymentID, + alloc.tokens, + alloc.accRewardsPerAllocatedToken, + 0 + ); + } + + /** + * @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. + */ + function isActiveAllocation(address _allocationID) external view override returns (bool) { + return _getAllocationState(_allocationID) == AllocationState.Active; + } + /** * @inheritdoc IStakingBase */ @@ -474,7 +505,7 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M * @inheritdoc IStakingBase */ function getIndexerCapacity(address _indexer) public view override returns (uint256) { - Stakes.Indexer memory indexerStake = __stakes[_indexer]; + IStakes.Indexer storage indexerStake = __stakes[_indexer]; uint256 tokensDelegated = __delegationPools[_indexer].tokens; uint256 tokensDelegatedCap = indexerStake.tokensSecureStake().mul(uint256(__delegationRatio)); @@ -725,9 +756,6 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M require(isIndexerOrOperator, "!auth"); } - // Close the allocation - __allocations[_allocationID].closedAtEpoch = alloc.closedAtEpoch; - // -- Rewards Distribution -- // Process non-zero-allocation rewards tracking @@ -751,6 +779,11 @@ abstract contract Staking is StakingV4Storage, GraphUpgradeable, IStakingBase, M ); } + // Close the allocation + // Note that this breaks CEI pattern. We update after the rewards distribution logic as it expects the allocation + // to still be active. There shouldn't be reentrancy risk here as all internal calls are to trusted contracts. + __allocations[_allocationID].closedAtEpoch = alloc.closedAtEpoch; + emit AllocationClosed( alloc.indexer, alloc.subgraphDeploymentID, diff --git a/packages/contracts/contracts/staking/StakingExtension.sol b/packages/contracts/contracts/staking/StakingExtension.sol index b035a720f..fb8dea3e8 100644 --- a/packages/contracts/contracts/staking/StakingExtension.sol +++ b/packages/contracts/contracts/staking/StakingExtension.sol @@ -10,8 +10,9 @@ import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; import { StakingV4Storage } from "./StakingStorage.sol"; import { IStakingExtension } from "./IStakingExtension.sol"; import { TokenUtils } from "../utils/TokenUtils.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; import { GraphUpgradeable } from "../upgrades/GraphUpgradeable.sol"; +import { IStakes } from "./libs/IStakes.sol"; import { Stakes } from "./libs/Stakes.sol"; import { IStakingData } from "./IStakingData.sol"; import { MathUtils } from "./libs/MathUtils.sol"; @@ -26,7 +27,7 @@ import { MathUtils } from "./libs/MathUtils.sol"; */ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtension { using SafeMath for uint256; - using Stakes for Stakes.Indexer; + using Stakes for IStakes.Indexer; /// @dev 100% in parts per million uint32 private constant MAX_PPM = 1000000; @@ -129,7 +130,7 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi uint256 _reward, address _beneficiary ) external override onlySlasher notPartialPaused { - Stakes.Indexer storage indexerStake = __stakes[_indexer]; + IStakes.Indexer storage indexerStake = __stakes[_indexer]; // Only able to slash a non-zero number of tokens require(_tokens > 0, "!tokens"); @@ -304,9 +305,13 @@ contract StakingExtension is StakingV4Storage, GraphUpgradeable, IStakingExtensi } /** + * @notice Getter for stakes[_indexer]: + * 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 (Stakes.Indexer memory) { + function stakes(address _indexer) external view override returns (IStakes.Indexer memory) { return __stakes[_indexer]; } diff --git a/packages/contracts/contracts/staking/StakingStorage.sol b/packages/contracts/contracts/staking/StakingStorage.sol index dba4dab2e..6746ae6cb 100644 --- a/packages/contracts/contracts/staking/StakingStorage.sol +++ b/packages/contracts/contracts/staking/StakingStorage.sol @@ -9,7 +9,7 @@ pragma solidity ^0.7.6; import { Managed } from "../governance/Managed.sol"; import { IStakingData } from "./IStakingData.sol"; -import { Stakes } from "./libs/Stakes.sol"; +import { IStakes } from "./libs/IStakes.sol"; /** * @title StakingV1Storage @@ -50,7 +50,7 @@ contract StakingV1Storage is Managed { uint32 internal __alphaDenominator; /// @dev Indexer stakes : indexer => Stake - mapping(address => Stakes.Indexer) internal __stakes; + mapping(address => IStakes.Indexer) internal __stakes; /// @dev Allocations : allocationID => Allocation mapping(address => IStakingData.Allocation) internal __allocations; diff --git a/packages/contracts/contracts/staking/libs/IStakes.sol b/packages/contracts/contracts/staking/libs/IStakes.sol new file mode 100644 index 000000000..701336409 --- /dev/null +++ b/packages/contracts/contracts/staking/libs/IStakes.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.7.6 || 0.8.27; +pragma abicoder v2; + +interface IStakes { + struct Indexer { + uint256 tokensStaked; // Tokens on the indexer stake (staked by the indexer) + uint256 tokensAllocated; // Tokens used in allocations + uint256 tokensLocked; // Tokens locked for withdrawal subject to thawing period + uint256 tokensLockedUntil; // Block when locked tokens can be withdrawn + } +} diff --git a/packages/contracts/contracts/staking/libs/Stakes.sol b/packages/contracts/contracts/staking/libs/Stakes.sol index d861e23e5..abe261c71 100644 --- a/packages/contracts/contracts/staking/libs/Stakes.sol +++ b/packages/contracts/contracts/staking/libs/Stakes.sol @@ -6,6 +6,7 @@ pragma abicoder v2; import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.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. @@ -16,7 +17,7 @@ import { MathUtils } from "./MathUtils.sol"; */ library Stakes { using SafeMath for uint256; - using Stakes for Stakes.Indexer; + using Stakes for IStakes.Indexer; /** * @dev Indexer stake data structure @@ -37,7 +38,7 @@ library Stakes { * @param stake Stake data * @param _tokens Amount of tokens to deposit */ - function deposit(Stakes.Indexer storage stake, uint256 _tokens) internal { + function deposit(IStakes.Indexer storage stake, uint256 _tokens) internal { stake.tokensStaked = stake.tokensStaked.add(_tokens); } @@ -46,7 +47,7 @@ library Stakes { * @param stake Stake data * @param _tokens Amount of tokens to release */ - function release(Stakes.Indexer storage stake, uint256 _tokens) internal { + function release(IStakes.Indexer storage stake, uint256 _tokens) internal { stake.tokensStaked = stake.tokensStaked.sub(_tokens); } @@ -55,7 +56,7 @@ library Stakes { * @param stake Stake data * @param _tokens Amount of tokens to allocate */ - function allocate(Stakes.Indexer storage stake, uint256 _tokens) internal { + function allocate(IStakes.Indexer storage stake, uint256 _tokens) internal { stake.tokensAllocated = stake.tokensAllocated.add(_tokens); } @@ -64,7 +65,7 @@ library Stakes { * @param stake Stake data * @param _tokens Amount of tokens to unallocate */ - function unallocate(Stakes.Indexer storage stake, uint256 _tokens) internal { + function unallocate(IStakes.Indexer storage stake, uint256 _tokens) internal { stake.tokensAllocated = stake.tokensAllocated.sub(_tokens); } @@ -74,7 +75,7 @@ library Stakes { * @param _tokens Amount of tokens to unstake * @param _period Period in blocks that need to pass before withdrawal */ - function lockTokens(Stakes.Indexer storage stake, uint256 _tokens, uint256 _period) internal { + function lockTokens(IStakes.Indexer storage stake, uint256 _tokens, uint256 _period) internal { // Take into account period averaging for multiple unstake requests uint256 lockingPeriod = _period; if (stake.tokensLocked > 0) { @@ -96,7 +97,7 @@ library Stakes { * @param stake Stake data * @param _tokens Amount of tokens to unlock */ - function unlockTokens(Stakes.Indexer storage stake, uint256 _tokens) internal { + function unlockTokens(IStakes.Indexer storage stake, uint256 _tokens) internal { stake.tokensLocked = stake.tokensLocked.sub(_tokens); if (stake.tokensLocked == 0) { stake.tokensLockedUntil = 0; @@ -108,7 +109,7 @@ library Stakes { * @param stake Stake data * @return Amount of tokens being withdrawn */ - function withdrawTokens(Stakes.Indexer storage stake) internal returns (uint256) { + function withdrawTokens(IStakes.Indexer storage stake) internal returns (uint256) { // Calculate tokens that can be released uint256 tokensToWithdraw = stake.tokensWithdrawable(); @@ -128,7 +129,7 @@ library Stakes { * @param stake Stake data * @return Token amount */ - function tokensUsed(Stakes.Indexer memory stake) internal pure returns (uint256) { + function tokensUsed(IStakes.Indexer storage stake) internal view returns (uint256) { return stake.tokensAllocated.add(stake.tokensLocked); } @@ -139,7 +140,7 @@ library Stakes { * @param stake Stake data * @return Token amount */ - function tokensSecureStake(Stakes.Indexer memory stake) internal pure returns (uint256) { + function tokensSecureStake(IStakes.Indexer storage stake) internal view returns (uint256) { return stake.tokensStaked.sub(stake.tokensLocked); } @@ -151,7 +152,7 @@ library Stakes { * @param stake Stake data * @return Token amount */ - function tokensAvailable(Stakes.Indexer memory stake) internal pure returns (uint256) { + function tokensAvailable(IStakes.Indexer storage stake) internal view returns (uint256) { return stake.tokensAvailableWithDelegation(0); } @@ -164,9 +165,9 @@ library Stakes { * @return Token amount */ function tokensAvailableWithDelegation( - Stakes.Indexer memory stake, + IStakes.Indexer storage stake, uint256 _delegatedCapacity - ) internal pure returns (uint256) { + ) internal view returns (uint256) { uint256 tokensCapacity = stake.tokensStaked.add(_delegatedCapacity); uint256 _tokensUsed = stake.tokensUsed(); // If more tokens are used than the current capacity, the indexer is overallocated. @@ -190,7 +191,7 @@ library Stakes { * @param stake Stake data * @return Token amount */ - function tokensWithdrawable(Stakes.Indexer memory stake) internal view returns (uint256) { + function tokensWithdrawable(IStakes.Indexer storage stake) internal view returns (uint256) { // No tokens to withdraw before locking period if (stake.tokensLockedUntil == 0 || block.number < stake.tokensLockedUntil) { return 0; diff --git a/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol b/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol index 0ef881811..408883a61 100644 --- a/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol +++ b/packages/contracts/contracts/tests/MockRewardsEligibilityOracle.sol @@ -2,7 +2,7 @@ pragma solidity 0.7.6; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol"; import { ERC165 } from "@openzeppelin/contracts/introspection/ERC165.sol"; /** diff --git a/packages/contracts/contracts/token/IGraphToken.sol b/packages/contracts/contracts/token/IGraphToken.sol new file mode 100644 index 000000000..df3b7643f --- /dev/null +++ b/packages/contracts/contracts/token/IGraphToken.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.7.6 || 0.8.27; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +interface IGraphToken is IERC20 { + // -- Mint and Burn -- + + function burn(uint256 amount) external; + + function burnFrom(address _from, uint256 amount) external; + + function mint(address _to, uint256 _amount) external; + + // -- Mint Admin -- + + function addMinter(address _account) external; + + function removeMinter(address _account) external; + + function renounceMinter() external; + + function isMinter(address _account) external view returns (bool); + + // -- Permit -- + + function permit( + address _owner, + address _spender, + uint256 _value, + uint256 _deadline, + uint8 _v, + bytes32 _r, + bytes32 _s + ) external; + + // -- Allowance -- + + function increaseAllowance(address spender, uint256 addedValue) external returns (bool); + + 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 1152da9e2..733e3c0be 100644 --- a/packages/contracts/contracts/upgrades/GraphProxy.sol +++ b/packages/contracts/contracts/upgrades/GraphProxy.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; - -import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +pragma solidity ^0.7.6 || 0.8.27; // TODO: Re-enable and fix issues when publishing a new version // solhint-disable gas-small-strings @@ -156,7 +154,6 @@ contract GraphProxy is GraphProxyStorage, IGraphProxy { */ function _acceptUpgrade() internal { address _pendingImplementation = _getPendingImplementation(); - require(Address.isContract(_pendingImplementation), "Impl must be a contract"); require(_pendingImplementation != address(0), "Impl cannot be zero address"); require(msg.sender == _pendingImplementation, "Only pending implementation"); diff --git a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol index b1b29a4a9..83550a3e5 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyAdmin.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 diff --git a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol index c6c3229a2..828af8e23 100644 --- a/packages/contracts/contracts/upgrades/GraphProxyStorage.sol +++ b/packages/contracts/contracts/upgrades/GraphProxyStorage.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 diff --git a/packages/contracts/contracts/upgrades/GraphUpgradeable.sol b/packages/contracts/contracts/upgrades/GraphUpgradeable.sol index 0b16f9003..ada2b04fd 100644 --- a/packages/contracts/contracts/upgrades/GraphUpgradeable.sol +++ b/packages/contracts/contracts/upgrades/GraphUpgradeable.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 diff --git a/packages/contracts/contracts/upgrades/IGraphProxy.sol b/packages/contracts/contracts/upgrades/IGraphProxy.sol index b903a5867..a3f2fdd8e 100644 --- a/packages/contracts/contracts/upgrades/IGraphProxy.sol +++ b/packages/contracts/contracts/upgrades/IGraphProxy.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6 || ^0.8.0; +pragma solidity ^0.7.6 || 0.8.27; /** * @title Graph Proxy Interface diff --git a/packages/contracts/contracts/utils/TokenUtils.sol b/packages/contracts/contracts/utils/TokenUtils.sol index 73d5c0b8d..50ad277b4 100644 --- a/packages/contracts/contracts/utils/TokenUtils.sol +++ b/packages/contracts/contracts/utils/TokenUtils.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later -pragma solidity ^0.7.6; +pragma solidity ^0.7.6 || 0.8.27; /* solhint-disable gas-custom-errors */ // Cannot use custom errors with 0.7.6 -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "../token/IGraphToken.sol"; /** * @title TokenUtils library diff --git a/packages/contracts/package.json b/packages/contracts/package.json index dd6e9e8e5..ed460cc19 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/contracts", - "version": "7.1.2", + "version": "7.3.0", "publishConfig": { "access": "public" }, @@ -34,8 +34,8 @@ "index.d.ts" ], "scripts": { - "prepack": "scripts/build", - "clean": "rm -rf artifacts/ cache/ types/ abis/", + "prepack": "pnpm build", + "clean": "rm -rf artifacts/ cache/ types/ abis/ build/ dist/ contracts/hardhat-dependency-compiler/", "build": "pnpm build:self", "build:self": "pnpm compile", "compile": "hardhat compile", @@ -63,8 +63,8 @@ "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/providers": "^5.8.0", - "@graphprotocol/common": "workspace:^", "@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", diff --git a/packages/contracts/task/CHANGELOG.md b/packages/contracts/task/CHANGELOG.md new file mode 100644 index 000000000..715d4a8a8 --- /dev/null +++ b/packages/contracts/task/CHANGELOG.md @@ -0,0 +1,24 @@ +# @graphprotocol/contracts-task + +## 1.0.3 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.3.0 + +## 1.0.2 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.2.1 + - @graphprotocol/sdk@0.6.2 + +## 1.0.1 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.2.0 + - @graphprotocol/sdk@0.6.1 diff --git a/packages/contracts/task/package.json b/packages/contracts/task/package.json index 09ec96e3c..138d73daf 100644 --- a/packages/contracts/task/package.json +++ b/packages/contracts/task/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/contracts-task", - "version": "1.0.0", + "version": "1.0.3", "private": true, "description": "Task utilities for @graphprotocol/contracts", "main": "src/index.ts", @@ -13,7 +13,7 @@ }, "dependencies": { "@graphprotocol/contracts": "workspace:^", - "@graphprotocol/sdk": "workspace:^", + "@graphprotocol/sdk": "0.6.0", "axios": "^1.9.0", "console-table-printer": "^2.14.1" }, @@ -24,7 +24,6 @@ "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/providers": "^5.8.0", - "@graphprotocol/common": "workspace:^", "@graphprotocol/common-ts": "^1.8.3", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomiclabs/hardhat-ethers": "^2.2.3", @@ -62,7 +61,7 @@ }, "scripts": { "build": "tsc --build", - "clean": "rm -rf build", + "clean": "rm -rf build types", "deploy": "hardhat migrate", "deploy-localhost": "hardhat migrate --force --skip-confirmation --disable-secure-accounts --network localhost --graph-config config/graph.localhost.yml --address-book addresses-local.json", "verify": "hardhat verify", diff --git a/packages/contracts/test/CHANGELOG.md b/packages/contracts/test/CHANGELOG.md new file mode 100644 index 000000000..80966da99 --- /dev/null +++ b/packages/contracts/test/CHANGELOG.md @@ -0,0 +1,24 @@ +# @graphprotocol/contracts-tests + +## 1.0.3 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.3.0 + +## 1.0.2 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.2.1 + - @graphprotocol/sdk@0.6.2 + +## 1.0.1 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.2.0 + - @graphprotocol/sdk@0.6.1 diff --git a/packages/contracts/test/hardhat.config.ts b/packages/contracts/test/hardhat.config.ts index 4d545e191..50436de00 100644 --- a/packages/contracts/test/hardhat.config.ts +++ b/packages/contracts/test/hardhat.config.ts @@ -1,4 +1,5 @@ // Test-focused Hardhat configuration +import '@graphprotocol/sdk/gre' import '@nomiclabs/hardhat-ethers' import '@nomiclabs/hardhat-waffle' import '@typechain/hardhat' diff --git a/packages/contracts/test/package.json b/packages/contracts/test/package.json index dd0948f31..fead77325 100644 --- a/packages/contracts/test/package.json +++ b/packages/contracts/test/package.json @@ -1,11 +1,11 @@ { "name": "@graphprotocol/contracts-tests", - "version": "1.0.0", + "version": "1.0.3", "private": true, "description": "Tests for @graphprotocol/contracts", "dependencies": { "@graphprotocol/contracts": "workspace:^", - "@graphprotocol/sdk": "workspace:^" + "@graphprotocol/sdk": "0.6.0" }, "devDependencies": { "@arbitrum/sdk": "~3.1.13", @@ -15,7 +15,6 @@ "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/providers": "^5.8.0", - "@graphprotocol/common": "workspace:^", "@graphprotocol/common-ts": "^1.8.3", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomiclabs/hardhat-ethers": "^2.2.3", @@ -58,6 +57,7 @@ }, "scripts": { "postinstall": "scripts/setup-symlinks", + "clean": "rm -rf artifacts/ cache/ reports/ types/", "build": "pnpm build:dep", "build:dep": "pnpm --filter @graphprotocol/contracts --filter @graphprotocol/sdk build", "test": "pnpm test:self", diff --git a/packages/contracts/test/scripts/test b/packages/contracts/test/scripts/test index b7862ae0a..1d9983bdb 100755 --- a/packages/contracts/test/scripts/test +++ b/packages/contracts/test/scripts/test @@ -7,7 +7,7 @@ source $(pwd)/scripts/evm # Ensure we compiled sources and dependencies -pnpm --filter @graphprotocol/contracts --filter @graphprotocol/sdk build +pnpm --filter @graphprotocol/contracts build ### Cleanup function cleanup() { @@ -29,6 +29,10 @@ fi # Init address book echo {} > ../addresses-local.json +# TODO: fix this! For some reason the resolved package does not have a few required files +echo {} > ../../../node_modules/.pnpm/@graphprotocol+contracts@7.2.1/node_modules/@graphprotocol/contracts/addresses-local.json +cp -r ../config ../../../node_modules/.pnpm/@graphprotocol+contracts@7.2.1/node_modules/@graphprotocol/contracts/config + mkdir -p reports # Run using the standalone evm instance diff --git a/packages/contracts/test/tests/unit/l2/l2Curation.test.ts b/packages/contracts/test/tests/unit/l2/l2Curation.test.ts index 2774fc444..6ee8a5cd3 100644 --- a/packages/contracts/test/tests/unit/l2/l2Curation.test.ts +++ b/packages/contracts/test/tests/unit/l2/l2Curation.test.ts @@ -529,7 +529,7 @@ describe('L2Curation', () => { it('reject collect tokens distributed from invalid address', async function () { const tx = curation.connect(me).collect(subgraphDeploymentID, tokensToCollect) - await expect(tx).revertedWith('Caller must be the staking contract') + await expect(tx).revertedWith('Caller must be the subgraph service or staking contract') }) it('should collect tokens distributed to the curation pool', async function () { diff --git a/packages/contracts/test/tests/unit/rewards/rewards.test.ts b/packages/contracts/test/tests/unit/rewards/rewards.test.ts index 0e590e761..a8110b850 100644 --- a/packages/contracts/test/tests/unit/rewards/rewards.test.ts +++ b/packages/contracts/test/tests/unit/rewards/rewards.test.ts @@ -534,7 +534,7 @@ describe('Rewards', () => { await helpers.mine(ISSUANCE_RATE_PERIODS) // Rewards - const contractRewards = await rewardsManager.getRewards(allocationID1) + const contractRewards = await rewardsManager.getRewards(staking.address, allocationID1) // We trust using this function in the test because we tested it // standalone in a previous test @@ -570,12 +570,12 @@ describe('Rewards', () => { await staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) // Rewards - const contractRewards = await rewardsManager.getRewards(allocationID1) + const contractRewards = await rewardsManager.getRewards(staking.address, allocationID1) expect(contractRewards).eq(BigNumber.from(0)) }) it('rewards should be zero if the allocation does not exist', async function () { // Rewards - const contractRewards = await rewardsManager.getRewards(allocationIDNull) + const contractRewards = await rewardsManager.getRewards(staking.address, allocationIDNull) expect(contractRewards).eq(BigNumber.from(0)) }) }) @@ -700,7 +700,6 @@ describe('Rewards', () => { const event = rewardsManager.interface.parseLog(receipt.logs[1]).args expect(event.indexer).eq(indexer1.address) expect(event.allocationID).eq(allocationID1) - expect(event.epoch).eq(await epochManager.currentEpoch()) expect(toRound(event.amount)).eq(toRound(expectedIndexingRewards)) // After state @@ -736,8 +735,8 @@ describe('Rewards', () => { // Close allocation. At this point rewards should be collected for that indexer const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) await expect(tx) - .emit(rewardsManager, 'RewardsAssigned') - .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch(), toBN(0)) + .emit(rewardsManager, 'HorizonRewardsAssigned') + .withArgs(indexer1.address, allocationID1, toBN(0)) }) it('does not revert with an underflow if the minimum signal changes, and signal came after allocation', async function () { @@ -754,8 +753,8 @@ describe('Rewards', () => { // Close allocation. At this point rewards should be collected for that indexer const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) await expect(tx) - .emit(rewardsManager, 'RewardsAssigned') - .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch(), toBN(0)) + .emit(rewardsManager, 'HorizonRewardsAssigned') + .withArgs(indexer1.address, allocationID1, toBN(0)) }) it('does not revert if signal was already under minimum', async function () { @@ -771,8 +770,8 @@ describe('Rewards', () => { const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) await expect(tx) - .emit(rewardsManager, 'RewardsAssigned') - .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch(), toBN(0)) + .emit(rewardsManager, 'HorizonRewardsAssigned') + .withArgs(indexer1.address, allocationID1, toBN(0)) }) it('should distribute rewards on closed allocation and send to destination', async function () { @@ -806,7 +805,6 @@ describe('Rewards', () => { const event = rewardsManager.interface.parseLog(receipt.logs[1]).args expect(event.indexer).eq(indexer1.address) expect(event.allocationID).eq(allocationID1) - expect(event.epoch).eq(await epochManager.currentEpoch()) expect(toRound(event.amount)).eq(toRound(expectedIndexingRewards)) // After state @@ -892,9 +890,7 @@ describe('Rewards', () => { // Close allocation. At this point rewards should be collected for that indexer const tx = staking.connect(indexer1).closeAllocation(allocationID1, randomHexBytes()) - await expect(tx) - .emit(rewardsManager, 'RewardsDenied') - .withArgs(indexer1.address, allocationID1, await epochManager.currentEpoch()) + await expect(tx).emit(rewardsManager, 'RewardsDenied').withArgs(indexer1.address, allocationID1) }) it('should deny rewards due to rewards eligibility oracle', async function () { @@ -1174,7 +1170,7 @@ describe('Rewards', () => { await staking.connect(assetHolder).collect(tokensToCollect, allocationID1) // check rewards diff - await rewardsManager.getRewards(allocationID1).then(formatGRT) + await rewardsManager.getRewards(staking.address, allocationID1).then(formatGRT) await helpers.mine() const accrual = await getRewardsAccrual(subgraphs) diff --git a/packages/contracts/test/tests/unit/staking/allocation.test.ts b/packages/contracts/test/tests/unit/staking/allocation.test.ts index 9bcf8e7d0..dd28aa73d 100644 --- a/packages/contracts/test/tests/unit/staking/allocation.test.ts +++ b/packages/contracts/test/tests/unit/staking/allocation.test.ts @@ -845,7 +845,7 @@ describe('Staking:Allocation', () => { poi, false, ) - await expect(tx).not.to.emit(rewardsManager, 'RewardsAssigned') + await expect(tx).not.to.emit(rewardsManager, 'HorizonRewardsAssigned') }) it('reject close if not the owner of allocation', async function () { diff --git a/packages/data-edge/package.json b/packages/data-edge/package.json index 81a20ace2..219c3b46e 100644 --- a/packages/data-edge/package.json +++ b/packages/data-edge/package.json @@ -9,7 +9,7 @@ "prepublishOnly": "scripts/prepublish", "build": "npm run build:self", "build:self": "scripts/build", - "clean": "rm -rf build/ cache/ dist/", + "clean": "rm -rf build/ cache/ dist/ reports/ artifacts/", "compile": "hardhat compile", "test": "pnpm test:self", "test:self": "scripts/test", diff --git a/packages/common/.markdownlint.json b/packages/hardhat-graph-protocol/.markdownlint.json similarity index 100% rename from packages/common/.markdownlint.json rename to packages/hardhat-graph-protocol/.markdownlint.json diff --git a/packages/sdk/.mocharc.json b/packages/hardhat-graph-protocol/.mocharc.json similarity index 58% rename from packages/sdk/.mocharc.json rename to packages/hardhat-graph-protocol/.mocharc.json index 79ba35ddf..de4e97026 100644 --- a/packages/sdk/.mocharc.json +++ b/packages/hardhat-graph-protocol/.mocharc.json @@ -1,5 +1,5 @@ { "require": "ts-node/register/files", - "ignore": ["test/fixture-projects/**/*"], + "ignore": ["test/fixtures/**/*"], "timeout": 6000 } diff --git a/packages/hardhat-graph-protocol/CHANGELOG.md b/packages/hardhat-graph-protocol/CHANGELOG.md new file mode 100644 index 000000000..b0ef720d6 --- /dev/null +++ b/packages/hardhat-graph-protocol/CHANGELOG.md @@ -0,0 +1,219 @@ +# hardhat-graph-protocol + +## 0.2.5 + +### Patch Changes + +- @graphprotocol/toolshed@0.6.5 + +## 0.2.4 + +### Patch Changes + +- Ensure latest build is published to npm +- Updated dependencies + - @graphprotocol/toolshed@0.6.4 + +## 0.2.3 + +### Patch Changes + +- @graphprotocol/toolshed@0.6.3 + +## 0.2.2 + +### Patch Changes + +- @graphprotocol/toolshed@0.6.2 + +## 0.2.1 + +### Patch Changes + +- @graphprotocol/toolshed@0.6.1 + +## 0.2.0 + +### Minor Changes + +- Extracted contract interfaces into its own package + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.6.0 + +## 0.1.24 + +### Patch Changes + +- @graphprotocol/toolshed@0.5.7 + +## 0.1.23 + +### Patch Changes + +- @graphprotocol/toolshed@0.5.6 + +## 0.1.22 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.5.5 + +## 0.1.21 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.5.4 + +## 0.1.20 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.5.3 + +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.5.1 + +## 0.1.18 + +### Patch Changes + +- Fix target undefined bug + +## 0.1.17 + +### Patch Changes + +- Fix auto balance function + +## 0.1.16 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.5.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.4.2 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.4.1 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.4.0 + +## 0.1.12 + +### Patch Changes + +- Fix package exports +- Updated dependencies + - @graphprotocol/toolshed@0.3.2 + +## 0.1.11 + +### Patch Changes + +- chore: fix package visibility +- Updated dependencies + - @graphprotocol/toolshed@0.3.1 + +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.3.0 + +## 0.1.9 + +### Patch Changes + +- @graphprotocol/toolshed@0.2.6 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.2.5 + +## 0.1.7 + +### Patch Changes + +- @graphprotocol/toolshed@0.2.4 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.2.3 + +## 0.1.5 + +### Patch Changes + +- @graphprotocol/toolshed@0.2.2 + +## 0.1.4 + +### Patch Changes + +- Pin ethers version +- Updated dependencies + - @graphprotocol/toolshed@0.2.1 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.2.0 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies [585cf27] + - @graphprotocol/toolshed@0.1.2 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.1.1 + +## 0.1.0 + +### Minor Changes + +- Publish initial dev versions + +### Patch Changes + +- Updated dependencies + - @graphprotocol/toolshed@0.1.0 diff --git a/packages/hardhat-graph-protocol/README.md b/packages/hardhat-graph-protocol/README.md new file mode 100644 index 000000000..5057e6e04 --- /dev/null +++ b/packages/hardhat-graph-protocol/README.md @@ -0,0 +1,242 @@ +# hardhat-graph-protocol + +A Hardhat plugin for integrating with The Graph Protocol, providing easy access to deployment addresses and configuration for Graph Protocol contracts. + +## 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. +- **Accounts** - Provides account management methods for convenience, following protocol conventions for account derivation +- **Secure accounts** - Integrates seamlessly with [hardhat-secure-accounts](https://www.npmjs.com/package/hardhat-secure-accounts) + +## Installation + +```bash +# Install as a dev dependency +pnpm add --dev hardhat-graph-protocol +``` + +## Configuration + +Add the plugin to your `hardhat.config.ts`: + +```ts +import 'hardhat-graph-protocol' +``` + +### Using @graphprotocol/toolshed + +To use the plugin you'll need to configure the target networks. We recommend using our base hardhat configuration which can be imported from `@graphprotocol/toolshed`: + +```ts +import { hardhatBaseConfig, networksUserConfig } from '@graphprotocol/toolshed/hardhat' +import 'hardhat-graph-protocol' + +const config: HardhatUserConfig = { + ...networksUserConfig, + // rest of config +} + +export default config // or just "export default hardhatBaseConfig" +``` + +### Manual configuration + +To manually configure target networks: + +#### Hardhat: Network config + +```ts + networks: { + arbitrumOne: { + chainId: 42161, + url: `https://arbitrum-one.infura.io/v3/123456` + deployments: { + horizon: '/path/to/horizon/addresses.json, + subgraphService: 'path/to/subgraph-service/addresses.json' + } + }, + } +``` + +#### 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: + +```ts + ... + networks: { + ... + }, + graph: { + deployments: { + horizon: '/path/to/horizon/addresses.json, + subgraphService: 'path/to/subgraph-service/addresses.json' + }, + }, + ... +``` + +## Usage + +This plugin exposes functionality via a simple API: + +```ts +const graph = hre.graph() +``` + +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: DeploymentActionsType + } + provider: HardhatEthersProvider + chainId: number + accounts: { + getAccounts: () => Promise + getDeployer: (accountIndex?: number) => Promise + getGovernor: (accountIndex?: number) => Promise + getArbitrator: (accountIndex?: number) => Promise + getPauseGuardian: (accountIndex?: number) => Promise + getSubgraphAvailabilityOracle: (accountIndex?: number) => Promise + getGateway: (accountIndex?: number) => Promise + getTestAccounts: () => Promise + } +} +``` + +### Deployments + +The plugin provides one object for each configured deployment, this object allows easily interacting with the associated deployment with a few additional features. The current deployments that are supported: `horizon` and `subgraphService`. + +Each deployment will be of the form: + +```ts + [deploymentName]: { + contracts: DeploymentContractsType, + addressBook: DeploymentAddressBookType, + actions: DeploymentActionsType + }, +``` + +Where: + +- `contracts`: an object with all the contracts available in the deployment, already instanced, fully typed and ready to go. +- `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 + +Any transactions made using the `contracts` object will be automatically logged both to the console and to a file: + +- `file`, in the project's root directory: `tx-YYYY-MM-DD.log` +- `console`, not shown by default. Run with `DEBUG=toolshed:tx` to enable them. + +Note that this does not apply to getter functions (`view` or `pure`) as those are not state modifying calls. +An example log output: + +``` +[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 +[2025-04-10T20:32:37.182Z] = Params: [ 0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E, 0x1afb3ce06A1b3Cfb065DA4821c6Fa33b8CfC3485, 100000000000000000000 ] +[2025-04-10T20:32:37.182Z] = TxHash: 0x0e76c384a80f9f0402eb74de40c0456ef808d7afb4de68d451f5ed95b4be5c8a +[2025-04-10T20:32:37.183Z] ✔ Transaction succeeded! +[2025-04-10T20:32:40.936Z] > Sending transaction: HorizonStaking.thaw +[2025-04-10T20:32:40.936Z] = Sender: 0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E +[2025-04-10T20:32:40.936Z] = Contract: 0x865365C425f3A593Ffe698D9c4E6707D14d51e08 +[2025-04-10T20:32:40.936Z] = Params: [ 0xACa94ef8bD5ffEE41947b4585a84BdA5a3d3DA6E, 0x1afb3ce06A1b3Cfb065DA4821c6Fa33b8CfC3485, 100000000000000000000 ] +[2025-04-10T20:32:40.936Z] = TxHash: 0x5422a1e975688952e13a455498c4f652a090d619bec414662775fc9d8cbd0af6 +[2025-04-10T20:32:40.946Z] ✔ Transaction succeeded! +``` + +**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 + +Any transactions made using the `contracts` object will be automatically awaited: + +```ts +const graph = hre.graph() + +// The transaction is automatically awaited, no need to await tx.wait() it +const tx = await graph.horizon.contracts.GraphToken.approve('0xDEADBEEF', 100) + +// But you can still do it if you need more confirmations for example +await tx.wait(10) +``` + +### Examples + +```js +const graph = hre.graph() +const { GraphPayments, HorizonStaking, GraphToken } = graph.horizon.contracts +const { provision } = graph.horizon.actions + +// Print GraphPayment's protocol cut +await GraphPayments.PROTOCOL_PAYMENT_CUT() +10000n + +// Provision some GRT to a data service +await GraphToken.connect(signer).approve(HorizonStaking.target, 100_000_000) +await HorizonStaking.connect(signer).stake(100_000_000) +await HorizonStaking.connect(signer).provision(signer.address, dataService.address, 100_000_000, 10_000, 42_690) + +// Do the same but using actions - in this case the `provision` helper also approves and stakes +await provision(signer, [signer.address, dataService.address, 100_000_000, 10_000, 42_690]) + +// Read the address book +const entry = graph.horizon.addressBook.getEntry('HorizonStaking') +console.log(entry.address) // HorizonStaking proxy address +console.log(entry.implementation) // HorizonStaking implementation address +``` + +### Accounts + +The plugin provides helper functions to derive signers from the configured accounts in hardhat config: + +```ts + hardhat: { + chainId: 31337, + accounts: { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + }, + ... + }, +``` + +| Function | Description | Default account derivation index | +| --------------------------------- | ------------------------------------- | -------------------------------- | +| `getAccounts()` | Returns all the accounts listed below | - | +| `getDeployer()` | Returns the deployer signer | 0 | +| `getGovernor()` | Returns the governor signer | 1 | +| `getArbitrator()` | Returns the arbitrator signer | 2 | +| `getPauseGuardian()` | Returns the pause guardian signer | 3 | +| `getSubgraphAvailabilityOracle()` | Returns a service provider signer | 4 | +| `getGateway()` | Returns the gateway signer | 5 | +| `getTestAccounts()` | Returns the test signers | 6-20 | + +Note that these are just helper functions to enforce a convention on which index to use for each account. These might not match what is configured in the target protocol deployment. + +For any of the accounts listed above these are equivalents: + +```ts +const graph = hre.graph() + +// These two should match +const governor = await graph.accounts.getGovernor() // By default governor uses derivation index 1 +const governorFromEthers = (await hre.ethers.getSigners())[1] +``` + +## Development: TypeScript support + +When using the plugin from within this monorepo, TypeScript may fail to properly apply the type extension typings. To work around this issue: + +1. Create a file at `types/hardhat-graph-protocol.d.ts` +2. Copy the contents from the `type-extensions.ts` file in this repository into the new file + +This will ensure proper TypeScript type support for the plugin. diff --git a/packages/hardhat-graph-protocol/package.json b/packages/hardhat-graph-protocol/package.json new file mode 100644 index 000000000..9e0ed4e06 --- /dev/null +++ b/packages/hardhat-graph-protocol/package.json @@ -0,0 +1,66 @@ +{ + "name": "hardhat-graph-protocol", + "version": "0.2.5", + "publishConfig": { + "access": "public" + }, + "description": "A hardhat plugin that extends the runtime environment to inject additional functionality related to the usage of the Graph Protocol.", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "hardhat-plugin", + "graph", + "graph-protocol", + "horizon" + ], + "author": "Tomás Migone ", + "license": "MIT", + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "exports": { + ".": { + "types": "./src/types.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build": "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'", + "prepublishOnly": "pnpm run build" + }, + "files": [ + "dist/", + "src/", + "LICENSE", + "README.md" + ], + "dependencies": { + "@graphprotocol/toolshed": "workspace:^", + "@nomicfoundation/hardhat-ethers": "3.0.8", + "debug": "^4.3.7", + "json5": "^2.2.3" + }, + "devDependencies": { + "@nomicfoundation/hardhat-verify": "^2.0.12", + "@types/chai": "^4.0.0", + "@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", + "hardhat-secure-accounts": "^1.0.4", + "mocha": "^10.8.2", + "ts-node": "^8.0.0", + "typescript": "^5.6.3" + }, + "peerDependencies": { + "ethers": "6.13.7", + "hardhat": "^2.22.16" + } +} diff --git a/packages/common/prettier.config.cjs b/packages/hardhat-graph-protocol/prettier.config.cjs similarity index 100% rename from packages/common/prettier.config.cjs rename to packages/hardhat-graph-protocol/prettier.config.cjs diff --git a/packages/hardhat-graph-protocol/src/accounts.ts b/packages/hardhat-graph-protocol/src/accounts.ts new file mode 100644 index 000000000..15789155a --- /dev/null +++ b/packages/hardhat-graph-protocol/src/accounts.ts @@ -0,0 +1,96 @@ +import { + getAccounts as getAccountsToolshed, + getArbitrator, + getDeployer, + getGateway, + getGovernor, + getPauseGuardian, + getSubgraphAvailabilityOracle, + getTestAccounts, + TEN_MILLION, +} from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import type { Addressable } from 'ethers' + +type Accounts = { + getAccounts: () => ReturnType + getDeployer: (accountIndex?: number) => ReturnType + getGovernor: (accountIndex?: number) => ReturnType + getArbitrator: (accountIndex?: number) => ReturnType + getPauseGuardian: (accountIndex?: number) => ReturnType + getSubgraphAvailabilityOracle: (accountIndex?: number) => ReturnType + getGateway: (accountIndex?: number) => ReturnType + getTestAccounts: () => ReturnType +} + +export function getAccounts( + provider: HardhatEthersProvider, + chainId: number, + grtTokenAddress: string | Addressable | undefined, +): Accounts { + return { + getAccounts: async () => { + const accounts = await getAccountsToolshed(provider) + for (const account of Object.values(accounts)) { + if (typeof account === 'object' && 'address' in account) { + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + } else if (Array.isArray(account)) { + for (const testAccount of account) { + await setBalanceIfLocal(provider, chainId, grtTokenAddress, testAccount) + } + } + } + return accounts + }, + getDeployer: async (accountIndex?: number) => { + const account = await getDeployer(provider, accountIndex) + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + return account + }, + getGovernor: async (accountIndex?: number) => { + const account = await getGovernor(provider, accountIndex) + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + return account + }, + getArbitrator: async (accountIndex?: number) => { + const account = await getArbitrator(provider, accountIndex) + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + return account + }, + getPauseGuardian: async (accountIndex?: number) => { + const account = await getPauseGuardian(provider, accountIndex) + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + return account + }, + getSubgraphAvailabilityOracle: async (accountIndex?: number) => { + const account = await getSubgraphAvailabilityOracle(provider, accountIndex) + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + return account + }, + getGateway: async (accountIndex?: number) => { + const account = await getGateway(provider, accountIndex) + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + return account + }, + getTestAccounts: async () => { + const accounts = await getTestAccounts(provider) + for (const account of accounts) { + await setBalanceIfLocal(provider, chainId, grtTokenAddress, account) + } + return accounts + }, + } +} + +async function setBalanceIfLocal( + provider: HardhatEthersProvider, + chainId: number, + grtTokenAddress: string | Addressable | undefined, + account: HardhatEthersSigner, +) { + if (grtTokenAddress && [1337, 31337].includes(chainId)) { + await setGRTBalance(provider, grtTokenAddress, account.address, TEN_MILLION) + } +} diff --git a/packages/hardhat-graph-protocol/src/config.ts b/packages/hardhat-graph-protocol/src/config.ts new file mode 100644 index 000000000..403a0d01a --- /dev/null +++ b/packages/hardhat-graph-protocol/src/config.ts @@ -0,0 +1,66 @@ +import type { GraphDeploymentName } from '@graphprotocol/toolshed/deployments' +import fs from 'fs' +import type { HardhatRuntimeEnvironment } from 'hardhat/types' +import path from 'path' + +import { GraphPluginError } from './error' +import { logDebug } from './logger' +import type { GraphRuntimeEnvironmentOptions } from './types' + +export function getAddressBookPath( + deployment: GraphDeploymentName, + hre: HardhatRuntimeEnvironment, + opts: GraphRuntimeEnvironmentOptions, +): string | undefined { + const optsPath = getPath(opts.deployments?.[deployment]) + const networkPath = getPath(hre.network.config.deployments?.[deployment]) + const globalPath = getPath(hre.config.graph?.deployments?.[deployment]) + + logDebug(`Getting address book path...`) + logDebug(`Graph base dir: ${hre.config.paths.graph}`) + logDebug(`1) opts: ${optsPath}`) + logDebug(`2) network: ${networkPath}`) + logDebug(`3) global: ${globalPath}`) + + const addressBookPath = optsPath ?? networkPath ?? globalPath + if (addressBookPath === undefined) { + return undefined + } + + const normalizedAddressBookPath = normalizePath(addressBookPath, hre.config.paths.graph) + logDebug(`Address book path: ${normalizedAddressBookPath}`) + + if (!fs.existsSync(normalizedAddressBookPath)) { + if (opts.createAddressBook) { + logDebug(`Creating address book: ${normalizedAddressBookPath}`) + fs.writeFileSync(normalizedAddressBookPath, '{}') + } else { + throw new GraphPluginError(`Address book not found: ${normalizedAddressBookPath}`) + } + } + + return normalizedAddressBookPath +} + +function normalizePath(_path: string, graphPath?: string): string { + if (!path.isAbsolute(_path) && graphPath !== undefined) { + _path = path.join(graphPath, _path) + } + return _path +} + +function getPath( + value: + | string + | { + addressBook: string + } + | undefined, +): string | undefined { + if (typeof value === 'string') { + return value + } else if (value && typeof value == 'object') { + return value.addressBook + } + return +} diff --git a/packages/sdk/src/gre/helpers/error.ts b/packages/hardhat-graph-protocol/src/error.ts similarity index 77% rename from packages/sdk/src/gre/helpers/error.ts rename to packages/hardhat-graph-protocol/src/error.ts index 56995b4d5..f3cdd2fe0 100644 --- a/packages/sdk/src/gre/helpers/error.ts +++ b/packages/hardhat-graph-protocol/src/error.ts @@ -2,7 +2,7 @@ import { HardhatPluginError } from 'hardhat/plugins' import { logError } from './logger' -export class GREPluginError extends HardhatPluginError { +export class GraphPluginError extends HardhatPluginError { constructor(message: string) { super('GraphRuntimeEnvironment', message) logError(message) diff --git a/packages/hardhat-graph-protocol/src/gre.ts b/packages/hardhat-graph-protocol/src/gre.ts new file mode 100644 index 000000000..0dc1c1018 --- /dev/null +++ b/packages/hardhat-graph-protocol/src/gre.ts @@ -0,0 +1,106 @@ +import type { GraphDeployments } from '@graphprotocol/toolshed/deployments' +import { loadGraphHorizon, loadSubgraphService } from '@graphprotocol/toolshed/deployments' +import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import { lazyFunction } from 'hardhat/plugins' +import type { HardhatConfig, HardhatRuntimeEnvironment, HardhatUserConfig } from 'hardhat/types' +import path from 'path' + +import { getAccounts } from './accounts' +import { getAddressBookPath } from './config' +import { GraphPluginError } from './error' +import { logDebug, logError } from './logger' +import type { GraphRuntimeEnvironmentOptions } from './types' +import { isGraphDeployment } from './types' + +export const greExtendConfig = (config: HardhatConfig, userConfig: Readonly) => { + const userPath = userConfig.paths?.graph + + let newPath: string + if (userPath === undefined) { + newPath = config.paths.root + } else { + if (path.isAbsolute(userPath)) { + newPath = userPath + } else { + newPath = path.normalize(path.join(config.paths.root, userPath)) + } + } + + config.paths.graph = newPath +} + +export const greExtendEnvironment = (hre: HardhatRuntimeEnvironment) => { + hre.graph = lazyFunction(() => (opts?: GraphRuntimeEnvironmentOptions) => { + logDebug('*** Initializing Graph Runtime Environment (GRE) ***') + logDebug(`Main network: ${hre.network.name}`) + + if (opts === undefined) { + opts = { + deployments: {}, + createAddressBook: false, + } + } + + const chainId = hre.network.config.chainId + if (chainId === undefined) { + throw new GraphPluginError('Please define chainId in your Hardhat network configuration') + } + logDebug(`Chain Id: ${chainId}`) + + const deployments = [ + ...new Set( + [ + ...Object.keys(opts.deployments ?? {}), + ...Object.keys(hre.network.config.deployments ?? {}), + ...Object.keys(hre.config.graph?.deployments ?? {}), + ].filter((v) => isGraphDeployment(v)), + ), + ] + logDebug(`Detected deployments: ${deployments.join(', ')}`) + + // Build the Graph Runtime Environment (GRE) for each deployment + const provider = new HardhatEthersProvider(hre.network.provider, hre.network.name) + const greDeployments = {} as GraphDeployments + + for (const deployment of deployments) { + logDebug(`== Initializing deployment: ${deployment} ==`) + + const addressBookPath = getAddressBookPath(deployment, hre, opts) + if (addressBookPath === undefined) { + logError(`Skipping deployment ${deployment} - Reason: address book path does not exist`) + continue + } + + try { + switch (deployment) { + case 'horizon': + greDeployments.horizon = loadGraphHorizon(addressBookPath, chainId, provider) + break + case 'subgraphService': + greDeployments.subgraphService = loadSubgraphService(addressBookPath, chainId, provider) + break + default: + logError(`Skipping deployment ${deployment} - Reason: unknown deployment`) + break + } + } catch (error) { + logError(`Skipping deployment ${deployment} - Reason: runtime error`) + logError(error) + continue + } + } + + // Accounts + // We use ? here because we've previously asserted that the deployment exists which might not be true + const accounts = getAccounts(provider, chainId, greDeployments.horizon?.contracts?.GraphToken?.target) + + logDebug('GRE initialized successfully!') + + return { + ...greDeployments, + provider, + chainId, + accounts, + } + }) +} diff --git a/packages/sdk/src/gre/index.ts b/packages/hardhat-graph-protocol/src/index.ts similarity index 69% rename from packages/sdk/src/gre/index.ts rename to packages/hardhat-graph-protocol/src/index.ts index d739b745a..50a0c1764 100644 --- a/packages/sdk/src/gre/index.ts +++ b/packages/hardhat-graph-protocol/src/index.ts @@ -1,5 +1,3 @@ -// Plugin dependencies -import 'hardhat-secure-accounts' // This import is needed to let the TypeScript compiler know that it should include your type // extensions in your npm package's types file. import './type-extensions' @@ -11,8 +9,3 @@ import { greExtendConfig, greExtendEnvironment } from './gre' // ** Graph Runtime Environment (GRE) extensions for the HRE ** extendConfig(greExtendConfig) extendEnvironment(greExtendEnvironment) - -// Exports -export { getGREOptsFromArgv } from './helpers/argv' -export { greTask as greTask } from './task' -export * from './types' diff --git a/packages/sdk/src/gre/helpers/logger.ts b/packages/hardhat-graph-protocol/src/logger.ts similarity index 84% rename from packages/sdk/src/gre/helpers/logger.ts rename to packages/hardhat-graph-protocol/src/logger.ts index a768d6b04..3529373f6 100644 --- a/packages/sdk/src/gre/helpers/logger.ts +++ b/packages/hardhat-graph-protocol/src/logger.ts @@ -1,6 +1,6 @@ import debug from 'debug' -const LOG_BASE = 'hardhat:gre' +const LOG_BASE = 'hardhat:graph' export const logDebug = debug(`${LOG_BASE}:debug`) export const logWarn = debug(`${LOG_BASE}:warn`) diff --git a/packages/hardhat-graph-protocol/src/type-extensions.ts b/packages/hardhat-graph-protocol/src/type-extensions.ts new file mode 100644 index 000000000..ef11ad994 --- /dev/null +++ b/packages/hardhat-graph-protocol/src/type-extensions.ts @@ -0,0 +1,45 @@ +// To extend one of Hardhat's types, you need to import the module where it has been defined, and redeclare it. +import 'hardhat/types/config' +import 'hardhat/types/runtime' + +import type { GraphDeploymentOptions, GraphRuntimeEnvironment, GraphRuntimeEnvironmentOptions } from './types' + +declare module 'hardhat/types/runtime' { + interface HardhatRuntimeEnvironment { + graph: (opts?: GraphRuntimeEnvironmentOptions) => GraphRuntimeEnvironment + } +} + +declare module 'hardhat/types/config' { + interface HardhatConfig { + graph: GraphRuntimeEnvironmentOptions + } + + interface HardhatUserConfig { + graph: GraphRuntimeEnvironmentOptions + } + + interface HardhatNetworkConfig { + deployments?: GraphDeploymentOptions + } + + interface HardhatNetworkUserConfig { + deployments?: GraphDeploymentOptions + } + + interface HttpNetworkConfig { + deployments?: GraphDeploymentOptions + } + + interface HttpNetworkUserConfig { + deployments?: GraphDeploymentOptions + } + + interface ProjectPathsConfig { + graph?: string + } + + interface ProjectPathsUserConfig { + graph?: string + } +} diff --git a/packages/hardhat-graph-protocol/src/types.ts b/packages/hardhat-graph-protocol/src/types.ts new file mode 100644 index 000000000..9faa0838f --- /dev/null +++ b/packages/hardhat-graph-protocol/src/types.ts @@ -0,0 +1,32 @@ +import type { GraphAccounts } from '@graphprotocol/toolshed' +import type { GraphDeploymentName, GraphDeployments } from '@graphprotocol/toolshed/deployments' +import { GraphDeploymentsList } from '@graphprotocol/toolshed/deployments' +import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +export type GraphDeploymentOptions = { + [deployment in GraphDeploymentName]?: string +} + +export type GraphRuntimeEnvironmentOptions = { + deployments?: GraphDeploymentOptions + createAddressBook?: boolean +} + +export type GraphRuntimeEnvironment = GraphDeployments & { + provider: HardhatEthersProvider + chainId: number + accounts: { + getAccounts: () => Promise + getDeployer: (accountIndex?: number) => Promise + getGovernor: (accountIndex?: number) => Promise + getArbitrator: (accountIndex?: number) => Promise + getPauseGuardian: (accountIndex?: number) => Promise + getSubgraphAvailabilityOracle: (accountIndex?: number) => Promise + getGateway: (accountIndex?: number) => Promise + getTestAccounts: () => Promise + } +} + +export function isGraphDeployment(deployment: unknown): deployment is GraphDeploymentName { + return typeof deployment === 'string' && GraphDeploymentsList.includes(deployment as GraphDeploymentName) +} diff --git a/packages/hardhat-graph-protocol/test/config.test.ts b/packages/hardhat-graph-protocol/test/config.test.ts new file mode 100644 index 000000000..aba4b9cef --- /dev/null +++ b/packages/hardhat-graph-protocol/test/config.test.ts @@ -0,0 +1,73 @@ +import { expect } from 'chai' +import path from 'path' + +import { getAddressBookPath } from '../src/config' +import { loadHardhatContext } from './helpers' + +describe('GRE init functions', function () { + // No address book - should throw + describe('getAddressBookPath', function () { + it('should return undefined if no address book is specified', function () { + this.hre = loadHardhatContext('default-config', 'mainnet') + expect(getAddressBookPath('horizon', this.hre, {})).to.be.undefined + }) + + it("should throw if address book doesn't exist", function () { + this.hre = loadHardhatContext('invalid-address-book', 'mainnet') + expect(() => getAddressBookPath('horizon', this.hre, {})).to.throw(/Address book not found: /) + }) + + // Address book via opts should be used + it('should use opts parameter if available', function () { + this.hre = loadHardhatContext('network-address-book', 'mainnet') + const addressBook = getAddressBookPath('horizon', this.hre, { + deployments: { + horizon: 'addresses-opt.json', + }, + }) + expect(path.basename(addressBook!)).to.equal('addresses-opt.json') + }) + + it('should use opts parameter if available - shortcut syntax', function () { + this.hre = loadHardhatContext('network-address-book', 'mainnet') + const addressBook = getAddressBookPath('horizon', this.hre, { + deployments: { + horizon: 'addresses-opt.json', + }, + }) + expect(path.basename(addressBook!)).to.equal('addresses-opt.json') + }) + + // Address book via network config should be used + it('should use HH network config', function () { + this.hre = loadHardhatContext('network-address-book', 'mainnet') + const addressBook = getAddressBookPath('horizon', this.hre, {}) + expect(path.basename(addressBook!)).to.equal('addresses-network.json') + }) + + it('should use HH network config - shortcut syntax', function () { + this.hre = loadHardhatContext('network-address-book', 'mainnet') + if (this.hre.network.config.deployments) { + this.hre.network.config.deployments.horizon = 'addresses-network-short.json' + } + const addressBook = getAddressBookPath('horizon', this.hre, {}) + expect(path.basename(addressBook!)).to.equal('addresses-network-short.json') + }) + + // Address book via global config should be used + it('should use HH global config', function () { + this.hre = loadHardhatContext('global-address-book', 'mainnet') + const addressBook = getAddressBookPath('horizon', this.hre, {}) + expect(path.basename(addressBook!)).to.equal('addresses-global.json') + }) + + it('should use HH global config - shortcut syntax', function () { + this.hre = loadHardhatContext('global-address-book', 'mainnet') + if (this.hre.config.graph.deployments) { + this.hre.config.graph.deployments.horizon = 'addresses-global-short.json' + } + const addressBook = getAddressBookPath('horizon', this.hre, {}) + expect(path.basename(addressBook!)).to.equal('addresses-global-short.json') + }) + }) +}) diff --git a/packages/sdk/src/gre/test/fixture-projects/default-config/hardhat.config.ts b/packages/hardhat-graph-protocol/test/fixtures/default-config/hardhat.config.ts similarity index 100% rename from packages/sdk/src/gre/test/fixture-projects/default-config/hardhat.config.ts rename to packages/hardhat-graph-protocol/test/fixtures/default-config/hardhat.config.ts diff --git a/packages/hardhat-graph-protocol/test/fixtures/files/addresses-arbsep.json b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-arbsep.json new file mode 100644 index 000000000..ee972dc05 --- /dev/null +++ b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-arbsep.json @@ -0,0 +1,223 @@ +{ + "421614": { + "HorizonStaking": { + "address": "0xFf2Ee30de92F276018642A59Fb7Be95b3F9088Af" + }, + "GraphPayments": { + "address": "0xf5B3661BbB8CD48571C7f41ba2D896a3589C9753" + }, + "PaymentsEscrow": { + "address": "0x09B985a2042848A08bA59060EaF0f07c6F5D4d54" + }, + "GraphTallyCollector": { + "address": "0xacC71844EF6beEF70106ABe6E51013189A1f3738" + }, + "GraphProxyAdmin": { + "address": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", + "creationCodeHash": "0x68b304ac6bce7380d5e0f6b14a122f628bffebcc75f8205cb60f0baf578b79c3", + "runtimeCodeHash": "0x8d9ba87a745cf82ab407ebabe6c1490197084d320efb6c246d94bcc80e804417", + "txHash": "0x71b6defab0d3d7b711b7f6769f20a8c85bc9686eb5939b2a86dfaf587fceab17" + }, + "Controller": { + "address": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "creationCodeHash": "0x5bde9a87bc4e8dd24d41900f0a19321c1dc6d3373d51bba093b130bb5b80a677", + "runtimeCodeHash": "0x7f0479db1d60ecf6295d92ea2359ebdd223640795613558b0594680f5d4922c9", + "txHash": "0xf7b4faa14f9d29bb62dec73fd163d1253184233012bcadf7ae78af7995017f29" + }, + "EpochManager": { + "address": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "initArgs": ["0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", "554"], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0x587ea6f421a08ab3a390103f63daba0529901f2e662ca7f6fe575674a439fa79", + "proxy": true, + "implementation": { + "address": "0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da", + "creationCodeHash": "0x9947bd0a1f46027123b8fb4aec8b11af540aea587eb79642475d57b4e347078f", + "runtimeCodeHash": "0xe45a27197726de0e3149014823794708edd432ee56ec8358554c0d2365674ca0", + "txHash": "0x82653a0bd83e0541379b920415af94e4be1d732dfab720e5dead839062781c07" + } + }, + "L2GraphToken": { + "address": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "initArgs": ["0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f"], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0xbb27939a4e4b5d92da8a10add4b7d0126e907da30b07b5f3d439f1c32a6c8e2c", + "proxy": true, + "implementation": { + "address": "0x4cf968bA38b43dd10be114daa7959C1b369479e5", + "creationCodeHash": "0x6c4146427aafa7375a569154be95c8c931bf83aab0315706dd78bdf79c889e4c", + "runtimeCodeHash": "0x004371d1d80011906953dcba17c648503fc94b94e1e0365c8d8c706ff91f93e9", + "txHash": "0x3fab5697addf0c0e16b8e2249f2b833c6f256e699b293d184089c96de8deaa44" + } + }, + "GraphCurationToken": { + "address": "0x00FBd5D46FFAc54862c1Dd27BE08924BB17f5CDa", + "creationCodeHash": "0x1ee42ee271cefe20c33c0de904501e618ac4b56debca67c634d0564cecea9ff2", + "runtimeCodeHash": "0x340e8f378c0117b300f3ec255bc5c3a273f9ab5bd2940fa8eb3b5065b21f86dc", + "txHash": "0x045d64dc3ebb7ae6c4976854ce0a797a04524d22a6ef5f526bfc27f744bc68e5" + }, + "ServiceRegistry": { + "address": "0x888541878CbDDEd880Cd58c728f1Af5C47343F86", + "initArgs": ["0x9DB3ee191681f092607035d9BDA6e59FbEaCa695"], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0xdaa1228e8cd8569c1e5562b63d2fd89caf897ab67da05922636d3309b838e289", + "proxy": true, + "implementation": { + "address": "0x05E732280bf9F37054346Cb83f5Fd58C5B44F6A8", + "creationCodeHash": "0xec9cb879003a06609541ad87efd4bc5dfc8ea60e4e77cfa5ae2cb5208742e7bc", + "runtimeCodeHash": "0x5161b534164413a88d851832f9c9d1dd1bca32fe2bbb62bb35d112c1dc8b69ab", + "txHash": "0xe1fce867f5dd708e60518b7f257fdbcb28f460d1e3b82045b82d03e64345b210" + } + }, + "L2Curation": { + "address": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "initArgs": [ + "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "0x00FBd5D46FFAc54862c1Dd27BE08924BB17f5CDa", + "10000", + "1" + ], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0xe9298239bcb3c386cf66e6dd493cf6e7cdd9771c65fa2225e0b34d17550d6805", + "proxy": true, + "implementation": { + "address": "0xd90022aB67920212D0F902F5c427DE82732DE136", + "creationCodeHash": "0x2287d9023bf7d91e688e1eb029eff7657ef3b87e37b5222b01fd50985d0928f9", + "runtimeCodeHash": "0xd799b2b74e9634d6b6ef15b5710409264bed04a60f9519b9d8f05ac183199d16", + "txHash": "0x436bcf91fed712dc8d54f449726b2078fb63cd770f90b492a9622efac5817762" + } + }, + "SubgraphNFTDescriptor": { + "address": "0x4032F7B6b27FfC9862106f826379DaB1716C71d7", + "creationCodeHash": "0xf16e8ff11d852eea165195ac9e0dfa00f98e48f6ce3c77c469c7df9bf195b651", + "runtimeCodeHash": "0x39583196f2bcb85789b6e64692d8c0aa56f001c46f0ca3d371abbba2c695860f", + "txHash": "0xb7e7aeeecc693f34f491b01c56950533119810a4e3e2642081efc127f11cb782" + }, + "SubgraphNFT": { + "address": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + "constructorArgs": ["0xadE6B8EB69a49B56929C1d4F4b428d791861dB6f"], + "creationCodeHash": "0xc1e58864302084de282dffe54c160e20dd96c6cfff45e00e6ebfc15e04136982", + "runtimeCodeHash": "0x7216e736a8a8754e88688fbf5c0c7e9caf35c55ecc3a0c5a597b951c56cf7458", + "txHash": "0x1309c1caea76f4014ba612de092cc746816119b1440d635d11b6bc7e361a32b0" + }, + "L2GNS": { + "address": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "initArgs": ["0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A"], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0x137140783a99a3e9a60048d607124626ca87e2b972e8cc05efb41ac87c3cbcc4", + "proxy": true, + "implementation": { + "address": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "creationCodeHash": "0xd71f45e6c194920a26f90fcec96d8c3375f02c5aef8ad90c1be24e906ffe8342", + "runtimeCodeHash": "0x68ec24512fedb866d7ba7ba6c02160317d0ca34eaacd23bddcc62d2cbcd9869c", + "txHash": "0x54619944731edec530b7b0cd587f9c2faae332aa1671fe5e8d7e7e5c7e291a77" + } + }, + "StakingExtension": { + "address": "0x05709dd705A5674346B7206a2bC657C8bAb3301B", + "creationCodeHash": "0x7ae74140871330ecabb7040182dc8288c2c84693393a519230036f39c2281138", + "runtimeCodeHash": "0x4994aa74e9e29c36a8158af690a245ccd1cf4d955223e5fcb1ca62810b37ed57", + "txHash": "0xbe1ff9cb949a53209b778708265740dfa2a08a93cfce4c897a53989a5d93f8c1" + }, + "L2Staking": { + "address": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "initArgs": [ + "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "100000000000000000000000", + "6646", + "10000", + "100000", + "8", + "12", + "16", + "100,100,60,100", + "0x876fB4B13D7Ed146757D3664B7E962b36936001C" + ], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0x326cf1f2849da4bb4d7e39f2783779e3c99fa48e4ee8ef004cfdd50c62e775df", + "proxy": true, + "implementation": { + "address": "0xD07dFD514dc1b57020e6C1F49e05c48d0658C99f", + "creationCodeHash": "0x6a763345e5f166ea4e73ce9a116a49c9fc0833d9ea235a86fa5a997e91cf09e5", + "runtimeCodeHash": "0xb4c31859ac132241f04c802d4add70a94c7f2c6eb9dfd4bf224048d249dbc7bc", + "txHash": "0x68b34eda64287b84582c8f005c4e96162252d36c9c5c9b84332336a7c2e3d6d3", + "libraries": { + "LibExponential": "0xd844116f6d79a280b117Bb6d9EBf4121D4e8B44b" + } + } + }, + "RewardsManager": { + "address": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "initArgs": ["0x9DB3ee191681f092607035d9BDA6e59FbEaCa695"], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0xd8765fb87e11e8d41951f9071188b888829022a889cf66fdc2357f1f9f15c8e2", + "proxy": true, + "implementation": { + "address": "0x714B54e5249C90414fecA240e2F5B618C243F0aE", + "creationCodeHash": "0x59c1680da2d19124daaf95fd66acc5eae68e6f46dfe2ff0b3ccb777daf9949b2", + "runtimeCodeHash": "0xe33080183ec49ab1ec8d78b80b90158f0f3ac6f2deedf6115a32a9d11d3e4d9b", + "txHash": "0x8192f6c0e63a9beede3b025878af6a49367564c8bc32cb11a64f5f1e8351c7cd" + } + }, + "DisputeManager": { + "address": "0x7C9B82717f9433932507dF6EdA93A9678b258698", + "initArgs": [ + "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "0xF89688d5d44d73cc4dE880857A3940487076e5A4", + "10000000000000000000000", + "500000", + "25000", + "25000" + ], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0xb3764f4b576b46ee8dc6cbf680cad650b3ba80aa93dc6cf099862cfe8efc8a68", + "proxy": true, + "implementation": { + "address": "0x887aC2f58D62Ac86d4E9aEc07c953991e3ca1bA3", + "creationCodeHash": "0xce4c47d94a33d69e03d607dd13a9ad1ed7fa730ef4a2308eb56ddd646ebaa0aa", + "runtimeCodeHash": "0x18d4a1659ccecede3d4d305ef1db4653d8f3dcbd4012f4e52200ae9f0c6c322c", + "txHash": "0x59d99afb9cefbb5c2275d9ac2d7230ac7f4a4cfb2440636408988a66075c032a" + } + }, + "AllocationExchange": { + "address": "0x9BD4FBDa981D628AbA16F261f810dD59E5bAf9eA", + "constructorArgs": [ + "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + "0x49D4CFC037430cA9355B422bAeA7E9391e1d3215" + ], + "creationCodeHash": "0x2963baeedb2d0f5a95fa41f6c89e48e5bf177ca439379fc6becd54870d330ab0", + "runtimeCodeHash": "0xd8b53b3f65b49198d35392e0fd11da229a40d15a96151bca2976cbbe36b909d5", + "txHash": "0xa1a9410662d43463c39802e887f33a1401ed0fc35bf22c5be275e62141eae442" + }, + "L2GraphTokenGateway": { + "address": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "initArgs": ["0x9DB3ee191681f092607035d9BDA6e59FbEaCa695"], + "creationCodeHash": "0xcdd28bb3db05f1267ca0f5ea29536c61841be5937ce711b813924f8ff38918cc", + "runtimeCodeHash": "0x4ca8c37c807bdfda1d6dcf441324b7ea14c6ddec5db37c20c2bf05aeae49bc0d", + "txHash": "0x90949db305a73b85e7208aa6b8d03c5181945eedc3df38e90f215a0dec8b02ae", + "proxy": true, + "implementation": { + "address": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC", + "creationCodeHash": "0x90253be19d23d542b29e95e6faf52304fcff91b21edfdb5f79e165051740d1ab", + "runtimeCodeHash": "0x3a7fab6792b4dad58c7b59da19c5b65b3985d1be77024a9f86cb135965e9b462", + "txHash": "0x78ff2e39d5c33ddfb89b1dbee89bdbc24452843a051f860c94e4e9dd75ded9c3" + } + }, + "EthereumDIDRegistry": { + "address": "0xF5f4cA61481558709AFa94AdEDa7B5F180f4AD59", + "creationCodeHash": "0x20cd202f7991716a84c097da5fbd365fd27f7f35f241f82c529ad7aba18b814b", + "runtimeCodeHash": "0x5f396ffd54b6cd6b3faded0f366c5d7e148cc54743926061be2dfd12a75391de", + "txHash": "0x2cefbc169b8ae51c263d0298956d86a397b05f11f076b71c918551f63fe33784" + } + } +} diff --git a/packages/sdk/src/gre/test/files/addresses-hre.json b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-global-short.json similarity index 100% rename from packages/sdk/src/gre/test/files/addresses-hre.json rename to packages/hardhat-graph-protocol/test/fixtures/files/addresses-global-short.json diff --git a/packages/sdk/src/gre/test/files/addresses-opts.json b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-global.json similarity index 100% rename from packages/sdk/src/gre/test/files/addresses-opts.json rename to packages/hardhat-graph-protocol/test/fixtures/files/addresses-global.json diff --git a/packages/sdk/src/gre/test/files/config/graph.arbitrum-goerli.yml b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-hre.json similarity index 100% rename from packages/sdk/src/gre/test/files/config/graph.arbitrum-goerli.yml rename to packages/hardhat-graph-protocol/test/fixtures/files/addresses-hre.json diff --git a/packages/sdk/src/gre/test/files/config/graph.arbitrum-hre.yml b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-network-short.json similarity index 100% rename from packages/sdk/src/gre/test/files/config/graph.arbitrum-hre.yml rename to packages/hardhat-graph-protocol/test/fixtures/files/addresses-network-short.json diff --git a/packages/sdk/src/gre/test/files/config/graph.arbitrum-opts.yml b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-network.json similarity index 100% rename from packages/sdk/src/gre/test/files/config/graph.arbitrum-opts.yml rename to packages/hardhat-graph-protocol/test/fixtures/files/addresses-network.json diff --git a/packages/sdk/src/gre/test/files/config/graph.hre.yml b/packages/hardhat-graph-protocol/test/fixtures/files/addresses-opt.json similarity index 100% rename from packages/sdk/src/gre/test/files/config/graph.hre.yml rename to packages/hardhat-graph-protocol/test/fixtures/files/addresses-opt.json diff --git a/packages/sdk/src/gre/test/fixture-projects/graph-config/hardhat.config.ts b/packages/hardhat-graph-protocol/test/fixtures/global-address-book/hardhat.config.ts similarity index 74% rename from packages/sdk/src/gre/test/fixture-projects/graph-config/hardhat.config.ts rename to packages/hardhat-graph-protocol/test/fixtures/global-address-book/hardhat.config.ts index 48faa5586..5659954ab 100644 --- a/packages/sdk/src/gre/test/fixture-projects/graph-config/hardhat.config.ts +++ b/packages/hardhat-graph-protocol/test/fixtures/global-address-book/hardhat.config.ts @@ -1,9 +1,10 @@ -import '../../..' +import '../../../src/index' -module.exports = { +import type { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { paths: { - graph: '../../files', - accounts: '.accounts', + graph: '../files', }, solidity: '0.8.9', defaultNetwork: 'hardhat', @@ -16,7 +17,6 @@ module.exports = { }, mainnet: { chainId: 1, - graphConfig: 'config/graph.mainnet.yml', url: `https://mainnet.infura.io/v3/123456`, }, 'arbitrum-one': { @@ -41,8 +41,10 @@ module.exports = { }, }, graph: { - addressBook: 'addresses-hre.json', - l1GraphConfig: 'config/graph.goerli.yml', - l2GraphConfig: 'config/graph.arbitrum-goerli.yml', + deployments: { + horizon: 'addresses-global.json', + }, }, } + +export default config diff --git a/packages/sdk/src/gre/test/fixture-projects/graph-config-full/hardhat.config.ts b/packages/hardhat-graph-protocol/test/fixtures/invalid-address-book/hardhat.config.ts similarity index 52% rename from packages/sdk/src/gre/test/fixture-projects/graph-config-full/hardhat.config.ts rename to packages/hardhat-graph-protocol/test/fixtures/invalid-address-book/hardhat.config.ts index 2bad7705c..232a1a30c 100644 --- a/packages/sdk/src/gre/test/fixture-projects/graph-config-full/hardhat.config.ts +++ b/packages/hardhat-graph-protocol/test/fixtures/invalid-address-book/hardhat.config.ts @@ -1,47 +1,50 @@ -import '../../..' +import '../../../src/index' -module.exports = { +import type { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { paths: { - graph: '../../files', + graph: '../files', }, solidity: '0.8.9', defaultNetwork: 'hardhat', networks: { hardhat: { chainId: 1337, + accounts: { + mnemonic: 'pumpkin orient can short never warm truth legend cereal tourist craft skin', + }, }, mainnet: { chainId: 1, - graphConfig: 'config/graph.mainnet.yml', url: `https://mainnet.infura.io/v3/123456`, }, 'arbitrum-one': { chainId: 42161, url: 'https://arb1.arbitrum.io/rpc', - graphConfig: 'config/graph.arbitrum-goerli.yml', }, goerli: { chainId: 5, url: `https://goerli.infura.io/v3/123456`, - graphConfig: 'config/graph.goerli.yml', }, 'arbitrum-goerli': { chainId: 421613, url: 'https://goerli-rollup.arbitrum.io/rpc', - graphConfig: 'config/graph.arbitrum-goerli.yml', }, - rinkeby: { - chainId: 4, - url: `https://goerli.infura.io/v3/123456`, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', }, 'arbitrum-rinkeby': { chainId: 421611, - url: `https://goerli.infura.io/v3/123456`, + url: 'http://127.0.0.1:8545', }, }, graph: { - addressBook: 'addresses-hre.json', - l1GraphConfig: 'config/graph.hre.yml', - l2GraphConfig: 'config/graph.arbitrum-hre.yml', + deployments: { + horizon: 'addresses-invalid.json', + }, }, } + +export default config diff --git a/packages/hardhat-graph-protocol/test/fixtures/network-address-book/hardhat.config.ts b/packages/hardhat-graph-protocol/test/fixtures/network-address-book/hardhat.config.ts new file mode 100644 index 000000000..3c249e510 --- /dev/null +++ b/packages/hardhat-graph-protocol/test/fixtures/network-address-book/hardhat.config.ts @@ -0,0 +1,53 @@ +import '../../../src/index' + +import type { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { + paths: { + graph: '../files', + }, + solidity: '0.8.9', + defaultNetwork: 'hardhat', + networks: { + hardhat: { + chainId: 1337, + accounts: { + mnemonic: 'pumpkin orient can short never warm truth legend cereal tourist craft skin', + }, + }, + mainnet: { + chainId: 1, + url: `https://mainnet.infura.io/v3/123456`, + deployments: { + horizon: 'addresses-network.json', + }, + }, + 'arbitrum-one': { + chainId: 42161, + url: 'https://arb1.arbitrum.io/rpc', + }, + goerli: { + chainId: 5, + url: `https://goerli.infura.io/v3/123456`, + }, + 'arbitrum-goerli': { + chainId: 421613, + url: 'https://goerli-rollup.arbitrum.io/rpc', + }, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', + }, + 'arbitrum-rinkeby': { + chainId: 421611, + url: 'http://127.0.0.1:8545', + }, + }, + graph: { + deployments: { + horizon: 'addresses-global.json', + }, + }, +} + +export default config diff --git a/packages/sdk/src/gre/test/files/config/graph.mainnet.yml b/packages/hardhat-graph-protocol/test/fixtures/no-path-config/addresses.json similarity index 100% rename from packages/sdk/src/gre/test/files/config/graph.mainnet.yml rename to packages/hardhat-graph-protocol/test/fixtures/no-path-config/addresses.json diff --git a/packages/hardhat-graph-protocol/test/fixtures/no-path-config/hardhat.config.ts b/packages/hardhat-graph-protocol/test/fixtures/no-path-config/hardhat.config.ts new file mode 100644 index 000000000..dae1f7ab8 --- /dev/null +++ b/packages/hardhat-graph-protocol/test/fixtures/no-path-config/hardhat.config.ts @@ -0,0 +1,47 @@ +import '../../../src/index' + +import type { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { + solidity: '0.8.9', + defaultNetwork: 'hardhat', + networks: { + hardhat: { + chainId: 1337, + accounts: { + mnemonic: 'pumpkin orient can short never warm truth legend cereal tourist craft skin', + }, + }, + mainnet: { + chainId: 1, + url: `https://mainnet.infura.io/v3/123456`, + }, + 'arbitrum-one': { + chainId: 42161, + url: 'https://arb1.arbitrum.io/rpc', + }, + goerli: { + chainId: 5, + url: `https://goerli.infura.io/v3/123456`, + }, + 'arbitrum-goerli': { + chainId: 421613, + url: 'https://goerli-rollup.arbitrum.io/rpc', + }, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', + }, + 'arbitrum-rinkeby': { + chainId: 421611, + url: 'http://127.0.0.1:8545', + }, + }, + graph: { + deployments: { + horizon: 'addresses-hre.json', + }, + }, +} + +export default config diff --git a/packages/hardhat-graph-protocol/test/fixtures/path-config/hardhat.config.ts b/packages/hardhat-graph-protocol/test/fixtures/path-config/hardhat.config.ts new file mode 100644 index 000000000..ea6dea27c --- /dev/null +++ b/packages/hardhat-graph-protocol/test/fixtures/path-config/hardhat.config.ts @@ -0,0 +1,57 @@ +import '../../../src/index' + +import type { HardhatUserConfig } from 'hardhat/config' + +const config: HardhatUserConfig = { + paths: { + graph: '../files', + }, + solidity: '0.8.9', + defaultNetwork: 'hardhat', + networks: { + hardhat: { + chainId: 1337, + accounts: { + mnemonic: 'pumpkin orient can short never warm truth legend cereal tourist craft skin', + }, + }, + mainnet: { + chainId: 1, + url: `https://mainnet.infura.io/v3/123456`, + }, + 'arbitrum-one': { + chainId: 42161, + url: 'https://arb1.arbitrum.io/rpc', + }, + goerli: { + chainId: 5, + url: `https://goerli.infura.io/v3/123456`, + }, + 'arbitrum-goerli': { + chainId: 421613, + url: 'https://goerli-rollup.arbitrum.io/rpc', + }, + arbitrumSepolia: { + chainId: 421614, + url: 'https://goerli-rollup.arbitrum.io/rpc', + deployments: { + horizon: 'addresses-arbsep.json', + }, + }, + localhost: { + chainId: 1337, + url: 'http://127.0.0.1:8545', + }, + 'arbitrum-rinkeby': { + chainId: 421611, + url: 'http://127.0.0.1:8545', + }, + }, + graph: { + deployments: { + horizon: 'addresses-hre.json', + }, + }, +} + +export default config diff --git a/packages/hardhat-graph-protocol/test/gre.test.ts b/packages/hardhat-graph-protocol/test/gre.test.ts new file mode 100644 index 000000000..97d90803e --- /dev/null +++ b/packages/hardhat-graph-protocol/test/gre.test.ts @@ -0,0 +1,44 @@ +import { GraphHorizonAddressBook } from '@graphprotocol/toolshed/deployments' +import { assert, expect } from 'chai' +import path from 'path' + +import { loadHardhatContext, useHardhatProject } from './helpers' + +describe('GRE usage', function () { + describe('Project not using GRE', function () { + useHardhatProject('default-config', 'mainnet') + + it('should throw when accessing hre.graph()', function () { + expect(() => this.hre.graph()).to.throw() + }) + }) + + describe(`Project using GRE - graph path`, function () { + it('should add the graph path to the config', function () { + this.hre = loadHardhatContext('no-path-config', 'mainnet') + assert.equal(this.hre.config.paths.graph, path.join(__dirname, 'fixtures/no-path-config')) + }) + + it('should add the graph path to the config from custom path', function () { + this.hre = loadHardhatContext('path-config', 'mainnet') + assert.equal(this.hre.config.paths.graph, path.join(__dirname, 'fixtures/files')) + }) + }) + + describe(`Project using GRE - deployments`, function () { + useHardhatProject('path-config', 'arbitrumSepolia') + + it.skip('should load Horizon deployment', function () { + const graph = this.hre.graph() + assert.isDefined(graph.horizon) + assert.isObject(graph.horizon) + + assert.isDefined(graph.horizon.contracts) + assert.isObject(graph.horizon.contracts) + + assert.isDefined(graph.horizon.addressBook) + assert.isObject(graph.horizon.addressBook) + assert.instanceOf(graph.horizon.addressBook, GraphHorizonAddressBook) + }) + }) +}) diff --git a/packages/hardhat-graph-protocol/test/helpers.ts b/packages/hardhat-graph-protocol/test/helpers.ts new file mode 100644 index 000000000..451b5c2b8 --- /dev/null +++ b/packages/hardhat-graph-protocol/test/helpers.ts @@ -0,0 +1,37 @@ +import { resetHardhatContext as _resetHardhatContext } from 'hardhat/plugins-testing' +import type { HardhatRuntimeEnvironment } from 'hardhat/types' +import path from 'path' + +declare module 'mocha' { + interface Context { + hre: HardhatRuntimeEnvironment + } +} + +export function useHardhatProject(fixtureProjectName: string, network?: string): void { + beforeEach('Loading hardhat environment', function () { + this.hre = loadHardhatContext(fixtureProjectName, network) + }) + + afterEach('Resetting hardhat', function () { + resetHardhatContext() + }) +} + +export function loadHardhatContext(fixtureProjectName: string, network?: string): HardhatRuntimeEnvironment { + resetHardhatContext() + delete process.env.HARDHAT_NETWORK + + process.chdir(path.join(__dirname, 'fixtures', fixtureProjectName)) + + if (network !== undefined) { + process.env.HARDHAT_NETWORK = network + } + + return require('hardhat') +} + +export function resetHardhatContext(): void { + _resetHardhatContext() + delete process.env.HARDHAT_NETWORK +} diff --git a/packages/hardhat-graph-protocol/tsconfig.json b/packages/hardhat-graph-protocol/tsconfig.json new file mode 100644 index 000000000..f6387508a --- /dev/null +++ b/packages/hardhat-graph-protocol/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src/**/*.ts", "test/**/*.ts"] +} diff --git a/packages/horizon/.solhintignore b/packages/horizon/.solhintignore new file mode 100644 index 000000000..4eb56dc37 --- /dev/null +++ b/packages/horizon/.solhintignore @@ -0,0 +1 @@ +lib/* \ No newline at end of file diff --git a/packages/horizon/CHANGELOG.md b/packages/horizon/CHANGELOG.md new file mode 100644 index 000000000..29be941cc --- /dev/null +++ b/packages/horizon/CHANGELOG.md @@ -0,0 +1,61 @@ +# @graphprotocol/horizon + +## 0.4.1 + +### Patch Changes + +- Ensure latest build is published to npm + +## 0.4.0 + +### Minor Changes + +- Extracted contract interfaces into its own package + +## 0.3.3 + +### Patch Changes + +- Add GNS to deployments + +## 0.3.2 + +### Patch Changes + +- chore: fix package visibility + +## 0.3.1 + +### Patch Changes + +- Use proper types for Curation contract, add epochLength to EpochManager import in Horizon. + +## 0.3.0 + +### Minor Changes + +- Publish types for contracts packages + +## 0.2.1 + +### Patch Changes + +- Pin ethers version + +## 0.2.0 + +### Minor Changes + +- Publish scratch testnet 2 address book + +## 0.1.1 + +### Patch Changes + +- Publish fork 1 deployment + +## 0.1.0 + +### Minor Changes + +- Publish initial dev versions diff --git a/packages/horizon/README.md b/packages/horizon/README.md new file mode 100644 index 000000000..1a81f0743 --- /dev/null +++ b/packages/horizon/README.md @@ -0,0 +1,71 @@ +# 🌅 Graph Horizon 🌅 + +Graph Horizon is the next evolution of the Graph Protocol. + +## Configuration + +The following environment variables might be required: + +| Variable | Description | +| ---------------------- | ------------------------------------------------------------------------------- | +| `ARBISCAN_API_KEY` | Arbiscan API key - for contract verification | +| `ARBITRUM_ONE_RPC` | Arbitrum One RPC URL - defaults to `https://arb1.arbitrum.io/rpc` | +| `ARBITRUM_SEPOLIA_RPC` | Arbitrum Sepolia RPC URL - defaults to `https://sepolia-rollup.arbitrum.io/rpc` | +| `LOCALHOST_RPC` | Localhost RPC URL - defaults to `http://localhost:8545` | + +You can set them using Hardhat: + +```bash +npx hardhat vars set +``` + +## Build + +```bash +pnpm install +pnpm build +``` + +## Deployment + +Note that this instructions will help you deploy Graph Horizon contracts, but no data service will be deployed. If you want to deploy the Subgraph Service please refer to the [Subgraph Service README](../subgraph-service/README.md) for deploy instructions. + +### New deployment + +To deploy Graph Horizon from scratch run the following command: + +```bash +npx hardhat deploy:protocol --network hardhat +``` + +### Upgrade deployment + +Usually you would run this against a network (or a fork) where the original Graph Protocol was previously deployed. To upgrade an existing deployment of the original Graph Protocol to Graph Horizon, run the following commands. Note that some steps might need to be run by different accounts (deployer vs governor): + +```bash +npx hardhat deploy:migrate --network hardhat --step 1 +npx hardhat deploy:migrate --network hardhat --step 2 # Run with governor. Optionally add --patch-config +npx hardhat deploy:migrate --network hardhat --step 3 # Optionally add --patch-config +npx hardhat deploy:migrate --network hardhat --step 4 # Run with governor. Optionally add --patch-config +``` + +Steps 2, 3 and 4 require patching the configuration file with addresses from previous steps. The files are located in the `ignition/configs` directory and need to be manually edited. You can also pass `--patch-config` flag to the deploy command to automatically patch the configuration reading values from the address book. Note that this will NOT update the configuration file. + +## Testing + +- **unit**: Unit tests can be run with `pnpm test` +- **integration**: Integration tests can be run with `pnpm test:integration` - Need to set `BLOCKCHAIN_RPC` for a chain where The Graph is already deployed - If no `BLOCKCHAIN_RPC` is detected it will try using `ARBITRUM_SEPOLIA_RPC` +- **deployment**: Deployment tests can be run with `pnpm test:deployment --network `, the following environment variables allow customizing the test suite for different scenarios: + - `TEST_DEPLOYMENT_STEP` (default: 1) - Specify the latest deployment step that has been executed. Tests for later steps will be skipped. + - `TEST_DEPLOYMENT_TYPE` (default: migrate) - The deployment type `protocol/migrate` that is being tested. Test suite has been developed for `migrate` use case but can be run against a `protocol` deployment, likely with some failed tests. + - `TEST_DEPLOYMENT_CONFIG` (default: `hre.network.name`) - The Ignition config file name to use for the test suite. + +## Verification + +To verify contracts on a network, run the following commands: + +```bash +./scripts/pre-verify +npx hardhat ignition verify --network --include-unrelated-contracts +./scripts/post-verify +``` diff --git a/packages/horizon/addresses-integration-tests.json b/packages/horizon/addresses-integration-tests.json new file mode 100644 index 000000000..e7f445db0 --- /dev/null +++ b/packages/horizon/addresses-integration-tests.json @@ -0,0 +1,40 @@ +{ + "421614": { + "Controller": { + "address": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695" + }, + "EpochManager": { + "address": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "proxy": "graph", + "implementation": "0x646627fa39ec6f6E757Cb4189bC54c92FFBb71da" + }, + "L2Curation": { + "address": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "proxy": "graph", + "implementation": "0xdf27da4db64bf29a8f2a710a0b448474151ff925" + }, + "RewardsManager": { + "address": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "proxy": "graph", + "implementation": "0x714B54e5249C90414fecA240e2F5B618C243F0aE" + }, + "L2GraphTokenGateway": { + "address": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "proxy": "graph", + "implementation": "0x3C2eB5E561f70c0573E5f6c92358e988E32cb5eC" + }, + "L2GraphToken": { + "address": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "proxy": "graph", + "implementation": "0x4cf968bA38b43dd10be114daa7959C1b369479e5" + }, + "GraphProxyAdmin": { + "address": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C" + }, + "HorizonStaking": { + "address": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "proxy": "graph", + "implementation": "0x64Ed77b164d3B22339DA4DB6d56a1C1d8A051c0A" + } + } +} diff --git a/packages/horizon/addresses.json b/packages/horizon/addresses.json new file mode 100644 index 000000000..0c9e2cb89 --- /dev/null +++ b/packages/horizon/addresses.json @@ -0,0 +1,55 @@ +{ + "421614": { + "Controller": { + "address": "0x0750EdA3185C758247E97819074bCD217a815FaE" + }, + "EpochManager": { + "address": "0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2", + "proxy": "graph", + "implementation": "0x450906A976dc21450A7CcD1989D26E137E605B91" + }, + "L2Curation": { + "address": "0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4", + "proxy": "graph", + "implementation": "0x9CCD9B656f8A558879974ef2505496eEd7Ef7210" + }, + "RewardsManager": { + "address": "0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f", + "proxy": "graph", + "implementation": "0x05Ca4d407ec53Ac17ce6Bb414f42663f415Dc5C3" + }, + "L2GraphTokenGateway": { + "address": "0x7284213d1cDa80C892a4388f38dA431F06343144", + "proxy": "graph", + "implementation": "0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4" + }, + "L2GraphToken": { + "address": "0xBBcb9a575176039C06F94d4d8337818318A26828", + "proxy": "graph", + "implementation": "0x71927f8Ff0ce294882e2A161A54F62f3b0f3c726" + }, + "GraphProxyAdmin": { + "address": "0x1CEBe1C314Cc454baf4bd553409d957C833623c0" + }, + "HorizonStaking": { + "address": "0xF5D432192dAF7e8B045349693577ccF0B5165A12", + "proxy": "graph", + "implementation": "0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244" + }, + "GraphPayments": { + "proxy": "transparent", + "proxyAdmin": "0xAcA3dd622e863E425Cdb15E8734a5CB318448db7", + "address": "0xAFd60629034fBdC3ef58518B817bBDB4EC861c93", + "implementation": "0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866" + }, + "PaymentsEscrow": { + "proxy": "transparent", + "proxyAdmin": "0xbB643167f03EfF532c537e3d72E56b9992CaD985", + "address": "0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85", + "implementation": "0xeED33B904efF05BbdcC9008F5174088DF77dD183" + }, + "GraphTallyCollector": { + "address": "0xB63bC33D13F73eFD14d32D2b9FC0B6116B6611CE" + } + } +} diff --git a/packages/horizon/audits/2024-06-OZ-horizon.pdf b/packages/horizon/audits/2024-06-OZ-horizon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f1084413b953f8168ba67c23bed32084c37aae6 GIT binary patch literal 406340 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

cx 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

*SnZs&O$ZTwxYLLwK|yI(zI~ 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O$rO!kp_)_N8f zV0fW>p?YB=PK+P(9~s`+zRZ7Z(t&(e;sX$1d|}K_oEqET@i(piK?4IQz$}5MCk0es zmMy*ZjueShElRPZl!#Q@O7Wx=mR3zlF{KojRs*NFQi_hMHm2B8N{*`i2IM8xf20Wo zBr4aW(3Ao)mFrYr-?K|quAQT4juJKcB>yXwr&QlcF$YlWoafxlCfg>|rr0LcrfH>| zm5N=ehVfCUO{`6|O}0(9O{7g3uP#QhPFaGkIAvxGw^YuF_GD~+jB~7cOmmlK7r2YC zD`A%7j3o^kqR$4@O6w#`z zQC6qFrL#$SNNFD9G3#m+UaqiJKGoo&N2k$AsU71o>$oh~QbI@(-X+~N+Qrya+GRBh zzx;j~a#?bjatXSOxvXha@sjt__Yz(%?X2i5>8$B2>a6N4>#XZ6?5zB)zOKBkzOJ;c zwyv_SaYI8)Lrh0ZOH7|n;snxz=kW#*KdW&ctP3eXIwRkxYbo-b^qE5EeP)vo8NkZ)GvSKv4JT&7>3 zU!h;3U&B>7X&nuzdRJAUU!-59U#4HDU#MS+rXg9OQAs|pbY$rk11W2tbB9_(@uAvo zHNae87cdxD%p>0=eWEyAoqGh|ER$OyuS{LNb~Jg!XdTZZPFYz=SJ_xqQB_shZe5|G z)@offJ9l`50#$b_17`Ec*~~r6H6QV~b+rqxRoE+^X?&?huh5yRJ>qifxGy+TLYxzZl0uE3 z7*HiBt6TW}_xq6hlKYf<(0$B(O}mP(ysy5m@LFkiMR!SeO?OduRd-o;U3X!3<*E9H z@`n0`(uUfG%7(^m1#ty&6>%kTb$*5Syzf!@k;T#ekstIuR0c{9wSf{qb)dY^fcq|> z;*;=`(v$QnU8#94B2xEP^H=fLh_8^G7o0OWa)K&AnV}&-W&YAU^%wQ23X6G{Bf%;S z6VMw*#rNQ#<`0aj?`Lhbzhf7QTPtaUu!{$+owPgC3Mj3mwHwolO0BK5+tUiothKaT z(u#MJQ1}(b7vF(IYNhBG03hXBS^7mf5TF)NyvRj=o?l&@9dRp2!s zDAOy@tI#XatKqbo)Q(=LLe8qtE7GgdE7PmfE7Yq*U6ioYup)0(f>_$cER?l@+)u1e z@K3buYTR?(yWE4_i@D@Gq>rbEY;qy+wKCZia$qW(HOM4{Q9GVX{CNJJLpqsLT!m9^ zmQysls*O`6yG(A;+_Kf0y?F(s1+le@bMJ5u=hDb7U#py4#J2RXdV;+6{DX+tCAMhl z6uqV?Ta7n=f&lDNTeLegbc)x?Yv&iNj+;>-5_ZY%JuO<^LMugf^DR~@&4`@wTm`7s z=vL@9@s{z{@m9Q`;bv+Ob#pnWyx9U|(VPo$fm}h}Lzqs)Pbg2!PClKeop7GGouHn` z*|pxJ-L%}q-PGOW-E_A|J_tQ1K1e-iK8USUpUeu(3(N{E-q;ve8dw`x8Q5%CZdh+v zA%f1DgCXdUc!&ao^u*!>=j7W>^-cCohr1YW)l=c;**F`2Ykw;CSZ<^$L{ty6v9tN#3`+Tc}6oZ1HU2YzF5j z`g-sl)3>r))}XF_TH~ntdj7ua9{)+ex3*i}px$Bn%Tf0A19b8p?jGB>x?66ePO!rJ z8pc=AU&>$8U(8?CUv{HVuuia0uu`y8uvV~Gu=;E+e>Q*7VA|u5`H1 zFX}Jyf(8Ed#B=`B{&W6d^h3epo`Z0x0d(Vf14@3c^o0JD;ivne@**Qxm_Mg*SPt!h zvfpbxwA;aL3tJmuzl?<~o~B`oip4CRqhTM5eOC;wV5^G7FJ5rOt?9$-RI->O zKn#<_YZY!&2Cg(*nOL(SXOqwdu%=lJ*D2=$?k%28tlJRKB)DN_$#m7hmWzm`1y?85 zZs?}+eK}KByXR3-rA#?fcDv6}R3-gd(`wV2%W7-Knd6k(l*`6p-kJVp_xRdb_e$4D z*HYI&*Id^`*J{^~E^yaa7sR*TJN7}~R{NIc7I=$rEAg5X^mICTinyw?si6TR)UC_nDc?h1BMCOcn44%zU z=7o7srX^M8sCiVTby?=2d03{EdFHZtT&4|Vl8=3Zf#v-qSt`->I3Al#@TYHfgSL(%4?-5Sr)MTzt*O3R=grChcRNJ~PAAJ1L2AYxc@C zyqBP;{U{&p&$*(1$&rLzn1-y;abl3#DOo#sYS%G5KF|SCT0b${(zQ!7vlbj;KY#*# zp`Gjgx+gZTpMS}83!Ktc;0t!C989lCn&aV)*5Zuj2<(2qIVmpvTzZ03rtSx2IBoUn z>S@z8HH6i+nD$G2=MQG(p26Nh zzaMu6ehKMLHklNv<7}8H4mf|7+mI!@?euTv-(1us*4&QdVpqCecUb4OO|woyCZp== z`E9538~VJ1Cno*csI5~l&4Kze&jB9AZoDa|Ykx%3+aHurk(tkD6AoG&vD8ZA%gcoC zZJMLYCo2|Vd{R2i1Pr^9<9Sg9SraFw>!y(^6P~Xslr44SPmI7&WfW;Wl~{)B6?e(P z4}SgK{Dq6E+| zm?K0}I{(|e8!O2Sp(Bjz%5k&1AHgroL{6Mk5jBJxC5bQ3h5AYdvp#vOLQh5lP{d0K z3cQ1tUw9{4qIs-)k)%_&15p;Ra9q#FpNn71MQg1)F&;`BFdUJ>&573Bn~FcPZ($vg zp7__5t_z=mBe|cZg~o@|+ApW%@J%+Xfig4Y^DSBvrW3%wrQO9<|S8>N=TI8L@rjAJUk8 z@Zd#1BgaDj|pEy!$wh_vR-FfCTHojK{CvWcb5A7+EMmyhbTn) z{#wIWvyA9_u>5hWY1o0(li6L74LfS=newFgnQs{9)>AZ7ilX&Cv%+D5d&EuR!io%V z?`ixY>cn(^`MW8P+mvUQ!7KprriGTm(d$J__0q3z;16i(@N0gFo4{4gNlzT;$pycK zAsF#Mq@nZXO)fy@A(JaXcGi`CL8o+h@tbM7O@fp5@?2F9qIYHA%XwLZj@J%*D6GAIfyheFp$r~F`uY^Nbk~Led)o_k;#DP*=p)S3j z#{g=YWA!hc6x`)TZ?1*PfO4BgVGG&@oYKv_W9_7T`*FzQQ_Eut)ibq|$(z=jgVpNvnx1u;&|7E+u&N@N3njyXwzLT?aF zvK9Ied`|dJ@dZj|#Ny({oV2GwfgHx0JrFB4nsq_TH@v%eIrhAn-esq*k;el6_|1zwxjUkqjW zH?b1rXSB(UPP}B~cmbc;Ev4C6#%3|3V0A}wBE|(Q36zPcWMXelcl7B&DuicRRk0Z| z8nO>QfbzxUP~%%$N;57w>>AC~Q?I#wszXsU6K=_*PldWCI<^!S&$Ib1!#QU1>#lnc z(^PrP!gK>mm#Bk^7XXeW>4kg|M)rXShTSZy#)HXo()T}THc&qK@xb9j!nVBM{#hU^ zc zWKOJ`DbJtrsIh#YjrBFEJCbiq;)DAPGNRlbdFLI&#A{P30Ei|&cyJYZ)aKc-oZFNvZ_Hji&s(QW!Pqi~+|jUSAd?k_ z-SCB=#WkP*uq1hRWn27KtE-Ts9yCLWTt;lCo^gwkutX$AEkHPW{AO2c(VsI+yIJdW z+nKQ`7A2OO{VFt>m@?nz@{wI33=O)8awpjmNj)q7EZnq39Cj0d=;J-``i@k@_#;Iva#clFEjZ$|gH4HQpcfT+<5NevC~KKTvLl zO|SM1?%}iI-e)jhz$cK4>{6JXmQ>-!kB&DKY@ex*%@oEd2#?!$$6tc$z6PSRhRD{M z9rB9??_l6F)ykeAEqe(y1syu!JHA{$^9S2AnpphNeD>gw$^pn&(OFJ;XRPxdKlOc^ z{9-AnTXGFVP)r(@#Xo6EZBFQ7(&Ck|i|eqo{>|SM3L0nsmKu|5^P5Y%MX8FK99N8* zd)Ca3w!Vz~`)oRch2j?>q+(+7jNVClE***()BzstI8rkH8(kv-u9tMo| z%Ri*Gx$gC-&!X+C>yl$iOG$zH@_EHYzO?*Oh&|r9I}zZHE(T4!28Hz*FU*Mcpb^ zd#2c~D!u&lcS|!*Vb`+f`J@`c3<1jJ-FMX#c_NPyk);Yn;XkRj4#UXC*yFA37GQo* z9Z3;uzEAk3I5AspPa*Rs=QdxmCPKzDXrZa4hg&^N{K48veQu;coa{vMU2Xco^3g1K zAg}xQ3sv^x- zpx~D|DC?12bNYp96f&LY)%*u7b7PG3gmYsk{J&ls6KkfZVibF} zpoG1qcKYbss!&XTki^(*lA7?Fc9iE`3B)hoJ*b5S0&wGJr}-e~U(0Gq-gZS?01y-n zVXJ1eL&j6rSP^Movn{uO!kWYyEh=2`q8BZ1x=3%n1>J+vGDIdU)i+zdKoa`%5*jkkkKSRb02_R#l5Fh|g*JCNzbX?>ZzTWb4z@@xAB* z^kFD7k1xTs#kWBX6NiFVU(C(Mg2;?DcYiLSEFq}Qdn}>?bDNu`WKGU@UbH-mD4oL7 z{Z`POz^Pm-rd?l8aBxhGYNp}OvYV*j+5^fTc~3uT`T&;AO^)i$c}V|6yBjv%`?C4P zGjdlS%Mr3|ye}nd!uJj*i-)w#PVvS%zBI9Sb>TH~+>?%$48_!{D+f+6%N@zS#=T)~ zbIHg}CDW(L-0J{~R0QIzHA!WOvC>Q>B)5Io|fda^zvM7x(N_;}z>eO*iH5r8;TYaek#$7zc|!|sK#+hzK!HaF%IEdvuF811!t zQhqaDBO?j2(c6{ut(7R4z-2 z1gDH$Rld|V(Y%&9HneL|RF?mdc4h-iV;i-uvuSX{ZunvFEQRHFoRTj=j~R&=#u0zk z5e#w$>SyfYfdBw;*E>k*|9omz9at2qs(ql}q^=y7(mZIn8m0g0FWcp@<&nYfg&`}@{}*M2_V z*#xgaXx`(s>Tuq3LWathd^A~srsAIC3AtMaq{5B~C8_KTG5n-MuXo9N_{Yb}_`dIA z>+GsstgcIP{NSb?#Gzg*=ChCI3R$zJS_aI2J+#{_Qi%Y zsd-sc^N5!!EX82@SL4E|0AOMLOm{Kq(i=hm^xNe>;BVE{miH;ii4$ySTtE;uL8?rV z?TI3du2`d!-0r|-5M|awa;F+;{R25{v&)$JjlpBC4)#hR;?fyLlsq)lzQdJ%L|V$P zb5C)l({=H&C@-&-dkYG$eJdssJ}9B?d6Ty`9e)yawlp^1{c+cKDHJ?#tDo)G>(0zy zc**+7#01R6wDNrf!U}b0Qf{L6H87*pkwqx?HkK-u4BX9YZq*)#s&5qWE5{|P(T6cz zrBn3imVl+?RE*g|n<>txdCF^>0g@-*E%4{-iXk1Y$HFEcx1lY3>7kW}=31{A@A4o8 zqT=Heey9-JMXv5yy1)Ta$;eZALm;XV>#G1v=KmUgV!P9ui5V$cAyrHU5dk!rk?p$1ZA2542u44j#I%b z=-R9T(Nt9TC*Nqs;f5bpyvtduv}@~19Fr${!%&84J)ZvP8LvkUp=H<{*OqjZcCEAv6AN`l)1L=xO&@_s~${_n5?@CH`&Cn^X?C7B%*6ij8BB z#G4B|cX6&{-@N;(Nh#_mO+XpI2F8v(hW-8Q&bDSj(}wS=l#7*vBZHu0D)ZyBJ@19v zQVrRZP7H=4r@qKiHufcKfwV-GGCdFm({6;EMDPP5?5HkH{dSCH%B0q)Nu0OW+vcbk zth~}3Gw}Ri3~y(@@tl67q&lW>Bok{_!Z7nl z?s%@8r`M?01+DwWg)Oe0o+`#rH^4LfkUg;=eEYUN-v_2*RpC4}YkN8O2fSuoVoa)q z`5le9LK3W4GeS)i#VQ$=y?nK*?s3Yz1f^h~F9@dMG4?#H*VFM-gOt zYYU3?&+o|7TK3JJ>8cPIwQs3YW;LPT*FQ-6OV}%4I6Fv z4g8*{0{ZPbWW2qKo17KbbX^$j-sE#~vH`V<=ml-;SKn8)B$V*&T?Lmk3JNf9FIytYx&Va2Iufsn@qID6{g&z_dvEyf3i- ztculZmXrfOMo%8ha5c7{9;f-pvQ{dY=L?T3OMTUz(#5zWY{?$1X`Ya!RP^#Ww%mrJ zUqT8lB}kb{v-)l>ulGiTHApebv47wf8z33)$K4gD!fZ}9T1WW@w9iB36NqXdSI8C< z8j9r1fTB83rUzlcPmOGdvs+tK;gA~LA|FG2D-l3b62hb%N`C(6%2)Hesj0E{cH1iB zZHPDWhSI5Vu!lU*0v4P+K+=Fe5?twVS|t>Ksr8Mc2BL(l(t~Ifq1z~yHqxCrg>M)X z|Ng07{5)_5S>}_f9W$#38$C=2j_3`O8%A=zO-q1V`Aj#v z#Xh-#)>l}aa^2QJ`)&78^+FZ*fwnW4HF@6M_BeEQQdVa|a%A4vxg~4jhUk!skclua zuN?D^c<;*QEc?@sq;_O)BUJ&50T-B#v+ZGL6$^(b&9Zv4GnrH$;uC>Pq8~UkGf63@ zzfvY`9~E*1?PSG?Ol4wA51>23-04H92GQD`=iR9A;OY-k=DGJv&>rt2QLB+DAl07~ zD43d?Fu#L4V%XOye}+i5vQ6Jp`VJ2#81aNiYAo_>p!TQdQb@W4`^8EM0!q3~<-I?V zy8KDo=SNi+wl?879WM13c67M<)MK0@EV%u`6LRD!-;#nPzAsU8H#p>SX5CioaBz>kmh?896WALiLr6{+t1OM)WeyN zlsx7+#2FttF#XeH2Ww!kd2yee?=`^$L%0Sg)(@P^<(f51YE+8fjDJN+ejlYawAtWA z-nMh>1Eh)zyDSgoSP<5SN<=?Y+OzN_KB$pN@8aE9dr&^reM+1fJfmu<)Lm38M2<5h z|7a{9)p#Ge+L>`{^hts}-OkC%3$r8rI49k+o>b;{dO6kw$<&vZ!JtmrE#39lVeJ>* zXXdSE*Dscb{(Q5O#FtKwCCBCX;qERyTY?`Rhfc8g5?GX$2%e#b<6F-{SSxC2NuX-z15R!ZJxG=)Tl{j^V=o*EnO5=613 zZuLncSyH!uIUB12Ib$kKSa9;1Bf^>Rw+=rIHbfMSy4q@HtL7<?SAx^b_k5w)bRbe9HKw?u6wQ31B{KbY zxaHDK$KL^&P+Ic^!T24xR3n^=@3=SJA>W#{;S7J=nBw5u?Fpd&c0um$T};fV!A=pp zc6gz*C&gNpF+G&o(ab2|>h?Dp@Iet&y%%8+VXx&o%dIg@-U`@JzSEQ)#plJvpyx^Q z6MXX2ZPU;&B8q{$G_+n~}u= zaGN9@_M*W@?)I0ZduQ%%vGBRbbd_{7ch7w}15_N+8j^|UCxnHT+@5>>R$3Px9jSqh zG$^~+1aT6Y5WowworEl#ARlV*#~C}JBO=D&hbt^cYJRdhEnq65o-vTiIS2BC)IJnv z$mUnGt0RI_ryUXb(=y8!4+x^Mu8M|$Csshv&WD(d&(6V_sm%j(EkK=#KU_UABz9Bk zMzWbs)I?ngkqpA`#y&M49*r;wz1gv3yL|smnl96A^$m4bI*!(_>RMgRU(8$Pfo4X~ zAE7vrr1!`sYHv}ca@$f`7HBs@E^g$6P$z7d28xk!58peQi)<;8L$~z$n!2Pnx-ya> zYk|fG?*yXp>is@$qG-HdaYBbBwN-v zADU)SxkQY7z&pqDzAN;dPteDmXOyeV0Kw4CC^uyLwjE?p`rOJ+$f8s9@Fo$MmF)Fx_ure1 zABXG!Bn-bSox`W6+C$nj2I$g_!bu9al>MoWY$B}f3bT-3CV!*Y;%}i1d3#FxMvV9K zh_UT4`4Q#WNb)VLeK%RcO8_379%NK3tYNeQ9X)EmU&ui|s2)RAz4{RV3`*=f`xGc-yIcg^t)5^L%g-DYVI04f*w$6gnG!7 zB2)K^pWfxC<h-?nsPj@?OMvjr=JVOl|_RzSQL3=ydee2jff- z_;Av=28;WdOtX!+1XFwCTcl8PVV6eVo5m#GTG)MgIZJPUj%N#hWIYs>a3u)WKWsnj zVqe?*HL-3piL^ZVy9?a;IP$RfXky>aa+SWkSJLAXHQUjVxpyeIl_R)C*ps}`=Rl%) zzRXg|Bx3yT#%t#Z_hGFb?KKCUQoT>AU?!HF^TSHKBrmV%&@55>Fa>pLr4OE5WDHJn z57~Yi^ROq>nej7C>Mf&=!j{w|uu>G$Ue(3o&OBj+?#nhf!Mtod_v$qn!DS2n5+mbq zaz={WOrPKVX$fjx$~G^H-e0XB=QQq2$+zV^VQmnN^0VWd=D-}FUGh_hjmX5BZ~e!w zTS8vv-%@EPmT`+U2M@)GHu%V0M($I}oU0*smFZ07gJprOwg66lv)YERj$cW*cq&Ko zEf{;$q&A=N-}!t7Xt0?C*1MzTd|k$X~}}$zR2*Q@C*=+vpFHV@pa5x{*k( zQUC9!#eJMEn5+FW*1BudU#u><2AF=VeC{M39gex_hQUhhZ>F9{jgUuc;aG@%90l(u zE*Wl}ijE>i&LyjsU}_LJ^EnpKBT0V~qJtYK!;Pv9G!32AryNc{*+KgNL0vy z$Fhg8yRzdok5$Clng(xyr2_c*bvQAqN-JnR(Cz_AvP9DbBc@Zce8_PJV5Ih5aQBJ#6Q|WS}Cb39tKj`+j}LAfFH6)FyHImAXpuKHcna!Bl~fApp@UanmEx*>XlG)|PidQ;!MOS-^-8+-dl zacEEmTcVTd*C}gi()p^}sY`@S?v5tUfyunwi_}qdvIxev;4wq@8cVx&GJf8=f-{_4 zCe@J&{$-NFjQOAKVc;y5$M^I6O!tgrKf`O{m~hr)u|)-ce!SfV{A6jhCWBVTd;*cG zc)FBZJ~JzJS4L}9v?TITSNVp_xZKQWt$$j$%2J5B+ z=a6%$FP2?{9xdSceRAVh6&|9Rq&{CHXFTONSPbHXSib9g=Y`~eIy?!y>xeWvJ6~vO z4~7vf<$NaH!5Sxm1tKzym&?~*#K;ZFG{Cc&_T#;bRydj<@Z6C*eOzxfX89U9r(3bJ zlJ~>1(<6g0;hl6aw@m6&!h#*~d8ZpblPmTSW@(C_83_W*$G9ijb+0c-Zz?E|Zvkwa zl)Cv+QOZ+$H>z^5#%o`t*~`jH^bI5Atr2tA-2jX|2^Xb1YcXuOa%883rQ3TA>sp@M zap1))@9f_--<@cW(v`EA8O$m3zvw1AG6ct~tZDi#wq<2mSAf*z_vYo*#ggE0!io{e zkOYz>tlsD-5|C=KGTia6M_-Nby+INwg3uXrat%zrGd{)O`4Ek|@cs|;H(biAmS|8~ zwb~7w4(keK4hzlV_gk{z-5=JXd3jJ%PHX0l@Rg6Bk7Hn0$Y^siN)MJoS=4g)8RP;H zS2X!;BjEZJSKqi~Dz|%EtQxJbg7<$UOSG?v&F9(_i(D`vsn@PHR%nv9+9tzx<+jm# za#42niz^4GeUxuivP>(In)uKXTDOMd^o+-wPpwpa_G7Vd#&g5=xya#R7C&mMFXiO0 z^#NW5KRRaIqolC7Cjz;GNQg>B`|k1m@7vZ%oG%g$gkVD{bE9sGh7N8AJJGm9pN>eR2$N~3DR=tpU@_wm~ zYwsZp7qBkLwmh{fA@QXN=aF97qrml7{mo964&{&oo?T9`Frc^4(4!fhZCCe zVjsj%ijcncqQ@K-{Z$>BAEw;qjIUXy~sCLdRL!oP| zv1K1@DX+PwN5gX@ehL<)#g9q{9K~Myrkcb=u8i-4sL@=ajZ2XdXeKebLtO@$%8k!? zH)>>hd(aSE))|koNIajftcVw=Sn>y4mpp`m+_J(X)nHx8 zvhhF67~?L#n1*w3g|x*@T3F8Kl(IE7ap4MY3ppfmw+ty?z8uh%W}g95WmLB%zUt!E zvQzvXX5O@v)+Qr=e1rQcZiG6Y_4uoc0~F8o$64 zX3&haQ#+ksNj#k@SFIy{?>+8D@A`WELdGy^63-MKFzdEgn!-3|dX&eBk92?n^!1g- zU5_JxK^($umKlAtb_lRFai7Z8#~4$ZJ&wdH<+mBLW^$ePHN!p5b^)3a`l(`w z;SX_j(4s$^P0TuW>k_$c;u%fX*q-C0)MMYq>lTcsf;N}n?>8oi6G^Y8#DLSdfNp+T zl$fJwa&8CSC73BiGV2vtlZfX%(@R3%bj4_crm*m|iZs*egi=&Z8)wr02ut|fxzArR z;-ErZseuAL%cVXD!We0)++TjIdMOSP|4!fiy|F z{_=FPI7mg+llmbU)x=Pxb^v##zc46j7s|7cm+3LD0*$byw6J}K^vGWUxRkY^3d{Np z=nKS-g!i)#5?d1BOUxXW3O;(#NuH*@V~}%~K+3!5wx>G8T#3ZN3ni@{ z$R53E%a6dy^w-qq=dSL|@{@l(A#7^XeMsOh3YYBPKy+}B89f?WH72*c!mda~q%1c@ zpE0Kb=yE9&(zL%~*ECjjn@~NP)eB4mqJQy9i8JUcZDNijo9P4vOL`>jdWO7Q>DK}o ziFLZ^aQ{`l&QWb%6$Pn^T2v#|&$jpQW4MqjLP^I^sshs*A?#P$#h_DkpTH)y;;$J0 zskO`iKxZK@tBJTkrXi%TFGUX@Eld6utR{C%LNP9YIL!`Y5TP_}otgAj3*=hF86l8> zrz%PCo@{YoA96@oeGO{+&{U3D*9^@0i4s%qTPAag6wZiy9!?J>zR?vAyiwzg_u3I) zIah+okr}s!@TgFuLvUMQ*@=mU2;0F9{roqZ&)@12!L!}Qi?0b{{R>1+h1pycR-j4N zxNd46Copo#IfKy&^T>jgS@(T}rn#m>s%zT5G((SFT`;s3 zN5r;%gUA#OE1Cnu10@1dCm4L(2=0kQbqj+{KLIGQ=Qv2iqH;iy0$CHumi>p;t3^*0 zgC(*fu9r>T&75qvCsKP0ZC-MCu45si3k*rFO)NzmMgnVVL}tRc*eYdEJpRF-R?0qn z?Iysb>S!Kcs56Z99>N0MpT=+=rxy7}k`GF>in@FhFKMHdwNqfuWLo;_+dgfl^)#k= zu{x-M6XV!lG0&fS1IgH}g#(fdAkVme$J0S`3xz4hm$95v-GH64pi9}F)ne4BR#FLumCM*7b|5%bN}a`RY{fT zo0l$NBQPqd0nTAE*GLCk<2u@NRq)$Zw{Yk$b`Jc)C5#6;%_u!|3xU*Yl-~Ew&8w0A zY>=**ODgj01MSyg*^sp(46j$a1`v$)d~=|4YkVibr^h%ayWRhD{yz`OXW4P$U4$+| zpN82ur>f`R9<0(Lp4-47tx|49@rA`DfC^Kjo<)Y#`ZKi9hhh5ZQs?i}_0v~wK0f)d zHF(J@8aJ5yJKy}976lhMEJynAq;NhAS~klLTT|;|*db%L2(7>#o<&5esxuJuel>nd zY!1~8^I5g8FlQpOwKa1<^^7OZYU5VY@Z%DYxRkuEWG2NSaf4WD*`yjIM|uBHLZYGm zu6XJRt08cUt8Gp`wblY6AV1mk0>|oF+G)Nxx#Hh>1BLrv+??VN+*aO(*n{btK;?^P zAMxsgkOn+_<1$;j3=Khrec;sM@b<9#G|U*6^@Bd0E*pZpb+NWdhZC0KR@B41;yPol z31|Lb%Ia*DYSl~a`S+f14~i3+!k?HxN+<|n|l4FJrIo`l2&O+^w7(>tlY0fim0mOi$SW^9bq7X&Y zSM0I&cdHj5yOTYjY8f=|oBz5|!wdRzY5najc5RAz#o?iuS*E@!C<6?FIn+)L2AFp^^(e z?wahka#T!q&?z(5m+-Lk3dwoA*)0F4;w(R&dU;70U9o986?uio3OE$uU0q(UV)*Y( zVtb8eh?c2qdFM$VPYCBJJSMFCe$AN-{N6h#8{9ybNZ+oP={M(sv?8ek(ikf4o(+_BGHhcL zNsR6tw#5G^AcR>0xk4q@tTAf&Pd2j%&KBduwl7jwles=`Uok&RGYTLqV+z10FiULR zxYFSD1a}B5Rs3$o@iI^iS;53bAvg?ikbJksqd3p8@0~+8RkT=3U+Mmyg|5TU)ez6^ z>ry!E3z0cTq0O#w{&8Nh;-ttXw#~gG2W@N_nKp`{$q*%VYkO@Qq`_yG7zVxRcD=*r z2Pwu6Uz@1_gm#Ng`xde}m%D<@$91rMl&P?!$WtKR=G;M0hkAoda1-pjGo2UpXI)`0 zd*#jpvtyfaV?o6=q@F1vt5BnV6w^_Eal9&OTL~fEe)jJ5EPj7g zaQwDz(0>BDPk%Wq4}W>8?`?YN7Mww>S+KUF$IZ`y7=^uXSsEWThIBBNLSq-^tw}Zu zl>|@9QGA5h2mRy|soiIdoB%+tvS7)KVN_!;sBV z#SG&w{#?BV6N1&1y=8#NR|p!^ep*Vbm!ULoLGZqszaA!bgvVYl9I5h#j_9CJR_Dg=ILJ zA6wo7`u;ExI4NXZ7CWSzc#^briARXbd4l&z*H!9`vXH5X&ubycE-*h=^J^~G4knq^Va@984%1`27$!Ce^{T3zW+shdTUx0ND>7#y1y9ZwIvs= z$_6e2sR~B_7#?IB45-AX%!KAsdl=iPQ3=lJ{xtwrA~&C;1TeW6$kM$zNc#vD>TeN{ zlp3nYZ_CM1rTk)0rQ|_#r95rRai#dxWl8@BRzV0*H-i}V`lQJuy!?e9`^fH4SG+p_ zaApa?^U608`AI|0ZMHccP7oY!9nE@(y`+F iSAj*4VQr~cIErLkaT3YKdTwps-Y0xCsLpR+591|dwmoRW*5eGOQazz_V59zKaOs*tCjhUp z9WQ&|W97>5H>T6`ZMlacd%Ox%Y~p+=JHs$-$b2&gGtZ{L`e&65V!VJ@0GfpjqHqP+ zRNA}4W~T}c-qkVBE=$E+;8jmb;k_0!So#kVo}pg&O)azTAj0z`{@*O%d;U-3dx?=~ zNSO;qWiSZ=4#z{Vn@oyxd;)#SQBhJ`5Ii$69+)RVVQbK?ws4Zv-`J@IZv_#a2W8C& zvp`c|$lHap@eSgyZU{#91p2Q9(Wx^o=!=Tg^0*~%7j1-t&H z6%@$j6m@UdrUTN4qpG~wu; zPvN2h)B=|4HaGV^7er0|UQ*?%#B6A6J?}?>41?~b;BW}Y3Om`jY*5XKUhIwzpimZ1 z6w$$rn~24kL{gFpoR!Fj+D#e_Y@d@*7Vx6`l$yxwuQjRchs-{I#L8m=$Zr%zcStO5 z!;;F^OmGz-elaWD5bxU{!uOyq{Y}DE7nyn(b#U+)rGJuRM<|98Ugx&oSgo^O2R#Zk zPf>!VQsD*6sQXwbgwb!nmtn&rtlsMgPROqR7hb{cpEuNeoiqPxfBR7eH8k!c<<(fc% zS9<>^Gqh)0s`LmOXo-x)%*qc)**0bWX&(0}QT(|>Be#BurL z6fv%Bl0A|M{&2;ZqDzn_In*Nm#bjyF`;;~7QD+QfdkC?iB3i*ng7;@mw)^?c#s290GS6%cpY!J$(s$JEpue^jYk{-XeCmE6 zui_zgB~jhGwcGAaairjEIkV!)Ni5F)SAMr8?APEl7yghprAZ&qMPcx9d>%@lqz&Y08BsmhKPX2? z5);J<8YS=ehFs@+N5>EiysoaqcZPNnQ;~C}DTlm3s3;tPq z<6yca@Xd_(4fFf%?zzIj+-Ueqmb*%qt(>8&`Am`Fx1h#L$ey_ECN~Suv_~b` z1)<{SyxsO(O&a^*06i8L_CN7?2Zo@;81x#~aEyRm}Q^^Z~4z+13(DcuKy z3;%7ZrM3S;A82rF7|88XZWl#0Sp6LD8waAaR)Q`1c@2hm&zrW5$Gmx`KwhbT0KjR&=uV|02 zx{tS&C%JY%zX|{WCpb`#9p*=Mg-X30#>!rgFFmKl6Bg67(L0RVTmv0z-Typoox@#W zDQYHYCp(q74z;Qu1U;WpJ~ctAsXTohLcgi|cJc_18@1T&rOT@uCfml>&ok)8ej%#6MEhVfQeUcSvCWpNT7xXS|CXCp3n;TLxLW|0aFZiH*GSfd7!$UwR*33Zd_R{gFL1qet;cIKLVR+ z{js`b=~w98X=&~C@_YTUeVEK(JH2Wou&V9ep%5WXAR?AnijbZEP2IGGvGIL6&=oe{ z3~768+_a6_LQChU2typqK^AuI?A}}1j zP#w`@hFaxbd>xgMfsW#7Vkt$8eF2p@5A<^|B^a2U)4N@`ua_!beOG{F>LPhoWb3h4 zO2PEu*nZga&=cE#OPuEDb{6odEv%)fptdrc0XVQd_XgaA1&8T}wzYrbWa_~9O%)uSvVHILuHe^I_}Jx5Zzc% z)3HeS%!1X7O?Xq80(*XCeLZh5)Vv@T?znoYV84vVeYJccwz=HH-$P z8#KjF=8jmi3Mll2Y~g!CKE(l_6(xk@bM&?_d=XXvSu;Web>LZjs;6*eJ;oG~a3KJR zJ#>@`iS7IarL3AKin%A&Lsjw9GRKYTndp{Z!cQ&g=ZVL^j%HyO0+~HrqN=FHF)O|; zd*vywP2`EpoA~!dxzWyIIc^kNA(!YLr9|#5P|*q%&+@D`<0L}k>99GuB7KFi*l5X( zsMT3*uST<`E;2WcY5REQ>v|o1fzM6hF4`Ka;PYliThd~xf}yqMC>vkI@21%>M**q2 zGEq%&ilyuX3-HLvwuIkU32>ue&P}e^w$+e|NE<2)#Ae&7$5r|DUm5zih#kX`PKlHG5qu!}0>7nt+u7BET z@8rG0`ET*KzQYepyn97&pfi;v7|BIAV@nhTT(dxT^M? zDBoND`uK&5SDdsA^J2^uC!Rh|Dpe5k$Z?vR7QB4ZSC%*gX|FSYW08O z6{e#;p52To5$mj7WL_qBMX;e4ACC+4Oxzws^gmUn{@fhsPC^p=a%_h5%s+%ZeQRE{ z3+P};uGSvV#9OH$bp@JiqXp|cB0RlM|MYxkeJ-Kx{uf%>GF8+YJ4gMMF4jdU+G8%G zra4df51HbbM4m2>#g$|J8{gA4^03bKrtoH)*tQT4m%L!jXw>1w=k>Og^)5sp{bA4p ztK)Z50AFcl;P4*omXa#>FER}cHLkXjmgBGv*|16Tp+liUMWv+6V^N1$k*9G9w@J*@ zwD%glbw_>u!sc5kdsN5vyW-~v-gO&BzR4H;VNi7U>dU1bZ{1NvCrqVL{sdFLx`k9( zo3*t@Rb7|2V_8u_SwmY9Cu>h#SyNR3sft{v{C?0eS^mU^Iu|`E#t5{C5p|`A>T=3( zvzQ5*QG3|fQAHwCh!`1L8-G5mPV#baBy}aZ+P@gOnEBPoNO}aF?cQJiIkY!SOl%c^ zB35CkaBH03U2IQ&1Pa9qjoQBtG}YK!j1MUfk8pyTe2t}K6$MJF8;rf>LD(c#*e5r*F z!{rb(HY4eZ%Ja*i26ZaBtUpxgDq@ReP;yoDQNz;I!Xc{a76$LF5Z4$T!#eB?9~GB1 z-7O6Lmme&+h#yi8WO62NM;YqlZy9shqW2dS6Bh%RD`8>?Nm2Nzy3U@D^?Slob#2Dp z2G5+ZJ`zw!onQTl7xiSz`GFT31rCQWR_?dd!UFBx404@iT`eWn!caE09vX^L;Hg+N z)iqUkS|7VeQBZ6x(IBc-C<4Q9nkJ*RQ_pUFl_a|PRo}C_MUZ?ID9vEJ^cl7u4&-9P< zuQhiyPc;uUFE#i4=Q@`?&$5>`)ox8c1<(5{dM&ol zPjIj{t@(q;cmw?*@2w}hnF7>)(m!^OdNaF;ztTS|Uw)H*Y`@K4Ht)Tc@8Y%V|D4;N zLhQf1X0)~ZzVH0L$_5p5yF7O3N})Hocm$e+L$|j(b~-nZbe;@i$Es0c&n!p&aTbJ)IR~Gp@SQ^HaSH9q zEh43V2uVCG6>b#sk8+ht;GHt+xMs*XEfmH&Nykxh2Jz3Pm6)1ozUxXf6{Zs7 z*ddK_(R2V`UUI@od3NX|)?_nca1!UOS_oR?2^M)ElPB0`kzfumh%>gVIrJ30@CH5> zz={hg@W4%vtJ_oip>H8wSu$~m|Z(wOV)suk@l2aDV4wFuXCw!NU8 zm|c2Cm-voFqio6j3&GI2M#!8r*D=)=-jF2MRMO+{*fy4MmNvB5=VU=~k>Jzuf9}&~ zzX>hVx;EJulBvTLXkjmsP;0N_q0eJTKwwt1n(mp^L~Ig%nbsY(U>0!7LhY~_nxK^x zIPNMf*`>4veF53-OT_fHK}R`Z1!Xxc%eESFmfv?p5rlEY#dV>ljVMTE@PlW@3F4Qi z%Zp9?cLOe7-8-_-F*(vg@-f$xuH`4*6*Am3X!w<EJpKCCCHk zl@sO4|G3TS$}sbXB?gNA#AeEe$v#Gj1Iw`>rqY(VwX=a|=z@Ge!{bV7NoxY(+jYgxBbi~(A>9z*YBLsH|kt* zLB5PMU6)J2xVtFTjm{!#9`xPo0kT!Gh?qV7Mvie}c%+*K$&K>wvcuHnxfRyv`KWgH z!(&M^%)^G)trv}Tr#V!U0sD4Cq}qFMXUV;HwWs<0B#*3$0|V3Snxi|Q?^fBas05hsv^YY$FGj#x-Z>)DUyuDwHq8 z&)(yAgj4d{p^Xzu|LefoeNnpuv3}NGO`V1qb6@m7i#Nu}v$Ml;1*S8ptLr~$;R9({ z(~3)rx$l_WMz$s2KqkM$XhOKv>gd&S zRzeX5_x5hiX6Z^-CG~8q@aB$4%9Z~h{U>`1ZsmhW8U$ye-e@lo@}B|vZlHzmPWQN; zWZ(kOBxL^Q(36K$R6!t%(LjaD>*PxEc%&MmikyF zHe(2B2h>%t6u#%W5rcJxjeDTIR>Dv1!&K~rTU_gZ=Ek1S*g&>3`y>~eSfw#u^CY-u z#L^6fg}EzA%FFI3vVcEJPX5a(U9%Lqyt1q5v+ysl2D9;sd|?US&xQ!hejYO}i%~Q3 zk63dos8kqbe<$WZoC4c+JEYn_=Uu^+*$j%fPHo^(q~D*S2Bb6D=itZON2F=<7kWeB znbhHjy8HxsfP)Aq@yyM5?tUC4e@C#9rkFta?Fk;ncd68Lch|B_DR^U&@mLDTr^T@0 zB~w%h#Qw>xW9z#C^;%t=30<#ShnV9uf!0e4fS6y0JqO;<#!A2^ZMb|GDX0m?1TJ85vv^{`hAT}6(l$MR>`HnC z9Fg&PPZ|6pVoE0hGZ4IZb``(%D;JN9 zQySU&4Fp8i0U}G9m7Z>w{~Kx}uxq6KSu<`AkL`|{-}d%!+lboOu<8of^*h2(i>t+Cm^`WS5H2xy)yNz7^}RX zIHFHht8fSNc5Kw*IUz+-dP-tZHSqqcz+3W?=iIdT!uwrde*L z;gK?dTLoY;fIP;g-@BCGL1tDmlH)tc^Y|c3F*jNLak`1ug%2$?d!=~itO{`MOsJF8 z(^terA0x1iy3+=jChzNu9ieesL#@beF~I#DwurpNnHAcRhNFVjO4&Ls2T^cnoEU>;I74?xjH1G zI`N~(Gx+4hF_`=4&R;5#qm4O+_$pw7md{!F@d<;%5?%t!uB{-c(NJ8najJtilsnhe z%!x$O(6jZ2S;t0MVR_*{RqaA+H7&lo5iA zcml3x>xBJQLd*u9XYbxM7~eD2PC4+`c+ebkA*NsjH51GBFs*{UzL3hfAbDxhp&V_ai z81RrIFkSuW(_k^sOmAd+7YgObqz9rCq6sYFvg4jg67|H;ZH9P9G77vxazkvtlVvH} z(e>;^C}DcbX!9D0ak$SXyejRB6vF!F(>MgmYWDr22OOKG0FY7&%bO3w$zz0&86bW1 z*BzaU8gPD@Eukd2CB-5E^dR^KKX{$XB1&=748q#x<%|?8Sflt1l-xJeORcYEJAWHk zoFv9{gRCu*=J#RQ5W4inT8nh;lexblVR^*EEUh7l&+atsPhjpIU++`!IvbySVoaN< z{i@NRCtL+~-nj4+@_-H+2LWph>e$)%Ldz-x_v1F^bX@=fjdgSIbtdeIuEFJgJr0U- z1QQA|K}I?ssR-zyT6s>T+Iq%#)opJfHQ82Xzbg%dQ7a{vJy?X~SKAFJBCKb8-y9`W zql=(m#+i17v&vA{M4a}1`dJgZ+`+sDy3+n)GQ40)sPrU<`szeD4`zc_Jrfhi8O{dn z@gv^Ru3rzCGF@6)xz3T_;wc8^iu5enUQ1parQR|f!tSRZT%6`v_P|bxEvCWO0?fqU zo@o>9zqs~Z0+_!NF8Z0!}^xP)`uDxPT0ET+-85TRWZ{?FvASQCDhB`X7LcjFkCr?&x|9+xP%yV#1sOBcP11!mavuso&3+ zNM({!*>p(Ycb)lU4AYWH3TT6eJdCap z^FT}akZKFS1snwjQ|Cz91~9Gs1z{ZAE*giSXnaa<@V?h54;@SmC(j~nfUAMU6!*V3QH+!fF7{ph^t{C5a+9%-<@1l7SB>P>2~TE9Cr2Gm@AU&Z8DGOmblV3^*q?F zc0b6nHuo)};>wM*esh|aryiny;|CTe8|hXNx@&Z)7sjOYY9)rTk47#xYu7G{Yfcx28Qq&l`9}jaaA|&C>IG9Ti4{NLhu5+!&ZMGPeJfIp%{p0XAJkPRo~igA~+}&b+Rdmd*p_oa73>=?;Hy` z9XwGoDmMMB+UXDQHDXR=t@9M}oGh-0vI(6#mQ94eKV1V;-V1@ywi(FF@~{e>EvnmH z&_N8xg3?g@;NqF|rz#Pc*`9UV#~NO%>pXyA`|&3iC@pG7ND{7zpBaL&fGt3Ewi?z- zpNuDA#HxzBJhLX89<>j@65Wu)Rz?q0HTYNv;Vg5eLBVi*>Zc#sc5qgIJGD}(o#Q7F z%&W9+>`Lwb=^V06dbj2xE}eCHLZ)LpvN``3j&Sm+%AFN}NrX6*(()yUB8qI<@U`ZFAipv0Xma+^pzM zGw8cxKfzkj|4q~|0@gX4Hrf$Mi>^Dog@J#-b&@vLN|H0C5EF%CP71>Y3V$Ht+JF5j zC~RV7i9daqgsC|y3Rqv-o0!GJ&LUB5tl>61oQ#w>6M1?N2FQh~sBiswk8Fl}1(>8% zVw}50Z2FBBBgdqlcyW-F=v2eXd*$S0UZ~|p0wvwJBomAd>Zd!dLLS@H_ zqFhu!b&BN3ODXC}RO0calG7H-Li5zeS zk7`=fxk4ou5x2){{4@BL)f`tBH(_7LOQ6p5k2l(MG%RaKrg(`ZpOI@B02gYcOHja= zm~5qpyl?dDN2VXWP1uSW?vjQHX}v6b{v;`c$JmNx?W8AzdLoh?%?n;FGwbFI54u@k zIHgzjYG_-!?Kl%JDA%1R0Z}%q%Q8Fr;8?7p>?}BiWjS9eHPt>DSJ5{r<>bIkKirHN zQ9eOMtZXTSeSlB3RW4qf54n>}%7I-E9BQ}vx6s%aWNP?(0}L64V!)IPCWjfr@q3t} zOYHU${d(?}NTZDfi)_%al|ReC84YA7!DXW78mKX%o<1HKWfCS{w$nD&aJ%3d_` za~zC7h3kyS63t__C+-v!8>j0BXrh~ixer~*0}I-s#ez%#++ebSr8JQfY{D9CVhU*0 zwUAe}f`$*C;QUlktS~3HS5%7sjB84Fk!=mPWOQ}17@P6_g?Y_xJEp-wTLTw&q;^mz zTk?t>d?s~beBv;I?Y6wt$_f{8Tw&=3^UvRtMJfwx@nQrA;MDZ!vcDx^O*y8u-wuq+ zD`AacL!g^D?oY_BWp#1g>y)O?gVJ$P{hXZo1EBndw%bL>AX!XnMm0Kvz|4U>i@@Uw zOHf$jD*=aJs%DLGMPK{?usY(G;>s?5GmN0oIg;gtq{@*m60|8)g!Vcpn;&Sgi>o4} z$mF}-^2CvEv9d%GZhj<4oP8Q{*d?m@Gg<*$>C`D%w}#-{2Iq!7zE}dT`;;^d6kRnbrV&TKj^g=j}Ru3vTl<+L}jT^-}PwrNpI)y}s^g@Kgp>duO{h7lBI@IVi|P zf=R^4O`r)5WcDt22iZ3ubw8YMe$HnCsa-54)1iYjnWr-&dQrnsu37eC{OnS^Cz=)T zDDK=K3Kl|IS7rsgpn8UekAd;H!6{ivnp%%D6XRnx2??563NjckLcmPvT3flYp(uoF zAEjP;1Q#rUiB+)3FVZ!z-=0J{20Mf@i?tr`6H;c&_WBdl#8x|%(II^*CIUvlq)@?B zCJC1gmLH~PuZQQbGg>{TID1Qz;MmLyW%Tx0(8P{V(+rxoSMe~epX55PAKBtSJbTF4 zLcQ6Q$CU#fk;Pln$N@s|bn~)RWv)SQudYS9ZJkPS5AeDAu6AsBWR5&&|IPRr3L|)H z4TQD~Bjm`ekzI(l>-==I)uY{Bnkm05ua2B^9Bqc?m`O)pOBwE*twy)xq&oq(=sRS= zs52>`;Nr|-JixqcGx=hq8mP>%+5Gj}Ng%s%6k*5pM8_>{FL_K9Sh~>Pp}h8I${Oq1Kqjd!pC0{WFMpUQe;L13o8+4m7$7 z?#LVu=~;R0FPrUX5$l0Cc7<~y-%{R_YVv?%eLJ%V{W7XraSKW}Ye1KoxIPxc(i=(6nVYS@p@k=PB5GkqJEC{NV}ECigPdpEUYhx1 zYygH$P_QTB#?69na_0@7ReoWRR(AASeJ69oly|EbRBScH%kGs;*lzV`(lMM5zv%n*$J}#{PU;DKM`*n z`!~GamnwrDUlq*&qAkXVD8Cm2^r#vu!&}S=A7PIeubChZjHCu+o3K*n#5j(eng!v- zFnx*Odx&=P;Srn6JE-+ARdTEyWL3p+gg#zoP5)1EGOaqwVf#^oLx}>8S}$0+;+Fa_ zA|#b!!qXJPKm=YsfG#b5-G-=3wIOTXH|S(B9IhK_WKJsUx5vB%ftiRPB@w#NN(y#e z696gRR_9z>GvUf8i(4cq=4fO3BAaeNcdIBMuYhz5$(ZrO4#Z%+8{0>-){)@TW9q@E3q#g=CeMI- zTh^emEtHyD*}nG@`^KK>wNr<3`)jj*4PbGKJDAL8+0VqRo^;7VVI^V+!VlmOGg@#4X_y)rA+T}%C-Gas_NYN3fIb4fqv-DBT zi_A!X^&$pXR3)0_XR^VzE*6_HDUPp@msT&E5aoRj~=Q*;cuoYzf(at>W1VJgP2 zxgV5RWR{FG$6&zComq&i#7#aKYCRT%%eI48nvkc)!Rp#BY0jlE8*$qFxBh#-nx@hj#>Nn=OOIM%(Cih3sz0^@+{@-3QHBLm*T-_QQvmdWTwyb*i8r~b zgSG0kx4z?B&*aW;df>bWYBjhC#&Ov`QxaIwQyeHnt?^EEHj4DL3D+rT%6)NvG-)2W zIM~yUik=DGCC+qy-?3HUr|RR#+uTVf2^`3{!&K89q%y34KL?wNA2BzFz49z_0qG<3 z4JFFx&derHf3?@GJT z*>kVaP!}^EoVPRYAGcNjh{W-GT9YDn2LmeWOmefr4$~+cw2{yjATFG#2j}@hiA>^3 zVG}W7BV)w6PeL0bYL(%JUZLKovOh@$0W;N)&1d;wGZyRz=U~dMah2M-LGKb|JJ>~1 zv5&%L&O1pByc4Kz$R;JwA}={;v^-<9{$y9dm1c=I zQ8iimw*7A@YVvGhoa0#vUkwhxIEYc&YZ|IFWoI5%GuNHw9eo(K^6^HUU>E{ccbV%D zu72U(MzW@vobizx_86TqJqPEh6%OL>J*?=*8!2Qc|G_No3~E|~B3%cuG)}y-C_YK% z0@^Tzcp>o#tix%Mg3t@N%(yd6lA~w%5nM4kEI`SLWTuN?3?J*tE&+r-obf(>E)uruM&kaP-$ zu^={UhN3%%KR#fyH>e1%1GI<33Z&4^`4SoNW`PkUc+YaAIH@2VC3`z9sH9-p5I)Sr z`zZLTd$ae}#fk9#H|9bC(CYn-@88SwUi@;E0|+8k}wJVK^U!P~IFa|FS5K?hN#vfe#K>7ls_``ImvSB9vTr}6``~7NZ}~WFzAtc%rl)8g z$L0dW1eFB)frvc*Yg^I&*Y)2SJ2C;9U1@YIgC%B@fw+WnbXVqg0?fK$Ip{igdvm9kF9aWIh?Wa_zOub_{K6 z?_nzfSvSv(;9J_UpSn`aQPmtTr$erqz*qaR^qv_`{kx$VM#GMem?JtR-yKl#;~kd^ z5`>*9J!vHfMZ;mwUQafKTy>jq=eh4=E79ZqVs>|wRcH3{=MV0JX zh93E`x_a*X@JuU1Ht3`QZ$_F#a3%;L9II ziUFjZf*aR)wZM66Ta-X1^2prz#|>tMMV}^%Z?2|XYP$RrmM@*d)%48Zn;Wd28VF;Q z@XXT(gSSqM+#LJ}tMdy3tQ#N&20$WbDm1xL}tPx5q`QvCl$%4Pdsq+DrZ8&fAUMgk^QMmBm;b1Nrf2LgIgD}5(p zVPivEBV+pi`vC%0Hs=3e<0>=SF8o3G$}t>~2#27;j`$NQc_s*HuE4;cga84fCrk~7 z(OYP*P=jULMo{&LEdYzJBJk(Bu49=gma@p>ZiH`T{ z>xVA%6Of+-fvhA9rqlQ|eB7T5;9<%s^eNKo85dt4e0m3BZLI1I*QLzI7X& z;k@P|Tr_nZT@%E5`gMy9dmgH?H<7;m9@|O$cqYy5CU_-9PO59cU-sQ@&*1$6?NIny z;Olz#QoP>r;Y|}Gp`^$g;@Vo9{Bafy@hbJkH;@1JJ?vfx3~~Dv-8Ew-mtG54Mb_1$ zKCprwV`)w*H&_(!{ z8Ek2?&OczX)hczcNh{S!ZORB zxFmvFB&wn+z_SN;_As3jgk9i}tCY&Vt-!SieWGk_w23<*YQS!t3L6?F^}wY;epaJj zD;d+>_lf!-Q%zQ(KIG}W1n`Ir$eP%NRX_xe>aSL^j%w{{2(QIzR#Gt=FsM8;W-<ec{{f9koA3?KjyDd);x_CI{FfdmB-4}nf2KEGQ%DPVcd8k|QvGCe_3QW4+ zR9gX2ap(Q#rEz*bVkd(C;9vgHeI29QVY7zlQPj5)kgltY-O-~!ypC(3QSKi(Rk1M< z>O1bRwElPWwLXK#q97AKX%!$t4EQ2VFt=*?pMVD_bzDiJRmWLT}NBEK+y zyhszB=>@&KO)pQYd^J;)fu~iO%KcRd+={~S{W1CPQ^iB#CPh-fTYQ%$d!$q0!{Sww{MQ-bMl!7mLzGCn_=0dJ+DEbWv~JS z>HJI9nWBE{zOvm?-7D6+VD!O^{!@qobkQ6|38Dmn|1Tu*|9{8#iJ$kzgdOSUx9j0& z6OJL^eHrr|Egf}Ht@GXtUh683wh>~{#f$?hayU=Ij7%dcB|n)0&sv2LRbIUe%-MyA zWFAH+hMyTxMxeo;3_}E1cxL6px_!^QOWob~w4%2JDpt_ur*8%-DT<#j2xPVxpu!1a zKbX1Wr9pt_2OtuQgXr;Un^cSx#p&VuHQ{}vg1$R>`%OcGij>((MUek zT|%p8Uv_Je;V(uH{8SxvouEGYW|B{L%OJ_bVc-OH8#rt`6IY~Ph%N?~#+Kfg6wRb% z(6mjlXx_PuQkSA%oWNvI5`-j8`t$!f`oG0m(HQo8{nUMXiJr=Ep7t8G0;EGZp3tjS zwJ3>F?MlDmq{&aih^c4&n}CSu)Ghoq1JPM(n(C_*SK%H}!Pw}TSxHG+t=#OcEt~sj zxV|TBxUMIB)tz%eGmT8sKX#oM9NK{mwar9ilB&>;7y+Qd)q=aJnvL_2GVEtT%N;LP z542ur`iHU0_x4_J9?@q-wJLr(P)+?=S%bO@XQYduxrdIWp((75FC^HMq1z;}waD+D zN|y#xl(hDl-Bf^I+)MJXvU(_at>KX*5|@eMFhuqgjL10&g`br*zbEanW6|EVCX-u5 zYDNmoam|pHIip>Xt$*>VjSVTE-sC2n<%sns9!{J1#9R`ZnFl7#0*04{+H#wcwaiUz z&BZ3)HCj0|)1FD;460CacaPhu4ZBX-VzaZe;&XE1({plOcgGUJ;qd@u&s&{cTf-hx zguj6xRmH485FhLg1NILW!Yy%DC+Mv(#XE40pCti0))03&e^u#&l%O2bHIDi(gLZlk zP6;oy1GOJ_%wJbIjT_dTHJ)0UJpFVa+u;m=%TP_!4vx;sv308JV={}?e>vbIGDnX% zQgG%+a(X|P@^U!CrMe?^?CD;xe5~b9)v{G8s`?Aatk-#M9giE&c4A#@Ub#*)9~E!> zfGo8^*y8wLLXV)xw|XGp&OJVK)B6~bO?7jQ4AU$neqT>ULr19krm3j-ob}`YKo^1M zMSjF>YmKSSP(6!H*g#u0;KKyasKINZI-JtEFB8vrHxPo`($w{2{NW?~2V;^F%8Fn3 zyB}(LXmdz|@(s#7f51L)f4j|bNif2y_KW?xbK4j|+nZOC##+z66W_~;K`3>sBTa5( z9jv2*-B?8&8_XQzLwvp8-S~PILRI5;&cnSN*2dZxC(1G-i}N|N!Pau+1NeR* zTJ9T^ylSCBXT5lMY|&g?JRXCm$~jB+W@+}z`>jT-5q4zXsuR)_22llnr|0_x0020p zP0`?5^?xYSO~V9H%(p4*ZIc>Ml^S#HxI|AP@~}e!ACP!e!?XOVLW!t6J)KjDGci^i zD0u1`J@nC#auOPtIay7~tLBUV?SH;0G#f4qC2hCzv+-wSqBfG!5b#sQ%Ux_YQd&Gc z*K>j+3LwSKFJeh>lqtI3TaQ&7o%LCDn(qSP*=!^i`Eih3@o)5^glfMhqdouBoZy=A zI)`S9#{uB>4_b*plUptRe7K8B{jf9*S<%8d@UMZ4SZdOs zJ^jdQSg?g9uU_gft9mdS9acJE#A;Ma4$YykCbftqQG=+C&JF%}ngh|ntly#r!a<_Q zi1Dr7p;TihiBhS2ciUV*JC}c62o1Ht7Z%SgZ^lEG%=luMLC;`+xzvFngihTq}7Qn#>iZ%eQ`Wp=&ToHQI4J8yEa7AAHc^P z^(Itm%Kgj2Sc4W*N0XYxPf+kDq_r!_$uHMtswIAUU-#}fe$=H+VGp>D3+g&zo}`wV6c)1L+pFjUu$>Zm_35EWKI+JI1aGKG383N z-5}j`1aLK1OiZTDZJRIP<&yxH`Bs>f5NS`8WR(o48d@07}TLa_e*;M&zg>w z6hKc(N)I@iR}?VwEDsgpht3J#DRk9CPMPC&`;jBTJ|`^RRL1d}d|sF=^Hr|$G(3g( z3E7G`M?_qli{oPZDHe+96vwL(7kPcnzDD$zWbufM`~-zv*YZPzLLX~hEI;IUQq#!A z!8q11AUs+^j#naOEVKAZF5SocZ0G8Fqv(-80GW_KEMktsBl&ph-@l1D-8`Vh_Gs^) z)Mi#=4tz$&*ixk6bd<+pj6Ypx0(c%Y4ir6)MmJyL7MfaXVJ85HbSx&O*V_WJnj)wR zb~w*to`MdC$KkV%EB#bG96|e32-St%L z52uyUd-7(0)V@(+ocK8<(Nj9!dn7(xV=aOzPCg$&hfRcg<6i~zK4l$@4n_mgv5haM z&(`1^$|ye1x^N71Ml{_JCdgbicBcYaO@JFnJ- zZq*OKDb8>6l{CBJZ*b`LL`U#-S#I){n5$MT%KDn(q>ox;qXzi0M2kXQV)5?QtjwhCg>DEvaePTQZ z`8$0b<8tX%IUGT()%3+^_K4+91rvXE&z;}+>cy6ch&#EmAbuweljP+ciX07mV$1PN z^5Qw=!Fg+EF3-&P-Fsblp5N?ik76_-NJZvze^$KY3AcBDf2T|0^W;6!le1sN>Ayn* z$-S4W!#cN}(pnj3U}A*wEs#{X1m>bWBE`i&wX&aHlu^KDbKxNd^~L7sA9zlpwlDC_Vyxl z>&@?5pzH(9#7{BVj&xX|XHzrjsEvH2+`xCA=ivcc!2kg4Sei_G=Hdh7u^LUwI|_*L zBCCFkbhGXQ7wy^U7PoK!kiZ!5HZ%rdU3puyRS_x7ety8_!Rin#9W{0`y2ge>jfp$o zRboa~R!&Y<*7#E5*^DML+RNUZ-6rFRjSsMCLbc|*w8I4z^XNTrdpY0BGFV>mqMFms zS{mk}@BJcE4)^|>%)$5wX)COhSuJeC-_TC z+3D8K-wgW}A3O~-GJ1IuYk7;_+N#ez^ewJUO$d3s6pkD3L(nFf-B(0BWjnlL=AMe1 z#6rUK7HunM;eo|OL}xG|yfD<cC z!6Q`>)4s;ithA!TA(`#G%xAXOus{?Amu(9N!*4_%*(ze>m2Uca-uJJ(@1G5ZPB%DI z?Ie7)Zi_0iu1YH>iAhuNF-Cnf&Svh1ikTpkw&Yp>#UWW{A7b3zPo~MimiX%^Xxjow zadlV@g&r`m`Aj!)bxiz1*YWZF;`lRKD+T)ycw-6>k=Ne8zGEYV7)sU;JuJii{g|wCt>wA`+q5t-TH2rbqB~s?@b6JMeK? zExrQQ8j@@~)oa^cf)v#AR6=Paab&hJ5)yC6e5ukx$^55_>%GAMdW3tV?5yPatzlqb z!^>Nh3-zM}8)7|ENKoH(G$pMmzl`@JwC!C9@JEd>?l~43xTV)sQ$&Pq*Hm=)-gejL zk+k}=!rPF-FDR%W;kw31f&$Ruz2aU(DUJn=Pboj(o_Iu7KH)U&302qSSF_9ftHp|k zX%z7*Xg*3y?=h?aA4Bm2y|w<*$W*P3F@i{BhoCz+yHa3$t34*d((_jE5B@Arsb{oZHt z=lU)5$@-{=f4$MsmVlg#dIWjG*qc&hi42Lj->FBZ6~o4F-lmK`{eE^Ee+Wd}AeR|e zbH05=nYr@SttYd%+i6j~9JThU_4HnD*M`S-tp8xj^-ki{(=+L7__qfdsbz$6Y4BxC z5U_g|mozRA3%S`ZWtH+`<{{&y4qMqNw!hGg zDL;d0Gr(9bs`cx#UXF0hz!Hg~|{%k^`i4+(K|04%F`1cH_wCfMS zqJZD(|rJ zQN{tky~#}9k~yfCToZ*?Sz)s_K&0(pji@$biAFrbztpgUlqq>9-(Y(WwSu7(rZj+; zfb$p?iPb^2#q)@3M1j}wfKaPU3s9p#1kMJEXr8@!H)LKlqg3j2dI1I|J$s&gZk|m> zj~g$0e}wI^XyM@EO{b(v*j-ygAvco^PL4^CeO%M6ZtN74CRLhi)Nc28R1 zqm9?TlTY}=LFc-sRMl!y?QP3=SdqO4y@u1CALezDm$Ga})HB{~d9|NRE$X1%k{*b0 z;~e_r^e+?W?Qk&v{w{Df+VOla*zDA z_ML)Lt7B_k6qhZ!8T-!Tb79ZDzWr?;9U+5}Cc6)pO)osk%nDbRTe|$#_%j-Q;r}5H zefP3iDcPP@n(1aZYRJrZfeo+?tXVRbt;=Q%aO=ZMj}yNfZ(zJp8Q$R9Cap`Z+{0ZlJ`l0#pH)5>_KJhprTHO>X@mAr z1woV~v#~fiCYggac$7~ujKuyc>CC}gGZHAf1yQCPZ)jALzA0S-(zoKf*)CNc2&k)Q zttJ^OJj@;VdMo}<)tJ{TQ(dxlGQn$4d|uVBuH0~St^pTt2i_)!X&2y2P<>DUxBOof zN^Vt*Cm0uaraA!^6`Nb|$JbSk6r~C$xXSKXhoxIh)0-B5D95@K-S(=Lu`M@`LksQK zx;x&xao%07MTtjYy61E+xL@UGo41c}8(qlOb@muCeRozRt%8|ds<8q3xZv?IL=L3l z2Cz322K73a@TcBqhG4`eAYu{)K}TsNxC!+$2|897N%{w176m22wMF5KU@*Xp0gjaKlwaw9N}Ov3_n+;qz&ri z9_5Kx!5B?d|$Ad*qGb%&7Yb(weB>~by z!ravA*Y?No+S`1SowHHwq=b&8gv8RkI$19&n-A!%ksb zY6J2e$AoU$iJwTMx{5!$z|S(!!tz2c#bBf zySQGYvb3S$;r`%?egDY!9b4KOjM}KDyyQTgBxuV@{?%^Ztj z4SR5<5r_p6tBo$SjvGe(E-McJUkdrI(@SfO43!TUDp*P8Yjxd86KZZ#=O6WI(PTor z(8j13SCTqy!0721xXsI9CS8hyrp%509g^Ei0+H6i>R|FX8G_4=b$WDj0D6&!L#5Xh z3x6F8H6lCYpS>q9SixGTOliIpc_vPcYd_znKB;$(WDvkxCxgw-wuhDW!yUmt^cLPt zn(r)a6NK*XE11VYrdq&ItF{rLNDEK4+oQg4ndjo+S&UJcfch9Ywb+Y-3^P|)^glJf z{3MzQvI#KgHIoX7XX=MWt|gu^9}w9oUhRmTea18xV&qH{*>xMsP4ym90;C+jKKP^; zbLL%E3N#h4*nW5eQ|i@MWG*KXk<}NgR2@8Cpa!VV9|#{eyo$TdVs*~x0lc?|sR->= z!F0-ZE^{BUxvLbaTO1h2$^iW&EG90TzSAG-T(o9LVIh}>-oZHVNXE+&CK9HyKQ^`j z0$9tR4R{i=gf%{=^fxLIukA5z0;-};4`I{Fv;J{Hu}oVLv&?rW!1d{Iph%_=yjm1UtHFM{QJ70;$Cb0;#vjN2uL&yO(2J zZ*4refx$jkqj^XwhMX#U4m6=lf`WkyDLRt_nCQz0k!vePNw6MkMr5dfn$V=Ko_kOuCI%-a(d;wZwmymEaFMqrQQt-N|wPgK}e~lE(VrkE!rQD5zm120ciXtvP78OTEnxRtB!~1{VVUi*Vct`{ z?(zUrLMzwNwE41ueMZSMPQMH$@`M_R#tOwcJCn}iYOr`i=wvFpxe}9+W;3(chf!$I z1~o4XaGA+gPsiZ9n|K)84@nsgeqT%nd@ z2`Py&f%mlY!Gn`&JlPt^UX|NDV(h0ITY_D~goIH-)mu-V&8Fd*duxTW)FJ2ao}@9h%_D+;a5313UX_eItA@tK+FV8zci_5s@(_tyZxLLvZ&uN z+dWCr_fie^-eM|Js8HRO9Dj+Z{EHmh88h8j?NqPo3MvUJZwE+*_qTAf0Dzud2ISp$2} zK`o3j_oUd=Qoe?7MbOg+#WP~KKVN-N$9yxOnow1BaFF`2-c6Rlk*_XbzbC^|9?i8b zpXKs=`U`teqI)HY(Oc+?R_f2}EPe>sZ*?11_{qp9nm8Mo=nt4!O3N4YiGAc0s)AQ^ zDdhcB$^v6e31Q%+%}hd;uKV)rKtn^0?_`5i{c=yK(s;Azo*E)P%Fydzk*6G!lPQ?f zP(3!Y=R!`BvQAF2woY{?6sT`2Be|Hy?r@>?}UnzWln}`W=NdN|q&q z03GqP1=t&(!lXKz4`Kwka1lhQy$L~~v#DNoz3xT_BP*<&{8DRxE}4L*D+oxoUAk7; zaqcRoaK5?c`VFaSOnHQ?h9%~%Kke>CPm7hHeb^zuK=_43N;YRd&RV9qvM+E^5%je; zmm{3FwBsIT&)@{nxM^hifZTPfqfn-elep9Ron6Z&P$EFAOGCgqV1(X<{3PcOe0O|< z2`~A*!Dw;i8@v9$JA6=eRo6Yf=CpJtJ;^@BZ5CIcnh39vJN)pkP@Gn<=AH8<)PPSX z=?2$1Wr;q2j&2uJ4f2<)jk2s{IPN2l zBqsrdP6%2_r#L+2FP+h@WJX*tl44eXJH zI&AjhdPPBXes+rCQpFMGh26WhBy{dT8iFjA{Y()z(fk?mwzBih1Fz#!tzV&L{o}-8 z1fzr*-$ABcLFs=jG^9Tsl+OeTZ5f6n<>0n}TZ_c_@>1HV1JgAkMPF0grD~+I&uV3! z-AlG}_c`Cp@;e5_H^fk?$3n1a!75;8tYWi@mCy{-*@u3GVzbN%Q-!85=HOOzQb;^s zuz5dw#s14!!pQKy#*+U%(Mwj2{~$MYsd)cUQbzgS>cHpuB|IlW>zo_?2aD)$>7NWJ zIu#5OYO1jIaiYa*O|4XTY*yxpT{4S*LQ;jv14j7y#jnZ*Y;eiz;X-3dV}KVl`h7m7ybN@?6Yst~u(m zZ;dNWq*-c)U|`E!CyWVA*V=>f)pe`;UCVdBq4W*{xGkRL7}M~K^PX^2juqB0eS$9% z7xq|s_iF!6zeVj;j zU7+moRkXORn3R>a;5L02Y;~Y5MCnUJ;CxDklst9?AV1e>LCt~21VzyJORzJSA+Z-B zrp|k3i^d$g{bbwi6+p8NG+u-86oEpHdWGm!Klj8^H`Y z?Jpv2jYVF@OY$NY3{W3_pIW{k1sTEy5o6#@rAZpfwU=cXq(x&E4#+UVoO0a}JGlof z_q4ugd)^RfIFB=InI4V7COkzMy}4h^xc^Ip*Qb=nC<>=d#h7!%7!tU9B*lB(Wo@xgDQ;Pw%8hV*gt8`L4G zjXm3v#q7h&#o+M<4Bc^V#tz)+b^4`Vadd`r0gDei87_p2#3+sC1HocaDxuI);VL`P zZ|GwUSL`jG*6g3%;|jTap86RW^vB%1GGY>jB@pc^!i==Ay z9Nvu;4>{ z63N3l%WrT#{LCA4)^^7mO%|55O-DddLTBz}rbnyNA<-v`bYGT)$Ex#*lK5tirsqY3Pi6U|nkp1!#Xr)yR`MPR6`3Qc;d?5`vQ%GDJx8v_Ag-FD(LEPQ z6wc-naPsLMc^O6CC+}D9LyioB?eK0J=k9nn7CYrV-nb|3Lqf4tBmC5w!vpGku2P%@ z&S)P`McU1;B$}&JQO!OZjuZ{O4ieXP#I_IqNeHH|#()?pwFm$iJxqrYCyV}(nj+-C zP!O{u@C#gB(W)H{7fJ%>U7iD!agwP?T5bv=TiXrpw4rW|eujcrnP8`~&_n@PdG06g$ZDrV|zr zlu{5Q3IF~rAm0n7#GpTngNXVEg;?T`ys%NPz#E_>$3|!8ed}?@d8NJe{8HN-Kz`Yf z>pi__A=cCwWk8hPCXJxDK?1S-^P=qcKLf%P{p~Ly1dZzU^O+~D3QmTOkhm9hC<7*Et#QKi_ zcbC}V`QG`=L{o;(X<8}$!#hd;xOHMgI;`uZ=I`j=fSn#e%o zT_3WzI)*Rb!|cDRU8vG3vjc};%YW%H<0VYK9%mG$7*sP!kuf;v^dON18)L_OrTM3S zk1_csZb*wGw4qP`8o2iTif%PHq;McLVDQsRW~~0Jn%?zg3L*poAbD&_SdlPHyDNMK z4H&>AYmLhig4e4b#RT$`QN1|i;te+bioHGSlXkz=$i?d){N;PPAe278>n)AEFePnb z!oV9fOc6B>MC?>3&ZZ=uA6{gpQ&7>FUGqKL>;Zb@H!*4#hT0WvySo0WTNgoigXlLB zz1L0`o?Rbh49tQz<{Eot$ahYpR&i*FJ!7pJI|M|Z5r|>8k)=0(t9mLQ%7pVQ2wXQM zUSuCqRfURHKQS#GS_Ix)`>wB8=FGh##Vg88EJ^=*tqI;NaYmUkHJ4eRY%%90HAp53 z>&|dW@Vq*7*T5e$t&83?C$2hUr~xLF7#kR7tf_d2JT=)fQI-`^4uW{=60W>?tu0P$t74Zf8KX$dqmd&vftI%*4j0k*Iy;2*_hq!@-rDuc{N{K;EgiC zD$4FB<+tI#sXR;i8n?PvEIV`3GcPyf8)J!E=x^Yko2GA=RsY^qJL2k^q3*eK+12g) zm^LWQej(!7wc=Gh;#EJh0&0Coch0*6jQU3Bg_?N>%m}Uouc^!|eo383a}&Aadvk}V zov~VOnm6x3K-iZ$lfsn7IZ%$Ht9OMdGnF6bG%nOj6+6 z_m1Q8x5qt^!!=QgWwrVMwP0J*|<*;Ii zM1K5SQr{#}B6p?9U<^UMAEkk08ljPJXu@-i$>wC!;U{L`Pn{cIUU>lzWdgYwM+s@wb0ztrGGJ<$zYgz8>4mkNUW zw%-YHtc|36Rw#_(6htW!hWBX>^S5BflE+vkG|c|3UgT%J=_I&ny_*A@Bb5frjCdy0 z4cYG5?x|~Im-K(LLbQ_n<tCmPlruWT{_U8;(C(f-&FZj<~FfYto?cO~7j6cEStJbP zG?X;VG<-EQHSANEPL?=$97GN>J1;%WzgVld9IUs;y&E9!psByBVYHB6+;)$9O+j>_ zyohfXvqJ(h0;*uz$SiDTf^jHD zzhodYke$S4^ZyX*n}+d%l=-$-6eFIEu9NN7mN2{;L;3J3~#2GI7wT4+Q;TB!3#4%(xI2((5H zqm6Nzf;RAN+=tt7;6iwiYZ&)RqYs2NA)UDQ@}nn&y1^d^_ll#ogucO9(6CU^5Yg~5 z&{MFqa8*!Ep*kq*7#3?k1%+#FJ6x2-AeALv{tkak;=Nb5{gjdsQ@AR$pE!13B z7i%*IY@jdTHPM=xtgKfiQe0`dX+3G) zX~AhmXvk?mQy%sR_vH7&_b~U|_lovd_hN3P`ZEVYLu29a(fJs)Aa9^@k@&d1d|vu* zi}tAdSAuHbcaXlUUMBWzLwpgw%wJOXc7pNYzF9wJZhMG9h-eV&5GfJY5Q7m>5v_#1 z2agbih($$PiK}DHVrPkMBGT{}$@gQzL=Y#4@gm$<_QS(Uh;_o;X!or1wULYZPQuG*o0%oK)211m!&AXh#w4 zG?HOhm`hkoc*eqyB2y6=_)Q$=eWhagY@%HVj~VqR}s1J9As}(;Qr}*fvOk)t&7q_6Bs$i zoxcvC4B>NX5@W4+m3OfPd* zKkL8^Vuy0VaKm`<(UH(mQ!!EzQ_)qiRFO}@I!LNHZQM3bTkY-tS^BkBw^G_S92}3( zMrmTT5ZTCVzO|Md=!ALFUT3$)9=MEn<31a1&b96w$c}s>a$h6^i;h5pS!;{0E!&AxNWIDO*we|~ziRW$dSR3{U#S7FCsZ2OD0=O2q9r5jTUzx-%2Ya zk&(@aXQ3|xn7hxP7d}eJky^`n5T6YcZb|Hr;7Y%-p4AjSjOmZrkDZOZj-ie{9ZDqx zAIgtajUgv29cCt&lI>)8ncnXoz9*`Z15!FE-8Jtc$G8)Aq`pXACl2uwVo7tQ`7-+p zgNgPgF7K^m9=93(Z$5|;270C)mDYGfPDH{}yi#C(%Nsj!JLKXi_j#>B8 z<5HBig`K(e)JKs?wu*2?9|;ajM^;pcSSeWlxQiLd8gUvq7E;bdIw@3zI?3w^9@^)H zO0>=n=Z%Y+3bt}x+>hIf;EMPXkA*feTRCqY=N)C-iqD1Da=dXKG>^jP{O7NYagC*o zgN;#*osIL287yM!q~=rR0}G-h(NdXd#f8pAG7_2DYyfNh_4!6rbIbYV5^D)hwyUE? z_60uicM@yY_3lR71-Qb`q$kUDeDjh8u!VGB954*H3M>Qyfmy%+;5@M0iES(0$KFGz zJ&up(^W4ex?F9&VX3(CpoxGjN$NPBufuH3T z`=)Ua+FqQsbUM%}m$f}>WLw#QyL3|)s;FaahwQ!l&+PQ!rozV!HX$n>-H<;jG} z^U3zfNajqYn#oQwN2}u?Y0d`b26{)8;?W>;gM z_*d)Wyh&XqIg^|zgZln@gZhMq`g*AP@dhjP>dJ}wpvsDRjr!_|jHDuCndyuaXQ|~Y zbyw4^%tyUtVs-3>oN*7ni>1nz2EOq(o{Ne~{Cc19H`^MHS@K$wV^fT zwWrI-dhCXp(QdBy^-JuAqRW`e?aTDF7L%RyE{^xF%cZqgW83lVluv`Fn9JvSz}R-? zr_58|Wp2awC|}~$6y#L+w8Z$>wNz^E2A~RnJt=QDrbb5xPx_m)RUKDls#<2%KvhB2K_zlkMAHP<5Z4CRPWx>8Vtar4 zaQk-q&|BrB@kQn`d}XdiPos}1uhr+$Tgl^1ryq}$j+Kt2j*E`IjtE|+YObsM_H1Xo z`*r8V!}6GtHId=DBmh z{reF7MC_RSu;fJZLF&HZ;o_ct+IGB$={w`2?iKl;gZcDF_lNrH!~M;;Zo)VJ*T8G+ ziS4v6*>}+g`~A+$PV%?NSIcYYz3&(x-M86~5`sF6Qk-s-ih_cIz819=ijEoqs+!7- zvb9=I!C!@;O;4kb_IC^Vrna4JU*PXp6e}9H^4-?}Rp@QHm(tybfEp+tikGt8mVh3p zX;d&&QIuiyV$@?aG;|fzb!d7jE1J&y+w*=)Xj_^jC~hcEXj8Op4L8%h{r-1oRdha; z)-pTIy~tp0s2%E$LOa_%_F!;mU%HQiTj{(OibjfdiZY4@ik{NS(&kZhCv!wymV7hm zxtIKAqNdUgGmE(?krvcPbXsZ+^~Pp1p}9nn8PqNXpvqjRNG|FX^;`F;_}pE-qDbJ7 z|Ipr${ZQEu=a9%y@{rbD+0QqL=MZ>AENU(V9tEE+k^+))f?9%nf~tasg5o|!TVY|Fk=xj5f;}m+ zR8m590wrmK)Nv{ejk-pCzLCt>TLLZVOiHKLy~!9jX>N*_`n~qpUV^UF7tL!2%il!> zEX@ps3~dcH4f*kuz^lFlD*}htk?4Db;o5>vT04n2gVJ@ z6DJzRp~ojCtdFYiC&q*CE58LF#o9cC~`(F`DsIkgc<*O=p2179s&s2P6tD1K*Lwyms)L*3>ihETsRZ-Q_ z<&%|@H8d5KRZc288e^(4r8tV5-St%pRhQLS8t#rq*2$mA6I7}y)m58+UX6|%lWUZ^ zm0$IbOq1WKdTMwS+&k};j`WoEl--oIlr5BHmF1OF~CDXgv;E6t!1)NIw2ww7msT9nH2jj0H$=2<|Sy-QC?ixNC5? zK#<_Nao@PRySvK{7Tje6!O72i-h0k{?>Xmw_kLg1U$tu0GtcU->7MGDUTbFc^y%@# zB0@Ppv%17Ut+NZH*4gOob9=IQp?OiUq1M^`sD5jtV5H!wps!$~ps1jtV2-54R#;TJ zKbCH5GqfaM5^o!oo}G@%;bQw}o3dC@p`%xyw?CSGU}I3~RleV!K5g@B(bv$WaNl#X zG`$zp1G)sYfEGZRpnTAnZk4;Vz1Ud|NTso|k!#_5qolpkSrn+X5y9qdC3UsC##x)L z(%BN|tg(8zORv4&UFqx<1l>4nqqKm$0%dR9grir-Fs^A<-r&?k+9dfSnX~x}HpA|u zcCu!&k)dYYw0*j1tZ8b$*1plcxzoXCxoN&>xM|b9$9=-RkJE^6IC0}xMEdql?6XzbG z?3U#gkCxch^|j@-*fq3sZjUjv;}O>+4G)E*L#vDP>oC^q;{zEFv~NQt{yUy_~L4MPf3EM z>-1NF2>C?$kojo&@AGlLhM~$EL#HEIaptaa!}Ey~hCug?7JNX5VT787<;TCY>#2VW zqWQ5r=`XdnYI{tBhM{8L5uJnxKWR6-0fc{8b^?bX!=X{(NRWjI0=XfaAhsa}{z|Oc zN~IUf-sZ5>_IDBfI;(LE^W!`HVZ4d_%h$xuFLV1`d_r`CYX;#9)Lb z_v{C1=Byr9sQLHuZ(!=m;>9w3&$G6@y0Y{0@o|QiNWUrb#aA!v(>9~!cXEsi%iq4Y zDXU=99gAwU7y*eik5xv!I}BonmJ3>MYgA*GPp-TL3>Q_;~7;z4&lut zB9-VsSFrcUl2@?z$&&K|(W<$&ZzVf6!k6(?fK(mJA$RG48!$IiH(xNKIC{1JuJY0p z1TzjRs2ZBy-`a@^WCSfEc35n2Kv&~>PWITs8n9ia|10IWb=9*IGz=XJM})#pbDi1!fa5EKy75OEMBy)Y(dcRB-pSWY>WdnBi*Zm7uc z)FJ<6G(ZrM2}O=flY#5QpXvV&Ik#2=EusIN1^$G-k2kVrimamk-$3UQ{(Qd3!zr@3 zdiY&>D4s~+ze14l1hT0+PJID2>X=T5Gge-v1dS!ye}U~NkjYYikgL2~i;yTmSrX!w zXtO%vu1(0oZV+YAs3yFTsZ(S{_2EYq(89*2R65QP6w@Qfra%3j#0sH-}EQ{wJe@mUgP zmM1DF-Z_EcV{7RN6Bz|Capo41YP<|26ysfkM#p6AFC;y8;5)dQEeK82r0k|rRi6V2ieFiYpvLT9v{}w!>{*#N)`Vo8E2~Qz^Xn2H zAJMh+q%<-1<**Y-%WPF+7s_u9Jj=2fnMTrhfpXR-X>+TyoZkeOH-0&)O``ILta>9O z_6Cu1GsD1zZuOuNy!|CW?28fne@7bI_xx3AW87sHczHq6FSUqQTrl!|K{DLT@8PI^ z_D~R{hCnBNF+xZF4>HUR>Q5Qw@oDE{can9K@&L>UXdE9|W&D(aTm3?Uk8IW-WXBzc z1XuU7#%AkO81D8q~G78-BPhkOqk}&B1fvlkAW=4gB-R==4zzK(jb}}MC zMjQwV`U}~Q7yPF{GdSf^A~y^KrEt%n!|84d%MrY7)V>no0)av?7!=NpiUv3JvxkR( zI}G~Z%N7B0M_-T@H$5iz3<8|@Phlp4!*9@?Ul=z}0tdeb^?wh79{+M{MKux%{g1x1 zc#{OWa91$AH9w3J_Aib4TemnM;Qwe@3+!@^w|W*;y<>wA-+BQ%54fK9c*``;fm;nTVQ~O%l-OfK#)~gpDFvAR;9x(xirFXQ* zLNFG9&ZgCXbLg7Ymwh|`Pn_MD8Jiz`^73CFYyS|NT7SNZZrzGak`u0xMxZ~zU67TF+Bj;}4kahNah^kh`~UJ~4KyqDbd3{jl?g2=KFiy=ow> z0TBwS!2Jvqo)jT>p9v>qH-U>@`4g7ow|9Tz?5dqXpZaK63<5kM&eWno{^-Ax1_b*=w>5bqJR%(%JgAq?jp!r66 zVyqmc8k)&LKk$7uJ>dr!#C`bkI|*ku{=uW2orV8$|97;u*Get8hJ5!28u$$U#684~ zPZQO>g5*?NWTp0Njp;k%;SYT=m?4Cp;NJ|tEH+zOPrJrT@SD<4S8VD`%SU4tLkY`~ z_%!j|D>zTJ?N@3+HKvWm!#4f@JHr+YANLq?OkHrn>0co!pJxejyR6%aMwytTq2+Z} zEh-h16052n!;zWlidFC2*Me_ZSZ)npX8L3huo;f6XN4mrb=hb0)3Ep%N(8b&JEi{{ z6$HX45%{ZO8(j_kI2!sf0v_vYaE;i42scS4Dr2~JI4pe5BvrTtJdr4~1o=en!^igk7i;^wy&(qYt!y`joq?MbJWukhnhb~VpvY<_(zNOhFr=QiBgkic6 zO2b60{>K#GpW2E{k^dg5=#1Gu%=!(>OW`p zIB0le67Ik)h_C+%iU^s{gw+Uyzd-cc2R^ z|LOPshe!MeL2${v<<#?sBOD7&1jmp3uY~*7YLF!y5fygq=%A_dRjNM!|1&g%4V2evb>}^gDj+%l`v74$?yD@ZMU4t|s!l?J0*d5V-sY zg>nQR>lz}(+ec3LGd|{0TFSGKoPQ3D=q0Tc z29A?&f#F;D{|29+82@sTzt;Qzoo4zEkK1!!w}&dQ6^0oAv5(%P50xqh;qu;y5pseu zur)+CCmA;UA0w~vUrLn2d`X6=LhsRlYLSJ|dT&Gxc}fwO1yhp<;f~&;2(=;u!S`QD zZDJ_Ue`ou*75`cfY$Q~%2NX3 zujCe(G*{w(DDzhFKgV6>TT@}a#6V1;_3%J(OF-jY$6vO&M6KU}L!%zbQ^0^{---+$3Lww*q_e zWd9btGf(!i!_5=OyD-~Jv7HImK=&fU@X7x$1|iS8r#2NJxi|D8lkf$eLexQzAm{Qz zEJBw2?XfMU_Lt}QKRw!c0uLavp*@kec#H-iKOt*7^?ZlcB&gXA!KAL>R#BopJ`xwm zDk;XebkcJ1ZW-!lfz0F3D3A0%^m+gRBhMe_xMRI z_NYu|kRQji5{}E@O#BUOm%8N@kT;TPF=Fe_SUKDqz8;n{;{ls63@L{+&V?F=h*eD# zYcmqVnC-Ve65+J*(6-taGCaQ=y!v~H%t7i+`mQaDt9M+s{h4*fimS}UcJ2#{=RPov z{qnWOoLfG&WS8*11e+@L_c7^%9t#ynf)2s4JLNW5h8p$vW$A-ji}YP(7FQY^k=127 zz8aI;e>I6ipwvSes@LD=rw?Mk6)ds1lHiDBdMl`+0CUOAWtWQ2Ie~<~AByDCAKGf% zzt%&&L@!uI)hF0mS*&Dxg36)ekiz>oQA^5Z<*d}q4eXreuV4J7cywxaGT+wz#Q;ua zbDqlP%$`seP~m3n$JS6KD05_eVwEAkkd ztixx*_d3Nb0)sfwPL$1DC5W(*&) z2_IxcWemyo_XX=AvkrY$T*eI<%pe7vGpZ=}Kj~erC3s`a=Jy3lAu9bu6p;ebSUz#| zzesdWMe0_9&1&IBO;8dB|L+Zgm8 z^X8g;L-PFd6-f3!f#E(JTXKh05x+o+md2`M-C5Gr^fv10!`Y9G)4Cu7i^j!vyW|G5 z$pp4>Z(BWpbdt9-uPFH|ziFL#l8k`809%C^A2m|F`<-@Umw{~ty)7Z0lfzY?i$;H8 z46?0{$H8tBqr!1z6K9+nM)fj?{8m;#jk1=PEMFqIBEQJW&n$bQM)vdBIvLB{>Qa@> zXLPR`1-py|QXQZ6y)J8efdmbz@YEb#fXNxTV>2pqYvt$TMt7?-RV^m3&gvh$1wP+3 zP8!|al-P*Ls^wF>A1$=o%}KsWSoNSQyQ#`R=lF=U zc)mff(ML8%hsFBQY!1J3$yz|ykhnAuSE#7T?K$U@Ebm1CVqPS&o?oSo^Ac=r#)A7q z)P`Vb{j&GFqaWF$>jJJx%yA2SFm>Ji1WH_lT;( zvXVyGyy5{8(-h3e6A8a?y_mB)OXYQIOU5+r#*MP%5D+=vB#KcFLk|p*kr7kFy|~p% zjnsaB{f^6%O)@;Wt1S{^;CvIeflT9&9rAqxMXRQ~0 z<`b?j9aFjM8AI?xI?I3p>_tXQ0j6~BkcOFz(D8641TP)gJ9mg=`-F`w?&fwo z{6gc|pq@Ub0E=BOkK$Yd>;*}O4|Z21vVVUaSr>O80n0g`QV$D)kzd@Jsz+->3GNbh zq?~=FviXE}3wF7skK0pA%~Q}@gCmTsh#AQr8T04e>8T$*!?YEUD7GmY-|0 zNcIJs&roNB(`Z7Gm3@UFTo78_saw-V23VWXpMQ)zKsis44ioNri(E3ubIo3uq}E79 zq`^L7*zKl@P91q#?WRh`lPs#%?}C8ujuAP47LrCT2BGW4HPa<{+d_^pJp1U{A>Ew{G4KV$npy>x z?Vv|8(x>)(JKt3|^JT!gdQ;bF;+RL7e;KcCdv{fN)uz*k(@NT@yi*bHeCE*JJH_*-PDz7 z4SsX+zdUE@_9Grlg0yL{A_h$&wCPeJ-ZFx=lh2}lhnV?IhnXhklE7YwqPL>^-4 z4cZRYZgV?zcxHKadIozIaEoNpG({v1xT{b=s$yZPU~;HnBh`wXetg@a&8f~aafSTX zcfakAPG#H*nT%7Ymf!0KR<|d&8MXe}CCt-zK{v za;j|+*QaB|xWEKN-bLI+qJ)1MNZtEg+Yu#jJ+I*KM=i* zkuSAI;egc~uJm0gLMc*j(0-e3yMEhc`+6H;+x<%7it@_*3iC?iisQ=7DeOM$^&{LV8f(R=%Tqr_n&~$rxn`ygx+v$qy%Ht~JKFm|~S&g6al`XyaZP-YCsW|{$x zDZ+M>^i@0A#oMIYwA;kn)Z66S^ljqsfK;VA+ms@BbV!L+aaBp7a^!{Oh4FJVM>a=z z)(z~EHt}n!<*t?Nnt0UFfU3kQfJ2-^5|uOtkkdLrTv{rDLPwQCV~*l8Yaw!}+Hpb~ zaCA=LrrfJEHsq*uj@`PAT`Zk;GQmQQORibkrLc9ba*p4+%QeHb-8HO1xJ|81PM79Z z&Oe-34FnVdfLeuGz~#baAmJST zT*jQ<+>bfFx%N4qxu-d}xv)8@x#2m*BMfW6P3cYAO>2W5i2N+ME3PZ)myDr|q1+SD zvCt8CQFs9)E+hs*&xstxxoY#0y-*M)$H)lDbxU{44g)s}H-Q*)#B(x7N=HdI09ReS zxG8B%U^h_YDDx)P)c`yeML+^KCgNN}Ko&M;Tql7HAm5edk&Q_)-PPt%i~(Tmiu1@Q zrl{?z^C&0+*mmW4zM+coF^yvVjd(PkVX|+Zdoulzq zH*43Y<})ikO*q*j1xtVj!IWSi*c`m)9K1%uH9E=4gaB6dO7;Eb3*^@)A~mFpO_Cbb z8ebkM*kf^yJWbKtv)!u&b9;68X8Csd2KyH9i)7O@k0$QA>m*U?q+seKbLaq&TE)(j z+IJni>UUUSclVAogfmfApIlodi(<0dIn+(ptw z0`}MocpXgkK;%{1A#Om&lz5R07{4368%G)Ww3`eL28)5|yc(ZtIwTD~36TlWRVNZB z5(AdU@pq%a7Q`&;?KhFkYnGjri;_?K188fwjQP zVE+gF2fYWr2cHMH2dRfZUu8iG;*{7Cp;4(lQ}8sH30w_!df9$(>8zd zpg~CDOKwm4Cfn`YTqoTsrBgw#l0rA0AGC*O|2niqgWwpBQ3Gm;s`635iW=EpSOmWf7zE5MoH4)E8y&t58CGG01f z5?&f!3SOUA^E&c6N;`lZl^q2gQIa2h9h?2ZINZ2Nj-N0(E5Cuw?Qvr7@Mg)VEO-2`+cme^7Y%%#-(= zm#O}$u1Fg|TbvBJ7v-$^pognIMf;oP0JD0m1kxrKuMoDJ)TRWlNO$22hiJ5V!GaZs zWVFW4f+vTFf_mbD8Ha>|#{7aShuEZg{em5b)TBnGO?G-UR>?P;c-@MW5}-|*Zk1+9 zvQ4sX{mnV4G{W1|6KzCocug+abSnL&|36=zAbO(LiQT$YQh5mu^I zqE*(vh<2=TEbW%$-RK?7t4mnWRN~O6(WyyT9-}r~zFfLo&Q-!yhOrP~lff%vuO*?O zYW|i>p`qrssLZ#Z*eG|VNnOrWDqvF$Dpph}E}LICI!1IW;+4y)+^E>dpHev}Yc9K9 zcsRB{K078nhPqX}Wpv8}Rc}->s$QsIm&+{xk6CXG+*-YJyt^L*+eAN?3YG{KR;g;0 zqm0 z8LAtq8fqG<7-|@*8EScyIF>k;IhHz>UzA*wU6fvw6PFN|5tkB|^DQbZd_FEdwmd#K zc5sVr(|QqoQC%Xy^(@JM{ZWNk)7f5_zY_!J%ir(tTRV>O7WiUJKa3ZLQGpq z-BQh>WLr#Kpe9hmmP5DFVqQCX{!}+>e3X({Rf|J5I}KMLH_$Bz2^0;2vCm&B zQkVmAs3eX+sm-b@%)3sKoSZ9G%AG7x*>b&w9Mwz33bREv^9@HJMEfF6xs1y7iuL@- z*?pU4o9l)LkUi)OLXizV z2ozS%Y1*RL+BP(T$Uy}l-ZPdnC;QGOksl=jd0q_)APf7*UxmMtel;{{{3sGA5GWTY z7O3vbwO=+^Fqkt~GMF`3G?+J7cDHi0aBDNv6Cbs2kRBHGP zDh64C4nPj}u}xY}qED(niv56om1oOcvt5f_^IgmSGyV(6R&b4CAmg{MF^TT#d_^x6 zFZnNJgvzG10anzFLXB!5Ly)z-FkeB|;_DJ@qYFp~0(aEw9Zpmh zc7!FM|CX74OCz8gJ8OE&EnuKDgK+_de+6QJiGYds8jsZu26D03~ zjY6)I4#q>VTjNK}$K=N^ej)zJf~v$o!%D+~*rnk^hBiIN#p=c3ZGvJsrPFhk zCtN4Zhb}j*kCl)7eqH_<{_Xx@UBYkogPdW>-HFFZyac=~Aigz50dE%q(o25_r&qjkG{vwTbVi2s=JsQ38ek?*nn(dY5$5$-YUQR;E{ zQSk-C5Aa(0n)ce-rT4a>%wqRU_rl$g;gR9V)2-u; zLgK~PBcYS-!|vnZ+s&KJTZ~8IN0}F;m!wyKzb^62^r7W#_pQiF=4-6K!5v-{nh^}1 zh-3|#NeG^C=pZ~7S(G&SSU9Iils5TPI2U@9IQghFr)rcs`J^-#Ym_|s_z0(SlzzX> zF7AV5kc!nu+(F3*6`Lg7J;`q>*6O&6lF=%*D~L;5i0vwt+=#_LS&yShha`puhbV`D zL*_$!lEJf9?6{M#j_^aurm0TfoPaEAIL7+sQS6eqTKLO21<@>$kv};JZ{qt zr!1#Vr(mZ7mflpW2HeCbcQJMfG0u--9PDCThz0$J>}^pFrgct6y>j&snkXUWV3($aaWKYikFzZRpv~ zIa2WNaPRO@a6UyP4+Rg24bho4Ue(kNY1{If@Y__d5wQ_*E#c!wMGs+w4zHNmaW>&7 z;VI!N;p;`)53vo^54j9o4??~)W?wIdj?r7|A?6{eRU4>p1U8P(#UBz5gU1eW& zT?Jj`UBzG3*3RD#teE@S_*%Rzf#Upy;}gvk#T4x~q&2iWk=OXL+gb2(9jciqmk8tRGG|1;fNFBT zQ9T`{bbiO0cCN{Uv3up2R?!*-cwbPwdb3b$|BE$#Z6IoAi#s_~26YY@35hG(u&-tc|->9so<1 z?&bC&KOS0?Hpgr4>3CUB6i-f!Td9lUlpnkY-ko9m*{cQ@O6QtM1{c*gi-uNC3+ue& zhD4d;6L;R-*Ph{(>*rU6&lc4`#>Hn3Vp^*6k{yA%kNfz zik_UCb}0rIGE|Z5Uw|OsKb*Cg0Re525PuagMPaj3?k4W{V{fBkzrK#7IubwH_o%+ zbKl8JFk0z;QI`nb?YM#Snbr9FIkg**3W%e~JuaO`tRv-q)M8%ABEw(Q23Nw7&}msv za(pjV4M2HWK#t%-Bg zmny|U78krm@@#Ef8(dt-Z@H>|y1;$>;C0E)&;@M%?X+psda;KJ>MdlEhq*$eN`1`w z#_LIQcKh2ZkKHI_whGaynX%X$fj0Q4@{9MUa2vFRyWf?KYZrX6uI&t_qNcDpz7AX0 zyFmv}mY>=0`QJCa4&B`$!y>`PBLqvq@>{ki-rb;dfu}R6oQ+BBjL_Z>ZQQMyrRZ1* z`6~Y0wkGd(iG91*${J1fy#k7nXt>ttvYOJ^6BVm8dHL2Cn3`0oz2|Po%Dgl&rVDK7 z{iwc83FJuPp-OZLW$8xsOsw5FPKuK2!$!ZiKrwI8WB9Eiv+2oya!xvRc9pt^&h)Zb ziF)EQI$=(h8s(p3$+qB+*f}^euk8{e*8UBL>!hjKoHPPi{%vVZC*PLKt{^VhWk2zJ z54!>DSYX$IJ^DeOA`5PVtuS4k(n0iuK#`dDNT(?(CEJ{B6i4Ov@4+ZqDe0Aq>%n2e z2?&!=BvF%@n0W|i0^^-@K{n4ga3L;PiClJm!I!wMd*U;8!sg(cEVeG&l;0(VUD*mD zpQqC7#3Nm@vHd_^%|3L5{fTBqqjF8jNdPvh9cb$?^J#PGX5IBlno%6J&6>HV0Z6X- zgisaMh*T@J0zwR_VeVx=fkl3G^4$dK;d#W4{gz^uZ$(Wp$dt9IhYntS!v?DZrMY{( zrP2Xd-c7fOdEEm~T&16*+ui6Y`{(T&GLLTkdk0ACd<=`KRambDw;j%NL__1Ms zwSfoqk=!E)a%g+L3kVBq75C%7E2*VtIa{Id*|^$AXId6rJ+&u!3uz9;0gvVVH88Em z!ce6?AbI}KGbQ^VO(RS)Td;Zg<>OJZNnb7tv{KQ^BV6AUKc;8}Ti(JuE4@i(sT1EB zfn!D8n9jss5MB@b_5*k4EH5d^?V>bFnbbw9V=w(V+eGaH6CX#+uHECFs0im375n4` zWE(Nn$@>$9^^B$tJ>ULNoisdB;~7wd=f#k|5q*~`D8|hbVO@KQ7`^HysX$d9JfOll zVqr$1v^V=fJZ(xCAzebnKA8zl-o3dBNI80&(9s+p*}&+O#Pa^ftn@wY6>ubFxJlV& zts~icU_K;w!kU-_J+>ga$e^b%ZHIL~#L%U=Vz4FgyZ7OWN=)S4ntfTrdxoTN&bdPq zU{d>oV7$(y+QqzCpz#dI08tm1C9^6oj?Zl9*7hMm1^ z+$1>SBJ5Houk2!wZ4#Wo0=|5cFBPXZ<>;Fbkt*xJkFrY ze3Z#NyK0-%V_zsPfnu8V39WZPAeMhL1$VJE^~<~Mr|NBXnYNDNiRb<(kwflo_mrkH zCD51%+cYK1p1kz$it*{sKa`$7&D0;!ZVS75x>z$wd2?2B$>Hr!XV{5^ex>?#b)#GN zq#Fe@OVgN?m<<^`F#E%Tf~8TNO;;^HcOLe6dzpw0fb5XtMDd*}s(p`?*l93hKy>Z2 z3vOg4B_l$;JU0Bb;M)bz%$C<`_nlUB;hHIxjEawl%mDu=aoQHOprH)jse@nm<7U^Q zg>LKOFv_X}8<&Aek;+Iy>5@eJNY+aTHGSvH>rGnBfRo1wzpf(1UWD^B0q;n$<)*0f zOt+Qx!-&UAAgp z&xd}B_YuG|a@V^an>nGY4Gg)-2T?MKm;=i6&#GS%D5~3#>X&>{aDUD#&Rd}>uK!H3 z+-60{T5p8hp$?m%o=`;D=v)8@`xIn8JIQIawEOR-`3J0G@ES6J#fTN!!U#i0t8&*4$( zSQs}wp>Ui`>$2%?r3WmkAgj%^Mp_fm_G~J#Bw=HZY4b;^v`@u^f>=V9Rmj$A)BIO# zgz=iZ$V537ip3aIe(idWzW`LFIdpf^XY)6s7}?V=={zM1+ZP+vEP1KEFkcBzYT!9A z2>N#K3}>212a83*-Ba(PbViR{zpwBN(>n)C{c=Y47}? z2$wpS_JBRKZs1AuJGSBlGjvJh@aSPo5@3U@3>mZKTT>}0L>h9ajIXSJCE~hDUm%JJ zlcqC8aD+`pK{hPiJ<6eX0^~olyTzwLuPIPp6#28RZs6l2@ZTH%7Te5m%1Wzg?>^1+ zt_b+Gr|~kjg(?*=LL&6V2i$Y>ss#IMLn7gdO>PR73Z-jC$fCx4_A@CvYxE^$tp${X zC3<3CNQTZO`73M5+BLkjXw{u-x8vC>SEW({-r_Ex5U(AczW%dPfDCsPx9Cz{-bHEE+xo&Ybl)3Ylg>SEg%A4uz(DwC?mb=0a zMGnW(O0IYAlcybx*P1T2yT~w{)pu_7&nxy-tl?SJB`Hd0_w2FL=63rt`iiXh^T~(Z z3JpzrH>;hl+-n01u+|%NElW&LF5?L?JU<2tvvk&08(S=e=`r)W4aa@7oWh_>F5P|@ zuFtj!cWEIhXQ@r{+?`LDKg}NZu+NU|U-o;@Y=n*l*dh^GFl4B>*iQS-7cF>~!{$>_ zB^pmkmMr(-%}!;eJ%5uC%GRZQYo2p%XX4{_4KhRaQPRQs_BgV9dY9BXVRP*3VAwF} z91FHyO`1BwdN(>H`edEtaAv3kpdbpcL1^+{DW=R2$(fq)oW7p7=JDeF{MjyBR0^z& z!eD)nu$vymSvpJFa%iW!D8=xyFkUr?KKXQJ(9Fd25VW*j+-QP!BESwvGuc;E^WAY? zF#~m;BiGSC$JefjdRSU1nhx=@Ic++gpS>t|S<`y0^W8(7RY9l{6)=9ZJa_UOF-phR zwe=&A0yJ+xg49+ms$kA+(3cM7T8m;2*hsrRcdGO5KwAkF&B_o+*JrsV9L}yq*bs@j z9^ELy`whukidx07H7dJOx+^a~h?>#KVAdol_JWeoa}FpYnKHUY{CGxNtToDLHF+jm z!AFeBtv-mOxu5qkq&FCtg9=l`DiXKi`Hx&{OD zZrJRonEb41Ak*u&9ZlMaVH=;c)ysFq&h>@jZmO4^b(was?er)0>(oeTkle;*$Htw4 zR8gm+%|705fph?I-qG*&29Aci@clGdxJb@Da?$9$Jl8adve|>Hj$`w-!-bA0O^vHm z-A{|s@2U$W^jZ(3nAox_f~LORR6lM{AW^Wtct5y(a#qe1)VWK;GI1rD5zY1)N}X|tkSN$X}DF`t7^JCnxX zH-B}DT;tv$xYBdk=K;f#%w3feN_qG&j6xB{^O-m8qS%`aYB=57m($XwdGY4>WA7Ym z5I<(M3#KV1-M(}!cC()IhPdB4wQ6G9?U09wva3M$sGiCJHH%=L(hD zb3(D(n1B2Lg$iwZ3c18mW`UE_B2snW6f7nQAD|n0Hu!H-Ux<``yY2f5DVZQBKpyEv zOFH2xA3a7sy0lqhtZTBm?6gj>y`-eD?IcWgrUT&V3A6k6T-{&Jb<9&NFPGn6^lU6K zEc|L>cK)f5^qbL=k#7yatgFMnOj;7%~bGL%VbR+rYkzz)Ki3lwWJ zk91VbP@7uYmK%IMOvG-8eod3#WMeyK$K%%L#B~Y0zT!G+aA--by=heK zVuKS6b)1Os$Dgb&$Et3QoiBbqIc*(_FH5p_y470Ui*DM_cD8~C&%cSfE`D?)d`$9C zgq*9zcB)5j{s>HQp+iNhhmWMlp8YDTb?zh&p^Li#G4Ua@<e4+BQOqLno?i&$9`C+?;Tl;%min2#Lels3sp{mAc6Tv#?TY zbttK=LXR9pTxPde+=7iyxQvw0L&PTNvD%Ds>uWfYU0+7HtE4iznWzSe_@>|s;=4y)IXtGUC)wOo*6|mQ z+Ek{R)JShDN3QwEsmQN>jE8b9ubcsI(bda>-zVIteO<8yuf{Rz6UXAja?6 z=sW2S+3FzcUpOZ~kBYbo_CB*pYq}(5Z1dYC3kCfq_pD&7{Ztosj1jXj{N?NLFYnH4 zP0U)u+BgLgi2D)pGAu;@PznCwW#;t?_4zs(!O3@C?uNWX<4KRxp_Im@NqNw9SK8Y9 zD3eJe!RE={@(Ntl#5jE0VYQ(_0?)laq0=@W(m2!LroiKU96udRf2#Rwv|zZMY+n{1 zU7P+S8D%=}MKKj|M`M&=s{7WQOXXw|;poaqBA4_7)aUhOTU7GK%hWPhy-Ro~IQ5WH zTp$nu^XC}JpxOzEH37d5Jc-VJI=Gy3xDR{RCm@sWaEH%!IMBJpCp;>GK}>p^*(B=n z`DcsC`$4*0x}}&Ir~D<&1Z)aB5b?W6g%f2upS5@Vu@(D>J4N+Qm3T!Z>7?uhymqTl}G81BqUao>h(-3#eU)J+b<^T?yZ_zO!T zdQsz(38IqEkH$RMhR4LDs)kCy-?}IbC9bS^J{|yqwLe+>n6Rw#w&`hT91^~fMP!Ii z$&sDm!$CyQp~sS!LIP?1v`dr^OH_*w_e#W4(v{B^4Tkt>^^wFOQAXM}h38-!9v@?T zQJoMceyQZp(3#C6NvlgUz<`^Q6YNYm=F;8Y=n0^N6+B-zBByVKU}Ccke9{5PJqei6 zc7&tw3uGrTwG3QyYg$Jf=uaaaGRl;_GBX|MV)(=`nv$8dUVT0@?;$O7zHV(vk-f= zh}TyLuiIgmoAN9lAR_2AX}kp*V2ka)N>sX(C(BIOuPLs)q-eP1O{~&luCw7yR1@04 zh#5Bhz^xrw_9UlT=lSFw>aC!pScf%QoT#e;DLj{Io^6WQjB;7RJ)1E(=sq?)z<7^I z-BD(!+pxrYBbtJ9Kj8B906MC%4xD-IbP#@R04rO;X-6fuT|NF2Pjj^0+xe@>A?!yW zgTEUWeP9#KV_Te)1rSNK_LFKRa;tfxHl(vp8`|NW!AoOQ1eZDeFk-|>Nb=e*Uz0_N zgFrkXdR)xxvym@3htYk{n3+S2+D6|w;!ENOvph2*CkJ_RDo&7nx6s$_&cB8$>}xm_Sw8$unD^CHyteSGu$*ee14Mt#Hn{J(>%0apkp#Yi^M1ozWXgFj zkKEIpe@f=>j)kMLc)%_yu?Z4=6-H3`C^cp)2rrlY8sf!OH1V{N9KKfuYpi}3#p9i* zXk+hXZq9$o5JV}kLhR<%)Eb~?;n|`wF`@aJI&D&bGV@ga_j&)ybl6Dg5ag7vNR9sR zv|1dQALG>T?pZP+t@(CtAlP6@f*Ou7OFZc!zj|rfERUJv9)-{bM zALy$*h2`A+`1u;Z3x6kcLi+lNFa+UOD1mbtU1AwH*UZdKIZwJzoz5N;qkoZ-F8X8) z(4c;oIiY7uB2Z3hS1i-=ac;Uj4efPq@@M-i<|-B!na|iSKtkYgtXK%EIIUem>S`;^rp6FUMe-4-U=#FR@{j%)6kHGPe_--jUx#r+y zj`4K0Rj6P06T;USlu=#o_NwfKeZ{bW4Cbe_idy_ZkvQxD(oH*3hv_585Iw@G4?KY0 zTZg{qmkD(=-1m?qH^Wx62%Rv~#hHj)7$S74DY|rc42g>;XqxZCe z7$oxN(?qvuL=|-P8!9&JAMgW8>peb&g)RfvweJH%`iN^NxB+$~Xy3Pz8*zAk|FSkd z%lxJ!EsGX68E*#>4ai19RwY8=Y`XCo{y+9OM2tmyH6GM$!3hP&)pV&MS?GOk}oXK-U z`YV@3VZ9>^{jLV)bOmCbOiOkSj^`37IsM$Pne4l{EWtw~Nqr4+I~*5v>Ug`Gab6Kq zRxAS2Emgjqv?fzMa%q(`e()qsY_gLW8bA_e<)y7v_bDFmdTZBoRB~%+UC030P^yGV zp-QD4(rmcy@7hurKI&S7#oF}SW$h*X5~R#L=1mA{wSo_UYk~_sQo&x~$>c_UWETVV zyYqLs@YAr1^sTz192yoK62}&PL7rLDRB<1(nYC8kMgl87Sl8t;rI^e|%F0)dwkf1! zwMFi-^9<_?xS~tXW_`E*5<0_VTe(8*sG-2tXJ9zmM$P(i7|Fj>S%VHplephU^%^eA zGhM$PJ9E`73skRlNeHryLO+Es7WT|X5DX-k=7HJiEGx7o`N^o>KjOg^*w4eDEi)m< zh&M&j`HHD-laU{Zg_va}foI*KdVpRp>zt*~q?#G9BqMmXv156D9gzMIEMIz=?n;k^ z%os~jbuk#MGd&gH-Zfjr0QP3w?ovn@XO>^1Qd$7~8c)}V64v7}==-kbjK8@r#OBtz zn6^0e)yZYu$tC&|1+!;Qxi>G~Xv$b44lP@Nu-D$q&0GTt8C}We;_nW{0=Fv$ChvyI zFc*u?3Soh*$EswJiye`;_gNp5Y?Ye27Ht#5YqEK-C_l87y?!B{v8_7r>-Di%G*(#L z!9amgVpWT3_&UrZR-Sd$vOr|<9u@9Fv0f2oG@eJp=nM#w&tIMIfUloqNFI&CJh2ZB ziY*O1@_*P})2gY;lJ3&=3tkIrFTQk;@9lt>o?zS~aP9U9N$BZU`-ncj+>B(99`4lE zLSCE|YRgKeXiHHP_SH*{rOW0RDqM#H?S)fI>cnZT3FQf;1UX>?b2o?U_@@erX%^fP zS+47Q1}IEI_0+rrBu)$O47$gJ`-!A5;TK#@bz03{3)d)igoHb%q`=8~MX%T@ zU)MeOsw5}*1J{8M@gDAKgN=9i9*#UqPLt3J+5AzN*8MvvJZIl53crn2cbEr8*red< zjNH6>HrA)FqH(V@=uBkcZHtdaM5r_d(MN`de+*%ArtD9*T(Vw>DsT7|{f^PC5rMu) zV}Eeo9xU6)X<+DOnVHXu*_`w+p8Raqi^%G#!cG)cf#mVUfL(Q?&w1AznSl!^xLfR$%2vZxHTt5LNBMABg>sK8Re}TVTNz9n1D#DeY2yHC^4m8I}g0C?RkS6-nD1 zB`J!`C@BW{91UMB(RP%mp++i2X%Pu8elaXYCl8IrvA~<>otPB3p-!##iHn~DRobwz z17XICjC|cbIB(D$esyun&BfxDsEhKC9u)389X8l@i`qDm>@~;%%ftG5#JPF^nSPwy zjs1Gpn1~QCF;w_E!-LpCyrXcZHpxb(ik?~SCTcoo;R%N%(zx&mH*!H!4Abr2(O5K2 z#ed9d7fWCBo^*2H0;e!-=6yw2g*IW5C0@x1`~Mhw#~@9bu4}Yy+tco8+xE0=+qQe! zwr$(CZFAbT_4VBEIq`l^#C=XY|LVG8S7PmzyH-|aa#v-(A?8UM#;<*kNj-m3J7{lT_l%b&wzUp7BP5WLi(ZL zq{*I2>FHPgm4cBfp|tc~VmeSpMsyuwlVeA85QtIdD$Hc>W`Iylw}hKi zTVhRC^ruz_3F#Ai;!(bGBE1>~&6A-!x)Q{3*^yPz70bL@2&wYo|iBSpa$GcsQQpXU_&QOO@|E(8Ek>adp+lb~XFO)kzFJNWcOJPu z7u5;HHmr?MTZZs!tJWOtXr0Od#7L5l+vd^SMV-CKRKxRyy9Bum27M*Eg8od)BGquo zVF(mT6W#e-9gc3dMRiSHw8o01iObnnO3J!ys14Af%I zV4!-go3EB~t9XDk0T0h7o~HJwWH-QzROY+#?P7|oPHtxOB=UlKjbQw7zjC#?A(J;A zJn7aY?;$VT1QUD4r%{U=CM8Uq!C||>p~mN?CYf>~J8u0?P~qAQgp-8g7ow@|FIZ!{56g;A;q?9JhdBP^~$jvno3(zONdo+gcDhnqa&}_<-ZLv;fL+rP)?k8 zcy*(kSo?dduMXu#TH|4`bhokb>_oZsCuKN+6)!neTd%G=O5tA$e!98Mj<#>!E!Dj5 zLSRnJ;y*LL0Rj13Xx1G{Cj~6cVaJ5H@%vBm6?(8Y|D+t3gcIEyH*cUNk*) zF3zJ#sxFZ9dx&|E9?7`&xqR(Ep%$$na42XpIy|MDr^L|aw&A(+Q9DCG#Ur)DYHlQs zasp^`!q$684VVDSFat04<0v)B-BdQmSfOyNEY4jUZt)8^>nmvQ+(-cO!5_IpJiIA( zlU|`pb@9n#9O!uCuI?Gf*%otK(r5zxEaA*zg(jw2x+LiUT(&<4ys>7-<5p3i?wBKI zEyspp7h)==^mGEhfbm+KOdp>aNM;1Mwd@;J9Wn;&9GJFK2u&^}7oKVHRltaUp@PDK ztSATd!&-jMH#Y&B7T=J4U2;x-8_!JvuW1=wyLUzIF7ypFX8^Nv?42c)^$_rIP|81g zfhW*os3q<(?@KVQEzpKcjMQjRNNg+cXn3B%gaQ_lW3$%G|C z+@aC)x;n>S`^0qR3}~z?H!ei)OP{uumRJ@W#WQO@G1C|Ezb2$;95Yj4@?^Hk(s-x5 zFXiaO3mdn(#qy^0hG9-%}9lP!qDJh$>R*}u6Iaa?DgAu2kPw^zs9Vbhv0jE9> zFW)XfSrv1!zviR&SNP^y^qN|k#uYq!7+>63rUUM?d4q`O2@)ie)J`wvRO9F>XO3#G z{uYJ_R}avTd=v7bE*~_2uyOjyM=wpdN%y@uCDjU#Mdm5=qetg2mcjGxV@bb$6f@KYc)VR5Rj7>&nBOBEKy(*6%< zg2(o}J-J^xih?ghAR;_!sA=v16*777s@zQ$~YKgm6L1jGi@Q59R^ zH|KLArGhz?MPh+(qKu?k%3p$0NYc+@g|}&+c$DxJv#R9h+V)Lh$I8ikH@!|GpbGZW zW#X|)+AQqv#oi+rt7d33`_V&PDPqgsdDGWEKWyN0!0TWbtdqn} z&B%ADJv2%)6rY%yedBF?M?0p?VxZpg)02zphB4a28fx9R>-fY4e%a~F%jMAhEyud! z0Rd_E_jOzT$zUz*JEF>%q^ofz=#aDB#dS$vN=o55DBrctpMdQ{$H!$UV{#rAERrFf zAqnrVF{hngB$oU(+hSPUb|6s`Z8v4vvw9*xLrH8f4r3ba$cw_+px-oehUSNJaSS%N zGP^VYc0x0P=gCQSha(;KANYsH`SKDQxj~L6VI70R<|3;;;~tyc(;W_>Uve#lmO;;c zgw{-au=Hs?mX6OqL0H&id@ zfBn2BeVqNVD70g<(P0J+yUoxm9=JD!YaDnU@(bK&8YzO)pwnc7V_ToaGHC2TskDvv_Pbat9w>&W z?@53%^zU`r`d4`t6q+cnljtt}Af0QAua6IPPc>K3iLXWitfTLAQ|MF-L#P8T*&1IP z?vH$xq{g*eSku_in=dG}&-88Io4~%pTzo4{A?nlpKTpBvtU1*-{FF^== zM_u$Q7XcoD&SRccPrNSxiv}MjY4_w{yZ!438sh}<%jc3pV=-7G15l`A3SabU!fbot zEULXzNJjgY@ZPCi5Q!LQk4{f{Ns(gv?103$qFBYm7gPNjXtpLVA5Z9$dOy(X23?tj znj_19@T)-{^nwPV?Y8}*U|YH-5CV;DCuHl5m@yyKKYb7?wG7$;90DSzA% zm%c-7DOaHxeqORC(mSq+2CGLi8{BIc;jTUpwH8$%n-?H;K-1W4WHwE0SE`jb!v2K_ zL5qEO>K6a=H;z;pR-zf%I!&|&5g~g*hY6a*2VfEqZYfQjNHPNXipoz|ft-4s@6|E6 zB+U*8vs*h9HrBR86&$4L+SMN~&G$ICu?qIxbWE(~1U_vFKqc(S+9O4Ct0`HsnvMsJ zMf(>*P@T2IerrcC4xws!7H``Z(T=F*jeJW}Q#!0AUIS^@U0~RS9!A&i&EYBq0EH}T z>;O>6b|~zY!;VExZVo}#a^Bt?TMb)};VV;^;)X^NU3;CQuL*rfniKHUmOus^Ij0Qw z?`ZKx$#zT+v<5XNQv}71QE{#6U$~%G6*z@ShGG-~PVrm@VsZ#Cp^}qE-fC+yv;cy$ zz%5{WK$?Ae*DBR;;dS~H9oLk+BPN6EyXC0nP)tnR_tL zf!C$HSIGw>3soW>i$u5reRyvOiBM#U(LOu-f!x{OwfeEpbn}Ahhh<6gYyH|W38D)?mzdi--CZdM#XbJg^2rE0v*UnE+$ zp>BrLh@DIe)MB=P0WyU#-`wpSk9c-m`j|1)f+Go*9u>TNzWt@7ejBrSuSp>u;^6A9 zJ`mGlMlyc}mKlm&?EAqoqp7@PE^%3Mm?L~6k!d}OnY$u72`UxQ#!vsF1ZWqpRu{QN zIMUk@Y;~bax6nhvnD`dIbf?czE?_UKw?#(a*KIushK{B_wMWA21wImu!`hE06rX_x z)BPCxC7ckf^dBOEmMxoZ}cM&DuL~N}O9lb6GbM*bU#J ziuo?GuDNje&0R_3pRqh__27SNss0`$pKj@5pcaIQDmqSB%(qVDyI}Tm9Ooht3HeN6 zK$1#=vWNU-W(=sPSoE$g^bGhId4GcnAsFni%Dx8!tJD;n9M=kJ`{dZb8YE7vp1((0 zzV#-eYI{xL#vi+5t59*Tk4=wRd!SomS8FDwA=FdB!kx&7Y?-zFvm|v?{AeN@c&km$ ziS=2E$3^!c6h=n)rS&tdV+aBhV{s{$_|iD?2v$~SJCl>qE<>8%aq8)Z**uE zbTzJ^$He1Vvdmh4gYjiyrw~+`UnMPCXG*~(IlU<+w|@0`$b@{>V=2I05huwtbn(-C zU8&0p;X%6LD6;?Z&Yb^wm1Rv!IXtyLMwjxpW~z8Zn6u(+?Sv_SPl!gUSa5VmFwc2( z*D20daVl$UzpppfZ|*V&w?KIsJ5Xc%rrPVK-ZcQ;)QGG}y*(mgoI?_Cy^#kyp0Y`+Z@4D(pOr=zb8#tYQA>oAfFPQaf<*$RP_d zuI50_aO0urkD_k|vLJ$}Dw0JY5jfN$v+`DkIyUZU25XfVr3ac918O#*a-ElyaSM^~ zk~XAbv1b~9G)4~@Cr!hxMC|dZ7I!3U%>`|^Tg4k*ypmeyv>*GFyqJ$`QPj&cmQTx{ zbJMAUA@DzLYs_YvOXV?Jfu2l)9*n%-7AE&KwoKN#*{cU$f;ygA@zR`TdO+x+GF2vH zozdMy5RQYiiv>b7ClGXy_*N7tFoWKtpVu!wol;rHY~{8YqDo_#gbe8ByE^Hg1-Hc2 zi)Dz+-x|8Gh?88N6dtjrQXMa2)E>U`*5_q~29lKwS#Y`LggeM7z%x zg^(pIw}Xc0zG(_JnAny+%EN`QV2;~#*--%VH`XTzP0AlQ<}he>^~k;{*jM+QTKws2 z%E0dB_uQ_${Lvq|&V0JHSk?U1d@|Vnv2EzX)DItA6Mn)q$1+2 zvyVU3g2BJ-M1r=H4a~-;9hFKE7Ef{i#O~g2an|)0BrQtsL&;zQ-Ntr< zS@6UrWRu=Dy>)b{Ie}2=!1#-IdhiZcixtKtU07z^2A<1k_V|Q>u|4>adWdNetl-mO zW%%Lg#LSmyz+Q$GPRm|HEjE4^0QQ#qvTem&lHUsm)TYnY7H8+P#aDEPz2F?Ww?iFD zn=MLIpBx*M=Zz z5MN#GB@I8a&2nk&!!pH-6+cnfC--Gy=QY1Cs1Lp`hS(K`95P!XxHGjGw14`9WrSx) z7wJl!^Wc0G%EaBqDT%*$^*3A$Y} za7K4c>DZ#E?DzfgZnd-%B~#v*HY57Vl6TCS?|L5FaIxo6Gbw)`yjsb178B5>j2?Gs zjD7mRyo$AmO+13Ddc931V9^sJy<*CtiG6ct3#vfZvo01buX0hDw0Ux;JQp2?5vqpL)1dao=wFE1(I*12Q> zCfZM3e%2mYS|3h!usZlSTxEKgT;fL{yuy|VGlgl_3UnJ!_neSGNZAEeZ&CIqRp%Vd z;B-v;Jq?ts?6|e!1x`Zj3b{s4Ghv6Nh($mWq}^Xl&?le}Kq908RgW-}bu+x#&jfP> zq{s(kv`dKyq9u29;l5V!&8F@6pQ&>oUGHD>%p1~t&jsv%zu2-S+`jio`adR#fISE2 zb`M*Y{1gCV0)IX1Z_n$|Wtn<6*5ek4H|c9e77ipSd<_2yO3++h@B?wPgy~FJji9mD zYL|NdOlV&~B@SI3&c5`zW(@*HpnUC%V zAZIKn=WAW2&)`&^cNioBV)^h#0&4G+g~x+?qXa22{t7XDlQd&exe3?HW^ z0ji^e7GeFN{-+^2uaSW7?_&o9;9A9Vys*tDeWt<}qShAWnm^Dx@|{}ptpoLc#{nj} z_`TBqbpIKCd83Ov^6bCok?IdWl>fW^HosoB40l@r_Z2p$5r|XG3@Z#LOSJ@35%9s$ z)&;AzCyZKj_9xiMEZFs2WC?%nA2kX)xeH+Mi` zK#@<vafy=qjMwT20KEV~W-@iNfA^T<3o9I%gbNHdg}YtrB(51bajFJb0q277XxA zbWpa1dLrH;hqq!TkP4N}Pbp5{T_^lZ+<>VSl58F4Ubt)EXw&#|A3JKw9CSE4h}%i>pyWkCH`>`#eN=VSBLp zxDM9kcOt%YN`KFR&?AAQe~=J9uX9##J5DVQ23%@4$8+$ch8ts(_dB^y+Si})I_NxI zjjPh+I|q)6VDH1~RgO@2!2)__Ut+;6-~HWP$RHJ@O*X2W(BTbyx@c_B zhC-YGy!{Dvp1!zVA>=#&j&FrJD103mPkOJejG2 zz&JmS#pN`{{%q6k-)>8A%$|vtZWd@OA=ak)@LYDUDKEzwdp?vp=+N3HN$klloc2>F zy;%o_nl3=iSpu1fc*&4IXFYmvBS*h(VIx+P>U?m~8hyxm$%`gz&t=+yYC#_bvslac za4J{ceyt}S)!2v_i}3Z#g02-5q(~H*IMc#`MpDxaJJsSy346nvd#VV_q+&&rU#4Vm zB(zYQR@@$9rm%$9wGI9zBbUWao^%z? zY|Ih~GVdj2F^vO)i?`RGDz2J4I-v6|5((B0GD4Y$AuCjPhd}(pL{KI(O+fB}-@!>( zjXF7uJT<8ML1AJ%)*F#lgm?Lp)v7nwFDZX^x10tI>uKt`?oxV*OlPuj;m&528W!>W zY1_jC7Z%2xQ!XjSezgsF+&-KI`;Rt0Pd@l&AAj=+u`xU5ul*WIkn}V>X7YUN8W!C# zD=&dbPRm48a19Bf?Xi_vhENW34PjgZP35vBl8oa9=8%IXXThP%$}pxGG!}|iFkMbT z&mL)kM+96-gIe{zT}#ha@N_Q`D9@S~)K4tyx~V3H6QW)zse5_z)nr|#ko~%bFRqH%Fe=yf@m?l#viNm2PvK93h{>j6J4bfcF-F z;ouNFd$tI9$K2dMOv_1JydHzT=Utvr3!O#v>J-rOqNl)RoaIIe{zp~ntnF`Lw2)5f`{^5aE;Q`OjYi?U8ZQd!|>s$C6>bSEd!f<&ShF!qwVN3-lc zR!98h`udEFCz%GyH2y8W!1l#Pf`y2g6I;3*%|qmc@pp+^j(#OHdexLbj0HLT7_10u zTk^b(rjL~qyhqp`+^#C`zga1*s(Ofz&i>QQn4Ao+ZQ2vhny4JJvbQ(-0%5WHbk->h zPC)y%D9sm+jyqx9JQN`MXfAySse%RId#l);H0Wf)-o(LZ!(>y1^_O_632x1l`qFky zogtbQCWh;W*E)VYk815;v_r-)7T+~lEhS&eI5#&JH+K)q(_lKOP@!UJf?+e5sYrjN zr=8Rubaty)-?;co`F7RW)V+iUXH(Z*#)6TW7Kw9PT1&Ru{q_0I`9j1C49P>KI5)$9 z9XD1a2{U6rZlR@>^s*b;AulwRVW_qMe5@1M`VdGJRsJmDdl+lBF=F_#@zX0z=WAYk zec;v85Ma14?adYQ>KdN12h}1IdJ-=Rnq(pC?x3%xRrgd%s-quOeCY}OnV^Ry_!7(F z51Saa%INYF8FGjpMBF`ma zrlHo@q1hqC1RZTVg6H_pM_d$Br$@w+vh*#2*)T9IFAI7pcX4D$)oAx5FZBfQB-b!5 zRk@>BK;JHPaILT|O<8fQ4!fElr24m_nlM2BAdG}T%OREt4aU$O^-LC_AeiubpTj?J z?PLI_Mgtl3K!B=48Hme4Cg>XmP_0D(?OK3P_}=i(r~|1v@hs3AsFL)hBbpOkC-gHy zi?rp?nH~TMa2Xy$?Xd8-1Gq*21@rf)0Eh!}h3iU!?N|rcLG926xWNi+yJn~Y2I5!z zmIIZ|!^ud`*?zVWr5uWkMlYa2v_=B;9{XyH*5_olpjr!9@saREL_T!;etTS-g($ zOT_1NBIJty{fmiD@*R4z>3Zeg~s=!0ah?ynDA>KHsJs@$RAxDJc$~5PODb525qfhU z;VbsV8E@?OdtGX(w%uTb88mW}*+r~7Q1l&t?O8~v|Jd|sKHqIx?Q2eEzbN4*R{Vj) z;fUW(R4O1)CZ17-#2_UwMZ8cFfF+R?5O2#K{mWk<+8tN!ir-4$w{}|8ud)S#Tqr}? z>$G1I%gnKC_KusrRBp-&$ncG1v_xD&=H?wLk^<~(gv_ykppo4re8*01e*29J6&75s zTr=V0*8BvV`bfd&xKsP1jEq+y1x3Zi{iUjGHU*h%vNe3ZZ^ zp1|=F{TV}VU;^2qbgEauc^=={^oW@fjQWvvl}w^+G+!1Rrc?II*HF7)$#5j8N8maI7_<2q+i!s2XvI~JnZ8s@k~-^Y^&UhCOQ&Tt}6e54(j z4ZZ#sTp8&9D_ogb+5Q99gz>QTzeDsDikd9ExAHU@Jc2-yMSGt=!_ya!S`KjkFQhj}LTR(DxlObEX+C+Lt>WNvn4$5gCh3FDS)xVisSwr(nWkS=QQldw-8jK} z-GUpvUDeZjW672~@h{W^3s{uFLbXh}4t9c{`bgs^67d$Gbb5h-drg#ik|5 zj#|l%D@p5^Xm;8CQ&~r_Rl=ycm}V&W;RefshryfsP*%JTRe!A%y1CW5Up_in7Dw?N zXI$_H?=WG+rjK2BamC3x??YYT8EFxv(WITAadu2OpAEj)h`Fpp1?Xx(g3K?J)F@RM zV{m&&vCNoRLv?+?0JLZ{i6XN39y8=(m2_!2fncaitjsiybk3ale8x4&kMC^BSscZD zHnw@fN3A_43}n{a)|4Ek9Hx#~32Gf49U2^L94mYi{d4_w!JyL6#RT)QX0nH}q_*a4 zuvBnp1oQin8)@%p0>*;8hx#euHK0M%C43x29TpuHF_R&1NpPqcaqOu9qZ+A@m%Pn)u|n%#tyh!QdwkM+*^B4WQz0ADPpx=B2(PWtpb@MnM1XcQ75GiG7Ode zL5t$hO<7JCh{5KKlP=cPkp{R?)d+Vr184+NN z+D7xx(;fkF#HKK?*1uDL+32WcrwG78dcGgsW)qcqb9%E+&6A$~u(KyxpjO!(S#QZ45o$;NA@){MSuQ4IDk@gcow8Vq)QJx_LcR$Sc9hqp_k z{d4lPPJVOJRpryiJdqxwv<>}ZNb&fr#v8kee}VntR1jwyxSOmk)MY0rfsHBmA|!fqAu^xj+0@G%?ZTzA?O8%VUU)gmZ7q-vco9a6wO8z z97XF*sSU*qMGFeYD3!EF{HY370%+2EQmNOCx}siCJZ8^@=lB!h&V`dZbJQBpmcf>( z)5x*vv5i^T&cYbm&gO7UuuQ1m7S0vq6ciNZr{`qkh2?}9{Ply-CKK*B=e_Xb98@ye z^}4D?lN&aMKH4s;Pxq)>JigNh?-wUueRME%iJ3I-r$Y$1au4G!3dSD>5$MGbx4+5d9k>7?Y zsN`} z>TE*_^Gvu;hDm%Ry7H0XvGjqohf8)3Nio}`J98^|Md4in$&Y5ajrpjh{xtDU(zP5S zi|*x`Fx$I>lPDtZEi|jhMa`5{jCwrD>yr;wZWCtzx@h0VgBy)j4qoe)I;rD{HV=*H zLgDe#$R76SrnL-1zv%V_6qDLc_+OA>{4b>x8~uMEl`#2NN(EeT4dSo{qtfwC5UM5R zO%4XX|CGi9fcHly2MbvB-{$G}tc*k<)}U}NYilb$xqY}lV2Vtq@TqWM88>Uyljw+2kh55f)aWxYV~CxOenYbbx#%p(_GBefR`8zv}{IoDn<}x`8ipS^7!IUM)j`fUP0Y%}XE&+at zV4|0h%r~25dUkwfS~x1;amCB(PenJOHMC{Rm*8+Il}fVr%JV~yMwbW*O35V@6^4_F zF6y+s4OEq>Akq=;%2Ji6$jzqy5K@Sr4nt?+PQ%Kwx)$(~KJ8cY59>`uHo3;y-5vZR ztWa5~E?NH_itSMFSQsW!+&rwM#_AE z4(6{GOPU|tiI8ZA3S!taoc)pZ2oObG95lodRzGq<=@CS(sM{}ig)9?ywCfg<>+4x; zC`z>>=onzJHbN-L7W`8hO7mOotl6N)2O7F=Ec=Zkcp-Vg-}7Nu<(`XvE3s@35m~8h8a+$<7Gr~0 z$qc!B+~lAw2eaR^A7|yz%x-U1A)9Oj?Tf%Xr$bxyryPsSkEdk{r*+LC&P0D4F9@lX zVNnRTqLLJ<6ur7pz#P#21umxlPGT|9{b!Jimx@lOLkPNhhx*YRj5@GVLn-`g@i9)2 zccFn7;G7_Q0l1qQo+KiT+sP!FDVNF?uszsD`7 zD9`rtL$s#RmZFkl<}JgJfX>^4h7YO|>FV9+@N)xqR{o*RQ1vi{I2n&EMzd>cWoP`% zG&*^dk|&1~&fYvK!`s&%(($0#&L=&YWh=>Q3WK)H35mQR0iyjJJaYnITqL!!hSo5m zM{!9(B1d0hIW4j}B|<51L2!%GQUV4IhDp9ebp3k^hwiYHU@U!Rj*{O@hWO!6Xjjbi z=}sAiqb6=7^#sUQXjf^i7>Dxt^~dIpXqkF6Nv)<_7+e_UEDH@SR`nW13k-!=&0x(z zaIm;c9Pv(gS~5j3>@lG(@tuM!$VW^W^@m@=FJ0Ph(T~FGSN+3i?H&+zzvm0Z(%Y}j znZ}1Z)svl6F0OP~dbdOV&Ab1dZed_%|IfiNX&y+25cuR4rnW^xGh43Rj*z=yt$823 z#=|E`$|4(&u-DgYxN47cupaK7Wh3;NVyAVMpi)T_3s&0vKeyj{*yBnFg#WZA6x#5TzoHh zAfuo6edm-K2&Q3~;E0X~PYxsR>^v^vwqlxx#w~~~>O-^i+(ai~w(iGC>q5&M3Yn!7Qx%QDN#&XjiSoo{s;4{8l#fU%&OZ`t zrUEhNwdZZ^s0weo+$}662j8FvtbD2e4axsb3^3FEXIM#)2>(`qflr^P>Qhu;8Y=K6 z_!wi3@xnitF5s^PrD2iR*`^4;x|(?CftiVITcRBttEz6B=a;{yA{1Y(k{9e1Wj}_j zA)8OS8u*!a86r~A7GW>aWZ!M7A2JR!ZeHv(`X87c6`Z-s-j~rjD#r!6y-tcqxlCT7 z3!%s9v=`>Ho9}|ApWM9Rm+7j?M#{vUa<{R(%8#xdm`k{lIy2g+c`BllD-Rj>o($l` z37105ifJ|u+h8TQwFR81nyTf8z2C~H{!T<_6PUf;nzi-YHs`_x!pubv5n|&*ERkbf z5L=f+#DVPx++%#zWhIJ=C8Q?&+-E3LYu*5E7jg%CwMm^55`Q|7{PNfRsrPe+{CMFS z^Vtyqm+$1f2D`1LAYM|Y$PsZh4&$7s7F$--7*J43<`l;X^cSDB!txCAG*=e8Vsc4S z#)tzUf3XzD$%%rDY^vj*)L}-c355BKUR$upJFp{WC(^}U>$q&mK|0h(bAR(lhWJCi zqJarP`GzniK6FT|ER0Di|dnoJ`b``1jk?%{D~iud<2rQR z6)g&`RTNC(7t+_Q)XdB$=*W}?=iq5+%GX!=6CFfX+MbMO8djuZ&n6P%DDH}l7k6a7 z=b&Hre?T;NORlCab~E0tsVMI_VnA;AL}LI#fz}X8e1~#xkeL9n_@EYk6W8^S<;(DM z3Xby!oQf(==j8fDpt=iXi6pjG z)b-<%Mo>UXLEP4U_2=xBc# znVFb6;?uLU(F)pF+Sn`D>KT0BCuHPoW?&>QDnKh>=I9`6WG`rAWou(?WbKI0Mk{9h zy;5&$^LL>h-_hR5=wH|F|7QtbR?ptb0iTPDR@UCg(9FQm#vY%Z`EN~5R@M&xG~l0F z9q_+jD$y!P={Z>7vorsVQu6=r;y*nbD=X9g71%Q_I^BG6RGhB9xSQKdPOQ)_nv7$q zXoUt4_DQ6-qJQdIj)QGQBg9_6ace_}QPExltq{;ccGFn`(h?*1QBzv}Mvp`1|7B@8 ziv9C9dI!F8xNGc%T0|_BS<;rVd#Q)F&%zvc{;Z^mlatHC#ETFcH~01lk5hZwWvRmy zcXCae+qCu6q#;cH1OQWyE?r0pKZq}&zA>mD5F@ZI9X%pHV+aHQ9{_gPIEq}R`PFiK zB^NP20ti2XI&9;bZxO>S7>_d7APPas1PGljyIc(y#d@_q9ThnAgr%F@1i<+=O}>hd zBo=@_3P;J=Jh*-(hv7fBr%jK!)L46CAIV6i83Cn)q_mD<0_nbqmAKd4!T{jobCdfk zG1(7qa!aw9|4)4*V~#ajjp0(aoC}9vy;lhivmc7Io9ibgzZo`ha>q`Q-+f%ZVq2Ec9R=-ZV{RVfiEwa&AxJ$-~j1|58*fS zSP>xhaoB8kIe@~*czzu_*x^pzzBNXk(bspRQLZ8+giqu?+$oPw3-N7kC4kN zq=`TQ?mW?<$z&T`328UnfdC6wwAL6I=902w{~A{quUX!9Sudlg0v9l=1p1wCw~-v# zb|jR&k~I`(B?u(E@_6M;@{s>UMfLmq+XkKL3FK|xz}V#W6a)La#D ztBA*_jd_;rBs0q8R)b)3J0ZEwxUQr4YJWOzKi_&T3Dkv6z@ zqZuiikCz|H1b0`zll#XRwqSh+x>`PqTuh*Q-=n^({%e$^QSfb7qoSI|W1 zv_!>ZN(8SN_q8YAf!cq{t1SuYdgZLnDyl1G{th*ABsqVCv~<6ix?_Ib!_MDjQOYQ( zA42~#I03LQdfPt7%z{cYQLPeh3CMy$0hBbb)_KFbZrp)Ra=X0V(qi$^{`OqySANk7 zw@L;OB4fWw2_ zc#|T(=l#DV<}X1ogq+G+o|YY5sJQqUw*K2pkD3KonoKfhPKocHdJg%x3cO&t{V%p4 zBD!!(jVgyIs1=#EvL{|idPa=(IOMpb>Mz>()lET^AC%G@O`l=Vw)K!>FC?z+ms}&l0Q{vkvUb2 zDk(vFKtg!9+8*HYG%iuD_+WHqIU(U}uyl2* zZkNTfqgS#2UrPulPSs^CdQf9ykF_d8oC|G$B|(q6X6OpQ* zJid#%I70hq%In<-ULg+v7qLSB43GtWT*QjL0!~3jl{nc;M{Ai=L$U%Yp=~^O1s$Ks zhA#)fzXd9@Hgp)$S9P0#wcMv({}NVG{mrVmT%+ zVg+{9sHthtJhU&MVwlHycA2q-DE_PSoW*hWI1R^NaCV@lZ$h8W4?W$(QY&96S$B4c zb62)drrq>7BOyY%a38=HGU4z4IvoLo)-_7^z=Txqp}e8UuzetSG%7^4Fm0ITLk~e{ zyU1O6uJIo`F65hnt-m2ovRtl(lO7pRvV^PY(55ab=eB)*M(FP~Z5ypEqN`>$&%6gvvPdG9n9=D;?{ z;p_*==Tv95r5W`&W3yE@;FkY9d6L+EYwo*;gxmOp)<$(3 zenTql5}tUQ>g`kENu1w!z5%)5UQyY6*7}QM07;3{Sce|#*+jvTlF#A9z><*U{?yo1 z$9aV)bb1yFO$V|2$w4N%HkOltz(YPW??e7=K0GR%PrE7wh=I>G*6W=YckKXXW_Npc zLif{^NjhB?*zVNZG6=KsUzgU@l`eL+JdTn3ft@!XW*C`TuNZiT$|#}x(w#&?(0FJK zC)%87H;+PC!=T4Wo!NYjZ?Jw9(xvZlTy) z5+sNjvi)tjRv~Hck`ksaA0Hyx`)oYo$%ph|342fKt_r|$_~f+N+2`7!lT&+hcltB; z&Rl(u-P5~(eXo>Rr`w_^iyrYW)=GW13eQd|GN*N!r*%ad7BafVG2Gbx8~1UEI&}hC z1T!vfh$4DVV4GA4DJANnz|d=b~A`j59@#@SRos?wV3g#*eu;_h&iPMtPxanqI0T)J}a zynIsCeVl>ASGf^o%FcLWHoUYX)zB7gJEq?YEYrr{RAoL(B8;QDLH>C_>9HqCAl4Zh zo4Av-z;^GVL~C^0ju&3MW-6bCUTZ85dw+C0FS0Vg?l#(-uCe7jdjHg*&|lq~Gf+{T`Xf!I<-|3S0Z@vMTKAkDih>+y|j+R))- zvQcr=VwKOqpkOc@u6YXkc#R^+S&)UanlQ(uySD|6v9kb!#?cU{lCpQbMNi0>gww1 zs`^!x&S?8m2D(2v@@K9k_1#4A+O;s@D5@|Gc;BXg3_bu;Jiwi=s?2-^8GHz2|q^y(}l; z@Z6tJO?yDw{yrRw#5yk?#R?b2>pAzoY!{3DRDTz`mJSa1gZz#S_9d&bUe-EsbU0oJ z8S^kiEbJTY*Ztyc`TY^nj^LQkzeL|kL-|ay46}|7W?=h5NM{^*UndpnHa2XLU|Cx;P(yyAjln)DS7C zn62|_eyN};$36>K-TTZm*?Gp@y7u(QwqC%RvVZR1dUwE${7*{3OF)k*$BSxr-M`0K z0?#i3l>;4GcTbf()dNKE?a-&bx$C!IxzkK-0+u0#v~28rCJn-as2Guf#VS2ER_O7| zTniN9fbg`ziNmX(pL9g=HId%WWi!w~Rn4pftnQj!7VVUcp0L`Rv=$wW--is!H_@Q> zjNkfm6`#KrH-~i!YS2G4gdwJM6m7?JPOo;ZnahU1UYD-8zsLRs%;r222`_wjwet7Y zbxXVu>BN#p*8IhWi6E;P*m0N4KGLP=di;QX$XZma!=-@)y)@dbO?k!6{tKmisHweT zM7zu0XuW@-zPi#VSM5PO@=bjRww0^IlRoS(-gf%#bqS5(Aita%^}CbOzucdX`dr&z zHb>`BD|fp3+FasNP;P6rW)sw>(UA@?Ad1$UthMtc;Vbka$m-hl#ss^f(&7zA+!@jf zHuyf?bghe`tCK{1(xf3t`xvTc1p~OGAgD<>4ubmDet^O>{o3R{@Hpo=Ht~EAzlGpu z4|>(BZ{|QSRxAw<>)^V5Sx>v4>m2jsq+Sx~e5FC^LG1JJnwFhb7O|jPZn9UT41K@$ zSTaXVxS`DytW{6qFF2iuZ*%93B$`nlZmj~+d*%c$lWD~n4cMH}!Y|gws2>{meZETZ z1NR)Wtv@C$@(F#*;?IL=qRH9zZ=-m<*QqPaZ(>;O7uk+n)ng)6toD+>>){3o5JT<` zBJq)^F>ytCoCT$a_V5|$iM3x%RaO{9K2abOS7faB?@$I++=IOac*!+oW2O&^{$6vZ$~(-6 z456w%(kabD%H_ar!+O&qW3fsuadgoEQH0@aJ%-1Zz)WcKR*o=3Ce{YC;N$}nB(Kv9 zewTLok&E>w|FjG9(V|5m;E?~b`C;M!{|Wu&Z-Ya8{&|aU0+5RZSVM8nFFKIyZm*)= zjdB}iX^otVk+nWlfjZRfd~MZA2lk`*h;z-_egB7(#zfULi%PE#00q9^GGl|dVBy!} zS8zR_zV%6PTBn1~O^Ep@^>R)|H!;Oxvld#)uX6v^R;GUc>@~4W1$5Y)3N2@Suf0N6 zPxVW~O0<>RgV0`{H%fl};zuaw;5Ntk$#>12WJTni#jJyNI+S!unqGN+^2_?w9&NMS zyMyDg=lr|2@oUt0MouS{&g1DGgFk1Bi6{m#Y@wrU#?edo~f!2qvzY?M>p;9&YyqlBA>oq zP!zVl+BHgAM;vh4pV*WL#7wMvjJm`i&>{wEsFWI6p!LC5hKxGdpF5OSq6g1?as09d zF2@XYn2*O$!pW>zat|6*_}I*$<-fQKZUoVeUA%VmoKj4%KfY;-4p*x3i-NdfNov`fm_}2J%A};}O^z;Z21%q(%m*O-wt;q^2=^CUbgz<{m59Ew9O4HYmNG z8yg-EL>Ip>XC(%km!$fE(RfrhO$5ptGi2Fw>eo?>_}t7g^mAeLVa3G)qzu#7=lYMe zuL$dO0=GF}^`O_k)_h`oFXj`MgVGtJP=V-9Dy65Op^CAQCX5jj=4{uwSal+DL?#nI zR9qe-B-Kd!lblQx40>q02*1ZZaA@_}^W)+#oA8s@C39<3V~F9RY!>YDgf|b=_c>9G zk)lBqWpdz|4p_j^3J{L`eqFByCoD3Mmo`1k0{4_2I3c+3es0v>L{p$96MS0(jc?;B zO3ujG3k4QkpN+|LwzgtU&z^hrv;U}iL+YFVG!tjFgwR$W6*?Xl?C_K_Wj)R(%7q1A z(&4{GR(9MDopTiIMu9_$Qjk zFA=Ey_z=f{@3mEz67$>NU2!XTQDb)7+=8m_r5{f=TI1zpF z9vnx7Xxn|Z+A0ry)MoOL9476_gO~fvO9SkDFp(z*V$2}o&OM3)B}Gj|YihcR#2#~p@jQ!_-az4lhaqc1jr@cz?iQ$R}0dg0}esSc)hj8Z8s)5xesM9~g>G%RqG|IJ4{aRS#*WGUhaqle)f? zkuTSrYAQmH(~($MB#*Ysu`@e{P@0`uArmiDSH-r(%!q+fF5OK*65>Q-M}wd^c+?Agn-@%u;=Tbm-iCaYYtx^}N${U<-vmBr= z*&oKeR?HRc6OD2Gn|LKvAQj?EX+6-Kn%nQnLadD;swWKXyyZbQZ(zbWpiUpRGj+IaS*swk|p1IY`@7|Z(x!^KD7ktA~h!E43 zCDlPYKN*@IK*mk2O+-YGVNFdwCl{F-E{`uhGmFFLxFsEMj)M(3i%CgysHRN=uqj;hn_Ga22;3Tj zAsR}iexhRVMHFg;HGD8N&6Den%cQcP$$f!?Q_lS&5uO2BH7q^dtExTL<#g#Xs*hX_ zYcAW~bl2oNv}*!ywr^uLUL1hTxN!`=2FRhC_URPb9C~F4%=u7Nr5#5Pv<;o`)5uAi z)2rQ$8scp|9no1h5h}>Oj>s9GdH9G_Y2xAG@s~1{6UMosl8_e!s92=01QMi<7ADq; zpvN2im}b%ktuOP9m?d&@7@gd6oV*jRIZe=Py=LP`$s4|RV&_7H#-FS@*fG`97}~3` zTfJ%a=^r=1Ty?oThu3id!%D?|I6Plhr^ohfIGox|e}U}99Txk?{IGe>t;4G=cWB>> zO0(}>hJku4zkA*E=yDUxA9@HsQ#QskL!oT(v?ezA(l6Z>QUhJ+1yjS(0wzZLBUTQ` z-EM3-qe$A0omn)U@BVCRf9G>M@!0!}rk5M@9&Di)qiV&ML0~QLrP(5c_2f$cK>$b? z&y}9-do&umvXm6%$a<@(6Mzsfx|;>Rq056GTKbipf`AC{l@8*jlX$#6zkOiF&~%MY zCVl5VM|qr;88Q7Z8H?H^v#upJGvGCA-0cYa%e1pRC!_L^ej3MFAk|^9GgzOf?%25m zV#v&xW%5D-I*AlP-6LjM(P)^eUbW46c_%B)mk8_L>elqF({TvHP`RHp=f=w2r&=;1rpp^g~;U2r+_>FMxO-Vp{5=kWhcRlOv zwtQQms>Qdr7g|Q{J4SHWVRm_)rN_ymStu%f>VDnVoX%X3mGu$qk0c=5nGw3Z9wJX2 zHo{((LO1gsXw3z&($|d`WLLG!GLsY+w`Ot|Kx zlv+&5#s=wK2RsTNPPs zq%FNuVg?eQlp%pYds?YOcU@yyd_g{kEn1}OTiXR6f61l(f-xdX!e@3Y6~W6N&0vx3 zMHub?9fYvHSq=E_epMA-G`FjT_80`WXVd(A~^SrMyD=-5x zj=#VBu`>2CX1t!yvT4%o63Ef|oMPl_QZ?((Pa4wHDRH|D*7bDm_(RQr=Fg<=4-GWRR%soq8pjtjUaE)?1`n;J zuYCK(7&iSO?*+NA1uBUD_8d50rA z+gpn7rl$+KGo~7UZ1uDl6)Ujws7f|tuvCK;`iYKAJUgglsX~3YO>{6pi3vkReuwx^ zSN_=+gO+)+0<~s>pCrZzy%|=w$8rM%B7U7x9xg1?`wHqfBha-F|lad$7SwsR1Bm=dB zLxL++%CiVnpH%tPpO=t}7(w!`NCkK<1{k`yql$GapI*OTyI~YctMjsWBulk^i z6lORyb(q70C;VhPukpyiAD{zFuy`SSDfh?7u;Ldsg6oQ2Yl%wpN(f5gaGo~W3%V6t zDsxB39lHFW)SjfZQj+crPz&9E* zSlO5-bCqxQV1m`+|NIvt_tF5vHIQMmE+-A*AeMix?xj7xhmV-`JbXmKV>w$>w!!`z zB620Qr<;eAm_bbIrV-skcS_XUa|!OZ@$p7w*Mg^VKeohLB>Z5$LX%ioN#}CKFMyob z?&fg-fRRiYTU$?r?FS=C1D|14yZG=rV|BO4fviuJ%?*F?Z6umcC^5iFua_6;bteMP zR+s7&!8h(Mn=2_&);z&EacLhLI&s_Cd98Sajdr^{_J$H)UK+T$g4Mk>a7S8-)tY8V zdX!;*n;vB)r=I4zFucHJfh~paBGV#*biElE1E6e^o9x%uti+DOWQ&{3;Q+Lc<+kIo zHly*;zfD>v`kSE})L*aSvKrfl9WShTA*Kxj%W+99(i~8T4q`%SU(rg#TF-7)PZ;_7 z$npgE;vk)gMnABoJwBw*NP-Eq%@RK~iTMGO@NxIcHd*6h9_))q$y4!8qYEqQvy67V zD}p~Fl95B21^$djVL(|HeFh3K&!@`&yyDENB0?v5WbxKBXX=OXIFi~$kM(DIX#DBb z2sElFF(ga+s~f?2?7oW2i@WPs#2v*gJ6iREPxwID51Z$YJ-74}QM#|PSdr;|{WOBy; zB9G6xD4*#S_+3YiDJ=@QWM9;2%&PJzGyb_$OeV5b47y6E44lP950{QtNumL~0-Lzn zJ!MN5zQz3_fF@Uh*xS_H*+bE4=g4jl8{qIslZ!8TC`OFVUjY%wvb;>KneDf9Nz5Oz zCZZMkCu3Z4Q~fpyG{wROLTU+*E$X`hgSS?rm>rv)?oxbWrmq?PLh9QHcQbJ^g~rkY z{+{i0oSJ$4PUXBUymb&}x$$RZ4ers@-ACBikx%7)Uw0ugD&75!j88yd6eqhM4k%>5 zk2oac3L63qus0(~`0+}ljgBr5gzmE+ape^D*!e4t2iWgNBFgaG0`4PR{1`JxWz8WM zstY;4r#&Gr1cFFuPIuU&7*8zWAA?G1C#kMvhbJCfLdj!sW`D6D41$%RdtIXdrZ4(_ z4+ofut8sD155@4kQbT4(jF(feaVedOcj%OheM0Vj%vniJ#4Rq8R7bR2OjBIato9&9 z!aU>A)owkr+c}AY`RIRn1c9Yr(YFF8pBPujWdfVBa`3j zp}M$OYP$Kt!aOWa76s`4w~=Lz_N9DTNQi~Gg&&*hHz>uuvh4G|q+0Kv6Bc&vYbS%7 z6FB+?_b6q%ea&)5z7;^^WRqX_J-U zobdH4?^RAe>3W`*O@C}rzL(*no?2=fxb0V`Qt3kHg0T1Uj7$*H)8(=e1opuw67wG( z+1lG!F+>Ow)Aj`jOyU*dine-uLOBJ^^O4$d_2kUFo~0>lznSQy_b)4ApN7lHt5t&e zZE<}4U%7e?Moe)9wK6YBzEG-&13A|LnY`B=0olC)rF6XnU)Zrhb=zsW@<%QYhymGm zx$tfJys48|L{?X0yW)d8)OEu{u^)J#$=B8EKJKEJr8-El+C}14hvwCJ_Zf(1S1W9c2 zp7EYkc1Al%%O|w~>n+~QJKLQN`XRTWHaKD&iI;AbnPYLDl{lr2<@TqRI#~HGtMYVM zrLH8;`05raVV^4n*5gyx#27yo7^NWQ(<A=+qvam>8T4YT>91EfwJy^HbqJ6gb$L z+BP?1xOWq01l3`oR(aiaU|?BLAAekM=3P7~nV(>UDOTWQe9p6QahW+LExa_*pO^E_#y^IGV%00b~=Vsu0N5a zZR7F9sLJt%L#kSI&CLu))Z;=z=y5@AH~Z2nUbo3Etz*PGL5$>YP_SIl+Mgr|4#I1< zK69G|2O~23c8(&g<2s9!Mtjcv$)Tz&xgzE!Ved9KjDvhx=mR;T(*q0B{0SZW(C~ac zs0!H5gM>=`b}V+Hshv3C4i<`?i+&rCc|$n!uk9x9P9&vfhySjsJw$&ys0aESoHZ}S zweVG~UB~Z)j*jxJc_i3985(Z~gk1{?3Fvyg2o2k^y~rLY-}p!|b6^G@mF>p~91ia; z7Q#ue%{Xc6O9WC1hg)Ehee@^?6(l(7mHa?ia4xaE}PI$CFAfuQA+Yk~ZZM8yQX; zIP1!6%cAT>^E=NO>QmZ^>g{bSvAULG`d^<^kLvy7`J8^vSUipsvR9FQu2|mbZlzDT zBRwB;a z?ev~TQ4r@l6aa8!P&@@@3g*wUXsEaFDv{C-2z25)hQsq$NQk#R|Wf?IbscN zzfX?$8Lfm?uPpk6zUu~s{GJ*Bk_Dm1sc{#g7|7IHtkdvAl}JhUpC9(vci95_hBZ#S z*u!D^rt<>QacTeBq}~Q0VXe&S2N!_@F~w{!hUCW7KQFCQuhw6M z3Ta4KI-ZQtkW2~>xL?V*YG&__^zN@v5Udp&upkle+gbb5zv)Uso+JE!(43h_$Azy7 zo$$Gbb-*>ZyZo~y3NX$j^ol7lipqR&hUrP*kM>_hL030(L<`3UXN==;4lF8AqZ9c|L zy~1bIE_Em%uz8kitd(^IiwE|B<=O1!+5M)-t33-ZrK9l@r*rCJL&Kc(VQFQ>25=Mb z$Dr!O=Xtrsd)`A(Y?R&q#$++URUhode>{_z-|lX|G+z;6skX%=v9L;94FRm%KpHMC zRSh2k3~KUNyGC3Umcg6%Od~4oz`WVxIzOKs2Wv!UFaMzyA?hg-J%0*A^B+d1gl($W zu(mJ^e;dd(5Qx`w>n#0a?ntq{>&X#n#kE-mvdX|kz zUqsKxxLpV(^={g>>IMh(1YS>99ZA=40;+wvgdV;VBwSQ{sV-k(%473r9TI3y%BNxO z^pO(q?*J4&C5tw|D-@2||5`2yj|;gv#X{gmErhoFPB=m}upK2{07V*dPVAN3(^Fvz z?|U69snb^Z<$3+P7j)GaJFz#HnYDte-D;Pcfb%YsXo>${gx$xEEh7md&QihaIrn~{ zm)rJEPutsx=1>~%xtzi(KkIn}p>^kH1Qj9#-)u>tr?{;i1D0Sb{^RMU3s-|rS*Ob> zmaQ8|q>pFdWZK8J8V_Sozw{E8f^_D?M)Hew%`M%Rxqg?#n5k0J(N)+UP_ub~+ zkEaG#R&EqZB0EXpZ96?gtaq($&r@H$Ns(S$+kJNJS`J??HaS>=QV5H>yxZ8Crfg%x z$t6p5-3l;A=3eQgh7@L?=V;lKaQYDAUd~_GQx5V@@n$*GhxEbQv&4M*dY%}S&8p%Y zkxQ+$^MkcWm(%Ctnr1~GKPYxSpzB`4g>Bd)9QXWbt9FcHOHYcpRM$iR81AWB$?`t? zh@q6B{?*UKSi*#^6!1ZexdRDYeao@y;@sGz-u#mDpt50qKIDk{ggkF{gsbjbrns6# z23P*8pXsNg7&eOPxv&)Mavw_08l%a1Sl##w#|9^&jIuc%+?k$yhpFF@BCr`H%#Gjo zXqgd?k^_g>vMH-8V>i#OKSA&%QsDFmpX2#?xy_z&`kTs`aO36W6*-E{nvd4Ay><*i zAWIm5%f|&sCWWV5d+2d?jRLmeKzgO+^gG3$8cAh!L=34=PCmEjM^SJ-e<3Lae>E4} zMSUF`e1==66Il+w#TBFZlJ%kgl94zLVBl9rp;7p75kGDwNzOKd=xvp!`p2h`D&H3G zZV|U0$s?x2ynY~%D_7*KE^NVKgUf@s5GNT%S=beETs}a(F@U~ibQBN-eSV5W)OcMG!ZW16#D3xg<=}f*a}Zup@9Rrhh9q4`0?-q8P2vS~ zcrBgWTDmk9sFs^FlO!JVW-_Q>&am!N{EF89G@f;R@pk=7iiZ8NY46k*sP}OVcl%I8 z@hI_jAcHMd^idR?ti`$=Y0bRa>F*zes-56-xn?yGTNy^`J!U->17&=6zCITqVQc>8 z9L8$$8yk?5{;-AU9<21&L5|+SpB5!s0>X$hX51~TUW9i52Jbo->*TD5jIvbln?*=@ z^#HL+&RAYQ0bSV{Il&=3FOVb;7GH9Wx?e|?Bsr1?8R|84EtcmD--?N5!p@K_8wxN! z@VbQa+r?UUj}$f=1G&fVdu?-WxAicx9_zr}I#}o$x{eX8KE=3!#Amk4jc^ZMvmP0+ zM3zH;U5*1GJ6MGo$~G$gr4jTpW{)=!A=M3+9^*t>z#Zn$_OxYpcniJagU1VG$5AVMJKl zCsI@^^9cP<$DGClN%0xx2i^2rzfYI*{>eNS#@1Cc%?&RGIlou`o?TtwxgZYEXbMzT zJc#Fg^gx=js0=#)jb*IwvDum(NIT2=ZCK&@HV3QXGqQAF7+6s#fVU-GV`2|0&g9$# zV>kaT|KZy_Qe^JQMdrD_7M!MouTGQ8db-Fdobg$mk9(5fGM25GmKNWEzt>L=r_+&6 zKeilM?(?%w)g7_hk>`6pP>1ij?%)6ot$EXPedI&r8Rx z%>K?AivBP{gTFq!KDIlf`MKJG5_DYKM(43=Zi#9iBo#F8KkztFVvv?R|B@XU+VRXz zCe4Pp{wAhX#Ug=e5fAJ0SOo%}GyM~hBHTpMZzZFLk{&S1=gN9W6nZDDiZ{&WcKx5pACBR);{l~w1}q{Q^J zvPh*gC{_$DByn#)FtVeeYpRV@yVfrXG#pajlGLMO2qn$W`3G|b;Vv!@R}BqACgZ8E z_s>%%>+~No9Ntx;=WpA_t|88-;i$6)1(nuLMu#C~+}}m@y~TEUT?W_rs`R{HR&3Um znS^0(D66t!tE#qEY>1gr0j%}RU&y&~b06lX4-QI-h0YaGk~x0&c?B_uE1lM}M@J*3 zw1?>9)8f9fHW8z_G|7HpOR7cKmpbHY({K4+rKL$kQgg!9iaHz|0l5jvnVJsYf^U8MW&r5uR$P=#GEbu3n` z=|C&c)X8wn;P_L%i&sOxyCnsEB6&UeltNa_GB2hfEAVRtt=Hm%Te zV%-;$-uCA*J`p{(qm!aBX8IJ?jQwAX<9i+t-$7WH`lK(X1S`1Be^U77Y*lvIA>mg@ zNd01mjkxhbOT8Lf&{450WdFkI*FZ;CUQc)evu8#xKC3J*0coV0q_y0D&2r=ET@+mX z&I+=J(Q}bSi)R)e-baYDryt=6#aOLp#PGXOvhyJ%YO}HOQLAY#_izZ$#?0^>3Ej-e zc3W@JZA?=K37!3N5WgF#UU*f*W1 zn*}E}ar49L(A_Sw^Jy#gXnb3~bNM+dDCE`GyhHch^&R5`cm2?2S@CH*0{{rz)(_IG z*=EzF$4;eF93@j%b!%-$T58~55~fuPl%ubM?=@U>=p%lW;~i;Y-^&g{Bo z_U&t6i0We{;}}Q^5~sM*pGbVSVkdTg2 zZUwy~GseOoPb7F}*x&s~Qo7GbHIbxYQ0L#-1Z%CM_)A; z@3}7pFI>XU;)V9$nla;TFMnOB<8j0gr0**~A6g%y`0`ou_|HQJkkG<}52>_XFM^L7{O;Of9~of@6{xHvQ#aCTGD$7jqL?Rl9`&f0ZZEw6hG?0KiL zfI*De&hp$+KO^77vZdFY`TG0d*sq?U;f7@*h%U)y{Wx@jFqT9>`<77u*v9NQvwb&&5qR$=`=0lQbHVASJzJzn`SVAJ%X*S_Z}cKP0x`HuAt5z| zkP5mYlzL~RH~+R|y=L*}eWU7mx|yh;{nPnsEiA-EKYgwA)6D;MDvScL7??=>B;n0wUqs`iqx|#nE)W2s zrZF;2;`;=wTF%zE8b0Q>Q9rL7ZLP!S<;J9c9M3J5H~)Mm^JhF%o;WYHH+(8>Qk}?A z5^~dik4hs3Ir~M->Nnp(J%Ff%iqu!mJT|{d7iu)PhfL4oeZw#dO`>a{(Jm)Js5#D3 zP6F0RsIY4p&2Wd?m~kY=d`y`js`F7Q$w;K3i7uI>zYPty^IGQ{o7twZG5xz; zVj^?^FA|I&Ee9%WrV#%=s#wx*u>0#Wf~)(zipwl#3W;EwbX*cnKRHb-J9egWRj?G2 znkPA5(2lBr*p=+TIH3ynYO>6==VNS9@pYmQZAdpH*(LJ8{_OPHMK`d97811Nex5w% zTpb{npid;SuV!Diar4$gE@c?;f5~gt@vR&r-w_Om{A{`|jdAOhQbCJk(wvK?e2H^cu&&i6- z@u`7i^`{Sbo<>yv+~Zn6EuaEDG^8DB71I}O2%ATD`U~{3nBM!K^QKKTCkYu8Id8}C z0+IACeyGGS-29!Zh?Ks*$y&`t<^!9Uzw&CDZoT#j&^b_j-ce}UsUWMzl*FBj9?mzA z>$Dv7IJYfTtu{YDiWrD`b#u?#yo&d7B>7vSM37T>Nn5&Lsm6MP7kq zbdMUPWG|%#BOE1ZRKDUw&2Sd-oH7ooPf1wlmnb__f)Cj=xp?|_XKES-GG9TGNMr@4 z8SWmtC=?d7UD@KBZrKervKdAxRy@F}1H6NA681H3*{Lvh*B$S^cGBNg#5dbizx37* zF1%bsS1X>%njpuVoSiOb?o2r14^<6!cWSxQk4L7|Ldl~sM9R<;cR}Rjf%$TN{E1pj zRY}9DH;b1nn#F;Gd0HBaHh%dReg1w+mFMf7LW#stv;{9>RKj#JH&q59G$UJh$MPvR zHJ57OysfS?>7k_ax&x-?#h!j|yNhi-feVj|vG@utyC4X^`iIrk9vS|^a@#md z8lx3Ctctv#`E0u=U@ zV%p$d|Cjb-RB|&KwC8&$aX@^a3Vp)JPCq30Gc*J``PyzIHo2`ef6^LTTDo6%e-XvJ zC=*JaulNhIV%G?vgy zSJ;u%u`u^ofWZD1G?S&pf;8Duk$UI+hdkwA8B|cI@zb~3tu@SNx)CTSD013P&pG7y zD#mNZWR6j&0?7LxuKOnoMjaIKzR6_|?Ae@p;jm2|P6D6Z_Q$e>d`>(Q!}E-A4g-;T zYdS*U369jN3Hc#WsVq=6O0ttwb*ojRR?sR&1!Z(e8RHTJLpr;yR!+KL)%LjknRIPd zk%Zyw`P->p$g79Qf{WJcp!9|%A_R`}Q95A=d0}L>%3!G*lfU*mLk-)~Fj*_>K$_g? zL8!oEUDjvu-HWnW`!&dya1GXG3;J4Z&dUU1Q_^}{{~`LQG=CG}H-}ZMnO~9<%*EA^ zBtp{EAu(gzf=bcnMV;u|l?1sT{N5TuehoiwdlpqnePdH5ETx^4-e6M6#%Y3*rPxIv zdLiCRJF25@o9DQdfY4Th)uTzYOf1jwfkemiwb?ily0z;~i0Bn>!~Hpg!R+`qa-n8F z4dm?fzkVlA{)yAu(A%FEy+oxBW`cei&F=D8&$sF4IfYjJiu!=;cipBkT(mdDZy;&1 zJF<&ZZ?*@4gT^@@8)`A_0Io*Tb;Y~qjpqJVUr&uUXPzGESb8BBpT5M;=i&c7nwjPr zaKT;iT}4FZ)Q92uI&)pOe9|+)Zgu?#jUYe6jEl24s_oB0YqK43Ah2Eiwi%g>iZ9h0 z;AHqqqVu1nY)-p&pc3R*GdDq3HZyKKat}zVB;~Jue||)vW!t!T5h%4En zXf}BEb0zaH2xeK>PJd{Oj7M!Mp#FW#s!+}ELXCXCJD=@UQpJAEwf1sI+k=~ef5U1| zGDo_33h4jCW`RBaVCL7B;9S-;u5A9^L2+LtP@6pm%-zs4$O!p#Kxn+bsOosl+Ik}r zGPrdf_Kjb`8F3b5Y*?e&jc(<;k@+u#DCSU|A)I2%$P+7OuV-a`{W4QJYijN*_3o~B z%YEa19K$Q1f#ZYP&6GmUf0#^KBK(I;S-L~X^BDSVz_wwJwcpr`JZMTrwyfrbH!>fPUXM% zx`BQl7y&u=UXkCk?2TKcs1oZ@P#v~(6!PK!Z!`K{_0du! z^o)Fjar~-xt;^08V&c8HJl(vDH+xq=~f4`D2 zgav;0c9R!fcAYjXm!it6a~gg3T@(7)lNuey_J@%7!q3g12ryC1G}M3H}{$v(%Y^=(FZ`p_Bj)ytfP^3!R9S&^3JNExfxfH4?8(_g2B=STgJqzBg_ zYd-EwTL3NY-4N+_lDnf7NLo%)$g}Km;_;*XYn{ix?T!u*Q7D<$;~Yv~ZC;TPn+z;% zPf)1%1Z7)%ejsj+x63}li+wXwj*wq_VBV4a_r~)d_}l^hsIt2Zbl&|E*#k<_(2)>Q z7>)a)cKXy|RcFuQTN`kK0u1ZR_PP=mMu_-NT%j<3{9C;j`syAl{P*O1XuG1SI7&v7 zO>))YDE%GYKWhGAR|6>x5u(D~P%1y}CTlEXHS@LVkN|*6tJDGF>(K2g0l&=846sgk z-UI?sR4g*x-jB#UPLZuv=NU$`d=@|>VfK7bVVt2sN%=s15FrA;>M3meAEo?IQZv;q3TY?W<%X#hg3^06Hn}-Ij+uo5z7)7myah{VWB-KbN*oNvXaqfwnkM9fSFI*6oem(P91L zyPru5umIIkTBr7R`$mOTI#*H05r+7o{|WJgsCJG}%UKy6D5fmy@5-#hnKsX-&N6*w znuqBtSO-P(*Gl)M7nA?aC^=ftmiy@zrlM6N1h13Qm)DYyh%DQ@+Ln5dmM1K;85@N8 z^WOQk15^mqe-kFqm^r6`)3#k_y8i|HNlhJbwB;)=|INW>j~KEPobx)1Q>Mnapc6srB{22iZrO(x`G7^xjr}f^PG@o zzAXc!mWoMs$IWlcK%{TG=FP_^6;!S}9t>(!GIC_9;7|7M0>ZuFgqYxeOyJ7R0v!vq zvTtDGk1W~h3XYqlbM8Xeb6>^z zIPUs<_;3BREP=d02*#_S6s$G|Tcw|lFi==($HrMb^}!-Go3U6nUWV#E`MK`vKT)or zC9mWnGb~HAeyey>>!Ou0Qh}Yi3Q(aM**QoPJ}Ya76A*%#hWRmQ$W;*Ud;24um-*k? zbHpd%cJpFUwBCETEiE04AEAz?XMw$wPV@^k%gUgAMIu@d1mctGRK-6WEox#MxOtpQdIxDWfV6% z@c%5+nt7V#DXi9a+qEx%E{-uo1(z~2v!bNrY~W{TW~Hufmt>S|R%%esIQ-xz%fwJ$ zy|mTTH$qhhsR}WJ&8f^PuRAR#A`gd(t)w(}4{3S0mX*fm?rVRxn>8-_XtbS_Sm%|4l74ILtq#Nz@U6NIZDL~?&(|Pv6X0o0`LbpcTJUtHuUtZ z4PA>j!2;xpub2HZa*6RxqLJqXcUW3@0EX1c>qHsa@jnEKX(a#K0eC5)HIy$HRSB32tma!?aZ*_Y90lG%yDi8M_MvJKD0z z1bLc9BGQfpV3BumHg*?DFeDt!)&oFwvCj-$C%Zl;3#mg{y{04W`4xl9V zSU`RSvz>p)ItpDezP*;CpHvUUH3t>-#kZLiGM$`bx|U}^SHaEu_=m5KFG`aF0Kng1 zV(fBKd^{oM7Bqlxth#0XHH^tq-GM#;z@^6$q5eLat^d-94Y`KgJryIN8)b{5e+3%A z!dfTXV60kGTXZl600hSGNt&_t-yG$)!T=~&jIu5uwD`kHiFL`i)c$^y;>n3T!vK{0 zNaCEUUP)tWQ3T{>)^JQ7bs6R#=tBYUz#->3^|S;ZTMPiCVj!5Rha$hVBr&Rxpr%M% zs6TY3*rxaR=aG5oD`UmtQGh$l6RhceEj1yfL3i{`LUeg=#~0<_K9nu)0E0lzzOve; ztohxEu0N#WvVgny6?Ajtvd0M8E20gs0q0#x-xf5_qw+$Q*5Se--zKntvuu?Pz)wG5 zSA_gOF5Dgjduq!f`rZ~rhe;c{ODb3L8v)k@+Epj|Bql%*x|FO^ADcW>k}z?U!QPAuo1e5q;u*wwqsz2^3pD%Bp`Evp2FBcT|PkY zLWq?Fv;~NZ@XBFOg}NPeP(Vh4coAy-P8noSh&S|y@+AOef@c(i0&Y`iJ03canW1e6 z22w7bc>EP?g^;D{xgz-uifbC}s>}i^pe$|~F#(-P0mav4k)`1w6qSLjM-hgV3JL-==5mI4Ds9Hu~li#V(0GPU81prG=+z=~llErL#} zoUZ(kI?CO5Qx8yi#s|IUg-BlZdWDZ|@g`rc*DOpB)ymf83kdVCT+&~oA7@$@FA zMf%(v7;SPHca+msD%#yzYuZ|G9C?YsDt#KCvF=A68El`{rmm$=S1dAyk2GQfD_cv__e=L*% zaTwyJ-FLch+noB=nQDti-k?~Y3i^D_OZ!AGZ*APi4V7={jXn}mh#xz{BxDV-(yLb| zWNg<+B7|19K5Lx>%Zh};A>)b(H4;Cz4fh~~Sq;4y{zg~)Yz)+WXS`j^$PN)KuH1e+ zM{vWc`|Rb8%h$a#pDWAe z(#(pW6?7U=+WK@$Iz%)I9e@o+gR=W;`iSn}bjnZ~H=1a7WpvsAY5^&~{VHzd#{stP zX*P9)f+P95kn!7V>g^MwD<>X4L?`JNrb8X& znuPk+8=JnwOT~u(HO>K&!mLek1mgr;0r1F;J-KVS_*92(W_Y*2mASFdz%w|J_!3Mun@lGcip z%*X2P>A(88H!?q-KX+H??ibFE-7+zsCG4)7jgn_;cq$9j$IxoeX5`Ri)K$j9q%1G9 zgkzitk(S(fb|m`M*mOy91t{f$EnMM~#~gR#Rz{-20XtokY6dKq2%ZwwZYmq5u_fuh zE?MzW{45hQvE%5#?#7RCvohR?;;aF)=Z>zc_FR=BmvG z{}}al*<_Zf)ZwE#$fBm+J?KWcr^eW<=E{4QduD<0P=>f$5~`d^x*a4Yn?ovDVLLio z#&+f06^#Js+s6Lx;A;Z;wIqr2LwDFW6vbCGllsnC6ZJ56A=;ZI{SCv>Vhj5oqRxP)ndO4b zM9KfCAcJ?Gr1o5=n|JWu!H(S8OEmFsne`C4ic{RFLvG>VOL!WM!6sU-;#Z;jZuf6y zE;GqC%NO*8w9e$%HL2iEu1{|+uv2N{WAk^_mAo57G)kM> zj~bPH=b+TYcW$7w{Uqjwd4}swjWSfl zM{G<$DG38ly`WRxufC1L799|00Wnz$Le+!Ey z848ngQ6qp65h_!Z5)B^xnx@Ry!J1g)`=k}Y$P@oxToGB3$~RiW5xmDi@tkRe6VAd2 zE68>y^q$<^4tGQTLxrMs!PRjQp7X~TO}aD$`l-H!#jJ~814qvrlLGF|2YSBuy{`im z_Z3`Q+l(Y(4jNe9!wpUuufyLXFOuhfa8K9~OzG@@;rR6TIg1*NVs26o4Fr`s?ZUy2 z-Meg#&V^QqwdH6f62x>BAV@rEed?#Ar>T4s-&!S|`C`P(akRbOSGGn5iZh;R?NwCy z0<0;lPI|4byJTgq(O0v;O8ShO(idrdqVe%3>{*G@_n1?)FD5lfvp=;i)NeGmWkMHT z)2ptGlws!#y*-EHGm{&=TdD5yGN3Ytky(JZJS|W|%qsdgrPT!LTa~H5Hwu&?H1J=q z7rLO1p87l}%YQFUe%#ifQ^3McpfLr)gZG^1iI*X3HhF7~sM2hyW;QWp_Gu)9V;KPG zBfLc((7VZwCEu{X<=?QW2n4^n9?XX8eW+nUp)m!}^CEs^$wuo`mWH^isxhx5I(jTB zvNl0gY#Lcn`&W=1a*j5#rebBtTyY5?AYm(?w>08D&Q$(k2}|gZ>H79AQOcn;m{W)Y z+G8!lj$={xGb{)9|J_m<9t!Q2*Ots&cnz+OrB3myI%bCFgx11%?!qqkC%Hg(3~H7MH)`ZZlbL@_ z{ktil9Fz{TJb$V(>M~o_e9H&!oUMUjs=caH?8i=9Q(g zEi$|ZZSSXb^%6VX@v)z=@sHaBbNaEB>^uW>Z0up3Ubn6W1%0w`6p&u+FAsoe#Yu&B z?R2mW{N%&~sfs(79BXs3!AL{6m|nVA*`5-Pb16z~@`lNbPeQpVhZ$<2b>mV@*Qugg z56zNWefDNI{AqWiZ-Oo!wyJj1gn(AAz?OxO&#Nyg&adB>+JepE)8D7WfFlcL{7xi8 z5*IdRd{ghiv`rE*ll-yKd-zri@;9FBwWLt0n=#+8pDf}75q z8Zubbl;9V&OBKqB1u9*Km*@*$+UL^KlwFx_!P8gg=b-=WWE^nB6M~B8BdhBM(c>?oBrix||+wutu=KFQD%MO7pUr=x~Aq|J7OKy~CVk6J)NA|eI21XR07 zZV`6?aWz%zBqLNN4bu+$jh8kD-9q*6ybRE|otlX3IDk}nZ?Svf?c{t&qE&ZNo?J69 z%AE!ze`Z!!dubYgmjn7jZokL*O|8_69NF(UuMs|MElFII$;8Z1!(4U1 zlI@lBs`3rI1>Ryq$>B!sl}y@Ug=ffq&}!PxP#+%(OB|x5$h}|S2{^FkIy1$eU&|9u z-sMekFg=azK=>%nDYM;fhF@de}!8&j;t3V&<^B7LCrtSsd-Aj z>Ld`7ttEFNsG5YPnwM2sm&S+*L*^T8#~$?qMF!Ms8%}KYUQy)<0p}+r5cb%ZGnqCo z;>)Q>I4T0rNKlA|7CQ9c2VPXpM_tiUlY)huqg*nc&K{`HXX{^*?a5P{UL`R7(g(E& z=?&y_XEQ2{LtH1YS4kS=ytR~-Cdl^Q6*$@UVwo1y!7K=tCjz727>%7~Wx4kC;gg0F zrv+h^QPB^8RG^QJ)t;6mUF8xd?1hI)zjWVfTLPFy6|@tMbm>1aq?#+OEKCuzIi`}W zH<;pLz@bKM1WzdAeA;9x^#njjy|~EdH082do{il+L@5`w8;eVs7&$Hh&Yc}= z@743+JP|aYE%}}8p+1xhE99BH&Li@~3~4w4y{-QY@xXl_G@{!~plv?Xu!N{=CCENe z?sKHP`4U)3$9Jv7P`P$C^EVL=X76_5RWTerpQWCS&Y;LkTe4XDUl#mMw6{_hoogoy zhR|c%2INyU_36X%y;5-ORL6OgS(py26`f|BGfkQE`xU9PG)aY0$nE<)?>(I(O8FFF zsy=FSzK2p_M^fP@)&P6KSfsH6AFq*Bj~)D^?f2Ai)j)98X$HUo-RiJd>p5x$-pnvES;YsnYm&zxe*-Jn;sqO8#t2y2 zP3f+iW};Q)^>%ITD?jgvQ#GJiNF|9{V=07N2##goCZv3deG;B9@|a8)nX|z*OE%wS zG!sx^hLdbsfhVqoi+l7(Hi!0Sj0vQe&io2EgoS^(Qi9ErNQis#j8>yOCD%nQYfbr6 z!t|~sn5IZXt2OP&*fu@ZQ}H0t6s;8Fo_!9}*i^cF(pO9F!9b!SaoG)NHnU@rQMJ_H zY4BC8I^lFE?cba_UuEIB9t42HC)5@VVW>Re9A?KOBt$BnUZJ7md)n~Y>8j{|(VeQFu>ir0&6PLcdYWCVJwOGmoTrhGGD1@6N*tsE?w4 zY>&u{mle3Nt-7f2$IEuuwc{t2DNEIxC7b(LbIUP`j_Ky##`p~CW&o<=gvJni zFHZN7!uRh}7v+x;g*29r#v&*hQF;nkZQSfuBg4EsQ&l^d0NSR22H{mJ2Nd20^wB-6 zyIY)5;N_nLVV?`JVSqDmTf-i>SADe%cjoh$-1z}|d%2RL6WeEhlsq7Vd2G+&LE^|1_y)cfg7_)|{X5l+ zsHyj6%Xm}<(Kj)UH3;~gGBzT(pVrUTSV9@*YcBTU!C6{P?ayX{8%mknPU&_%rD{*N zEX(d2ges~SqIkj|vCfvko(4~v=kXRDXWG8}Q%9<6$X=7k(jDAc8a^xUWuBD&K7A#n;D3iLbf$6jmeK`VpQ%R`y&X~ZD{LuKWa7=pOU2qKaa>dyVY;qrR#SSN z)3A1{4J1IpbsG0$&r8&DKhvTxOT%DG`qA{#s_n-24olYja|T|edT?Qh4KrqIYUQzV zBy!kSY#6WhVh>5iwm3&F4o+Uk`=_m*@hiWAzO7j(?P4efSx80$;rReHU(Obt+yF-` zm;ADIP&$^g@GcS7ADPL!-#Q~rVP6-QhJ{RJr|BmmQAO9!yXHDYn*k$Q1?PA3ACw?2bKXuM#lz&9-~4y&%h zXs9qLvguc&?>VRv zt`Q3kgSlVRvWsP=uX3_*HAvSvWf7##5`$2b&5%8I6E*L8z24_tCG(tW;cFFRfzt>( zLaNV$20I8@QQjiku_xWv-@VM!=*DE_a!3k-u|!Siv*eGXO;c#1yuB)Ta+K17eyo>o z@%=q$g`yTTLm0Vf<@|xNXSreD>Ele|n>zn$dQ691iqj)7 zd!`|2xVov6^(6UX#!w8p$*%pAqB5JY>YfTIbowY?Cb3}Hqtja6HgNX2-r!z%^L(HK zuMneQ=+>C;*1NGrJRRc-shvIpbsX)(H?E~M{F?JgOwH!&jK2K&$akQF@ookx)>MeR z4pBNOfqwL7Afd0f6g!(X{a`Jlx9Y!j@Xd8wx-4AWm$j={ zmVBGe!tZ{$KUI7V#w?}0SgSqgYA`91$Vo=q7|Z-(aRlMs35C^z|1tQrR&13S6{=Dz ziTVBRR)pfhk*|p6F#Ts0_oXAAIMx|dwEDtUm;h`$l2KsA$ye@1MAO(TQLO}Ov>&b2 zhU{&7PRsk%>@sYHi%1yXY^u_j27`lbmfP~u)7{DL)lM8)h6-FI#hV@UI+yRyrYK;L zD>-Cqr64Vim9MMzNzhgs{4A$!+K;8;ORi=sID;$XJH6$SNBGu}%kh_}dR!<*#(B$Q zu5T*dX0ozQpYxIWMk~}3dPzW2qLItZjjOg0*pUi zTtqgnA>QuH-D{>A0Em?~-K5Fh5kEkx6=3;fdTB_JgFQ0sT&x5PeprdS_nD)@Cs7TI z8o-1Lp)!H}AxId7^G%$ZG6!BY8G*n(pj1Sz*xfwt(r%DjVF0%U$R&KF?kPE;Pd1+v zEx<5Pko)E>A1b0SG6;?O`4?CKdUMbpttuGuTrc5&80|i8FK(OW7DKU~rebGSBULR6 z=gS2Qz_Lva+uvpoAR*k-<4q4E_#;c9KSFPw93Tj(DspAIyjkXF-20FHAfg9S=ci>- z7KEZCtlucu$grg;uqmKK%XhKp&>=cy@}8`tI55Cx2(~MJ3Ld?eRn!RunDEeU=A0um zC3->tm}Ic%kVwyb!P=w(C`D2zHcLvkZy3150|NMdaz-x0x!-t4U!VXIRGd34YsxA8 z6OMiZ07)l8QOnUz%!5y0TByBWC2Yc?ov+@(w31hgTt9OQ@%=AYM(WgQ5gI5th<`}} zT=A4iwS;zzKM3pDAe=%@MxE+=!K)P}w}vZ5V`YkTQ2?@#ew4C8if-7OZUCizu~pH# z-F4J?Bp85t^U9&`ecN@+kp@J74!Gb|t6xq8=B7DduCLz3p;GENNvDVa5s(F|eIy{Y zG3YD)0~^4B(Z0@i;&>0`#sLSY=ZvFa?=B$O`hvcx2$+-EoRt%(CZ@T-+>`{c3dh^! zsm1#nAY*O{16U<5k@8gH5oUwU$d#aux+X9%YML#K?f{jr=NcK^2j2YHX|)0L;?ZBH znuEXM_al}d0UoF{CaZ%3iwdYCDAkr@-wqGmA(Gt9vOLDv%Qjw0SC9vrcgx$;16m~ z{s_qP<#n^&FH2#%o!jB=oq1`zpkUdp7o$# z0__53J9VClw9cGl8e{ynYqQv$ua@8)`FRDr*6088kI9%qPvo}aH?X#GAaL*am%`H( zTaO=>zXx76J|N%{<>66h@&~cP^ZSUHK_pqVPiKt3)@T|s!01?sv*7Tape~-j4h7e6 zmYu7elG^LRcO9N*OQ z8Y2M?!7va|IJo&dy$R*8GI)+mH9L?3S)oG;w)-!D23Zn-t0Ji0zrC%8_hr5|R^Q1#V8r!K{Hp>wK-Q6euy{VIKH) z^HL*)Yx;6c)VYa{6-JjK**qa?c{{%OM_m}sNIo}cU~2-pv3!E{{!dW)rvd0V2Wi-V zvT4OSF-)8{ri*m>HS0@k_|5X32aRt1l8XY^h4i`xm| z^#tk2#%O^ZwdyvdFD4R{ytrHsI)A;HL}z2r3a57x)pzqH2rvqa@DZZJc3n2z!Yy3+ z>n_jlBQI2hC9N_kfea*eXckxix7Npf3zSy<=JTRmmu|&)9Czis-xkYs8FN`e-6box zFR|U&JO}fGxc1GX^R)%f`KN|O->eOrmbq?usxpbBwgASse)$I?Z+lB zLs!DzA6=|fV27M3?f}Ag&vk2!^!BQ8slvq%lBpK7mM+9&%s@zx5qzV8i+(4E;mbUg z?eSIBp&jru;Unvs7JDQf^ggcyG6rWBTaF|nE%YN6FoTd59QipBlY#45{CVGC!X<@r zoNvWt=M!7@_|oASg-BAcxpCjEYbbeG_xnGSjS+agk&vMQ89zGUgsM#e9wb-M>Cm$T zi1y>I9ae8PSpU36DY)LStmNBFJ=hobzM&*YeG97D{X3aOL5~t?K9&<7#e%obZjitq zU(FBzvTndOpqmH_S`wO=P+SMx*46CLXR;lCDfsU%lSQUc#|W7c>NKZ*frR*!W97t* z&nvPA(~!5avp=SzalQE@K*ow+kCc@h=`p4r&0$1tcEA2+LD*3ndYBvVORT?1v<>5^ z*`WkpOl>V}^Q9|X^K?ayweRxhuJJJt9O7pv_A~rl_PM@2N4{Llp%xu6Y2{#B^YNeK z|HfZece*weBWQY*raoukvS05GKg2j)^!nX_PWaas{{SmTI4!c#9-*r)!APvk@5VY% zlk}E4Y+-6ouP@xMObwjttAYiFUb%S#@rqE>$*^|&e}g}tg5Ri>GsN$_Uk+b3H*>{) zDPS+El7-z5RAR|}^D9h!O~;<(c56l z&e>NPKSE|PRm3EcEa?>K4@)>jm~xfINp$LqNvR5hx;51z#|k8l37nY2NrxMaDf`?U zD8a1M=*Z;F_25b3Q5rE`^M;hT*diPN#q}bXMd*=ln4n+nKCPYrzJ*6MwH|R}t z@p-0cv|-&duC2ABi9aP!~1%Ubvs<6eoOk)M``+KG_IC=b8 zVo?vKp=DnQoR?12pr^%5Y%ic3Q863W!o#xm^a2!saLya|^PfcCpaDxb42d1c0KqQ) zv(%s0fit^61ykb&a=JNKvMI*~NJU6p+M+axQbl=k4G)8;u8ibFV!f`_gw=pO%{=p{Fh35>I_!t2BxiSRtcG`5B16QZTwiPf}68hF#x8YW;X z@BT&PNFgRLb0LNHrm$Q=`|A5+A$=@!u6D;0IeV^ttX!l>)39#w*DU!&VKY4OPp0&^ zlMJ0rjq|*`id-8+0YkZ>4)FXy?C;Pe1$2G+25vK$_@Y+BEi(|N3alh`Te$QLjns)l zP9s6;kKe7vn!uG$x3;p%T#Pgj#^F>VnDciFlJkzPu6~~ht4SsPY{g~0ce=riX+$Sj zMCxA(Xa)9}YnW?UvMEd*EPCG+P=gsg*ZKdzH@|+Cqn8l*qF}-{W`AQ{Ki1a!3!a?N zzSC42DihO7L+`W65uGu>bv{)iJCj@o$<6XGClYLU_KaDTx+c>;N- zIWNs5BQ)mw#Wla`iq?qZIpI^mv-L*XRL^&-o4%_t3W zEX2YqmfB>P&SrI~(W|Wi>^t&EJ-S38F%Qw$J`cUyj0pO_ez)^JCNrqKGZRrEn855n z30x<8kRx93P*VU?4%MfSWB5BTIeok(FIeGewC(aE8 z`7p~5AREF@<>Iv`V(1lRR;_Kc~P+PkDqbv zp@=5yxY1jO5fQCN5PR6n`IY-xb#zZqUs$vQ0bneC;)uCH3jcPqSp@{;CosGBIfei< zi88XWwi;00EHiO5iL7l_bjkG};~ZK&YZ3XtEfv<-cF*j6NpYDZT$xS6v}3<3x96Yf zuWbmy_wf?lEfJg=lk`MFti0I3LVqf)P1+1e<@z^dB+*Efd|;@GkfW*;w<~B*f~H2R zg%^01k5(0mkvZZwPGL(r?*+szi3li*a@A+hWOQJO!wnJbZs>Y$sarMlel={o9tDw7wCwnXOBQsv)Olj6OQOCXu zD)A*#Ik|dvJG?!gsdCF7jk3dW)sNP~n)&93gEFL^d{Q0JAlj5OGz1xzxNJJ>W-`U6 z&ke*-XHREIC~Xb0O8As>BBbIfI^Iitt3jIw#Y)=!MvlYc!pMd`q5hoUC>)SM70Vr5n!vGZE92Y*<_`iQ#|x11OG@7xlC zEmW%&_B*mg79JWJw#+-YeQwFnY})uWW1L@i@^d@Hfr&C^$6>_yoZRz71*FOrbS5s) z<)~~;vx}L%af7IqjJ5el*7N0$j%#}vYLX5_@XL{fUB0a~xA{i+l5}N|jOc>QsTL=7 z&!f@Ognp3<{HGrVPu%pFg*yXhrt6SD-J(j%AYCv2tlk>lZkh$_ida^*0TpC?Z|G=E z-N|F#B|Wy~aP;0PP;>7^`?V3@JC{pZ0*o44j&Q*+z_z+~1zrDnZ&?YHQuO%tp|j9m zxFQ`#n4srm-{M%gL+;Tg;;tA-P_&%Mj6G`a(lmIzm_Ew(UMQ#zONJ;WsIp;}Wa~l8 zU3hpev>vGi;>WXNpxw%3Zv6o&fFrKkf_*TB1jO{ac2iV)xn=3Q7+2;M0?k@MbDYGtkGWeR_n92DOu{ z&p-6<6ybDvUnh|ewjfz^qu9LS#v9Q))u^@(%RT>yw<4xoFL#0YJm9AyS$Y(Y2Vuaq zE7n3g4`B(zN`sRWW0*`5fELdH0e1r4zL={O)gT-wZx^U_xq7<^8g{chLg45UG=2W- ztHoz*Ac?G%mwV~?_ST)|6MY5f5h4{hUWvCYqx$MkX!WrJ388-v)+_QmC=cCvS|BttYQy%&xol zi7PoNXC}T4jV@-)t;!k!8jG7-Hlfvu%dNWswzBePXOKqa$HA?&XrH@L(UCxCxGYR* z%EEo>XpbJFBarBlG(GPz>jQq8MfPi*35HJ4H-_1w-5$RniTEM{5?(SsXP=_EXKe~L z`M;}{W%-4oxNYGPZZL!o)U>%Nqfm_)nT_^1Gx|NAmx~KpDC*La8QQ@%K#4pi6F*n6 zu^QrHmP4q+id^m&6&50cC*`81jQBFA&?qo07?hKh8WpPkfOO*R1iMG=kw}vd*gQd# zBV$Icb|r|6t;*QM)5LyVex{!j=)T-4bLxD7kSQ5?Mvrb?NTXPPZ0zjevHYPB;zs$u zY}F|xy!w0b8K^G$*~JU|o@4sR>KC8W;2^6AByQOrnERzfAro?ERdJpn*ibjmS*RN+ zL_oEFPC<CwaUCb0nA`*Zr{U7|vKOI>i_Rux~qz!yC43{7;GjIuAAU)5d4?MmAe5 z{5uj1nX99AKMSi3F!aeLRL!el2QLmwkV2PBf@&AL0oB6LO`zWae}bf^h6f2u*rNO) zzAWdN|2ux`A7aSC#2Wrnx>?f7_EYbfltuC%!RP;|>}UD^UH$*bNBvjz|NkR9_W!2( z|3B!l|1AFpasfXDrQw}joXm{v;5~BAvuheRI59`R^6sNe%FC&JV-NKUhEE;w4e9{N zA;C}7vh=bmT8{lr8lhX&RjSUWxeD{@XQrpC{|i}W^j7FFZcvwdyce(0DCn0|T}&~K zaHaiW3hdzg+*wkb%A|u65-{|I+@yySn$kn#Ch{Apc|I(R$#vwn>Qx$Lra+@E>@mdy zVLusTL%oC_?IkAa=>e}5AzS+3PKj{~V@rF4opg;7*74k1bGNfgtTvoj-P&`&0}7>F26LB0-4QXmH0k$at;HFg1u|t87DC51NOuNI*@zds2)%Sumwu@I8fK(iULKt}EWcie*(x zRmTRgbLP{Fiwm zF3!j^>-K$lDKkNX9~sxg?o%BqlDVQREH`cnPLxefaL8)`E-n@V%3=y&a$^RgKBbo_ zHj|D$n}@U>rA%P`co8Zo?(9Um42OEIM7}GCC~h~ot#QB-kMqu99_yjrs(Q-0lqJE( z#OBgl`VEA-9v9X%@k!sS#O4h+UW`psrUbQ0&^yze{Sn=cSUXY>zz$|FTv8jW^_nps z_w$$d3xh0Yrh+xOpH!R=A%w8{IZJn;d>-Y9@INqtqbaV`mt-O$a~;XKDov>~Saw^`~Go@3ZohuPb= z6j7S-w;l~SV~-has6jy~GsZ>%xca)=477k-#G07Wc7c9l4-+wiET&T7D0V;Kwl zid8nl>y?wB9tFKjK-6{7or_71+^$5$7SaRCd_VB4LX0>&>5^o|>H?E+p=h`(H zm_c>zve~arwg_<>Ey~U>#VHuYR2LVQxeM;-!;a+8vI%(L$(I|gwqeE~wu<;B) zgM$bNxCPI$(ZVOv$VANUxr1@Tp#gfAolaCX$!{Ra1q?pn0Ie;|U=)ih?Qc{Q#T@*usPV9P%mvT><9#oHCq(4O_g^C%c@FiqKP7jp#S;kEIIsri|O|y;^A~ zPY=tID}lb=<|Bow z;%%ckW?3+4g649Kfs=ZqCAM@stWg?{1}))HO90VUOEtPLu1`a-U;ybXGb@g$BK7PF zmKuks-8gz|gai?0jS818@5>|try0n`I$c<_6f8Bwrhd9@)hun%l^=l zlhZ2&a)|gy5!&Kwku%o*hic{u63gI;GT3=dZs@J#;nIy``H&FO%LhkOI*pvrfO?(3 zIODS9G1akG+L}xLX~S{d{|=DZ{udzs2ly%(yL`g3JMO4(mgH-pQ>=YXt zCo>lpkn;-%DGvuT2RAp6n@68TOV!2f8!7M$Hy1MpEAR`~7Z&Y*onhzVV&?h6#`T4h zMa|0A%HHBX?I{^s*}MGbv4XLSlhr@gnYq4v-hh>q>0d`cAUiWV_ZMz9E>dn*PG*iT zoSZ!D`YbAD&JM0lre@BhJe>bruJUgKiT?@M9RCfj*B0womA;L`0HET*s{Y+ruz#BS z&*0=g#zO0>iM5%j3yZ3&iOav%B}zIteJ*bLud(=V{U!ZhJ^eqnk>g)&lyY)#{YLs3 z_56q7fBj@pC1p`_GPZaAX6$5UZ|cb+L+aw>YQ`e=d0yPi&C1kFMN0HDn)!Eu(*Nw= z7moiPkgT<6%GFXzAa4Akvz{&*|2Tw~X5IeULon*UkA&rGstg~Vk}fFwbzbho z`}X5+JVhRu|HJbu_W;F1rVd6=AO{K00~>ngJNMng>+Rz8ZrwH7%vXPrnJteOjCX&b ziRatv_3O!xJ`4XXiu>KMLctxpNe`ETrK-h>@1y*t*74hSXYo#gC=ho1H*gnHymG;S zsBuZb_#6hUbI)^B=!=6AIWkLh!>^4ry$`iBw@*G98yOHw0gV;5Db8g<4c940R5}GH zve^C%wFb%W!Cry#0)bFI(R$GEO5gZmS6R9$$bWjlgc9~uph)q)@ZQ+EqkD=Jv52ls zHwlx*LE5Z`WY6^5IT0^Czq-Te-E{O{smV+CXZVRudN+RANJk&49 z`5h&j@#4>Y171#H5NZq{fnFdg$6eF5IM@c5>WpcSBBgVH-0lx6`}?`^dBWLN0WG)* zD<&%1U1ZW5Mgy}(yFa(wY0v2rOyb4z%AlPU^CKAw-B7ldiIj(KFi}Lntk7x+hS1s|5F&bRr*E<|(VT ze4+h&9Am)dYalUz5cC5%ZA#c$iUt3s2HEow;GCs7s?Xt@rq9NYRRijHiH-_BT&K^h zC0)CnST1X9kKV(AP$)e^GZ|wrBNaR+vh<3u5)NRW4?CW|qnolXe%X-mrZuK1d%Y-#_<9NNk0{zXC}!SocBd0NQQ-xq9a2q+p+l%t)^Mq&@-x~jucZ!~ z&vjz#S@{?$S=buDP=(`TT;Ny9C`+II%C3DVt%aIfnrb>NdC~VpP;%7VML*qW-Fh{N zo7i3M?Avg^U68pnm;+Tm?2C5!i~Q}u$1RzEu^POj*4CWgw?pZ`-BrVB;R)oCi~V9v zNQvwWLuL6QPM~~AYwh0KUr3htE1-DY`SzKUl6@A*kl-c6d-0ZPm|(Ktn(n?fCIHoP zq-iZwQpyf0PPT=MztGxQyJ-Ap`@mE74E8RKxPx}s8Fua`#o9g9|1+(9-$=wkn0xHY z3z0tcmSWbpP71Sf(CN1Y^0zo29tdj(%eC4tzqwzHVI1ebTCr7`Z1ly(Cf9!DJcLfq zug#<0xaqE9H|I{HrE?}2+u5~o>e~=tPS`j&m$tX@v~&J|`jKyMUzk6~Wlg}8&qaQ( zva9K@?!V>W(5ipLQ&!nr5eCJ*{`?(@fL%w$76X1s*EqCv`1lZ=>dp(p7J473Qd=Kv zXcd&9rTn7F__A#{0WHfixR4mtk{`pkdq9tATiM)Kc58|VKS+CGs@ z)y0lQk(8T<;}c<=oLxwH*f`k#@4$wQ2gu3#-|_UU+s1)%Jdx_-wOk{hHGoJnL{FP)^l={Zc^?&DH%cY4V~oQ9UCPRT$KC1Vb%1-N=av2O~* zWoKt+u8VP10%K!a8)D^Z9TiyDI11qukEy@(OKt8^cO2o@WF0kGHQSpE`CoNsR9iRO znY32S*UC%`Oa7&{BEcuh0)h9CWP`-)U96L$J@T@L{9>$C)Y^f#u!goVRw`~Cz}E4J z(UCT4o2jWM>g*WLFlxTg!-jEUe~yZAvOkyY<1*VwYROH5G~d6gsl*PiOc-g|%-3fm z?dx*))JP3lY-&wOIbvgDXu|p4DyX?Vv3;*rzlt5?v)-K-o?YAi8b=HH3OQ&+1mp?N za~<&~^5Uc~gEm|oq2!ora{Sa;;1C^3pKp@M$dj6-w%GExvu*hrD>b_ejvt>_BiDL; zvf)&|4ta4f=@_>@22Maq@k^o?o8%CR>p*s3&|Ezw z(_K#2K;4`(Je+uFp6Y;bpPt1q^1L&rFafHuWBsz0W3GTOHBqqF70q1^h1cW}j|D39 zcaX5q6Pu+9UbPeSJYAWvAsiCQ2HTj1gqRALab>lP7ODR9N6^vS&O-3XoRhd}pph#n zlaaD;N*EJjK>z9h>?@oVDwCLe+m{%MbCW~7-BpqY!gsB5WPx=pX$*mNaj*Uvc1~vw z04Rq%E{kA1;jSJn1|l^X7&MAUVmxViN;_MXKVv^24X7QV>OJS#hA_8= zu^GL=OiOO;wTO~MJ;Q)1{CW4|O77T3_M<&uu;#JKB*xmup>H8e7sv;xnTvQ+fh4rVD#Ey?PQA$lt?3 z{Lcb0##c7>Uz-UlkkxEr59y64bQy8{qk#ab1HCqf1A7Q0oyiu!c(GXoyIWIBoJ;7> zhUMhtdWae%ao9@>yS=l9;+pBoGn=c6o3uV?Au9I4scLpJ8&gCj&L09J-|`UAceQZp z(;Kb{*i`HtVz$|~2%F8icNF`7x8|`gtZZb!kM>=({-&~biwS&-yN7mNAAs#gpPSf7 z=64AqrwVMf{gV|aPyhulj$jI@+XgoRKsYc2O2TeX@jHRjEf>%b2)peOTbjjHdD5o) z#{1egD39q9qF7(xoEh7`-RR!oKs>e`pry6BH&?N|^ zG{sdp)N6`37YH!2#dSCGUHc>0OEU*=?ev);u=gp;F%POHT2%KV?+;wz#qnabjW)34 zPV9jSFv}uq!NQQU<7N?c5(P{Rd4)Bf&~?(fpd9x5K`2bKHqKUr?6WyvwGc}Lm)sgOyl79u>Fvg z+7ph~h$NZez!?N`V;DHnIDJCrwj~#lyVzv%FIAlg;7uJagwplrN4S7@KQ5~87zG_t zi8OL(p7S>U6HY{ObD$?*j@O>=5sz4<2*PMLI1a_ASTqN6T)0MK=&nczZ5h%xz%6yI zi7UUB(zdUqh&jcj7(=qZa^oKnvEShunF0?5QZRdoxDZp>-A0JE@)CX#8l(;*#E?EE ziW9_f-Z(jEOnEzhVk{+Y%+EwFv5rxEcb2C2vT-4jzwRYkQmFt@uM2Y|RyPEo1N!#lDi{JJ}{hjR@rzIp211P*g$8R`o1l*hv5l)q8_50 zf%m~+dI0o9Vuz~axoMF(F)7eh?q;J#H%yPKlflwm=v*l@vpr%xkWxD!z(`Cwe<+uO zV^CU@>`72EJy4HD@#i>UNoyyk7h#Q^iu?r&NbD6wZVJUQas}7I;b9tX9pi%07v((6 z4!!~Z0rkwFlY-J`I4^q^&sK0qCm)AhueVovl&O@|TO^?!Nn_m?oq$q&*!KuiCNYU+ z5S2$Zme^Z#*!O1KVB_eb>jat-^m3w=O$K5!#{x|bv>}%oObI_9&3Lk=@voqtt{XTt zQ}gvUVj6@<&G?NBIoJYX3EPjfUP&f&y{5g+Py(e&hCMLj=rrV>+?28kh4IbsV96Yi zghk&m5#nMrnE7$Y%jqn@=Z0*q_6BRIw6Ae+At0wLa0k;C!J6@zLQU!kn#p@%#7Vuc zeXsd>FWl&r3lOCQWAfVf2`Kvg2s4~-_RWMmOh*t& znZ^jFAwveV!Vqx-(`2#)dHV%SIdVBzZcNyPui&PX6W_6&L()bTd6f@FenX&);u=-& zT`g_*xs08XMI_H^8(}zm#*^o$4g@Q~9e17KktV6}$k638^f0KQHuLi^NkaZ4xbe4i z&0@nTjW2nw<))e2!9xL;jJ^pQtR1c>^@vh3g!H#9-xCp}_8&$Liqf7zrU&ES|CUz( zwO~&xVw6oIC^nm+vx5ggRCuL%QfPGX%H+k29#G7DLZ_{&6EKCyuRkvZF$-y3Vg&mH z<+>nTv7yX>q31vWThyi_C>ME?rqH3H6%r)?=QMK}PblOjx%nk8NVMS#tu zsU~%oGqz2;Tb9z`rT3_&(Qo|A#Mq-_=i{k(+o3S3oQ**)H|#a55x2$6x?pYz>zQsw znD$dN7}*rOuu+x6nMe zIMTi+?Hm7o{l!W%|D-@mdC`s6$w}U2boZyf>kZFqz~PwHZkDe3G;3kSV=>Rp>&EY0 z=&7vYq}D9@C}8N~n>V#IN&Bo)HIaBzFo--Y5$vLNWK!Z1#1$Z4;3-*rSQ1ShmzT_N z$oWl%zxbPdajFOohXM$E5QC8E!WJfK0yo27V%Bm&zNq{@mF2sMH7OQ%Wu+_>I)A7P ztP~J4`G1i17BH1W-J&KAjYC7@?(Xh1?(XhzaJPoW-QC@-ad&rjcejK4@V}e9naR5| zd6P+2D)nVoRVrI5yOzST3RAM5FS`{|X0J`Rp-!hCK5wh7m-wQf-D!%u{WK zU(i%#LPWEHRKmcB^rUGrjKkuDctjC}Mcf^+Ba-|lDYnOqE(1SMf;*`^@}#1gc z-?i;Xb@L06zzNx5*?LA^%HQCI>j>8V~hu!z%!YOlf6 zS^n)j*Rahm z=KKw*srd6Yc+Flhf)`!BQYyDI$diQ>bE0=9*tnEL7~d!Xr@mC?S@krsK+y|8Su6y3 zO-deZMrG~zR*=R!$uX!Vve;6}(PpugtpyXv7f!9hnyWnb?>7nB0aU)63pRG4F%mAA zSEwu^XkJh}dI*e4rZq;UBNV6Mkb(zoSOusib6a=_^m*|F&Hm49#KpdSeM6e#MULsq_45Y z!OO-?NsFds+3N4w7gTf!EA_)%>>S+$)nDoj-Bp`H<=0O<(>)DqT-LW2ql247W8O;* z1)OIftAYV6DVUaRPo-p8?aJebI2R8qxO(MOrYoF}}}I@oA`A2}>PiK60fs_?TT6H)xD<&;PQ(2HqaI51kY$27q)?Yqrh zrgW5=@TZeL8V}rLn#J5qzQ>+|v`~F4pC+V8o(xs$k>2mx0BY>?!eT)+zfM8WluEF8 zs>w(bbmZS8zC*Kw_P21jRg_46m0+l5Mo73-rAULB;1g7N@dAPhg+l4?pz%gW%80wI z3V!dP%(*m<995#M5Q?ougNaHGwYZSwN(Z>X!;{Uv+#%QgAmdr_{*B>ebuGQ0P4wiu#gef^jcX znZ*5gfb9*OekgmJBWOKhKiJa1R>Tk7B8pPj;j@ER1XY0GX<%~66XYQv6=n&)4Ng}Z z2I(tTXrY*tEGZwE|Iw7A;ZC0BE8DXkkGXMSBWlTn$n?6H8S7h*H;~R$N1D~LBv2`& zeBbI`PUI&B$h_3iV1`srY!@uv33pY$(Bf=j>FyySZroOwSdM$+Ljz}rRA=Q9$;VQR zbWTM3UHd==yMT*3dGV51V5+=;6P@fq9b1x@_G~+tTLrst0Ks{{m?S9oH=u&IvElwU zkoHJ!dQ^GaFd-j&@u!v70^;b8zc8cOnIOl|CCZiFoFt{6Gq@I(`|u{PJJjK_(PAvf z>9`1W97)ASBBU|-4Wsja3*)%gc~2u{Ky#s~mA^j%c6qpw#hD@hVNw4wfi<99F#hgz?oz=xs=ty7PRfI@Yc665CB=s+7_1gbGvSE@ z|7y_LxV6MBJMG-fZkYXFabA8i@_u1RO_P5VLeEm3eV!0P3)=1mvz(xO0oW26aa<@3Uw2OHIXnTLpgsSDX0Nm?W!3G8P4P?DMbWPb(m_OiZ)v0a9v$ znfYOUsQMohyI3=o;_wNg4jNCEkQ-L#S(SX_Tt32Jqvj(fJ$mjNf-c@Pu#=2&;o`r4 zM8k=dL*taVg6vqO%@2^6lBPxo2r1n4OwiXkuxv?v|KdkI6a{Jgj$`*8n`J&+)v)dC zaeEFDx#P6+cWQ$|=$9tTbzdW@++H z`Q_AK&lyj(BhhbrNJmyPRSLxD?nM{m zfo;72(L$artV|da_1}X85G#+M&1aa5i3YGVsNejGV`i7dum&Q=xMKVrm(CH9`&&HTjJkTu(4rJG{}3PEC_QQ ziAP4azrfB5o*~E0h`6i;SS_pNS%+zKt&PG8EUm(+99U&{iIXzuvc@ntwOUamoNND1 ziG}Cq;Tus`sSPUjuQ+B*&ALm<2q3Uip_DlGnvP&9yBTI%+R~^Wsd4ciS|l&Kl<8z> zhfB6@WN2gGF*A4({;||5)v=t59RPrvj%KdrDOO{4x`$Qay7WzGTMw=$li!_z)Uncu zcYrEqoB!g#PFE>lw$pEEwcIc=_alZ)fs##6aB7XGSxE6H0ACHarRdPg(*@r?%t{Ss zrBRL-uV2ZrZrv=%6`$|S1OGv1azU%;e`G0^gaOF(5JwnQnk5{XLVYXjm%1eoMC!;^ z-q1qWl%FYd77s&~oua-ghUX2C_oyvI_poZ6>~-i%IY!5#BXBm#?e;r5G&(xOb+(a) z({42-6)%pBB&UEGJB%Wk%;$QZo7nw&z5e>RpU$yMo;-aUoc=Dc_vPl|u>4NOTK=M( zFy?z2*&|>6vT6R5nG&^Gk}^%1)A}|b(kB1XmEx1nJH6=?E^|2V`l0cHubK}`Yxh+i zpv@`HfIcns2J;7E9k955%*+hQV;hf^T>FS8h32U6jF;St%T{_z`3fCj9d=UfCdn^9 z$nO?e6sit{wKhN(sANm*hia%n$Bxbg^_4Ii&8SFB)-`^Y^o?bpKVSV9? z8@u^F?#@0PSKp8H?UL2MT02@b^{T7W3GnIFo+fjWIhLEBzAxF`{Y*JupR9R*yx+WZ zbog4_w{5YF+NQh0NLdze18gRGWPP6Z^K}LLItBoHzcjoDx^FVJ>8`J&3%r0S+qCoy zH3C)DKK!8C+^xDkS{r(qI=-B(?K&GDbse0Vy1KMqO&xr#-Jj>cGeiOk0=4J<%i+Pr zQLf{r4jwM;8?WQ>inqm@@%C+YUrmPfQ{VULuRyRFCF`9)Gu?J}AyNZ^y53;K8?dH3@gya7EU8TZ=B;6n#pj{6q6y$Xk2+;m0UY{T;lZ3gaze z)}FQTSpWgdv|${*E1H9JZ5;01wzEZla;|a5_5OmgySU8-O+Sl)UjB+vv_W7$W8wA=0$(gOc(*1Q;n5cZ(1Gn_=&tuT3*!gO^4w zgJt>~d{LnHz+d8T*a2P89h)!lXf8m*mmg@3Pvd*Pz9<>s?5nT%Y3=N|UKx)QkeZhX z{a^^+PIigi1rW2m`K-YkUFoa2IS`!c=#QUAJ)v>{UH^hKHV zTg4`+Oz-3f*rsqbx(5r_!1+bvhL!TTkHF2ZtqU6k1l2*VQWS73? z##hedPqeorz2KY>p%hTrmex=##(D-ZC%l-SHf1`to2|>G&39a1P2fw3CHg_}l{e}; zW5(FxCZ8gIch^q%)~0V4DgKoM?-)KN`==Pv%A|&lvoPnw{)MV`&#JuF{xL^{b|(G7 z8R>IOLTv|y zX3by`gP0%ZW}B7i)fN8Cah=!V;o=|*^z6|)eXo_f`(w!6DD=NYQJ263@qLjF?adtT zjxOE!e%++I{rxkmhuhu#`H&Zk4O6~_$xAkNlI^$G-AC_Ha1#%=We1E*ii!${lAq45 zs6ju)I`JV5c-tRM{g14|bvU^=UEs#3YJ2BA}JLe2$L`GMnv;io{jWyMw?kbSh0dh~2Vj`IXLg#;qQnPx4gn#m=Dg^(yiCZ4K_9r{P6-(1nr36rv;h zQstm*ogDsr_7u@a46p&$XH>TrYZ4{tlPP?4eLf*vUFO0Bjz1)yI9Y$C0hOaImVPh;O*<4ou@G4*N(!s~LyE~y9STT5H_^}*}l;_-RKVLI6d1J<8T^JVjy z^ooD_ zmS)d~-phP$EU2bVFU@y{btBjPkKEci^wr_1_YlxT+e%t@wk`Lx8K;HuHTc`0y`@V? zJlMIuIvc-q?{5Rn#vk4y``?U(_Ldic%2*V(x9x9@nj!vZhtyZIRX%PkHye$}?6_N^ z-F(N^S8}!(-Ps#eK3&2YG^hkAB#~8QHdm#HoQl!%zgTBKTy1#ix|dYEQETQ-m*?ly z^Am2bY8a~Jxu=|bo40aj29xEbONR2fPJ93rVyiH21_q+Fy$;b%7qDJ;uV=@m9@ji` z9A)2ozmvdWIdS|L0>GBgBF^K<$8p9vFnv%0((ka%01Y3bw-fk)+q*@$Z-~-UoXcGG z8Etu=xR#@xWqGqF68#pPGXw1PRf^~QdJm$%AJ9DP(NCxnV*tPwIeK)1`068@)4QNx zGY%YQh*E^1D`S^JP{6kyd|aMg82+Kt6&PTmsE5xxnpWb4c9@HoCnZ zdh^FHD6Ol0f}2A`8i+Uy8SFp&;6Or#!yYJWOaAiAIDL8OKNQu3J$*by-%1_#{V;wZ zxE$~PTL0*NhY)g?^tuJx-aUTFpZ$7{c{YEDAvmzR_Sq4*-4XbFxcKV#IjBcRtcieg z`Nf}EaX7fz$Kd~BZ`i0SSjlpH7WssAI4P%o?ep3!@Np{cDa{UV*~fDK;L}_G9R6qX zrZw(Z;G>Q(W5DTsKc^RNtW)A;{Rk4~(3T&;xoQ6NJH>Y=ApFeb^>}@8*v{ovKE+^v`*}`!ij|*xo`6zxlg;e#y z2ctuu(sR*;y@x}^*!F^}-?pg-`4U$#4LT&FbV^S|ZsLwEq#QDe^zq*}%AI-M>M}UG zzg1&&cUhkCA9PWTH7Y;NKASYuPo$~1GXCSR_{XBPDPFtc>i1RMftBPhm>p7WQCrrSUF2nyg zJE%_Ccpx^b>L}(W;vsV`3A{;E$VQ#}$riJ`vRR^#g9=oh(-$B5YD}=vV4paZM>2mp z%<-u0;RKh_9;_%F{9 zasEb+M&gu)u%V>R+IfoiFTujym)GboS*48|7gQH5)9EV?v-8M@)T(1nq%O@*>)OGq z?Y{U2EbevMJS;On#SIGZsm<;*dDEG$?QkDoXCVbe8KC2to#jzO=v$XcJx=CD>35<9 zieP=s#&ykvHEkY)TCsk>=sPJ~IC4`lIhSBN_c&t&sGU4^+I3jm7*TjyPcR&u+qe;! z9OO#94{FC)uE!=(_s%i!n?c%azYGCh8*{%n6JGkP{vAf_5iXKJ4y_|`f7fspqH%w_ z;@DaUW^XTn+MGi$XfHFkP}3gHl=k9DF=W!Sqi?M8vZ;xVAsQJ>+WN8r@mv;wsb9ts%+?kK? zY1T~h)OKlh?N3+l1kLtgsD1f#PqTJ<+zQ&|MtE9cCNO$w-5#cir&U4H-*L=TZ#B4W zWwvPasJ!xbf~u9)H}T_QV%}{$>%a+MoPu{~U#uTDs3+f@pXHN{vxD=>!N>M?eb>0| zxV@`j{tAAinYN5ZgYAAtrFOnCZ3-^(k-2#NwjtdNiE=mAWWtudj8@^|b4Rtb+#8c7 zWaBx--g*k`tnx?E+BcHqy4U(`lt5+%I*Ice5$tIkiR&UK?>g!`57L8txEI3#csp5= z*!-CV<`ds?D$B||_ukmH!*O53Y!T488N-X#-@loSome zb5*qTF*$b~wRBVp`9JM?-|ea$X|pz;TI9-CY0`HL1?SBVQS0%&Hd$tuVfyrfQ(mq|CIZOY-w#>Bpu@U#}{-XD@ zq>OH3)pr&N?*Gn+I;)GB0z@yKb$#Gg6kSo&gBmkVZ(v=Mhb%SGBbBR`sVMNomZ=BU zHY?Yh6y@wgozU|;J-zo~i8P65mn{Vsrha%FIaO1dd>!e;i3zkKq*kG09cZ3kEv*tX zne<83u$WC6Xf1+uk2aLET?}u7NFTGO*=^-Vjp4MC8IU*4Qj>dUk1muqZrm<(aj5CJ zq1?!eji0;7ymM3f;GuUTM(7U@)`0JmG3!ZNbg-Ypc!fD9pSaWQ-fHdbH$sd6!eWkG!zN5y0Nx+ZHWmK*jGG{&Mi;lPd@qMxQr8f4{{dAgp{D zRjr1sT2I=bGkL_5F7H9h=)4hP`MhDO;QJBYoyj0xbSRHn!WWGLD}Wz$%c!O`WD|PQ znVnPT1Mue)@bT$F#FtSbYdB#I9H^Fdq;p#mg`IH{ULhCzmW!^f;$z%`r!Y^q-abb|S&hvqk2{1HFm2dn9I?bq9Dfd5^kw9r=^f z&j}rZ#j`ecuAyQEqlsKoPMjo9CfSR1Pe0fG&Oe*K%jofYyf+Q4%)DZ1s2qY6>!J+m z$+hRl`S{=%06rpd#-&R(Hc_oEmp^CgbDTv9yf{z8xnEap3PDD1u`trEWjvZ~Ap8Jj z2T58Ecj^289=#Zc4a-7Ct$R{0SP)rBQ15NeA7osy(IWs?x8CJs-kUEf>>0_2HqvF|omgF3ky(iPhTAdqX-(sN`@TSpwr3mV*XN~LAJ>f-Kbj6V zR{J1lfxaO)o`*<+;a^-k&6EDZ^)6#F~TAt+wrHM`oF&jltdS=@3whOP}+X78J7TUyyF zFYvZKN38htyhmV{yRIh}94#Y2zG}iDZD<6`)j|e%;y$oCg}qV=)O()#tvlN4r#FTK zvS56rgAqT}gJ7u4a)N7ew@+`-A3r!V!uEkI7>C-+hU=&iAd91#8FTp4#d4-k;q_&| z$_ZS-u`hF4A$`deznXA~e^0=x6?I~FYejBG>-TOWHKZ*gf$by=&la#THhJHUOeCwd z{-YpS)`WCpb%b;k7%&U(rW|zbZvD1G#%p&uD^)#J0=hYj)yvFXIb5?W?DI(gl-ZLIR7jY?8+AO&J9$_9I$giJRci&xiF^vX|cl!$3fbnGYPMtDpJ6z-R zawtxJZgW4a6a8czW&63eB20A!yc?YaHX#qzXydr2X6kwz&UeWbO$|J0DVIsX1`pGY zC6k%tus7>hCyN%gw{~@Iul*J(kVi-ONY{5zuv^>FoNmUimojb*U~;mmpBrm0e~Nm7 zz;l0UFduoYTU|dI2&)?7Do&HBT*I_ut+gV1!?GriRIY-XCNI$4s{SdGIHP8(5oWfv zwK%f6WP)((OHiU%Qsxz9sZuF@E`IS7tv#oU=A};Oxe4R5$vJ1U0x{j4Mg-iQ&mw8p z06IYJl;m}b!-@aUy!tn()SHP;D*HZxGqYN2GeN@?_5<*He>F55UXr?#(>jN_hu^L! zVC!o+xo3xcoV%71N0aHs<_Ov3J7Ku6a!jj!ysUnlf<(ehXH`rSGsN{FwXX>|O3p<4 z55L9;={s}wmW6b|v9jpu$?-X5h6}=h3(5ig++8Ed4yG`IDfL+!cg0}!?TO+sMMeGR z415;G;O>3N(f#)4J@jYy%Ou0o6NlT^)9LAS#hX6GWr99!Zf9W z745ZUo%WsA63tFs^`;a9^B+wdsMdCE25;)-A8BcY3DOF!juuh! zRFESTZ4X=ZCT&q+!XVjlhFmxkP-nvG`%m}g<)-Q~l@4uec7?2UYU70d8rP{DJzDca z8o(u*^&z0WIPKR3@YNcS?CV+ots|5;yHe2rEXJ8&bAR}@b-yos+&%fW9|wItsCv2m zc|r1>@PTEX2rXV7Sz#9kIQSU*)n?uW75^UKV)+sOd5ELtdk*Qkc=YmnZ=O`*H6_H_ zuL{lOegVJoqWr_(*c+6K8{Br{*R^NfY0yn6mLo~U>@dZh!H74c-(&v zZQhhMKBR>UZOA<;888SO=T{Op3eYNhOhfPxYVv%jk7m~cmrv1(vE%hfqf0L=U4IXl zwnM>#MQE^9i7mEywzymAg;-J}ktS#lWG!?(+OA_0zayxp1azxocH8H-cVFZ;_n#s{ zc-m52IW^n)WES#!^%kLI)CSq9Z8Ysaze7~4y#DaFu$x^I1*O zs&V7WL~dsfbK3u`V$yqhja+gO{WngEbM0ON~ zu;fNRbOl0KOQJ$N;<%Lz67hM7Qz9!}7NjO7!E%aBIJ&MJ2F37zqLA1;3_6hLN}swE zf(p2D4^q#b%FH0;>w`i-giQ)s*mVF|O&s}6t&pqWERTecc&&!^aTg{SMOw!iKQbpl zEKL$d`@adYDI>r}^f7p9*ly0&OA@|66*lROcYju zS4!+U5edTBaNhf0NBKbKpt>q5`KLc9%VA9NUqK|DDZW**H3`T+Y8zqwX$!>iHiirc z`7k}>5=+GWVS0K{atn+R%BF|93J=o7e?*&yOziAW?NjKa-_0jsQJ?uZV(P% zP|^2O!9zSS>*u#vhEe)+z_K~;`@Rh#$2NM8Vx9Ak5IMJ-q0-x97xUn~u*y}Fnk){; z3(xKyHx}1~3wKi9f+g-Y8z9&Sl^|cNiiMb-fG=|i9=F|jmBkPa- zIEzh+rgqAtl5Xig1-S0c?-=SlDpKxAH9IK7bWQZkxtaz{LQx)Jgqf;+RS^s80~_}; z5vdC4XxKe%<2;F;=c?_v6KW`hbzf`}Tv|({mnjTQ(q6C@aX?DzqWKWEeJXat2m)l#vA) zg{6r*s%c%D7@KalNHX?bMEQ4JiAeo#i8@Q&k=|vQB1~qdl)bgWjbiZJcoangHqs_p zM`G1j#;_Gog;5v@nZkYwQnpE82Y|U&M2ZTUd_oE|M37wU*fO_;El)7pCZLHLLQR1m zMi>hm77rrPOh!wTGP`Kyr(F(Gh=SP22OBwGmbHN+p))hsPuRB=uEd+hFu?5qQJQ+6_=e?K2*Ts5xiM<894-DRZ><++;OQaDhxG92e|6Jq^|d$Y4`mLE=z;1^H6`|u&Id4IN~3TA*dqs<_tY{1?2#Mp=7 zzl5)uBFoP?1=|Uj<>%CI=c=qh>c1UPk-9Ew1f+tls5}I*lqgKtKgVcIQ5@Fr82FtN z?ehkfRYACTgUt4f`6d2lraL|&NHFrZM(GLBQl6yD}CN>RaEIH~Sq$ zgZG1c)YFUSD_bXw z`=MI;bjVFtHVcg?tI*y+kx{Ef$$!u1u$bMf1O&fU;)cuf)tfzmT~H_fpjMQb{ZsFu zgWgMzl83W60~oV`KS2he)+Hyoi-{gkJ5j1XKMlX?i-G8B_VodO2@{ zn!%U}1zc~ji^TL|8xJC5e$gm!iy2H3tEZ?kPuvkqQ{N$)duX<4970chRYsoN zjVXPXEj#o)#8PN;9rId{jQXMV#L*g+MxmAOB~;HDFCp43D5yRNKkT%_Au5zXOal{d zST#I6c~eg&>|w8tu+d<|t0rMf<`n(=?7a?M^1?t9J@0S{$Pp)4y`;5^%tUHe)RiRt zlL*fNm(h`fi1}AHSB<4`Li7Z5gjP1hrJ$o;mP9LfgybINEJgX6aiJ{uZ_wN&IY?nT z)l;?@&4W~*A29;-SH38W6RfnJXa7bUmV`DI?((8-YM*V#BV4An^(r;w{!0qW{gTR| z)XK3n%B&2E{##h#D7X4Y5C`OnYP%f&5nohMG65$g`Pgws72%kAw-=xl=-t(DENw23 z3b!vn>#e0ji*fd@LpPl&v_dN`Vwbu^G3Z>nn2{7|qSczJcR5K~_;N8KFz3*!PojwWoCWf>9!Vnu~2Z2pCigLJ(9kIaJm1@7y=aAV(%lK!?}-XT6uvr+~{k1<65;1!K|<)EkfCqu_n#3B=U& zwN9;tl%C@PbiZLmWVWzII2|%fC4Jc2CYzg2(PE58Bu;v~=UxzdBuv#NlGHKGWyaC| z0ajqpTmfdS_VsM&CZsXO>$gk&42q!qldxgbtOzyA{y;bPEAt|NM9A> zQH3TBd5qHt%#SA!Z__A<$a*NGXg2cJ3NQNdtPa`iVlsZcgP0x5bDV`_H+Dn7rQn&;BhfAT2Smd&`gCz1%xm{RyYBW@*5^ye)AiDqRtZ%OM3nhi z*xt#Jb%Z(fTfBDfRA0*JU|wF1#mFFfH!)5!BYYa!BvQ211*?T;U0EI%V>y;XcMaX_@}oS96P= zfWK+ESs>^06Y1J_Z$F`QIPoGdHBfo>m|WppV>pFkqBC%3rbLur1{V8kD(8K+&`nDo zO!7D$r7-cmR8R_dA1dUZ2pN`n+q;F(0b*`z#so^)*iQ1~+oIv4p=N@5ouvDeP zH1aB5*?;{YmN^TtC)%I?@BON!3>IEEDj7KN=9Q3d7}c$#rTLzb7eb*f3nIMOWR?uH zTIhQa-376{L!sj-L9rEF!6U-vHi08Bq9O6Y0;wtiedA~Zk#e^Nf`0e{gOIXMxTc&~ z?pK$Ic_X8_6s@@kEX8nIN;^enPs)13)P?nTrri4UQy8~KyN>olzV_zF)aj-gr(=DLjV26&eme3w!-^E^eN`qLAQ$L>bkXL7NJsL?XCBOgnXwkdwidt-n$0c#!<#cwNvrBf%X zCZ45dIkss zD?9$k$xPI9RPr2^JSC$jO3D1C9PnRqFz*sCzbwhGOY!2I^-(B2D6H^hb^mgU#>{K2(#O@i2tz<|!Nke-2V^=Nc+f49_u%+6gv4!`e|48i6 z``V;L4*2948`EK!O_&8MEQOLsC?E5Sc%N_P??I|nBzx(}2~)W@F0Y)(rVXo^sVqGU z?_h@Q(rg z<4?G}%zza(5+#bIzwoSeej`FNBQO%>f^fp&@J4fP6oDOfORd_BEW#-W)~@EwY5_UNCe(Hn5Na)hxZgU~j-1Q-v7} z^=N5)gg92K7eGpC=_QYUY>zK^PV)l)>K)iMFmGr$adn5% zg-BX0O?TMo#WDJ1_!qRU&L(RtEOvEyq^7N8M}@kQyHRQ*!V4>7Jn1|A2j-~sQYQq5@l#Ko|N3GH_1u-!s*h~eda`14uQ6U za}<>ue@*EBb6GrYcvBUY`}K0`qw|yvkjr$bD~e^b@rjmLOE$nHi_R7t^@Q5zQ-m2R zUMh;s`T2(1WE?28LPti3vG!wUcfO!?wUW@GQfNn0b+laRJ)#z5i2Og(Qc%Xq31)RA zUFt7Lg)(Etyq|(3qw+%h=Ozv=A67_o(;?IdE;?bP_zyj|+Vt}j1}t68ZV1N~McycL zq*0i9OHq=Kc8*npuK{aKwb?qcQxs68vWjwwI4Rvpo?_%#wS8$og|22$Nuw%N{Z8S8 ze*!a{+!!tA{{;GuuwUG(AC zUZUTH4bcLJFA#$zfUFXp)MbQRXw;)52SYQ#8%g4rs9h{&@p1%dP1X#5Fptolj5QzNeKpOf7qXdr2NMoU{5!kd~WSCZV;Fx%f-3M z@DB?;6XA%-AyE?YLnY(0S0p`+mWwESTuL%~A!AV>&(DUU{o2S11piqzo0@+cDhF4o z^x}HCkSjFSFn!YEW5`rWyuN!DGw5#mFq7Jm@&`F9$v-eBkjWeoZxv+_L;MB8IVGgf z6mxNKiKJ7}!>v}kk@eIEn&(H$B62PP9&#KM`6j=+TKF?i&L`P@Zv}X529H7LDfO|M zYeUbKO(CPv^-7M>1(m*BtMPRBD}_?h7ApGOj@AkNBMUZ8{7b-r#UBTOi)!Y9dE#u9 zaC;@HKFJ~&iX`I9{~l7d)(F0<=@~WQRhSako8(OGe~+98&}AQX2BG zv2ub5O(GTpeDLG$Hkp+Gm!>7NUv`#B10h^D4Fly&&M0mSLULc8^&PL%hm(^)M;8~* zDBpM8PX{2RN%ObU?w+j&u)^*EgNe$mL_kMpgZ`S7aBa=9rc8S~4qVMk!HhHumxP0*4fE<1x-17u=CNdl!O+yK1JQ$o>sWlgRE?4h06;x;C&t?h@F) zRCq9iTC!4a4L(m|0P?SU8Dp#5g_i;_kvEZ?U;BcLCrB$m0YSGgP%wl4>|bAav53fe=Ct zPowpZ@;9Y~RKmU~BN@RAp*YBcMsbueqw@Lyi^J42b5Ld<+h_h&fk@hI7t_RnO#Ms&Hd5UM4>!GCA zIS?4=pWyEWG*H(F-j%$3Qr;RT8*XA?NDAKK0?y#QFFVq74J&4BPo9(RH7G-DxY4=D zMHMM_tdDV*@vuzyi&OZhEPWp7tCLQD?~MTx@DQ-Zd7-J`egn}G!Y90}&J{#53$gC6 z2yQM;h~V*@!ZhoD2O6998*yU4|NCiU7lxhWk)oPlQ6WDwN)0Dp-SLsas4VSmj%?%x zc4<-JEJHYa%BV~lLSh$Go0qEA4@(9w2l4c(ylr(_tbUgGAYhmO4TH82 zCmR*Z0=$<%VdiR()W%Mw#&)FLPbZEz#79MFWkg8HcC^w#40ROSQDP-9t*e$~-fJ^nZu$2ftqydAmdb>gaKhrM!IX=uBoh-p zm97$DRw%&MIy_%;dgq>w-@v!)Kj8-3D?002#d&$!bO)dYN?`c414XB;BgETLP+4Dz zld-GN)Rg?uV#hrNg7z)Fd=4}b@1uv9#_DcGNVTQ11C2SF zi=xrTb}65ju*eEfrH>>lDj=>h^?VVZ|mF2OVotE%G%9`VNtlMh8e zFsI**L4x&ofSx0m)sTz|VO-t}$uReQVP=B4gJHtakV`q3zpp!OzGBSn zMfok$`R|IM;j`8(Erzg|S}3JF7MU2186=Wx_%-S)x({A$Hy~1$pL!;kIF1{KAX7jg z%isT~ilr4WJ(G0lseVFBIpkF!4w_`#9kIqxYiP+rl$NAp=X%tq(}BKjX+YZL$Pe!q z9VMltt8azNccJHa)9}B)l+An;p)%Zp!$TZi;@D&LhlK zx?=|M&$=Zc*w{mVGuf%EX-wa5PiKLLQ)?7()@66Ys8@q5wg{x-@g5^=X`Fdx`c7?c z%s2&NbOGxn_fowHQ8f%Dp%-;+IOCE~am4Tr$LJr!Wup`$688d1c`k>iyiuVzPwm{# zmLsLfno2qtobfuN3CAkQCE~&G0mn8NfgB3Z$_9T!ME}(W;}A`znhkiEL~?+fn{ruW zUEo;*3D-l@&_JQ=$WzT6k%+JW_Ddw;Ad2`0HhK~uqK)P2LO8kKwkh7+6_sc}@U>dv z9-GLp$o|=`!dR+u=^DRG)2g2l^YwH7Q52+X2+I+rzMg56?hvux_=MR)K3a?XiDIx3NA(WWyj3)Vp?3|Z>R*@5tP@2)0& zEA$CT=0n!F{M3`>8&l(i`-HF181RWZ;bt9FkLMtZ@Bb{wV-&C@QR9A?)5NcW9K}kI z%fr>2gcTSj=0aj=M$}VI$!7QvnN-@5v_wve&bi@D&IAJ5w6NK!JUmTC{xYtGGO>NA z0SOyceqjqv2@a)cR{VCDPNMcpd+#hGr787u=95*y=q$HlmV^51ngUZZ{2WN_UnwC{TVD-e*v`Nq<|3)S5~kM{j9 za8h^E{fa(jpm!7fxu7d3ms>T+IGV-r?K3iuWe)x$;XPX;Z9ORUw2kqZ&*SI8X&eZu zHynP3F?F+;Bqgaok+y_qwhMz+eFz$JQ{XP3|LK;KvtwgWb6OY*;fF? z*);1yNFYFv;4DtCMS^Q^m&FML3-0dj!Cis|7I!DO1}8X+2MxMNuw4j#`M&=@zn^o@ zy){$y)H6HN(^Iwk?z}xc-9eEiXNSGY)}W^?3;^_@cfw1VzcN2rO=HIVh4!AxzA5N? z5g<87iHD8l)N>ainWIdFtKyJh(1_902oZ(&I}M8y;Ineh z)qwioroq{EYb>Z~igHm?G6E{h_W(0HSBx0jF-RsMd?-kUT^`v+2-n10)f-XKI`3tw z&j5qk@fSaPnNPVo1BI#?+GApja_JF~RZ9GsD&p>t6;#uh6Rk!g%GxU01yKFV7}@5L zqa8WUqLt4%&!Wfk2tRf@yr)m874S@dk=?<-96~jM+}%_OHPuyOu2<4oQ5aob6fb|P z+$UKRYXd;3xuku=Zj!#rEW0znX0)S%uVGGmokQ)o=*dP@q|X3MoS~W;DfG{APSE;hk!+EY_wKpw*E5q@ zA=0WTmstD#-0n5zZ3=R6AxYf8T}*^zzL8dM&)Y#7I<-iF0qRWBo+T1`GERa1#(5d( zayKB>H@#k~2WlN(=m#aoB?~g5{UeRHH;sJAmQJsxeiG#lu!}~U1QHA(u*4xtlVZg1 z0f?ZJvH^pgbx2~_B=JjS9eD*06S(!An#6%}{KX~=!p{dd*S$WTr~Et-9{%IY6&h*F zB@d0F2Bd+aIU}8zr_X0RF(2#*qi?0+rxL#0-5t!EV;>nAO|eBP*sGReay-BUfyN;y$}mUBX5(ZzP9G%|=;w z{$#X+{zBw5UCor==gYJ+lwa!0O{$!0_YKCnu+Oadh9F_`;ZV+N;gjhOwurUmGbH5~ zfbe7{2@(XpR{~$y`99O?R#?^U!&^TA8^!psoVYx>lU<-vM#R5_klQRNN52a2ANt`E z#aQp+$H==Vyk{H-ed?RW(KZ(7(Xx%hyM5ND+Sk#m+Km(^Z1#FJ0+I&o>s(^DtGtKx zDO9xXUZ+TXi@33t^yAL&(or?2Dy`9+)nYoR@WX|3U-hc1R3gu^Bu}t>a{7Y!3fHnT z^Yi7+xbrh3p8_KcEQM!oVt%Nn{keFXPUo=UO`{aI@7kPquepeF`@MeX&!&`wtJ^BP z<3^RBeOD^Am6H1N%8LnzcZB>8u%X_VKXgav@qFEu^$^AnBqvf}d=DAg~?c5_Kqp`|pt2DylqR< zd~f+=;VHs7=Hax0OF0^;;r1A2fED2-iX2rZYC8?RYcR+z!J5;p9qw;!vcSHze!7S3fCz%F~_M^83sm-I|@$_jG?E<3{BBvok*CTW1kdcA& zr+cz}k41{?57(LF-=cv7(LkxF@aI5soI+38gr8Jm|1F`~=6!qfIvbkJm5wAp!;q@T zWk0V3uu)ih8K54|iy7u0(iy%%N9{EKK#YrB7Ewqau6D&?jgO%Z{t5EsYyvV1QZwRn zsJK!E^GX)@u*RYhRhj=RI_vG3wRf^vwyX^P@)FIt4HY=qZ{etC6#x3{#IX6BwN%{9 zZHm2U$~Z_+(F0j^hj9U-pen6CCa{aVKQ`9s+;aL0^pg-rgfrAuoDnEBkLDd8nN}hb z5^2Ua^c23{;V}pImo1YstvdmIx6WaYl^Co>nx*YMY zPe*=9-yXk-VJVU&5`9quaU@BYd@~-4i8Q^aBv%z_L=ICb3e|9(s)7?M=ROcW?HYQB z6b;}+WmQ-GL3E0{6YPWvvvzz$NyMrsPDsQ6lzzh4EZ_#xFy9{=3^p6p%eUgI6r}}D zh8^?iqU%DXY1R)G)1$Y8{SK0M^7wO@60wECSV=d6 zvIiHGWs@QQuY{p&vY=2n{z-uR!NtFkq`&x^M5f2#u#>@c+as`EXlU<+7BwS`zd|qd zheXaDB#Y>94k(h!#IEc@Zl~x&q_CKyIBS?v)1*r$P7g^TjY%WcDC06#LrnhjLd`A~ z^}s``gxWA8`hmHGKYZH~K71}?49B203X&n6e3iGXMeS92*>ijj`FZ*C7Yr-l01(j9 z?z8Xmb=w2+hfMc{Jr0jhqY7)(+nL{AYi7>@i?h0A^oi0wii)aU>fc+4-!Unl4msa$ z5P`!`(T&`Xih4isZ_iY&bQ|C#=TPVJUEI8MIg)P<&0tIChTK!1`cMO4>I9tPp<&4- zL!pDBFW^p~7uw@7Ja4ruJYFO<0!0)n;OYBicSXM9WTN9Sf*;WmatHu+>NY0d=hGPN z?4KN5$%5fUHm^)?Bh#nMTHhoAl9`p`|Co)32eT7zSDIdV71y5cY)0p>7}1P;I?%T6 z{aB2rJ3`7xIR+I;wsn*-jv;;}s<$*=V<Jdw%)Tu^x_CjDF-BJHiK(+60FixI8g)FN zT^XIf5TL_~{loAm+1NxOQmO6Rr%#KG=G*r}VtXR4kIgGXUTI^m7WydejvUb*qJ3t= z9r2bag=y3|b=ipEYI`&J&D{#3k|a|k=H=~7N`|cgd4xh|7x%whs<}UqE2Hhra0QN; z1UJn10QtHRMUkpzn{x!pI#V*c=}ij25%Gt#y8w#zG@J{P4T!ot3+jR4rJBw|S4ylq zjwt)nqvCMmN=?HbJ@IBk}lLb@qFWD6SMd=>RAK=%!fPs+QMDl?@X7oxG{T zk~XFQd2aa@6)Cm4hvGOQ4@97p%?fbsKr7W4SQi9%Ci194&Tj|$R(~F;6@IiSp?PGV zLW@zJ-%(6|+6G&v<7Ce$*d<40#=s2)ku4sn)FBa-zew2NvtJP*-_#&P>E((GknzFd zkQ;2w*vyAxIWzRyj!lMt+3GbDE@`OJuO7M42$+*s=5DRe6Q$l{PCG zEEy0k%%Ew4Wx}n>WsPJzwg|X8&_u-Ki)Cs9)mIfMn=LcU8&0x#1w*9|_#8+hwv;ZS zG@Qu9$ao)QIru)?WExpL1Iw>ML-L7h=&97FL9t_0(_=49)AzAh!QzS>A6rweF(~86 z2u3VOOi7xn`uonSCP=No2K4cM8FS^)X^z0!)p**uVcULbkQt ze!np6uU_tvZB_+Zu96V((>|SB7L*s7E3@qs!vDXup#tm+<*sJBFbC@n{K# zpc*=-Jj)nEBU{02Z_HoF{(#EX!0A(c^MWcL?^A>tHnqH1#Qu6|V94M@{dZ)7fFXy0 z+O6e?qP}-8#uI|>ll{AP#rl>W{^~cS9j*{}`l_NwrHVU0DtYO7GH%cCIqdXX?c3&w zej-~%;>F-9O)**@gcPHaplS86@umSWjOjB3hCU_qbT_-GokgQpO)1YT-aF!2&^HUJ zqTPYh4q<{`Iy|o(@nxOy0&HUHlS&>@3aV*7Vhcp&#cDIjL{5HvdI8&Kr*8$<1QfCE z%<&f`KAB}B6Tuq|;#}O6A9KhlD6!@AWT=q8t9?qT&~BlA`Ix~@DWHTTDaH(ZvXRQB zK3%<&RYu34gCOs8Ok>#Xgu4)+#%DK$eANd_;0sGSXP%OcF(xjG~rigYqlI@Tx~x3tg|ajJq>!1|=eYBs zZM+bRfvi}u_n+66v8a918m`L6_D55lartgIA0=#O|q%#~nE{J2WIj|6E zhtm5{4?#&gha6F9-S2S)9~^M=pdB?W1C*vHBJxWyhN=EL0T&YaB^kryqNeHLbW7-! z+*Rjm{4ZNwfwOAgGrW0AN5yBHIE}`)p4lBmL`~pJzpe6uBTGBcb$DA4%`s{yv%_iI zO3;@#rxPP_*^L`aR=A~~6kw6oq)&*f*W`Ul1=$-9vZs2J8Az8s0Xu5o_+hAgN+E(l zC9Z!PbVAYoixddp&H%B1{#ZhmdCu)kpGCxdXct zUwLFLmBBz=;jc3ytW7oaC=^JBKedu6u!exDibL}FN;}PKam&_w-uPZ zbHb8Ldb5)P>ZC`$KY2eveH4l1geYpj8rbR*f4DvyXHNaCY6@rjdS9nJ&|LW@tz5`C zPtuPFfuG2M^JKSC@Zk3sU3g|EXr5z3FCKJ@9zpK(zm>n#-!raXVc72eyzNrAMK1B! z(*7l>OJQ*WdyqoxiL`QIYW@Yt%4l~BK;aq7q&VB1pL3Of4i8GYT;xrUM+6s;EW%vX zO@*V${TOt$P1fvQd+dib1n*45aJ9d|F`$wH==^A8rXk^A|&%JsCJ-M7u`5=f@y zQYdzY54%&ZbxVT#i&NohZiL%lm-C0@XgFy&*T+`s@d?N@@`%i=*Pt(FL1ZhBxi+>j;dF|6!yww^}qF( z#M-EdvJknJSBmvB-$Jh{$Qe=V4nsiXeRXVY&^dn5IT!U zDj2&fRP31%MKc!ko*ss36X`{~Mzh2&HSbo!(rL0w-*)&Ur{aAL`@-D)PW|;bI6#}{v3J0--+lV-)UmGZ@fdoN>X92B7m)oh z^msSvd~KXe&uWt61AbP6%y)v)VJTbk*wHqitfn;rg~g-az45?|v*B{y+iT%Rym8@K zpvZ*Z)`TndP4z7SRt2U^iFB&kmG#-nAdhu-B#)b2fWwmTcnZR1@WLA+GU*tn_PfS_ z)*%#_0hXt~Uju2FLP5C8DF1kFMG^nl;mJRIiA^J2$^IvWSxi^kN+5TV{2Ez zKITg|;M!v}YxK}~#EL+Ra9kwFB267l^8U=+seAcg$BV7xwBL6IasidkwWF>R3}_jM z7>{3gin7H~BC;-Qctr6OCP{cLLE`FmOcvO5oSL7d=x@$r;Ba=;Tw$P;Lu-*sFa_&T9d_wbaerp0WTxQmr~1U10lMobh>@ z+#Vi|?uK8uV18}8Y4vJuv3{^x63x-xJk?!6qFKWW__^+{_vDSOwSeUj`xMFRvbwd~ z-ruABgFg4;ouix6Rctf*Yj10BYl+ra?SOIC(QmapsyuvUtUwyW73V?TfDYkD8==O> zdA9Ov5>7^csqD$Ig^KnOecqBQZV&whZB`kSo$$xYVVXxjH`ESR5foYrt8P7 z_NL+%C$1Z75ngklqAT21MdxkfZm4EWa%XkryC4v?UwbT z#kf?-eV}w=f<=H$P|kL=c*MASxDIv7970s!iSvS`Jo*?xee%&}U7s6)ZtR*L; z{959d=(W83G!9&H1o1s$QG?j#NI1Kkyd=wS7Q*mbW=%1vSBjPh&;8a54IsuT1YxaO z7p843%6l$>mG~7NB9q{b285Q$UNo08>S;G*^hTx^S9Y`5{#d)!2wl2G7Zz359X`*x zq*Y%rztG+IUW4}#vp2E;MYa{}2`ibB!O06@+5a}!2GN@^6I5Xkn!jk>hdgt7M>*d-&@VWX{3hv#`eClRo1VTH`sme={69R<`~8c%u$Zy z8HUw9KlH2{)qWtZoC)PZ!^fHe#%8b+P^^JmLs4Qu)9>;0EZ7g6lp`J(`-Kx(iqch| zp5w4!ih9!E>R(Hp_u}V>{-&1kBV=)OJi%Z`!8xg-I?-4CC_Tm~@@om=_~x+?A_x_X z;yx|i3mTjW6K=|NKvEi7Iw&*gAyW)(sgRIg(ul3+;&y`gkLDV67ai5D>*rPJ5oaEG z6Ex}vDQkk7-I;$N&jbOYr37sYsukVN##|7OMW6Bu9IY^3mIH$Ac=^ zc6LdT$>Jr*ft5P1_tx`*`|rd@%gK!RuYW&?L=8W8Y@A9|nnBL8RNt5E)j{Hw#&LJj z^Khs`e47@eOVwBLYn8s!3K_D4Bs#K%iFPDhjW{%Zy++K!Tojy!ZQw69W^@Ke096%& z%;=t+5M!P5U)zAIm7^&$$JsekGTSw0zKI5X z-vzI&d43^QdIL#HX0&$K4b$~_#~?JCUl7_9pSk=IUWrmxZHqS&$h-6@Kbqs}gDvu0 zboj!EAQNFfpe@4pdVoRSTgG5!nasmgO1_DyNMTc^N=`lXw?!!Brls)YVY+797glE0 z<*n4xstVolL3@3D7Cq5Jo|J0SzM}VV%GyeakE9(A7l&G^+@RCuvb+*GG#d zLD-i}tT(FXDR0r49COCZH{b)ldbhBdUsRhJ#);09Xx`Xvb5^u*8l%tM2a$TsX0UrL zPY+Z{FAevd!#ooYV=_O^Y2$)?4i}Gqe!-oGwC#hFIXP<7_ZRB#hr5EA>ok64BCbKY zT$y03vYv73Cuy*28zrT5ZG<+PB|;R^3v)rgQ7gi@{U8(c*dfzZtA|n1_{x=X%_CLI z@zYVhwH>`~qDFMlON82O3xcvsU&;`=P4DzI`ic?fcQi2xzd_v{<OxMn^V^ z?-i9n;}C0SFRzb7&5j$4mU^$q3(4)u+m>N==Y?e8xjv-E#UyN>A9$2UgT3s`Lf#r~ z@KPStwQ1b#Q~~=wN+ch9`sMeSGo|EG<-O!UA*HnRw72Rj_PLHm`>NUH6#^Ay-NhU2 zFNG3Z!Gb<%coasSU4@o4J#fkq~V^e&= zQCHz&onF*mcn>Hbz?_gSZL)4`3Hcxs*jGnD*Z;#I4ro!jZ^19YLO9pysck!Hy=M!$ znbIAlXk&w$6KX`i`Tmq54y2edp95H{DiBlB;W#BjTANQIID0ed#H-Cs*k(NRD=kM+ z`+F0-k4xRO@O`5bqb*4CLcBr!6obF@`IddocXzbTZ2bs$WWryV z_^_V0a9+;uuCV)I;gC0Z+i25C|Es~#^$*n06CjQ&?aM1D4%4&`1m&Rp(c8hPgm)8_ z!f#=yv+{dvQU|aoK*-cakM8Y?S z`jMM}($V~oQs1(vhRU+fedY>^lv-KZ?Xz{qStf6%mnY~iK=vl%)2lU0?kvTxEBk(> z8YA!heZ6IW)nB!B9KdVV6az7CrmF})ZF3<%Q`RX=CVGqOr_kX0hQ?2#S2V~eqJ(lP zve0;NU)1O%xC72dref)Kh^jZVpGHmnntF%K>2W@p)L3Bvk3pRYh9NcJ&DpZ;%5uHN zI};D3>_zN`<4rLLy!1uFR+q65E9}GQiQU}YqCJ1kVAye&Ga#jpSYpF}RfcNKhi#-O2sindeDgdeDOd)fqQvGrN9dwHpi?3@S zI=imsgKM8<-gK`#iZ__k@KhOZJ?0! zRKPMwKcgB3^wVmK%1EF&va4V-Cgfw=sYW#s%!OHo2;zuKx1G?%h~08Gq+3jMuSSdR?xeW#)^sY8xqGUiuP=p8g^JX*}zl^olyHY z_yIBeVT(O9p*LFG(`=>hm#OObF1uw=Hd@CSbfKZsg zJYsOL$zz~Sr3Fd&Ca9uh=WOglH9w@An50W zZL;MozbF-Zf1y!eS7vQb@guH$2&^QtM`)wy;n&M@Egwg<3_WNAc8OkQDbkse~fNrVTT=PZ3loz7Y~XoOo>Bs-!4if>b<*%=BW z<%bMwLy4V%Qmx zb0Nj9rBpLU&n}M(x3+JZFZwRD!l4u+aBGVc5aGMMYc2=5a3D-2B37_fLO`6ZR#eW? zB<&WJ;v|M|o*dXe?vK zVw=2L>v{W+8m7eh9;&S>>o?+LGf0!K;Hg+MFNKSzb_3PjhSPQUlDe{Qvw|{-Q$#a*g94#xrr42|^ zSCGP}nRnPlanp8~vT*NsjKB|y?F`VC?tvQ)U!vpA5u+BDM$>Sy)ny1zw>q1OxuOO8 z8@}!gVxQfu=G}2nVHiO9q~;?7#`JI13qM=U58tNjm6Iyi{f;5;VXtDJ(7u5(qVG^+ zpttN=NLgsiE%1 zhNjE!E))kb(3A%PPhkhEXG>>t3%h#0Ii>+swA=b|m;_mmJ~>L*{%Iu*Wd)B+7BVSy zDW%5C9Hsgmrl95a^<-6or%)i6%5v9Io#n3&bqc)=X_~D{NrG9BrCjrgr!(Btl297% zhbm1}mC+nTOGcry%p2*XRG$>UnK9T>SmvBTs6x(MPT^KjD_3`t@| z2~SH@WL`D%RM^d3+>i|9?HoJlYF#_*&DQz5*`HaW`FZ&C zS+yv2*(o_GIrLf8t-Q^ivNiLusyR5gJ~jQ3v{}yH+=23ss~UXFjvILW=} z^|f(_bnwhi--BL)F?6ah=;!gAVJVFXkcviK4k(|JuObgjLQdIL6MxM*Es7L{oDt4Z z2$I@01-(AcQH~GjI@G=rzU>0Tk2)tT?k{b5vR3^(EVeS2Km~J&OSVf^evxBsSFS=O z3J0CAHE)W}nzuz)kRmr?ea(}aQRw*%f?uw%tkx9Dp#&_iEx)>u>5#FlTo|MUnRCO? zSEs0spK5fq^D7jVC)^ikQ=zCjJn(Movd@j59y-{9oweoJ7m^&}y5jof+m|cP&>yP9 z%5J#)+U$$74mn-XSJl8}y3hvL(hcdV4!B|xvUkXH^K4bqppXP@ETZPTFwRcGyRQQ-S&B#Hn?3Deoe--&09>Ou&;(t{*%<@9B z+(cFl*7H&JgKjj1WU=O(p;X?bUHa>J;m~(*N53@kJedPk@2_3D>jfusCa@2FVDgfo zLsakloI?6Tpm%vr@yP-N{^~w3r;K723mOh*7Sa{Trmm0I{(ZT>Vt4iWl*2(Y z?8gn+ef7tR1+%6HRLIq_PllcIk?XzReb9qS&7|$1Tq9GoDU?*Q zFL8oD{g0r{-T>}2Z;UV z-W0ZfhkCdAn;i(y6jfV1HG%d&!qaUhuu%3u+9|CsszL8RL4A1AKa8n&s2?AJ2>pkC ze;Y-bdek-HN?<0Qp+c8}`forACiU+BDq_={SxZ-m`j22iSMp%99Lqe zZ>!^t23cMaQ_0y(MdJJZr-eZ;@~NI80vq)dC@j~O_sZ%3K1T1sF=||!L_FI z9u$&8gBB^CpTMvHy-E?zQ{GQLgv)q`td)vrc70;qRQQe4wQWwTFpN|GiJ9u3pj9yg zr}z`lNIv~;2A?+2ze@b4X%rcX+{=LCK-{SIQQN|DgN7^h7Dv%I41& z|EJ|yJO4*ve>7(5{htpv1|U%i&LpwNg_D{k8FLpbkQvVd6|3bw&HTsJ}|gG?P!jDSQrXBu1aeyxf!h z+n7Ja{*P=%m$NC;yy)L_{$mB1D&G^=KG$71K_33H6jM*PDbxR4n6sUpY|jI1C9g7H zWimfZ4Y3*Uex{ktUN9w!bH9$>pYpWkyALI?fVIUSB&7J6+hE~C{P>-bk+gq=7iD5n>xT$l_5 zt1c{0Ess)K-8*Yua_BzQi9JDqziz4b+j;^8)68*po8zX^v3bR$2N z!JrJ?tH5iE`bX{yp|jL$f7=J>c=lEPbx!vM>|&aR%$X69&IY+USYylAwvQp(b3{|8GZ?@Isx literal 0 HcmV?d00001 diff --git a/packages/horizon/audits/2024-11-Trust-horizon.pdf b/packages/horizon/audits/2024-11-Trust-horizon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79533a43109e9b8f8bf615db59bd4ab10917548e GIT binary patch literal 689393 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

%*E&sawSsM3734 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%0AX!fJY-S4QYZFSk9Tyn8k5$f|9o4oezUQwi^Y3-X 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 !T6?S}-pU~RGI-r~2C3`uE@75V~ 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%0A(#~4lP;>ejch3D&!(KI%#iWr?>(Ck$) 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≠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%0A+BX)onJeVvj=8ISJ;UxKpkrxvmetZ)n%<%(6<; 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�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 literal 0 HcmV?d00001 diff --git a/packages/horizon/audits/The Graph Horizon Missed Issues Initial Report.pdf b/packages/horizon/audits/The Graph Horizon Missed Issues Initial Report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9f3fdc265435bdaa0e020f1a59780501ce8de983 GIT binary patch literal 125299 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 z%0D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 literal 0 HcmV?d00001 diff --git a/packages/horizon/contracts/data-service/DataService.sol b/packages/horizon/contracts/data-service/DataService.sol new file mode 100644 index 000000000..6b14365d5 --- /dev/null +++ b/packages/horizon/contracts/data-service/DataService.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; + +import { DataServiceV1Storage } from "./DataServiceStorage.sol"; +import { GraphDirectory } from "../utilities/GraphDirectory.sol"; +import { ProvisionManager } from "./utilities/ProvisionManager.sol"; + +/** + * @title DataService contract + * @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 + * - ProvisionManager, provides functionality to manage provisions + * + * The derived contract MUST implement all the interfaces described in {IDataService} and in + * accordance with the Data Service framework. + * @dev A note on upgradeability: this base contract can be inherited by upgradeable or non upgradeable + * contracts. + * - If the data service implementation is upgradeable, it must initialize the contract via an external + * initializer function with the `initializer` modifier that calls {__DataService_init} or + * {__DataService_init_unchained}. It's recommended the implementation constructor to also call + * {_disableInitializers} to prevent the implementation from being initialized. + * - If the data service implementation is NOT upgradeable, it must initialize the contract by calling + * {__DataService_init} or {__DataService_init_unchained} in the constructor. Note that the `initializer` + * will be required in the constructor. + * - Note that in both cases if using {__DataService_init_unchained} variant the corresponding parent + * initializers must be called in the implementation. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +abstract contract DataService is GraphDirectory, ProvisionManager, DataServiceV1Storage, IDataService { + /** + * @dev Addresses in GraphDirectory are immutables, they can only be set in this constructor. + * @param controller The address of the Graph Horizon controller contract. + */ + constructor(address controller) GraphDirectory(controller) {} + + /// @inheritdoc IDataService + function getThawingPeriodRange() external view returns (uint64, uint64) { + return _getThawingPeriodRange(); + } + + /// @inheritdoc IDataService + function getVerifierCutRange() external view returns (uint32, uint32) { + return _getVerifierCutRange(); + } + + /// @inheritdoc IDataService + function getProvisionTokensRange() external view returns (uint256, uint256) { + return _getProvisionTokensRange(); + } + + /// @inheritdoc IDataService + function getDelegationRatio() external view returns (uint32) { + return _getDelegationRatio(); + } + + /** + * @notice Initializes the contract and any parent contracts. + */ + function __DataService_init() internal onlyInitializing { + __ProvisionManager_init_unchained(); + __DataService_init_unchained(); + } + + /** + * @notice Initializes the contract. + */ + function __DataService_init_unchained() internal onlyInitializing {} +} diff --git a/packages/horizon/contracts/data-service/DataServiceStorage.sol b/packages/horizon/contracts/data-service/DataServiceStorage.sol new file mode 100644 index 000000000..df759b892 --- /dev/null +++ b/packages/horizon/contracts/data-service/DataServiceStorage.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +/** + * @title DataServiceStorage + * @dev 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. + */ +abstract contract DataServiceV1Storage { + /// @dev Gap to allow adding variables in future upgrades + /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract + uint256[50] private __gap; +} diff --git a/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol b/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol new file mode 100644 index 000000000..a82c15361 --- /dev/null +++ b/packages/horizon/contracts/data-service/extensions/DataServiceFees.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IDataServiceFees } from "@graphprotocol/interfaces/contracts/data-service/IDataServiceFees.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +import { ProvisionTracker } from "../libraries/ProvisionTracker.sol"; +import { LinkedList } from "../../libraries/LinkedList.sol"; + +import { DataService } from "../DataService.sol"; +import { DataServiceFeesV1Storage } from "./DataServiceFeesStorage.sol"; + +/** + * @title DataServiceFees contract + * @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. + * @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 + * bugs. We may have an active bug bounty program. + */ +abstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDataServiceFees { + using ProvisionTracker for mapping(address => uint256); + using LinkedList for ILinkedList.List; + + /// @inheritdoc IDataServiceFees + function releaseStake(uint256 numClaimsToRelease) external virtual override { + _releaseStake(msg.sender, numClaimsToRelease); + } + + /** + * @notice Locks stake for a service provider to back a payment. + * Creates a stake claim, which is stored in a linked list by service provider. + * @dev Requirements: + * - The associated provision must have enough available tokens to lock the stake. + * + * Emits a {StakeClaimLocked} event. + * + * @param _serviceProvider The address of the service provider + * @param _tokens The amount of tokens to lock in the claim + * @param _unlockTimestamp The timestamp when the tokens can be released + */ + function _lockStake(address _serviceProvider, uint256 _tokens, uint256 _unlockTimestamp) internal { + require(_tokens != 0, DataServiceFeesZeroTokens()); + feesProvisionTracker.lock(_graphStaking(), _serviceProvider, _tokens, _delegationRatio); + + ILinkedList.List storage claimsList = claimsLists[_serviceProvider]; + + // Save item and add to list + bytes32 claimId = _buildStakeClaimId(_serviceProvider, claimsList.nonce); + claims[claimId] = StakeClaim({ + tokens: _tokens, + createdAt: block.timestamp, + releasableAt: _unlockTimestamp, + nextClaim: bytes32(0) + }); + if (claimsList.count != 0) claims[claimsList.tail].nextClaim = claimId; + claimsList.addTail(claimId); + + emit StakeClaimLocked(_serviceProvider, claimId, _tokens, _unlockTimestamp); + } + + /** + * @notice Releases expired stake claims for a service provider. + * @dev This function can be overriden and/or disabled. + * @dev Note that the list is traversed by creation date not by releasableAt date. Traversing will stop + * when the first stake claim that is not yet expired is found even if later stake claims have expired. This + * could happen if stake claims are genereted with different unlock periods. + * @dev Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released. + * @param _serviceProvider The address of the service provider + * @param _numClaimsToRelease Amount of stake claims to process. If 0, all stake claims are processed. + */ + function _releaseStake(address _serviceProvider, uint256 _numClaimsToRelease) internal { + ILinkedList.List storage claimsList = claimsLists[_serviceProvider]; + (uint256 claimsReleased, bytes memory data) = claimsList.traverse( + _getNextStakeClaim, + _processStakeClaim, + _deleteStakeClaim, + abi.encode(0, _serviceProvider), + _numClaimsToRelease + ); + + emit StakeClaimsReleased(_serviceProvider, claimsReleased, abi.decode(data, (uint256))); + } + + /** + * @notice Processes a stake claim, releasing the tokens if the claim has expired. + * @dev This function is used as a callback in the stake claims linked list traversal. + * @param _claimId The id of the stake claim + * @param _acc The accumulator for the stake claims being processed + * @return Whether the stake claim is still locked, indicating that the traversal should continue or stop. + * @return The updated accumulator data + */ + function _processStakeClaim(bytes32 _claimId, bytes memory _acc) private returns (bool, bytes memory) { + StakeClaim memory claim = _getStakeClaim(_claimId); + + // early exit + if (claim.releasableAt > block.timestamp) { + return (true, LinkedList.NULL_BYTES); + } + + // decode + (uint256 tokensClaimed, address serviceProvider) = abi.decode(_acc, (uint256, address)); + + // process + feesProvisionTracker.release(serviceProvider, claim.tokens); + emit StakeClaimReleased(serviceProvider, _claimId, claim.tokens, claim.releasableAt); + + // encode + _acc = abi.encode(tokensClaimed + claim.tokens, serviceProvider); + return (false, _acc); + } + + /** + * @notice Deletes a stake claim. + * @dev This function is used as a callback in the stake claims linked list traversal. + * @param _claimId The ID of the stake claim to delete + */ + function _deleteStakeClaim(bytes32 _claimId) private { + delete claims[_claimId]; + } + + /** + * @notice Gets the details of a stake claim + * @param _claimId The ID of the stake claim + * @return The stake claim details + */ + function _getStakeClaim(bytes32 _claimId) private view returns (StakeClaim memory) { + StakeClaim memory claim = claims[_claimId]; + require(claim.createdAt != 0, DataServiceFeesClaimNotFound(_claimId)); + return claim; + } + + /** + * @notice Gets the next stake claim in the linked list + * @dev This function is used as a callback in the stake claims linked list traversal. + * @param _claimId The ID of the stake claim + * @return The next stake claim ID + */ + function _getNextStakeClaim(bytes32 _claimId) private view returns (bytes32) { + return claims[_claimId].nextClaim; + } + + /** + * @notice Builds a stake claim ID + * @param _serviceProvider The address of the service provider + * @param _nonce A nonce of the stake claim + * @return The stake claim ID + */ + function _buildStakeClaimId(address _serviceProvider, uint256 _nonce) private view returns (bytes32) { + return keccak256(abi.encodePacked(address(this), _serviceProvider, _nonce)); + } +} diff --git a/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol b/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol new file mode 100644 index 000000000..78d826f03 --- /dev/null +++ b/packages/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IDataServiceFees } from "@graphprotocol/interfaces/contracts/data-service/IDataServiceFees.sol"; + +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +/** + * @title 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. + */ +abstract contract DataServiceFeesV1Storage { + /// @notice The amount of tokens locked in stake claims for each service provider + mapping(address serviceProvider => uint256 tokens) public feesProvisionTracker; + + /// @notice List of all locked stake claims to be released to service providers + mapping(bytes32 claimId => IDataServiceFees.StakeClaim claim) public claims; + + /// @notice Service providers registered in the data service + mapping(address serviceProvider => ILinkedList.List list) public claimsLists; + + /// @dev Gap to allow adding variables in future upgrades + /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract + uint256[50] private __gap; +} diff --git a/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol b/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol new file mode 100644 index 000000000..a4c60f7db --- /dev/null +++ b/packages/horizon/contracts/data-service/extensions/DataServicePausable.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IDataServicePausable } from "@graphprotocol/interfaces/contracts/data-service/IDataServicePausable.sol"; + +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { DataService } from "../DataService.sol"; + +/** + * @title DataServicePausable contract + * @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 + * pause guardians. + * @dev Note that this extension does not provide an external function to set pause + * guardians. This should be implemented in the derived 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 + * bugs. We may have an active bug bounty program. + */ +abstract contract DataServicePausable is Pausable, DataService, IDataServicePausable { + /// @notice List of pause guardians and their allowed status + mapping(address pauseGuardian => bool allowed) public pauseGuardians; + + /** + * @notice Checks if the caller is a pause guardian. + */ + modifier onlyPauseGuardian() { + require(pauseGuardians[msg.sender], DataServicePausableNotPauseGuardian(msg.sender)); + _; + } + + /// @inheritdoc IDataServicePausable + function pause() external override onlyPauseGuardian { + _pause(); + } + + /// @inheritdoc IDataServicePausable + function unpause() external override onlyPauseGuardian { + _unpause(); + } + + /** + * @notice Sets a pause guardian. + * @dev Internal function to be used by the derived contract to set pause guardians. + * @param _pauseGuardian The address of the pause guardian + * @param _allowed The allowed status of the pause guardian + */ + function _setPauseGuardian(address _pauseGuardian, bool _allowed) internal { + require( + pauseGuardians[_pauseGuardian] == !_allowed, + DataServicePausablePauseGuardianNoChange(_pauseGuardian, _allowed) + ); + pauseGuardians[_pauseGuardian] = _allowed; + emit PauseGuardianSet(_pauseGuardian, _allowed); + } +} diff --git a/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol b/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol new file mode 100644 index 000000000..2ca8e09c6 --- /dev/null +++ b/packages/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IDataServicePausable } from "@graphprotocol/interfaces/contracts/data-service/IDataServicePausable.sol"; + +import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { DataService } from "../DataService.sol"; + +/** + * @title DataServicePausableUpgradeable 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 + * bugs. We may have an active bug bounty program. + */ +abstract contract DataServicePausableUpgradeable is PausableUpgradeable, DataService, IDataServicePausable { + /// @notice List of pause guardians and their allowed status + mapping(address pauseGuardian => bool allowed) public pauseGuardians; + + /// @dev Gap to allow adding variables in future upgrades + uint256[50] private __gap; + + /** + * @notice Checks if the caller is a pause guardian. + */ + modifier onlyPauseGuardian() { + require(pauseGuardians[msg.sender], DataServicePausableNotPauseGuardian(msg.sender)); + _; + } + + /// @inheritdoc IDataServicePausable + function pause() external override onlyPauseGuardian { + _pause(); + } + + /// @inheritdoc IDataServicePausable + function unpause() external override onlyPauseGuardian { + _unpause(); + } + + /** + * @notice Initializes the contract and parent contracts + */ + function __DataServicePausable_init() internal onlyInitializing { + __Pausable_init_unchained(); + __DataServicePausable_init_unchained(); + } + + /** + * @notice Initializes the contract + */ + function __DataServicePausable_init_unchained() internal onlyInitializing {} + + /** + * @notice Sets a pause guardian. + * @dev Internal function to be used by the derived contract to set pause guardians. + * + * Emits a {PauseGuardianSet} event. + * + * @param _pauseGuardian The address of the pause guardian + * @param _allowed The allowed status of the pause guardian + */ + function _setPauseGuardian(address _pauseGuardian, bool _allowed) internal { + require( + pauseGuardians[_pauseGuardian] == !_allowed, + DataServicePausablePauseGuardianNoChange(_pauseGuardian, _allowed) + ); + pauseGuardians[_pauseGuardian] = _allowed; + emit PauseGuardianSet(_pauseGuardian, _allowed); + } +} diff --git a/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol b/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol new file mode 100644 index 000000000..0bb600a01 --- /dev/null +++ b/packages/horizon/contracts/data-service/extensions/DataServiceRescuable.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IDataServiceRescuable } from "@graphprotocol/interfaces/contracts/data-service/IDataServiceRescuable.sol"; + +import { DataService } from "../DataService.sol"; + +import { Denominations } from "../../libraries/Denominations.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @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, + * 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. + * @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 + * bugs. We may have an active bug bounty program. + */ +abstract contract DataServiceRescuable is DataService, IDataServiceRescuable { + /// @notice List of rescuers and their allowed status + mapping(address rescuer => bool allowed) public rescuers; + + /// @dev Gap to allow adding variables in future upgrades + /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract + uint256[50] private __gap; + + /** + * @notice Checks if the caller is a rescuer. + */ + modifier onlyRescuer() { + require(rescuers[msg.sender], DataServiceRescuableNotRescuer(msg.sender)); + _; + } + + /// @inheritdoc IDataServiceRescuable + function rescueGRT(address to, uint256 tokens) external virtual onlyRescuer { + _rescueTokens(to, address(_graphToken()), tokens); + } + + /// @inheritdoc IDataServiceRescuable + function rescueETH(address payable to, uint256 tokens) external virtual onlyRescuer { + _rescueTokens(to, Denominations.NATIVE_TOKEN, tokens); + } + + /** + * @notice Sets a rescuer. + * @dev Internal function to be used by the derived contract to set rescuers. + * + * Emits a {RescuerSet} event. + * + * @param _rescuer Address of the rescuer + * @param _allowed Allowed status of the rescuer + */ + function _setRescuer(address _rescuer, bool _allowed) internal { + rescuers[_rescuer] = _allowed; + emit RescuerSet(_rescuer, _allowed); + } + + /** + * @dev 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 + */ + function _rescueTokens(address _to, address _token, uint256 _tokens) internal { + require(_tokens != 0, DataServiceRescuableCannotRescueZero()); + + if (Denominations.isNativeToken(_token)) Address.sendValue(payable(_to), _tokens); + else SafeERC20.safeTransfer(IERC20(_token), _to, _tokens); + + emit TokensRescued(msg.sender, _to, _token, _tokens); + } +} diff --git a/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol b/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol new file mode 100644 index 000000000..06612913d --- /dev/null +++ b/packages/horizon/contracts/data-service/libraries/ProvisionTracker.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; + +/** + * @title ProvisionTracker library + * @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. + * The library provides two primitives, lock and release to signal token usage and free up tokens respectively. It + * does not make any assumptions about the conditions under which tokens are locked or released. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +library ProvisionTracker { + /** + * @notice Thrown when trying to lock more tokens than available + * @param tokensAvailable The amount of tokens available + * @param tokensRequired The amount of tokens required + */ + error ProvisionTrackerInsufficientTokens(uint256 tokensAvailable, uint256 tokensRequired); + + /** + * @notice Locks tokens for a service provider + * @dev Requirements: + * - `tokens` must be less than or equal to the amount of tokens available, as reported by the HorizonStaking contract + * @param self The provision tracker mapping + * @param graphStaking The HorizonStaking contract + * @param serviceProvider The service provider address + * @param tokens The amount of tokens to lock + * @param delegationRatio A delegation ratio to limit the amount of delegation that's usable + */ + function lock( + mapping(address => uint256) storage self, + IHorizonStaking graphStaking, + address serviceProvider, + uint256 tokens, + uint32 delegationRatio + ) internal { + if (tokens == 0) return; + + uint256 tokensRequired = self[serviceProvider] + tokens; + uint256 tokensAvailable = graphStaking.getTokensAvailable(serviceProvider, address(this), delegationRatio); + require(tokensRequired <= tokensAvailable, ProvisionTrackerInsufficientTokens(tokensAvailable, tokensRequired)); + self[serviceProvider] += tokens; + } + + /** + * @notice Releases tokens for a service provider + * @dev Requirements: + * - `tokens` must be less than or equal to the amount of tokens locked for the service provider + * @param self The provision tracker mapping + * @param serviceProvider The service provider address + * @param tokens The amount of tokens to release + */ + function release(mapping(address => uint256) storage self, address serviceProvider, uint256 tokens) internal { + if (tokens == 0) return; + require(self[serviceProvider] >= tokens, ProvisionTrackerInsufficientTokens(self[serviceProvider], tokens)); + self[serviceProvider] -= tokens; + } + + /** + * @notice Checks if a service provider has enough tokens available to lock + * @param self The provision tracker mapping + * @param graphStaking The HorizonStaking contract + * @param serviceProvider The service provider address + * @param delegationRatio A delegation ratio to limit the amount of delegation that's usable + * @return true if the service provider has enough tokens available to lock, false otherwise + */ + function check( + mapping(address => uint256) storage self, + IHorizonStaking graphStaking, + address serviceProvider, + uint32 delegationRatio + ) internal view returns (bool) { + uint256 tokensAvailable = graphStaking.getTokensAvailable(serviceProvider, address(this), delegationRatio); + return self[serviceProvider] <= tokensAvailable; + } +} diff --git a/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol b/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol new file mode 100644 index 000000000..db5a9e8f5 --- /dev/null +++ b/packages/horizon/contracts/data-service/utilities/ProvisionManager.sol @@ -0,0 +1,323 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; + +import { UintRange } from "../../libraries/UintRange.sol"; +import { PPMMath } from "../../libraries/PPMMath.sol"; + +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { GraphDirectory } from "../../utilities/GraphDirectory.sol"; +import { ProvisionManagerV1Storage } from "./ProvisionManagerStorage.sol"; + +/** + * @title ProvisionManager contract + * @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 + * if the parameter is out of range. + * The parameters are: + * - Provision parameters (thawing period and verifier cut) + * - Provision tokens + * + * Note that default values for all provision parameters provide the most permissive configuration, it's + * highly recommended to override them at the data service level. + * + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +abstract contract ProvisionManager is Initializable, GraphDirectory, ProvisionManagerV1Storage { + using UintRange for uint256; + + /// @notice The default minimum verifier cut. + uint32 internal constant DEFAULT_MIN_VERIFIER_CUT = type(uint32).min; + + /// @notice The default maximum verifier cut. + uint32 internal constant DEFAULT_MAX_VERIFIER_CUT = uint32(PPMMath.MAX_PPM); + + /// @notice The default minimum thawing period. + uint64 internal constant DEFAULT_MIN_THAWING_PERIOD = type(uint64).min; + + /// @notice The default maximum thawing period. + uint64 internal constant DEFAULT_MAX_THAWING_PERIOD = type(uint64).max; + + /// @notice The default minimum provision tokens. + uint256 internal constant DEFAULT_MIN_PROVISION_TOKENS = type(uint256).min; + + /// @notice The default maximum provision tokens. + uint256 internal constant DEFAULT_MAX_PROVISION_TOKENS = type(uint256).max; + + /// @notice The default delegation ratio. + uint32 internal constant DEFAULT_DELEGATION_RATIO = type(uint32).max; + + /** + * @notice Emitted when the provision tokens range is set. + * @param min The minimum allowed value for the provision tokens. + * @param max The maximum allowed value for the provision tokens. + */ + event ProvisionTokensRangeSet(uint256 min, uint256 max); + + /** + * @notice Emitted when the delegation ratio is set. + * @param ratio The delegation ratio + */ + event DelegationRatioSet(uint32 ratio); + + /** + * @notice Emitted when the verifier cut range is set. + * @param min The minimum allowed value for the max verifier cut. + * @param max The maximum allowed value for the max verifier cut. + */ + event VerifierCutRangeSet(uint32 min, uint32 max); + + /** + * @notice Emitted when the thawing period range is set. + * @param min The minimum allowed value for the thawing period. + * @param max The maximum allowed value for the thawing period. + */ + event ThawingPeriodRangeSet(uint64 min, uint64 max); + + /** + * @notice Thrown when a provision parameter is out of range. + * @param message The error message. + * @param value The value that is out of range. + * @param min The minimum allowed value. + * @param max The maximum allowed value. + */ + error ProvisionManagerInvalidValue(bytes message, uint256 value, uint256 min, uint256 max); + + /** + * @notice Thrown when attempting to set a range where min is greater than max. + * @param min The minimum value. + * @param max The maximum value. + */ + error ProvisionManagerInvalidRange(uint256 min, uint256 max); + + /** + * @notice Thrown when the caller is not authorized to manage the provision of a service provider. + * @param serviceProvider The address of the serviceProvider. + * @param caller The address of the caller. + */ + error ProvisionManagerNotAuthorized(address serviceProvider, address caller); + + /** + * @notice Thrown when a provision is not found. + * @param serviceProvider The address of the service provider. + */ + error ProvisionManagerProvisionNotFound(address serviceProvider); + + /** + * @notice Checks if the caller is authorized to manage the provision of a service provider. + * @param serviceProvider The address of the service provider. + */ + modifier onlyAuthorizedForProvision(address serviceProvider) { + require( + _graphStaking().isAuthorized(serviceProvider, address(this), msg.sender), + ProvisionManagerNotAuthorized(serviceProvider, msg.sender) + ); + _; + } + + /** + * @notice Checks if a provision of a service provider is valid according + * to the parameter ranges established. + * @param serviceProvider The address of the service provider. + */ + modifier onlyValidProvision(address serviceProvider) virtual { + IHorizonStaking.Provision memory provision = _getProvision(serviceProvider); + _checkProvisionTokens(provision); + _checkProvisionParameters(provision, false); + _; + } + + /** + * @notice Initializes the contract and any parent contracts. + */ + function __ProvisionManager_init() internal onlyInitializing { + __ProvisionManager_init_unchained(); + } + + /** + * @notice Initializes the contract. + * @dev All parameters set to their entire range as valid. + */ + function __ProvisionManager_init_unchained() internal onlyInitializing { + _setProvisionTokensRange(DEFAULT_MIN_PROVISION_TOKENS, DEFAULT_MAX_PROVISION_TOKENS); + _setVerifierCutRange(DEFAULT_MIN_VERIFIER_CUT, DEFAULT_MAX_VERIFIER_CUT); + _setThawingPeriodRange(DEFAULT_MIN_THAWING_PERIOD, DEFAULT_MAX_THAWING_PERIOD); + _setDelegationRatio(DEFAULT_DELEGATION_RATIO); + } + + /** + * @notice Verifies and accepts the provision parameters of a service provider in + * the {HorizonStaking} contract. + * @dev Checks the pending provision parameters, not the current ones. + * + * @param _serviceProvider The address of the service provider. + */ + function _acceptProvisionParameters(address _serviceProvider) internal { + _checkProvisionParameters(_serviceProvider, true); + _graphStaking().acceptProvisionParameters(_serviceProvider); + } + + // -- setters -- + /** + * @notice Sets the delegation ratio. + * @param _ratio The delegation ratio to be set + */ + function _setDelegationRatio(uint32 _ratio) internal { + _delegationRatio = _ratio; + emit DelegationRatioSet(_ratio); + } + + /** + * @notice Sets the range for the provision tokens. + * @param _min The minimum allowed value for the provision tokens. + * @param _max The maximum allowed value for the provision tokens. + */ + function _setProvisionTokensRange(uint256 _min, uint256 _max) internal { + require(_min <= _max, ProvisionManagerInvalidRange(_min, _max)); + _minimumProvisionTokens = _min; + _maximumProvisionTokens = _max; + emit ProvisionTokensRangeSet(_min, _max); + } + + /** + * @notice Sets the range for the verifier cut. + * @param _min The minimum allowed value for the max verifier cut. + * @param _max The maximum allowed value for the max verifier cut. + */ + function _setVerifierCutRange(uint32 _min, uint32 _max) internal { + require(_min <= _max, ProvisionManagerInvalidRange(_min, _max)); + require(PPMMath.isValidPPM(_max), ProvisionManagerInvalidRange(_min, _max)); + _minimumVerifierCut = _min; + _maximumVerifierCut = _max; + emit VerifierCutRangeSet(_min, _max); + } + + /** + * @notice Sets the range for the thawing period. + * @param _min The minimum allowed value for the thawing period. + * @param _max The maximum allowed value for the thawing period. + */ + function _setThawingPeriodRange(uint64 _min, uint64 _max) internal { + require(_min <= _max, ProvisionManagerInvalidRange(_min, _max)); + _minimumThawingPeriod = _min; + _maximumThawingPeriod = _max; + emit ThawingPeriodRangeSet(_min, _max); + } + + // -- checks -- + + /** + * @notice Checks if the provision tokens of a service provider are within the valid range. + * @param _serviceProvider The address of the service provider. + */ + function _checkProvisionTokens(address _serviceProvider) internal view virtual { + IHorizonStaking.Provision memory provision = _getProvision(_serviceProvider); + _checkProvisionTokens(provision); + } + + /** + * @notice Checks if the provision tokens of a service provider are within the valid range. + * Note that thawing tokens are not considered in this check. + * @param _provision The provision to check. + */ + function _checkProvisionTokens(IHorizonStaking.Provision memory _provision) internal view virtual { + _checkValueInRange( + _provision.tokens - _provision.tokensThawing, + _minimumProvisionTokens, + _maximumProvisionTokens, + "tokens" + ); + } + + /** + * @notice Checks if the provision parameters of a service provider are within the valid range. + * @param _serviceProvider The address of the service provider. + * @param _checkPending If true, checks the pending provision parameters. + */ + function _checkProvisionParameters(address _serviceProvider, bool _checkPending) internal view virtual { + IHorizonStaking.Provision memory provision = _getProvision(_serviceProvider); + _checkProvisionParameters(provision, _checkPending); + } + + /** + * @notice Checks if the provision parameters of a service provider are within the valid range. + * @param _provision The provision to check. + * @param _checkPending If true, checks the pending provision parameters instead of the current ones. + */ + function _checkProvisionParameters( + IHorizonStaking.Provision memory _provision, + bool _checkPending + ) internal view virtual { + (uint64 thawingPeriodMin, uint64 thawingPeriodMax) = _getThawingPeriodRange(); + uint64 thawingPeriodToCheck = _checkPending ? _provision.thawingPeriodPending : _provision.thawingPeriod; + _checkValueInRange(thawingPeriodToCheck, thawingPeriodMin, thawingPeriodMax, "thawingPeriod"); + + (uint32 verifierCutMin, uint32 verifierCutMax) = _getVerifierCutRange(); + uint32 maxVerifierCutToCheck = _checkPending ? _provision.maxVerifierCutPending : _provision.maxVerifierCut; + _checkValueInRange(maxVerifierCutToCheck, verifierCutMin, verifierCutMax, "maxVerifierCut"); + } + + // -- getters -- + + /** + * @notice Gets the delegation ratio. + * @return The delegation ratio + */ + function _getDelegationRatio() internal view returns (uint32) { + return _delegationRatio; + } + + /** + * @notice Gets the range for the provision tokens. + * @return The minimum allowed value for the provision tokens. + * @return The maximum allowed value for the provision tokens. + */ + function _getProvisionTokensRange() internal view virtual returns (uint256, uint256) { + return (_minimumProvisionTokens, _maximumProvisionTokens); + } + + /** + * @notice Gets the range for the thawing period. + * @return The minimum allowed value for the thawing period. + * @return The maximum allowed value for the thawing period. + */ + function _getThawingPeriodRange() internal view virtual returns (uint64, uint64) { + return (_minimumThawingPeriod, _maximumThawingPeriod); + } + + /** + * @notice Gets the range for the verifier cut. + * @return The minimum allowed value for the max verifier cut. + * @return The maximum allowed value for the max verifier cut. + */ + function _getVerifierCutRange() internal view virtual returns (uint32, uint32) { + return (_minimumVerifierCut, _maximumVerifierCut); + } + + /** + * @notice Gets a provision from the {HorizonStaking} contract. + * @dev Requirements: + * - The provision must exist. + * @param _serviceProvider The address of the service provider. + * @return The provision. + */ + function _getProvision(address _serviceProvider) internal view returns (IHorizonStaking.Provision memory) { + IHorizonStaking.Provision memory provision = _graphStaking().getProvision(_serviceProvider, address(this)); + require(provision.createdAt != 0, ProvisionManagerProvisionNotFound(_serviceProvider)); + return provision; + } + + /** + * @notice Checks if a value is within a valid range. + * @param _value The value to check. + * @param _min The minimum allowed value. + * @param _max The maximum allowed value. + * @param _revertMessage The revert message to display if the value is out of range. + */ + function _checkValueInRange(uint256 _value, uint256 _min, uint256 _max, bytes memory _revertMessage) private pure { + require(_value.isInRange(_min, _max), ProvisionManagerInvalidValue(_revertMessage, _value, _min, _max)); + } +} diff --git a/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol b/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol new file mode 100644 index 000000000..5931c66e5 --- /dev/null +++ b/packages/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +/** + * @title 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. + */ +abstract contract ProvisionManagerV1Storage { + /// @notice The minimum amount of tokens required to register a provision in the data service + uint256 internal _minimumProvisionTokens; + + /// @notice The maximum amount of tokens allowed to register a provision in the data service + uint256 internal _maximumProvisionTokens; + + /// @notice The minimum thawing period required to register a provision in the data service + uint64 internal _minimumThawingPeriod; + + /// @notice The maximum thawing period allowed to register a provision in the data service + uint64 internal _maximumThawingPeriod; + + /// @notice The minimum verifier cut required to register a provision in the data service (in PPM) + uint32 internal _minimumVerifierCut; + + /// @notice The maximum verifier cut allowed to register a provision in the data service (in PPM) + uint32 internal _maximumVerifierCut; + + /// @notice How much delegation the service provider can effectively use + /// @dev Max calculated as service provider's stake * delegationRatio + uint32 internal _delegationRatio; + + /// @dev Gap to allow adding variables in future upgrades + /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract + uint256[50] private __gap; +} diff --git a/packages/horizon/contracts/libraries/Denominations.sol b/packages/horizon/contracts/libraries/Denominations.sol new file mode 100644 index 000000000..46cff3516 --- /dev/null +++ b/packages/horizon/contracts/libraries/Denominations.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +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. + * 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. + */ +library Denominations { + /// @notice The address of the native token, i.e ETH + /// @dev This convention is taken from https://eips.ethereum.org/EIPS/eip-7528 + address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + /** + * @notice Checks if a token is the native token + * @param token The token address to check + * @return True if the token is the native token, false otherwise + */ + function isNativeToken(address token) internal pure returns (bool) { + return token == NATIVE_TOKEN; + } +} diff --git a/packages/horizon/contracts/libraries/LibFixedMath.sol b/packages/horizon/contracts/libraries/LibFixedMath.sol new file mode 100644 index 000000000..704617b40 --- /dev/null +++ b/packages/horizon/contracts/libraries/LibFixedMath.sol @@ -0,0 +1,243 @@ +/* + + Copyright 2017 Bprotocol Foundation, 2019 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity 0.8.27; + +/** + * @title LibFixedMath + * @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. + */ +library LibFixedMath { + // 1 + int256 private constant FIXED_1 = int256(0x0000000000000000000000000000000080000000000000000000000000000000); + // 2**255 + int256 private constant MIN_FIXED_VAL = type(int256).min; + // 0 + int256 private constant EXP_MAX_VAL = 0; + // -63.875 + int256 private constant EXP_MIN_VAL = -int256(0x0000000000000000000000000000001ff0000000000000000000000000000000); + + /// @dev Get one as a fixed-point number. + function one() internal pure returns (int256 f) { + f = FIXED_1; + } + + /// @dev Returns the addition of two fixed point numbers, reverting on overflow. + function sub(int256 a, int256 b) internal pure returns (int256 c) { + if (b == MIN_FIXED_VAL) { + revert("out-of-bounds"); + } + c = _add(a, -b); + } + + /// @dev Returns the multiplication of two fixed point numbers, reverting on overflow. + 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. + 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. + function uintMul(int256 f, uint256 u) internal pure returns (uint256) { + if (int256(u) < int256(0)) { + revert("out-of-bounds"); + } + int256 c = _mul(f, int256(u)); + if (c <= 0) { + return 0; + } + return uint256(uint256(c) >> 127); + } + + /// @dev Convert signed `n` / `d` to a fixed-point number. + 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. + 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 + function exp(int256 x) internal pure returns (int256 r) { + if (x < EXP_MIN_VAL) { + // Saturate to zero below EXP_MIN_VAL. + return 0; + } + if (x == 0) { + return FIXED_1; + } + if (x > EXP_MAX_VAL) { + revert("out-of-bounds"); + } + + // Rewrite the input as a product of natural exponents and a + // single residual q, where q is a number of small magnitude. + // For example: e^-34.419 = e^(-32 - 2 - 0.25 - 0.125 - 0.044) + // = e^-32 * e^-2 * e^-0.25 * e^-0.125 * e^-0.044 + // -> q = -0.044 + + // Multiply with the taylor series for e^q + int256 y; + int256 z; + // q = x % 0.125 (the residual) + z = y = x % 0x0000000000000000000000000000000010000000000000000000000000000000; + z = (z * y) / FIXED_1; + r += z * 0x10e1b3be415a0000; // add y^02 * (20! / 02!) + z = (z * y) / FIXED_1; + r += z * 0x05a0913f6b1e0000; // add y^03 * (20! / 03!) + z = (z * y) / FIXED_1; + r += z * 0x0168244fdac78000; // add y^04 * (20! / 04!) + z = (z * y) / FIXED_1; + r += z * 0x004807432bc18000; // add y^05 * (20! / 05!) + z = (z * y) / FIXED_1; + r += z * 0x000c0135dca04000; // add y^06 * (20! / 06!) + z = (z * y) / FIXED_1; + r += z * 0x0001b707b1cdc000; // add y^07 * (20! / 07!) + z = (z * y) / FIXED_1; + r += z * 0x000036e0f639b800; // add y^08 * (20! / 08!) + z = (z * y) / FIXED_1; + r += z * 0x00000618fee9f800; // add y^09 * (20! / 09!) + z = (z * y) / FIXED_1; + r += z * 0x0000009c197dcc00; // add y^10 * (20! / 10!) + z = (z * y) / FIXED_1; + r += z * 0x0000000e30dce400; // add y^11 * (20! / 11!) + z = (z * y) / FIXED_1; + r += z * 0x000000012ebd1300; // add y^12 * (20! / 12!) + z = (z * y) / FIXED_1; + r += z * 0x0000000017499f00; // add y^13 * (20! / 13!) + z = (z * y) / FIXED_1; + r += z * 0x0000000001a9d480; // add y^14 * (20! / 14!) + z = (z * y) / FIXED_1; + r += z * 0x00000000001c6380; // add y^15 * (20! / 15!) + z = (z * y) / FIXED_1; + r += z * 0x000000000001c638; // add y^16 * (20! / 16!) + z = (z * y) / FIXED_1; + r += z * 0x0000000000001ab8; // add y^17 * (20! / 17!) + z = (z * y) / FIXED_1; + r += z * 0x000000000000017c; // add y^18 * (20! / 18!) + z = (z * y) / FIXED_1; + r += z * 0x0000000000000014; // add y^19 * (20! / 19!) + z = (z * y) / FIXED_1; + r += z * 0x0000000000000001; // add y^20 * (20! / 20!) + r = r / 0x21c3677c82b40000 + y + FIXED_1; // divide by 20! and then add y^1 / 1! + y^0 / 0! + + // Multiply with the non-residual terms. + x = -x; + // e ^ -32 + if ((x & int256(0x0000000000000000000000000000001000000000000000000000000000000000)) != 0) { + r = + (r * int256(0x00000000000000000000000000000000000000f1aaddd7742e56d32fb9f99744)) / + int256(0x0000000000000000000000000043cbaf42a000812488fc5c220ad7b97bf6e99e); // * e ^ -32 + } + // e ^ -16 + if ((x & int256(0x0000000000000000000000000000000800000000000000000000000000000000)) != 0) { + r = + (r * int256(0x00000000000000000000000000000000000afe10820813d65dfe6a33c07f738f)) / + int256(0x000000000000000000000000000005d27a9f51c31b7c2f8038212a0574779991); // * e ^ -16 + } + // e ^ -8 + if ((x & int256(0x0000000000000000000000000000000400000000000000000000000000000000)) != 0) { + r = + (r * int256(0x0000000000000000000000000000000002582ab704279e8efd15e0265855c47a)) / + int256(0x0000000000000000000000000000001b4c902e273a58678d6d3bfdb93db96d02); // * e ^ -8 + } + // e ^ -4 + if ((x & int256(0x0000000000000000000000000000000200000000000000000000000000000000)) != 0) { + r = + (r * int256(0x000000000000000000000000000000001152aaa3bf81cb9fdb76eae12d029571)) / + int256(0x00000000000000000000000000000003b1cc971a9bb5b9867477440d6d157750); // * e ^ -4 + } + // e ^ -2 + if ((x & int256(0x0000000000000000000000000000000100000000000000000000000000000000)) != 0) { + r = + (r * int256(0x000000000000000000000000000000002f16ac6c59de6f8d5d6f63c1482a7c86)) / + int256(0x000000000000000000000000000000015bf0a8b1457695355fb8ac404e7a79e3); // * e ^ -2 + } + // e ^ -1 + if ((x & int256(0x0000000000000000000000000000000080000000000000000000000000000000)) != 0) { + r = + (r * int256(0x000000000000000000000000000000004da2cbf1be5827f9eb3ad1aa9866ebb3)) / + int256(0x00000000000000000000000000000000d3094c70f034de4b96ff7d5b6f99fcd8); // * e ^ -1 + } + // e ^ -0.5 + if ((x & int256(0x0000000000000000000000000000000040000000000000000000000000000000)) != 0) { + r = + (r * int256(0x0000000000000000000000000000000063afbe7ab2082ba1a0ae5e4eb1b479dc)) / + int256(0x00000000000000000000000000000000a45af1e1f40c333b3de1db4dd55f29a7); // * e ^ -0.5 + } + // e ^ -0.25 + if ((x & int256(0x0000000000000000000000000000000020000000000000000000000000000000)) != 0) { + r = + (r * int256(0x0000000000000000000000000000000070f5a893b608861e1f58934f97aea57d)) / + int256(0x00000000000000000000000000000000910b022db7ae67ce76b441c27035c6a1); // * e ^ -0.25 + } + // e ^ -0.125 + if ((x & int256(0x0000000000000000000000000000000010000000000000000000000000000000)) != 0) { + r = + (r * int256(0x00000000000000000000000000000000783eafef1c0a8f3978c7f81824d62ebf)) / + int256(0x0000000000000000000000000000000088415abbe9a76bead8d00cf112e4d4a8); // * e ^ -0.125 + } + } + + /// @dev Returns the multiplication two numbers, reverting on overflow. + function _mul(int256 a, int256 b) private pure returns (int256 c) { + if (a == 0 || b == 0) { + return 0; + } + unchecked { + c = a * b; + if (c / a != b || c / b != a) { + revert("overflow"); + } + } + } + + /// @dev Returns the division of two numbers, reverting on division by zero. + function _div(int256 a, int256 b) private pure returns (int256 c) { + if (b == 0) { + revert("overflow"); + } + if (a == MIN_FIXED_VAL && b == -1) { + revert("overflow"); + } + unchecked { + c = a / b; + } + } + + /// @dev Adds two numbers, reverting on overflow. + function _add(int256 a, int256 b) private pure returns (int256 c) { + unchecked { + c = a + b; + if ((a < 0 && b < 0 && c > a) || (a > 0 && b > 0 && c < a)) { + revert("overflow"); + } + } + } +} diff --git a/packages/horizon/contracts/libraries/LinkedList.sol b/packages/horizon/contracts/libraries/LinkedList.sol new file mode 100644 index 000000000..9d3305329 --- /dev/null +++ b/packages/horizon/contracts/libraries/LinkedList.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +/** + * @title LinkedList library + * @notice A library to manage singly linked lists. + * + * The library makes no assumptions about the contents of the items, the only + * requirements on the items are: + * - they must be represented by a unique bytes32 id + * - the id of the item must not be bytes32(0) + * - each item must have a reference to the next item in the list + * - the list cannot have more than `MAX_ITEMS` items + * + * A contract using this library must store: + * - a LinkedList.List to keep track of the list metadata + * - a mapping from bytes32 to the item data + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +library LinkedList { + using LinkedList for ILinkedList.List; + + /// @notice Empty bytes constant + bytes internal constant NULL_BYTES = bytes(""); + + /// @notice Maximum amount of items allowed in the list + uint256 internal constant MAX_ITEMS = 10_000; + + /** + * @notice Adds an item to the list. + * The item is added to the end of the list. + * @dev Note that this function will not take care of linking the + * old tail to the new item. The caller should take care of this. + * It will also not ensure id uniqueness. + * @dev There is a maximum number of elements that can be added to the list. + * @param self The list metadata + * @param id The id of the item to add + */ + function addTail(ILinkedList.List storage self, bytes32 id) internal { + require(self.count < MAX_ITEMS, ILinkedList.LinkedListMaxElementsExceeded()); + require(id != bytes32(0), ILinkedList.LinkedListInvalidZeroId()); + self.tail = id; + self.nonce += 1; + if (self.count == 0) self.head = id; + self.count += 1; + } + + /** + * @notice Removes an item from the list. + * The item is removed from the beginning of the list. + * @param self The list metadata + * @param getNextItem A function to get the next item in the list. It should take + * the id of the current item and return the id of the next item. + * @param deleteItem A function to delete an item. This should delete the item from + * the contract storage. It takes the id of the item to delete. + * @return The id of the head of the list. + */ + function removeHead( + ILinkedList.List storage self, + function(bytes32) view returns (bytes32) getNextItem, + function(bytes32) deleteItem + ) internal returns (bytes32) { + require(self.count > 0, ILinkedList.LinkedListEmptyList()); + bytes32 nextItem = getNextItem(self.head); + deleteItem(self.head); + self.count -= 1; + self.head = nextItem; + if (self.count == 0) self.tail = bytes32(0); + return self.head; + } + + /** + * @notice Traverses the list and processes each item. + * It deletes the processed items from both the list and the storage mapping. + * @param self The list metadata + * @param getNextItem A function to get the next item in the list. It should take + * the id of the current item and return the id of the next item. + * @param processItem A function to process an item. The function should take the id of the item + * and an accumulator, and return: + * - a boolean indicating whether the traversal should stop + * - an accumulator to pass data between iterations + * @param deleteItem A function to delete an item. This should delete the item from + * the contract storage. It takes the id of the item to delete. + * @param processInitAcc The initial accumulator data + * @param iterations The maximum number of iterations to perform. If 0, the traversal will continue + * until the end of the list. + * @return The number of items processed + * @return The final accumulator data. + */ + function traverse( + ILinkedList.List storage self, + function(bytes32) view returns (bytes32) getNextItem, + function(bytes32, bytes memory) returns (bool, bytes memory) processItem, + function(bytes32) deleteItem, + bytes memory processInitAcc, + uint256 iterations + ) internal returns (uint256, bytes memory) { + require(iterations <= self.count, ILinkedList.LinkedListInvalidIterations()); + + uint256 itemCount = 0; + iterations = (iterations == 0) ? self.count : iterations; + + bytes32 cursor = self.head; + + while (cursor != bytes32(0) && iterations > 0) { + (bool shouldBreak, bytes memory acc_) = processItem(cursor, processInitAcc); + + if (shouldBreak) break; + + processInitAcc = acc_; + cursor = self.removeHead(getNextItem, deleteItem); + + iterations--; + itemCount++; + } + + return (itemCount, processInitAcc); + } +} diff --git a/packages/horizon/contracts/libraries/MathUtils.sol b/packages/horizon/contracts/libraries/MathUtils.sol new file mode 100644 index 000000000..fc81e9608 --- /dev/null +++ b/packages/horizon/contracts/libraries/MathUtils.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +/** + * @title MathUtils Library + * @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 + * 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 + */ + function weightedAverageRoundingUp( + uint256 valueA, + uint256 weightA, + uint256 valueB, + uint256 weightB + ) internal pure returns (uint256) { + return ((valueA * weightA) + (valueB * weightB) + (weightA + weightB - 1)) / (weightA + weightB); + } + + /** + * @dev Returns the minimum of two numbers. + * @param x The first number + * @param y The second number + * @return The minimum 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. + * @param x The first number + * @param y The second number + * @return The difference between the two numbers or zero if negative + */ + function diffOrZero(uint256 x, uint256 y) internal pure returns (uint256) { + return (x > y) ? x - y : 0; + } +} diff --git a/packages/horizon/contracts/libraries/PPMMath.sol b/packages/horizon/contracts/libraries/PPMMath.sol new file mode 100644 index 000000000..a7966c91d --- /dev/null +++ b/packages/horizon/contracts/libraries/PPMMath.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +/** + * @title PPMMath library + * @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. + */ +library PPMMath { + /// @notice Maximum value (100%) in parts per million (PPM). + uint256 internal constant MAX_PPM = 1_000_000; + + /** + * @notice Thrown when a value is expected to be in PPM but is not. + * @param value The value that is not in PPM. + */ + error PPMMathInvalidPPM(uint256 value); + + /** + * @notice Thrown when no value in a multiplication is in PPM. + * @param a The first value in the multiplication. + * @param b The second value in the multiplication. + */ + error PPMMathInvalidMulPPM(uint256 a, uint256 b); + + /** + * @notice Multiplies two values, one of which must be in PPM. + * @param a The first value. + * @param b The second value. + * @return The result of the multiplication. + */ + function mulPPM(uint256 a, uint256 b) internal pure returns (uint256) { + require(isValidPPM(a) || isValidPPM(b), PPMMathInvalidMulPPM(a, b)); + return (a * b) / MAX_PPM; + } + + /** + * @notice Multiplies two values, the second one must be in PPM, and rounds up the result. + * @dev requirements: + * - The second value must be in PPM. + * @param a The first value. + * @param b The second value. + * @return The result of the multiplication. + */ + function mulPPMRoundUp(uint256 a, uint256 b) internal pure returns (uint256) { + require(isValidPPM(b), PPMMathInvalidPPM(b)); + return a - mulPPM(a, MAX_PPM - b); + } + + /** + * @notice Checks if a value is in PPM. + * @dev A valid PPM value is between 0 and MAX_PPM. + * @param value The value to check. + * @return true if the value is in PPM, false otherwise. + */ + function isValidPPM(uint256 value) internal pure returns (bool) { + return value <= MAX_PPM; + } +} diff --git a/packages/horizon/contracts/libraries/UintRange.sol b/packages/horizon/contracts/libraries/UintRange.sol new file mode 100644 index 000000000..69d3f5d8a --- /dev/null +++ b/packages/horizon/contracts/libraries/UintRange.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +/** + * @title UintRange library + * @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. + */ +library UintRange { + /** + * @notice Checks if a value is in the range [`min`, `max`]. + * @param value The value to check. + * @param min The minimum value of the range. + * @param max The maximum value of the range. + * @return true if the value is in the range, false otherwise. + */ + function isInRange(uint256 value, uint256 min, uint256 max) internal pure returns (bool) { + return value >= min && value <= max; + } +} diff --git a/packages/horizon/contracts/mocks/ControllerMock.sol b/packages/horizon/contracts/mocks/ControllerMock.sol new file mode 100644 index 000000000..638387f0c --- /dev/null +++ b/packages/horizon/contracts/mocks/ControllerMock.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IController } from "@graphprotocol/interfaces/contracts/contracts/governance/IController.sol"; +import { IManaged } from "@graphprotocol/interfaces/contracts/contracts/governance/IManaged.sol"; + +/** + * @title Graph Controller contract (mock) + * @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; + 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); + + /** + * Constructor for the Controller mock + * @param governor_ Address of the governor + */ + constructor(address governor_) { + governor = governor_; + } + + // -- 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 override { + require(contractAddress != address(0), "Contract address must be set"); + _registry[id] = contractAddress; + emit SetContractProxy(id, contractAddress); + } + + /** + * @notice Unregister a contract address + * @param id Contract id (keccak256 hash of contract name) + */ + function unsetContractProxy(bytes32 id) external override { + _registry[id] = address(0); + emit SetContractProxy(id, address(0)); + } + + /** + * @notice Update a contract's controller + * @param id Contract id (keccak256 hash of contract name) + * @param controller New Controller address + */ + function updateController(bytes32 id, address controller) external override { + require(controller != address(0), "Controller must be set"); + return IManaged(_registry[id]).setController(controller); + } + + // -- Pausing -- + + /** + * @notice Change the partial paused state of the contract + * Partial pause is intended as a partial pause of the protocol + * @param toPause True if the contracts should be (partially) paused, false otherwise + */ + function setPartialPaused(bool toPause) external override { + _partialPaused = toPause; + } + + /** + * @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 + */ + function setPaused(bool toPause) external override { + _paused = toPause; + } + + /** + * @notice Change the Pause Guardian + * @param newPauseGuardian The address of the new Pause Guardian + */ + function setPauseGuardian(address newPauseGuardian) external override { + require(newPauseGuardian != address(0), "PauseGuardian must be set"); + _pauseGuardian = newPauseGuardian; + } + + /** + * @notice Getter to access governor + * @return Address of the governor + */ + function getGovernor() external view override returns (address) { + return governor; + } + + /** + * @notice Get contract proxy address by its id + * @param id Contract id (keccak256 hash of contract name) + * @return Address of the proxy contract for the provided id + */ + function getContractProxy(bytes32 id) external view virtual override returns (address) { + return _registry[id]; + } + + /** + * @notice Getter to access paused + * @return True if the contracts are paused, false otherwise + */ + 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 + */ + function partialPaused() external view override returns (bool) { + return _partialPaused; + } +} diff --git a/packages/horizon/contracts/mocks/CurationMock.sol b/packages/horizon/contracts/mocks/CurationMock.sol new file mode 100644 index 000000000..ea3df0587 --- /dev/null +++ b/packages/horizon/contracts/mocks/CurationMock.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +contract CurationMock { + mapping(bytes32 subgraphDeploymentID => uint256 tokens) public curation; + + function signal(bytes32 subgraphDeploymentID, uint256 tokens) public { + curation[subgraphDeploymentID] += tokens; + } + + function isCurated(bytes32 subgraphDeploymentID) public view returns (bool) { + return curation[subgraphDeploymentID] != 0; + } + + 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 new file mode 100644 index 000000000..e6a575d0f --- /dev/null +++ b/packages/horizon/contracts/mocks/Dummy.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +contract Dummy {} diff --git a/packages/horizon/contracts/mocks/EpochManagerMock.sol b/packages/horizon/contracts/mocks/EpochManagerMock.sol new file mode 100644 index 000000000..4c00fb29c --- /dev/null +++ b/packages/horizon/contracts/mocks/EpochManagerMock.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IEpochManager } from "@graphprotocol/interfaces/contracts/contracts/epochs/IEpochManager.sol"; + +contract EpochManagerMock is IEpochManager { + // -- Variables -- + + uint256 public epochLength; + uint256 public lastRunEpoch; + uint256 public lastLengthUpdateEpoch; + uint256 public lastLengthUpdateBlock; + + // -- Configuration -- + + function setEpochLength(uint256 epochLength_) public { + lastLengthUpdateEpoch = 1; + lastLengthUpdateBlock = blockNum(); + epochLength = epochLength_; + } + + // -- Epochs + + function runEpoch() public { + lastRunEpoch = currentEpoch(); + } + + // -- Getters -- + + function isCurrentEpochRun() public view returns (bool) { + return lastRunEpoch == currentEpoch(); + } + + function blockNum() public view returns (uint256) { + return block.number; + } + + function blockHash(uint256 block_) public view returns (bytes32) { + return blockhash(block_); + } + + function currentEpoch() public view returns (uint256) { + return lastLengthUpdateEpoch + epochsSinceUpdate(); + } + + function currentEpochBlock() public view returns (uint256) { + return lastLengthUpdateBlock + (epochsSinceUpdate() * epochLength); + } + + function currentEpochBlockSinceStart() public view returns (uint256) { + return blockNum() - currentEpochBlock(); + } + + function epochsSince(uint256 epoch_) public view returns (uint256) { + uint256 epoch = currentEpoch(); + return epoch_ < epoch ? (epoch - epoch_) : 0; + } + + 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 new file mode 100644 index 000000000..235999ae5 --- /dev/null +++ b/packages/horizon/contracts/mocks/MockGRTToken.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; + +contract MockGRTToken is ERC20, IGraphToken { + constructor() ERC20("Graph Token", "GRT") {} + + function burn(uint256 tokens) external { + _burn(msg.sender, tokens); + } + + function burnFrom(address from, uint256 tokens) external { + _burn(from, tokens); + } + + // -- Mint Admin -- + + function addMinter(address account) external {} + + function removeMinter(address account) external {} + + function renounceMinter() external {} + + // -- Permit -- + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external {} + + // -- Allowance -- + + function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {} + + function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {} + + function isMinter(address account) external view returns (bool) {} + + 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 new file mode 100644 index 000000000..300e7efe2 --- /dev/null +++ b/packages/horizon/contracts/mocks/RewardsManagerMock.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { MockGRTToken } from "./MockGRTToken.sol"; + +contract RewardsManagerMock { + // -- Variables -- + MockGRTToken public token; + uint256 private _rewards; + + // -- Constructor -- + + constructor(MockGRTToken token_, uint256 rewards) { + token = token_; + _rewards = rewards; + } + + function takeRewards(address) external returns (uint256) { + token.mint(msg.sender, _rewards); + return _rewards; + } + + function onSubgraphAllocationUpdate(bytes32) public returns (uint256) {} + function onSubgraphSignalUpdate(bytes32 subgraphDeploymentID) external returns (uint256) {} +} diff --git a/packages/horizon/contracts/mocks/imports.sol b/packages/horizon/contracts/mocks/imports.sol new file mode 100644 index 000000000..3a05b2b4d --- /dev/null +++ b/packages/horizon/contracts/mocks/imports.sol @@ -0,0 +1,9 @@ +// solhint-disable no-global-import + +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.7.6 || 0.8.27; + +// We import these here to force Hardhat to compile them. +// This ensures that their artifacts are available for Hardhat Ignition to use. +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; diff --git a/packages/horizon/contracts/payments/GraphPayments.sol b/packages/horizon/contracts/payments/GraphPayments.sol new file mode 100644 index 000000000..e82758b0e --- /dev/null +++ b/packages/horizon/contracts/payments/GraphPayments.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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"; + +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { MulticallUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol"; +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; +import { PPMMath } from "../libraries/PPMMath.sol"; + +import { GraphDirectory } from "../utilities/GraphDirectory.sol"; + +/** + * @title GraphPayments contract + * @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. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract GraphPayments is Initializable, MulticallUpgradeable, GraphDirectory, IGraphPayments { + using TokenUtils for IGraphToken; + using PPMMath for uint256; + + /// @notice Protocol payment cut in PPM + uint256 public immutable PROTOCOL_PAYMENT_CUT; + + /** + * @notice Constructor for the {GraphPayments} contract + * @dev This contract is upgradeable however we still use the constructor to set + * a few immutable variables. + * @param controller The address of the Graph controller + * @param protocolPaymentCut The protocol tax in PPM + */ + constructor(address controller, uint256 protocolPaymentCut) GraphDirectory(controller) { + require(PPMMath.isValidPPM(protocolPaymentCut), GraphPaymentsInvalidCut(protocolPaymentCut)); + PROTOCOL_PAYMENT_CUT = protocolPaymentCut; + _disableInitializers(); + } + + /// @inheritdoc IGraphPayments + function initialize() external initializer { + __Multicall_init(); + } + + /// @inheritdoc IGraphPayments + function collect( + IGraphPayments.PaymentTypes paymentType, + address receiver, + uint256 tokens, + address dataService, + uint256 dataServiceCut, + address receiverDestination + ) external { + require(PPMMath.isValidPPM(dataServiceCut), GraphPaymentsInvalidCut(dataServiceCut)); + + // Pull tokens from the sender + _graphToken().pullTokens(msg.sender, tokens); + + // Calculate token amounts for each party + // Order matters: protocol -> data service -> delegators -> receiver + // Note the substractions should not underflow as we are only deducting a percentage of the remainder + uint256 tokensRemaining = tokens; + + uint256 tokensProtocol = tokensRemaining.mulPPMRoundUp(PROTOCOL_PAYMENT_CUT); + tokensRemaining = tokensRemaining - tokensProtocol; + + uint256 tokensDataService = tokensRemaining.mulPPMRoundUp(dataServiceCut); + tokensRemaining = tokensRemaining - tokensDataService; + + uint256 tokensDelegationPool = 0; + IHorizonStakingTypes.DelegationPool memory pool = _graphStaking().getDelegationPool(receiver, dataService); + if (pool.shares > 0) { + tokensDelegationPool = tokensRemaining.mulPPMRoundUp( + _graphStaking().getDelegationFeeCut(receiver, dataService, paymentType) + ); + tokensRemaining = tokensRemaining - tokensDelegationPool; + } + + // Pay all parties + _graphToken().burnTokens(tokensProtocol); + + _graphToken().pushTokens(dataService, tokensDataService); + + if (tokensDelegationPool > 0) { + _graphToken().approve(address(_graphStaking()), tokensDelegationPool); + _graphStaking().addToDelegationPool(receiver, dataService, tokensDelegationPool); + } + + if (tokensRemaining > 0) { + if (receiverDestination == address(0)) { + _graphToken().approve(address(_graphStaking()), tokensRemaining); + _graphStaking().stakeTo(receiver, tokensRemaining); + } else { + _graphToken().pushTokens(receiverDestination, tokensRemaining); + } + } + + emit GraphPaymentCollected( + paymentType, + msg.sender, + receiver, + dataService, + tokens, + tokensProtocol, + tokensDataService, + tokensDelegationPool, + tokensRemaining, + receiverDestination + ); + } +} diff --git a/packages/horizon/contracts/payments/PaymentsEscrow.sol b/packages/horizon/contracts/payments/PaymentsEscrow.sol new file mode 100644 index 000000000..bcced0412 --- /dev/null +++ b/packages/horizon/contracts/payments/PaymentsEscrow.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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"; + +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { MulticallUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol"; +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; + +import { GraphDirectory } from "../utilities/GraphDirectory.sol"; + +/** + * @title PaymentsEscrow contract + * @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 + * via a Graph Horizon data service. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract PaymentsEscrow is Initializable, MulticallUpgradeable, GraphDirectory, IPaymentsEscrow { + using TokenUtils for IGraphToken; + + /// @notice The maximum thawing period (in seconds) for both escrow withdrawal and collector revocation + /// @dev This is a precautionary measure to avoid inadvertedly locking funds for too long + uint256 public constant MAX_WAIT_PERIOD = 90 days; + + /// @notice Thawing period in seconds for escrow funds withdrawal + uint256 public immutable WITHDRAW_ESCROW_THAWING_PERIOD; + + /// @notice Escrow account details for payer-collector-receiver tuples + mapping(address payer => mapping(address collector => mapping(address receiver => IPaymentsEscrow.EscrowAccount escrowAccount))) + public escrowAccounts; + + /** + * @notice Modifier to prevent function execution when contract is paused + * @dev Reverts if the controller indicates the contract is paused + */ + modifier notPaused() { + require(!_graphController().paused(), PaymentsEscrowIsPaused()); + _; + } + + /** + * @notice Construct the PaymentsEscrow contract + * @param controller The address of the controller + * @param withdrawEscrowThawingPeriod Thawing period in seconds for escrow funds withdrawal + */ + constructor(address controller, uint256 withdrawEscrowThawingPeriod) GraphDirectory(controller) { + require( + withdrawEscrowThawingPeriod <= MAX_WAIT_PERIOD, + PaymentsEscrowThawingPeriodTooLong(withdrawEscrowThawingPeriod, MAX_WAIT_PERIOD) + ); + + WITHDRAW_ESCROW_THAWING_PERIOD = withdrawEscrowThawingPeriod; + _disableInitializers(); + } + + /// @inheritdoc IPaymentsEscrow + function initialize() external initializer { + __Multicall_init(); + } + + /// @inheritdoc IPaymentsEscrow + function deposit(address collector, address receiver, uint256 tokens) external override notPaused { + _deposit(msg.sender, collector, receiver, tokens); + } + + /// @inheritdoc IPaymentsEscrow + function depositTo(address payer, address collector, address receiver, uint256 tokens) external override notPaused { + _deposit(payer, collector, receiver, tokens); + } + + /// @inheritdoc IPaymentsEscrow + function thaw(address collector, address receiver, uint256 tokens) external override notPaused { + require(tokens > 0, PaymentsEscrowInvalidZeroTokens()); + + EscrowAccount storage account = escrowAccounts[msg.sender][collector][receiver]; + require(account.balance >= tokens, PaymentsEscrowInsufficientBalance(account.balance, tokens)); + + account.tokensThawing = tokens; + account.thawEndTimestamp = block.timestamp + WITHDRAW_ESCROW_THAWING_PERIOD; + + emit Thaw(msg.sender, collector, receiver, tokens, account.thawEndTimestamp); + } + + /// @inheritdoc IPaymentsEscrow + function cancelThaw(address collector, address receiver) external override notPaused { + EscrowAccount storage account = escrowAccounts[msg.sender][collector][receiver]; + require(account.tokensThawing != 0, PaymentsEscrowNotThawing()); + + uint256 tokensThawing = account.tokensThawing; + uint256 thawEndTimestamp = account.thawEndTimestamp; + account.tokensThawing = 0; + account.thawEndTimestamp = 0; + + emit CancelThaw(msg.sender, collector, receiver, tokensThawing, thawEndTimestamp); + } + + /// @inheritdoc IPaymentsEscrow + function withdraw(address collector, address receiver) external override notPaused { + EscrowAccount storage account = escrowAccounts[msg.sender][collector][receiver]; + require(account.thawEndTimestamp != 0, PaymentsEscrowNotThawing()); + require( + account.thawEndTimestamp < block.timestamp, + PaymentsEscrowStillThawing(block.timestamp, account.thawEndTimestamp) + ); + + // Amount is the minimum between the amount being thawed and the actual balance + uint256 tokens = account.tokensThawing > account.balance ? account.balance : account.tokensThawing; + + account.balance -= tokens; + account.tokensThawing = 0; + account.thawEndTimestamp = 0; + _graphToken().pushTokens(msg.sender, tokens); + emit Withdraw(msg.sender, collector, receiver, tokens); + } + + /// @inheritdoc IPaymentsEscrow + function collect( + IGraphPayments.PaymentTypes paymentType, + address payer, + address receiver, + uint256 tokens, + address dataService, + uint256 dataServiceCut, + address receiverDestination + ) external override notPaused { + // Check if there are enough funds in the escrow account + EscrowAccount storage account = escrowAccounts[payer][msg.sender][receiver]; + require(account.balance >= tokens, PaymentsEscrowInsufficientBalance(account.balance, tokens)); + + // Reduce amount from account balance + account.balance -= tokens; + + uint256 escrowBalanceBefore = _graphToken().balanceOf(address(this)); + + _graphToken().approve(address(_graphPayments()), tokens); + _graphPayments().collect(paymentType, receiver, tokens, dataService, dataServiceCut, receiverDestination); + + // Verify that the escrow balance is consistent with the collected tokens + uint256 escrowBalanceAfter = _graphToken().balanceOf(address(this)); + require( + escrowBalanceBefore == tokens + escrowBalanceAfter, + PaymentsEscrowInconsistentCollection(escrowBalanceBefore, escrowBalanceAfter, tokens) + ); + + emit EscrowCollected(paymentType, payer, msg.sender, receiver, tokens, receiverDestination); + } + + /// @inheritdoc IPaymentsEscrow + function getBalance(address payer, address collector, address receiver) external view override returns (uint256) { + EscrowAccount storage account = escrowAccounts[payer][collector][receiver]; + return account.balance > account.tokensThawing ? account.balance - account.tokensThawing : 0; + } + + /** + * @notice Deposits funds into the escrow for a payer-collector-receiver tuple, where + * the payer is the transaction caller. + * @param _payer The address of the payer + * @param _collector The address of the collector + * @param _receiver The address of the receiver + * @param _tokens The amount of tokens to deposit + */ + function _deposit(address _payer, address _collector, address _receiver, uint256 _tokens) private { + escrowAccounts[_payer][_collector][_receiver].balance += _tokens; + _graphToken().pullTokens(msg.sender, _tokens); + emit Deposit(_payer, _collector, _receiver, _tokens); + } +} diff --git a/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol b/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol new file mode 100644 index 000000000..0ede499e0 --- /dev/null +++ b/packages/horizon/contracts/payments/collectors/GraphTallyCollector.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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"; + +import { Authorizable } from "../../utilities/Authorizable.sol"; +import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import { PPMMath } from "../../libraries/PPMMath.sol"; + +import { GraphDirectory } from "../../utilities/GraphDirectory.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +/** + * @title GraphTallyCollector contract + * @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 + * (data service-payer-receiver) tuple should have a value greater than the previous one. The contract will keep track of the tokens + * already collected and calculate the difference to collect. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract GraphTallyCollector is EIP712, GraphDirectory, Authorizable, IGraphTallyCollector { + using PPMMath for uint256; + + /// @notice The EIP712 typehash for the ReceiptAggregateVoucher struct + bytes32 private constant EIP712_RAV_TYPEHASH = + keccak256( + "ReceiptAggregateVoucher(bytes32 collectionId,address payer,address serviceProvider,address dataService,uint64 timestampNs,uint128 valueAggregate,bytes metadata)" + ); + + /// @notice Tracks the amount of tokens already collected by a data service from a payer to a receiver. + /// @dev The collectionId provides a secondary key for grouping payment tracking if needed. Data services that do not require + /// grouping can use the same collectionId for all payments (0x00 or some other default value). + mapping(address dataService => mapping(bytes32 collectionId => mapping(address receiver => mapping(address payer => uint256 tokens)))) + public tokensCollected; + + /** + * @notice Constructs a new instance of the GraphTallyCollector contract. + * @param eip712Name The name of the EIP712 domain. + * @param eip712Version The version of the EIP712 domain. + * @param controller The address of the Graph controller. + * @param revokeSignerThawingPeriod The duration (in seconds) in which a signer is thawing before they can be revoked. + */ + constructor( + string memory eip712Name, + string memory eip712Version, + address controller, + uint256 revokeSignerThawingPeriod + ) EIP712(eip712Name, eip712Version) GraphDirectory(controller) Authorizable(revokeSignerThawingPeriod) {} + + /** + * @notice See {IGraphPayments.collect}. + * @dev Requirements: + * - Caller must be the data service the RAV was issued to. + * - Signer of the RAV must be authorized to sign for the payer. + * - Service provider must have an active provision with the data service to collect payments. + * @notice REVERT: This function may revert if ECDSA.recover fails, check ECDSA library for details. + * @param paymentType The payment type to collect + * @param data Additional data required for the payment collection. Encoded as follows: + * - SignedRAV `signedRAV`: The signed RAV + * - uint256 `dataServiceCut`: The data service cut in PPM + * - address `receiverDestination`: The address where the receiver's payment should be sent. + * @return The amount of tokens collected + */ + /// @inheritdoc IPaymentsCollector + function collect(IGraphPayments.PaymentTypes paymentType, bytes calldata data) external override returns (uint256) { + return _collect(paymentType, data, 0); + } + + /// @inheritdoc IGraphTallyCollector + function collect( + IGraphPayments.PaymentTypes paymentType, + bytes calldata data, + uint256 tokensToCollect + ) external override returns (uint256) { + return _collect(paymentType, data, tokensToCollect); + } + + /// @inheritdoc IGraphTallyCollector + function recoverRAVSigner(SignedRAV calldata signedRAV) external view override returns (address) { + return _recoverRAVSigner(signedRAV); + } + + /// @inheritdoc IGraphTallyCollector + function encodeRAV(ReceiptAggregateVoucher calldata rav) external view returns (bytes32) { + return _encodeRAV(rav); + } + + /** + * @notice See {IPaymentsCollector.collect} + * This variant adds the ability to partially collect a RAV by specifying the amount of tokens to collect. + * @param _paymentType The payment type to collect + * @param _data Additional data required for the payment collection + * @param _tokensToCollect The amount of tokens to collect. If 0, all tokens from the RAV will be collected. + * @return The amount of tokens collected + */ + function _collect( + IGraphPayments.PaymentTypes _paymentType, + bytes calldata _data, + uint256 _tokensToCollect + ) private returns (uint256) { + (SignedRAV memory signedRAV, uint256 dataServiceCut, address receiverDestination) = abi.decode( + _data, + (SignedRAV, uint256, address) + ); + + // Ensure caller is the RAV data service + require( + signedRAV.rav.dataService == msg.sender, + GraphTallyCollectorCallerNotDataService(msg.sender, signedRAV.rav.dataService) + ); + + // Ensure RAV signer is authorized for the payer + _requireAuthorizedSigner(signedRAV); + + bytes32 collectionId = signedRAV.rav.collectionId; + address dataService = signedRAV.rav.dataService; + address receiver = signedRAV.rav.serviceProvider; + + // Check the service provider has an active provision with the data service + // This prevents an attack where the payer can deny the service provider from collecting payments + // by using a signer as data service to syphon off the tokens in the escrow to an account they control + { + uint256 tokensAvailable = _graphStaking().getProviderTokensAvailable( + signedRAV.rav.serviceProvider, + signedRAV.rav.dataService + ); + require(tokensAvailable > 0, GraphTallyCollectorUnauthorizedDataService(signedRAV.rav.dataService)); + } + + uint256 tokensToCollect = 0; + { + uint256 tokensRAV = signedRAV.rav.valueAggregate; + uint256 tokensAlreadyCollected = tokensCollected[dataService][collectionId][receiver][signedRAV.rav.payer]; + require( + tokensRAV > tokensAlreadyCollected, + GraphTallyCollectorInconsistentRAVTokens(tokensRAV, tokensAlreadyCollected) + ); + + if (_tokensToCollect == 0) { + tokensToCollect = tokensRAV - tokensAlreadyCollected; + } else { + require( + _tokensToCollect <= tokensRAV - tokensAlreadyCollected, + GraphTallyCollectorInvalidTokensToCollectAmount( + _tokensToCollect, + tokensRAV - tokensAlreadyCollected + ) + ); + tokensToCollect = _tokensToCollect; + } + } + + if (tokensToCollect > 0) { + tokensCollected[dataService][collectionId][receiver][signedRAV.rav.payer] += tokensToCollect; + _graphPaymentsEscrow().collect( + _paymentType, + signedRAV.rav.payer, + receiver, + tokensToCollect, + dataService, + dataServiceCut, + receiverDestination + ); + } + + emit PaymentCollected(_paymentType, collectionId, signedRAV.rav.payer, receiver, dataService, tokensToCollect); + + // This event is emitted to allow reconstructing RAV history with onchain data. + emit RAVCollected( + collectionId, + signedRAV.rav.payer, + receiver, + dataService, + signedRAV.rav.timestampNs, + signedRAV.rav.valueAggregate, + signedRAV.rav.metadata, + signedRAV.signature + ); + + return tokensToCollect; + } + + /** + * @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. + */ + function _recoverRAVSigner(SignedRAV memory _signedRAV) private view returns (address) { + bytes32 messageHash = _encodeRAV(_signedRAV.rav); + return ECDSA.recover(messageHash, _signedRAV.signature); + } + + /** + * @dev 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 + _hashTypedDataV4( + keccak256( + abi.encode( + EIP712_RAV_TYPEHASH, + _rav.collectionId, + _rav.payer, + _rav.serviceProvider, + _rav.dataService, + _rav.timestampNs, + _rav.valueAggregate, + keccak256(_rav.metadata) + ) + ) + ); + } + + /** + * @notice Reverts if the RAV signer is not authorized by the payer + * @param _signedRAV The signed RAV + */ + function _requireAuthorizedSigner(SignedRAV memory _signedRAV) private view { + require( + _isAuthorized(_signedRAV.rav.payer, _recoverRAVSigner(_signedRAV)), + GraphTallyCollectorInvalidRAVSigner() + ); + } +} diff --git a/packages/horizon/contracts/staking/HorizonStaking.sol b/packages/horizon/contracts/staking/HorizonStaking.sol new file mode 100644 index 000000000..ff675fdd6 --- /dev/null +++ b/packages/horizon/contracts/staking/HorizonStaking.sol @@ -0,0 +1,1260 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; +import { MathUtils } from "../libraries/MathUtils.sol"; +import { PPMMath } from "../libraries/PPMMath.sol"; +import { LinkedList } from "../libraries/LinkedList.sol"; + +import { HorizonStakingBase } from "./HorizonStakingBase.sol"; + +/** + * @title HorizonStaking contract + * @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. + * @dev This is the main Staking contract in The Graph protocol after the Horizon upgrade. + * It is designed to be deployed as an upgrade to the L2Staking contract from the legacy contracts package. + * @dev It uses a {HorizonStakingExtension} contract to implement the full {IHorizonStaking} interface through delegatecalls. + * This is due to the contract size limit on Arbitrum (24kB). The extension contract implements functionality to support + * the legacy staking functions. It can be eventually removed without affecting the main staking contract. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain { + using TokenUtils for IGraphToken; + using PPMMath for uint256; + using LinkedList for ILinkedList.List; + + /// @dev Maximum number of simultaneous stake thaw requests (per provision) or undelegations (per delegation) + uint256 private constant MAX_THAW_REQUESTS = 1_000; + + /// @dev Address of the staking extension contract + address private immutable STAKING_EXTENSION_ADDRESS; + + /// @dev Minimum amount of delegation. + uint256 private constant MIN_DELEGATION = 1e18; + + /** + * @notice Checks that the caller is authorized to operate over a provision. + * @param serviceProvider The address of the service provider. + * @param verifier The address of the verifier. + */ + modifier onlyAuthorized(address serviceProvider, address verifier) { + require( + _isAuthorized(serviceProvider, verifier, msg.sender), + HorizonStakingNotAuthorized(serviceProvider, verifier, msg.sender) + ); + _; + } + + /** + * @notice Checks that the caller is authorized to operate over a provision or it is the verifier. + * @param serviceProvider The address of the service provider. + * @param verifier The address of the verifier. + */ + modifier onlyAuthorizedOrVerifier(address serviceProvider, address verifier) { + require( + _isAuthorized(serviceProvider, verifier, msg.sender) || msg.sender == verifier, + HorizonStakingNotAuthorized(serviceProvider, verifier, msg.sender) + ); + _; + } + + /** + * @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. + */ + constructor( + address controller, + address stakingExtensionAddress, + address subgraphDataServiceAddress + ) HorizonStakingBase(controller, subgraphDataServiceAddress) { + STAKING_EXTENSION_ADDRESS = stakingExtensionAddress; + } + + /** + * @notice Delegates the current call to the StakingExtension implementation. + * @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 { + address extensionImpl = STAKING_EXTENSION_ADDRESS; + // solhint-disable-next-line no-inline-assembly + assembly { + // (a) get free memory pointer + let ptr := mload(0x40) + + // (1) copy incoming call data + calldatacopy(ptr, 0, calldatasize()) + + // (2) forward call to logic contract + let result := delegatecall(gas(), extensionImpl, ptr, calldatasize(), 0, 0) + let size := returndatasize() + + // (3) retrieve return data + returndatacopy(ptr, 0, size) + + // (4) forward return data back to caller + switch result + case 0 { + revert(ptr, size) + } + default { + return(ptr, size) + } + } + } + + /* + * STAKING + */ + + /// @inheritdoc IHorizonStakingMain + function stake(uint256 tokens) external override notPaused { + _stakeTo(msg.sender, tokens); + } + + /// @inheritdoc IHorizonStakingMain + function stakeTo(address serviceProvider, uint256 tokens) external override notPaused { + _stakeTo(serviceProvider, tokens); + } + + /// @inheritdoc IHorizonStakingMain + function stakeToProvision( + address serviceProvider, + address verifier, + uint256 tokens + ) external override notPaused onlyAuthorizedOrVerifier(serviceProvider, verifier) { + _stakeTo(serviceProvider, tokens); + _addToProvision(serviceProvider, verifier, tokens); + } + + /// @inheritdoc IHorizonStakingMain + function unstake(uint256 tokens) external override notPaused { + _unstake(tokens); + } + + /// @inheritdoc IHorizonStakingMain + function withdraw() external override notPaused { + _withdraw(msg.sender); + } + + /* + * PROVISIONS + */ + + /// @inheritdoc IHorizonStakingMain + function provision( + address serviceProvider, + address verifier, + uint256 tokens, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) external override notPaused onlyAuthorized(serviceProvider, verifier) { + _createProvision(serviceProvider, tokens, verifier, maxVerifierCut, thawingPeriod); + } + + /// @inheritdoc IHorizonStakingMain + function addToProvision( + address serviceProvider, + address verifier, + uint256 tokens + ) external override notPaused onlyAuthorized(serviceProvider, verifier) { + _addToProvision(serviceProvider, verifier, tokens); + } + + /// @inheritdoc IHorizonStakingMain + function thaw( + address serviceProvider, + address verifier, + uint256 tokens + ) external override notPaused onlyAuthorized(serviceProvider, verifier) returns (bytes32) { + return _thaw(serviceProvider, verifier, tokens); + } + + /// @inheritdoc IHorizonStakingMain + function deprovision( + address serviceProvider, + address verifier, + uint256 nThawRequests + ) external override onlyAuthorized(serviceProvider, verifier) notPaused { + _deprovision(serviceProvider, verifier, nThawRequests); + } + + /// @inheritdoc IHorizonStakingMain + function reprovision( + address serviceProvider, + address oldVerifier, + address newVerifier, + uint256 nThawRequests + ) + external + override + notPaused + onlyAuthorized(serviceProvider, oldVerifier) + onlyAuthorized(serviceProvider, newVerifier) + { + uint256 tokensThawed = _deprovision(serviceProvider, oldVerifier, nThawRequests); + _addToProvision(serviceProvider, newVerifier, tokensThawed); + } + + /// @inheritdoc IHorizonStakingMain + function setProvisionParameters( + address serviceProvider, + address verifier, + uint32 newMaxVerifierCut, + uint64 newThawingPeriod + ) external override notPaused onlyAuthorized(serviceProvider, verifier) { + // Provision must exist + Provision storage prov = _provisions[serviceProvider][verifier]; + require(prov.createdAt != 0, HorizonStakingInvalidProvision(serviceProvider, verifier)); + + bool verifierCutChanged = prov.maxVerifierCutPending != newMaxVerifierCut; + bool thawingPeriodChanged = prov.thawingPeriodPending != newThawingPeriod; + + if (verifierCutChanged || thawingPeriodChanged) { + if (verifierCutChanged) { + require(PPMMath.isValidPPM(newMaxVerifierCut), HorizonStakingInvalidMaxVerifierCut(newMaxVerifierCut)); + prov.maxVerifierCutPending = newMaxVerifierCut; + } + if (thawingPeriodChanged) { + require( + newThawingPeriod <= _maxThawingPeriod, + HorizonStakingInvalidThawingPeriod(newThawingPeriod, _maxThawingPeriod) + ); + prov.thawingPeriodPending = newThawingPeriod; + } + + prov.lastParametersStagedAt = block.timestamp; + emit ProvisionParametersStaged(serviceProvider, verifier, newMaxVerifierCut, newThawingPeriod); + } + } + + /// @inheritdoc IHorizonStakingMain + function acceptProvisionParameters(address serviceProvider) external override notPaused { + address verifier = msg.sender; + + // Provision must exist + Provision storage prov = _provisions[serviceProvider][verifier]; + require(prov.createdAt != 0, HorizonStakingInvalidProvision(serviceProvider, verifier)); + + if ((prov.maxVerifierCutPending != prov.maxVerifierCut) || (prov.thawingPeriodPending != prov.thawingPeriod)) { + prov.maxVerifierCut = prov.maxVerifierCutPending; + prov.thawingPeriod = prov.thawingPeriodPending; + emit ProvisionParametersSet(serviceProvider, verifier, prov.maxVerifierCut, prov.thawingPeriod); + } + } + + /* + * DELEGATION + */ + + /// @inheritdoc IHorizonStakingMain + function delegate( + address serviceProvider, + address verifier, + uint256 tokens, + uint256 minSharesOut + ) external override notPaused { + require(tokens != 0, HorizonStakingInvalidZeroTokens()); + _graphToken().pullTokens(msg.sender, tokens); + _delegate(serviceProvider, verifier, tokens, minSharesOut); + } + + /// @inheritdoc IHorizonStakingMain + function addToDelegationPool( + address serviceProvider, + address verifier, + uint256 tokens + ) external override notPaused { + require(tokens != 0, HorizonStakingInvalidZeroTokens()); + + // Provision must exist before adding to delegation pool + Provision memory prov = _provisions[serviceProvider][verifier]; + require(prov.createdAt != 0, HorizonStakingInvalidProvision(serviceProvider, verifier)); + + // Delegation pool must exist before adding tokens + DelegationPoolInternal storage pool = _getDelegationPool(serviceProvider, verifier); + require(pool.shares > 0, HorizonStakingInvalidDelegationPool(serviceProvider, verifier)); + + pool.tokens = pool.tokens + tokens; + _graphToken().pullTokens(msg.sender, tokens); + emit TokensToDelegationPoolAdded(serviceProvider, verifier, tokens); + } + + /// @inheritdoc IHorizonStakingMain + function undelegate( + address serviceProvider, + address verifier, + uint256 shares + ) external override notPaused returns (bytes32) { + return _undelegate(serviceProvider, verifier, shares); + } + + /// @inheritdoc IHorizonStakingMain + function withdrawDelegated( + address serviceProvider, + address verifier, + uint256 nThawRequests + ) external override notPaused { + _withdrawDelegated(serviceProvider, verifier, address(0), address(0), 0, nThawRequests); + } + + /// @inheritdoc IHorizonStakingMain + function redelegate( + address oldServiceProvider, + address oldVerifier, + address newServiceProvider, + address newVerifier, + uint256 minSharesForNewProvider, + uint256 nThawRequests + ) external override notPaused { + require(newServiceProvider != address(0), HorizonStakingInvalidServiceProviderZeroAddress()); + require(newVerifier != address(0), HorizonStakingInvalidVerifierZeroAddress()); + _withdrawDelegated( + oldServiceProvider, + oldVerifier, + newServiceProvider, + newVerifier, + minSharesForNewProvider, + nThawRequests + ); + } + + /// @inheritdoc IHorizonStakingMain + function setDelegationFeeCut( + address serviceProvider, + address verifier, + IGraphPayments.PaymentTypes paymentType, + uint256 feeCut + ) external override notPaused onlyAuthorized(serviceProvider, verifier) { + require(PPMMath.isValidPPM(feeCut), HorizonStakingInvalidDelegationFeeCut(feeCut)); + _delegationFeeCut[serviceProvider][verifier][paymentType] = feeCut; + emit DelegationFeeCutSet(serviceProvider, verifier, paymentType, feeCut); + } + + /// @inheritdoc IHorizonStakingMain + function delegate(address serviceProvider, uint256 tokens) external override notPaused { + require(tokens != 0, HorizonStakingInvalidZeroTokens()); + _graphToken().pullTokens(msg.sender, tokens); + _delegate(serviceProvider, SUBGRAPH_DATA_SERVICE_ADDRESS, tokens, 0); + } + + /// @inheritdoc IHorizonStakingMain + function undelegate(address serviceProvider, uint256 shares) external override notPaused { + _undelegate(serviceProvider, SUBGRAPH_DATA_SERVICE_ADDRESS, shares); + } + + /// @inheritdoc IHorizonStakingMain + function withdrawDelegated( + address serviceProvider, + address // deprecated - kept for backwards compatibility + ) external override notPaused returns (uint256) { + // Get the delegation pool of the indexer + address delegator = msg.sender; + DelegationPoolInternal storage pool = _legacyDelegationPools[serviceProvider]; + DelegationInternal storage delegation = pool.delegators[delegator]; + + // Validation + uint256 tokensToWithdraw = 0; + uint256 currentEpoch = _graphEpochManager().currentEpoch(); + if ( + delegation.__DEPRECATED_tokensLockedUntil > 0 && currentEpoch >= delegation.__DEPRECATED_tokensLockedUntil + ) { + tokensToWithdraw = delegation.__DEPRECATED_tokensLocked; + } + require(tokensToWithdraw > 0, HorizonStakingNothingToWithdraw()); + + // Reset lock + delegation.__DEPRECATED_tokensLocked = 0; + delegation.__DEPRECATED_tokensLockedUntil = 0; + + emit StakeDelegatedWithdrawn(serviceProvider, delegator, tokensToWithdraw); + + // -- Interactions -- + + // Return tokens to the delegator + _graphToken().pushTokens(delegator, tokensToWithdraw); + + return tokensToWithdraw; + } + + /* + * SLASHING + */ + + /// @inheritdoc IHorizonStakingMain + function slash( + address serviceProvider, + uint256 tokens, + uint256 tokensVerifier, + address verifierDestination + ) external override notPaused { + // TRANSITION PERIOD: remove after the transition period + // Check if sender is authorized to slash on the deprecated list + if (__DEPRECATED_slashers[msg.sender]) { + // Forward call to staking extension + // solhint-disable-next-line avoid-low-level-calls + (bool success, ) = STAKING_EXTENSION_ADDRESS.delegatecall( + abi.encodeCall( + IHorizonStakingExtension.legacySlash, + (serviceProvider, tokens, tokensVerifier, verifierDestination) + ) + ); + require(success, HorizonStakingLegacySlashFailed()); + return; + } + + address verifier = msg.sender; + Provision storage prov = _provisions[serviceProvider][verifier]; + DelegationPoolInternal storage pool = _getDelegationPool(serviceProvider, verifier); + uint256 tokensProvisionTotal = prov.tokens + pool.tokens; + require(tokensProvisionTotal != 0, HorizonStakingNoTokensToSlash()); + + uint256 tokensToSlash = MathUtils.min(tokens, tokensProvisionTotal); + + // Slash service provider first + // - A portion goes to verifier as reward + // - A portion gets burned + uint256 providerTokensSlashed = MathUtils.min(prov.tokens, tokensToSlash); + if (providerTokensSlashed > 0) { + // Pay verifier reward - must be within the maxVerifierCut percentage + uint256 maxVerifierTokens = providerTokensSlashed.mulPPM(prov.maxVerifierCut); + require( + maxVerifierTokens >= tokensVerifier, + HorizonStakingTooManyTokens(tokensVerifier, maxVerifierTokens) + ); + if (tokensVerifier > 0) { + _graphToken().pushTokens(verifierDestination, tokensVerifier); + emit VerifierTokensSent(serviceProvider, verifier, verifierDestination, tokensVerifier); + } + + // Burn remainder + _graphToken().burnTokens(providerTokensSlashed - tokensVerifier); + + // Provision accounting - round down, 1 wei max precision loss + prov.tokensThawing = (prov.tokensThawing * (prov.tokens - providerTokensSlashed)) / prov.tokens; + prov.tokens = prov.tokens - providerTokensSlashed; + + // If the slashing leaves the thawing shares with no thawing tokens, cancel pending thawings by: + // - deleting all thawing shares + // - incrementing the nonce to invalidate pending thaw requests + if (prov.sharesThawing != 0 && prov.tokensThawing == 0) { + prov.sharesThawing = 0; + prov.thawingNonce++; + } + + // Service provider accounting + _serviceProviders[serviceProvider].tokensProvisioned = + _serviceProviders[serviceProvider].tokensProvisioned - providerTokensSlashed; + _serviceProviders[serviceProvider].tokensStaked = + _serviceProviders[serviceProvider].tokensStaked - providerTokensSlashed; + + emit ProvisionSlashed(serviceProvider, verifier, providerTokensSlashed); + } + + // Slash delegators if needed + // - Slashed delegation is entirely burned + // Since tokensToSlash is already limited above, this subtraction will remain within pool.tokens. + tokensToSlash = tokensToSlash - providerTokensSlashed; + if (tokensToSlash > 0) { + if (_delegationSlashingEnabled) { + // Burn tokens + _graphToken().burnTokens(tokensToSlash); + + // Delegation pool accounting - round down, 1 wei max precision loss + pool.tokensThawing = (pool.tokensThawing * (pool.tokens - tokensToSlash)) / pool.tokens; + pool.tokens = pool.tokens - tokensToSlash; + + // If the slashing leaves the thawing shares with no thawing tokens, cancel pending thawings by: + // - deleting all thawing shares + // - incrementing the nonce to invalidate pending thaw requests + // Note that thawing shares are completely lost, delegators won't get back the corresponding + // delegation pool shares. + if (pool.sharesThawing != 0 && pool.tokensThawing == 0) { + pool.sharesThawing = 0; + pool.thawingNonce++; + } + + emit DelegationSlashed(serviceProvider, verifier, tokensToSlash); + } else { + emit DelegationSlashingSkipped(serviceProvider, verifier, tokensToSlash); + } + } + } + + /* + * LOCKED VERIFIERS + */ + + /// @inheritdoc IHorizonStakingMain + function provisionLocked( + address serviceProvider, + address verifier, + uint256 tokens, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) external override notPaused onlyAuthorized(serviceProvider, verifier) { + require(_allowedLockedVerifiers[verifier], HorizonStakingVerifierNotAllowed(verifier)); + _createProvision(serviceProvider, tokens, verifier, maxVerifierCut, thawingPeriod); + } + + /// @inheritdoc IHorizonStakingMain + function setOperatorLocked(address verifier, address operator, bool allowed) external override notPaused { + require(_allowedLockedVerifiers[verifier], HorizonStakingVerifierNotAllowed(verifier)); + _setOperator(verifier, operator, allowed); + } + + /* + * GOVERNANCE + */ + + /// @inheritdoc IHorizonStakingMain + function setAllowedLockedVerifier(address verifier, bool allowed) external override onlyGovernor { + _allowedLockedVerifiers[verifier] = allowed; + emit AllowedLockedVerifierSet(verifier, allowed); + } + + /// @inheritdoc IHorizonStakingMain + function setDelegationSlashingEnabled() external override onlyGovernor { + _delegationSlashingEnabled = true; + emit DelegationSlashingEnabled(); + } + + /// @inheritdoc IHorizonStakingMain + function clearThawingPeriod() external override onlyGovernor { + __DEPRECATED_thawingPeriod = 0; + emit ThawingPeriodCleared(); + } + + /// @inheritdoc IHorizonStakingMain + function setMaxThawingPeriod(uint64 maxThawingPeriod) external override onlyGovernor { + _maxThawingPeriod = maxThawingPeriod; + emit MaxThawingPeriodSet(_maxThawingPeriod); + } + + /* + * OPERATOR + */ + + /// @inheritdoc IHorizonStakingMain + function setOperator(address verifier, address operator, bool allowed) external override notPaused { + _setOperator(verifier, operator, allowed); + } + + /// @inheritdoc IHorizonStakingMain + function isAuthorized( + address serviceProvider, + address verifier, + address operator + ) external view override returns (bool) { + return _isAuthorized(serviceProvider, verifier, operator); + } + + /* + * GETTERS + */ + + /// @inheritdoc IHorizonStakingMain + function getStakingExtension() external view override returns (address) { + return STAKING_EXTENSION_ADDRESS; + } + + /* + * PRIVATE FUNCTIONS + */ + + /** + * @notice Deposit tokens on the service provider stake, on behalf of the service provider. + * @dev Pulls tokens from the caller. + * @param _serviceProvider Address of the service provider + * @param _tokens Amount of tokens to stake + */ + function _stakeTo(address _serviceProvider, uint256 _tokens) private { + require(_tokens != 0, HorizonStakingInvalidZeroTokens()); + + // Transfer tokens to stake from caller to this contract + _graphToken().pullTokens(msg.sender, _tokens); + + // Stake the transferred tokens + _stake(_serviceProvider, _tokens); + } + + /** + * @notice Move idle stake back to the owner's account. + * Stake is removed from the protocol: + * - During the transition period it's locked for a period of time before it can be withdrawn + * by calling {withdraw}. + * - After the transition period it's immediately withdrawn. + * Note that after the transition period if there are tokens still locked they will have to be + * withdrawn by calling {withdraw}. + * @param _tokens Amount of tokens to unstake + */ + function _unstake(uint256 _tokens) private { + address serviceProvider = msg.sender; + require(_tokens != 0, HorizonStakingInvalidZeroTokens()); + uint256 tokensIdle = _getIdleStake(serviceProvider); + require(_tokens <= tokensIdle, HorizonStakingInsufficientIdleStake(_tokens, tokensIdle)); + + ServiceProviderInternal storage sp = _serviceProviders[serviceProvider]; + uint256 stakedTokens = sp.tokensStaked; + + // This is also only during the transition period: we need + // to ensure tokens stay locked after closing legacy allocations. + // After sufficient time (56 days?) we should remove the closeAllocation function + // and set the thawing period to 0. + uint256 lockingPeriod = __DEPRECATED_thawingPeriod; + if (lockingPeriod == 0) { + sp.tokensStaked = stakedTokens - _tokens; + _graphToken().pushTokens(serviceProvider, _tokens); + emit HorizonStakeWithdrawn(serviceProvider, _tokens); + } else { + // Before locking more tokens, withdraw any unlocked ones if possible + if (sp.__DEPRECATED_tokensLocked != 0 && block.number >= sp.__DEPRECATED_tokensLockedUntil) { + _withdraw(serviceProvider); + } + // TRANSITION PERIOD: remove after the transition period + // Take into account period averaging for multiple unstake requests + if (sp.__DEPRECATED_tokensLocked > 0) { + lockingPeriod = MathUtils.weightedAverageRoundingUp( + MathUtils.diffOrZero(sp.__DEPRECATED_tokensLockedUntil, block.number), // Remaining thawing period + sp.__DEPRECATED_tokensLocked, // Weighted by remaining unstaked tokens + lockingPeriod, // Thawing period + _tokens // Weighted by new tokens to unstake + ); + } + + // Update balances + sp.__DEPRECATED_tokensLocked = sp.__DEPRECATED_tokensLocked + _tokens; + sp.__DEPRECATED_tokensLockedUntil = block.number + lockingPeriod; + emit HorizonStakeLocked(serviceProvider, sp.__DEPRECATED_tokensLocked, sp.__DEPRECATED_tokensLockedUntil); + } + } + + /** + * @notice Withdraw service provider tokens once the thawing period (initiated by {unstake}) has passed. + * All thawed tokens are withdrawn. + * @dev TRANSITION PERIOD: This is only needed during the transition period while we still have + * a global lock. After that, unstake() will automatically withdraw. + * @param _serviceProvider Address of service provider to withdraw funds from + */ + function _withdraw(address _serviceProvider) private { + // Get tokens available for withdraw and update balance + ServiceProviderInternal storage sp = _serviceProviders[_serviceProvider]; + uint256 tokensToWithdraw = sp.__DEPRECATED_tokensLocked; + require(tokensToWithdraw != 0, HorizonStakingInvalidZeroTokens()); + require( + block.number >= sp.__DEPRECATED_tokensLockedUntil, + HorizonStakingStillThawing(sp.__DEPRECATED_tokensLockedUntil) + ); + + // Reset locked tokens + sp.__DEPRECATED_tokensLocked = 0; + sp.__DEPRECATED_tokensLockedUntil = 0; + + sp.tokensStaked = sp.tokensStaked - tokensToWithdraw; + + // Return tokens to the service provider + _graphToken().pushTokens(_serviceProvider, tokensToWithdraw); + + emit HorizonStakeWithdrawn(_serviceProvider, tokensToWithdraw); + } + + /** + * @notice Provision stake to a verifier. The tokens will be locked with a thawing period + * and will be slashable by the verifier. This is the main mechanism to provision stake to a data + * service, where the data service is the verifier. + * This function can be called by the service provider or by an operator authorized by the provider + * for this specific verifier. + * @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 _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 + */ + function _createProvision( + address _serviceProvider, + uint256 _tokens, + address _verifier, + uint32 _maxVerifierCut, + uint64 _thawingPeriod + ) private { + require(_tokens > 0, HorizonStakingInvalidZeroTokens()); + // TRANSITION PERIOD: Remove this after the transition period - it prevents an early escape hatch for legacy allocations + require( + _verifier == SUBGRAPH_DATA_SERVICE_ADDRESS || __DEPRECATED_thawingPeriod == 0, + HorizonStakingInvalidVerifier(_verifier) + ); + require(PPMMath.isValidPPM(_maxVerifierCut), HorizonStakingInvalidMaxVerifierCut(_maxVerifierCut)); + require( + _thawingPeriod <= _maxThawingPeriod, + HorizonStakingInvalidThawingPeriod(_thawingPeriod, _maxThawingPeriod) + ); + require(_provisions[_serviceProvider][_verifier].createdAt == 0, HorizonStakingProvisionAlreadyExists()); + uint256 tokensIdle = _getIdleStake(_serviceProvider); + require(_tokens <= tokensIdle, HorizonStakingInsufficientIdleStake(_tokens, tokensIdle)); + + _provisions[_serviceProvider][_verifier] = Provision({ + tokens: _tokens, + tokensThawing: 0, + sharesThawing: 0, + maxVerifierCut: _maxVerifierCut, + thawingPeriod: _thawingPeriod, + createdAt: uint64(block.timestamp), + maxVerifierCutPending: _maxVerifierCut, + thawingPeriodPending: _thawingPeriod, + lastParametersStagedAt: 0, + thawingNonce: 0 + }); + + ServiceProviderInternal storage sp = _serviceProviders[_serviceProvider]; + sp.tokensProvisioned = sp.tokensProvisioned + _tokens; + + emit ProvisionCreated(_serviceProvider, _verifier, _tokens, _maxVerifierCut, _thawingPeriod); + } + + /** + * @notice Adds tokens from the service provider's idle stake to a provision + * @param _serviceProvider The service provider address + * @param _verifier The verifier address + * @param _tokens The amount of tokens to add to the provision + */ + function _addToProvision(address _serviceProvider, address _verifier, uint256 _tokens) private { + require(_tokens != 0, HorizonStakingInvalidZeroTokens()); + + Provision storage prov = _provisions[_serviceProvider][_verifier]; + require(prov.createdAt != 0, HorizonStakingInvalidProvision(_serviceProvider, _verifier)); + uint256 tokensIdle = _getIdleStake(_serviceProvider); + require(_tokens <= tokensIdle, HorizonStakingInsufficientIdleStake(_tokens, tokensIdle)); + + prov.tokens = prov.tokens + _tokens; + _serviceProviders[_serviceProvider].tokensProvisioned = + _serviceProviders[_serviceProvider].tokensProvisioned + _tokens; + emit ProvisionIncreased(_serviceProvider, _verifier, _tokens); + } + + /** + * @notice Start thawing tokens to remove them from a provision. + * This function can be called by the service provider or by an operator authorized by the provider + * for this specific verifier. + * + * Note that removing tokens from a provision is a two step process: + * - First the tokens are thawed using this function. + * - Then after the thawing period, the tokens are removed from the provision using {deprovision} + * or {reprovision}. + * + * @dev We use a thawing pool to keep track of tokens thawing for multiple thaw requests. + * If due to slashing the thawing pool loses all of its tokens, the pool is reset and all pending thaw + * requests are invalidated. + * + * @param _serviceProvider The service provider address + * @param _verifier The verifier address for which the tokens are provisioned + * @param _tokens The amount of tokens to thaw + * @return The ID of the thaw request + */ + function _thaw(address _serviceProvider, address _verifier, uint256 _tokens) private returns (bytes32) { + require(_tokens != 0, HorizonStakingInvalidZeroTokens()); + uint256 tokensAvailable = _getProviderTokensAvailable(_serviceProvider, _verifier); + require(tokensAvailable >= _tokens, HorizonStakingInsufficientTokens(tokensAvailable, _tokens)); + + Provision storage prov = _provisions[_serviceProvider][_verifier]; + + // Calculate shares to issue + // Thawing pool is reset/initialized when the pool is empty: prov.tokensThawing == 0 + // Round thawing shares up to ensure fairness and avoid undervaluing the shares due to rounding down. + uint256 thawingShares = prov.tokensThawing == 0 + ? _tokens + : ((prov.sharesThawing * _tokens + prov.tokensThawing - 1) / prov.tokensThawing); + uint64 thawingUntil = uint64(block.timestamp + uint256(prov.thawingPeriod)); + + prov.sharesThawing = prov.sharesThawing + thawingShares; + prov.tokensThawing = prov.tokensThawing + _tokens; + + bytes32 thawRequestId = _createThawRequest( + ThawRequestType.Provision, + _serviceProvider, + _verifier, + _serviceProvider, + thawingShares, + thawingUntil, + prov.thawingNonce + ); + emit ProvisionThawed(_serviceProvider, _verifier, _tokens); + return thawRequestId; + } + + /** + * @notice Remove tokens from a provision and move them back to the service provider's idle stake. + * @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw + * requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function + * will attempt to fulfill all thaw requests until the first one that is not yet expired is found. + * @param _serviceProvider The service provider address + * @param _verifier The verifier address + * @param _nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests. + * @return The amount of tokens that were removed from the provision + */ + function _deprovision( + address _serviceProvider, + address _verifier, + uint256 _nThawRequests + ) private returns (uint256) { + Provision storage prov = _provisions[_serviceProvider][_verifier]; + + uint256 tokensThawed_ = 0; + uint256 sharesThawing = prov.sharesThawing; + uint256 tokensThawing = prov.tokensThawing; + + FulfillThawRequestsParams memory params = FulfillThawRequestsParams({ + requestType: ThawRequestType.Provision, + serviceProvider: _serviceProvider, + verifier: _verifier, + owner: _serviceProvider, + tokensThawing: tokensThawing, + sharesThawing: sharesThawing, + nThawRequests: _nThawRequests, + thawingNonce: prov.thawingNonce + }); + (tokensThawed_, tokensThawing, sharesThawing) = _fulfillThawRequests(params); + + prov.tokens = prov.tokens - tokensThawed_; + prov.sharesThawing = sharesThawing; + prov.tokensThawing = tokensThawing; + _serviceProviders[_serviceProvider].tokensProvisioned -= tokensThawed_; + + emit TokensDeprovisioned(_serviceProvider, _verifier, tokensThawed_); + return tokensThawed_; + } + + /** + * @notice Delegate tokens to a provision. + * @dev Note that this function does not pull the delegated tokens from the caller. It expects that to + * have been done before calling this function. + * @param _serviceProvider The service provider address + * @param _verifier The verifier address + * @param _tokens The amount of tokens to delegate + * @param _minSharesOut The minimum amount of shares to accept, slippage protection. + */ + function _delegate(address _serviceProvider, address _verifier, uint256 _tokens, uint256 _minSharesOut) private { + // Enforces a minimum delegation amount to prevent share manipulation attacks. + // This stops attackers from inflating share value and blocking other delegators. + require(_tokens >= MIN_DELEGATION, HorizonStakingInsufficientDelegationTokens(_tokens, MIN_DELEGATION)); + require( + _provisions[_serviceProvider][_verifier].createdAt != 0, + HorizonStakingInvalidProvision(_serviceProvider, _verifier) + ); + + DelegationPoolInternal storage pool = _getDelegationPool(_serviceProvider, _verifier); + DelegationInternal storage delegation = pool.delegators[msg.sender]; + + // An invalid delegation pool has shares but no tokens + require( + pool.tokens != 0 || pool.shares == 0, + HorizonStakingInvalidDelegationPoolState(_serviceProvider, _verifier) + ); + + // Calculate shares to issue + // Delegation pool is reset/initialized in any of the following cases: + // - pool.tokens == 0 and pool.shares == 0, pool is completely empty. Note that we don't test shares == 0 because + // the invalid delegation pool check already ensures shares are 0 if tokens are 0 + // - pool.tokens == pool.tokensThawing, the entire pool is thawing + bool initializePool = pool.tokens == 0 || pool.tokens == pool.tokensThawing; + uint256 shares = initializePool ? _tokens : ((_tokens * pool.shares) / (pool.tokens - pool.tokensThawing)); + require(shares != 0 && shares >= _minSharesOut, HorizonStakingSlippageProtection(shares, _minSharesOut)); + + pool.tokens = pool.tokens + _tokens; + pool.shares = pool.shares + shares; + + delegation.shares = delegation.shares + shares; + + emit TokensDelegated(_serviceProvider, _verifier, msg.sender, _tokens, shares); + } + + /** + * @notice Undelegate tokens from a provision and start thawing them. + * Note that undelegating tokens from a provision is a two step process: + * - First the tokens are thawed using this function. + * - Then after the thawing period, the tokens are removed from the provision using {withdrawDelegated}. + * @dev To allow delegation to be slashable even while thawing without breaking accounting + * the delegation pool shares are burned and replaced with thawing pool shares. + * @dev Note that due to slashing the delegation pool can enter an invalid state if all it's tokens are slashed. + * An invalid pool can only be recovered by adding back tokens into the pool with {IHorizonStakingMain-addToDelegationPool}. + * Any time the delegation pool is invalidated, the thawing pool is also reset and any pending undelegate requests get + * invalidated. + * @dev Note that delegation that is caught thawing when the pool is invalidated will be completely lost! However delegation shares + * that were not thawing will be preserved. + * @param _serviceProvider The service provider address + * @param _verifier The verifier address + * @param _shares The amount of shares to undelegate + * @return The ID of the thaw request + */ + function _undelegate(address _serviceProvider, address _verifier, uint256 _shares) private returns (bytes32) { + require(_shares > 0, HorizonStakingInvalidZeroShares()); + DelegationPoolInternal storage pool = _getDelegationPool(_serviceProvider, _verifier); + DelegationInternal storage delegation = pool.delegators[msg.sender]; + require(delegation.shares >= _shares, HorizonStakingInsufficientShares(delegation.shares, _shares)); + + // An invalid delegation pool has shares but no tokens (previous require check ensures shares > 0) + require(pool.tokens != 0, HorizonStakingInvalidDelegationPoolState(_serviceProvider, _verifier)); + + // Calculate thawing shares to issue - convert delegation pool shares to thawing pool shares + // delegation pool shares -> delegation pool tokens -> thawing pool shares + // Thawing pool is reset/initialized when the pool is empty: prov.tokensThawing == 0 + uint256 tokens = (_shares * (pool.tokens - pool.tokensThawing)) / pool.shares; + + // Thawing shares are rounded down to protect the pool and avoid taking extra tokens from other participants. + uint256 thawingShares = pool.tokensThawing == 0 ? tokens : ((tokens * pool.sharesThawing) / pool.tokensThawing); + uint64 thawingUntil = uint64(block.timestamp + uint256(_provisions[_serviceProvider][_verifier].thawingPeriod)); + + pool.tokensThawing = pool.tokensThawing + tokens; + pool.sharesThawing = pool.sharesThawing + thawingShares; + + pool.shares = pool.shares - _shares; + delegation.shares = delegation.shares - _shares; + if (delegation.shares != 0) { + uint256 remainingTokens = (delegation.shares * (pool.tokens - pool.tokensThawing)) / pool.shares; + require( + remainingTokens >= MIN_DELEGATION, + HorizonStakingInsufficientTokens(remainingTokens, MIN_DELEGATION) + ); + } + + bytes32 thawRequestId = _createThawRequest( + ThawRequestType.Delegation, + _serviceProvider, + _verifier, + msg.sender, + thawingShares, + thawingUntil, + pool.thawingNonce + ); + + emit TokensUndelegated(_serviceProvider, _verifier, msg.sender, tokens, _shares); + return thawRequestId; + } + + /** + * @notice Withdraw undelegated tokens from a provision after thawing. + * @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw + * requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function + * will attempt to fulfill all thaw requests until the first one that is not yet expired is found. + * @dev If the delegation pool was completely slashed before withdrawing, calling this function will fulfill + * the thaw requests with an amount equal to zero. + * @param _serviceProvider The service provider address + * @param _verifier The verifier address + * @param _newServiceProvider The new service provider address + * @param _newVerifier The new verifier address + * @param _minSharesForNewProvider The minimum number of shares for the new service provider + * @param _nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests. + */ + function _withdrawDelegated( + address _serviceProvider, + address _verifier, + address _newServiceProvider, + address _newVerifier, + uint256 _minSharesForNewProvider, + uint256 _nThawRequests + ) private { + DelegationPoolInternal storage pool = _getDelegationPool(_serviceProvider, _verifier); + + // An invalid delegation pool has shares but no tokens + require( + pool.tokens != 0 || pool.shares == 0, + HorizonStakingInvalidDelegationPoolState(_serviceProvider, _verifier) + ); + + uint256 tokensThawed = 0; + uint256 sharesThawing = pool.sharesThawing; + uint256 tokensThawing = pool.tokensThawing; + + FulfillThawRequestsParams memory params = FulfillThawRequestsParams({ + requestType: ThawRequestType.Delegation, + serviceProvider: _serviceProvider, + verifier: _verifier, + owner: msg.sender, + tokensThawing: tokensThawing, + sharesThawing: sharesThawing, + nThawRequests: _nThawRequests, + thawingNonce: pool.thawingNonce + }); + (tokensThawed, tokensThawing, sharesThawing) = _fulfillThawRequests(params); + + // The next subtraction should never revert becase: pool.tokens >= pool.tokensThawing and pool.tokensThawing >= tokensThawed + // In the event the pool gets completely slashed tokensThawed will fulfil to 0. + pool.tokens = pool.tokens - tokensThawed; + pool.sharesThawing = sharesThawing; + pool.tokensThawing = tokensThawing; + + if (tokensThawed != 0) { + if (_newServiceProvider != address(0) && _newVerifier != address(0)) { + _delegate(_newServiceProvider, _newVerifier, tokensThawed, _minSharesForNewProvider); + } else { + _graphToken().pushTokens(msg.sender, tokensThawed); + emit DelegatedTokensWithdrawn(_serviceProvider, _verifier, msg.sender, tokensThawed); + } + } + } + + /** + * @notice Creates a thaw request. + * Allows creating thaw requests up to a maximum of `MAX_THAW_REQUESTS` per owner. + * Thaw requests are stored in a linked list per owner (and service provider, verifier) to allow for efficient + * processing. + * @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 request + * @param _shares The number of shares to thaw + * @param _thawingUntil The timestamp until which the shares are thawing + * @param _thawingNonce Owner's validity nonce for the thaw request + * @return The ID of the thaw request + */ + function _createThawRequest( + ThawRequestType _requestType, + address _serviceProvider, + address _verifier, + address _owner, + uint256 _shares, + uint64 _thawingUntil, + uint256 _thawingNonce + ) private returns (bytes32) { + require(_shares != 0, HorizonStakingInvalidZeroShares()); + ILinkedList.List storage thawRequestList = _getThawRequestList( + _requestType, + _serviceProvider, + _verifier, + _owner + ); + require(thawRequestList.count < MAX_THAW_REQUESTS, HorizonStakingTooManyThawRequests()); + + bytes32 thawRequestId = keccak256(abi.encodePacked(_serviceProvider, _verifier, _owner, thawRequestList.nonce)); + ThawRequest storage thawRequest = _getThawRequest(_requestType, thawRequestId); + thawRequest.shares = _shares; + thawRequest.thawingUntil = _thawingUntil; + thawRequest.nextRequest = bytes32(0); + thawRequest.thawingNonce = _thawingNonce; + + if (thawRequestList.count != 0) _getThawRequest(_requestType, thawRequestList.tail).nextRequest = thawRequestId; + thawRequestList.addTail(thawRequestId); + + emit ThawRequestCreated( + _requestType, + _serviceProvider, + _verifier, + _owner, + _shares, + _thawingUntil, + thawRequestId, + _thawingNonce + ); + return thawRequestId; + } + + /** + * @notice Traverses a thaw request list and fulfills expired thaw requests. + * @dev Note that the list is traversed by creation date not by thawing until date. Traversing will stop + * when the first thaw request that is not yet expired is found even if later thaw requests have expired. This + * could happen for example when the thawing period is shortened. + * @param _params The parameters for fulfilling thaw requests + * @return The amount of thawed tokens + * @return The amount of tokens still thawing + * @return The amount of shares still thawing + */ + function _fulfillThawRequests( + FulfillThawRequestsParams memory _params + ) private returns (uint256, uint256, uint256) { + ILinkedList.List storage thawRequestList = _getThawRequestList( + _params.requestType, + _params.serviceProvider, + _params.verifier, + _params.owner + ); + require(thawRequestList.count > 0, HorizonStakingNothingThawing()); + + TraverseThawRequestsResults memory results = _traverseThawRequests(_params, thawRequestList); + + emit ThawRequestsFulfilled( + _params.requestType, + _params.serviceProvider, + _params.verifier, + _params.owner, + results.requestsFulfilled, + results.tokensThawed + ); + + return (results.tokensThawed, results.tokensThawing, results.sharesThawing); + } + + /** + * @notice Traverses a thaw request list and fulfills expired thaw requests. + * @param _params The parameters for fulfilling thaw requests + * @param _thawRequestList The list of thaw requests to traverse + * @return The results of the traversal + */ + function _traverseThawRequests( + FulfillThawRequestsParams memory _params, + ILinkedList.List storage _thawRequestList + ) private returns (TraverseThawRequestsResults memory) { + function(bytes32) view returns (bytes32) getNextItem = _getNextThawRequest(_params.requestType); + function(bytes32) deleteItem = _getDeleteThawRequest(_params.requestType); + + bytes memory acc = abi.encode( + _params.requestType, + uint256(0), + _params.tokensThawing, + _params.sharesThawing, + _params.thawingNonce + ); + (uint256 thawRequestsFulfilled, bytes memory data) = _thawRequestList.traverse( + getNextItem, + _fulfillThawRequest, + deleteItem, + acc, + _params.nThawRequests + ); + + (, uint256 tokensThawed, uint256 tokensThawing, uint256 sharesThawing) = abi.decode( + data, + (ThawRequestType, uint256, uint256, uint256) + ); + + return + TraverseThawRequestsResults({ + requestsFulfilled: thawRequestsFulfilled, + tokensThawed: tokensThawed, + tokensThawing: tokensThawing, + sharesThawing: sharesThawing + }); + } + + /** + * @notice Fulfills a thaw request. + * @dev This function is used as a callback in the thaw requests linked list traversal. + * @param _thawRequestId The ID of the current thaw request + * @param _acc The accumulator data for the thaw requests being fulfilled + * @return Whether the thaw request is still thawing, indicating that the traversal should continue or stop. + * @return The updated accumulator data + */ + function _fulfillThawRequest(bytes32 _thawRequestId, bytes memory _acc) private returns (bool, bytes memory) { + // decode + ( + ThawRequestType requestType, + uint256 tokensThawed, + uint256 tokensThawing, + uint256 sharesThawing, + uint256 thawingNonce + ) = abi.decode(_acc, (ThawRequestType, uint256, uint256, uint256, uint256)); + + ThawRequest storage thawRequest = _getThawRequest(requestType, _thawRequestId); + + // early exit + if (thawRequest.thawingUntil > block.timestamp) { + return (true, LinkedList.NULL_BYTES); + } + + // process - only fulfill thaw requests for the current valid nonce + uint256 tokens = 0; + bool validThawRequest = thawRequest.thawingNonce == thawingNonce; + if (validThawRequest) { + // sharesThawing cannot be zero if there is a valid thaw request so the next division is safe + tokens = (thawRequest.shares * tokensThawing) / sharesThawing; + tokensThawing = tokensThawing - tokens; + sharesThawing = sharesThawing - thawRequest.shares; + tokensThawed = tokensThawed + tokens; + } + emit ThawRequestFulfilled( + requestType, + _thawRequestId, + tokens, + thawRequest.shares, + thawRequest.thawingUntil, + validThawRequest + ); + + // encode + _acc = abi.encode(requestType, tokensThawed, tokensThawing, sharesThawing, thawingNonce); + return (false, _acc); + } + + /** + * @notice Deletes a thaw request for a provision. + * @param _thawRequestId The ID of the thaw request to delete. + */ + function _deleteProvisionThawRequest(bytes32 _thawRequestId) private { + delete _thawRequests[ThawRequestType.Provision][_thawRequestId]; + } + + /** + * @notice Deletes a thaw request for a delegation. + * @param _thawRequestId The ID of the thaw request to delete. + */ + function _deleteDelegationThawRequest(bytes32 _thawRequestId) private { + delete _thawRequests[ThawRequestType.Delegation][_thawRequestId]; + } + + /** + * @notice Authorize or unauthorize an address to be an operator for the caller on a data service. + * @dev Note that this function handles the special case where the verifier is the subgraph data service, + * where the operator settings are stored in the legacy mapping. + * @param _verifier The verifier / data service on which they'll be allowed to operate + * @param _operator Address to authorize or unauthorize + * @param _allowed Whether the operator is authorized or not + */ + function _setOperator(address _verifier, address _operator, bool _allowed) private { + require(_operator != msg.sender, HorizonStakingCallerIsServiceProvider()); + if (_verifier == SUBGRAPH_DATA_SERVICE_ADDRESS) { + _legacyOperatorAuth[msg.sender][_operator] = _allowed; + } else { + _operatorAuth[msg.sender][_verifier][_operator] = _allowed; + } + emit OperatorSet(msg.sender, _verifier, _operator, _allowed); + } + + /** + * @notice Check if an operator is authorized for the caller on a specific verifier / data service. + * @dev Note that this function handles the special case where the verifier is the subgraph data service, + * where the operator settings are stored in the legacy mapping. + * @param _serviceProvider The service provider on behalf of whom they're claiming to act + * @param _verifier The verifier / data service on which they're claiming to act + * @param _operator The address to check for auth + * @return Whether the operator is authorized or not + */ + function _isAuthorized(address _serviceProvider, address _verifier, address _operator) private view returns (bool) { + if (_operator == _serviceProvider) { + return true; + } + if (_verifier == SUBGRAPH_DATA_SERVICE_ADDRESS) { + return _legacyOperatorAuth[_serviceProvider][_operator]; + } else { + return _operatorAuth[_serviceProvider][_verifier][_operator]; + } + } + + /** + * @notice Determines the correct callback function for `deleteItem` based on the request type. + * @param _requestType The type of thaw request (Provision or Delegation). + * @return A function pointer to the appropriate `deleteItem` callback. + */ + function _getDeleteThawRequest(ThawRequestType _requestType) private pure returns (function(bytes32)) { + if (_requestType == ThawRequestType.Provision) { + return _deleteProvisionThawRequest; + } else if (_requestType == ThawRequestType.Delegation) { + return _deleteDelegationThawRequest; + } else { + revert HorizonStakingInvalidThawRequestType(); + } + } +} diff --git a/packages/horizon/contracts/staking/HorizonStakingBase.sol b/packages/horizon/contracts/staking/HorizonStakingBase.sol new file mode 100644 index 000000000..2428e1e98 --- /dev/null +++ b/packages/horizon/contracts/staking/HorizonStakingBase.sol @@ -0,0 +1,357 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { IHorizonStakingBase } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingBase.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +import { MathUtils } from "../libraries/MathUtils.sol"; +import { LinkedList } from "../libraries/LinkedList.sol"; + +import { Multicall } from "@openzeppelin/contracts/utils/Multicall.sol"; +import { GraphUpgradeable } from "@graphprotocol/contracts/contracts/upgrades/GraphUpgradeable.sol"; +import { Managed } from "./utilities/Managed.sol"; +import { HorizonStakingV1Storage } from "./HorizonStakingStorage.sol"; + +/** + * @title HorizonStakingBase contract + * @notice This contract is the base staking contract implementing storage getters for both internal + * and external use. + * @dev Implementation of the {IHorizonStakingBase} interface. + * @dev It's meant to be inherited by the {HorizonStaking} and {HorizonStakingExtension} + * contracts so some internal functions are also included here. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +abstract contract HorizonStakingBase is + Multicall, + Managed, + HorizonStakingV1Storage, + GraphUpgradeable, + IHorizonStakingTypes, + IHorizonStakingBase +{ + using LinkedList for ILinkedList.List; + + /** + * @notice The address of the subgraph data service. + * @dev Require to handle the special case when the verifier is the subgraph data service. + */ + 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. + */ + constructor(address controller, address subgraphDataServiceAddress) Managed(controller) { + SUBGRAPH_DATA_SERVICE_ADDRESS = subgraphDataServiceAddress; + } + + /// @inheritdoc IHorizonStakingBase + /// @dev Removes deprecated fields from the return value. + function getServiceProvider(address serviceProvider) external view override returns (ServiceProvider memory) { + ServiceProvider memory sp; + ServiceProviderInternal storage spInternal = _serviceProviders[serviceProvider]; + sp.tokensStaked = spInternal.tokensStaked; + sp.tokensProvisioned = spInternal.tokensProvisioned; + return sp; + } + + /// @inheritdoc IHorizonStakingBase + function getStake(address serviceProvider) external view override returns (uint256) { + return _serviceProviders[serviceProvider].tokensStaked; + } + + /// @inheritdoc IHorizonStakingBase + function getIdleStake(address serviceProvider) external view override returns (uint256) { + return _getIdleStake(serviceProvider); + } + + /// @inheritdoc IHorizonStakingBase + /// @dev Removes deprecated fields from the return value. + function getDelegationPool( + address serviceProvider, + address verifier + ) external view override returns (DelegationPool memory) { + DelegationPool memory pool; + DelegationPoolInternal storage poolInternal = _getDelegationPool(serviceProvider, verifier); + pool.tokens = poolInternal.tokens; + pool.shares = poolInternal.shares; + pool.tokensThawing = poolInternal.tokensThawing; + pool.sharesThawing = poolInternal.sharesThawing; + pool.thawingNonce = poolInternal.thawingNonce; + return pool; + } + + /// @inheritdoc IHorizonStakingBase + /// @dev Removes deprecated fields from the return value. + function getDelegation( + address serviceProvider, + address verifier, + address delegator + ) external view override returns (Delegation memory) { + Delegation memory delegation; + DelegationPoolInternal storage poolInternal = _getDelegationPool(serviceProvider, verifier); + delegation.shares = poolInternal.delegators[delegator].shares; + return delegation; + } + + /// @inheritdoc IHorizonStakingBase + function getDelegationFeeCut( + address serviceProvider, + address verifier, + IGraphPayments.PaymentTypes paymentType + ) external view override returns (uint256) { + return _delegationFeeCut[serviceProvider][verifier][paymentType]; + } + + /// @inheritdoc IHorizonStakingBase + function getProvision(address serviceProvider, address verifier) external view override returns (Provision memory) { + return _provisions[serviceProvider][verifier]; + } + + /// @inheritdoc IHorizonStakingBase + function getTokensAvailable( + address serviceProvider, + address verifier, + uint32 delegationRatio + ) external view override returns (uint256) { + uint256 tokensAvailableProvider = _getProviderTokensAvailable(serviceProvider, verifier); + uint256 tokensAvailableDelegated = _getDelegatedTokensAvailable(serviceProvider, verifier); + + uint256 tokensDelegatedMax = tokensAvailableProvider * (uint256(delegationRatio)); + uint256 tokensDelegatedCapacity = MathUtils.min(tokensAvailableDelegated, tokensDelegatedMax); + + return tokensAvailableProvider + tokensDelegatedCapacity; + } + + /// @inheritdoc IHorizonStakingBase + function getProviderTokensAvailable( + address serviceProvider, + address verifier + ) external view override returns (uint256) { + return _getProviderTokensAvailable(serviceProvider, verifier); + } + + /// @inheritdoc IHorizonStakingBase + function getDelegatedTokensAvailable( + address serviceProvider, + address verifier + ) external view override returns (uint256) { + return _getDelegatedTokensAvailable(serviceProvider, verifier); + } + + /// @inheritdoc IHorizonStakingBase + function getThawRequest( + ThawRequestType requestType, + bytes32 thawRequestId + ) external view override returns (ThawRequest memory) { + return _getThawRequest(requestType, thawRequestId); + } + + /// @inheritdoc IHorizonStakingBase + function getThawRequestList( + ThawRequestType requestType, + address serviceProvider, + address verifier, + address owner + ) external view override returns (ILinkedList.List memory) { + return _getThawRequestList(requestType, serviceProvider, verifier, owner); + } + + /// @inheritdoc IHorizonStakingBase + function getThawedTokens( + ThawRequestType requestType, + address serviceProvider, + address verifier, + address owner + ) external view override returns (uint256) { + ILinkedList.List storage thawRequestList = _getThawRequestList(requestType, serviceProvider, verifier, owner); + if (thawRequestList.count == 0) { + return 0; + } + + uint256 thawedTokens = 0; + Provision storage prov = _provisions[serviceProvider][verifier]; + uint256 tokensThawing = prov.tokensThawing; + uint256 sharesThawing = prov.sharesThawing; + + bytes32 thawRequestId = thawRequestList.head; + while (thawRequestId != bytes32(0)) { + ThawRequest storage thawRequest = _getThawRequest(requestType, thawRequestId); + if (thawRequest.thawingNonce == prov.thawingNonce) { + if (thawRequest.thawingUntil <= block.timestamp) { + // sharesThawing cannot be zero if there is a valid thaw request so the next division is safe + uint256 tokens = (thawRequest.shares * tokensThawing) / sharesThawing; + tokensThawing = tokensThawing - tokens; + sharesThawing = sharesThawing - thawRequest.shares; + thawedTokens = thawedTokens + tokens; + } else { + break; + } + } + + thawRequestId = thawRequest.nextRequest; + } + return thawedTokens; + } + + /// @inheritdoc IHorizonStakingBase + function getMaxThawingPeriod() external view override returns (uint64) { + return _maxThawingPeriod; + } + + /// @inheritdoc IHorizonStakingBase + function isAllowedLockedVerifier(address verifier) external view returns (bool) { + return _allowedLockedVerifiers[verifier]; + } + + /// @inheritdoc IHorizonStakingBase + function isDelegationSlashingEnabled() external view returns (bool) { + return _delegationSlashingEnabled; + } + + /** + * @notice Deposit tokens into the service provider stake. + * @dev TRANSITION PERIOD: After transition period move to IHorizonStakingMain. Temporarily it + * needs to be here since it's used by both {HorizonStaking} and {HorizonStakingExtension}. + * + * Emits a {HorizonStakeDeposited} event. + * @param _serviceProvider The address of the service provider. + * @param _tokens The amount of tokens to deposit. + */ + function _stake(address _serviceProvider, uint256 _tokens) internal { + _serviceProviders[_serviceProvider].tokensStaked = _serviceProviders[_serviceProvider].tokensStaked + _tokens; + emit HorizonStakeDeposited(_serviceProvider, _tokens); + } + + /** + * @notice Gets the service provider's idle stake which is the stake that is not being + * used for any provision. Note that this only includes service provider's self stake. + * @dev Note that the calculation considers tokens that were locked in the legacy staking contract. + * @dev TRANSITION PERIOD: update the calculation after the transition period. + * @param _serviceProvider The address of the service provider. + * @return The amount of tokens that are idle. + */ + function _getIdleStake(address _serviceProvider) internal view returns (uint256) { + uint256 tokensUsed = _serviceProviders[_serviceProvider].tokensProvisioned + + _serviceProviders[_serviceProvider].__DEPRECATED_tokensAllocated + + _serviceProviders[_serviceProvider].__DEPRECATED_tokensLocked; + uint256 tokensStaked = _serviceProviders[_serviceProvider].tokensStaked; + return tokensStaked > tokensUsed ? tokensStaked - tokensUsed : 0; + } + + /** + * @notice Gets the details of delegation pool. + * @dev Note that this function handles the special case where the verifier is the subgraph data service, + * where the pools are stored in the legacy mapping. + * @param _serviceProvider The address of the service provider. + * @param _verifier The address of the verifier. + * @return The delegation pool details. + */ + function _getDelegationPool( + address _serviceProvider, + address _verifier + ) internal view returns (DelegationPoolInternal storage) { + if (_verifier == SUBGRAPH_DATA_SERVICE_ADDRESS) { + return _legacyDelegationPools[_serviceProvider]; + } else { + return _delegationPools[_serviceProvider][_verifier]; + } + } + + /** + * @notice Gets the service provider's tokens available in a provision. + * @dev Calculated as the tokens available minus the tokens thawing. + * @param _serviceProvider The address of the service provider. + * @param _verifier The address of the verifier. + * @return The amount of tokens available. + */ + function _getProviderTokensAvailable(address _serviceProvider, address _verifier) internal view returns (uint256) { + return _provisions[_serviceProvider][_verifier].tokens - _provisions[_serviceProvider][_verifier].tokensThawing; + } + + /** + * @notice Retrieves the next thaw request for a provision. + * @param _thawRequestId The ID of the current thaw request. + * @return The ID of the next thaw request in the list. + */ + function _getNextProvisionThawRequest(bytes32 _thawRequestId) internal view returns (bytes32) { + return _thawRequests[ThawRequestType.Provision][_thawRequestId].nextRequest; + } + + /** + * @notice Retrieves the next thaw request for a delegation. + * @param _thawRequestId The ID of the current thaw request. + * @return The ID of the next thaw request in the list. + */ + function _getNextDelegationThawRequest(bytes32 _thawRequestId) internal view returns (bytes32) { + return _thawRequests[ThawRequestType.Delegation][_thawRequestId].nextRequest; + } + + /** + * @notice Retrieves the thaw request list for the given request type. + * @dev Uses the `ThawRequestType` to determine which mapping to access. + * Reverts if the request type is unknown. + * @param _requestType The type of thaw request (Provision or Delegation). + * @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 request. + * @return The linked list of thaw requests for the specified request type. + */ + function _getThawRequestList( + ThawRequestType _requestType, + address _serviceProvider, + address _verifier, + address _owner + ) internal view returns (ILinkedList.List storage) { + return _thawRequestLists[_requestType][_serviceProvider][_verifier][_owner]; + } + + /** + * @notice Retrieves a specific thaw request for the given request type. + * @dev Uses the `ThawRequestType` to determine which mapping to access. + * @param _requestType The type of thaw request (Provision or Delegation). + * @param _thawRequestId The unique ID of the thaw request. + * @return The thaw request data for the specified request type and ID. + */ + function _getThawRequest( + ThawRequestType _requestType, + bytes32 _thawRequestId + ) internal view returns (IHorizonStakingTypes.ThawRequest storage) { + return _thawRequests[_requestType][_thawRequestId]; + } + + /** + * @notice Determines the correct callback function for `getNextItem` based on the request type. + * @param _requestType The type of thaw request (Provision or Delegation). + * @return A function pointer to the appropriate `getNextItem` callback. + */ + function _getNextThawRequest( + ThawRequestType _requestType + ) internal pure returns (function(bytes32) view returns (bytes32)) { + if (_requestType == ThawRequestType.Provision) { + return _getNextProvisionThawRequest; + } else if (_requestType == ThawRequestType.Delegation) { + return _getNextDelegationThawRequest; + } else { + revert HorizonStakingInvalidThawRequestType(); + } + } + + /** + * @notice Gets the delegator's tokens available in a provision. + * @dev Calculated as the tokens available minus the tokens thawing. + * @param _serviceProvider The address of the service provider. + * @param _verifier The address of the verifier. + * @return The amount of tokens available. + */ + function _getDelegatedTokensAvailable(address _serviceProvider, address _verifier) private view returns (uint256) { + DelegationPoolInternal storage poolInternal = _getDelegationPool(_serviceProvider, _verifier); + return poolInternal.tokens - poolInternal.tokensThawing; + } +} diff --git a/packages/horizon/contracts/staking/HorizonStakingExtension.sol b/packages/horizon/contracts/staking/HorizonStakingExtension.sol new file mode 100644 index 000000000..3480a5c4d --- /dev/null +++ b/packages/horizon/contracts/staking/HorizonStakingExtension.sol @@ -0,0 +1,481 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curation/ICuration.sol"; +import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; +import { IRewardsIssuer } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsIssuer.sol"; + +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; +import { MathUtils } from "../libraries/MathUtils.sol"; +import { ExponentialRebates } from "./libraries/ExponentialRebates.sol"; +import { PPMMath } from "../libraries/PPMMath.sol"; + +import { HorizonStakingBase } from "./HorizonStakingBase.sol"; + +/** + * @title Horizon Staking extension contract + * @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 + * without losing rewards or having service interruptions. + * @dev TRANSITION PERIOD: Once the transition period passes this contract can be removed (note that an upgrade to the + * RewardsManager will also be required). It's expected the transition period to last for at least a full allocation cycle + * (28 epochs). + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract HorizonStakingExtension is HorizonStakingBase, IHorizonStakingExtension { + using TokenUtils for IGraphToken; + using PPMMath for uint256; + + /** + * @dev Check if the caller is the slasher. + */ + modifier onlySlasher() { + require(__DEPRECATED_slashers[msg.sender], "!slasher"); + _; + } + + /** + * @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. + */ + constructor( + address controller, + address subgraphDataServiceAddress + ) HorizonStakingBase(controller, subgraphDataServiceAddress) {} + + /// @inheritdoc IHorizonStakingExtension + function closeAllocation(address allocationID, bytes32 poi) external override notPaused { + _closeAllocation(allocationID, poi); + } + + /// @inheritdoc IHorizonStakingExtension + function collect(uint256 tokens, address allocationID) external override notPaused { + // Allocation identifier validation + require(allocationID != address(0), "!alloc"); + + // Allocation must exist + AllocationState allocState = _getAllocationState(allocationID); + require(allocState != AllocationState.Null, "!collect"); + + // If the query fees are zero, we don't want to revert + // but we also don't need to do anything, so just return + if (tokens == 0) { + return; + } + + Allocation storage alloc = __DEPRECATED_allocations[allocationID]; + bytes32 subgraphDeploymentID = alloc.subgraphDeploymentID; + + uint256 queryFees = tokens; // Tokens collected from the channel + uint256 protocolTax = 0; // Tokens burnt as protocol tax + uint256 curationFees = 0; // Tokens distributed to curators as curation fees + uint256 queryRebates = 0; // Tokens to distribute to indexer + uint256 delegationRewards = 0; // Tokens to distribute to delegators + + { + // -- Pull tokens from the sender -- + _graphToken().pullTokens(msg.sender, queryFees); + + // -- Collect protocol tax -- + protocolTax = _collectTax(queryFees, __DEPRECATED_protocolPercentage); + queryFees = queryFees - protocolTax; + + // -- Collect curation fees -- + // Only if the subgraph deployment is curated + curationFees = _collectCurationFees(subgraphDeploymentID, queryFees, __DEPRECATED_curationPercentage); + queryFees = queryFees - curationFees; + + // -- Process rebate reward -- + // Using accumulated fees and subtracting previously distributed rebates + // allows for multiple vouchers to be collected while following the rebate formula + alloc.collectedFees = alloc.collectedFees + queryFees; + + // No rebates if indexer has no stake or if lambda is zero + uint256 newRebates = (alloc.tokens == 0 || __DEPRECATED_lambdaNumerator == 0) + ? 0 + : ExponentialRebates.exponentialRebates( + alloc.collectedFees, + alloc.tokens, + __DEPRECATED_alphaNumerator, + __DEPRECATED_alphaDenominator, + __DEPRECATED_lambdaNumerator, + __DEPRECATED_lambdaDenominator + ); + + // -- Ensure rebates to distribute are within bounds -- + // Indexers can become under or over rebated if rebate parameters (alpha, lambda) + // change between successive collect calls for the same allocation + + // Ensure rebates to distribute are not negative (indexer is over-rebated) + queryRebates = MathUtils.diffOrZero(newRebates, alloc.distributedRebates); + + // Ensure rebates to distribute are not greater than available (indexer is under-rebated) + queryRebates = MathUtils.min(queryRebates, queryFees); + + // -- Burn rebates remanent -- + _graphToken().burnTokens(queryFees - queryRebates); + + // -- Distribute rebates -- + if (queryRebates > 0) { + alloc.distributedRebates = alloc.distributedRebates + queryRebates; + + // -- Collect delegation rewards into the delegation pool -- + delegationRewards = _collectDelegationQueryRewards(alloc.indexer, queryRebates); + queryRebates = queryRebates - delegationRewards; + + // -- Transfer or restake rebates -- + _sendRewards(queryRebates, alloc.indexer, __DEPRECATED_rewardsDestination[alloc.indexer] == address(0)); + } + } + + emit RebateCollected( + msg.sender, + alloc.indexer, + subgraphDeploymentID, + allocationID, + _graphEpochManager().currentEpoch(), + tokens, + protocolTax, + curationFees, + queryFees, + queryRebates, + delegationRewards + ); + } + + /// @inheritdoc IHorizonStakingExtension + function legacySlash( + address indexer, + uint256 tokens, + uint256 reward, + address beneficiary + ) external override onlySlasher notPaused { + ServiceProviderInternal storage indexerStake = _serviceProviders[indexer]; + + // Only able to slash a non-zero number of tokens + require(tokens > 0, "!tokens"); + + // Rewards comes from tokens slashed balance + require(tokens >= reward, "rewards>slash"); + + // Cannot slash stake of an indexer without any or enough stake + require(indexerStake.tokensStaked > 0, "!stake"); + require(tokens <= indexerStake.tokensStaked, "slash>stake"); + + // Validate beneficiary of slashed tokens + require(beneficiary != address(0), "!beneficiary"); + + // Slashing tokens that are already provisioned would break provision accounting, we need to limit + // the slash amount. This can be compensated for, by slashing with the main slash function if needed. + uint256 slashableStake = indexerStake.tokensStaked - indexerStake.tokensProvisioned; + if (slashableStake == 0) { + emit StakeSlashed(indexer, 0, 0, beneficiary); + return; + } + if (tokens > slashableStake) { + reward = (reward * slashableStake) / tokens; + tokens = slashableStake; + } + + // Slashing more tokens than freely available (over allocation condition) + // Unlock locked tokens to avoid the indexer to withdraw them + uint256 tokensUsed = indexerStake.__DEPRECATED_tokensAllocated + indexerStake.__DEPRECATED_tokensLocked; + uint256 tokensAvailable = tokensUsed > indexerStake.tokensStaked ? 0 : indexerStake.tokensStaked - tokensUsed; + if (tokens > tokensAvailable && indexerStake.__DEPRECATED_tokensLocked > 0) { + uint256 tokensOverAllocated = tokens - tokensAvailable; + uint256 tokensToUnlock = MathUtils.min(tokensOverAllocated, indexerStake.__DEPRECATED_tokensLocked); + indexerStake.__DEPRECATED_tokensLocked = indexerStake.__DEPRECATED_tokensLocked - tokensToUnlock; + if (indexerStake.__DEPRECATED_tokensLocked == 0) { + indexerStake.__DEPRECATED_tokensLockedUntil = 0; + } + } + + // Remove tokens to slash from the stake + indexerStake.tokensStaked = indexerStake.tokensStaked - tokens; + + // -- Interactions -- + + // Set apart the reward for the beneficiary and burn remaining slashed stake + _graphToken().burnTokens(tokens - reward); + + // Give the beneficiary a reward for slashing + _graphToken().pushTokens(beneficiary, reward); + + emit StakeSlashed(indexer, tokens, reward, beneficiary); + } + + /// @inheritdoc IHorizonStakingExtension + function isAllocation(address allocationID) external view override returns (bool) { + return _getAllocationState(allocationID) != AllocationState.Null; + } + + /// @inheritdoc IHorizonStakingExtension + function getAllocation(address allocationID) external view override returns (Allocation memory) { + return __DEPRECATED_allocations[allocationID]; + } + + /// @inheritdoc IRewardsIssuer + function getAllocationData( + address allocationID + ) external view override returns (bool, address, bytes32, uint256, uint256, uint256) { + Allocation memory allo = __DEPRECATED_allocations[allocationID]; + bool isActive = _getAllocationState(allocationID) == AllocationState.Active; + return (isActive, allo.indexer, allo.subgraphDeploymentID, allo.tokens, allo.accRewardsPerAllocatedToken, 0); + } + + /// @inheritdoc IHorizonStakingExtension + function getAllocationState(address allocationID) external view override returns (AllocationState) { + return _getAllocationState(allocationID); + } + + /// @inheritdoc IRewardsIssuer + function getSubgraphAllocatedTokens(bytes32 subgraphDeploymentID) external view override returns (uint256) { + return __DEPRECATED_subgraphAllocations[subgraphDeploymentID]; + } + + /// @inheritdoc IHorizonStakingExtension + function getIndexerStakedTokens(address indexer) external view override returns (uint256) { + return _serviceProviders[indexer].tokensStaked; + } + + /// @inheritdoc IHorizonStakingExtension + function getSubgraphService() external view override returns (address) { + return SUBGRAPH_DATA_SERVICE_ADDRESS; + } + + /// @inheritdoc IHorizonStakingExtension + function hasStake(address indexer) external view override returns (bool) { + return _serviceProviders[indexer].tokensStaked > 0; + } + + /// @inheritdoc IHorizonStakingExtension + function __DEPRECATED_getThawingPeriod() external view returns (uint64) { + return __DEPRECATED_thawingPeriod; + } + + /// @inheritdoc IHorizonStakingExtension + function isOperator(address operator, address serviceProvider) public view override returns (bool) { + return _legacyOperatorAuth[serviceProvider][operator]; + } + + /** + * @dev 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 + */ + function _collectTax(uint256 _tokens, uint256 _percentage) private returns (uint256) { + uint256 tax = _tokens.mulPPMRoundUp(_percentage); + _graphToken().burnTokens(tax); // Burn tax if any + return tax; + } + + /** + * @dev Triggers an update of rewards due to a change in allocations. + * @param _subgraphDeploymentID Subgraph deployment updated + */ + function _updateRewards(bytes32 _subgraphDeploymentID) private { + _graphRewardsManager().onSubgraphAllocationUpdate(_subgraphDeploymentID); + } + + /** + * @dev Assign rewards for the closed allocation to indexer and delegators. + * @param _allocationID Allocation + * @param _indexer Address of the indexer that did the allocation + */ + function _distributeRewards(address _allocationID, address _indexer) private { + // Automatically triggers update of rewards snapshot as allocation will change + // after this call. Take rewards mint tokens for the Staking contract to distribute + // between indexer and delegators + uint256 totalRewards = _graphRewardsManager().takeRewards(_allocationID); + if (totalRewards == 0) { + return; + } + + // Calculate delegation rewards and add them to the delegation pool + uint256 delegationRewards = _collectDelegationIndexingRewards(_indexer, totalRewards); + uint256 indexerRewards = totalRewards - delegationRewards; + + // Send the indexer rewards + _sendRewards(indexerRewards, _indexer, __DEPRECATED_rewardsDestination[_indexer] == address(0)); + } + + /** + * @dev 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 + */ + function _sendRewards(uint256 _tokens, address _beneficiary, bool _restake) private { + if (_tokens == 0) return; + + if (_restake) { + // Restake to place fees into the indexer stake + _stake(_beneficiary, _tokens); + } else { + // Transfer funds to the beneficiary's designated rewards destination if set + address destination = __DEPRECATED_rewardsDestination[_beneficiary]; + _graphToken().pushTokens(destination == address(0) ? _beneficiary : destination, _tokens); + } + } + + /** + * @dev Close an allocation and free the staked tokens. + * @param _allocationID The allocation identifier + * @param _poi Proof of indexing submitted for the allocated period + */ + function _closeAllocation(address _allocationID, bytes32 _poi) private { + // Allocation must exist and be active + AllocationState allocState = _getAllocationState(_allocationID); + require(allocState == AllocationState.Active, "!active"); + + // Get allocation + Allocation memory alloc = __DEPRECATED_allocations[_allocationID]; + + // Validate that an allocation cannot be closed before one epoch + alloc.closedAtEpoch = _graphEpochManager().currentEpoch(); + uint256 epochs = MathUtils.diffOrZero(alloc.closedAtEpoch, alloc.createdAtEpoch); + + // Indexer or operator can close an allocation + // Anyone is allowed to close ONLY under two concurrent conditions + // - After maxAllocationEpochs passed + // - When the allocation is for non-zero amount of tokens + bool isIndexerOrOperator = msg.sender == alloc.indexer || isOperator(msg.sender, alloc.indexer); + if (epochs <= __DEPRECATED_maxAllocationEpochs || alloc.tokens == 0) { + require(isIndexerOrOperator, "!auth"); + } + + // -- Rewards Distribution -- + + // Process non-zero-allocation rewards tracking + if (alloc.tokens > 0) { + // Distribute rewards if proof of indexing was presented by the indexer or operator + if (isIndexerOrOperator && _poi != 0 && epochs > 0) { + _distributeRewards(_allocationID, alloc.indexer); + } else { + _updateRewards(alloc.subgraphDeploymentID); + } + + // Free allocated tokens from use + _serviceProviders[alloc.indexer].__DEPRECATED_tokensAllocated = + _serviceProviders[alloc.indexer].__DEPRECATED_tokensAllocated - alloc.tokens; + + // Track total allocations per subgraph + // Used for rewards calculations + __DEPRECATED_subgraphAllocations[alloc.subgraphDeploymentID] = + __DEPRECATED_subgraphAllocations[alloc.subgraphDeploymentID] - alloc.tokens; + } + + // Close the allocation + // Note that this breaks CEI pattern. We update after the rewards distribution logic as it expects the allocation + // to still be active. There shouldn't be reentrancy risk here as all internal calls are to trusted contracts. + __DEPRECATED_allocations[_allocationID].closedAtEpoch = alloc.closedAtEpoch; + + emit AllocationClosed( + alloc.indexer, + alloc.subgraphDeploymentID, + alloc.closedAtEpoch, + alloc.tokens, + _allocationID, + msg.sender, + _poi, + !isIndexerOrOperator + ); + } + + /** + * @dev 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 + * @return Amount of delegation rewards + */ + function _collectDelegationQueryRewards(address _indexer, uint256 _tokens) private returns (uint256) { + uint256 delegationRewards = 0; + DelegationPoolInternal storage pool = _legacyDelegationPools[_indexer]; + if (pool.tokens > 0 && uint256(pool.__DEPRECATED_queryFeeCut).isValidPPM()) { + uint256 indexerCut = uint256(pool.__DEPRECATED_queryFeeCut).mulPPM(_tokens); + delegationRewards = _tokens - indexerCut; + pool.tokens = pool.tokens + delegationRewards; + } + return delegationRewards; + } + + /** + * @dev 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 + * @return Amount of delegation rewards + */ + function _collectDelegationIndexingRewards(address _indexer, uint256 _tokens) private returns (uint256) { + uint256 delegationRewards = 0; + DelegationPoolInternal storage pool = _legacyDelegationPools[_indexer]; + if (pool.tokens > 0 && uint256(pool.__DEPRECATED_indexingRewardCut).isValidPPM()) { + uint256 indexerCut = uint256(pool.__DEPRECATED_indexingRewardCut).mulPPM(_tokens); + delegationRewards = _tokens - indexerCut; + pool.tokens = pool.tokens + delegationRewards; + } + return delegationRewards; + } + + /** + * @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 + * @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 + * @return Amount of curation fees + */ + function _collectCurationFees( + bytes32 _subgraphDeploymentID, + uint256 _tokens, + uint256 _curationCut + ) private returns (uint256) { + if (_tokens == 0) { + return 0; + } + + ICuration curation = _graphCuration(); + bool isCurationEnabled = _curationCut > 0 && address(curation) != address(0); + + if (isCurationEnabled && curation.isCurated(_subgraphDeploymentID)) { + uint256 curationFees = _tokens.mulPPMRoundUp(_curationCut); + 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 + _graphRewardsManager().onSubgraphSignalUpdate(_subgraphDeploymentID); + _graphToken().pushTokens(address(curation), curationFees); + curation.collect(_subgraphDeploymentID, curationFees); + } + return curationFees; + } + return 0; + } + + /** + * @dev Return the current state of an allocation + * @param _allocationID Allocation identifier + * @return AllocationState enum with the state of the allocation + */ + function _getAllocationState(address _allocationID) private view returns (AllocationState) { + Allocation storage alloc = __DEPRECATED_allocations[_allocationID]; + + if (alloc.indexer == address(0)) { + return AllocationState.Null; + } + + if (alloc.createdAtEpoch != 0 && alloc.closedAtEpoch == 0) { + return AllocationState.Active; + } + + return AllocationState.Closed; + } +} diff --git a/packages/horizon/contracts/staking/HorizonStakingStorage.sol b/packages/horizon/contracts/staking/HorizonStakingStorage.sol new file mode 100644 index 000000000..19dc65f11 --- /dev/null +++ b/packages/horizon/contracts/staking/HorizonStakingStorage.sol @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +/* solhint-disable max-states-count */ + +/** + * @title HorizonStakingV1Storage + * @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 + * bugs. We may have an active bug bounty program. + */ +abstract contract HorizonStakingV1Storage { + // -- Staking -- + + /// @dev Minimum amount of tokens an indexer needs to stake. + /// Deprecated, now enforced by each data service (verifier) + uint256 internal __DEPRECATED_minimumIndexerStake; + + /// @dev Time in blocks to unstake + /// Deprecated, now enforced by each data service (verifier) + uint32 internal __DEPRECATED_thawingPeriod; // in blocks + + /// @dev Percentage of fees going to curators + /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) + /// Deprecated, now enforced by each data service (verifier) + uint32 internal __DEPRECATED_curationPercentage; + + /// @dev Percentage of fees burned as protocol fee + /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) + /// Deprecated, now enforced by each data service (verifier) + uint32 internal __DEPRECATED_protocolPercentage; + + /// @dev Period for allocation to be finalized + /// Deprecated with exponential rebates. + uint32 private __DEPRECATED_channelDisputeEpochs; + + /// @dev Maximum allocation time. + /// Deprecated, allocations now live on the subgraph service contract. + uint32 internal __DEPRECATED_maxAllocationEpochs; + + /// @dev Rebate alpha numerator + /// Originally used for Cobb-Douglas rebates, now used for exponential rebates + /// Deprecated, any rebate mechanism is now applied on the subgraph data service. + uint32 internal __DEPRECATED_alphaNumerator; + + /// @dev Rebate alpha denominator + /// Originally used for Cobb-Douglas rebates, now used for exponential rebates + /// Deprecated, any rebate mechanism is now applied on the subgraph data service. + uint32 internal __DEPRECATED_alphaDenominator; + + /// @dev Service providers details, tracks stake utilization. + mapping(address serviceProvider => IHorizonStakingTypes.ServiceProviderInternal details) internal _serviceProviders; + + /// @dev Allocation details. + /// Deprecated, now applied on the subgraph data service + mapping(address allocationId => IHorizonStakingExtension.Allocation allocation) internal __DEPRECATED_allocations; + + /// @dev Subgraph allocations, tracks the tokens allocated to a subgraph deployment + /// Deprecated, now applied on the SubgraphService + mapping(bytes32 subgraphDeploymentId => uint256 tokens) internal __DEPRECATED_subgraphAllocations; + + /// @dev Rebate pool details per epoch + /// Deprecated with exponential rebates. + mapping(uint256 epoch => uint256 rebates) private __DEPRECATED_rebates; + + // -- Slashing -- + + /// @dev List of addresses allowed to slash stakes + /// Deprecated, now each verifier can slash the corresponding provision. + mapping(address slasher => bool allowed) internal __DEPRECATED_slashers; + + // -- Delegation -- + + /// @dev Delegation capacity multiplier defined by the delegation ratio + /// Deprecated, enforced by each data service as needed. + uint32 internal __DEPRECATED_delegationRatio; + + /// @dev Time in blocks an indexer needs to wait to change delegation parameters + /// Deprecated, enforced by each data service as needed. + uint32 internal __DEPRECATED_delegationParametersCooldown; + + /// @dev Time in epochs a delegator needs to wait to withdraw delegated stake + /// Deprecated, now only enforced during a transition period + uint32 internal __DEPRECATED_delegationUnbondingPeriod; + + /// @dev Percentage of tokens to tax a delegation deposit + /// Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%) + /// Deprecated, no tax is applied now. + uint32 internal __DEPRECATED_delegationTaxPercentage; + + /// @dev Delegation pools (legacy). + /// Only used when the verifier is the subgraph data service. + mapping(address serviceProvider => IHorizonStakingTypes.DelegationPoolInternal delegationPool) + internal _legacyDelegationPools; + + // -- Operators -- + + /// @dev Operator allow list (legacy) + /// Only used when the verifier is the subgraph data service. + mapping(address serviceProvider => mapping(address legacyOperator => bool authorized)) internal _legacyOperatorAuth; + + // -- Asset Holders -- + + /// @dev Asset holder allow list + /// Deprecated with permissionless payers + mapping(address assetHolder => bool allowed) private __DEPRECATED_assetHolders; + + /// @dev Destination of accrued indexing rewards + /// Deprecated, defined by each data service as needed + mapping(address serviceProvider => address rewardsDestination) internal __DEPRECATED_rewardsDestination; + + /// @dev Address of the counterpart Staking contract on L1/L2 + /// Deprecated, transfer tools no longer enabled. + address internal __DEPRECATED_counterpartStakingAddress; + + /// @dev Address of the StakingExtension implementation + /// This is now an immutable variable to save some gas. + address internal __DEPRECATED_extensionImpl; + + /// @dev Rebate lambda numerator for exponential rebates + /// Deprecated, any rebate mechanism is now applied on the subgraph data service. + uint32 internal __DEPRECATED_lambdaNumerator; + + /// @dev Rebate lambda denominator for exponential rebates + /// Deprecated, any rebate mechanism is now applied on the subgraph data service. + uint32 internal __DEPRECATED_lambdaDenominator; + + // -- Horizon Staking -- + + /// @dev Maximum thawing period, in seconds, for a provision + /// Note that to protect delegation from being unfairly locked this should be set to a sufficiently low value + /// Additionally note that setting this to a high enough value could lead to overflow when calculating thawing until + /// dates. For practical purposes this should not be an issue but we recommend using a value like 1e18 to represent + /// "infinite thawing" if that is the intent. + uint64 internal _maxThawingPeriod; + + /// @dev Provisions from each service provider for each data service + mapping(address serviceProvider => mapping(address verifier => IHorizonStakingTypes.Provision provision)) + internal _provisions; + + /// @dev Delegation fee cuts for each service provider on each provision, by fee type: + /// This is the effective delegator fee cuts for each (data-service-defined) fee type (e.g. indexing fees, query fees). + /// This is in PPM and is the cut taken by the service provider from the fees that correspond to delegators. + /// (based on stake vs delegated stake proportion). + /// The cuts are applied in GraphPayments so apply to all data services that use it. + mapping(address serviceProvider => mapping(address verifier => mapping(IGraphPayments.PaymentTypes paymentType => uint256 feeCut))) + internal _delegationFeeCut; + + /// @dev Thaw requests + /// Details for each thawing operation in the staking contract (for both service providers and delegators). + mapping(IHorizonStakingTypes.ThawRequestType thawRequestType => mapping(bytes32 thawRequestId => IHorizonStakingTypes.ThawRequest thawRequest)) + internal _thawRequests; + + /// @dev Thaw request lists + /// Metadata defining linked lists of thaw requests for each service provider or delegator (owner) + mapping(IHorizonStakingTypes.ThawRequestType thawRequestType => mapping(address serviceProvider => mapping(address verifier => mapping(address owner => ILinkedList.List list)))) + internal _thawRequestLists; + + /// @dev Operator allow list + /// Used for all verifiers except the subgraph data service. + mapping(address serviceProvider => mapping(address verifier => mapping(address operator => bool authorized))) + internal _operatorAuth; + + /// @dev Flag to enable or disable delegation slashing + bool internal _delegationSlashingEnabled; + + /// @dev Delegation pools for each service provider and verifier + mapping(address serviceProvider => mapping(address verifier => IHorizonStakingTypes.DelegationPoolInternal delegationPool)) + internal _delegationPools; + + /// @dev Allowed verifiers for locked provisions (i.e. from GraphTokenLockWallets) + // Verifiers are whitelisted to ensure locked tokens cannot escape using an arbitrary verifier. + mapping(address verifier => bool allowed) internal _allowedLockedVerifiers; +} diff --git a/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol b/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol new file mode 100644 index 000000000..b137079b3 --- /dev/null +++ b/packages/horizon/contracts/staking/libraries/ExponentialRebates.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { LibFixedMath } from "../../libraries/LibFixedMath.sol"; + +/** + * @title ExponentialRebates library + * @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. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +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. + function exponentialRebates( + uint256 fees, + uint256 stake, + uint32 alphaNumerator, + uint32 alphaDenominator, + uint32 lambdaNumerator, + uint32 lambdaDenominator + ) external pure returns (uint256) { + // If alpha is zero indexer gets 100% fees rebate + int256 alpha = LibFixedMath.toFixed(int32(alphaNumerator), int32(alphaDenominator)); + if (alpha == 0) { + return fees; + } + + // No rebates if no fees... + if (fees == 0) { + return 0; + } + + // Award all fees as rebate if the exponent is too large + int256 lambda = LibFixedMath.toFixed(int32(lambdaNumerator), int32(lambdaDenominator)); + int256 exponent = LibFixedMath.mulDiv(lambda, int256(stake), int256(fees)); + if (LibFixedMath.toInteger(exponent) > int256(uint256(MAX_EXPONENT))) { + return fees; + } + + // Compute `1 - alpha * exp ^(-exponent)` + int256 factor = LibFixedMath.sub(LibFixedMath.one(), LibFixedMath.mul(alpha, LibFixedMath.exp(-exponent))); + + // Weight the fees by the factor + return LibFixedMath.uintMul(factor, fees); + } +} diff --git a/packages/horizon/contracts/staking/utilities/Managed.sol b/packages/horizon/contracts/staking/utilities/Managed.sol new file mode 100644 index 000000000..b2e36056f --- /dev/null +++ b/packages/horizon/contracts/staking/utilities/Managed.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { GraphDirectory } from "../../utilities/GraphDirectory.sol"; + +/* solhint-disable var-name-mixedcase */ + +/** + * @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} + * 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 + * bugs. We may have an active bug bounty program. + */ +abstract contract Managed is GraphDirectory { + // -- State -- + + /// @notice Controller that manages this contract + address private __DEPRECATED_controller; + + /// @dev Cache for the addresses of the contracts retrieved from the controller + mapping(bytes32 contractName => address contractAddress) private __DEPRECATED_addressCache; + + /// @dev Gap for future storage variables + uint256[10] private __gap; + + /** + * @notice Thrown when a protected function is called and the contract is paused. + */ + error ManagedIsPaused(); + + /** + * @notice Thrown when a the caller is not the expected controller address. + */ + error ManagedOnlyController(); + + /** + * @notice Thrown when a the caller is not the governor. + */ + error ManagedOnlyGovernor(); + + /** + * @dev Revert if the controller is paused + */ + modifier notPaused() { + require(!_graphController().paused(), ManagedIsPaused()); + _; + } + + /** + * @dev Revert if the caller is not the governor + */ + modifier onlyGovernor() { + require(msg.sender == _graphController().getGovernor(), ManagedOnlyGovernor()); + _; + } + + /** + * @dev 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 new file mode 100644 index 000000000..3c77e951e --- /dev/null +++ b/packages/horizon/contracts/utilities/Authorizable.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +/** + * @title Authorizable contract + * @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. + * @dev Contract uses "authorizeSignerProof" as the domain for signer proofs. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +abstract contract Authorizable is IAuthorizable { + /// @notice The duration (in seconds) for which an authorization is thawing before it can be revoked + uint256 public immutable REVOKE_AUTHORIZATION_THAWING_PERIOD; + + /// @notice Authorization details for authorizer-signer pairs + mapping(address signer => Authorization authorization) public authorizations; + + /** + * @dev Revert if the caller has not authorized the signer + * @param signer The address of the signer + */ + modifier onlyAuthorized(address signer) { + _requireAuthorized(msg.sender, signer); + _; + } + + /** + * @notice Constructs a new instance of the Authorizable contract. + * @param revokeAuthorizationThawingPeriod The duration (in seconds) for which an authorization is thawing before it can be revoked. + */ + constructor(uint256 revokeAuthorizationThawingPeriod) { + REVOKE_AUTHORIZATION_THAWING_PERIOD = revokeAuthorizationThawingPeriod; + } + + /// @inheritdoc IAuthorizable + function authorizeSigner(address signer, uint256 proofDeadline, bytes calldata proof) external { + require( + authorizations[signer].authorizer == address(0), + AuthorizableSignerAlreadyAuthorized( + authorizations[signer].authorizer, + signer, + authorizations[signer].revoked + ) + ); + _verifyAuthorizationProof(proof, proofDeadline, signer); + authorizations[signer].authorizer = msg.sender; + emit SignerAuthorized(msg.sender, signer); + } + + /// @inheritdoc IAuthorizable + function thawSigner(address signer) external onlyAuthorized(signer) { + authorizations[signer].thawEndTimestamp = block.timestamp + REVOKE_AUTHORIZATION_THAWING_PERIOD; + emit SignerThawing(msg.sender, signer, authorizations[signer].thawEndTimestamp); + } + + /// @inheritdoc IAuthorizable + function cancelThawSigner(address signer) external onlyAuthorized(signer) { + require(authorizations[signer].thawEndTimestamp > 0, AuthorizableSignerNotThawing(signer)); + uint256 thawEnd = authorizations[signer].thawEndTimestamp; + authorizations[signer].thawEndTimestamp = 0; + emit SignerThawCanceled(msg.sender, signer, thawEnd); + } + + /// @inheritdoc IAuthorizable + function revokeAuthorizedSigner(address signer) external onlyAuthorized(signer) { + uint256 thawEndTimestamp = authorizations[signer].thawEndTimestamp; + require(thawEndTimestamp > 0, AuthorizableSignerNotThawing(signer)); + require(thawEndTimestamp <= block.timestamp, AuthorizableSignerStillThawing(block.timestamp, thawEndTimestamp)); + authorizations[signer].revoked = true; + emit SignerRevoked(msg.sender, signer); + } + + /// @inheritdoc IAuthorizable + function getThawEnd(address signer) external view returns (uint256) { + return authorizations[signer].thawEndTimestamp; + } + + /// @inheritdoc IAuthorizable + function isAuthorized(address authorizer, address signer) external view returns (bool) { + return _isAuthorized(authorizer, signer); + } + + /** + * @notice Returns true if the signer is authorized by the authorizer + * @param _authorizer The address of the authorizer + * @param _signer The address of the signer + * @return true if the signer is authorized by the authorizer, false otherwise + */ + function _isAuthorized(address _authorizer, address _signer) internal view returns (bool) { + return (_authorizer != address(0) && + authorizations[_signer].authorizer == _authorizer && + !authorizations[_signer].revoked); + } + + /** + * @notice Reverts if the authorizer has not authorized the signer + * @param _authorizer The address of the authorizer + * @param _signer The address of the signer + */ + function _requireAuthorized(address _authorizer, address _signer) internal view { + require(_isAuthorized(_authorizer, _signer), AuthorizableSignerNotAuthorized(_authorizer, _signer)); + } + + /** + * @notice Verify the authorization proof provided by the authorizer + * @param _proof The proof provided by the authorizer + * @param _proofDeadline The deadline by which the proof must be verified + * @param _signer The authorization recipient + */ + function _verifyAuthorizationProof(bytes calldata _proof, uint256 _proofDeadline, address _signer) private view { + // Check that the proofDeadline has not passed + require( + _proofDeadline > block.timestamp, + AuthorizableInvalidSignerProofDeadline(_proofDeadline, block.timestamp) + ); + + // Generate the message hash + bytes32 messageHash = keccak256( + abi.encodePacked(block.chainid, address(this), "authorizeSignerProof", _proofDeadline, msg.sender) + ); + + // Generate the allegedly signed digest + bytes32 digest = MessageHashUtils.toEthSignedMessageHash(messageHash); + + // Verify that the recovered signer matches the to be authorized signer + require(ECDSA.recover(digest, _proof) == _signer, AuthorizableInvalidSignerProof()); + } +} diff --git a/packages/horizon/contracts/utilities/GraphDirectory.sol b/packages/horizon/contracts/utilities/GraphDirectory.sol new file mode 100644 index 000000000..469410c8b --- /dev/null +++ b/packages/horizon/contracts/utilities/GraphDirectory.sol @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; + +import { IController } from "@graphprotocol/interfaces/contracts/contracts/governance/IController.sol"; +import { IEpochManager } from "@graphprotocol/interfaces/contracts/contracts/epochs/IEpochManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; +import { ITokenGateway } from "@graphprotocol/interfaces/contracts/contracts/arbitrum/ITokenGateway.sol"; +import { IGraphProxyAdmin } from "@graphprotocol/interfaces/contracts/contracts/upgrades/IGraphProxyAdmin.sol"; + +import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curation/ICuration.sol"; + +/** + * @title GraphDirectory contract + * @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, + * and uses immutable variables to minimize gas costs. + */ +abstract contract GraphDirectory { + // -- Graph Horizon contracts -- + + /// @notice The Graph Token contract address + IGraphToken private immutable GRAPH_TOKEN; + + /// @notice The Horizon Staking contract address + IHorizonStaking private immutable GRAPH_STAKING; + + /// @notice The Graph Payments contract address + IGraphPayments private immutable GRAPH_PAYMENTS; + + /// @notice The Payments Escrow contract address + IPaymentsEscrow private immutable GRAPH_PAYMENTS_ESCROW; + + // -- Graph periphery contracts -- + + /// @notice The Graph Controller contract address + IController private immutable GRAPH_CONTROLLER; + + /// @notice The Epoch Manager contract address + IEpochManager private immutable GRAPH_EPOCH_MANAGER; + + /// @notice The Rewards Manager contract address + IRewardsManager private immutable GRAPH_REWARDS_MANAGER; + + /// @notice The Token Gateway contract address + ITokenGateway private immutable GRAPH_TOKEN_GATEWAY; + + /// @notice The Graph Proxy Admin contract address + IGraphProxyAdmin private immutable GRAPH_PROXY_ADMIN; + + // -- Legacy Graph contracts -- + // These are required for backwards compatibility on HorizonStakingExtension + // TRANSITION PERIOD: remove these once HorizonStakingExtension is removed + + /// @notice The Curation contract address + ICuration private immutable GRAPH_CURATION; + + /** + * @notice Emitted when the GraphDirectory is initialized + * @param graphToken The Graph Token contract address + * @param graphStaking The Horizon Staking contract address + * @param graphPayments The Graph Payments contract address + * @param graphEscrow The Payments Escrow contract address + * @param graphController The Graph Controller contract address + * @param graphEpochManager The Epoch Manager contract address + * @param graphRewardsManager The Rewards Manager contract address + * @param graphTokenGateway The Token Gateway contract address + * @param graphProxyAdmin The Graph Proxy Admin contract address + * @param graphCuration The Curation contract address + */ + event GraphDirectoryInitialized( + address indexed graphToken, + address indexed graphStaking, + address graphPayments, + address graphEscrow, + address indexed graphController, + address graphEpochManager, + address graphRewardsManager, + address graphTokenGateway, + address graphProxyAdmin, + address graphCuration + ); + + /** + * @notice Thrown when either the controller is the zero address or a contract address is not found + * on the controller + * @param contractName The name of the contract that was not found, or the controller + */ + error GraphDirectoryInvalidZeroAddress(bytes contractName); + + /** + * @notice Constructor for the GraphDirectory contract + * @dev Requirements: + * - `controller` cannot be zero address + * + * Emits a {GraphDirectoryInitialized} event + * + * @param controller The address of the Graph Controller contract. + */ + constructor(address controller) { + require(controller != address(0), GraphDirectoryInvalidZeroAddress("Controller")); + + GRAPH_CONTROLLER = IController(controller); + GRAPH_TOKEN = IGraphToken(_getContractFromController("GraphToken")); + GRAPH_STAKING = IHorizonStaking(_getContractFromController("Staking")); + GRAPH_PAYMENTS = IGraphPayments(_getContractFromController("GraphPayments")); + GRAPH_PAYMENTS_ESCROW = IPaymentsEscrow(_getContractFromController("PaymentsEscrow")); + GRAPH_EPOCH_MANAGER = IEpochManager(_getContractFromController("EpochManager")); + GRAPH_REWARDS_MANAGER = IRewardsManager(_getContractFromController("RewardsManager")); + GRAPH_TOKEN_GATEWAY = ITokenGateway(_getContractFromController("GraphTokenGateway")); + GRAPH_PROXY_ADMIN = IGraphProxyAdmin(_getContractFromController("GraphProxyAdmin")); + GRAPH_CURATION = ICuration(_getContractFromController("Curation")); + + emit GraphDirectoryInitialized( + address(GRAPH_TOKEN), + address(GRAPH_STAKING), + address(GRAPH_PAYMENTS), + address(GRAPH_PAYMENTS_ESCROW), + address(GRAPH_CONTROLLER), + address(GRAPH_EPOCH_MANAGER), + address(GRAPH_REWARDS_MANAGER), + address(GRAPH_TOKEN_GATEWAY), + address(GRAPH_PROXY_ADMIN), + address(GRAPH_CURATION) + ); + } + + /** + * @notice Get the Graph Token contract + * @return The Graph Token contract + */ + function _graphToken() internal view returns (IGraphToken) { + return GRAPH_TOKEN; + } + + /** + * @notice Get the Horizon Staking contract + * @return The Horizon Staking contract + */ + function _graphStaking() internal view returns (IHorizonStaking) { + return GRAPH_STAKING; + } + + /** + * @notice Get the Graph Payments contract + * @return The Graph Payments contract + */ + function _graphPayments() internal view returns (IGraphPayments) { + return GRAPH_PAYMENTS; + } + + /** + * @notice Get the Payments Escrow contract + * @return The Payments Escrow contract + */ + function _graphPaymentsEscrow() internal view returns (IPaymentsEscrow) { + return GRAPH_PAYMENTS_ESCROW; + } + + /** + * @notice Get the Graph Controller contract + * @return The Graph Controller contract + */ + function _graphController() internal view returns (IController) { + return GRAPH_CONTROLLER; + } + + /** + * @notice Get the Epoch Manager contract + * @return The Epoch Manager contract + */ + function _graphEpochManager() internal view returns (IEpochManager) { + return GRAPH_EPOCH_MANAGER; + } + + /** + * @notice Get the Rewards Manager contract + * @return The Rewards Manager contract address + */ + function _graphRewardsManager() internal view returns (IRewardsManager) { + return GRAPH_REWARDS_MANAGER; + } + + /** + * @notice Get the Graph Token Gateway contract + * @return The Graph Token Gateway contract + */ + function _graphTokenGateway() internal view returns (ITokenGateway) { + return GRAPH_TOKEN_GATEWAY; + } + + /** + * @notice Get the Graph Proxy Admin contract + * @return The Graph Proxy Admin contract + */ + function _graphProxyAdmin() internal view returns (IGraphProxyAdmin) { + return GRAPH_PROXY_ADMIN; + } + + /** + * @notice Get the Curation contract + * @return The Curation contract + */ + function _graphCuration() internal view returns (ICuration) { + return GRAPH_CURATION; + } + + /** + * @notice Get a contract address from the controller + * @dev Requirements: + * - The `_contractName` must be registered in the controller + * @param _contractName The name of the contract to fetch from the controller + * @return The address of the contract + */ + function _getContractFromController(bytes memory _contractName) private view returns (address) { + address contractAddress = GRAPH_CONTROLLER.getContractProxy(keccak256(_contractName)); + require(contractAddress != address(0), GraphDirectoryInvalidZeroAddress(_contractName)); + return contractAddress; + } +} diff --git a/packages/horizon/foundry.toml b/packages/horizon/foundry.toml new file mode 100644 index 000000000..654dd9abe --- /dev/null +++ b/packages/horizon/foundry.toml @@ -0,0 +1,9 @@ +[profile.default] +src = 'contracts' +out = 'build' +libs = ["node_modules"] +test = 'test' +cache_path = 'cache_forge' +fs_permissions = [{ access = "read", path = "./"}] +optimizer = true +optimizer_runs = 100 diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts new file mode 100644 index 000000000..c8adb8628 --- /dev/null +++ b/packages/horizon/hardhat.config.ts @@ -0,0 +1,44 @@ +// Hardhat plugins +import '@nomicfoundation/hardhat-foundry' +import '@nomicfoundation/hardhat-toolbox' +import '@nomicfoundation/hardhat-ignition-ethers' +import 'hardhat-contract-sizer' +import 'hardhat-secure-accounts' +import 'hardhat-graph-protocol' + +import { hardhatBaseConfig, isProjectBuilt, loadTasks } from '@graphprotocol/toolshed/hardhat' +import type { HardhatUserConfig } from 'hardhat/types' + +// Some tasks need compiled artifacts to run so we avoid loading them when building the project +if (isProjectBuilt(__dirname)) { + loadTasks(__dirname) +} + +const baseConfig = hardhatBaseConfig(require) +const config: HardhatUserConfig = { + ...baseConfig, + solidity: { + version: '0.8.27', + settings: { + optimizer: { + enabled: true, + runs: 20, + }, + }, + }, + etherscan: { + ...baseConfig.etherscan, + customChains: [ + { + network: 'arbitrumSepolia', + chainId: 421614, + urls: { + apiURL: 'https://api-sepolia.arbiscan.io/api', + browserURL: 'https://sepolia.arbiscan.io/', + }, + }, + ], + }, +} + +export default config diff --git a/packages/horizon/ignition/configs/migrate.default.json5 b/packages/horizon/ignition/configs/migrate.default.json5 new file mode 100644 index 000000000..546b4287f --- /dev/null +++ b/packages/horizon/ignition/configs/migrate.default.json5 @@ -0,0 +1,45 @@ +{ + "$global": { + // Accounts already configured in the original Graph Protocol - Arbitrum Sepolia values + "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + + // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values + "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "gnsAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + + // Must be set for step 2 of the migration + "graphPaymentsAddress": "", + "paymentsEscrowAddress": "", + + // Must be set for step 3 and 4 of the migration + "subgraphServiceAddress": "", + + // Must be set for step 4 of the migration + "horizonStakingImplementationAddress": "", + "curationImplementationAddress": "", + "rewardsManagerImplementationAddress": "", + + // Global parameters + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "GraphTallyCollector": { + "eip712Name": "GraphTallyCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + } +} diff --git a/packages/horizon/ignition/configs/migrate.fork1.json5 b/packages/horizon/ignition/configs/migrate.fork1.json5 new file mode 100644 index 000000000..543cc3443 --- /dev/null +++ b/packages/horizon/ignition/configs/migrate.fork1.json5 @@ -0,0 +1,45 @@ +{ + "$global": { + // Accounts already configured in the original Graph Protocol - Arbitrum Sepolia values + "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + + // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values + "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "gnsAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + + // Must be set for step 2 of the migration + "graphPaymentsAddress": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "paymentsEscrowAddress": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0", + + // Must be set for step 3 and 4 of the migration + "subgraphServiceAddress": "0x8A44C49eD477e7130249d4B8d5248d08B469Bf0d", + + // Must be set for step 4 of the migration + "horizonStakingImplementationAddress": "0xf1b9D089f5f6dEd46EC88830051db0e68c58e032", + "curationImplementationAddress": "0x9CCD9B656f8A558879974ef2505496eEd7Ef7210", + "rewardsManagerImplementationAddress": "0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4", + + // Global parameters + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "GraphTallyCollector": { + "eip712Name": "GraphTallyCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + } +} diff --git a/packages/horizon/ignition/configs/migrate.integration.json5 b/packages/horizon/ignition/configs/migrate.integration.json5 new file mode 100644 index 000000000..35b3e4547 --- /dev/null +++ b/packages/horizon/ignition/configs/migrate.integration.json5 @@ -0,0 +1,45 @@ +{ + "$global": { + // Accounts + "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", + + // Addresses for contracts deployed in the original Graph Protocol + "graphProxyAdminAddress": "0x7474a6cc5fAeDEc620Db0fa8E4da6eD58477042C", + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "horizonStakingAddress": "0x865365C425f3A593Ffe698D9c4E6707D14d51e08", + "epochManagerAddress": "0x88b3C7f37253bAA1A9b95feAd69bD5320585826D", + "graphTokenAddress": "0xf8c05dCF59E8B28BFD5eed176C562bEbcfc7Ac04", + "graphTokenGatewayAddress": "0xB24Ce0f8c18c4DdDa584A7EeC132F49C966813bb", + "rewardsManagerAddress": "0x1F49caE7669086c8ba53CC35d1E9f80176d67E79", + "curationAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "gnsAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + + // Must be set for step 2 of the migration + "graphPaymentsAddress": "", + "paymentsEscrowAddress": "", + + // Must be set for step 3 and 4 of the migration + "subgraphServiceAddress": "", + + // Must be set for step 4 of the migration + "horizonStakingImplementationAddress": "", + "curationImplementationAddress": "", + "rewardsManagerImplementationAddress": "", + + // Global parameters + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "GraphTallyCollector": { + "eip712Name": "GraphTallyCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + } +} diff --git a/packages/horizon/ignition/configs/protocol.default.json5 b/packages/horizon/ignition/configs/protocol.default.json5 new file mode 100644 index 000000000..538561aa1 --- /dev/null +++ b/packages/horizon/ignition/configs/protocol.default.json5 @@ -0,0 +1,39 @@ +{ + "$global": { + // Accounts for new deployment - derived from hardhat default mnemonic + "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", // index 3 + "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", // index 4 + + // Placeholder address for a standalone Horizon deployment, see README.md for more details + "subgraphServiceAddress": "0x0000000000000000000000000000000000000000", + + // Global parameters + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "GraphTallyCollector": { + "eip712Name": "GraphTallyCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + }, + "RewardsManager": { + "issuancePerBlock": "114155251141552511415n" + }, + "EpochManager": { + "epochLength": 60 + }, + "L2Curation": { + "curationTaxPercentage": 10000, + "minimumCurationDeposit": 1 + }, + "L2GraphToken": { + "initialSupply": "10000000000000000000000000000n" + }, + + +} diff --git a/packages/horizon/ignition/configs/protocol.localNetwork.json5 b/packages/horizon/ignition/configs/protocol.localNetwork.json5 new file mode 100644 index 000000000..cea86ca46 --- /dev/null +++ b/packages/horizon/ignition/configs/protocol.localNetwork.json5 @@ -0,0 +1,39 @@ +{ + "$global": { + // Accounts for new deployment - derived from hardhat default mnemonic + "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", // index 3 + "subgraphAvailabilityOracle": "0xd03ea8624C8C5987235048901fB614fDcA89b117", // index 4 + + // Placeholder address for a standalone Horizon deployment, see README.md for more details + "subgraphServiceAddress": "0x0000000000000000000000000000000000000000", + + // Global parameters + "maxThawingPeriod": 2419200 + }, + "GraphPayments": { + "protocolPaymentCut": 10000 + }, + "PaymentsEscrow": { + "withdrawEscrowThawingPeriod": 10000 + }, + "GraphTallyCollector": { + "eip712Name": "GraphTallyCollector", + "eip712Version": "1", + "revokeSignerThawingPeriod": 10000 + }, + "RewardsManager": { + "issuancePerBlock": "114155251141552511415n" + }, + "EpochManager": { + "epochLength": 60, // Note that localNetwork does not auto-mine blocks, so this could be any amount of time in seconds + }, + "L2Curation": { + "curationTaxPercentage": 10000, + "minimumCurationDeposit": 1 + }, + "L2GraphToken": { + "initialSupply": "10000000000000000000000000000n" + }, + + +} diff --git a/packages/horizon/ignition/modules/core/GraphPayments.ts b/packages/horizon/ignition/modules/core/GraphPayments.ts new file mode 100644 index 000000000..4ce5ec3e0 --- /dev/null +++ b/packages/horizon/ignition/modules/core/GraphPayments.ts @@ -0,0 +1,79 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import GraphPaymentsArtifact from '../../../build/contracts/contracts/payments/GraphPayments.sol/GraphPayments.json' +import GraphPeripheryModule, { MigratePeripheryModule } from '../periphery/periphery' +import { deployImplementation } from '../proxy/implementation' +import { upgradeTransparentUpgradeableProxy } from '../proxy/TransparentUpgradeableProxy' +import HorizonProxiesModule, { MigrateHorizonProxiesDeployerModule } from './HorizonProxies' + +export default buildModule('GraphPayments', (m) => { + const { Controller } = m.useModule(GraphPeripheryModule) + const { GraphPaymentsProxyAdmin, GraphPaymentsProxy } = m.useModule(HorizonProxiesModule) + + const governor = m.getAccount(1) + const protocolPaymentCut = m.getParameter('protocolPaymentCut') + + // Deploy GraphPayments implementation - requires periphery and proxies to be registered in the controller + const GraphPaymentsImplementation = deployImplementation( + m, + { + name: 'GraphPayments', + artifact: GraphPaymentsArtifact, + constructorArgs: [Controller, protocolPaymentCut], + }, + { after: [GraphPeripheryModule, HorizonProxiesModule] }, + ) + + // Upgrade proxy to implementation contract + const GraphPayments = upgradeTransparentUpgradeableProxy( + m, + GraphPaymentsProxyAdmin, + GraphPaymentsProxy, + GraphPaymentsImplementation, + { + name: 'GraphPayments', + artifact: GraphPaymentsArtifact, + initArgs: [], + }, + ) + + m.call(GraphPaymentsProxyAdmin, 'transferOwnership', [governor], { after: [GraphPayments] }) + + return { GraphPayments, GraphPaymentsProxyAdmin, GraphPaymentsImplementation } +}) + +// Note that this module requires MigrateHorizonProxiesGovernorModule to be executed first +// The dependency is not made explicit to support the production workflow where the governor is a +// multisig owned by the Graph Council. +// For testnet, the dependency can be made explicit by having a parent module establish it. +export const MigrateGraphPaymentsModule = buildModule('GraphPayments', (m) => { + const { GraphPaymentsProxyAdmin, GraphPaymentsProxy } = m.useModule(MigrateHorizonProxiesDeployerModule) + const { Controller } = m.useModule(MigratePeripheryModule) + + const governor = m.getParameter('governor') + const protocolPaymentCut = m.getParameter('protocolPaymentCut') + + // Deploy GraphPayments implementation + const GraphPaymentsImplementation = deployImplementation(m, { + name: 'GraphPayments', + artifact: GraphPaymentsArtifact, + constructorArgs: [Controller, protocolPaymentCut], + }) + + // Upgrade proxy to implementation contract + const GraphPayments = upgradeTransparentUpgradeableProxy( + m, + GraphPaymentsProxyAdmin, + GraphPaymentsProxy, + GraphPaymentsImplementation, + { + name: 'GraphPayments', + artifact: GraphPaymentsArtifact, + initArgs: [], + }, + ) + + m.call(GraphPaymentsProxyAdmin, 'transferOwnership', [governor], { after: [GraphPayments] }) + + return { GraphPayments, GraphPaymentsProxyAdmin, GraphPaymentsImplementation } +}) diff --git a/packages/horizon/ignition/modules/core/GraphTallyCollector.ts b/packages/horizon/ignition/modules/core/GraphTallyCollector.ts new file mode 100644 index 000000000..0f1ada87e --- /dev/null +++ b/packages/horizon/ignition/modules/core/GraphTallyCollector.ts @@ -0,0 +1,43 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import GraphTallyCollectorArtifact from '../../../build/contracts/contracts/payments/collectors/GraphTallyCollector.sol/GraphTallyCollector.json' +import GraphPeripheryModule, { MigratePeripheryModule } from '../periphery/periphery' +import HorizonProxiesModule from './HorizonProxies' + +export default buildModule('GraphTallyCollector', (m) => { + const { Controller } = m.useModule(GraphPeripheryModule) + + const name = m.getParameter('eip712Name') + const version = m.getParameter('eip712Version') + const revokeSignerThawingPeriod = m.getParameter('revokeSignerThawingPeriod') + + const GraphTallyCollector = m.contract( + 'GraphTallyCollector', + GraphTallyCollectorArtifact, + [name, version, Controller, revokeSignerThawingPeriod], + { after: [GraphPeripheryModule, HorizonProxiesModule] }, + ) + + return { GraphTallyCollector } +}) + +// Note that this module requires MigrateHorizonProxiesGovernorModule to be executed first +// The dependency is not made explicit to support the production workflow where the governor is a +// multisig owned by the Graph Council. +// For testnet, the dependency can be made explicit by having a parent module establish it. +export const MigrateGraphTallyCollectorModule = buildModule('GraphTallyCollector', (m) => { + const { Controller } = m.useModule(MigratePeripheryModule) + + const name = m.getParameter('eip712Name') + const version = m.getParameter('eip712Version') + const revokeSignerThawingPeriod = m.getParameter('revokeSignerThawingPeriod') + + const GraphTallyCollector = m.contract('GraphTallyCollector', GraphTallyCollectorArtifact, [ + name, + version, + Controller, + revokeSignerThawingPeriod, + ]) + + return { GraphTallyCollector } +}) diff --git a/packages/horizon/ignition/modules/core/HorizonProxies.ts b/packages/horizon/ignition/modules/core/HorizonProxies.ts new file mode 100644 index 000000000..21bee0a1b --- /dev/null +++ b/packages/horizon/ignition/modules/core/HorizonProxies.ts @@ -0,0 +1,90 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' +import { ethers } from 'ethers' + +import GraphPaymentsArtifact from '../../../build/contracts/contracts/payments/GraphPayments.sol/GraphPayments.json' +import PaymentsEscrowArtifact from '../../../build/contracts/contracts/payments/PaymentsEscrow.sol/PaymentsEscrow.json' +import { MigrateControllerGovernorModule } from '../periphery/Controller' +import GraphPeripheryModule from '../periphery/periphery' +import { deployGraphProxy } from '../proxy/GraphProxy' +import { deployTransparentUpgradeableProxy } from '../proxy/TransparentUpgradeableProxy' + +// HorizonStaking, GraphPayments and PaymentsEscrow use GraphDirectory but they are also in the directory. +// So we need to deploy their proxies, register them in the controller before being able to deploy the implementations +export default buildModule('HorizonProxies', (m) => { + const { Controller, GraphProxyAdmin } = m.useModule(GraphPeripheryModule) + + // Deploy HorizonStaking proxy with no implementation + const HorizonStakingProxy = deployGraphProxy(m, GraphProxyAdmin) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Staking')), HorizonStakingProxy], { + id: 'setContractProxy_HorizonStaking', + }) + + // Deploy and register GraphPayments proxy + const { Proxy: GraphPaymentsProxy, ProxyAdmin: GraphPaymentsProxyAdmin } = deployTransparentUpgradeableProxy(m, { + name: 'GraphPayments', + artifact: GraphPaymentsArtifact, + }) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), GraphPaymentsProxy], { + id: 'setContractProxy_GraphPayments', + }) + + // Deploy and register PaymentsEscrow proxy + const { Proxy: PaymentsEscrowProxy, ProxyAdmin: PaymentsEscrowProxyAdmin } = deployTransparentUpgradeableProxy(m, { + name: 'PaymentsEscrow', + artifact: PaymentsEscrowArtifact, + }) + m.call( + Controller, + 'setContractProxy', + [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), PaymentsEscrowProxy], + { id: 'setContractProxy_PaymentsEscrow' }, + ) + + return { + HorizonStakingProxy, + GraphPaymentsProxy, + PaymentsEscrowProxy, + GraphPaymentsProxyAdmin, + PaymentsEscrowProxyAdmin, + } +}) + +export const MigrateHorizonProxiesDeployerModule = buildModule('HorizonProxiesDeployer', (m) => { + // Deploy GraphPayments proxy + const { Proxy: GraphPaymentsProxy, ProxyAdmin: GraphPaymentsProxyAdmin } = deployTransparentUpgradeableProxy(m, { + name: 'GraphPayments', + artifact: GraphPaymentsArtifact, + }) + + // Deploy PaymentsEscrow proxy + const { Proxy: PaymentsEscrowProxy, ProxyAdmin: PaymentsEscrowProxyAdmin } = deployTransparentUpgradeableProxy(m, { + name: 'PaymentsEscrow', + artifact: PaymentsEscrowArtifact, + }) + + return { GraphPaymentsProxy, PaymentsEscrowProxy, GraphPaymentsProxyAdmin, PaymentsEscrowProxyAdmin } +}) + +export const MigrateHorizonProxiesGovernorModule = buildModule('HorizonProxiesGovernor', (m) => { + const { Controller } = m.useModule(MigrateControllerGovernorModule) + + const graphPaymentsAddress = m.getParameter('graphPaymentsAddress') + const paymentsEscrowAddress = m.getParameter('paymentsEscrowAddress') + + // Register proxies in controller + m.call( + Controller, + 'setContractProxy', + [ethers.keccak256(ethers.toUtf8Bytes('GraphPayments')), graphPaymentsAddress], + { id: 'setContractProxy_GraphPayments' }, + ) + + m.call( + Controller, + 'setContractProxy', + [ethers.keccak256(ethers.toUtf8Bytes('PaymentsEscrow')), paymentsEscrowAddress], + { id: 'setContractProxy_PaymentsEscrow' }, + ) + + return {} +}) diff --git a/packages/horizon/ignition/modules/core/HorizonStaking.ts b/packages/horizon/ignition/modules/core/HorizonStaking.ts new file mode 100644 index 000000000..59735cce2 --- /dev/null +++ b/packages/horizon/ignition/modules/core/HorizonStaking.ts @@ -0,0 +1,108 @@ +import GraphProxyArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' +import GraphProxyAdminArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxyAdmin.sol/GraphProxyAdmin.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import HorizonStakingArtifact from '../../../build/contracts/contracts/staking/HorizonStaking.sol/HorizonStaking.json' +import HorizonStakingExtensionArtifact from '../../../build/contracts/contracts/staking/HorizonStakingExtension.sol/HorizonStakingExtension.json' +import ExponentialRebatesArtifact from '../../../build/contracts/contracts/staking/libraries/ExponentialRebates.sol/ExponentialRebates.json' +import GraphPeripheryModule, { MigratePeripheryModule } from '../periphery/periphery' +import { upgradeGraphProxy } from '../proxy/GraphProxy' +import { deployImplementation } from '../proxy/implementation' +import HorizonProxiesModule from './HorizonProxies' + +export default buildModule('HorizonStaking', (m) => { + const { Controller, GraphProxyAdmin } = m.useModule(GraphPeripheryModule) + const { HorizonStakingProxy } = m.useModule(HorizonProxiesModule) + + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + const maxThawingPeriod = m.getParameter('maxThawingPeriod') + + // Deploy HorizonStakingExtension - requires periphery and proxies to be registered in the controller + const ExponentialRebates = m.library('ExponentialRebates', ExponentialRebatesArtifact) + const HorizonStakingExtension = m.contract( + 'HorizonStakingExtension', + HorizonStakingExtensionArtifact, + [Controller, subgraphServiceAddress], + { + libraries: { + ExponentialRebates: ExponentialRebates, + }, + after: [GraphPeripheryModule, HorizonProxiesModule], + }, + ) + + // Deploy HorizonStaking implementation + const HorizonStakingImplementation = deployImplementation(m, { + name: 'HorizonStaking', + artifact: HorizonStakingArtifact, + constructorArgs: [Controller, HorizonStakingExtension, subgraphServiceAddress], + }) + + // Upgrade proxy to implementation contract + const HorizonStaking = upgradeGraphProxy(m, GraphProxyAdmin, HorizonStakingProxy, HorizonStakingImplementation, { + name: 'HorizonStaking', + artifact: HorizonStakingArtifact, + }) + m.call(HorizonStaking, 'setMaxThawingPeriod', [maxThawingPeriod]) + + return { HorizonStaking, HorizonStakingImplementation } +}) + +// Note that this module requires MigrateHorizonProxiesGovernorModule to be executed first +// The dependency is not made explicit to support the production workflow where the governor is a +// multisig owned by the Graph Council. +// For testnet, the dependency can be made explicit by having a parent module establish it. +export const MigrateHorizonStakingDeployerModule = buildModule('HorizonStakingDeployer', (m) => { + const { Controller } = m.useModule(MigratePeripheryModule) + + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + const horizonStakingAddress = m.getParameter('horizonStakingAddress') + + const HorizonStakingProxy = m.contractAt('HorizonStakingProxy', GraphProxyArtifact, horizonStakingAddress) + + // Deploy HorizonStakingExtension - requires periphery and proxies to be registered in the controller + const ExponentialRebates = m.library('ExponentialRebates', ExponentialRebatesArtifact) + const HorizonStakingExtension = m.contract( + 'HorizonStakingExtension', + HorizonStakingExtensionArtifact, + [Controller, subgraphServiceAddress], + { + libraries: { + ExponentialRebates: ExponentialRebates, + }, + }, + ) + + // Deploy HorizonStaking implementation + const HorizonStakingImplementation = deployImplementation(m, { + name: 'HorizonStaking', + artifact: HorizonStakingArtifact, + constructorArgs: [Controller, HorizonStakingExtension, subgraphServiceAddress], + }) + + return { HorizonStakingProxy, HorizonStakingImplementation } +}) + +export const MigrateHorizonStakingGovernorModule = buildModule('HorizonStakingGovernor', (m) => { + const maxThawingPeriod = m.getParameter('maxThawingPeriod') + const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') + const horizonStakingAddress = m.getParameter('horizonStakingAddress') + const horizonStakingImplementationAddress = m.getParameter('horizonStakingImplementationAddress') + + const HorizonStakingImplementation = m.contractAt( + 'HorizonStakingImplementation', + HorizonStakingArtifact, + horizonStakingImplementationAddress, + ) + const HorizonStakingProxy = m.contractAt('HorizonStakingProxy', GraphProxyArtifact, horizonStakingAddress) + const GraphProxyAdmin = m.contractAt('GraphProxyAdmin', GraphProxyAdminArtifact, graphProxyAdminAddress) + + // Upgrade proxy to implementation contract + const HorizonStaking = upgradeGraphProxy(m, GraphProxyAdmin, HorizonStakingProxy, HorizonStakingImplementation, { + name: 'HorizonStaking', + artifact: HorizonStakingArtifact, + }) + m.call(HorizonStaking, 'setMaxThawingPeriod', [maxThawingPeriod]) + + return { HorizonStaking, HorizonStakingImplementation } +}) diff --git a/packages/horizon/ignition/modules/core/PaymentsEscrow.ts b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts new file mode 100644 index 000000000..432e50743 --- /dev/null +++ b/packages/horizon/ignition/modules/core/PaymentsEscrow.ts @@ -0,0 +1,79 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import PaymentsEscrowArtifact from '../../../build/contracts/contracts/payments/PaymentsEscrow.sol/PaymentsEscrow.json' +import GraphPeripheryModule, { MigratePeripheryModule } from '../periphery/periphery' +import { deployImplementation } from '../proxy/implementation' +import { upgradeTransparentUpgradeableProxy } from '../proxy/TransparentUpgradeableProxy' +import HorizonProxiesModule, { MigrateHorizonProxiesDeployerModule } from './HorizonProxies' + +export default buildModule('PaymentsEscrow', (m) => { + const { Controller } = m.useModule(GraphPeripheryModule) + const { PaymentsEscrowProxyAdmin, PaymentsEscrowProxy } = m.useModule(HorizonProxiesModule) + + const governor = m.getAccount(1) + const withdrawEscrowThawingPeriod = m.getParameter('withdrawEscrowThawingPeriod') + + // Deploy PaymentsEscrow implementation - requires periphery and proxies to be registered in the controller + const PaymentsEscrowImplementation = deployImplementation( + m, + { + name: 'PaymentsEscrow', + artifact: PaymentsEscrowArtifact, + constructorArgs: [Controller, withdrawEscrowThawingPeriod], + }, + { after: [GraphPeripheryModule, HorizonProxiesModule] }, + ) + + // Upgrade proxy to implementation contract + const PaymentsEscrow = upgradeTransparentUpgradeableProxy( + m, + PaymentsEscrowProxyAdmin, + PaymentsEscrowProxy, + PaymentsEscrowImplementation, + { + name: 'PaymentsEscrow', + artifact: PaymentsEscrowArtifact, + initArgs: [], + }, + ) + + m.call(PaymentsEscrowProxyAdmin, 'transferOwnership', [governor], { after: [PaymentsEscrow] }) + + return { PaymentsEscrow, PaymentsEscrowProxyAdmin, PaymentsEscrowImplementation } +}) + +// Note that this module requires MigrateHorizonProxiesGovernorModule to be executed first +// The dependency is not made explicit to support the production workflow where the governor is a +// multisig owned by the Graph Council. +// For testnet, the dependency can be made explicit by having a parent module establish it. +export const MigratePaymentsEscrowModule = buildModule('PaymentsEscrow', (m) => { + const { PaymentsEscrowProxyAdmin, PaymentsEscrowProxy } = m.useModule(MigrateHorizonProxiesDeployerModule) + const { Controller } = m.useModule(MigratePeripheryModule) + + const governor = m.getParameter('governor') + const withdrawEscrowThawingPeriod = m.getParameter('withdrawEscrowThawingPeriod') + + // Deploy PaymentsEscrow implementation + const PaymentsEscrowImplementation = deployImplementation(m, { + name: 'PaymentsEscrow', + artifact: PaymentsEscrowArtifact, + constructorArgs: [Controller, withdrawEscrowThawingPeriod], + }) + + // Upgrade proxy to implementation contract + const PaymentsEscrow = upgradeTransparentUpgradeableProxy( + m, + PaymentsEscrowProxyAdmin, + PaymentsEscrowProxy, + PaymentsEscrowImplementation, + { + name: 'PaymentsEscrow', + artifact: PaymentsEscrowArtifact, + initArgs: [], + }, + ) + + m.call(PaymentsEscrowProxyAdmin, 'transferOwnership', [governor], { after: [PaymentsEscrow] }) + + return { PaymentsEscrow, PaymentsEscrowProxyAdmin, PaymentsEscrowImplementation } +}) diff --git a/packages/horizon/ignition/modules/core/core.ts b/packages/horizon/ignition/modules/core/core.ts new file mode 100644 index 000000000..c71ae232b --- /dev/null +++ b/packages/horizon/ignition/modules/core/core.ts @@ -0,0 +1,44 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import GraphPaymentsModule, { MigrateGraphPaymentsModule } from './GraphPayments' +import GraphTallyCollectorModule, { MigrateGraphTallyCollectorModule } from './GraphTallyCollector' +import HorizonStakingModule, { MigrateHorizonStakingDeployerModule } from './HorizonStaking' +import PaymentsEscrowModule, { MigratePaymentsEscrowModule } from './PaymentsEscrow' + +export default buildModule('GraphHorizon_Core', (m) => { + const { HorizonStaking, HorizonStakingImplementation } = m.useModule(HorizonStakingModule) + const { GraphPaymentsProxyAdmin, GraphPayments, GraphPaymentsImplementation } = m.useModule(GraphPaymentsModule) + const { PaymentsEscrowProxyAdmin, PaymentsEscrow, PaymentsEscrowImplementation } = m.useModule(PaymentsEscrowModule) + const { GraphTallyCollector } = m.useModule(GraphTallyCollectorModule) + + return { + HorizonStaking, + HorizonStakingImplementation, + GraphPaymentsProxyAdmin, + GraphPayments, + GraphPaymentsImplementation, + PaymentsEscrowProxyAdmin, + PaymentsEscrow, + PaymentsEscrowImplementation, + GraphTallyCollector, + } +}) + +export const MigrateHorizonCoreModule = buildModule('GraphHorizon_Core', (m) => { + const { HorizonStakingProxy: HorizonStaking, HorizonStakingImplementation } = m.useModule( + MigrateHorizonStakingDeployerModule, + ) + const { GraphPayments, GraphPaymentsImplementation } = m.useModule(MigrateGraphPaymentsModule) + const { PaymentsEscrow, PaymentsEscrowImplementation } = m.useModule(MigratePaymentsEscrowModule) + const { GraphTallyCollector } = m.useModule(MigrateGraphTallyCollectorModule) + + return { + HorizonStaking, + HorizonStakingImplementation, + GraphPayments, + GraphPaymentsImplementation, + PaymentsEscrow, + PaymentsEscrowImplementation, + GraphTallyCollector, + } +}) diff --git a/packages/horizon/ignition/modules/deploy.ts b/packages/horizon/ignition/modules/deploy.ts new file mode 100644 index 000000000..f2f5fecde --- /dev/null +++ b/packages/horizon/ignition/modules/deploy.ts @@ -0,0 +1,78 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import GraphHorizonCoreModule from './core/core' +import GraphPeripheryModule from './periphery/periphery' + +export default buildModule('GraphHorizon_Deploy', (m) => { + const { + Controller, + EpochManager, + EpochManagerImplementation, + GraphProxyAdmin, + L2GraphTokenGateway, + L2GraphTokenGatewayImplementation, + L2GraphToken, + L2GraphTokenImplementation, + RewardsManager, + RewardsManagerImplementation, + L2Curation, + L2CurationImplementation, + L2GNS, + L2GNSImplementation, + SubgraphNFT, + } = m.useModule(GraphPeripheryModule) + const { + HorizonStaking, + HorizonStakingImplementation, + GraphPaymentsProxyAdmin, + GraphPayments, + GraphPaymentsImplementation, + PaymentsEscrowProxyAdmin, + PaymentsEscrow, + PaymentsEscrowImplementation, + GraphTallyCollector, + } = m.useModule(GraphHorizonCoreModule) + + const governor = m.getAccount(1) + + // BUG?: acceptOwnership should be called after everything in GraphHorizonCoreModule and GraphPeripheryModule is resolved + // but it seems that it's not waiting for interal calls. Waiting on HorizonStaking seems to fix the issue for some reason + // Removing HorizonStaking from the after list will trigger the bug + + // Accept ownership of Graph Governed based contracts + m.call(Controller, 'acceptOwnership', [], { + from: governor, + after: [GraphPeripheryModule, GraphHorizonCoreModule, HorizonStaking], + }) + m.call(GraphProxyAdmin, 'acceptOwnership', [], { + from: governor, + after: [GraphPeripheryModule, GraphHorizonCoreModule, HorizonStaking], + }) + + return { + Controller, + Graph_Proxy_EpochManager: EpochManager, + Implementation_EpochManager: EpochManagerImplementation, + Graph_Proxy_L2Curation: L2Curation, + Implementation_L2Curation: L2CurationImplementation, + Graph_Proxy_L2GNS: L2GNS, + Implementation_L2GNS: L2GNSImplementation, + SubgraphNFT, + Graph_Proxy_RewardsManager: RewardsManager, + Implementation_RewardsManager: RewardsManagerImplementation, + Graph_Proxy_L2GraphTokenGateway: L2GraphTokenGateway, + Implementation_L2GraphTokenGateway: L2GraphTokenGatewayImplementation, + Graph_Proxy_L2GraphToken: L2GraphToken, + Implementation_L2GraphToken: L2GraphTokenImplementation, + GraphProxyAdmin, + Graph_Proxy_HorizonStaking: HorizonStaking, + Implementation_HorizonStaking: HorizonStakingImplementation, + Transparent_ProxyAdmin_GraphPayments: GraphPaymentsProxyAdmin, + Transparent_Proxy_GraphPayments: GraphPayments, + Implementation_GraphPayments: GraphPaymentsImplementation, + Transparent_ProxyAdmin_PaymentsEscrow: PaymentsEscrowProxyAdmin, + Transparent_Proxy_PaymentsEscrow: PaymentsEscrow, + Implementation_PaymentsEscrow: PaymentsEscrowImplementation, + GraphTallyCollector, + } +}) diff --git a/packages/horizon/ignition/modules/index.ts b/packages/horizon/ignition/modules/index.ts new file mode 100644 index 000000000..5933a3300 --- /dev/null +++ b/packages/horizon/ignition/modules/index.ts @@ -0,0 +1,4 @@ +export { default as HorizonModule } from './deploy' +export { deployImplementation } from './proxy/implementation' +export { deployTransparentUpgradeableProxy } from './proxy/TransparentUpgradeableProxy' +export { upgradeTransparentUpgradeableProxy } from './proxy/TransparentUpgradeableProxy' diff --git a/packages/horizon/ignition/modules/migrate/migrate-1.ts b/packages/horizon/ignition/modules/migrate/migrate-1.ts new file mode 100644 index 000000000..86624f73b --- /dev/null +++ b/packages/horizon/ignition/modules/migrate/migrate-1.ts @@ -0,0 +1,16 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import { MigrateHorizonProxiesDeployerModule } from '../core/HorizonProxies' + +export default buildModule('GraphHorizon_Migrate_1', (m) => { + const { GraphPaymentsProxy, PaymentsEscrowProxy, GraphPaymentsProxyAdmin, PaymentsEscrowProxyAdmin } = m.useModule( + MigrateHorizonProxiesDeployerModule, + ) + + return { + Transparent_Proxy_GraphPayments: GraphPaymentsProxy, + Transparent_Proxy_PaymentsEscrow: PaymentsEscrowProxy, + Transparent_ProxyAdmin_GraphPayments: GraphPaymentsProxyAdmin, + Transparent_ProxyAdmin_PaymentsEscrow: PaymentsEscrowProxyAdmin, + } +}) diff --git a/packages/horizon/ignition/modules/migrate/migrate-2.ts b/packages/horizon/ignition/modules/migrate/migrate-2.ts new file mode 100644 index 000000000..7b59217e4 --- /dev/null +++ b/packages/horizon/ignition/modules/migrate/migrate-2.ts @@ -0,0 +1,9 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import { MigrateHorizonProxiesGovernorModule } from '../core/HorizonProxies' + +export default buildModule('GraphHorizon_Migrate_2', (m) => { + m.useModule(MigrateHorizonProxiesGovernorModule) + + return {} +}) diff --git a/packages/horizon/ignition/modules/migrate/migrate-3.ts b/packages/horizon/ignition/modules/migrate/migrate-3.ts new file mode 100644 index 000000000..94e1ac5b0 --- /dev/null +++ b/packages/horizon/ignition/modules/migrate/migrate-3.ts @@ -0,0 +1,53 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import { MigrateHorizonCoreModule } from '../core/core' +import { MigratePeripheryModule } from '../periphery/periphery' + +export default buildModule('GraphHorizon_Migrate_3', (m) => { + const { + L2Curation, + L2CurationImplementation, + RewardsManager, + RewardsManagerImplementation, + Controller, + GraphProxyAdmin, + EpochManager, + L2GraphToken, + L2GraphTokenGateway, + L2GNS, + L2GNSImplementation, + SubgraphNFT, + } = m.useModule(MigratePeripheryModule) + + const { + HorizonStaking, + HorizonStakingImplementation, + GraphPayments, + GraphPaymentsImplementation, + PaymentsEscrow, + PaymentsEscrowImplementation, + GraphTallyCollector, + } = m.useModule(MigrateHorizonCoreModule) + + return { + Graph_Proxy_L2Curation: L2Curation, + Implementation_L2Curation: L2CurationImplementation, + Graph_Proxy_L2GNS: L2GNS, + Implementation_L2GNS: L2GNSImplementation, + SubgraphNFT, + Graph_Proxy_RewardsManager: RewardsManager, + Implementation_RewardsManager: RewardsManagerImplementation, + Graph_Proxy_HorizonStaking: HorizonStaking, + Implementation_HorizonStaking: HorizonStakingImplementation, + Transparent_Proxy_GraphPayments: GraphPayments, + Implementation_GraphPayments: GraphPaymentsImplementation, + Transparent_Proxy_PaymentsEscrow: PaymentsEscrow, + Implementation_PaymentsEscrow: PaymentsEscrowImplementation, + GraphTallyCollector, + Controller: Controller, + GraphProxyAdmin, + Graph_Proxy_EpochManager: EpochManager, + Graph_Proxy_L2GraphToken: L2GraphToken, + Graph_Proxy_L2GraphTokenGateway: L2GraphTokenGateway, + } +}) diff --git a/packages/horizon/ignition/modules/migrate/migrate-4.ts b/packages/horizon/ignition/modules/migrate/migrate-4.ts new file mode 100644 index 000000000..896f852f9 --- /dev/null +++ b/packages/horizon/ignition/modules/migrate/migrate-4.ts @@ -0,0 +1,22 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import { MigrateHorizonStakingGovernorModule } from '../core/HorizonStaking' +import { MigrateCurationGovernorModule } from '../periphery/Curation' +import { MigrateRewardsManagerGovernorModule } from '../periphery/RewardsManager' + +export default buildModule('GraphHorizon_Migrate_4', (m) => { + const { L2Curation, L2CurationImplementation } = m.useModule(MigrateCurationGovernorModule) + + const { RewardsManager, RewardsManagerImplementation } = m.useModule(MigrateRewardsManagerGovernorModule) + + const { HorizonStaking, HorizonStakingImplementation } = m.useModule(MigrateHorizonStakingGovernorModule) + + return { + Graph_Proxy_L2Curation: L2Curation, + Implementation_L2Curation: L2CurationImplementation, + Graph_Proxy_RewardsManager: RewardsManager, + Implementation_RewardsManager: RewardsManagerImplementation, + Graph_Proxy_HorizonStaking: HorizonStaking, + Implementation_HorizonStaking: HorizonStakingImplementation, + } +}) diff --git a/packages/horizon/ignition/modules/periphery/Controller.ts b/packages/horizon/ignition/modules/periphery/Controller.ts new file mode 100644 index 000000000..dd6664925 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/Controller.ts @@ -0,0 +1,39 @@ +import ControllerArtifact from '@graphprotocol/contracts/artifacts/contracts/governance/Controller.sol/Controller.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' +import { ethers } from 'ethers' + +export default buildModule('Controller', (m) => { + const governor = m.getAccount(1) + const pauseGuardian = m.getParameter('pauseGuardian') + + const Controller = m.contract('Controller', ControllerArtifact) + m.call(Controller, 'setPauseGuardian', [pauseGuardian]) + m.call(Controller, 'setPaused', [false]) + m.call(Controller, 'transferOwnership', [governor]) + + return { Controller } +}) + +export const MigrateControllerDeployerModule = buildModule('ControllerDeployer', (m) => { + const controllerAddress = m.getParameter('controllerAddress') + + const Controller = m.contractAt('Controller', ControllerArtifact, controllerAddress) + + return { Controller } +}) + +export const MigrateControllerGovernorModule = buildModule('ControllerGovernor', (m) => { + const { Controller } = m.useModule(MigrateControllerDeployerModule) + + const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') + + // GraphProxyAdmin was not registered in the controller in the original protocol + m.call( + Controller, + 'setContractProxy', + [ethers.keccak256(ethers.toUtf8Bytes('GraphProxyAdmin')), graphProxyAdminAddress], + { id: 'setContractProxy_GraphProxyAdmin' }, + ) + + return { Controller } +}) diff --git a/packages/horizon/ignition/modules/periphery/Curation.ts b/packages/horizon/ignition/modules/periphery/Curation.ts new file mode 100644 index 000000000..ed177fba5 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/Curation.ts @@ -0,0 +1,78 @@ +import GraphCurationTokenArtifact from '@graphprotocol/contracts/artifacts/contracts/curation/GraphCurationToken.sol/GraphCurationToken.json' +import CurationArtifact from '@graphprotocol/contracts/artifacts/contracts/l2/curation/L2Curation.sol/L2Curation.json' +import GraphProxyArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' +import GraphProxyAdminArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxyAdmin.sol/GraphProxyAdmin.json' +import { buildModule, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' + +import { deployWithGraphProxy, upgradeGraphProxy } from '../proxy/GraphProxy' +import { deployImplementation } from '../proxy/implementation' +import ControllerModule from './Controller' +import GraphProxyAdminModule from './GraphProxyAdmin' + +// Curation deployment should be managed by ignition scripts in subgraph-service package however +// due to tight coupling with Controller it's easier to do it on the horizon package. + +export default buildModule('L2Curation', (m) => { + const { Controller } = m.useModule(ControllerModule) + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + + const curationTaxPercentage = m.getParameter('curationTaxPercentage') + const minimumCurationDeposit = m.getParameter('minimumCurationDeposit') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + + const GraphCurationToken = m.contract('GraphCurationToken', GraphCurationTokenArtifact, []) + + const { proxy: L2Curation, implementation: L2CurationImplementation } = deployWithGraphProxy(m, GraphProxyAdmin, { + name: 'L2Curation', + artifact: CurationArtifact, + initArgs: [Controller, GraphCurationToken, curationTaxPercentage, minimumCurationDeposit], + }) + m.call(L2Curation, 'setSubgraphService', [subgraphServiceAddress]) + + return { L2Curation, L2CurationImplementation } +}) + +export const MigrateCurationDeployerModule = buildModule('L2CurationDeployer', (m: IgnitionModuleBuilder) => { + const curationAddress = m.getParameter('curationAddress') + + const L2CurationProxy = m.contractAt('L2CurationProxy', GraphProxyArtifact, curationAddress) + + const implementationMetadata = { + name: 'L2Curation', + artifact: CurationArtifact, + } + const L2CurationImplementation = deployImplementation(m, implementationMetadata) + + return { L2CurationProxy, L2CurationImplementation } +}) + +export const MigrateCurationGovernorModule = buildModule('L2CurationGovernor', (m: IgnitionModuleBuilder) => { + const curationAddress = m.getParameter('curationAddress') + const curationImplementationAddress = m.getParameter('curationImplementationAddress') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') + + const GraphProxyAdmin = m.contractAt('GraphProxyAdmin', GraphProxyAdminArtifact, graphProxyAdminAddress) + const L2CurationProxy = m.contractAt('L2CurationProxy', GraphProxyArtifact, curationAddress) + const L2CurationImplementation = m.contractAt( + 'L2CurationImplementation', + CurationArtifact, + curationImplementationAddress, + ) + + const implementationMetadata = { + name: 'L2Curation', + artifact: CurationArtifact, + } + + const L2Curation = upgradeGraphProxy( + m, + GraphProxyAdmin, + L2CurationProxy, + L2CurationImplementation, + implementationMetadata, + ) + m.call(L2Curation, 'setSubgraphService', [subgraphServiceAddress]) + + return { L2Curation, L2CurationImplementation } +}) diff --git a/packages/horizon/ignition/modules/periphery/EpochManager.ts b/packages/horizon/ignition/modules/periphery/EpochManager.ts new file mode 100644 index 000000000..890b7064c --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/EpochManager.ts @@ -0,0 +1,29 @@ +import EpochManagerArtifact from '@graphprotocol/contracts/artifacts/contracts/epochs/EpochManager.sol/EpochManager.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import { deployWithGraphProxy } from '../proxy/GraphProxy' +import ControllerModule from './Controller' +import GraphProxyAdminModule from './GraphProxyAdmin' + +export default buildModule('EpochManager', (m) => { + const { Controller } = m.useModule(ControllerModule) + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + + const epochLength = m.getParameter('epochLength') + + const { proxy: EpochManager, implementation: EpochManagerImplementation } = deployWithGraphProxy(m, GraphProxyAdmin, { + name: 'EpochManager', + artifact: EpochManagerArtifact, + initArgs: [Controller, epochLength], + }) + + return { EpochManager, EpochManagerImplementation } +}) + +export const MigrateEpochManagerModule = buildModule('EpochManager', (m) => { + const epochManagerAddress = m.getParameter('epochManagerAddress') + + const EpochManager = m.contractAt('EpochManager', EpochManagerArtifact, epochManagerAddress) + + return { EpochManager } +}) diff --git a/packages/horizon/ignition/modules/periphery/GNS.ts b/packages/horizon/ignition/modules/periphery/GNS.ts new file mode 100644 index 000000000..71dc69e4b --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/GNS.ts @@ -0,0 +1,54 @@ +import SubgraphNFTArtifact from '@graphprotocol/contracts/artifacts/contracts/discovery/SubgraphNFT.sol/SubgraphNFT.json' +import SubgraphNFTDescriptorArtifact from '@graphprotocol/contracts/artifacts/contracts/discovery/SubgraphNFTDescriptor.sol/SubgraphNFTDescriptor.json' +import L2GNSArtifact from '@graphprotocol/contracts/artifacts/contracts/l2/discovery/L2GNS.sol/L2GNS.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import { deployWithGraphProxy } from '../proxy/GraphProxy' +import ControllerModule from './Controller' +import CurationModule from './Curation' +import GraphProxyAdminModule from './GraphProxyAdmin' +import GraphTokenModule from './GraphToken' + +// GNS deployment should be managed by ignition scripts in subgraph-service package however +// due to tight coupling with Controller it's easier to do it on the horizon package. + +export default buildModule('L2GNS', (m) => { + const { Controller } = m.useModule(ControllerModule) + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + const { L2GraphToken } = m.useModule(GraphTokenModule) + const { L2Curation } = m.useModule(CurationModule) + + const deployer = m.getAccount(0) + const governor = m.getAccount(1) + + const SubgraphNFTDescriptor = m.contract('SubgraphNFTDescriptor', SubgraphNFTDescriptorArtifact) + const SubgraphNFT = m.contract('SubgraphNFT', SubgraphNFTArtifact, [deployer]) + + m.call(SubgraphNFT, 'setTokenDescriptor', [SubgraphNFTDescriptor]) + + const { proxy: L2GNS, implementation: L2GNSImplementation } = deployWithGraphProxy(m, GraphProxyAdmin, { + name: 'L2GNS', + artifact: L2GNSArtifact, + initArgs: [Controller, SubgraphNFT], + }) + m.call(L2GNS, 'approveAll', [], { after: [L2GraphToken, L2Curation] }) + + const setMinterCall = m.call(SubgraphNFT, 'setMinter', [L2GNS]) + m.call(SubgraphNFT, 'transferOwnership', [governor], { after: [setMinterCall] }) + + return { L2GNS, L2GNSImplementation, SubgraphNFT } +}) + +// L2GNS and SubgraphNFT are already deployed and are not being upgraded +// This is a no-op to get the addresses into the address book +export const MigrateL2GNSModule = buildModule('L2GNS', (m) => { + const gnsProxyAddress = m.getParameter('gnsAddress') + const gnsImplementationAddress = m.getParameter('gnsImplementationAddress') + const subgraphNFTAddress = m.getParameter('subgraphNFTAddress') + + const SubgraphNFT = m.contractAt('SubgraphNFT', SubgraphNFTArtifact, subgraphNFTAddress) + const L2GNS = m.contractAt('L2GNS', L2GNSArtifact, gnsProxyAddress) + const L2GNSImplementation = m.contractAt('L2GNSAddressBook', L2GNSArtifact, gnsImplementationAddress) + + return { L2GNS, L2GNSImplementation, SubgraphNFT } +}) diff --git a/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts new file mode 100644 index 000000000..82d73ef39 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/GraphProxyAdmin.ts @@ -0,0 +1,19 @@ +import GraphProxyAdminArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxyAdmin.sol/GraphProxyAdmin.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +export default buildModule('GraphProxyAdmin', (m) => { + const governor = m.getAccount(1) + + const GraphProxyAdmin = m.contract('GraphProxyAdmin', GraphProxyAdminArtifact) + m.call(GraphProxyAdmin, 'transferOwnership', [governor]) + + return { GraphProxyAdmin } +}) + +export const MigrateGraphProxyAdminModule = buildModule('GraphProxyAdmin', (m) => { + const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') + + const GraphProxyAdmin = m.contractAt('GraphProxyAdmin', GraphProxyAdminArtifact, graphProxyAdminAddress) + + return { GraphProxyAdmin } +}) diff --git a/packages/horizon/ignition/modules/periphery/GraphToken.ts b/packages/horizon/ignition/modules/periphery/GraphToken.ts new file mode 100644 index 000000000..b962a5ed7 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/GraphToken.ts @@ -0,0 +1,46 @@ +import GraphTokenArtifact from '@graphprotocol/contracts/artifacts/contracts/l2/token/L2GraphToken.sol/L2GraphToken.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import GraphProxyAdminModule from '../periphery/GraphProxyAdmin' +import GraphTokenGatewayModule from '../periphery/GraphTokenGateway' +import RewardsManagerModule from '../periphery/RewardsManager' +import { deployWithGraphProxy } from '../proxy/GraphProxy' + +export default buildModule('L2GraphToken', (m) => { + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + const { RewardsManager } = m.useModule(RewardsManagerModule) + const { L2GraphTokenGateway } = m.useModule(GraphTokenGatewayModule) + + const deployer = m.getAccount(0) + const governor = m.getAccount(1) + const initialSupply = m.getParameter('initialSupply') + + const { proxy: L2GraphToken, implementation: L2GraphTokenImplementation } = deployWithGraphProxy(m, GraphProxyAdmin, { + name: 'L2GraphToken', + artifact: GraphTokenArtifact, + initArgs: [deployer], + }) + + const mintCall = m.call(L2GraphToken, 'mint', [deployer, initialSupply]) + const renounceMinterCall = m.call(L2GraphToken, 'renounceMinter', []) + const addMinterRewardsManagerCall = m.call(L2GraphToken, 'addMinter', [RewardsManager], { + id: 'addMinterRewardsManager', + }) + const addMinterGatewayCall = m.call(L2GraphToken, 'addMinter', [L2GraphTokenGateway], { id: 'addMinterGateway' }) + + // No further calls are needed so we can transfer ownership now + const transferOwnershipCall = m.call(L2GraphToken, 'transferOwnership', [governor], { + after: [mintCall, renounceMinterCall, addMinterRewardsManagerCall, addMinterGatewayCall], + }) + m.call(L2GraphToken, 'acceptOwnership', [], { from: governor, after: [transferOwnershipCall] }) + + return { L2GraphToken, L2GraphTokenImplementation } +}) + +export const MigrateGraphTokenModule = buildModule('L2GraphToken', (m) => { + const graphTokenAddress = m.getParameter('graphTokenAddress') + + const L2GraphToken = m.contractAt('L2GraphToken', GraphTokenArtifact, graphTokenAddress) + + return { L2GraphToken } +}) diff --git a/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts b/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts new file mode 100644 index 000000000..1ea115e73 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/GraphTokenGateway.ts @@ -0,0 +1,34 @@ +import GraphTokenGatewayArtifact from '@graphprotocol/contracts/artifacts/contracts/l2/gateway/L2GraphTokenGateway.sol/L2GraphTokenGateway.json' +import { buildModule } from '@nomicfoundation/ignition-core' + +import ControllerModule from '../periphery/Controller' +import GraphProxyAdminModule from '../periphery/GraphProxyAdmin' +import { deployWithGraphProxy } from '../proxy/GraphProxy' + +export default buildModule('L2GraphTokenGateway', (m) => { + const { Controller } = m.useModule(ControllerModule) + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + + const pauseGuardian = m.getParameter('pauseGuardian') + + const { proxy: L2GraphTokenGateway, implementation: L2GraphTokenGatewayImplementation } = deployWithGraphProxy( + m, + GraphProxyAdmin, + { + name: 'L2GraphTokenGateway', + artifact: GraphTokenGatewayArtifact, + initArgs: [Controller], + }, + ) + m.call(L2GraphTokenGateway, 'setPauseGuardian', [pauseGuardian]) + + return { L2GraphTokenGateway, L2GraphTokenGatewayImplementation } +}) + +export const MigrateGraphTokenGatewayModule = buildModule('L2GraphTokenGateway', (m) => { + const graphTokenGatewayAddress = m.getParameter('graphTokenGatewayAddress') + + const L2GraphTokenGateway = m.contractAt('L2GraphTokenGateway', GraphTokenGatewayArtifact, graphTokenGatewayAddress) + + return { L2GraphTokenGateway } +}) diff --git a/packages/horizon/ignition/modules/periphery/RewardsManager.ts b/packages/horizon/ignition/modules/periphery/RewardsManager.ts new file mode 100644 index 000000000..23937c2b3 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/RewardsManager.ts @@ -0,0 +1,79 @@ +import RewardsManagerArtifact from '@graphprotocol/contracts/artifacts/contracts/rewards/RewardsManager.sol/RewardsManager.json' +import GraphProxyArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' +import GraphProxyAdminArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxyAdmin.sol/GraphProxyAdmin.json' +import { buildModule, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' + +import { deployWithGraphProxy, upgradeGraphProxy } from '../proxy/GraphProxy' +import { deployImplementation } from '../proxy/implementation' +import ControllerModule from './Controller' +import GraphProxyAdminModule from './GraphProxyAdmin' + +export default buildModule('RewardsManager', (m) => { + const { Controller } = m.useModule(ControllerModule) + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + + const issuancePerBlock = m.getParameter('issuancePerBlock') + const subgraphAvailabilityOracle = m.getParameter('subgraphAvailabilityOracle') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + + const { proxy: RewardsManager, implementation: RewardsManagerImplementation } = deployWithGraphProxy( + m, + GraphProxyAdmin, + { + name: 'RewardsManager', + artifact: RewardsManagerArtifact, + initArgs: [Controller], + }, + ) + m.call(RewardsManager, 'setSubgraphAvailabilityOracle', [subgraphAvailabilityOracle]) + m.call(RewardsManager, 'setIssuancePerBlock', [issuancePerBlock]) + m.call(RewardsManager, 'setSubgraphService', [subgraphServiceAddress]) + + return { RewardsManager, RewardsManagerImplementation } +}) + +export const MigrateRewardsManagerDeployerModule = buildModule('RewardsManagerDeployer', (m: IgnitionModuleBuilder) => { + const rewardsManagerAddress = m.getParameter('rewardsManagerAddress') + + const RewardsManagerProxy = m.contractAt('RewardsManagerProxy', GraphProxyArtifact, rewardsManagerAddress) + + const implementationMetadata = { + name: 'RewardsManager', + artifact: RewardsManagerArtifact, + } + const RewardsManagerImplementation = deployImplementation(m, implementationMetadata) + + return { RewardsManagerProxy, RewardsManagerImplementation } +}) + +export const MigrateRewardsManagerGovernorModule = buildModule('RewardsManagerGovernor', (m: IgnitionModuleBuilder) => { + const rewardsManagerAddress = m.getParameter('rewardsManagerAddress') + const rewardsManagerImplementationAddress = m.getParameter('rewardsManagerImplementationAddress') + const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') + + const GraphProxyAdmin = m.contractAt('GraphProxyAdmin', GraphProxyAdminArtifact, graphProxyAdminAddress) + const RewardsManagerProxy = m.contractAt('RewardsManagerProxy', GraphProxyArtifact, rewardsManagerAddress) + const RewardsManagerImplementation = m.contractAt( + 'RewardsManagerImplementation', + RewardsManagerArtifact, + rewardsManagerImplementationAddress, + ) + + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') + + const implementationMetadata = { + name: 'RewardsManager', + artifact: RewardsManagerArtifact, + } + + const RewardsManager = upgradeGraphProxy( + m, + GraphProxyAdmin, + RewardsManagerProxy, + RewardsManagerImplementation, + implementationMetadata, + ) + m.call(RewardsManager, 'setSubgraphService', [subgraphServiceAddress]) + + return { RewardsManager, RewardsManagerImplementation } +}) diff --git a/packages/horizon/ignition/modules/periphery/periphery.ts b/packages/horizon/ignition/modules/periphery/periphery.ts new file mode 100644 index 000000000..589104cc5 --- /dev/null +++ b/packages/horizon/ignition/modules/periphery/periphery.ts @@ -0,0 +1,95 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' +import { ethers } from 'ethers' + +import ControllerModule, { MigrateControllerDeployerModule } from './Controller' +import CurationModule, { MigrateCurationDeployerModule } from './Curation' +import EpochManagerModule, { MigrateEpochManagerModule } from './EpochManager' +import GNSModule, { MigrateL2GNSModule } from './GNS' +import GraphProxyAdminModule, { MigrateGraphProxyAdminModule } from './GraphProxyAdmin' +import GraphTokenModule, { MigrateGraphTokenModule } from './GraphToken' +import GraphTokenGatewayModule, { MigrateGraphTokenGatewayModule } from './GraphTokenGateway' +import RewardsManagerModule, { MigrateRewardsManagerDeployerModule } from './RewardsManager' + +export default buildModule('GraphHorizon_Periphery', (m) => { + const { Controller } = m.useModule(ControllerModule) + const { GraphProxyAdmin } = m.useModule(GraphProxyAdminModule) + + const { EpochManager, EpochManagerImplementation } = m.useModule(EpochManagerModule) + const { L2Curation, L2CurationImplementation } = m.useModule(CurationModule) + const { L2GNS, L2GNSImplementation, SubgraphNFT } = m.useModule(GNSModule) + const { RewardsManager, RewardsManagerImplementation } = m.useModule(RewardsManagerModule) + const { L2GraphTokenGateway, L2GraphTokenGatewayImplementation } = m.useModule(GraphTokenGatewayModule) + const { L2GraphToken, L2GraphTokenImplementation } = m.useModule(GraphTokenModule) + + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('EpochManager')), EpochManager], { + id: 'setContractProxy_EpochManager', + }) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('RewardsManager')), RewardsManager], { + id: 'setContractProxy_RewardsManager', + }) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphToken')), L2GraphToken], { + id: 'setContractProxy_GraphToken', + }) + m.call( + Controller, + 'setContractProxy', + [ethers.keccak256(ethers.toUtf8Bytes('GraphTokenGateway')), L2GraphTokenGateway], + { id: 'setContractProxy_GraphTokenGateway' }, + ) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GraphProxyAdmin')), GraphProxyAdmin], { + id: 'setContractProxy_GraphProxyAdmin', + }) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('Curation')), L2Curation], { + id: 'setContractProxy_L2Curation', + }) + m.call(Controller, 'setContractProxy', [ethers.keccak256(ethers.toUtf8Bytes('GNS')), L2GNS], { + id: 'setContractProxy_L2GNS', + }) + + return { + Controller, + EpochManager, + EpochManagerImplementation, + L2Curation, + L2CurationImplementation, + L2GNS, + L2GNSImplementation, + SubgraphNFT, + GraphProxyAdmin, + L2GraphToken, + L2GraphTokenImplementation, + L2GraphTokenGateway, + L2GraphTokenGatewayImplementation, + RewardsManager, + RewardsManagerImplementation, + } +}) + +export const MigratePeripheryModule = buildModule('GraphHorizon_Periphery', (m) => { + const { L2CurationProxy: L2Curation, L2CurationImplementation } = m.useModule(MigrateCurationDeployerModule) + const { L2GNS, L2GNSImplementation, SubgraphNFT } = m.useModule(MigrateL2GNSModule) + const { RewardsManagerProxy: RewardsManager, RewardsManagerImplementation } = m.useModule( + MigrateRewardsManagerDeployerModule, + ) + const { Controller } = m.useModule(MigrateControllerDeployerModule) + const { GraphProxyAdmin } = m.useModule(MigrateGraphProxyAdminModule) + const { EpochManager } = m.useModule(MigrateEpochManagerModule) + const { L2GraphToken } = m.useModule(MigrateGraphTokenModule) + const { L2GraphTokenGateway } = m.useModule(MigrateGraphTokenGatewayModule) + + // Load these contracts so they are available in the address book + return { + Controller, + EpochManager, + L2Curation, + L2CurationImplementation, + L2GNS, + L2GNSImplementation, + SubgraphNFT, + GraphProxyAdmin, + L2GraphToken, + L2GraphTokenGateway, + RewardsManager, + RewardsManagerImplementation, + } +}) diff --git a/packages/horizon/ignition/modules/proxy/GraphProxy.ts b/packages/horizon/ignition/modules/proxy/GraphProxy.ts new file mode 100644 index 000000000..f9dc08de9 --- /dev/null +++ b/packages/horizon/ignition/modules/proxy/GraphProxy.ts @@ -0,0 +1,80 @@ +import GraphProxyArtifact from '@graphprotocol/contracts/artifacts/contracts/upgrades/GraphProxy.sol/GraphProxy.json' +import { + CallableContractFuture, + ContractFuture, + ContractOptions, + IgnitionModuleBuilder, +} from '@nomicfoundation/ignition-core' + +import { deployImplementation, type ImplementationMetadata } from './implementation' +import { loadProxyWithABI } from './utils' + +export function deployGraphProxy( + m: IgnitionModuleBuilder, + proxyAdmin: ContractFuture, + implementation?: ContractFuture, + metadata?: ImplementationMetadata, + options?: ContractOptions, +) { + if (implementation === undefined || metadata === undefined) { + const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + return m.contract('GraphProxy', GraphProxyArtifact, [ZERO_ADDRESS, proxyAdmin], options) + } else { + const GraphProxy = m.contract('GraphProxy', GraphProxyArtifact, [implementation, proxyAdmin], options) + return loadProxyWithABI(m, GraphProxy, metadata, options) + } +} + +export function upgradeGraphProxy( + m: IgnitionModuleBuilder, + proxyAdmin: CallableContractFuture, + proxy: CallableContractFuture, + implementation: ContractFuture, + metadata: ImplementationMetadata, + options?: ContractOptions, +) { + const upgradeCall = m.call(proxyAdmin, 'upgrade', [proxy, implementation], options) + const acceptCall = m.call(proxyAdmin, 'acceptProxy', [implementation, proxy], { ...options, after: [upgradeCall] }) + + return loadProxyWithABI(m, proxy, metadata, { ...options, after: [acceptCall] }) +} + +export function acceptUpgradeGraphProxy( + m: IgnitionModuleBuilder, + proxyAdmin: CallableContractFuture, + proxy: CallableContractFuture, + implementation: ContractFuture, + metadata: ImplementationMetadata, + options?: ContractOptions, +) { + const acceptCall = m.call(proxyAdmin, 'acceptProxy', [implementation, proxy], { ...options }) + + return loadProxyWithABI(m, proxy, metadata, { ...options, after: [acceptCall] }) +} + +export function deployWithGraphProxy( + m: IgnitionModuleBuilder, + proxyAdmin: CallableContractFuture, + metadata: ImplementationMetadata, + options?: ContractOptions, +) { + options = options || {} + + // Deploy implementation + const implementation = deployImplementation(m, metadata, options) + + // Deploy proxy and initialize + const proxy = deployGraphProxy(m, proxyAdmin, implementation, metadata, options) + if (metadata.initArgs === undefined) { + m.call(proxyAdmin, 'acceptProxy', [implementation, proxy], options) + } else { + m.call( + proxyAdmin, + 'acceptProxyAndCall', + [implementation, proxy, m.encodeFunctionCall(implementation, 'initialize', metadata.initArgs)], + options, + ) + } + + return { proxy, implementation } +} diff --git a/packages/horizon/ignition/modules/proxy/TransparentUpgradeableProxy.ts b/packages/horizon/ignition/modules/proxy/TransparentUpgradeableProxy.ts new file mode 100644 index 000000000..35e2ec5a4 --- /dev/null +++ b/packages/horizon/ignition/modules/proxy/TransparentUpgradeableProxy.ts @@ -0,0 +1,69 @@ +import { + CallableContractFuture, + ContractFuture, + ContractOptions, + IgnitionModuleBuilder, +} from '@nomicfoundation/ignition-core' + +import ProxyAdminArtifact from '../../../build/contracts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json' +import TransparentUpgradeableProxyArtifact from '../../../build/contracts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json' +// Importing artifacts from build directory so we have all build artifacts for contract verification +import DummyArtifact from '../../../build/contracts/contracts/mocks/Dummy.sol/Dummy.json' +import { ImplementationMetadata } from './implementation' +import { loadProxyWithABI } from './utils' + +// Deploy a TransparentUpgradeableProxy +// The TransparentUpgradeableProxy contract creates the ProxyAdmin within its constructor. +export function deployTransparentUpgradeableProxy( + m: IgnitionModuleBuilder, + metadata: ImplementationMetadata, + implementation?: ContractFuture, + options?: ContractOptions, +) { + const deployer = m.getAccount(0) + + // The proxy requires a valid contract as initial implementation so we use a dummy + if (implementation === undefined) { + implementation = m.contract('Dummy', DummyArtifact, [], { ...options, id: `OZProxyDummy_${metadata.name}` }) + } + + const Proxy = m.contract( + 'TransparentUpgradeableProxy', + TransparentUpgradeableProxyArtifact, + [implementation, deployer, '0x'], + { ...options, id: `TransparentUpgradeableProxy_${metadata.name}` }, + ) + + const proxyAdminAddress = m.readEventArgument(Proxy, 'AdminChanged', 'newAdmin', { + ...options, + id: `TransparentUpgradeableProxy_${metadata.name}_AdminChanged`, + }) + + const ProxyAdmin = m.contractAt('ProxyAdmin', ProxyAdminArtifact, proxyAdminAddress, { + ...options, + id: `ProxyAdmin_${metadata.name}`, + }) + + if (implementation !== undefined) { + return { ProxyAdmin, Proxy: loadProxyWithABI(m, Proxy, metadata, options) } + } else { + return { ProxyAdmin, Proxy } + } +} + +export function upgradeTransparentUpgradeableProxy( + m: IgnitionModuleBuilder, + proxyAdmin: CallableContractFuture, + proxy: CallableContractFuture, + implementation: CallableContractFuture, + metadata: ImplementationMetadata, + options?: ContractOptions, +) { + const upgradeCall = m.call( + proxyAdmin, + 'upgradeAndCall', + [proxy, implementation, m.encodeFunctionCall(implementation, 'initialize', metadata.initArgs)], + options, + ) + return loadProxyWithABI(m, proxy, metadata, { ...options, after: [upgradeCall] }) +} diff --git a/packages/horizon/ignition/modules/proxy/implementation.ts b/packages/horizon/ignition/modules/proxy/implementation.ts new file mode 100644 index 000000000..a1cd30c4c --- /dev/null +++ b/packages/horizon/ignition/modules/proxy/implementation.ts @@ -0,0 +1,22 @@ +import { ArgumentType, Artifact, ContractOptions, IgnitionModuleBuilder } from '@nomicfoundation/ignition-core' + +export type ImplementationMetadata = { + name: string + artifact?: Artifact + constructorArgs?: ArgumentType[] + initArgs?: ArgumentType[] +} + +export function deployImplementation( + m: IgnitionModuleBuilder, + contract: ImplementationMetadata, + options?: ContractOptions, +) { + let implementation + if (contract.artifact === undefined) { + implementation = m.contract(contract.name, contract.constructorArgs, options) + } else { + implementation = m.contract(contract.name, contract.artifact, contract.constructorArgs, options) + } + return implementation +} diff --git a/packages/horizon/ignition/modules/proxy/utils.ts b/packages/horizon/ignition/modules/proxy/utils.ts new file mode 100644 index 000000000..c6b7f4c2a --- /dev/null +++ b/packages/horizon/ignition/modules/proxy/utils.ts @@ -0,0 +1,23 @@ +import { + ContractAtFuture, + ContractFuture, + ContractOptions, + IgnitionModuleBuilder, +} from '@nomicfoundation/ignition-core' + +import type { ImplementationMetadata } from './implementation' + +export function loadProxyWithABI( + m: IgnitionModuleBuilder, + proxy: ContractFuture | ContractAtFuture, + contract: ImplementationMetadata, + options?: ContractOptions, +) { + let proxyWithABI + if (contract.artifact === undefined) { + proxyWithABI = m.contractAt(contract.name, proxy, options) + } else { + proxyWithABI = m.contractAt(`${contract.name}_ProxyWithABI`, contract.artifact, proxy, options) + } + return proxyWithABI +} diff --git a/packages/horizon/natspec-smells.config.js b/packages/horizon/natspec-smells.config.js new file mode 100644 index 000000000..5110db500 --- /dev/null +++ b/packages/horizon/natspec-smells.config.js @@ -0,0 +1,11 @@ +/** + * 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 new file mode 100644 index 000000000..a6f45d9bd --- /dev/null +++ b/packages/horizon/package.json @@ -0,0 +1,90 @@ +{ + "name": "@graphprotocol/horizon", + "version": "0.4.1", + "publishConfig": { + "access": "public" + }, + "description": "", + "author": "The Graph core devs", + "license": "GPL-2.0-or-later", + "types": "typechain-types/index.ts", + "exports": { + "./artifacts/*": "./build/contracts/*", + "./addresses*": "./addresses*", + "./ignition": "./ignition/modules/index.ts", + "./tasks/*": "./tasks/*" + }, + "files": [ + "build/contracts/**/*", + "typechain-types/**/*", + "README.md" + ], + "scripts": { + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:natspec; 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:json": "prettier -w --cache --log-level warn '**/*.json'", + "clean": "rm -rf build dist cache cache_forge typechain-types", + "build": "hardhat compile", + "test": "forge test", + "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test test/deployment/*.ts", + "test:integration": "./scripts/integration", + "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-foundry": "^1.1.1", + "@nomicfoundation/hardhat-ignition": "^0.15.9", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.9", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.10", + "@nomicfoundation/ignition-core": "^0.15.9", + "@openzeppelin/contracts": "^5.0.2", + "@openzeppelin/contracts-upgradeable": "^5.0.2", + "@openzeppelin/foundry-upgrades": "0.4.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=16.0.0", + "chai": "^4.2.0", + "eslint": "^8.56.0", + "ethers": "6.13.7", + "forge-std": "https://github.com/foundry-rs/forge-std/tarball/v1.9.7", + "glob": "^11.0.1", + "hardhat": "^2.22.18", + "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", + "solidity-coverage": "^0.8.0", + "ts-node": ">=8.0.0", + "typechain": "^8.3.0", + "typescript": "^5.6.3" + }, + "lint-staged": { + "contracts/**/*.sol": [ + "pnpm lint:sol" + ], + "**/*.ts": [ + "pnpm lint:ts" + ], + "**/*.js": [ + "pnpm lint:ts" + ], + "**/*.json": [ + "pnpm lint:ts" + ] + } +} diff --git a/packages/sdk/prettier.config.cjs b/packages/horizon/prettier.config.cjs similarity index 100% rename from packages/sdk/prettier.config.cjs rename to packages/horizon/prettier.config.cjs diff --git a/packages/horizon/remappings.txt b/packages/horizon/remappings.txt new file mode 100644 index 000000000..9c42ca6f6 --- /dev/null +++ b/packages/horizon/remappings.txt @@ -0,0 +1,6 @@ +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ +@openzeppelin/foundry-upgrades/=node_modules/@openzeppelin/foundry-upgrades/src/ +@graphprotocol/contracts/=node_modules/@graphprotocol/contracts/ +@graphprotocol/interfaces/=node_modules/@graphprotocol/interfaces/ +forge-std/=node_modules/forge-std/src/ \ No newline at end of file diff --git a/packages/horizon/scripts/integration b/packages/horizon/scripts/integration new file mode 100755 index 000000000..baf48cf5e --- /dev/null +++ b/packages/horizon/scripts/integration @@ -0,0 +1,120 @@ +#!/bin/bash + +set -eo pipefail + +NON_INTERACTIVE=${NON_INTERACTIVE:-false} + +# Set environment variables for this script +export SECURE_ACCOUNTS_DISABLE_PROVIDER=true +export FORK_FROM_CHAIN_ID=${FORK_FROM_CHAIN_ID:-421614} + +# Function to cleanup resources +cleanup() { + # Kill hardhat node only if we started it + if [ ! -z "$NODE_PID" ] && [ "$STARTED_NODE" = true ]; then + echo "Cleaning up Hardhat node (PID: $NODE_PID)..." + kill -TERM -- -$NODE_PID 2>/dev/null || true + fi +} + +# Set trap to call cleanup function on script exit (normal or error) +trap cleanup EXIT + +# Check if ignition deployment folder exists and prompt before proceeding +if [ -d "ignition/deployments/horizon-localhost" ]; then + if [ "$NON_INTERACTIVE" = true ]; then + confirm=y + else + read -p "Ignition deployment files already exist. These must be removed for the tests to work properly. Remove them? (y/n) [y]: " confirm + confirm=${confirm:-y} + fi + if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then + echo "Removing existing ignition deployment files..." + rm -rf ignition/deployments/horizon-localhost + else + echo "Operation cancelled. Exiting..." + exit 1 + fi +fi + +if [ -f "addresses-localhost.json" ]; then + if [ "$NON_INTERACTIVE" = true ]; then + confirm=y + else + read -p "Address book for horizon will be deleted. Continue? (y/n) [y]: " confirm + confirm=${confirm:-y} + fi + if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then + echo "Deleting addresses-localhost.json..." + rm -f addresses-localhost.json + else + echo "Operation cancelled. Exiting..." + exit 1 + fi +fi + +# Check required env variables +BLOCKCHAIN_RPC=${BLOCKCHAIN_RPC:-$(npx hardhat vars get ARBITRUM_SEPOLIA_RPC)} +if [ -z "$BLOCKCHAIN_RPC" ]; then + echo "BLOCKCHAIN_RPC environment variable is required" + exit 1 +fi + +echo "Starting integration tests..." + +# Check if hardhat node is already running on port 8545 +STARTED_NODE=false +if lsof -i:8545 > /dev/null 2>&1; then + echo "Hardhat node already running on port 8545, using existing node" + # Get the PID of the process using port 8545 + NODE_PID=$(lsof -t -i:8545) +else + # Start local hardhat node forked from Arbitrum Sepolia + echo "Starting local hardhat node..." + npx hardhat node --fork $BLOCKCHAIN_RPC > node.log 2>&1 & + NODE_PID=$! + STARTED_NODE=true + + # Wait for node to start + sleep 10 +fi + +# Setup horizon address book +jq '{"31337": ."'"$FORK_FROM_CHAIN_ID"'"}' addresses-integration-tests.json > addresses-localhost.json + +# Setup pre horizon migration state needed for the integration tests +npx hardhat test:seed --network localhost + +# Transfer ownership of protocol to hardhat signer 1 +npx hardhat test:transfer-ownership --network localhost + +# Step 1 - Deployer +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 1 + +# Step 2 - Governor +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 2 --patch-config --account-index 1 --hide-banner --standalone + +# Step 3 - Deployer +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 3 --patch-config --hide-banner --standalone + +# Step 4 - Governor +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 4 --patch-config --account-index 1 --hide-banner --standalone + +# Run integration tests - During transition period +npx hardhat test:integration --phase during-transition-period --network localhost + +# Clear thawing period +npx hardhat transition:clear-thawing --network localhost + +# Run integration tests - After transition period +npx hardhat test:integration --phase after-transition-period --network localhost + +# Enable delegation slashing +npx hardhat transition:enable-delegation-slashing --network localhost + +# Run integration tests - After delegation slashing enabled +npx hardhat test:integration --phase after-delegation-slashing-enabled --network localhost + +echo "" +echo "🎉 ✨ 🚀 ✅ Integration tests completed successfully! 🎉 ✨ 🚀 ✅" +echo "" \ No newline at end of file diff --git a/packages/horizon/scripts/post-verify b/packages/horizon/scripts/post-verify new file mode 100644 index 000000000..dfcae3bcc --- /dev/null +++ b/packages/horizon/scripts/post-verify @@ -0,0 +1,3 @@ +#!/bin/bash + +git ls-files --others --exclude-standard ignition/deployments | xargs rm -f \ No newline at end of file diff --git a/packages/horizon/scripts/pre-verify b/packages/horizon/scripts/pre-verify new file mode 100755 index 000000000..679f51560 --- /dev/null +++ b/packages/horizon/scripts/pre-verify @@ -0,0 +1,60 @@ +#!/bin/bash + +# Move external artifacts +cp -r ../contracts/build/contracts/contracts/* build/contracts/contracts +cp -r ../contracts/build/contracts/build-info/* build/contracts/build-info +cp -r build/contracts/@openzeppelin/contracts/proxy/transparent/* build/contracts/contracts + +# HardHat Ignition deployment ID +DEPLOYMENT_ID="${1:-chain-421614}" + +# .dbg.json files +DBG_DIR_SRC="./build/contracts/contracts" +DBG_DIR_DEST="./ignition/deployments/${DEPLOYMENT_ID}/artifacts" + +# build-info files +BUILD_INFO_DIR_SRC="./build/contracts/build-info" +BUILD_INFO_DIR_DEST="./ignition/deployments/${DEPLOYMENT_ID}/build-info" + +# Ensure the destination directories exist +mkdir -p "$DBG_DIR_DEST" +mkdir -p "$BUILD_INFO_DIR_DEST" + +# Copy .dbg.json files +echo "Searching for .dbg.json files in $DBG_DIR_SRC and copying them to $DBG_DIR_DEST..." +find "$DBG_DIR_SRC" -type f -name "*.dbg.json" | while read -r file; do + base_name=$(basename "$file" .dbg.json) + new_name="${base_name}#${base_name}.dbg.json" + + if [ ! -f "$DBG_DIR_DEST/$new_name" ]; then + cp "$file" "$DBG_DIR_DEST/$new_name" + fi + + jq '.buildInfo |= sub("../../../../"; "../") | .buildInfo |= sub("../../../"; "../") | .buildInfo |= sub("../../"; "../")' "$DBG_DIR_DEST/$new_name" > "${DBG_DIR_DEST}/${new_name}.tmp" && mv "${DBG_DIR_DEST}/${new_name}.tmp" "$DBG_DIR_DEST/$new_name" +done + +# Copy build-info files +echo "Searching for build-info files in $BUILD_INFO_DIR_SRC and copying them to $BUILD_INFO_DIR_DEST..." +find "$BUILD_INFO_DIR_SRC" -type f -name "*.json" | while read -r file; do + base_name=$(basename "$file" .json) + if [ ! -f "$BUILD_INFO_DIR_DEST/$base_name.json" ]; then + cp "$file" "$BUILD_INFO_DIR_DEST/$base_name.json" + fi +done + +echo "All files have been processed." + +# Patch proxy artifacts +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxies#GraphProxy_HorizonStaking.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2Curation#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2GraphToken#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2GraphTokenGateway#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/RewardsManager#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/BridgeEscrow#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/EpochManager#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2GNS#GraphProxy.dbg.json" + +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxiesDeployer#TransparentUpgradeableProxy_GraphPayments.dbg.json" +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxies#TransparentUpgradeableProxy_GraphPayments.dbg.json" +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxiesDeployer#TransparentUpgradeableProxy_PaymentsEscrow.dbg.json" +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow.dbg.json" diff --git a/packages/horizon/tasks/deploy.ts b/packages/horizon/tasks/deploy.ts new file mode 100644 index 000000000..234ffb255 --- /dev/null +++ b/packages/horizon/tasks/deploy.ts @@ -0,0 +1,200 @@ +/* eslint-disable no-case-declarations */ +import { ZERO_ADDRESS } from '@graphprotocol/toolshed' +import type { AddressBook } from '@graphprotocol/toolshed/deployments' +import { loadConfig, patchConfig, saveToAddressBook } from '@graphprotocol/toolshed/hardhat' +import { printHorizonBanner } from '@graphprotocol/toolshed/utils' +import { task, types } from 'hardhat/config' +import type { HardhatRuntimeEnvironment } from 'hardhat/types' + +import DeployModule from '../ignition/modules/deploy' + +task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon contracts - no data services deployed') + .addOptionalParam( + 'horizonConfig', + 'Name of the Horizon configuration file to use. Format is "protocol..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', + undefined, + types.string, + ) + .addOptionalParam('accountIndex', 'Derivation path index for the account to use', 0, types.int) + .setAction(async (args, hre: HardhatRuntimeEnvironment) => { + const graph = hre.graph({ createAddressBook: true }) + + // Load configuration for the deployment + console.log('\n========== ⚙️ Deployment configuration ==========') + const { config: HorizonConfig, file } = loadConfig( + './ignition/configs/', + 'protocol', + args.horizonConfig ?? hre.network.name, + ) + console.log(`Loaded migration configuration from ${file}`) + + // Display the deployer -- this also triggers the secure accounts prompt if being used + console.log('\n========== 🔑 Deployer account ==========') + const deployer = await graph.accounts.getDeployer(args.accountIndex) + console.log('Using deployer account:', deployer.address) + const balance = await hre.ethers.provider.getBalance(deployer.address) + console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') + if (balance === 0n) { + console.error('Error: Deployer account has no ETH balance') + process.exit(1) + } + + // Deploy the contracts + console.log(`\n========== 🚧 Deploy protocol ==========`) + const deployment = await hre.ignition.deploy(DeployModule, { + displayUi: true, + parameters: HorizonConfig, + defaultSender: deployer.address, + }) + + // Save the addresses to the address book + console.log('\n========== 📖 Updating address book ==========') + // @ts-expect-error - @graphprotocol/toolshed/hardhat exports ts files so types mismatch here + saveToAddressBook(deployment, graph.horizon.addressBook) + console.log(`Address book at ${graph.horizon.addressBook.file} updated!`) + + console.log('\n\n🎉 ✨ 🚀 ✅ Deployment complete! 🎉 ✨ 🚀 ✅') + }) + +task('deploy:migrate', 'Upgrade an existing version of the Graph Protocol v1 to Horizon - no data services deployed') + .addOptionalParam( + 'horizonConfig', + 'Name of the Horizon configuration file to use. Format is "migrate..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', + undefined, + types.string, + ) + .addOptionalParam('step', 'Migration step to run (1, 2, 3 or 4)', undefined, types.int) + .addOptionalParam('accountIndex', 'Derivation path index for the account to use', 0, types.int) + .addFlag('patchConfig', 'Patch configuration file using address book values - does not save changes') + .addFlag('standalone', 'Deploy horizon contracts in standalone mode - subgraph service hardcoded as zero address') + .addFlag('hideBanner', 'Hide the banner display') + .setAction(async (args, hre: HardhatRuntimeEnvironment) => { + // Task parameters + const step: number = args.step ?? 0 + const patchConfig: boolean = args.patchConfig ?? false + + const graph = hre.graph() + if (!args.hideBanner) { + printHorizonBanner() + } + + // Migration step to run + console.log('\n========== 🏗️ Migration steps ==========') + const validSteps = [1, 2, 3, 4] + if (!validSteps.includes(step)) { + console.error(`Error: Invalid migration step provided: ${step}`) + console.error(`Valid steps are: ${validSteps.join(', ')}`) + process.exit(1) + } + console.log(`Running migration step: ${step}`) + + // Load configuration for the migration + console.log('\n========== ⚙️ Deployment configuration ==========') + const { config: HorizonMigrateConfig, file } = loadConfig( + './ignition/configs/', + 'migrate', + args.horizonConfig ?? hre.network.name, + ) + console.log(`Loaded migration configuration from ${file}`) + + // Display the deployer -- this also triggers the secure accounts prompt if being used + console.log('\n========== 🔑 Deployer account ==========') + const deployer = await graph.accounts.getDeployer(args.accountIndex) + console.log('Using deployer account:', deployer.address) + const balance = await hre.ethers.provider.getBalance(deployer.address) + console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') + if (balance === 0n) { + console.error('Error: Deployer account has no ETH balance') + process.exit(1) + } + + // Run migration step + console.log(`\n========== 🚧 Running migration: step ${step} ==========`) + const MigrationModule = require(`../ignition/modules/migrate/migrate-${step}`).default + const deployment = await hre.ignition.deploy(MigrationModule, { + displayUi: true, + parameters: patchConfig + ? _patchStepConfig( + step, + HorizonMigrateConfig, + graph.horizon.addressBook, + graph.subgraphService?.addressBook, + args.standalone, + ) + : HorizonMigrateConfig, + deploymentId: `horizon-${hre.network.name}`, + defaultSender: deployer.address, + }) + + // Update address book + console.log('\n========== 📖 Updating address book ==========') + // @ts-expect-error - @graphprotocol/toolshed/hardhat exports ts files so types mismatch here + saveToAddressBook(deployment, graph.horizon.addressBook) + console.log(`Address book at ${graph.horizon.addressBook.file} updated!`) + + console.log(`\n\n🎉 ✨ 🚀 ✅ Migration step ${step} complete! 🎉 ✨ 🚀 ✅\n`) + }) + +// This function patches the Ignition configuration object using an address book to fill in the gaps +// The resulting configuration is not saved back to the configuration file + +function _patchStepConfig( + step: number, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + config: any, + horizonAddressBook: AddressBook, + subgraphServiceAddressBook: AddressBook | undefined, + standalone: boolean, + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): any { + let patchedConfig = config + + // Get the subgraph service address + // Subgraph service address book might exist if we are running horizon + subgraph service + // or it might not exist if we are running horizon standalone + function getSubgraphServiceAddress() { + if ( + subgraphServiceAddressBook === undefined || + !subgraphServiceAddressBook.entryExists('SubgraphService') || + standalone + ) { + return ZERO_ADDRESS + } + return subgraphServiceAddressBook.getEntry('SubgraphService').address + } + + switch (step) { + case 2: + const GraphPayments = horizonAddressBook.getEntry('GraphPayments') + const PaymentsEscrow = horizonAddressBook.getEntry('PaymentsEscrow') + patchedConfig = patchConfig(config, { + $global: { + graphPaymentsAddress: GraphPayments.address, + paymentsEscrowAddress: PaymentsEscrow.address, + }, + }) + break + case 3: + patchedConfig = patchConfig(patchedConfig, { + $global: { + subgraphServiceAddress: getSubgraphServiceAddress(), + }, + }) + break + case 4: + const HorizonStaking = horizonAddressBook.getEntry('HorizonStaking') + const L2Curation = horizonAddressBook.getEntry('L2Curation') + const RewardsManager = horizonAddressBook.getEntry('RewardsManager') + patchedConfig = patchConfig(patchedConfig, { + $global: { + subgraphServiceAddress: getSubgraphServiceAddress(), + horizonStakingImplementationAddress: HorizonStaking.implementation ?? ZERO_ADDRESS, + curationImplementationAddress: L2Curation.implementation ?? ZERO_ADDRESS, + rewardsManagerImplementationAddress: RewardsManager.implementation ?? ZERO_ADDRESS, + }, + }) + break + } + + return patchedConfig +} diff --git a/packages/horizon/tasks/test/integration.ts b/packages/horizon/tasks/test/integration.ts new file mode 100644 index 000000000..95b2ea230 --- /dev/null +++ b/packages/horizon/tasks/test/integration.ts @@ -0,0 +1,37 @@ +import { printBanner } from '@graphprotocol/toolshed/utils' +import { glob } from 'glob' +import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' +import { task } from 'hardhat/config' + +task('test:integration', 'Runs all integration tests') + .addParam( + 'phase', + 'Test phase to run: "during-transition-period", "after-transition-period", "after-delegation-slashing-enabled"', + ) + .setAction(async (taskArgs, hre) => { + // Get test files for each phase + const duringTransitionPeriodFiles = await glob('test/integration/during-transition-period/**/*.{js,ts}') + const afterTransitionPeriodFiles = await glob('test/integration/after-transition-period/**/*.{js,ts}') + const afterDelegationSlashingEnabledFiles = await glob( + 'test/integration/after-delegation-slashing-enabled/**/*.{js,ts}', + ) + + // Display banner for the current test phase + printBanner(taskArgs.phase, 'INTEGRATION TESTS: ') + + switch (taskArgs.phase) { + case 'during-transition-period': + await hre.run(TASK_TEST, { testFiles: duringTransitionPeriodFiles }) + break + case 'after-transition-period': + await hre.run(TASK_TEST, { testFiles: afterTransitionPeriodFiles }) + break + case 'after-delegation-slashing-enabled': + await hre.run(TASK_TEST, { testFiles: afterDelegationSlashingEnabledFiles }) + break + default: + throw new Error( + 'Invalid phase. Must be "during-transition-period", "after-transition-period", "after-delegation-slashing-enabled", or "all"', + ) + } + }) diff --git a/packages/horizon/tasks/test/ownership.ts b/packages/horizon/tasks/test/ownership.ts new file mode 100644 index 000000000..25ba028f4 --- /dev/null +++ b/packages/horizon/tasks/test/ownership.ts @@ -0,0 +1,78 @@ +import { requireLocalNetwork } from '@graphprotocol/toolshed/hardhat' +import { printBanner } from '@graphprotocol/toolshed/utils' +import { task, types } from 'hardhat/config' + +// This is required because we cannot impersonate Ignition accounts +// so we impersonate current governor and transfer ownership to accounts that Ignition can control +task('test:transfer-ownership', 'Transfer ownership of protocol contracts to a new governor') + .addOptionalParam('governorIndex', 'Derivation path index for the new governor account', 1, types.int) + .addOptionalParam('slasherIndex', 'Derivation path index for the new slasher account', 2, types.int) + .addOptionalParam('pauseGuardianIndex', 'Derivation path index for the new pause guardian account', 3, types.int) + .setAction(async (taskArgs, hre) => { + printBanner('TRANSFER OWNERSHIP') + + const graph = hre.graph() + + // this task uses impersonation so we NEED a local network + requireLocalNetwork(hre) + + console.log('\n--- STEP 0: Setup ---') + + // Get signers + const newGovernor = await graph.accounts.getGovernor(taskArgs.governorIndex) + const newSlasher = await graph.accounts.getArbitrator(taskArgs.slasherIndex) + const newPauseGuardian = await graph.accounts.getPauseGuardian(taskArgs.pauseGuardianIndex) + console.log(`New governor will be: ${newGovernor.address}`) + + // Get contracts + const staking = graph.horizon.contracts.LegacyStaking + const controller = graph.horizon.contracts.Controller + const graphProxyAdmin = graph.horizon.contracts.GraphProxyAdmin + + // Get current owners + const controllerGovernor = await controller.getGovernor() + const proxyAdminGovernor = await graphProxyAdmin.governor() + + console.log(`Current Controller governor: ${controllerGovernor}`) + console.log(`Current GraphProxyAdmin governor: ${proxyAdminGovernor}`) + + // Get impersonated signers + const controllerSigner = await hre.ethers.getImpersonatedSigner(controllerGovernor) + const proxyAdminSigner = await hre.ethers.getImpersonatedSigner(proxyAdminGovernor) + + console.log('\n--- STEP 1: Transfer ownership of Controller ---') + + // Transfer Controller ownership + console.log('Transferring Controller ownership...') + await controller.connect(controllerSigner).transferOwnership(newGovernor.address) + console.log('Accepting Controller ownership...') + + // Accept ownership of Controller + await controller.connect(newGovernor).acceptOwnership() + console.log(`New Controller governor: ${await controller.getGovernor()}`) + + console.log('\n--- STEP 2: Transfer ownership of GraphProxyAdmin ---') + + // Transfer GraphProxyAdmin ownership + console.log('Transferring GraphProxyAdmin ownership...') + await graphProxyAdmin.connect(proxyAdminSigner).transferOwnership(newGovernor.address) + console.log('Accepting GraphProxyAdmin ownership...') + + // Accept ownership of GraphProxyAdmin + await graphProxyAdmin.connect(newGovernor).acceptOwnership() + console.log(`New GraphProxyAdmin governor: ${await graphProxyAdmin.governor()}`) + + console.log('\n--- STEP 3: Assign new slasher ---') + + // Assign new slasher + console.log('Assigning new slasher...') + await staking.connect(newGovernor).setSlasher(newSlasher.address, true) + console.log(`New slasher: ${newSlasher.address}, allowed: ${await staking.slashers(newSlasher.address)}`) + + // Assign new pause guardian + console.log('Assigning new pause guardian...') + await controller.connect(newGovernor).setPauseGuardian(newPauseGuardian.address) + console.log(`New pause guardian: ${newPauseGuardian.address}`) + + console.log('\n\n🎉 ✨ 🚀 ✅ Transfer ownership complete! 🎉 ✨ 🚀 ✅\n') + }) diff --git a/packages/horizon/tasks/test/seed.ts b/packages/horizon/tasks/test/seed.ts new file mode 100644 index 000000000..081b4a054 --- /dev/null +++ b/packages/horizon/tasks/test/seed.ts @@ -0,0 +1,125 @@ +import { generateLegacyAllocationProof, randomAllocationMetadata } from '@graphprotocol/toolshed' +import { delegators, indexers } from '@graphprotocol/toolshed/fixtures' +import { requireLocalNetwork, setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { printBanner } from '@graphprotocol/toolshed/utils' +import { task } from 'hardhat/config' + +task('test:seed', 'Sets up some protocol state for testing').setAction(async (_, hre) => { + printBanner('PROTOCOL STATE SETUP') + + console.log('\n--- STEP 0: Setup ---') + + // this task uses impersonation so we NEED a local network + requireLocalNetwork(hre) + + // Get contracts + const graph = hre.graph() + const GraphToken = graph.horizon.contracts.L2GraphToken + const Staking = graph.horizon.contracts.LegacyStaking + + // STEP 1: stake for indexers + console.log('\n--- STEP 1: Indexers Setup ---') + for (const indexer of indexers) { + await setGRTBalance(graph.provider, GraphToken.target, indexer.address, indexer.stake) + + // Impersonate the indexer + const indexerSigner = await hre.ethers.getImpersonatedSigner(indexer.address) + + // Approve and stake + console.log(`Staking ${indexer.stake} tokens for indexer ${indexer.address}...`) + await GraphToken.connect(indexerSigner).approve(Staking.target, indexer.stake) + await Staking.connect(indexerSigner).stake(indexer.stake) + + // Set delegation parameters + console.log(`Setting delegation parameters for indexer ${indexer.address}...`) + await Staking.connect(indexerSigner).setDelegationParameters(indexer.indexingRewardCut, indexer.queryFeeCut, 0) + + // Set rewards destination if it exists + if (indexer.rewardsDestination) { + console.log(`Setting rewards destination for indexer ${indexer.address} to ${indexer.rewardsDestination}...`) + await Staking.connect(indexerSigner).setRewardsDestination(indexer.rewardsDestination) + } + } + + // STEP 2: Fund and delegate for delegators + console.log('\n--- STEP 2: Delegators Delegating ---') + for (const delegator of delegators) { + await setGRTBalance( + graph.provider, + GraphToken.target, + delegator.address, + delegator.delegations.reduce((acc, d) => acc + d.tokens, BigInt(0)), + ) + + // Impersonate the delegator + const delegatorSigner = await hre.ethers.getImpersonatedSigner(delegator.address) + + // Delegate to each indexer + for (const delegation of delegator.delegations) { + console.log( + `Delegating ${delegation.tokens} tokens from ${delegator.address} to indexer ${delegation.indexerAddress}...`, + ) + await GraphToken.connect(delegatorSigner).approve(Staking.target, delegation.tokens) + await Staking.connect(delegatorSigner).delegate(delegation.indexerAddress, delegation.tokens) + } + } + + // STEP 3: Create allocations + console.log('\n--- STEP 3: Creating Allocations ---') + for (const indexer of indexers) { + // Impersonate the indexer + const indexerSigner = await hre.ethers.getImpersonatedSigner(indexer.address) + + for (const allocation of indexer.allocations) { + console.log( + `Creating allocation of ${allocation.tokens} tokens from indexer ${indexer.address} on subgraph ${allocation.subgraphDeploymentID}...`, + ) + + await Staking.connect(indexerSigner).allocate( + allocation.subgraphDeploymentID, + allocation.tokens, + allocation.allocationID, + randomAllocationMetadata(), + await generateLegacyAllocationProof(indexer.address, allocation.allocationPrivateKey), + ) + } + } + + // STEP 4: Indexer unstakes + console.log('\n--- STEP 4: Indexer unstakes ---') + for (const indexer of indexers) { + if (indexer.tokensToUnstake) { + console.log(`Indexer ${indexer.address} is unstaking...`) + + // Impersonate the indexer + const indexerSigner = await hre.ethers.getImpersonatedSigner(indexer.address) + + // Unstake + await Staking.connect(indexerSigner).unstake(indexer.tokensToUnstake) + } + } + + // STEP 5: Undelegate + console.log('\n--- STEP 5: Undelegating ---') + for (const delegator of delegators) { + if (delegator.undelegate) { + console.log(`Delegator ${delegator.address} is undelegating...`) + + // Impersonate the delegator + const delegatorSigner = await hre.ethers.getImpersonatedSigner(delegator.address) + + for (const delegation of delegator.delegations) { + // Get the delegation information + const delegationInfo = await Staking.getDelegation(delegation.indexerAddress, delegator.address) + const shares = BigInt(delegationInfo.shares.toString()) + + console.log(`Undelegating ${shares} shares from indexer ${delegation.indexerAddress}...`) + + // Undelegate the shares + await Staking.connect(delegatorSigner).undelegate(delegation.indexerAddress, shares) + } + } + } + + console.log('\n\n🎉 ✨ 🚀 ✅ Pre-upgrade state setup complete! 🎉 ✨ 🚀 ✅\n') +}) diff --git a/packages/horizon/tasks/transitions/delegation-slashing.ts b/packages/horizon/tasks/transitions/delegation-slashing.ts new file mode 100644 index 000000000..1c1b53920 --- /dev/null +++ b/packages/horizon/tasks/transitions/delegation-slashing.ts @@ -0,0 +1,25 @@ +import { requireLocalNetwork } from '@graphprotocol/toolshed/hardhat' +import { printBanner } from '@graphprotocol/toolshed/utils' +import { task, types } from 'hardhat/config' + +task('transition:enable-delegation-slashing', 'Enables delegation slashing in HorizonStaking') + .addOptionalParam('governorIndex', 'Derivation path index for the governor account', 1, types.int) + .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') + .setAction(async (taskArgs, hre) => { + printBanner('ENABLING DELEGATION SLASHING') + + if (!taskArgs.skipNetworkCheck) { + requireLocalNetwork(hre) + } + + const graph = hre.graph() + const governor = await graph.accounts.getGovernor(taskArgs.governorIndex) + const horizonStaking = graph.horizon.contracts.HorizonStaking + + console.log('Enabling delegation slashing...') + await horizonStaking.connect(governor).setDelegationSlashingEnabled() + + // Log if the delegation slashing is enabled + const delegationSlashingEnabled = await horizonStaking.isDelegationSlashingEnabled() + console.log('Delegation slashing enabled:', delegationSlashingEnabled) + }) diff --git a/packages/horizon/tasks/transitions/thawing-period.ts b/packages/horizon/tasks/transitions/thawing-period.ts new file mode 100644 index 000000000..e21e2bad2 --- /dev/null +++ b/packages/horizon/tasks/transitions/thawing-period.ts @@ -0,0 +1,22 @@ +import { requireLocalNetwork } from '@graphprotocol/toolshed/hardhat' +import { printBanner } from '@graphprotocol/toolshed/utils' +import { task, types } from 'hardhat/config' + +task('transition:clear-thawing', 'Clears the thawing period in HorizonStaking') + .addOptionalParam('governorIndex', 'Derivation path index for the governor account', 1, types.int) + .addFlag('skipNetworkCheck', 'Skip the network check (use with caution)') + .setAction(async (taskArgs, hre) => { + printBanner('CLEARING THAWING PERIOD') + + if (!taskArgs.skipNetworkCheck) { + requireLocalNetwork(hre) + } + + const graph = hre.graph() + const governor = await graph.accounts.getGovernor(taskArgs.governorIndex) + const horizonStaking = graph.horizon.contracts.HorizonStaking + + console.log('Clearing thawing period...') + await horizonStaking.connect(governor).clearThawingPeriod() + console.log('Thawing period cleared') + }) diff --git a/packages/horizon/test/deployment/Controller.test.ts b/packages/horizon/test/deployment/Controller.test.ts new file mode 100644 index 000000000..74459b8c2 --- /dev/null +++ b/packages/horizon/test/deployment/Controller.test.ts @@ -0,0 +1,56 @@ +import { expect } from 'chai' +import { toUtf8Bytes } from 'ethers' +import hre from 'hardhat' + +import { testIf } from './lib/testIf' + +const graph = hre.graph() +const addressBook = graph.horizon.addressBook +const Controller = graph.horizon.contracts.Controller + +describe('Controller', function () { + it('should have GraphToken registered', async function () { + const graphToken = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('GraphToken'))) + expect(graphToken).to.equal(addressBook.getEntry('L2GraphToken').address) + }) + + it('should have HorizonStaking registered', async function () { + const horizonStaking = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('Staking'))) + expect(horizonStaking).to.equal(addressBook.getEntry('HorizonStaking').address) + }) + + testIf(2)('should have GraphPayments registered', async function () { + const graphPayments = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('GraphPayments'))) + expect(graphPayments).to.equal(addressBook.getEntry('GraphPayments').address) + }) + + testIf(2)('should have PaymentsEscrow registered', async function () { + const paymentsEscrow = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('PaymentsEscrow'))) + expect(paymentsEscrow).to.equal(addressBook.getEntry('PaymentsEscrow').address) + }) + + it('should have EpochManager registered', async function () { + const epochManager = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('EpochManager'))) + expect(epochManager).to.equal(addressBook.getEntry('EpochManager').address) + }) + + it('should have RewardsManager registered', async function () { + const rewardsManager = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('RewardsManager'))) + expect(rewardsManager).to.equal(addressBook.getEntry('RewardsManager').address) + }) + + it('should have GraphTokenGateway registered', async function () { + const graphTokenGateway = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('GraphTokenGateway'))) + expect(graphTokenGateway).to.equal(addressBook.getEntry('L2GraphTokenGateway').address) + }) + + testIf(2)('should have GraphProxyAdmin registered', async function () { + const graphProxyAdmin = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('GraphProxyAdmin'))) + expect(graphProxyAdmin).to.equal(addressBook.getEntry('GraphProxyAdmin').address) + }) + + it('should have Curation registered', async function () { + const curation = await Controller.getContractProxy(hre.ethers.keccak256(toUtf8Bytes('Curation'))) + expect(curation).to.equal(addressBook.getEntry('L2Curation').address) + }) +}) diff --git a/packages/horizon/test/deployment/Curation.test.ts b/packages/horizon/test/deployment/Curation.test.ts new file mode 100644 index 000000000..befb33f48 --- /dev/null +++ b/packages/horizon/test/deployment/Curation.test.ts @@ -0,0 +1,26 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { graphProxyTests } from './lib/GraphProxy.test' +import { testIf } from './lib/testIf' + +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const graphProxyAdminAddressBookEntry = graph.horizon.addressBook.getEntry('GraphProxyAdmin') +const curationAddressBookEntry = graph.horizon.addressBook.getEntry('L2Curation') +const Curation = graph.horizon.contracts.L2Curation + +describe('Curation', function () { + testIf(4)('should set the right subgraph service', async function () { + const subgraphService = await Curation.subgraphService() + expect(subgraphService).to.equal(config.$global.subgraphServiceAddress) + }) +}) + +graphProxyTests('Curation', curationAddressBookEntry, graphProxyAdminAddressBookEntry.address) diff --git a/packages/horizon/test/deployment/GNS.test.ts b/packages/horizon/test/deployment/GNS.test.ts new file mode 100644 index 000000000..482dbe982 --- /dev/null +++ b/packages/horizon/test/deployment/GNS.test.ts @@ -0,0 +1,20 @@ +import { expect } from 'chai' +import hre from 'hardhat' + +import { graphProxyTests } from './lib/GraphProxy.test' + +const graph = hre.graph() + +const graphProxyAdminAddressBookEntry = graph.horizon.addressBook.getEntry('GraphProxyAdmin') +const gnsAddressBookEntry = graph.horizon.addressBook.getEntry('L2GNS') +const GNS = graph.horizon.contracts.L2GNS +const SubgraphNFT = graph.horizon.contracts.SubgraphNFT + +describe('GNS', function () { + it('should set the right subgraphNFT address', async function () { + const subgraphNFT = await GNS.subgraphNFT() + expect(subgraphNFT).to.equal(SubgraphNFT) + }) +}) + +graphProxyTests('GNS', gnsAddressBookEntry, graphProxyAdminAddressBookEntry.address) diff --git a/packages/horizon/test/deployment/GraphPayments.test.ts b/packages/horizon/test/deployment/GraphPayments.test.ts new file mode 100644 index 000000000..cd6918281 --- /dev/null +++ b/packages/horizon/test/deployment/GraphPayments.test.ts @@ -0,0 +1,30 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { testIf } from './lib/testIf' +import { transparentUpgradeableProxyTests } from './lib/TransparentUpgradeableProxy.tests' + +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const addressBookEntry = graph.horizon.addressBook.getEntry('GraphPayments') +const GraphPayments = graph.horizon.contracts.GraphPayments + +describe('GraphPayments', function () { + testIf(3)('should set the right protocolPaymentCut', async function () { + const protocolPaymentCut = await GraphPayments.PROTOCOL_PAYMENT_CUT() + expect(protocolPaymentCut).to.equal(config.GraphPayments.protocolPaymentCut) + }) +}) + +transparentUpgradeableProxyTests( + 'GraphPayments', + addressBookEntry, + config.$global.governor as string, + Number(process.env.TEST_DEPLOYMENT_STEP ?? 1) >= 3, +) diff --git a/packages/horizon/test/deployment/GraphTallyCollector.test.ts b/packages/horizon/test/deployment/GraphTallyCollector.test.ts new file mode 100644 index 000000000..faf1fc271 --- /dev/null +++ b/packages/horizon/test/deployment/GraphTallyCollector.test.ts @@ -0,0 +1,21 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { testIf } from './lib/testIf' + +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const GraphTallyCollector = graph.horizon.contracts.GraphTallyCollector + +describe('GraphTallyCollector', function () { + testIf(3)('should set the right revokeSignerThawingPeriod', async function () { + const revokeSignerThawingPeriod = await GraphTallyCollector.REVOKE_AUTHORIZATION_THAWING_PERIOD() + expect(revokeSignerThawingPeriod).to.equal(config.GraphTallyCollector.revokeSignerThawingPeriod) + }) +}) diff --git a/packages/horizon/test/deployment/HorizonStaking.test.ts b/packages/horizon/test/deployment/HorizonStaking.test.ts new file mode 100644 index 000000000..fed2af75f --- /dev/null +++ b/packages/horizon/test/deployment/HorizonStaking.test.ts @@ -0,0 +1,48 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { assert, expect } from 'chai' +import hre from 'hardhat' + +import { graphProxyTests } from './lib/GraphProxy.test' +import { testIf } from './lib/testIf' + +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const horizonStakingAddressBookEntry = graph.horizon.addressBook.getEntry('HorizonStaking') +const HorizonStaking = graph.horizon.contracts.HorizonStaking +const graphProxyAdminAddressBookEntry = graph.horizon.addressBook.getEntry('GraphProxyAdmin') + +describe('HorizonStaking', function () { + testIf(4)('should set the right maxThawingPeriod', async function () { + const maxThawingPeriod = await HorizonStaking.getMaxThawingPeriod() + expect(maxThawingPeriod).to.equal(config.$global.maxThawingPeriod) + }) + + testIf(4)('should set delegationSlashingEnabled to false', async function () { + const delegationSlashingEnabled = await HorizonStaking.isDelegationSlashingEnabled() + expect(delegationSlashingEnabled).to.equal(false) + }) + + testIf(4)('should set a non zero thawing period', async function () { + if (process.env.IGNITION_DEPLOYMENT_TYPE === 'protocol') { + assert.fail('Deployment type "protocol": no historical state available') + } + const thawingPeriod = await HorizonStaking.__DEPRECATED_getThawingPeriod() + expect(thawingPeriod).to.not.equal(0) + }) + + it.skip('should set the right staking extension address') + + testIf(4)('should set the right subgraph data service address', async function () { + const subgraphDataServiceAddress = await HorizonStaking.getSubgraphService() + expect(subgraphDataServiceAddress).to.equal(config.$global.subgraphServiceAddress) + }) + + it.skip('should set the right allowed lock verifiers') +}) + +graphProxyTests('HorizonStaking', horizonStakingAddressBookEntry, graphProxyAdminAddressBookEntry.address) diff --git a/packages/horizon/test/deployment/PaymentsEscrow.test.ts b/packages/horizon/test/deployment/PaymentsEscrow.test.ts new file mode 100644 index 000000000..04377b3e8 --- /dev/null +++ b/packages/horizon/test/deployment/PaymentsEscrow.test.ts @@ -0,0 +1,30 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { testIf } from './lib/testIf' +import { transparentUpgradeableProxyTests } from './lib/TransparentUpgradeableProxy.tests' + +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const addressBookEntry = graph.horizon.addressBook.getEntry('PaymentsEscrow') +const PaymentsEscrow = graph.horizon.contracts.PaymentsEscrow + +describe('PaymentsEscrow', function () { + testIf(3)('should set the right withdrawEscrowThawingPeriod', async function () { + const withdrawEscrowThawingPeriod = await PaymentsEscrow.WITHDRAW_ESCROW_THAWING_PERIOD() + expect(withdrawEscrowThawingPeriod).to.equal(config.PaymentsEscrow.withdrawEscrowThawingPeriod) + }) +}) + +transparentUpgradeableProxyTests( + 'PaymentsEscrow', + addressBookEntry, + config.$global.governor as string, + Number(process.env.TEST_DEPLOYMENT_STEP ?? 1) >= 3, +) diff --git a/packages/horizon/test/deployment/RewardsManager.test.ts b/packages/horizon/test/deployment/RewardsManager.test.ts new file mode 100644 index 000000000..abe05af62 --- /dev/null +++ b/packages/horizon/test/deployment/RewardsManager.test.ts @@ -0,0 +1,25 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { graphProxyTests } from './lib/GraphProxy.test' +import { testIf } from './lib/testIf' +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const graphProxyAdminAddressBookEntry = graph.horizon.addressBook.getEntry('GraphProxyAdmin') +const rewardsManagerAddressBookEntry = graph.horizon.addressBook.getEntry('RewardsManager') +const RewardsManager = graph.horizon.contracts.RewardsManager + +describe('RewardsManager', function () { + testIf(4)('should set the right subgraph service', async function () { + const subgraphService = await RewardsManager.subgraphService() + expect(subgraphService).to.equal(config.$global.subgraphServiceAddress) + }) +}) + +graphProxyTests('RewardsManager', rewardsManagerAddressBookEntry, graphProxyAdminAddressBookEntry.address) diff --git a/packages/horizon/test/deployment/lib/GraphProxy.test.ts b/packages/horizon/test/deployment/lib/GraphProxy.test.ts new file mode 100644 index 000000000..02623264d --- /dev/null +++ b/packages/horizon/test/deployment/lib/GraphProxy.test.ts @@ -0,0 +1,27 @@ +import { AddressBookEntry } from '@graphprotocol/toolshed/deployments' +import { assert, expect } from 'chai' +import { zeroPadValue } from 'ethers' +import hre from 'hardhat' + +export function graphProxyTests(contractName: string, addressBookEntry: AddressBookEntry, proxyAdmin: string): void { + describe(`${contractName}: GraphProxy`, function () { + it('should target the correct implementation', async function () { + const implementation = await hre.ethers.provider.getStorage( + addressBookEntry.address, + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc', + ) + if (!addressBookEntry.implementation) { + assert.fail('Implementation address is not set') + } + expect(implementation).to.equal(zeroPadValue(addressBookEntry.implementation, 32)) + }) + + it('should be owned by the proxy admin', async function () { + const admin = await hre.ethers.provider.getStorage( + addressBookEntry.address, + '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103', + ) + expect(admin).to.equal(zeroPadValue(proxyAdmin, 32)) + }) + }) +} diff --git a/packages/horizon/test/deployment/lib/TransparentUpgradeableProxy.tests.ts b/packages/horizon/test/deployment/lib/TransparentUpgradeableProxy.tests.ts new file mode 100644 index 000000000..fa9d6e542 --- /dev/null +++ b/packages/horizon/test/deployment/lib/TransparentUpgradeableProxy.tests.ts @@ -0,0 +1,74 @@ +import { AddressBookEntry } from '@graphprotocol/toolshed/deployments' +import { assert, expect } from 'chai' +import { zeroPadValue } from 'ethers' +import hre from 'hardhat' + +export function transparentUpgradeableProxyTests( + contractName: string, + addressBookEntry: AddressBookEntry, + owner: string, + upgraded: boolean, +): void { + const testIf = () => (upgraded ? it : it.skip) + + describe(`${contractName}: implementation`, function () { + testIf()('should be locked for initialization', async function () { + if (!addressBookEntry.implementation) { + assert.fail('Implementation address is not set') + } + const initialized = await hre.ethers.provider.getStorage( + addressBookEntry.implementation, + '0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00', + ) + expect(initialized).to.equal(zeroPadValue('0xffffffffffffffff', 32)) + }) + }) + + describe(`${contractName}: TransparentUpgradeableProxy`, function () { + testIf()('should be initialized', async function () { + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/utils/Initializable.sol#L77 + const initialized = await hre.ethers.provider.getStorage( + addressBookEntry.address, + '0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00', + ) + expect(initialized).to.equal(zeroPadValue('0x01', 32)) + }) + + testIf()('should target the correct implementation', async function () { + // https:// github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/ERC1967/ERC1967Utils.sol#L37C53-L37C119 + const implementation = await hre.ethers.provider.getStorage( + addressBookEntry.address, + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc', + ) + if (!addressBookEntry.implementation) { + assert.fail('Implementation address is not set') + } + expect(implementation).to.equal(zeroPadValue(addressBookEntry.implementation, 32)) + }) + + it('should be owned by the proxy admin', async function () { + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/ERC1967/ERC1967Utils.sol#L99 + const admin = await hre.ethers.provider.getStorage( + addressBookEntry.address, + '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103', + ) + if (!addressBookEntry.proxyAdmin) { + assert.fail('Proxy admin address is not set') + } + expect(admin).to.equal(zeroPadValue(addressBookEntry.proxyAdmin, 32)) + }) + }) + + describe(`${contractName}: ProxyAdmin`, function () { + testIf()('should be owned by the governor', async function () { + if (process.env.IGNITION_DEPLOYMENT_TYPE === 'protocol') { + assert.fail('Deployment type "protocol": unknown governor address') + } + if (!addressBookEntry.proxyAdmin) { + assert.fail('Proxy admin address is not set') + } + const ownerStorage = await hre.ethers.provider.getStorage(addressBookEntry.proxyAdmin, 0) + expect(ownerStorage).to.equal(zeroPadValue(owner, 32)) + }) + }) +} diff --git a/packages/horizon/test/deployment/lib/testIf.ts b/packages/horizon/test/deployment/lib/testIf.ts new file mode 100644 index 000000000..a3863326c --- /dev/null +++ b/packages/horizon/test/deployment/lib/testIf.ts @@ -0,0 +1,4 @@ +const currentStep = Number(process.env.TEST_DEPLOYMENT_STEP ?? 1) +const testIf = (stepRequired: number) => (stepRequired <= currentStep ? it : it.skip) + +export { testIf } diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts new file mode 100644 index 000000000..9a6188286 --- /dev/null +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/add-to-delegation-pool.test.ts @@ -0,0 +1,109 @@ +import { ONE_MILLION } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Add to delegation pool', () => { + let serviceProvider: HardhatEthersSigner + let delegator: HardhatEthersSigner + let signer: HardhatEthersSigner + let verifier: HardhatEthersSigner + let newVerifier: HardhatEthersSigner + let snapshotId: string + + const maxVerifierCut = 1000000n + const thawingPeriod = 2419200n // 28 days + const tokens = ethers.parseEther('100000') + const delegationTokens = ethers.parseEther('1000') + + const graph = hre.graph() + const { stake, delegate, addToDelegationPool } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + ;[serviceProvider, delegator, verifier, newVerifier, signer] = await graph.accounts.getTestAccounts() + + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, delegator.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, signer.address, ONE_MILLION) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + + // Service provider stake + await stake(serviceProvider, [tokens]) + + // Create provision + const provisionTokens = ethers.parseEther('1000') + await horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, verifier.address, provisionTokens, maxVerifierCut, thawingPeriod) + + // Initialize delegation pool + await delegate(delegator, [serviceProvider.address, verifier.address, delegationTokens, 0n]) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should recover delegation pool from invalid state by adding tokens', async () => { + // Send eth to new verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: newVerifier.address, + value: ethers.parseEther('0.1'), + }) + + // Create a provision for the new verifier + const newVerifierProvisionTokens = ethers.parseEther('1000') + await horizonStaking + .connect(serviceProvider) + .provision( + serviceProvider.address, + newVerifier.address, + newVerifierProvisionTokens, + maxVerifierCut, + thawingPeriod, + ) + + // Initialize delegation pool + const initialDelegation = ethers.parseEther('1000') + await delegate(delegator, [serviceProvider.address, newVerifier.address, initialDelegation, 0n]) + + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, newVerifier.address) + + // Slash entire provision (service provider tokens + delegation pool tokens) + const slashTokens = newVerifierProvisionTokens + initialDelegation + const tokensVerifier = newVerifierProvisionTokens / 2n + await horizonStaking + .connect(newVerifier) + .slash(serviceProvider.address, slashTokens, tokensVerifier, newVerifier.address) + + // Delegating should revert since pool.tokens == 0 and pool.shares != 0 + const delegateTokens = ethers.parseEther('500') + await graphToken.connect(delegator).approve(horizonStaking.target, delegateTokens) + await expect( + horizonStaking + .connect(delegator) + ['delegate(address,address,uint256,uint256)'](serviceProvider.address, newVerifier.address, delegateTokens, 0n), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Add tokens to the delegation pool to recover the pool + const recoverPoolTokens = ethers.parseEther('500') + await addToDelegationPool(signer, [serviceProvider.address, newVerifier.address, recoverPoolTokens]) + + // Verify delegation pool is recovered + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, newVerifier.address) + expect(poolAfter.tokens).to.equal(recoverPoolTokens, 'Pool tokens should be recovered') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') + + // Delegation should now succeed + await delegate(delegator, [serviceProvider.address, newVerifier.address, delegateTokens, 0n]) + }) +}) diff --git a/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts new file mode 100644 index 000000000..276764f4a --- /dev/null +++ b/packages/horizon/test/integration/after-delegation-slashing-enabled/slasher.test.ts @@ -0,0 +1,122 @@ +import { ONE_MILLION } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Slasher', () => { + let snapshotId: string + let serviceProvider: HardhatEthersSigner + let delegator: HardhatEthersSigner + let verifier: HardhatEthersSigner + let verifierDestination: string + + const maxVerifierCut = 1000000n // 100% + const thawingPeriod = 2419200n // 28 days + const provisionTokens = ethers.parseEther('10000') + const delegationTokens = ethers.parseEther('1000') + + const graph = hre.graph() + const { provision, delegate } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + ;[serviceProvider, delegator, verifier] = await graph.accounts.getTestAccounts() + verifierDestination = ethers.Wallet.createRandom().address + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, delegator.address, ONE_MILLION) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + // Check that delegation slashing is enabled + const delegationSlashingEnabled = await horizonStaking.isDelegationSlashingEnabled() + expect(delegationSlashingEnabled).to.be.equal(true, 'Delegation slashing should be enabled') + + // Send funds to delegator + await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens * 3n) + // Create provision + await provision(serviceProvider, [ + serviceProvider.address, + verifier.address, + provisionTokens, + maxVerifierCut, + thawingPeriod, + ]) + + // Initialize delegation pool if it does not exist + await delegate(delegator, [serviceProvider.address, verifier.address, delegationTokens, 0n]) + + // Send eth to verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: verifier.address, + value: ethers.parseEther('0.1'), + }) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should slash service provider and delegation pool tokens', async () => { + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + const slashTokens = provisionBefore.tokens + poolBefore.tokens / 2n + const tokensVerifier = slashTokens / 2n + + // Slash the provision for all service provider and half of the delegation pool tokens + await horizonStaking + .connect(verifier) + .slash(serviceProvider.address, slashTokens, tokensVerifier, verifierDestination) + + // Verify provision tokens should be slashed completely + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + expect(provisionAfter.tokens).to.be.equal(0, 'Provision tokens should be slashed completely') + + // Verify the remaining half of the delegation pool tokens are not slashed + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + expect(poolAfter.tokens).to.be.equal(poolBefore.tokens / 2n, 'Delegation pool tokens should be slashed') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Delegation pool shares should remain the same') + }) + + it('should handle delegation operations after complete provision is completely slashed', async () => { + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier.address) + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier.address) + const slashTokens = provisionBefore.tokens + poolBefore.tokens + const tokensVerifier = slashTokens / 2n + + // Slash the provision for all service provider and delegation pool tokens + await horizonStaking + .connect(verifier) + .slash(serviceProvider.address, slashTokens, tokensVerifier, verifierDestination) + + const delegateAmount = ethers.parseEther('100') + const undelegateShares = ethers.parseEther('50') + + // Try to delegate to slashed pool + await graphToken.connect(delegator).approve(horizonStaking.target, delegateAmount) + await expect( + horizonStaking + .connect(delegator) + ['delegate(address,address,uint256,uint256)'](serviceProvider.address, verifier.address, delegateAmount, 0n), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Try to undelegate from slashed pool + await expect( + horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](serviceProvider.address, verifier.address, undelegateShares), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + + // Try to withdraw from slashed pool + await expect( + horizonStaking + .connect(delegator) + ['withdrawDelegated(address,address,uint256)'](serviceProvider.address, verifier.address, 1n), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPoolState') + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts new file mode 100644 index 000000000..b9c3aae44 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/add-to-delegation-pool.test.ts @@ -0,0 +1,88 @@ +import { ONE_MILLION } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Add to delegation pool', () => { + let serviceProvider: HardhatEthersSigner + let delegator: HardhatEthersSigner + let signer: HardhatEthersSigner + let verifier: string + + const maxVerifierCut = 1000000n + const thawingPeriod = 2419200n // 28 days + const tokens = ethers.parseEther('100000') + const delegationTokens = ethers.parseEther('1000') + + const graph = hre.graph() + const { stake, delegate, addToDelegationPool, provision } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + ;[serviceProvider, delegator, signer] = await graph.accounts.getTestAccounts() + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, delegator.address, ONE_MILLION) + verifier = ethers.Wallet.createRandom().address + + // Service provider stake + await stake(serviceProvider, [tokens]) + + // Create provision + const provisionTokens = ethers.parseEther('1000') + await horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, verifier, provisionTokens, maxVerifierCut, thawingPeriod) + + // Send funds to delegator and signer + await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) + await graphToken.connect(serviceProvider).transfer(signer.address, tokens) + + // Initialize delegation pool + await delegate(delegator, [serviceProvider.address, verifier, delegationTokens, 0n]) + }) + + it('should add tokens to an existing delegation pool', async () => { + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + const addTokens = ethers.parseEther('500') + + // Add tokens to the delegation pool + await addToDelegationPool(signer, [serviceProvider.address, verifier, addTokens]) + + // Verify tokens were added to the pool + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + expect(poolAfter.tokens).to.equal(poolBefore.tokens + addTokens, 'Pool tokens should increase') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Pool shares should remain the same') + }) + + it('should revert when adding tokens to a non-existent provision', async () => { + const invalidVerifier = await ethers.Wallet.createRandom().getAddress() + const addTokens = ethers.parseEther('500') + + // Attempt to add tokens to a non-existent provision + await expect( + horizonStaking.connect(signer).addToDelegationPool(serviceProvider.address, invalidVerifier, addTokens), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidProvision') + }) + + it('should revert when adding tokens to a provision with zero shares in delegation pool', async () => { + // Create new provision without any delegations + const newVerifier = await ethers.Wallet.createRandom().getAddress() + const newVerifierProvisionTokens = ethers.parseEther('1000') + await provision(serviceProvider, [ + serviceProvider.address, + newVerifier, + newVerifierProvisionTokens, + maxVerifierCut, + thawingPeriod, + ]) + + // Attempt to add tokens to the new provision + const addTokens = ethers.parseEther('500') + await expect( + horizonStaking.connect(signer).addToDelegationPool(serviceProvider.address, newVerifier, addTokens), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidDelegationPool') + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/delegator.test.ts b/packages/horizon/test/integration/after-transition-period/delegator.test.ts new file mode 100644 index 000000000..695557d36 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/delegator.test.ts @@ -0,0 +1,381 @@ +import { ONE_MILLION, ZERO_ADDRESS } from '@graphprotocol/toolshed' +import { delegators } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Delegator', () => { + let delegator: HardhatEthersSigner + let serviceProvider: HardhatEthersSigner + let newServiceProvider: HardhatEthersSigner + let verifier: string + let newVerifier: string + let snapshotId: string + const maxVerifierCut = 1000000n + const thawingPeriod = 2419200n // 28 days + const tokens = ethers.parseEther('100000') + + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + const graph = hre.graph() + const { provision, delegate } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + ;[serviceProvider, delegator, newServiceProvider] = await graph.accounts.getTestAccounts() + verifier = ethers.Wallet.createRandom().address + newVerifier = ethers.Wallet.createRandom().address + await setGRTBalance(graph.provider, graphToken.target, delegator.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, newServiceProvider.address, ONE_MILLION) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + + // Create provision + await provision(serviceProvider, [serviceProvider.address, verifier, tokens, maxVerifierCut, thawingPeriod]) + + // Send GRT to delegator and new service provider to use for delegation and staking + await graphToken.connect(serviceProvider).transfer(delegator.address, tokens) + await graphToken.connect(serviceProvider).transfer(newServiceProvider.address, tokens) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('New Protocol Users', () => { + it('should allow delegator to delegate to a service provider and verifier, undelegate and withdraw tokens', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationTokens = ethers.parseEther('1000') + + // Delegate tokens to the service provider and verifier + await delegate(delegator, [serviceProvider.address, verifier, delegationTokens, 0n]) + + // Verify delegation tokens were added to the delegation pool + const delegationPool = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + expect(delegationPool.tokens).to.equal( + delegationTokens, + 'Delegation tokens were not added to the delegation pool', + ) + + // Verify delegation shares were minted, since it's the first delegation + // shares should be equal to tokens + const delegation = await horizonStaking.getDelegation(serviceProvider.address, verifier, delegator.address) + expect(delegation.shares).to.equal(delegationTokens, 'Delegation shares were not minted correctly') + + // Undelegate tokens + await horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](serviceProvider.address, verifier, delegationTokens) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Withdraw tokens + await horizonStaking + .connect(delegator) + ['withdrawDelegated(address,address,uint256)'](serviceProvider.address, verifier, 1n) + + // Delegator should have received their tokens back + expect(await graphToken.balanceOf(delegator.address)).to.equal( + delegatorBalanceBefore, + 'Delegator balance should be the same as before delegation', + ) + }) + + it('should revert when delegating to an invalid provision', async () => { + const delegateTokens = ethers.parseEther('1000') + const invalidVerifier = await ethers.Wallet.createRandom().getAddress() + + await graphToken.connect(delegator).approve(horizonStaking.target, delegateTokens) + await expect( + horizonStaking + .connect(delegator) + ['delegate(address,address,uint256,uint256)'](serviceProvider.address, invalidVerifier, delegateTokens, 0n), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidProvision') + }) + + it('should revert when delegating less than minimum delegation', async () => { + const minDelegation = ethers.parseEther('1') + + await graphToken.connect(delegator).approve(horizonStaking.target, minDelegation - 1n) + await expect( + horizonStaking + .connect(delegator) + ['delegate(address,address,uint256,uint256)'](serviceProvider.address, verifier, minDelegation - 1n, 0n), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientDelegationTokens') + }) + + describe('Delegation pool already exists', () => { + const newProvisionTokens = ethers.parseEther('10000') + const delegationPoolTokens = ethers.parseEther('1000') + + beforeEach(async () => { + // Delegate tokens to initialize the delegation pool + await delegate(delegator, [serviceProvider.address, verifier, delegationPoolTokens, 0n]) + + // Create new provision for a new service provider and verifier combo + await provision(newServiceProvider, [ + newServiceProvider.address, + newVerifier, + newProvisionTokens, + maxVerifierCut, + thawingPeriod, + ]) + }) + + it('should allow delegator to undelegate and redelegate to new provider and verifier', async () => { + // Undelegate 20% of delegator's shares + const delegation = await horizonStaking.getDelegation(serviceProvider.address, verifier, delegator.address) + const undelegateShares = delegation.shares / 5n + + await horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](serviceProvider.address, verifier, undelegateShares) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + await delegate(delegator, [newServiceProvider.address, newVerifier, undelegateShares, 0n]) + + // Verify delegation shares were transferred to the new service provider + const delegationPool = await horizonStaking.getDelegationPool(newServiceProvider.address, newVerifier) + expect(delegationPool.tokens).to.equal( + undelegateShares, + 'Delegation tokens were not transferred to the new service provider', + ) + + const newDelegation = await horizonStaking.getDelegation( + newServiceProvider.address, + newVerifier, + delegator.address, + ) + expect(newDelegation.shares).to.equal( + undelegateShares, + 'Delegation shares were not transferred to the new service provider', + ) + }) + + it('should handle multiple undelegations with nThawRequests = 0', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationPool = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + + const delegation = await horizonStaking.getDelegation(serviceProvider.address, verifier, delegator.address) + const undelegateShares = delegation.shares / 10n + + let totalExpectedTokens = 0n + let remainingShares = delegation.shares + let remainingPoolTokens = delegationPool.tokens + + // Undelegate shares in 3 different transactions + for (let i = 0; i < 3; i++) { + const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares + totalExpectedTokens += tokensOut + + await horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](serviceProvider.address, verifier, undelegateShares) + + remainingShares -= undelegateShares + remainingPoolTokens -= tokensOut + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Withdraw all thaw requests + await horizonStaking + .connect(delegator) + ['withdrawDelegated(address,address,uint256)'](serviceProvider.address, verifier, 0n) + + // Verify tokens were transferred to delegator + expect(await graphToken.balanceOf(delegator.address)).to.equal( + delegatorBalanceBefore + totalExpectedTokens, + 'Delegator balance should be the same as before delegation', + ) + }) + + it('should handle multiple undelegations with nThawRequests = 1', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegationPool = await horizonStaking.getDelegationPool(serviceProvider.address, verifier) + + const delegation = await horizonStaking.getDelegation(serviceProvider.address, verifier, delegator.address) + const undelegateShares = delegation.shares / 10n + + let totalExpectedTokens = 0n + let remainingShares = delegation.shares + let remainingPoolTokens = delegationPool.tokens + + // Undelegate shares in 3 different transactions + for (let i = 0; i < 3; i++) { + const tokensOut = (undelegateShares * remainingPoolTokens) / remainingShares + totalExpectedTokens += tokensOut + + await horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](serviceProvider.address, verifier, undelegateShares) + + remainingShares -= undelegateShares + remainingPoolTokens -= tokensOut + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Withdraw each thaw request individually + for (let i = 0; i < 3; i++) { + await horizonStaking + .connect(delegator) + ['withdrawDelegated(address,address,uint256)'](serviceProvider.address, verifier, 1n) + } + + // Verify tokens were transferred to delegator + expect(await graphToken.balanceOf(delegator.address)).to.equal( + delegatorBalanceBefore + totalExpectedTokens, + 'Delegator balance should be the same as before delegation', + ) + }) + + it('should not revert when withdrawing before thawing period', async () => { + const delegatorBalanceBefore = await graphToken.balanceOf(delegator.address) + const delegation = await horizonStaking.getDelegation(serviceProvider.address, verifier, delegator.address) + const undelegateShares = delegation.shares / 10n + + await horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](serviceProvider.address, verifier, undelegateShares) + + await expect( + horizonStaking + .connect(delegator) + ['withdrawDelegated(address,address,uint256)'](serviceProvider.address, verifier, 1n), + ).to.not.be.reverted + + // Verify tokens were not transferred to delegator + expect(await graphToken.balanceOf(delegator.address)).to.equal( + delegatorBalanceBefore, + 'Delegator balance should be the same as before delegation', + ) + }) + }) + }) + + describe('Existing Protocol Users', () => { + let indexer: HardhatEthersSigner + let existingDelegator: HardhatEthersSigner + let delegatedTokens: bigint + + let snapshotId: string + + before(async () => { + // Get indexer + indexer = await ethers.getSigner(delegators[0].delegations[0].indexerAddress) + + // Get delegator + existingDelegator = await ethers.getSigner(delegators[0].address) + + await setGRTBalance(graph.provider, graphToken.target, indexer.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, existingDelegator.address, ONE_MILLION) + + // Get delegated tokens + delegatedTokens = delegators[0].delegations[0].tokens + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should be able to undelegate and withdraw tokens after the transition period', async () => { + // Get delegator's delegation + const delegation = await horizonStaking.getDelegation( + indexer.address, + subgraphServiceAddress, + existingDelegator.address, + ) + + // Undelegate tokens + await horizonStaking + .connect(existingDelegator) + ['undelegate(address,address,uint256)'](indexer.address, subgraphServiceAddress, delegation.shares) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(existingDelegator.address) + + // Withdraw tokens + await horizonStaking + .connect(existingDelegator) + ['withdrawDelegated(address,address,uint256)'](indexer.address, subgraphServiceAddress, 1n) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(existingDelegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + // because the delegation was before the horizon upgrade, after the upgrade there is no tax + const expectedBalanceAfter = balanceBefore + delegatedTokens - (delegatedTokens * 5000n) / 1000000n + + // Verify tokens were transferred to delegator + expect(balanceAfter).to.equal(expectedBalanceAfter, 'Tokens were not transferred to delegator') + }) + + describe('Undelegated before horizon upgrade', () => { + before(async () => { + const delegatorFixture = delegators[2] + const delegationFixture = delegatorFixture.delegations[0] + + // Get signers + indexer = await ethers.getSigner(delegationFixture.indexerAddress) + existingDelegator = await ethers.getSigner(delegatorFixture.address) + await setGRTBalance(graph.provider, graphToken.target, indexer.address, ONE_MILLION) + + // Verify delegator is undelegated + expect(delegatorFixture.undelegate).to.be.true + }) + + it('should allow delegator to withdraw tokens undelegated before horizon upgrade', async () => { + // Mine remaining blocks to complete thawing period + const oldThawingPeriod = 6646 + for (let i = 0; i < oldThawingPeriod + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(existingDelegator.address) + + // Withdraw tokens + await horizonStaking + .connect(existingDelegator) + ['withdrawDelegated(address,address)'](indexer.address, ZERO_ADDRESS) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(existingDelegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + // because the delegation was before the horizon upgrade, after the upgrade there is no tax + const expectedBalanceAfter = balanceBefore + tokens - (tokens * 5000n) / 1000000n + + // Verify tokens were transferred to delegator + expect(balanceAfter).to.equal(expectedBalanceAfter, 'Tokens were not transferred to delegator') + }) + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/multicall.test.ts b/packages/horizon/test/integration/after-transition-period/multicall.test.ts new file mode 100644 index 000000000..221f829d7 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/multicall.test.ts @@ -0,0 +1,107 @@ +import { ONE_MILLION } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Service Provider', () => { + let snapshotId: string + + const maxVerifierCut = 50_000n + const thawingPeriod = 2419200n + + const graph = hre.graph() + const { provision } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('New Protocol Users', () => { + let serviceProvider: HardhatEthersSigner + + before(async () => { + ;[, , serviceProvider] = await graph.accounts.getTestAccounts() + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + }) + + it('should allow multicalling stake+provision calls', async () => { + const tokensToStake = ethers.parseEther('1000') + const tokensToProvision = ethers.parseEther('100') + + // check state before + const beforeProvision = await horizonStaking.getProvision(serviceProvider.address, subgraphServiceAddress) + expect(beforeProvision.tokens).to.equal(0) + expect(beforeProvision.maxVerifierCut).to.equal(0) + expect(beforeProvision.thawingPeriod).to.equal(0) + expect(beforeProvision.createdAt).to.equal(0) + + // multicall + await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokensToStake) + const stakeCalldata = horizonStaking.interface.encodeFunctionData('stake', [tokensToStake]) + const provisionCalldata = horizonStaking.interface.encodeFunctionData('provision', [ + serviceProvider.address, + subgraphServiceAddress, + tokensToProvision, + maxVerifierCut, + thawingPeriod, + ]) + await horizonStaking.connect(serviceProvider).multicall([stakeCalldata, provisionCalldata]) + + // check state after + const block = await graph.provider.getBlock('latest') + const afterProvision = await horizonStaking.getProvision(serviceProvider.address, subgraphServiceAddress) + expect(afterProvision.tokens).to.equal(tokensToProvision) + expect(afterProvision.maxVerifierCut).to.equal(maxVerifierCut) + expect(afterProvision.thawingPeriod).to.equal(thawingPeriod) + expect(afterProvision.createdAt).to.equal(block?.timestamp) + }) + + it('should allow multicalling deprovision+unstake calls', async () => { + const tokens = ethers.parseEther('100') + + // setup state + await provision(serviceProvider, [ + serviceProvider.address, + subgraphServiceAddress, + tokens, + maxVerifierCut, + thawingPeriod, + ]) + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, subgraphServiceAddress, tokens) + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // check state before + const beforeServiceProviderBalance = await graphToken.balanceOf(serviceProvider.address) + + // multicall + const deprovisionCalldata = horizonStaking.interface.encodeFunctionData('deprovision', [ + serviceProvider.address, + subgraphServiceAddress, + 0n, + ]) + const unstakeCalldata = horizonStaking.interface.encodeFunctionData('unstake', [tokens]) + await horizonStaking.connect(serviceProvider).multicall([deprovisionCalldata, unstakeCalldata]) + + // check state after + const afterProvision = await horizonStaking.getProvision(serviceProvider.address, subgraphServiceAddress) + const afterServiceProviderBalance = await graphToken.balanceOf(serviceProvider.address) + + expect(afterProvision.tokens).to.equal(0) + expect(afterProvision.maxVerifierCut).to.equal(maxVerifierCut) + expect(afterProvision.thawingPeriod).to.equal(thawingPeriod) + expect(afterServiceProviderBalance).to.equal(beforeServiceProviderBalance + tokens) + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/operator.test.ts b/packages/horizon/test/integration/after-transition-period/operator.test.ts new file mode 100644 index 000000000..d74f24175 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/operator.test.ts @@ -0,0 +1,145 @@ +import { ONE_MILLION, PaymentTypes } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Operator', () => { + let serviceProvider: HardhatEthersSigner + let verifier: string + let operator: HardhatEthersSigner + + const tokens = ethers.parseEther('100000') + const maxVerifierCut = 1000000n // 100% + const thawingPeriod = 2419200n + + const graph = hre.graph() + const { stakeTo } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + // Get signers + ;[serviceProvider, operator] = await graph.accounts.getTestAccounts() + verifier = await ethers.Wallet.createRandom().getAddress() + await setGRTBalance(graph.provider, graphToken.target, operator.address, ONE_MILLION) + + // Authorize operator for verifier + await horizonStaking.connect(serviceProvider).setOperator(verifier, operator.address, true) + + // Fund operator with tokens + await graphToken.connect(serviceProvider).transfer(operator.address, tokens) + }) + + it('operator stakes using stakeTo and service provider unstakes', async () => { + const stakeTokens = ethers.parseEther('100') + const operatorBalanceBefore = await graphToken.balanceOf(operator.address) + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Operator stakes on behalf of service provider + await stakeTo(operator, [serviceProvider.address, stakeTokens]) + + // Service provider unstakes + await horizonStaking.connect(serviceProvider).unstake(stakeTokens) + + // Verify tokens were removed from operator's address + const operatorBalanceAfter = await graphToken.balanceOf(operator.address) + expect(operatorBalanceAfter).to.be.equal(operatorBalanceBefore - stakeTokens) + + // Verify tokens were added to service provider's address + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.be.equal(serviceProviderBalanceBefore + stakeTokens) + }) + + it('operator sets delegation fee cut', async () => { + const feeCut = 100000 // 10% + const paymentType = PaymentTypes.QueryFee + + // Operator sets delegation fee cut + await horizonStaking.connect(operator).setDelegationFeeCut(serviceProvider.address, verifier, paymentType, feeCut) + + // Verify fee cut + const delegationFeeCut = await horizonStaking.getDelegationFeeCut(serviceProvider.address, verifier, paymentType) + expect(delegationFeeCut).to.equal(feeCut) + }) + + describe('Provision', () => { + before(async () => { + const provisionTokens = ethers.parseEther('10000') + // Operator stakes tokens to service provider + await stakeTo(operator, [serviceProvider.address, provisionTokens]) + + // Operator creates provision + await horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, verifier, provisionTokens, maxVerifierCut, thawingPeriod) + + // Verify provision + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokens) + }) + + it('operator thaws and deprovisions', async () => { + const thawTokens = ethers.parseEther('100') + const idleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const provisionTokensBefore = (await horizonStaking.getProvision(serviceProvider.address, verifier)).tokens + + // Operator thaws tokens + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, thawTokens) + + // Increase time + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Operator deprovisions + await horizonStaking.connect(serviceProvider).deprovision(serviceProvider.address, verifier, 1n) + + // Verify idle stake increased by thawed tokens + const idleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(idleStakeAfter).to.equal(idleStakeBefore + thawTokens) + + // Verify provision tokens decreased by thawed tokens + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal(provisionTokensBefore - thawTokens) + }) + + it('operator thaws and reprovisions', async () => { + const thawTokens = ethers.parseEther('100') + + // Operator thaws tokens + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, thawTokens) + + // Increase time + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Create new verifier and authorize operator + const newVerifier = await ethers.Wallet.createRandom().getAddress() + await horizonStaking.connect(serviceProvider).setOperator(newVerifier, operator.address, true) + + // Operator creates a provision for the new verifier + await horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, newVerifier, thawTokens, maxVerifierCut, thawingPeriod) + + // Operator reprovisions + await horizonStaking.connect(serviceProvider).reprovision(serviceProvider.address, verifier, newVerifier, 1n) + }) + + it('operator sets provision parameters', async () => { + const newMaxVerifierCut = 500000 // 50% + const newThawingPeriod = 7200 // 2 hours + + // Operator sets new parameters + await horizonStaking + .connect(operator) + .setProvisionParameters(serviceProvider.address, verifier, newMaxVerifierCut, newThawingPeriod) + + // Verify new parameters + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.maxVerifierCutPending).to.equal(newMaxVerifierCut) + expect(provision.thawingPeriodPending).to.equal(newThawingPeriod) + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/pause.test.ts b/packages/horizon/test/integration/after-transition-period/pause.test.ts new file mode 100644 index 000000000..e6af8c8f8 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/pause.test.ts @@ -0,0 +1,42 @@ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Pausing', () => { + let snapshotId: string + + // Test addresses + let pauseGuardian: HardhatEthersSigner + let governor: HardhatEthersSigner + + const graph = hre.graph() + const controller = graph.horizon.contracts.Controller + + before(async () => { + pauseGuardian = await graph.accounts.getPauseGuardian() + governor = await graph.accounts.getGovernor() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('HorizonStaking', () => { + it('should be pauseable by pause guardian', async () => { + await controller.connect(pauseGuardian).setPaused(true) + expect(await controller.paused()).to.equal(true) + }) + + it('should be pauseable by governor', async () => { + await controller.connect(governor).setPaused(true) + expect(await controller.paused()).to.equal(true) + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/service-provider.test.ts b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts new file mode 100644 index 000000000..817009bc0 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/service-provider.test.ts @@ -0,0 +1,358 @@ +import { ONE_MILLION, PaymentTypes } from '@graphprotocol/toolshed' +import { indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Service provider', () => { + let verifier: string + const thawingPeriod = 2419200n + + const graph = hre.graph() + const { stake, stakeToProvision, addToProvision } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + verifier = await ethers.Wallet.createRandom().getAddress() + }) + + describe('New Protocol Users', () => { + let serviceProvider: HardhatEthersSigner + const stakeAmount = ethers.parseEther('1000') + + before(async () => { + ;[serviceProvider] = await graph.accounts.getTestAccounts() + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + }) + + it('should allow staking tokens and unstake right after', async () => { + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + await stake(serviceProvider, [stakeAmount]) + await horizonStaking.connect(serviceProvider).unstake(stakeAmount) + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal( + serviceProviderBalanceBefore, + 'Service provider balance should not change', + ) + }) + + it('should revert if unstaking more than the idle stake', async () => { + const idleStake = await horizonStaking.getIdleStake(serviceProvider.address) + await expect(horizonStaking.connect(serviceProvider).unstake(idleStake + 1n)) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientIdleStake') + .withArgs(idleStake + 1n, idleStake) + }) + + it('should be able to set delegation fee cut for payment type', async () => { + const delegationFeeCut = 10_000 // 10% + const paymentType = PaymentTypes.QueryFee + + await horizonStaking + .connect(serviceProvider) + .setDelegationFeeCut(serviceProvider.address, verifier, paymentType, delegationFeeCut) + + // Verify delegation fee cut was set + const delegationFeeCutAfterSet = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + verifier, + paymentType, + ) + expect(delegationFeeCutAfterSet).to.equal(delegationFeeCut, 'Delegation fee cut was not set') + }) + + it('should be able to set an operator for a verifier', async () => { + const operator = await ethers.Wallet.createRandom().getAddress() + await horizonStaking.connect(serviceProvider).setOperator(verifier, operator, true) + + // Verify operator was set + const isAuthorized = await horizonStaking.isAuthorized(serviceProvider.address, verifier, operator) + expect(isAuthorized).to.be.true + }) + + describe('Provision', () => { + let maxVerifierCut: bigint + + before(async () => { + const tokensToStake = ethers.parseEther('100000') + maxVerifierCut = 50_000n // 50% + const createProvisionTokens = ethers.parseEther('10000') + + // Add idle stake + await stake(serviceProvider, [tokensToStake]) + await horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, verifier, createProvisionTokens, maxVerifierCut, thawingPeriod) + }) + + it('should be able to stake to provision directly', async () => { + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + + // Add stake and provision on the same transaction + const stakeToProvisionTokens = ethers.parseEther('100') + await stakeToProvision(serviceProvider, [serviceProvider.address, verifier, stakeToProvisionTokens]) + + // Verify provision tokens were updated + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal( + provisionTokensBefore + stakeToProvisionTokens, + 'Provision tokens were not updated', + ) + }) + + it('should be able to add idle stake to provision', async () => { + let provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + const provisionTokensBefore = provision.tokens + + // Add to provision using idle stake + const addToProvisionTokens = ethers.parseEther('100') + await addToProvision(serviceProvider, [serviceProvider.address, verifier, addToProvisionTokens]) + + // Verify provision tokens were updated + provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.tokens).to.equal( + provisionTokensBefore + addToProvisionTokens, + 'Provision tokens were not updated', + ) + }) + + it('should revert if creating a provision with tokens greater than the idle stake', async () => { + const newVerifier = await ethers.Wallet.createRandom().getAddress() + const idleStake = await horizonStaking.getIdleStake(serviceProvider.address) + await expect( + horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, newVerifier, idleStake + 1n, maxVerifierCut, thawingPeriod), + ) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientIdleStake') + .withArgs(idleStake + 1n, idleStake) + }) + + it('should revert if adding to provision with tokens greater than the idle stake', async () => { + const idleStake = await horizonStaking.getIdleStake(serviceProvider.address) + await expect( + horizonStaking.connect(serviceProvider).addToProvision(serviceProvider.address, verifier, idleStake + 1n), + ) + .to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInsufficientIdleStake') + .withArgs(idleStake + 1n, idleStake) + }) + + describe('Thawing', () => { + describe('Deprovisioning', () => { + it('should be able to thaw tokens, wait for thawing period, deprovision and unstake', async () => { + const serviceProviderBalanceBefore = await graphToken.balanceOf(serviceProvider.address) + const tokensToThaw = ethers.parseEther('100') + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, tokensToThaw) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Deprovision the single thaw request + await horizonStaking.connect(serviceProvider).deprovision(serviceProvider.address, verifier, 1n) + + // Unstake + await horizonStaking.connect(serviceProvider).unstake(tokensToThaw) + + // Verify service provider balance increased by the unstake tokens + const serviceProviderBalanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(serviceProviderBalanceAfter).to.equal( + serviceProviderBalanceBefore + tokensToThaw, + 'Service provider balance should increase by the thawed tokens', + ) + }) + + it('should be able to create multiple thaw requests and deprovision all at once', async () => { + const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const tokensToThaw = ethers.parseEther('100') + // Create 10 thaw requests for 100 GRT each + for (let i = 0; i < 10; i++) { + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, tokensToThaw) + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Deprovision all thaw requests + await horizonStaking.connect(serviceProvider).deprovision(serviceProvider.address, verifier, 10n) + + // Verify service provider idle stake increased by the deprovisioned tokens + const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(serviceProviderIdleStakeAfter).to.equal( + serviceProviderIdleStakeBefore + tokensToThaw * 10n, + 'Service provider idle stake should increase by the deprovisioned tokens', + ) + }) + + it('should be able to create multiple thaw requests and deprovision one by one', async () => { + const serviceProviderIdleStakeBefore = await horizonStaking.getIdleStake(serviceProvider.address) + const tokensToThaw = ethers.parseEther('100') + // Create 3 thaw requests for 100 GRT each + for (let i = 0; i < 3; i++) { + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, tokensToThaw) + } + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Deprovision one by one + for (let i = 0; i < 3; i++) { + await horizonStaking.connect(serviceProvider).deprovision(serviceProvider.address, verifier, 1n) + } + + // Verify service provider idle stake increased by the deprovisioned tokens + const serviceProviderIdleStakeAfter = await horizonStaking.getIdleStake(serviceProvider.address) + expect(serviceProviderIdleStakeAfter).to.equal( + serviceProviderIdleStakeBefore + tokensToThaw * 3n, + 'Service provider idle stake should increase by the deprovisioned tokens', + ) + }) + }) + + describe('Reprovisioning', () => { + let newVerifier: string + + before(async () => { + newVerifier = await ethers.Wallet.createRandom().getAddress() + await horizonStaking + .connect(serviceProvider) + .provision(serviceProvider.address, newVerifier, ethers.parseEther('100'), maxVerifierCut, thawingPeriod) + }) + + it('should be able to thaw tokens, wait for thawing period and reprovision', async () => { + const serviceProviderNewProvisionSizeBefore = ( + await horizonStaking.getProvision(serviceProvider.address, newVerifier) + ).tokens + const serviceProviderOldProvisionSizeBefore = ( + await horizonStaking.getProvision(serviceProvider.address, verifier) + ).tokens + const tokensToThaw = ethers.parseEther('100') + + // Thaw tokens + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, tokensToThaw) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod)]) + await ethers.provider.send('evm_mine', []) + + // Reprovision + await horizonStaking + .connect(serviceProvider) + .reprovision(serviceProvider.address, verifier, newVerifier, 1n) + + // Verify new provision size increased by the reprovisioned tokens + const serviceProviderNewProvisionSizeAfter = ( + await horizonStaking.getProvision(serviceProvider.address, newVerifier) + ).tokens + expect(serviceProviderNewProvisionSizeAfter).to.equal( + serviceProviderNewProvisionSizeBefore + tokensToThaw, + 'New provision size should increase by the reprovisioned tokens', + ) + + // Verify old provision size decreased by the reprovisioned tokens + const serviceProviderOldProvisionSizeAfter = ( + await horizonStaking.getProvision(serviceProvider.address, verifier) + ).tokens + expect(serviceProviderOldProvisionSizeAfter).to.equal( + serviceProviderOldProvisionSizeBefore - tokensToThaw, + 'Old provision size should decrease by the reprovisioned tokens', + ) + }) + + it('should revert if thawing period is not over', async () => { + const tokensToThaw = ethers.parseEther('100') + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier, tokensToThaw) + + await expect( + horizonStaking.connect(serviceProvider).reprovision(serviceProvider.address, verifier, newVerifier, 1n), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingInvalidZeroTokens') + }) + }) + }) + + describe('Set parameters', () => { + it('should be able to set provision parameters', async () => { + const newMaxVerifierCut = 20_000 // 20% + const newThawingPeriod = 1000 + + // Set parameters + await horizonStaking + .connect(serviceProvider) + .setProvisionParameters(serviceProvider.address, verifier, newMaxVerifierCut, newThawingPeriod) + + // Verify parameters were set as pending + const provision = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provision.maxVerifierCutPending).to.equal(newMaxVerifierCut, 'Max verifier cut should be set') + expect(provision.thawingPeriodPending).to.equal(newThawingPeriod, 'Thawing period should be set') + }) + }) + }) + }) + + describe('Existing Protocol Users', () => { + let indexer: HardhatEthersSigner + let tokensToUnstake: bigint + let snapshotId: string + + before(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + await setGRTBalance(graph.provider, graphToken.target, indexer.address, ONE_MILLION) + // Set tokens + tokensToUnstake = ethers.parseEther('10000') + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should be able to unstake tokens without thawing', async () => { + // Get balance before unstaking + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Unstake tokens + await horizonStaking.connect(indexer).unstake(tokensToUnstake) + + // Verify tokens are transferred back to service provider + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal( + balanceBefore + tokensToUnstake, + 'Tokens were not transferred back to service provider', + ) + }) + + it('should be able to withdraw locked tokens after thawing period', async () => { + const oldThawingPeriod = 6646 + + // Mine blocks to complete thawing period + for (let i = 0; i < oldThawingPeriod + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Withdraw tokens + await horizonStaking.connect(indexer).withdraw() + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal( + balanceBefore + tokensToUnstake, + 'Tokens were not transferred back to service provider', + ) + }) + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/slasher.test.ts b/packages/horizon/test/integration/after-transition-period/slasher.test.ts new file mode 100644 index 000000000..cec3e4de8 --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/slasher.test.ts @@ -0,0 +1,153 @@ +import { ONE_MILLION } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Slasher', () => { + let snapshotId: string + let serviceProvider: HardhatEthersSigner + let delegator: HardhatEthersSigner + let verifier: HardhatEthersSigner + let slashingVerifier: HardhatEthersSigner + let verifierDestination: string + + const maxVerifierCut = 1000000n // 100% + const thawingPeriod = 2419200n // 28 days + const provisionTokens = ethers.parseEther('10000') + const delegationTokens = ethers.parseEther('1000') + + const graph = hre.graph() + const { provision, delegate } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + ;[serviceProvider, delegator, verifier, slashingVerifier] = await graph.accounts.getTestAccounts() + verifierDestination = ethers.Wallet.createRandom().address + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + await setGRTBalance(graph.provider, graphToken.target, delegator.address, ONE_MILLION) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + + // Create provision + await provision(serviceProvider, [ + serviceProvider.address, + verifier.address, + provisionTokens, + maxVerifierCut, + thawingPeriod, + ]) + + // Send funds to delegator + await graphToken.connect(serviceProvider).transfer(delegator.address, delegationTokens * 3n) + + // Initialize delegation pool if it does not exist + await delegate(delegator, [serviceProvider.address, verifier.address, delegationTokens, 0n]) + + // Send eth to verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: verifier, + value: ethers.parseEther('0.1'), + }) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('should slash service provider tokens', async () => { + const slashTokens = ethers.parseEther('1000') + const tokensVerifier = slashTokens / 2n + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier) + const verifierDestinationBalanceBefore = await graphToken.balanceOf(verifierDestination) + + // Slash provision + await horizonStaking + .connect(verifier) + .slash(serviceProvider.address, slashTokens, tokensVerifier, verifierDestination) + + // Verify provision tokens are reduced + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provisionAfter.tokens).to.equal(provisionBefore.tokens - slashTokens, 'Provision tokens should be reduced') + + // Verify verifier destination received the tokens + const verifierDestinationBalanceAfter = await graphToken.balanceOf(verifierDestination) + expect(verifierDestinationBalanceAfter).to.equal( + verifierDestinationBalanceBefore + tokensVerifier, + 'Verifier destination should receive the tokens', + ) + }) + + it('should slash service provider tokens when tokens are thawing', async () => { + // Start thawing + const thawTokens = ethers.parseEther('1000') + await horizonStaking.connect(serviceProvider).thaw(serviceProvider.address, verifier.address, thawTokens) + + const slashTokens = ethers.parseEther('500') + const tokensVerifier = slashTokens / 2n + const provisionBefore = await horizonStaking.getProvision(serviceProvider.address, verifier) + const verifierDestinationBalanceBefore = await graphToken.balanceOf(verifierDestination) + + // Slash provision + await horizonStaking + .connect(verifier) + .slash(serviceProvider.address, slashTokens, tokensVerifier, verifierDestination) + + // Verify provision tokens are reduced + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, verifier) + expect(provisionAfter.tokens).to.equal(provisionBefore.tokens - slashTokens, 'Provision tokens should be reduced') + + // Verify verifier destination received the tokens + const verifierDestinationBalanceAfter = await graphToken.balanceOf(verifierDestination) + expect(verifierDestinationBalanceAfter).to.equal( + verifierDestinationBalanceBefore + tokensVerifier, + 'Verifier destination should receive the tokens', + ) + }) + + it('should only slash service provider when delegation slashing is disabled', async () => { + const slashTokens = provisionTokens + delegationTokens + const tokensVerifier = slashTokens / 2n + + // Send eth to slashing verifier to cover gas fees + await serviceProvider.sendTransaction({ + to: slashingVerifier.address, + value: ethers.parseEther('0.5'), + }) + + // Create provision for slashing verifier + await provision(serviceProvider, [ + serviceProvider.address, + slashingVerifier.address, + provisionTokens, + maxVerifierCut, + thawingPeriod, + ]) + + // Initialize delegation pool for slashing verifier + await delegate(serviceProvider, [serviceProvider.address, slashingVerifier.address, delegationTokens, 0n]) + + // Get delegation pool state before slashing + const poolBefore = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + + // Slash the provision for all service provider and delegation pool tokens + await horizonStaking + .connect(slashingVerifier) + .slash(serviceProvider.address, slashTokens, tokensVerifier, verifierDestination) + + // Verify provision tokens were completely slashed + const provisionAfter = await horizonStaking.getProvision(serviceProvider.address, slashingVerifier.address) + expect(provisionAfter.tokens).to.be.equal(0, 'Provision tokens should be slashed completely') + + // Verify delegation pool tokens are not reduced + const poolAfter = await horizonStaking.getDelegationPool(serviceProvider.address, slashingVerifier.address) + expect(poolAfter.tokens).to.equal(poolBefore.tokens, 'Delegation pool tokens should not be reduced') + expect(poolAfter.shares).to.equal(poolBefore.shares, 'Delegation pool shares should remain the same') + }) +}) diff --git a/packages/horizon/test/integration/after-transition-period/upgrade.test.ts b/packages/horizon/test/integration/after-transition-period/upgrade.test.ts new file mode 100644 index 000000000..52b9b8dfc --- /dev/null +++ b/packages/horizon/test/integration/after-transition-period/upgrade.test.ts @@ -0,0 +1,93 @@ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { zeroPadValue } from 'ethers' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +const abi = [ + { + inputs: [ + { + internalType: 'contract ITransparentUpgradeableProxy', + name: 'proxy', + type: 'address', + }, + { + internalType: 'address', + name: 'implementation', + type: 'address', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'upgradeAndCall', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, +] + +describe('Upgrading contracts', () => { + let snapshotId: string + + // Test addresses + let governor: HardhatEthersSigner + const graph = hre.graph() + + before(async () => { + governor = await graph.accounts.getGovernor() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('GraphPayments should be upgradeable by the governor', async () => { + const entry = graph.horizon.addressBook.getEntry('GraphPayments') + const proxyAdmin = entry.proxyAdmin! + const proxy = entry.address + + // Upgrade the contract to a different implementation + // the implementation we use is the GraphTallyCollector, this is obviously absurd but we just need an address with code on it + const ProxyAdmin = new ethers.Contract(proxyAdmin, abi, governor) + await ProxyAdmin.upgradeAndCall(proxy, graph.horizon.contracts.GraphTallyCollector.target, '0x') + + // https:// github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/ERC1967/ERC1967Utils.sol#L37C53-L37C119 + const implementation = await hre.ethers.provider.getStorage( + proxy, + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc', + ) + expect(zeroPadValue(implementation, 32)).to.equal( + zeroPadValue(graph.horizon.contracts.GraphTallyCollector.target as string, 32), + ) + }) + + it('PaymentsEscrow should be upgradeable by the governor', async () => { + const entry = graph.horizon.addressBook.getEntry('PaymentsEscrow') + const proxyAdmin = entry.proxyAdmin! + const proxy = entry.address + + // Upgrade the contract to a different implementation + // the implementation we use is the GraphTallyCollector, this is obviously absurd but we just need an address with code on it + const ProxyAdmin = new ethers.Contract(proxyAdmin, abi, governor) + await ProxyAdmin.upgradeAndCall(proxy, graph.horizon.contracts.GraphTallyCollector.target, '0x') + + // https:// github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/ERC1967/ERC1967Utils.sol#L37C53-L37C119 + const implementation = await hre.ethers.provider.getStorage( + proxy, + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc', + ) + expect(zeroPadValue(implementation, 32)).to.equal( + zeroPadValue(graph.horizon.contracts.GraphTallyCollector.target as string, 32), + ) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/delegator.test.ts b/packages/horizon/test/integration/during-transition-period/delegator.test.ts new file mode 100644 index 000000000..352599f18 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/delegator.test.ts @@ -0,0 +1,143 @@ +import { ZERO_ADDRESS } from '@graphprotocol/toolshed' +import { delegators } from '@graphprotocol/toolshed/fixtures' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Delegator', () => { + let snapshotId: string + + const thawingPeriod = 2419200n // 28 days + + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + + const graph = hre.graph() + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Existing Protocol Users', () => { + describe('User undelegated before horizon was deployed', () => { + let indexer: HardhatEthersSigner + let delegator: HardhatEthersSigner + let tokens: bigint + + before(async () => { + const delegatorFixture = delegators[2] + const delegationFixture = delegatorFixture.delegations[0] + + // Verify delegator is undelegated + expect(delegatorFixture.undelegate).to.be.true + + // Get signers + indexer = await ethers.getSigner(delegationFixture.indexerAddress) + delegator = await ethers.getSigner(delegatorFixture.address) + + // Get tokens + tokens = delegationFixture.tokens + }) + + it('should be able to withdraw their tokens after the thawing period', async () => { + // Get the thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine remaining blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(delegator.address) + + // Withdraw tokens + await horizonStaking.connect(delegator)['withdrawDelegated(address,address)'](indexer.address, ZERO_ADDRESS) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(delegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + const expectedBalanceAfter = balanceBefore + tokens - (tokens * 5000n) / 1000000n + + // Verify tokens are withdrawn + expect(balanceAfter).to.equal(expectedBalanceAfter) + }) + + it('should revert if the thawing period has not passed', async () => { + // Withdraw tokens + await expect( + horizonStaking.connect(delegator)['withdrawDelegated(address,address)'](indexer.address, ZERO_ADDRESS), + ).to.be.revertedWithCustomError(horizonStaking, 'HorizonStakingNothingToWithdraw') + }) + }) + + describe('Transition period is over', () => { + let governor: HardhatEthersSigner + let indexer: HardhatEthersSigner + let delegator: HardhatEthersSigner + let tokens: bigint + + before(async () => { + const delegatorFixture = delegators[0] + const delegationFixture = delegatorFixture.delegations[0] + + // Get signers + governor = await graph.accounts.getGovernor() + indexer = await ethers.getSigner(delegationFixture.indexerAddress) + delegator = await ethers.getSigner(delegatorFixture.address) + + // Get tokens + tokens = delegationFixture.tokens + }) + + it('should be able to undelegate during transition period and withdraw after transition period', async () => { + // Get delegator's delegation + const delegation = await horizonStaking.getDelegation( + indexer.address, + subgraphServiceAddress, + delegator.address, + ) + + // Undelegate tokens + await horizonStaking + .connect(delegator) + ['undelegate(address,address,uint256)'](indexer.address, subgraphServiceAddress, delegation.shares) + + // Wait for thawing period + await ethers.provider.send('evm_increaseTime', [Number(thawingPeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Clear thawing period + await horizonStaking.connect(governor).clearThawingPeriod() + + // Get delegator balance before withdrawing + const balanceBefore = await graphToken.balanceOf(delegator.address) + + // Withdraw tokens + await horizonStaking + .connect(delegator) + ['withdrawDelegated(address,address,uint256)'](indexer.address, ZERO_ADDRESS, BigInt(1)) + + // Get delegator balance after withdrawing + const balanceAfter = await graphToken.balanceOf(delegator.address) + + // Expected balance after is the balance before plus the tokens minus the 0.5% delegation tax + // because the delegation was before the horizon upgrade, after the upgrade there is no tax + const expectedBalanceAfter = balanceBefore + tokens - (tokens * 5000n) / 1000000n + + // Verify tokens are withdrawn + expect(balanceAfter).to.equal(expectedBalanceAfter) + }) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/multicall.test.ts b/packages/horizon/test/integration/during-transition-period/multicall.test.ts new file mode 100644 index 000000000..948cd8f5f --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/multicall.test.ts @@ -0,0 +1,114 @@ +import { ONE_MILLION, PaymentTypes } from '@graphprotocol/toolshed' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Service Provider', () => { + let snapshotId: string + + const maxVerifierCut = 50_000n + const thawingPeriod = 2419200n + + const graph = hre.graph() + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('New Protocol Users', () => { + let serviceProvider: HardhatEthersSigner + + before(async () => { + ;[, , serviceProvider] = await graph.accounts.getTestAccounts() + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + }) + + it('should allow multicalling stake+provision calls', async () => { + const tokensToStake = ethers.parseEther('1000') + const tokensToProvision = ethers.parseEther('100') + + // check state before + const beforeProvision = await horizonStaking.getProvision(serviceProvider.address, subgraphServiceAddress) + expect(beforeProvision.tokens).to.equal(0) + expect(beforeProvision.maxVerifierCut).to.equal(0) + expect(beforeProvision.thawingPeriod).to.equal(0) + expect(beforeProvision.createdAt).to.equal(0) + + // multicall + await graphToken.connect(serviceProvider).approve(horizonStaking.target, tokensToStake) + const stakeCalldata = horizonStaking.interface.encodeFunctionData('stake', [tokensToStake]) + const provisionCalldata = horizonStaking.interface.encodeFunctionData('provision', [ + serviceProvider.address, + subgraphServiceAddress, + tokensToProvision, + maxVerifierCut, + thawingPeriod, + ]) + await horizonStaking.connect(serviceProvider).multicall([stakeCalldata, provisionCalldata]) + + // check state after + const block = await graph.provider.getBlock('latest') + const afterProvision = await horizonStaking.getProvision(serviceProvider.address, subgraphServiceAddress) + expect(afterProvision.tokens).to.equal(tokensToProvision) + expect(afterProvision.maxVerifierCut).to.equal(maxVerifierCut) + expect(afterProvision.thawingPeriod).to.equal(thawingPeriod) + expect(afterProvision.createdAt).to.equal(block?.timestamp) + }) + + it('should allow multicalling delegation parameter set calls', async () => { + // check state before + const beforeIndexingRewards = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + subgraphServiceAddress, + PaymentTypes.IndexingRewards, + ) + const beforeQueryFee = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + subgraphServiceAddress, + PaymentTypes.QueryFee, + ) + expect(beforeIndexingRewards).to.equal(0) + expect(beforeQueryFee).to.equal(0) + + // multicall + const indexingRewardsCalldata = horizonStaking.interface.encodeFunctionData('setDelegationFeeCut', [ + serviceProvider.address, + subgraphServiceAddress, + PaymentTypes.IndexingRewards, + 10_000n, + ]) + const queryFeeCalldata = horizonStaking.interface.encodeFunctionData('setDelegationFeeCut', [ + serviceProvider.address, + subgraphServiceAddress, + PaymentTypes.QueryFee, + 12_345n, + ]) + await horizonStaking.connect(serviceProvider).multicall([indexingRewardsCalldata, queryFeeCalldata]) + + // check state after + const afterIndexingRewards = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + subgraphServiceAddress, + PaymentTypes.IndexingRewards, + ) + const afterQueryFee = await horizonStaking.getDelegationFeeCut( + serviceProvider.address, + subgraphServiceAddress, + PaymentTypes.QueryFee, + ) + expect(afterIndexingRewards).to.equal(10_000n) + expect(afterQueryFee).to.equal(12_345n) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/operator.test.ts b/packages/horizon/test/integration/during-transition-period/operator.test.ts new file mode 100644 index 000000000..ab5b26ebf --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/operator.test.ts @@ -0,0 +1,99 @@ +import { generatePOI } from '@graphprotocol/toolshed' +import { indexers } from '@graphprotocol/toolshed/fixtures' +import { getEventData } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Operator', () => { + let snapshotId: string + + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + + const graph = hre.graph() + const horizonStaking = graph.horizon.contracts.HorizonStaking + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Existing Protocol Users', () => { + let indexer: HardhatEthersSigner + let operator: HardhatEthersSigner + let allocationID: string + let allocationTokens: bigint + let delegationIndexingCut: number + + before(async () => { + const indexerFixture = indexers[0] + const allocationFixture = indexerFixture.allocations[0] + + // Get signers + indexer = await ethers.getSigner(indexerFixture.address) + ;[operator] = await graph.accounts.getTestAccounts() + + // Get allocation details + allocationID = allocationFixture.allocationID + allocationTokens = allocationFixture.tokens + delegationIndexingCut = indexerFixture.indexingRewardCut + + // Set the operator + await horizonStaking.connect(indexer).setOperator(subgraphServiceAddress, operator.address, true) + }) + + it('should allow the operator to close an open legacy allocation and collect rewards', async () => { + // Use a non-zero POI + const poi = generatePOI('poi') + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Get delegation pool before closing allocation + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get idle stake before closing allocation + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Close allocation + const tx = await horizonStaking.connect(operator).closeAllocation(allocationID, poi) + const eventData = await getEventData( + tx, + 'event HorizonRewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount)', + ) + const rewards = eventData[2] + + // Verify rewards are not zero + expect(rewards).to.not.equal(0, 'Rewards were not transferred to service provider') + + // Verify rewards minus delegation cut are restaked + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + const idleStakeRewardsTokens = (rewards * BigInt(delegationIndexingCut)) / 1000000n + expect(idleStakeAfter).to.equal( + idleStakeBefore + allocationTokens + idleStakeRewardsTokens, + 'Rewards were not restaked', + ) + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationRewardsTokens = rewards - idleStakeRewardsTokens + expect(delegationPoolTokensAfter).to.equal( + delegationPoolTokensBefore + delegationRewardsTokens, + 'Delegators cut was not added to delegation pool', + ) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/permissionless.test.ts b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts new file mode 100644 index 000000000..a7d13e302 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/permissionless.test.ts @@ -0,0 +1,66 @@ +import { generatePOI } from '@graphprotocol/toolshed' +import { indexers } from '@graphprotocol/toolshed/fixtures' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Permissionless', () => { + let snapshotId: string + + const graph = hre.graph() + const horizonStaking = graph.horizon.contracts.HorizonStaking + const epochManager = graph.horizon.contracts.EpochManager + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('After max allocation epochs', () => { + let indexer: HardhatEthersSigner + let anySigner: HardhatEthersSigner + let allocationID: string + let allocationTokens: bigint + + before(async () => { + // Get signers + indexer = await ethers.getSigner(indexers[0].address) + ;[anySigner] = await graph.accounts.getTestAccounts() + + // ensure anySigner is not operator for the indexer + await horizonStaking.connect(indexer).setOperator(subgraphServiceAddress, anySigner.address, false) + + // Get allocation details + allocationID = indexers[0].allocations[0].allocationID + allocationTokens = indexers[0].allocations[0].tokens + }) + + it('should allow any user to close an allocation after 28 epochs', async () => { + // Get indexer's idle stake before closing allocation + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Mine blocks to simulate 28 epochs passing + const startingEpoch = await epochManager.currentEpoch() + while ((await epochManager.currentEpoch()) - startingEpoch < 28) { + await ethers.provider.send('evm_mine', []) + } + + // Close allocation + const poi = generatePOI('poi') + await horizonStaking.connect(anySigner).closeAllocation(allocationID, poi) + + // Get indexer's idle stake after closing allocation + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + + // Verify allocation tokens were added to indexer's idle stake but no rewards were collected + expect(idleStakeAfter).to.be.equal(idleStakeBefore + allocationTokens) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/service-provider.test.ts b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts new file mode 100644 index 000000000..0be3c6112 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/service-provider.test.ts @@ -0,0 +1,521 @@ +import { generatePOI, ONE_MILLION } from '@graphprotocol/toolshed' +import { indexers } from '@graphprotocol/toolshed/fixtures' +import { getEventData, setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Service Provider', () => { + let snapshotId: string + + const graph = hre.graph() + const { stake, collect } = graph.horizon.actions + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + // Subgraph service address is not set for integration tests + const subgraphServiceAddress = '0x0000000000000000000000000000000000000000' + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('New Protocol Users', () => { + let serviceProvider: HardhatEthersSigner + let tokensToStake = ethers.parseEther('1000') + + before(async () => { + ;[, , serviceProvider] = await graph.accounts.getTestAccounts() + await setGRTBalance(graph.provider, graphToken.target, serviceProvider.address, ONE_MILLION) + + // Stake tokens to service provider + await stake(serviceProvider, [tokensToStake]) + }) + + it('should allow service provider to unstake and withdraw after thawing period', async () => { + const tokensToUnstake = ethers.parseEther('100') + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // First unstake request + await horizonStaking.connect(serviceProvider).unstake(tokensToUnstake) + + // During transition period, tokens are locked by thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine remaining blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Now we can withdraw + await horizonStaking.connect(serviceProvider).withdraw() + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + + expect(balanceAfter).to.equal( + balanceBefore + tokensToUnstake, + 'Tokens were not transferred back to service provider', + ) + }) + + it('should handle multiple unstake requests correctly', async () => { + // Make multiple unstake requests + const request1 = ethers.parseEther('50') + const request2 = ethers.parseEther('75') + + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // First unstake request + await horizonStaking.connect(serviceProvider).unstake(request1) + + // Mine half of thawing period blocks + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Second unstake request + await horizonStaking.connect(serviceProvider).unstake(request2) + + // Mine remaining blocks to complete first unstake thawing period + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Check that withdraw reverts since thawing period is not complete + await expect(horizonStaking.connect(serviceProvider).withdraw()).to.be.revertedWithCustomError( + horizonStaking, + 'HorizonStakingStillThawing', + ) + + // Mine remaining blocks to complete thawing period + for (let i = 0; i < halfThawingPeriod + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Withdraw all thawed tokens + await horizonStaking.connect(serviceProvider).withdraw() + + // Verify all tokens are withdrawn and transferred back to service provider + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(balanceAfter).to.equal( + balanceBefore + request1 + request2, + 'Tokens were not transferred back to service provider', + ) + }) + + describe('Transition period is over', () => { + let governor: HardhatEthersSigner + let tokensToUnstake: bigint + + before(async () => { + // Get governor + governor = await graph.accounts.getGovernor() + + // Set tokens + tokensToStake = ethers.parseEther('100000') + tokensToUnstake = ethers.parseEther('10000') + }) + + it('should be able to withdraw tokens that were unstaked during transition period', async () => { + // Stake tokens + await stake(serviceProvider, [tokensToStake]) + + // Unstake tokens + await horizonStaking.connect(serviceProvider).unstake(tokensToUnstake) + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Get thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Clear thawing period + await horizonStaking.connect(governor).clearThawingPeriod() + + // Mine blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Withdraw tokens + await horizonStaking.connect(serviceProvider).withdraw() + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(balanceAfter).to.equal( + balanceBefore + tokensToUnstake, + 'Tokens were not transferred back to service provider', + ) + }) + + it('should be able to unstake tokens without a thawing period', async () => { + // Stake tokens + await stake(serviceProvider, [tokensToStake]) + + // Clear thawing period + await horizonStaking.connect(governor).clearThawingPeriod() + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(serviceProvider.address) + + // Unstake tokens + await horizonStaking.connect(serviceProvider).unstake(tokensToUnstake) + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(serviceProvider.address) + expect(balanceAfter).to.equal( + balanceBefore + tokensToUnstake, + 'Tokens were not transferred back to service provider', + ) + }) + }) + }) + + describe('Existing Protocol Users', () => { + let indexer: HardhatEthersSigner + let tokensUnstaked: bigint + + before(async () => { + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + tokensUnstaked = indexerFixture.tokensToUnstake || 0n + + await setGRTBalance(graph.provider, graphToken.target, indexer.address, ONE_MILLION) + }) + + it('should allow service provider to withdraw their locked tokens after thawing period passes', async () => { + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Get thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Withdraw tokens + await horizonStaking.connect(indexer).withdraw() + + // Verify tokens are transferred back to service provider + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal( + balanceBefore + tokensUnstaked, + 'Tokens were not transferred back to service provider', + ) + }) + + describe('Legacy allocations', () => { + describe('Restaking', () => { + let delegationIndexingCut: number + let delegationQueryFeeCut: number + let allocationID: string + let allocationTokens: bigint + let gateway: HardhatEthersSigner + + beforeEach(async () => { + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + delegationIndexingCut = indexerFixture.indexingRewardCut + delegationQueryFeeCut = indexerFixture.queryFeeCut + allocationID = indexerFixture.allocations[0].allocationID + allocationTokens = indexerFixture.allocations[0].tokens + gateway = await graph.accounts.getGateway() + await setGRTBalance(graph.provider, graphToken.target, gateway.address, ONE_MILLION) + }) + + it('should be able to close an open legacy allocation and collect rewards', async () => { + // Use a non-zero POI + const poi = generatePOI('poi') + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Get delegation pool before closing allocation + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get idle stake before closing allocation + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Close allocation + const tx = await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) + const eventData = await getEventData( + tx, + 'event HorizonRewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount)', + ) + const rewards = eventData[2] + + // Verify rewards are not zero + expect(rewards).to.not.equal(0, 'Rewards were not transferred to service provider') + + // Verify rewards minus delegation cut are restaked + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + const idleStakeRewardsTokens = (rewards * BigInt(delegationIndexingCut)) / 1000000n + expect(idleStakeAfter).to.equal( + idleStakeBefore + allocationTokens + idleStakeRewardsTokens, + 'Rewards were not restaked', + ) + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationRewardsTokens = rewards - idleStakeRewardsTokens + expect(delegationPoolTokensAfter).to.equal( + delegationPoolTokensBefore + delegationRewardsTokens, + 'Delegators cut was not added to delegation pool', + ) + }) + + it('should be able to collect query fees', async () => { + const tokensToCollect = ethers.parseEther('1000') + + // Get idle stake before collecting + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Get delegation pool before collecting + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Collect query fees + await collect(gateway, [tokensToCollect, allocationID]) + + // Get idle stake after collecting + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) + const protocolTax = (tokensToCollect * 1n) / 100n + const curationFees = (tokensToCollect * 99n) / 1000n + const remainingTokens = tokensToCollect - protocolTax - curationFees + + // Verify tokens minus delegators cut are restaked + const indexerCutTokens = (remainingTokens * BigInt(delegationQueryFeeCut)) / 1000000n + expect(idleStakeAfter).to.equal(idleStakeBefore + indexerCutTokens, 'Indexer cut was not restaked') + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationCutTokens = remainingTokens - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal( + delegationPoolTokensBefore + delegationCutTokens, + 'Delegators cut was not added to delegation pool', + ) + }) + + it('should be able to close an allocation and collect query fees for the closed allocation', async () => { + // Use a non-zero POI + const poi = generatePOI('poi') + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Close allocation + await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) + + // Tokens to collect + const tokensToCollect = ethers.parseEther('1000') + + // Get idle stake before collecting + const idleStakeBefore = await horizonStaking.getIdleStake(indexer.address) + + // Get delegation pool before collecting + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Collect query fees + await collect(gateway, [tokensToCollect, allocationID]) + + // Get idle stake after collecting + const idleStakeAfter = await horizonStaking.getIdleStake(indexer.address) + + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) + const protocolTax = (tokensToCollect * 1n) / 100n + const curationFees = (tokensToCollect * 99n) / 1000n + const remainingTokens = tokensToCollect - protocolTax - curationFees + + // Verify tokens minus delegators cut are restaked + const indexerCutTokens = (remainingTokens * BigInt(delegationQueryFeeCut)) / 1000000n + expect(idleStakeAfter).to.equal(idleStakeBefore + indexerCutTokens, 'Indexer cut was not restaked') + + // Verify delegators cut is added to delegation pool + const delegationPool = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPool.tokens + const delegationCutTokens = remainingTokens - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal( + delegationPoolTokensBefore + delegationCutTokens, + 'Delegators cut was not added to delegation pool', + ) + }) + }) + + describe('With rewardsDestination set', () => { + let delegationIndexingCut: number + let delegationQueryFeeCut: number + let rewardsDestination: string + let allocationID: string + let gateway: HardhatEthersSigner + + beforeEach(async () => { + const indexerFixture = indexers[1] + indexer = await ethers.getSigner(indexerFixture.address) + delegationIndexingCut = indexerFixture.indexingRewardCut + delegationQueryFeeCut = indexerFixture.queryFeeCut + rewardsDestination = indexerFixture.rewardsDestination! + allocationID = indexerFixture.allocations[0].allocationID + gateway = await graph.accounts.getGateway() + await setGRTBalance(graph.provider, graphToken.target, gateway.address, ONE_MILLION) + }) + + it('should be able to close an open allocation and collect rewards', async () => { + // Use a non-zero POI + const poi = generatePOI('poi') + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Get delegation tokens before + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Mine blocks to simulate time passing + const halfThawingPeriod = Number(thawingPeriod) / 2 + for (let i = 0; i < halfThawingPeriod; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get rewards destination balance before closing allocation + const balanceBefore = await graphToken.balanceOf(rewardsDestination) + + // Close allocation + const tx = await horizonStaking.connect(indexer).closeAllocation(allocationID, poi) + const eventData = await getEventData( + tx, + 'event HorizonRewardsAssigned(address indexed indexer, address indexed allocationID, uint256 amount)', + ) + const rewards = eventData[2] + + // Verify rewards are not zero + expect(rewards).to.not.equal(0, 'Rewards were not transferred to rewards destination') + + // Verify indexer rewards cut is transferred to rewards destination + const balanceAfter = await graphToken.balanceOf(rewardsDestination) + const indexerCutTokens = (rewards * BigInt(delegationIndexingCut)) / 1000000n + expect(balanceAfter).to.equal( + balanceBefore + indexerCutTokens, + 'Indexer cut was not transferred to rewards destination', + ) + + // Verify delegators cut is added to delegation pool + const delegationPoolAfter = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPoolAfter.tokens + const delegationCutTokens = rewards - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal( + delegationPoolTokensBefore + delegationCutTokens, + 'Delegators cut was not added to delegation pool', + ) + }) + + it('should be able to collect query fees', async () => { + const tokensToCollect = ethers.parseEther('1000') + + // Get rewards destination balance before collecting + const balanceBefore = await graphToken.balanceOf(rewardsDestination) + + // Get delegation tokens before + const delegationPoolBefore = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensBefore = delegationPoolBefore.tokens + + // Collect query fees + await collect(gateway, [tokensToCollect, allocationID]) + + // Get rewards destination balance after collecting + const balanceAfter = await graphToken.balanceOf(rewardsDestination) + + // Subtract protocol tax (1%) and curation fees (10% after the protocol tax deduction) + const protocolTax = (tokensToCollect * 1n) / 100n + const curationFees = (tokensToCollect * 99n) / 1000n + const remainingTokens = tokensToCollect - protocolTax - curationFees + + // Verify indexer cut is transferred to rewards destination + const indexerCutTokens = (remainingTokens * BigInt(delegationQueryFeeCut)) / 1000000n + expect(balanceAfter).to.equal( + balanceBefore + indexerCutTokens, + 'Indexer cut was not transferred to rewards destination', + ) + + // Verify delegators cut is added to delegation pool + const delegationPoolAfter = await horizonStaking.getDelegationPool(indexer.address, subgraphServiceAddress) + const delegationPoolTokensAfter = delegationPoolAfter.tokens + const delegationCutTokens = remainingTokens - indexerCutTokens + expect(delegationPoolTokensAfter).to.equal( + delegationPoolTokensBefore + delegationCutTokens, + 'Delegators cut was not added to delegation pool', + ) + }) + }) + }) + + describe('Transition period is over', () => { + let governor: HardhatEthersSigner + let tokensToUnstake: bigint + + before(async () => { + // Get governor + governor = await graph.accounts.getGovernor() + + // Get indexer + const indexerFixture = indexers[2] + indexer = await ethers.getSigner(indexerFixture.address) + + // Set tokens + tokensToUnstake = ethers.parseEther('10000') + }) + + it('should be able to withdraw tokens that were unstaked during transition period', async () => { + // Unstake tokens during transition period + await horizonStaking.connect(indexer).unstake(tokensToUnstake) + + // Get thawing period + const thawingPeriod = await horizonStaking.__DEPRECATED_getThawingPeriod() + + // Clear thawing period + await horizonStaking.connect(governor).clearThawingPeriod() + + // Mine blocks to complete thawing period + for (let i = 0; i < Number(thawingPeriod) + 1; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Get balance before withdrawing + const balanceBefore = await graphToken.balanceOf(indexer.address) + + // Withdraw tokens + await horizonStaking.connect(indexer).withdraw() + + // Get balance after withdrawing + const balanceAfter = await graphToken.balanceOf(indexer.address) + expect(balanceAfter).to.equal( + balanceBefore + tokensToUnstake, + 'Tokens were not transferred back to service provider', + ) + }) + }) + }) +}) diff --git a/packages/horizon/test/integration/during-transition-period/slasher.test.ts b/packages/horizon/test/integration/during-transition-period/slasher.test.ts new file mode 100644 index 000000000..47ced0883 --- /dev/null +++ b/packages/horizon/test/integration/during-transition-period/slasher.test.ts @@ -0,0 +1,88 @@ +import { indexers } from '@graphprotocol/toolshed/fixtures' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Slasher', () => { + let snapshotId: string + + let indexer: string + let slasher: HardhatEthersSigner + let tokensToSlash: bigint + + const graph = hre.graph() + const horizonStaking = graph.horizon.contracts.HorizonStaking + const graphToken = graph.horizon.contracts.L2GraphToken + + before(async () => { + slasher = await graph.accounts.getArbitrator() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Available tokens', () => { + before(() => { + const indexerFixture = indexers[0] + indexer = indexerFixture.address + tokensToSlash = ethers.parseEther('10000') + }) + + it('should be able to slash indexer stake', async () => { + // Before slash state + const idleStakeBeforeSlash = await horizonStaking.getIdleStake(indexer) + const tokensVerifier = tokensToSlash / 2n + const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) + + // Slash tokens + await horizonStaking.connect(slasher).slash(indexer, tokensToSlash, tokensVerifier, slasher.address) + + // Indexer's stake should have decreased + const idleStakeAfterSlash = await horizonStaking.getIdleStake(indexer) + expect(idleStakeAfterSlash).to.equal(idleStakeBeforeSlash - tokensToSlash, 'Indexer stake should have decreased') + + // Slasher should have received the tokens + const slasherAfterBalance = await graphToken.balanceOf(slasher.address) + expect(slasherAfterBalance).to.equal( + slasherBeforeBalance + tokensVerifier, + 'Slasher should have received the tokens', + ) + }) + }) + + describe('Locked tokens', () => { + before(() => { + const indexerFixture = indexers[1] + indexer = indexerFixture.address + tokensToSlash = indexerFixture.stake + }) + + it('should be able to slash locked tokens', async () => { + // Before slash state + const tokensVerifier = tokensToSlash / 2n + const slasherBeforeBalance = await graphToken.balanceOf(slasher.address) + + // Slash tokens + await horizonStaking.connect(slasher).slash(indexer, tokensToSlash, tokensVerifier, slasher.address) + + // Indexer's entire stake should have been slashed + const indexerStakeAfterSlash = await horizonStaking.getServiceProvider(indexer) + expect(indexerStakeAfterSlash.tokensStaked).to.equal(0n, 'Indexer stake should have been slashed') + + // Slasher should have received the tokens + const slasherAfterBalance = await graphToken.balanceOf(slasher.address) + expect(slasherAfterBalance).to.equal( + slasherBeforeBalance + tokensVerifier, + 'Slasher should have received the tokens', + ) + }) + }) +}) diff --git a/packages/horizon/test/unit/GraphBase.t.sol b/packages/horizon/test/unit/GraphBase.t.sol new file mode 100644 index 000000000..f3f55b96a --- /dev/null +++ b/packages/horizon/test/unit/GraphBase.t.sol @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { Create2 } from "@openzeppelin/contracts/utils/Create2.sol"; +import { GraphProxyAdmin } from "@graphprotocol/contracts/contracts/upgrades/GraphProxyAdmin.sol"; +import { GraphProxy } from "@graphprotocol/contracts/contracts/upgrades/GraphProxy.sol"; +import { Controller } from "@graphprotocol/contracts/contracts/governance/Controller.sol"; +import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import { PaymentsEscrow } from "contracts/payments/PaymentsEscrow.sol"; +import { GraphPayments } from "contracts/payments/GraphPayments.sol"; +import { GraphTallyCollector } from "contracts/payments/collectors/GraphTallyCollector.sol"; +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; +import { HorizonStaking } from "contracts/staking/HorizonStaking.sol"; +import { HorizonStakingExtension } from "contracts/staking/HorizonStakingExtension.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { MockGRTToken } from "../../contracts/mocks/MockGRTToken.sol"; +import { EpochManagerMock } from "contracts/mocks/EpochManagerMock.sol"; +import { RewardsManagerMock } from "contracts/mocks/RewardsManagerMock.sol"; +import { CurationMock } from "contracts/mocks/CurationMock.sol"; +import { Constants } from "./utils/Constants.sol"; +import { Users } from "./utils/Users.sol"; +import { Utils } from "./utils/Utils.sol"; + +abstract contract GraphBaseTest is IHorizonStakingTypes, Utils, Constants { + /* + * VARIABLES + */ + + /* Contracts */ + + GraphProxyAdmin public proxyAdmin; + Controller public controller; + MockGRTToken public token; + GraphPayments public payments; + PaymentsEscrow public escrow; + IHorizonStaking public staking; + EpochManagerMock public epochManager; + RewardsManagerMock public rewardsManager; + CurationMock public curation; + GraphTallyCollector graphTallyCollector; + + HorizonStaking private stakingBase; + HorizonStakingExtension private stakingExtension; + + address subgraphDataServiceLegacyAddress = makeAddr("subgraphDataServiceLegacyAddress"); + address subgraphDataServiceAddress = makeAddr("subgraphDataServiceAddress"); + + address graphTokenGatewayAddress = makeAddr("GraphTokenGateway"); + + /* Users */ + + Users internal users; + + /* + * SET UP + */ + + function setUp() public virtual { + // Deploy ERC20 token + vm.prank(users.deployer); + token = new MockGRTToken(); + + // Setup Users + users = Users({ + governor: createUser("governor"), + deployer: createUser("deployer"), + indexer: createUser("indexer"), + operator: createUser("operator"), + gateway: createUser("gateway"), + verifier: createUser("verifier"), + delegator: createUser("delegator"), + legacySlasher: createUser("legacySlasher") + }); + + // Deploy protocol contracts + deployProtocolContracts(); + setupProtocol(); + unpauseProtocol(); + + // Label contracts + vm.label({ account: address(controller), newLabel: "Controller" }); + vm.label({ account: address(token), newLabel: "GraphToken" }); + vm.label({ account: address(payments), newLabel: "GraphPayments" }); + vm.label({ account: address(escrow), newLabel: "PaymentsEscrow" }); + vm.label({ account: address(staking), newLabel: "HorizonStaking" }); + vm.label({ account: address(stakingExtension), newLabel: "HorizonStakingExtension" }); + vm.label({ account: address(graphTallyCollector), newLabel: "GraphTallyCollector" }); + + // Ensure caller is back to the original msg.sender + vm.stopPrank(); + } + + function deployProtocolContracts() private { + vm.startPrank(users.governor); + proxyAdmin = new GraphProxyAdmin(); + controller = new Controller(); + + // Staking Proxy + resetPrank(users.deployer); + GraphProxy stakingProxy = new GraphProxy(address(0), address(proxyAdmin)); + + // GraphPayments predict address + bytes memory paymentsImplementationParameters = abi.encode(address(controller), protocolPaymentCut); + bytes memory paymentsImplementationBytecode = abi.encodePacked( + type(GraphPayments).creationCode, + paymentsImplementationParameters + ); + address predictedPaymentsImplementationAddress = _computeAddress( + "GraphPayments", + paymentsImplementationBytecode, + users.deployer + ); + + bytes memory paymentsProxyParameters = abi.encode( + predictedPaymentsImplementationAddress, + users.governor, + abi.encodeCall(GraphPayments.initialize, ()) + ); + bytes memory paymentsProxyBytecode = abi.encodePacked( + type(TransparentUpgradeableProxy).creationCode, + paymentsProxyParameters + ); + address predictedPaymentsProxyAddress = _computeAddress( + "TransparentUpgradeableProxy", + paymentsProxyBytecode, + users.deployer + ); + + // PaymentsEscrow + bytes memory escrowImplementationParameters = abi.encode(address(controller), withdrawEscrowThawingPeriod); + bytes memory escrowImplementationBytecode = abi.encodePacked( + type(PaymentsEscrow).creationCode, + escrowImplementationParameters + ); + address predictedEscrowImplementationAddress = _computeAddress( + "PaymentsEscrow", + escrowImplementationBytecode, + users.deployer + ); + + bytes memory escrowProxyParameters = abi.encode( + predictedEscrowImplementationAddress, + users.governor, + abi.encodeCall(PaymentsEscrow.initialize, ()) + ); + bytes memory escrowProxyBytecode = abi.encodePacked( + type(TransparentUpgradeableProxy).creationCode, + escrowProxyParameters + ); + address predictedEscrowProxyAddress = _computeAddress( + "TransparentUpgradeableProxy", + escrowProxyBytecode, + users.deployer + ); + + // Epoch Manager + epochManager = new EpochManagerMock(); + + // Rewards Manager + rewardsManager = new RewardsManagerMock(token, ALLOCATIONS_REWARD_CUT); + + // Curation + curation = new CurationMock(); + + // Setup controller + resetPrank(users.governor); + controller.setContractProxy(keccak256("GraphToken"), address(token)); + controller.setContractProxy(keccak256("PaymentsEscrow"), predictedEscrowProxyAddress); + controller.setContractProxy(keccak256("GraphPayments"), predictedPaymentsProxyAddress); + controller.setContractProxy(keccak256("Staking"), address(stakingProxy)); + controller.setContractProxy(keccak256("EpochManager"), address(epochManager)); + controller.setContractProxy(keccak256("RewardsManager"), address(rewardsManager)); + controller.setContractProxy(keccak256("Curation"), address(curation)); + controller.setContractProxy(keccak256("GraphTokenGateway"), graphTokenGatewayAddress); + controller.setContractProxy(keccak256("GraphProxyAdmin"), address(proxyAdmin)); + + resetPrank(users.deployer); + { + address paymentsImplementationAddress = _deployContract("GraphPayments", paymentsImplementationBytecode); + address paymentsProxyAddress = _deployContract("TransparentUpgradeableProxy", paymentsProxyBytecode); + assertEq(paymentsImplementationAddress, predictedPaymentsImplementationAddress); + assertEq(paymentsProxyAddress, predictedPaymentsProxyAddress); + payments = GraphPayments(paymentsProxyAddress); + } + + { + address escrowImplementationAddress = _deployContract("PaymentsEscrow", escrowImplementationBytecode); + address escrowProxyAddress = _deployContract("TransparentUpgradeableProxy", escrowProxyBytecode); + assertEq(escrowImplementationAddress, predictedEscrowImplementationAddress); + assertEq(escrowProxyAddress, predictedEscrowProxyAddress); + escrow = PaymentsEscrow(escrowProxyAddress); + } + + stakingExtension = new HorizonStakingExtension(address(controller), subgraphDataServiceLegacyAddress); + stakingBase = new HorizonStaking( + address(controller), + address(stakingExtension), + subgraphDataServiceLegacyAddress + ); + + graphTallyCollector = new GraphTallyCollector( + "GraphTallyCollector", + "1", + address(controller), + revokeSignerThawingPeriod + ); + + resetPrank(users.governor); + proxyAdmin.upgrade(stakingProxy, address(stakingBase)); + proxyAdmin.acceptProxy(stakingBase, stakingProxy); + staking = IHorizonStaking(address(stakingProxy)); + } + + function setupProtocol() private { + resetPrank(users.governor); + staking.setMaxThawingPeriod(MAX_THAWING_PERIOD); + epochManager.setEpochLength(EPOCH_LENGTH); + } + + function unpauseProtocol() private { + resetPrank(users.governor); + controller.setPaused(false); + } + + function createUser(string memory name) internal returns (address) { + address user = makeAddr(name); + vm.deal({ account: user, newBalance: 100 ether }); + deal({ token: address(token), to: user, give: type(uint256).max }); + vm.label({ account: user, newLabel: name }); + return user; + } + + /* + * TOKEN HELPERS + */ + + function mint(address _address, uint256 amount) internal { + deal({ token: address(token), to: _address, give: amount }); + } + + function approve(address spender, uint256 amount) internal { + token.approve(spender, amount); + } + + /* + * PRIVATE + */ + + function _computeAddress( + string memory contractName, + bytes memory bytecode, + address deployer + ) private pure returns (address) { + bytes32 salt = keccak256(abi.encodePacked(contractName, "Salt")); + return Create2.computeAddress(salt, keccak256(bytecode), deployer); + } + + function _deployContract(string memory contractName, bytes memory bytecode) private returns (address) { + bytes32 salt = keccak256(abi.encodePacked(contractName, "Salt")); + return Create2.deploy(0, salt, bytecode); + } +} diff --git a/packages/horizon/test/unit/data-service/DataService.t.sol b/packages/horizon/test/unit/data-service/DataService.t.sol new file mode 100644 index 000000000..d415e042c --- /dev/null +++ b/packages/horizon/test/unit/data-service/DataService.t.sol @@ -0,0 +1,419 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { DataServiceBase } from "./implementations/DataServiceBase.sol"; +import { DataServiceOverride } from "./implementations/DataServiceOverride.sol"; +import { ProvisionManager } from "./../../../contracts/data-service/utilities/ProvisionManager.sol"; +import { PPMMath } from "./../../../contracts/libraries/PPMMath.sol"; + +contract DataServiceTest is HorizonStakingSharedTest { + DataServiceBase dataService; + DataServiceOverride dataServiceOverride; + + function setUp() public override { + super.setUp(); + + dataService = new DataServiceBase(address(controller)); + dataServiceOverride = new DataServiceOverride(address(controller)); + } + + function test_Constructor_WhenTheContractIsDeployedWithAValidController() external view { + _assert_delegationRatio(type(uint32).max); + _assert_provisionTokens_range(type(uint256).min, type(uint256).max); + _assert_verifierCut_range(type(uint32).min, uint32(PPMMath.MAX_PPM)); + _assert_thawingPeriod_range(type(uint64).min, type(uint64).max); + } + + // -- Delegation ratio -- + + function test_DelegationRatio_WhenSettingTheDelegationRatio(uint32 delegationRatio) external { + _assert_set_delegationRatio(delegationRatio); + } + + function test_DelegationRatio_WhenGettingTheDelegationRatio(uint32 ratio) external { + dataService.setDelegationRatio(ratio); + _assert_delegationRatio(ratio); + } + + // -- Provision tokens -- + + function test_ProvisionTokens_WhenSettingAValidRange(uint256 min, uint256 max) external { + vm.assume(min <= max); + _assert_set_provisionTokens_range(min, max); + } + + function test_ProvisionTokens_RevertWhen_SettingAnInvalidRange(uint256 min, uint256 max) external { + vm.assume(min > max); + + vm.expectRevert(abi.encodeWithSelector(ProvisionManager.ProvisionManagerInvalidRange.selector, min, max)); + dataService.setProvisionTokensRange(min, max); + } + + function test_ProvisionTokens_WhenGettingTheRange() external { + dataService.setProvisionTokensRange(dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + _assert_provisionTokens_range(dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + } + + function test_ProvisionTokens_WhenGettingTheRangeWithAnOverridenGetter() external { + // Overriden getter returns the const values regardless of the set range + dataServiceOverride.setProvisionTokensRange(0, 1); + (uint256 min, uint256 max) = dataServiceOverride.getProvisionTokensRange(); + + assertEq(min, dataServiceOverride.PROVISION_TOKENS_MIN()); + assertEq(max, dataServiceOverride.PROVISION_TOKENS_MAX()); + } + + function test_ProvisionTokens_WhenCheckingAValidProvision_WithThawing( + uint256 tokens, + uint256 tokensThaw + ) external useIndexer { + dataService.setProvisionTokensRange(dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + tokens = bound(tokens, dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + tokensThaw = bound(tokensThaw, tokens - dataService.PROVISION_TOKENS_MIN() + 1, tokens); + + _createProvision(users.indexer, address(dataService), tokens, 0, 0); + staking.thaw(users.indexer, address(dataService), tokensThaw); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "tokens", + tokens - tokensThaw, + dataService.PROVISION_TOKENS_MIN(), + dataService.PROVISION_TOKENS_MAX() + ) + ); + dataService.checkProvisionTokens(users.indexer); + } + + function test_ProvisionTokens_WhenCheckingAValidProvision(uint256 tokens) external useIndexer { + dataService.setProvisionTokensRange(dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + tokens = bound(tokens, dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + + _createProvision(users.indexer, address(dataService), tokens, 0, 0); + dataService.checkProvisionTokens(users.indexer); + } + + function test_ProvisionTokens_WhenCheckingWithAnOverridenChecker(uint256 tokens) external useIndexer { + vm.assume(tokens != 0); + dataServiceOverride.setProvisionTokensRange( + dataService.PROVISION_TOKENS_MIN(), + dataService.PROVISION_TOKENS_MAX() + ); + + // this checker accepts provisions with any amount of tokens + _createProvision(users.indexer, address(dataServiceOverride), tokens, 0, 0); + dataServiceOverride.checkProvisionTokens(users.indexer); + } + + function test_ProvisionTokens_RevertWhen_CheckingAnInvalidProvision(uint256 tokens) external useIndexer { + dataService.setProvisionTokensRange(dataService.PROVISION_TOKENS_MIN(), dataService.PROVISION_TOKENS_MAX()); + tokens = bound(tokens, 1, dataService.PROVISION_TOKENS_MIN() - 1); + + _createProvision(users.indexer, address(dataService), tokens, 0, 0); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "tokens", + tokens, + dataService.PROVISION_TOKENS_MIN(), + dataService.PROVISION_TOKENS_MAX() + ) + ); + dataService.checkProvisionTokens(users.indexer); + } + + // -- Verifier cut -- + + function test_VerifierCut_WhenSettingAValidRange(uint32 min, uint32 max) external { + vm.assume(min <= max); + vm.assume(max <= uint32(PPMMath.MAX_PPM)); + _assert_set_verifierCut_range(min, max); + } + + function test_VerifierCut_RevertWhen_SettingAnInvalidRange(uint32 min, uint32 max) external { + vm.assume(min > max); + + vm.expectRevert(abi.encodeWithSelector(ProvisionManager.ProvisionManagerInvalidRange.selector, min, max)); + dataService.setVerifierCutRange(min, max); + } + + function test_VerifierCut_RevertWhen_SettingAnInvalidMax(uint32 min, uint32 max) external { + vm.assume(max > uint32(PPMMath.MAX_PPM)); + vm.assume(min <= max); + + vm.expectRevert(abi.encodeWithSelector(ProvisionManager.ProvisionManagerInvalidRange.selector, min, max)); + dataService.setVerifierCutRange(min, max); + } + + function test_VerifierCut_WhenGettingTheRange() external { + dataService.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + _assert_verifierCut_range(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + } + + function test_VerifierCut_WhenGettingTheRangeWithAnOverridenGetter() external { + // Overriden getter returns the const values regardless of the set range + dataServiceOverride.setVerifierCutRange(0, 1); + (uint32 min, uint32 max) = dataServiceOverride.getVerifierCutRange(); + assertEq(min, dataServiceOverride.VERIFIER_CUT_MIN()); + assertEq(max, dataServiceOverride.VERIFIER_CUT_MAX()); + } + + function test_VerifierCut_WhenCheckingAValidProvision(uint32 verifierCut) external useIndexer { + dataService.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + verifierCut = uint32(bound(verifierCut, dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX())); + + _createProvision(users.indexer, address(dataService), dataService.PROVISION_TOKENS_MIN(), verifierCut, 0); + dataService.checkProvisionParameters(users.indexer, false); + } + + function test_VerifierCut_WhenCheckingWithAnOverridenChecker(uint32 verifierCut) external useIndexer { + verifierCut = uint32(bound(verifierCut, 0, uint32(PPMMath.MAX_PPM))); + dataServiceOverride.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + + // this checker accepts provisions with any verifier cut range + _createProvision(users.indexer, address(dataService), dataService.PROVISION_TOKENS_MIN(), verifierCut, 0); + dataServiceOverride.checkProvisionParameters(users.indexer, false); + } + + function test_VerifierCut_RevertWhen_CheckingAnInvalidProvision(uint32 verifierCut) external useIndexer { + dataService.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + verifierCut = uint32(bound(verifierCut, 0, dataService.VERIFIER_CUT_MIN() - 1)); + + _createProvision(users.indexer, address(dataService), dataService.PROVISION_TOKENS_MIN(), verifierCut, 0); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "maxVerifierCut", + verifierCut, + dataService.VERIFIER_CUT_MIN(), + dataService.VERIFIER_CUT_MAX() + ) + ); + dataService.checkProvisionParameters(users.indexer, false); + } + + // -- Thawing period -- + + function test_ThawingPeriod_WhenSettingAValidRange(uint64 min, uint64 max) external { + vm.assume(min <= max); + _assert_set_thawingPeriod_range(min, max); + } + + function test_ThawingPeriod_RevertWhen_SettingAnInvalidRange(uint64 min, uint64 max) external { + vm.assume(min > max); + + vm.expectRevert(abi.encodeWithSelector(ProvisionManager.ProvisionManagerInvalidRange.selector, min, max)); + dataService.setThawingPeriodRange(min, max); + } + + function test_ThawingPeriod_WhenGettingTheRange() external { + dataService.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + _assert_thawingPeriod_range(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + } + + function test_ThawingPeriod_WhenGettingTheRangeWithAnOverridenGetter() external { + // Overriden getter returns the const values regardless of the set range + dataServiceOverride.setThawingPeriodRange(0, 1); + (uint64 min, uint64 max) = dataServiceOverride.getThawingPeriodRange(); + assertEq(min, dataServiceOverride.THAWING_PERIOD_MIN()); + assertEq(max, dataServiceOverride.THAWING_PERIOD_MAX()); + } + + function test_ThawingPeriod_WhenCheckingAValidProvision(uint64 thawingPeriod) external useIndexer { + dataService.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + thawingPeriod = uint32( + bound(thawingPeriod, dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()) + ); + + _createProvision(users.indexer, address(dataService), dataService.PROVISION_TOKENS_MIN(), 0, thawingPeriod); + dataService.checkProvisionParameters(users.indexer, false); + } + + function test_ThawingPeriod_WhenCheckingWithAnOverridenChecker(uint64 thawingPeriod) external useIndexer { + thawingPeriod = uint32(bound(thawingPeriod, 0, staking.getMaxThawingPeriod())); + dataServiceOverride.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + + // this checker accepts provisions with any verifier cut range + _createProvision(users.indexer, address(dataService), dataService.PROVISION_TOKENS_MIN(), 0, thawingPeriod); + dataServiceOverride.checkProvisionParameters(users.indexer, false); + } + + function test_ThawingPeriod_RevertWhen_CheckingAnInvalidProvision(uint64 thawingPeriod) external useIndexer { + dataService.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + thawingPeriod = uint32(bound(thawingPeriod, 0, dataService.THAWING_PERIOD_MIN() - 1)); + + _createProvision(users.indexer, address(dataService), dataService.PROVISION_TOKENS_MIN(), 0, thawingPeriod); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "thawingPeriod", + thawingPeriod, + dataService.THAWING_PERIOD_MIN(), + dataService.THAWING_PERIOD_MAX() + ) + ); + dataService.checkProvisionParameters(users.indexer, false); + } + + modifier givenProvisionParametersChanged() { + _; + } + + function test_ProvisionParameters_WhenTheNewParametersAreValid( + uint32 maxVerifierCut, + uint64 thawingPeriod + ) external givenProvisionParametersChanged useIndexer { + // bound to valid values + maxVerifierCut = uint32(bound(maxVerifierCut, dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX())); + thawingPeriod = uint64( + bound(thawingPeriod, dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()) + ); + + // set provision parameter ranges + dataService.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + dataService.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + + // stage provision parameter changes + _createProvision( + users.indexer, + address(dataService), + dataService.PROVISION_TOKENS_MIN(), + dataService.VERIFIER_CUT_MIN(), + dataService.THAWING_PERIOD_MIN() + ); + _setProvisionParameters(users.indexer, address(dataService), maxVerifierCut, thawingPeriod); + + // accept provision parameters + if (maxVerifierCut != dataService.VERIFIER_CUT_MIN() || thawingPeriod != dataService.THAWING_PERIOD_MIN()) { + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionParametersSet( + users.indexer, + address(dataService), + maxVerifierCut, + thawingPeriod + ); + } + dataService.acceptProvisionParameters(users.indexer); + } + + function test_ProvisionParameters_RevertWhen_TheNewThawingPeriodIsInvalid( + uint64 thawingPeriod + ) external givenProvisionParametersChanged useIndexer { + // bound to invalid values + thawingPeriod = uint64(bound(thawingPeriod, 0, dataService.THAWING_PERIOD_MIN() - 1)); + + // set provision parameter ranges + dataService.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + dataService.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + + // stage provision parameter changes + _createProvision( + users.indexer, + address(dataService), + dataService.PROVISION_TOKENS_MIN(), + dataService.VERIFIER_CUT_MIN(), + dataService.THAWING_PERIOD_MIN() + ); + _setProvisionParameters(users.indexer, address(dataService), dataService.VERIFIER_CUT_MIN(), thawingPeriod); + + // accept provision parameters + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "thawingPeriod", + thawingPeriod, + dataService.THAWING_PERIOD_MIN(), + dataService.THAWING_PERIOD_MAX() + ) + ); + dataService.acceptProvisionParameters(users.indexer); + } + + function test_ProvisionParameters_RevertWhen_TheNewVerifierCutIsInvalid( + uint32 maxVerifierCut + ) external givenProvisionParametersChanged useIndexer { + // bound to valid values + maxVerifierCut = uint32(bound(maxVerifierCut, dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX())); + + // set provision parameter ranges + dataService.setVerifierCutRange(dataService.VERIFIER_CUT_MIN(), dataService.VERIFIER_CUT_MAX()); + dataService.setThawingPeriodRange(dataService.THAWING_PERIOD_MIN(), dataService.THAWING_PERIOD_MAX()); + + // stage provision parameter changes + _createProvision( + users.indexer, + address(dataService), + dataService.PROVISION_TOKENS_MIN(), + dataService.VERIFIER_CUT_MIN(), + dataService.THAWING_PERIOD_MIN() + ); + _setProvisionParameters(users.indexer, address(dataService), maxVerifierCut, dataService.THAWING_PERIOD_MIN()); + + // accept provision parameters + if (maxVerifierCut != dataService.VERIFIER_CUT_MIN()) { + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionParametersSet( + users.indexer, + address(dataService), + maxVerifierCut, + dataService.THAWING_PERIOD_MIN() + ); + } + dataService.acceptProvisionParameters(users.indexer); + } + + // -- Assert functions -- + + function _assert_set_delegationRatio(uint32 ratio) internal { + vm.expectEmit(); + emit ProvisionManager.DelegationRatioSet(ratio); + dataService.setDelegationRatio(ratio); + _assert_delegationRatio(ratio); + } + + function _assert_delegationRatio(uint32 ratio) internal view { + uint32 _delegationRatio = dataService.getDelegationRatio(); + assertEq(_delegationRatio, ratio); + } + + function _assert_set_provisionTokens_range(uint256 min, uint256 max) internal { + vm.expectEmit(); + emit ProvisionManager.ProvisionTokensRangeSet(min, max); + dataService.setProvisionTokensRange(min, max); + _assert_provisionTokens_range(min, max); + } + + function _assert_provisionTokens_range(uint256 min, uint256 max) internal view { + (uint256 _min, uint256 _max) = dataService.getProvisionTokensRange(); + assertEq(_min, min); + assertEq(_max, max); + } + + function _assert_set_verifierCut_range(uint32 min, uint32 max) internal { + vm.expectEmit(); + emit ProvisionManager.VerifierCutRangeSet(min, max); + dataService.setVerifierCutRange(min, max); + _assert_verifierCut_range(min, max); + } + + function _assert_verifierCut_range(uint32 min, uint32 max) internal view { + (uint32 _min, uint32 _max) = dataService.getVerifierCutRange(); + assertEq(_min, min); + assertEq(_max, max); + } + + function _assert_set_thawingPeriod_range(uint64 min, uint64 max) internal { + vm.expectEmit(); + emit ProvisionManager.ThawingPeriodRangeSet(min, max); + dataService.setThawingPeriodRange(min, max); + _assert_thawingPeriod_range(min, max); + } + + function _assert_thawingPeriod_range(uint64 min, uint64 max) internal view { + (uint64 _min, uint64 _max) = dataService.getThawingPeriodRange(); + assertEq(_min, min); + assertEq(_max, max); + } +} diff --git a/packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol b/packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol new file mode 100644 index 000000000..c306a77ab --- /dev/null +++ b/packages/horizon/test/unit/data-service/DataServiceUpgradeable.t.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { GraphBaseTest } from "../GraphBase.t.sol"; +import { DataServiceBaseUpgradeable } from "./implementations/DataServiceBaseUpgradeable.sol"; +import { UnsafeUpgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +import { PPMMath } from "./../../../contracts/libraries/PPMMath.sol"; + +contract DataServiceUpgradeableTest is GraphBaseTest { + function test_WhenTheContractIsDeployed() external { + (DataServiceBaseUpgradeable dataService, DataServiceBaseUpgradeable implementation) = _deployDataService(); + + // via proxy - ensure that the proxy was initialized correctly + // these calls validate proxy storage was correctly initialized + uint32 delegationRatio = dataService.getDelegationRatio(); + assertEq(delegationRatio, type(uint32).max); + + (uint256 minTokens, uint256 maxTokens) = dataService.getProvisionTokensRange(); + assertEq(minTokens, type(uint256).min); + assertEq(maxTokens, type(uint256).max); + + (uint32 minVerifierCut, uint32 maxVerifierCut) = dataService.getVerifierCutRange(); + assertEq(minVerifierCut, type(uint32).min); + assertEq(maxVerifierCut, uint32(PPMMath.MAX_PPM)); + + (uint64 minThawingPeriod, uint64 maxThawingPeriod) = dataService.getThawingPeriodRange(); + assertEq(minThawingPeriod, type(uint64).min); + assertEq(maxThawingPeriod, type(uint64).max); + + // this ensures that implementation immutables were correctly initialized + // and they can be read via the proxy + assertEq(implementation.controller(), address(controller)); + assertEq(dataService.controller(), address(controller)); + } + + function _deployDataService() internal returns (DataServiceBaseUpgradeable, DataServiceBaseUpgradeable) { + // Deploy implementation + address implementation = address(new DataServiceBaseUpgradeable(address(controller))); + + // Deploy proxy + address proxy = UnsafeUpgrades.deployTransparentProxy( + implementation, + users.governor, + abi.encodeCall(DataServiceBaseUpgradeable.initialize, ()) + ); + + return (DataServiceBaseUpgradeable(proxy), DataServiceBaseUpgradeable(implementation)); + } +} diff --git a/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol new file mode 100644 index 000000000..f953dbc59 --- /dev/null +++ b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { DataServiceImpFees } from "../implementations/DataServiceImpFees.sol"; +import { IDataServiceFees } from "@graphprotocol/interfaces/contracts/data-service/IDataServiceFees.sol"; +import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol"; +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +contract DataServiceFeesTest is HorizonStakingSharedTest { + function test_Lock_RevertWhen_ZeroTokensAreLocked() + external + useIndexer + useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0) + { + vm.expectRevert(abi.encodeWithSignature("DataServiceFeesZeroTokens()")); + dataService.lockStake(users.indexer, 0); + } + + uint256 public constant PROVISION_TOKENS = 10_000_000 ether; + DataServiceImpFees dataService; + + function setUp() public override { + super.setUp(); + + dataService = new DataServiceImpFees(address(controller)); + } + + function test_Lock_WhenTheProvisionHasEnoughTokens( + uint256 tokens + ) external useIndexer useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0) { + tokens = bound(tokens, 1, PROVISION_TOKENS / dataService.STAKE_TO_FEES_RATIO()); + + _assert_lockStake(users.indexer, tokens); + } + + function test_Lock_WhenTheProvisionHasJustEnoughTokens( + uint256 tokens, + uint256 steps + ) external useIndexer useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0) { + // lock all provisioned stake in steps + // limit tokens to at least 1 per step + tokens = bound(tokens, 50, PROVISION_TOKENS / dataService.STAKE_TO_FEES_RATIO()); + steps = bound(steps, 1, 50); + uint256 stepAmount = tokens / steps; + + for (uint256 i = 0; i < steps; i++) { + _assert_lockStake(users.indexer, stepAmount); + } + + uint256 lockedStake = dataService.feesProvisionTracker(users.indexer); + uint256 delta = (tokens % steps); + assertEq(lockedStake, stepAmount * dataService.STAKE_TO_FEES_RATIO() * steps); + assertEq(tokens * dataService.STAKE_TO_FEES_RATIO() - lockedStake, delta * dataService.STAKE_TO_FEES_RATIO()); + } + + function test_Lock_RevertWhen_TheProvisionHasNotEnoughTokens( + uint256 tokens + ) external useIndexer useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0) { + tokens = bound(tokens, 1, PROVISION_TOKENS / dataService.STAKE_TO_FEES_RATIO()); + + // lock everything + _assert_lockStake(users.indexer, PROVISION_TOKENS / dataService.STAKE_TO_FEES_RATIO()); + + // tryna lock some more + uint256 additionalTokens = 10000; + uint256 tokensRequired = dataService.feesProvisionTracker(users.indexer) + + additionalTokens * dataService.STAKE_TO_FEES_RATIO(); + uint256 tokensAvailable = staking.getTokensAvailable(users.indexer, address(dataService), 0); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionTracker.ProvisionTrackerInsufficientTokens.selector, + tokensAvailable, + tokensRequired + ) + ); + dataService.lockStake(users.indexer, additionalTokens); + } + + function test_Release_WhenNIsValid( + uint256 tokens, + uint256 steps, + uint256 numClaimsToRelease + ) external useIndexer useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0) { + // lock all provisioned stake in steps + // limit tokens to at least 1 per step + // limit steps to at least 15 so we stagger locks every 5 seconds to have some expired + tokens = bound(tokens, 50, PROVISION_TOKENS / dataService.STAKE_TO_FEES_RATIO()); + steps = bound(steps, 15, 50); + numClaimsToRelease = bound(numClaimsToRelease, 0, steps); + + uint256 stepAmount = tokens / steps; + + // lock tokens staggering the release + for (uint256 i = 0; i < steps; i++) { + _assert_lockStake(users.indexer, stepAmount); + vm.warp(block.timestamp + 5 seconds); + } + + // it should release all expired claims + _assert_releaseStake(users.indexer, numClaimsToRelease); + } + + function test_Release_WhenNIsNotValid( + uint256 tokens, + uint256 steps + ) external useIndexer useProvisionDataService(address(dataService), PROVISION_TOKENS, 0, 0) { + // lock all provisioned stake in steps + // limit tokens to at least 1 per step + // limit steps to at least 15 so we stagger locks every 5 seconds to have some expired + tokens = bound(tokens, 50, PROVISION_TOKENS / dataService.STAKE_TO_FEES_RATIO()); + steps = bound(steps, 15, 50); + + uint256 stepAmount = tokens / steps; + + // lock tokens staggering the release + for (uint256 i = 0; i < steps; i++) { + _assert_lockStake(users.indexer, stepAmount); + vm.warp(block.timestamp + 5 seconds); + } + + // it should revert + vm.expectRevert(abi.encodeWithSelector(ILinkedList.LinkedListInvalidIterations.selector)); + dataService.releaseStake(steps + 1); + } + + // -- Assertion functions -- + // use struct to avoid 'stack too deep' error + struct CalcValues_LockStake { + uint256 unlockTimestamp; + uint256 stakeToLock; + bytes32 predictedClaimId; + } + function _assert_lockStake(address serviceProvider, uint256 tokens) private { + // before state + (bytes32 beforeHead, , uint256 beforeNonce, uint256 beforeCount) = dataService.claimsLists(serviceProvider); + uint256 beforeLockedStake = dataService.feesProvisionTracker(serviceProvider); + + // calc + CalcValues_LockStake memory calcValues = CalcValues_LockStake({ + unlockTimestamp: block.timestamp + dataService.LOCK_DURATION(), + stakeToLock: tokens * dataService.STAKE_TO_FEES_RATIO(), + predictedClaimId: keccak256(abi.encodePacked(address(dataService), serviceProvider, beforeNonce)) + }); + + // it should emit a an event + vm.expectEmit(); + emit IDataServiceFees.StakeClaimLocked( + serviceProvider, + calcValues.predictedClaimId, + calcValues.stakeToLock, + calcValues.unlockTimestamp + ); + dataService.lockStake(serviceProvider, tokens); + + // after state + uint256 afterLockedStake = dataService.feesProvisionTracker(serviceProvider); + (bytes32 afterHead, bytes32 afterTail, uint256 afterNonce, uint256 afterCount) = dataService.claimsLists( + serviceProvider + ); + + // it should lock the tokens + assertEq(beforeLockedStake + calcValues.stakeToLock, afterLockedStake); + + // it should create a stake claim + (uint256 claimTokens, uint256 createdAt, uint256 releasableAt, bytes32 nextClaim) = dataService.claims( + calcValues.predictedClaimId + ); + assertEq(claimTokens, calcValues.stakeToLock); + assertEq(createdAt, block.timestamp); + assertEq(releasableAt, calcValues.unlockTimestamp); + assertEq(nextClaim, bytes32(0)); + + // it should update the list + assertEq(afterCount, beforeCount + 1); + assertEq(afterNonce, beforeNonce + 1); + assertEq(afterHead, beforeCount == 0 ? calcValues.predictedClaimId : beforeHead); + assertEq(afterTail, calcValues.predictedClaimId); + } + + // use struct to avoid 'stack too deep' error + struct CalcValues_ReleaseStake { + uint256 claimsCount; + uint256 tokensReleased; + bytes32 head; + } + function _assert_releaseStake(address serviceProvider, uint256 numClaimsToRelease) private { + // before state + (bytes32 beforeHead, bytes32 beforeTail, uint256 beforeNonce, uint256 beforeCount) = dataService.claimsLists( + serviceProvider + ); + uint256 beforeLockedStake = dataService.feesProvisionTracker(serviceProvider); + + // calc and set events + vm.expectEmit(); + + CalcValues_ReleaseStake memory calcValues = CalcValues_ReleaseStake({ + claimsCount: 0, + tokensReleased: 0, + head: beforeHead + }); + while ( + calcValues.head != bytes32(0) && (calcValues.claimsCount < numClaimsToRelease || numClaimsToRelease == 0) + ) { + (uint256 claimTokens, , uint256 releasableAt, bytes32 nextClaim) = dataService.claims(calcValues.head); + if (releasableAt > block.timestamp) { + break; + } + + emit IDataServiceFees.StakeClaimReleased(serviceProvider, calcValues.head, claimTokens, releasableAt); + calcValues.head = nextClaim; + calcValues.tokensReleased += claimTokens; + calcValues.claimsCount++; + } + + // it should emit a an event + emit IDataServiceFees.StakeClaimsReleased(serviceProvider, calcValues.claimsCount, calcValues.tokensReleased); + dataService.releaseStake(numClaimsToRelease); + + // after state + (bytes32 afterHead, bytes32 afterTail, uint256 afterNonce, uint256 afterCount) = dataService.claimsLists( + serviceProvider + ); + uint256 afterLockedStake = dataService.feesProvisionTracker(serviceProvider); + + // it should release the tokens + assertEq(beforeLockedStake - calcValues.tokensReleased, afterLockedStake); + + // it should remove the processed claims from the list + assertEq(afterCount, beforeCount - calcValues.claimsCount); + assertEq(afterNonce, beforeNonce); + if (calcValues.claimsCount != 0) { + assertNotEq(afterHead, beforeHead); + } else { + assertEq(afterHead, beforeHead); + } + assertEq(afterHead, calcValues.head); + assertEq(afterTail, calcValues.claimsCount == beforeCount ? bytes32(0) : beforeTail); + } +} diff --git a/packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol new file mode 100644 index 000000000..bfd8086e0 --- /dev/null +++ b/packages/horizon/test/unit/data-service/extensions/DataServicePausable.t.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { DataServiceImpPausable } from "../implementations/DataServiceImpPausable.sol"; +import { IDataServicePausable } from "@graphprotocol/interfaces/contracts/data-service/IDataServicePausable.sol"; + +contract DataServicePausableTest is HorizonStakingSharedTest { + DataServiceImpPausable dataService; + + event Paused(address pauser); + event Unpaused(address unpauser); + + function setUp() public override { + super.setUp(); + + dataService = new DataServiceImpPausable(address(controller)); + } + + modifier whenTheCallerIsAPauseGuardian() { + _assert_setPauseGuardian(address(this), true); + _; + } + + function test_Pause_WhenTheProtocolIsNotPaused() external whenTheCallerIsAPauseGuardian { + _assert_pause(); + } + + function test_Pause_RevertWhen_TheProtocolIsPaused() external whenTheCallerIsAPauseGuardian { + _assert_pause(); + + vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); + dataService.pause(); + assertEq(dataService.paused(), true); + } + + function test_Pause_RevertWhen_TheCallerIsNotAPauseGuardian() external { + vm.expectRevert(abi.encodeWithSignature("DataServicePausableNotPauseGuardian(address)", address(this))); + dataService.pause(); + assertEq(dataService.paused(), false); + } + + function test_Unpause_WhenTheProtocolIsPaused() external whenTheCallerIsAPauseGuardian { + _assert_pause(); + _assert_unpause(); + } + + function test_Unpause_RevertWhen_TheProtocolIsNotPaused() external whenTheCallerIsAPauseGuardian { + vm.expectRevert(abi.encodeWithSignature("ExpectedPause()")); + dataService.unpause(); + assertEq(dataService.paused(), false); + } + + function test_Unpause_RevertWhen_TheCallerIsNotAPauseGuardian() external { + _assert_setPauseGuardian(address(this), true); + _assert_pause(); + _assert_setPauseGuardian(address(this), false); + + vm.expectRevert(abi.encodeWithSignature("DataServicePausableNotPauseGuardian(address)", address(this))); + dataService.unpause(); + assertEq(dataService.paused(), true); + } + + function test_SetPauseGuardian_WhenSettingAPauseGuardian() external { + _assert_setPauseGuardian(address(this), true); + } + + function test_SetPauseGuardian_WhenRemovingAPauseGuardian() external { + _assert_setPauseGuardian(address(this), true); + _assert_setPauseGuardian(address(this), false); + } + + function test_SetPauseGuardian_RevertWhen_AlreadyPauseGuardian() external { + _assert_setPauseGuardian(address(this), true); + vm.expectRevert( + abi.encodeWithSignature("DataServicePausablePauseGuardianNoChange(address,bool)", address(this), true) + ); + dataService.setPauseGuardian(address(this), true); + } + + function test_SetPauseGuardian_RevertWhen_AlreadyNotPauseGuardian() external { + _assert_setPauseGuardian(address(this), true); + _assert_setPauseGuardian(address(this), false); + vm.expectRevert( + abi.encodeWithSignature("DataServicePausablePauseGuardianNoChange(address,bool)", address(this), false) + ); + dataService.setPauseGuardian(address(this), false); + } + + function test_PausedProtectedFn_RevertWhen_TheProtocolIsPaused() external { + _assert_setPauseGuardian(address(this), true); + _assert_pause(); + + vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); + dataService.pausedProtectedFn(); + } + + function test_PausedProtectedFn_WhenTheProtocolIsNotPaused() external { + vm.expectEmit(); + emit DataServiceImpPausable.PausedProtectedFn(); + dataService.pausedProtectedFn(); + } + + function test_UnpausedProtectedFn_WhenTheProtocolIsPaused() external { + _assert_setPauseGuardian(address(this), true); + _assert_pause(); + + vm.expectEmit(); + emit DataServiceImpPausable.UnpausedProtectedFn(); + dataService.unpausedProtectedFn(); + } + + function test_UnpausedProtectedFn_RevertWhen_TheProtocolIsNotPaused() external { + vm.expectRevert(abi.encodeWithSignature("ExpectedPause()")); + dataService.unpausedProtectedFn(); + } + + function _assert_pause() private { + vm.expectEmit(); + emit Paused(address(this)); + dataService.pause(); + assertEq(dataService.paused(), true); + } + + function _assert_unpause() private { + vm.expectEmit(); + emit Unpaused(address(this)); + dataService.unpause(); + assertEq(dataService.paused(), false); + } + + function _assert_setPauseGuardian(address pauseGuardian, bool allowed) private { + vm.expectEmit(); + emit IDataServicePausable.PauseGuardianSet(pauseGuardian, allowed); + dataService.setPauseGuardian(pauseGuardian, allowed); + assertEq(dataService.pauseGuardians(pauseGuardian), allowed); + } +} diff --git a/packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol new file mode 100644 index 000000000..4b9d34932 --- /dev/null +++ b/packages/horizon/test/unit/data-service/extensions/DataServicePausableUpgradeable.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { GraphBaseTest } from "../../GraphBase.t.sol"; +import { DataServiceImpPausableUpgradeable } from "../implementations/DataServiceImpPausableUpgradeable.sol"; +import { UnsafeUpgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +import { PPMMath } from "./../../../../contracts/libraries/PPMMath.sol"; + +contract DataServicePausableUpgradeableTest is GraphBaseTest { + function test_WhenTheContractIsDeployed() external { + ( + DataServiceImpPausableUpgradeable dataService, + DataServiceImpPausableUpgradeable implementation + ) = _deployDataService(); + + // via proxy - ensure that the proxy was initialized correctly + // these calls validate proxy storage was correctly initialized + uint32 delegationRatio = dataService.getDelegationRatio(); + assertEq(delegationRatio, type(uint32).max); + + (uint256 minTokens, uint256 maxTokens) = dataService.getProvisionTokensRange(); + assertEq(minTokens, type(uint256).min); + assertEq(maxTokens, type(uint256).max); + + (uint32 minVerifierCut, uint32 maxVerifierCut) = dataService.getVerifierCutRange(); + assertEq(minVerifierCut, type(uint32).min); + assertEq(maxVerifierCut, uint32(PPMMath.MAX_PPM)); + + (uint64 minThawingPeriod, uint64 maxThawingPeriod) = dataService.getThawingPeriodRange(); + assertEq(minThawingPeriod, type(uint64).min); + assertEq(maxThawingPeriod, type(uint64).max); + + // this ensures that implementation immutables were correctly initialized + // and they can be read via the proxy + assertEq(implementation.controller(), address(controller)); + assertEq(dataService.controller(), address(controller)); + } + + function _deployDataService() + internal + returns (DataServiceImpPausableUpgradeable, DataServiceImpPausableUpgradeable) + { + // Deploy implementation + address implementation = address(new DataServiceImpPausableUpgradeable(address(controller))); + + // Deploy proxy + address proxy = UnsafeUpgrades.deployTransparentProxy( + implementation, + users.governor, + abi.encodeCall(DataServiceImpPausableUpgradeable.initialize, ()) + ); + + return (DataServiceImpPausableUpgradeable(proxy), DataServiceImpPausableUpgradeable(implementation)); + } +} diff --git a/packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol new file mode 100644 index 000000000..b58bbc5e0 --- /dev/null +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceBase.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract DataServiceBase is DataService { + uint32 public constant DELEGATION_RATIO = 100; + uint256 public constant PROVISION_TOKENS_MIN = 50; + uint256 public constant PROVISION_TOKENS_MAX = 5000; + uint32 public constant VERIFIER_CUT_MIN = 5; + uint32 public constant VERIFIER_CUT_MAX = 100000; + uint64 public constant THAWING_PERIOD_MIN = 15; + uint64 public constant THAWING_PERIOD_MAX = 76; + + constructor(address controller) DataService(controller) initializer { + __DataService_init(); + } + + function register(address serviceProvider, bytes calldata data) external {} + + function acceptProvisionPendingParameters(address serviceProvider, bytes calldata data) external {} + + function startService(address serviceProvider, bytes calldata data) external {} + + function stopService(address serviceProvider, bytes calldata data) external {} + + function collect( + address serviceProvider, + IGraphPayments.PaymentTypes feeType, + bytes calldata data + ) external returns (uint256) {} + + function slash(address serviceProvider, bytes calldata data) external {} + + function setDelegationRatio(uint32 ratio) external { + _setDelegationRatio(ratio); + } + + function setProvisionTokensRange(uint256 min, uint256 max) external { + _setProvisionTokensRange(min, max); + } + + function setVerifierCutRange(uint32 min, uint32 max) external { + _setVerifierCutRange(min, max); + } + + function setThawingPeriodRange(uint64 min, uint64 max) external { + _setThawingPeriodRange(min, max); + } + + function checkProvisionTokens(address serviceProvider) external view { + _checkProvisionTokens(serviceProvider); + } + + function checkProvisionParameters(address serviceProvider, bool pending) external view { + _checkProvisionParameters(serviceProvider, pending); + } + + function acceptProvisionParameters(address serviceProvider) external { + _acceptProvisionParameters(serviceProvider); + } +} diff --git a/packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol new file mode 100644 index 000000000..d328089f9 --- /dev/null +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceBaseUpgradeable.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract DataServiceBaseUpgradeable is DataService { + constructor(address controller_) DataService(controller_) { + _disableInitializers(); + } + + function initialize() external initializer { + __DataService_init(); + } + + function register(address serviceProvider, bytes calldata data) external {} + + function acceptProvisionPendingParameters(address serviceProvider, bytes calldata data) external {} + + function startService(address serviceProvider, bytes calldata data) external {} + + function stopService(address serviceProvider, bytes calldata data) external {} + + function collect( + address serviceProvider, + IGraphPayments.PaymentTypes feeType, + bytes calldata data + ) external returns (uint256) {} + + function slash(address serviceProvider, bytes calldata data) external {} + + function controller() external view returns (address) { + return address(_graphController()); + } +} diff --git a/packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol new file mode 100644 index 000000000..85c51465f --- /dev/null +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceImpFees.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { DataServiceFees } from "../../../../contracts/data-service/extensions/DataServiceFees.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract DataServiceImpFees is DataServiceFees { + uint256 public constant STAKE_TO_FEES_RATIO = 1000; + uint256 public constant LOCK_DURATION = 1 minutes; + + constructor(address controller) DataService(controller) initializer { + __DataService_init(); + } + + function register(address serviceProvider, bytes calldata data) external {} + + function acceptProvisionPendingParameters(address serviceProvider, bytes calldata data) external {} + + function startService(address serviceProvider, bytes calldata data) external {} + + function stopService(address serviceProvider, bytes calldata data) external {} + + function collect( + address serviceProvider, + IGraphPayments.PaymentTypes, + bytes calldata data + ) external returns (uint256) { + uint256 amount = abi.decode(data, (uint256)); + _releaseStake(serviceProvider, 0); + _lockStake(serviceProvider, amount * STAKE_TO_FEES_RATIO, block.timestamp + LOCK_DURATION); + return amount; + } + + function lockStake(address serviceProvider, uint256 amount) external { + _lockStake(serviceProvider, amount * STAKE_TO_FEES_RATIO, block.timestamp + LOCK_DURATION); + } + + function slash(address serviceProvider, bytes calldata data) external {} +} diff --git a/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol new file mode 100644 index 000000000..bba7de566 --- /dev/null +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausable.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { DataServicePausable } from "../../../../contracts/data-service/extensions/DataServicePausable.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract DataServiceImpPausable is DataServicePausable { + uint32 public constant DELEGATION_RATIO = 100; + uint256 public constant PROVISION_TOKENS_MIN = 50; + uint256 public constant PROVISION_TOKENS_MAX = 5000; + uint32 public constant VERIFIER_CUT_MIN = 5; + uint32 public constant VERIFIER_CUT_MAX = 100000; + uint64 public constant THAWING_PERIOD_MIN = 15; + uint64 public constant THAWING_PERIOD_MAX = 76; + + event PausedProtectedFn(); + event UnpausedProtectedFn(); + + constructor(address controller) DataService(controller) initializer { + __DataService_init(); + } + + function register(address serviceProvider, bytes calldata data) external {} + + function acceptProvisionPendingParameters(address serviceProvider, bytes calldata data) external {} + + function startService(address serviceProvider, bytes calldata data) external {} + + function stopService(address serviceProvider, bytes calldata data) external {} + + function collect( + address serviceProvider, + IGraphPayments.PaymentTypes feeType, + bytes calldata data + ) external returns (uint256) {} + + function slash(address serviceProvider, bytes calldata data) external {} + + function setPauseGuardian(address pauseGuardian, bool allowed) external { + _setPauseGuardian(pauseGuardian, allowed); + } + + function pausedProtectedFn() external whenNotPaused { + emit PausedProtectedFn(); + } + + function unpausedProtectedFn() external whenPaused { + emit UnpausedProtectedFn(); + } +} diff --git a/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol new file mode 100644 index 000000000..71453fd19 --- /dev/null +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceImpPausableUpgradeable.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { DataService } from "../../../../contracts/data-service/DataService.sol"; +import { DataServicePausableUpgradeable } from "../../../../contracts/data-service/extensions/DataServicePausableUpgradeable.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract DataServiceImpPausableUpgradeable is DataServicePausableUpgradeable { + constructor(address controller_) DataService(controller_) { + _disableInitializers(); + } + + function initialize() external initializer { + __DataService_init(); + __DataServicePausable_init(); + } + + function register(address serviceProvider, bytes calldata data) external {} + + function acceptProvisionPendingParameters(address serviceProvider, bytes calldata data) external {} + + function startService(address serviceProvider, bytes calldata data) external {} + + function stopService(address serviceProvider, bytes calldata data) external {} + + function collect( + address serviceProvider, + IGraphPayments.PaymentTypes feeType, + bytes calldata data + ) external returns (uint256) {} + + function slash(address serviceProvider, bytes calldata data) external {} + + function controller() external view returns (address) { + return address(_graphController()); + } +} diff --git a/packages/horizon/test/unit/data-service/implementations/DataServiceOverride.sol b/packages/horizon/test/unit/data-service/implementations/DataServiceOverride.sol new file mode 100644 index 000000000..c5d50ca74 --- /dev/null +++ b/packages/horizon/test/unit/data-service/implementations/DataServiceOverride.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { DataServiceBase } from "./DataServiceBase.sol"; + +contract DataServiceOverride is DataServiceBase { + constructor(address controller) DataServiceBase(controller) initializer { + __DataService_init(); + } + + function _getProvisionTokensRange() internal pure override returns (uint256, uint256) { + return (PROVISION_TOKENS_MIN, PROVISION_TOKENS_MAX); + } + + function _getVerifierCutRange() internal pure override returns (uint32, uint32) { + return (VERIFIER_CUT_MIN, VERIFIER_CUT_MAX); + } + + function _getThawingPeriodRange() internal pure override returns (uint64, uint64) { + return (THAWING_PERIOD_MIN, THAWING_PERIOD_MAX); + } + + function _checkProvisionTokens(address _serviceProvider) internal pure override {} + function _checkProvisionParameters(address _serviceProvider, bool pending) internal pure override {} +} diff --git a/packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol b/packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol new file mode 100644 index 000000000..d3424dfc5 --- /dev/null +++ b/packages/horizon/test/unit/data-service/libraries/ProvisionTracker.t.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { ProvisionTrackerImplementation } from "./ProvisionTrackerImplementation.sol"; +import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol"; +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; + +// Wrapper required because when using vm.expectRevert, the error is expected in the next immediate call +// Which in the case of this library is an internal call to the staking contract +// See: https://github.com/foundry-rs/foundry/issues/5454 +library ProvisionTrackerWrapper { + function lock( + mapping(address => uint256) storage self, + IHorizonStaking graphStaking, + address serviceProvider, + uint256 tokens, + uint32 delegationRatio + ) external { + ProvisionTracker.lock(self, graphStaking, serviceProvider, tokens, delegationRatio); + } + + function release(mapping(address => uint256) storage self, address serviceProvider, uint256 tokens) external { + ProvisionTracker.release(self, serviceProvider, tokens); + } +} + +contract ProvisionTrackerTest is HorizonStakingSharedTest, ProvisionTrackerImplementation { + using ProvisionTrackerWrapper for mapping(address => uint256); + + function test_Lock_GivenTheProvisionHasSufficientAvailableTokens( + uint256 tokens, + uint256 steps + ) external useIndexer useProvisionDataService(address(this), tokens, 0, 0) { + vm.assume(tokens > 0); + vm.assume(steps > 0); + vm.assume(steps < 100); + uint256 stepAmount = tokens / steps; + + for (uint256 i = 0; i < steps; i++) { + uint256 beforeLockedAmount = provisionTracker[users.indexer]; + provisionTracker.lock(staking, users.indexer, stepAmount, uint32(0)); + uint256 afterLockedAmount = provisionTracker[users.indexer]; + assertEq(afterLockedAmount, beforeLockedAmount + stepAmount); + } + + assertEq(provisionTracker[users.indexer], stepAmount * steps); + uint256 delta = (tokens % steps); + uint256 tokensAvailable = staking.getTokensAvailable(users.indexer, address(this), 0); + assertEq(tokensAvailable - provisionTracker[users.indexer], delta); + } + + function test_Lock_RevertGiven_TheProvisionHasInsufficientAvailableTokens( + uint256 tokens + ) external useIndexer useProvisionDataService(address(this), tokens, 0, 0) { + uint256 tokensToLock = tokens + 1; + vm.expectRevert( + abi.encodeWithSelector(ProvisionTracker.ProvisionTrackerInsufficientTokens.selector, tokens, tokensToLock) + ); + provisionTracker.lock(staking, users.indexer, tokensToLock, uint32(0)); + } + + function test_Release_GivenTheProvisionHasSufficientLockedTokens( + uint256 tokens, + uint256 steps + ) external useIndexer useProvisionDataService(address(this), tokens, 0, 0) { + vm.assume(tokens > 0); + vm.assume(steps > 0); + vm.assume(steps < 100); + + // setup + provisionTracker.lock(staking, users.indexer, tokens, uint32(0)); + + // lock entire provision, then unlock in steps + uint256 stepAmount = tokens / steps; + + for (uint256 i = 0; i < steps; i++) { + uint256 beforeLockedAmount = provisionTracker[users.indexer]; + provisionTracker.release(users.indexer, stepAmount); + uint256 afterLockedAmount = provisionTracker[users.indexer]; + assertEq(afterLockedAmount, beforeLockedAmount - stepAmount); + } + + assertEq(provisionTracker[users.indexer], tokens - stepAmount * steps); + uint256 delta = (tokens % steps); + assertEq(provisionTracker[users.indexer], delta); + } + + function test_Release_RevertGiven_TheProvisionHasInsufficientLockedTokens( + uint256 tokens + ) external useIndexer useProvisionDataService(address(this), tokens, 0, 0) { + // setup + provisionTracker.lock(staking, users.indexer, tokens, uint32(0)); + + uint256 tokensToRelease = tokens + 1; + vm.expectRevert( + abi.encodeWithSelector( + ProvisionTracker.ProvisionTrackerInsufficientTokens.selector, + tokens, + tokensToRelease + ) + ); + provisionTracker.release(users.indexer, tokensToRelease); + } +} diff --git a/packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol b/packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol new file mode 100644 index 000000000..1f897fd02 --- /dev/null +++ b/packages/horizon/test/unit/data-service/libraries/ProvisionTrackerImplementation.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { ProvisionTracker } from "../../../../contracts/data-service/libraries/ProvisionTracker.sol"; + +contract ProvisionTrackerImplementation { + mapping(address => uint256) public provisionTracker; +} diff --git a/packages/horizon/test/unit/escrow/GraphEscrow.t.sol b/packages/horizon/test/unit/escrow/GraphEscrow.t.sol new file mode 100644 index 000000000..82a40d463 --- /dev/null +++ b/packages/horizon/test/unit/escrow/GraphEscrow.t.sol @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; +import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; + +import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { PaymentsEscrowSharedTest } from "../shared/payments-escrow/PaymentsEscrowShared.t.sol"; +import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; + +contract GraphEscrowTest is HorizonStakingSharedTest, PaymentsEscrowSharedTest { + using PPMMath for uint256; + + /* + * MODIFIERS + */ + + modifier approveEscrow(uint256 tokens) { + _approveEscrow(tokens); + _; + } + + modifier useDeposit(uint256 tokens) { + vm.assume(tokens > 0); + vm.assume(tokens <= MAX_STAKING_TOKENS); + _depositTokens(users.verifier, users.indexer, tokens); + _; + } + + modifier depositAndThawTokens(uint256 amount, uint256 thawAmount) { + vm.assume(amount > 0); + vm.assume(thawAmount > 0); + vm.assume(amount <= MAX_STAKING_TOKENS); + vm.assume(amount > thawAmount); + _depositTokens(users.verifier, users.indexer, amount); + escrow.thaw(users.verifier, users.indexer, thawAmount); + _; + } + + /* + * HELPERS + */ + + function _approveEscrow(uint256 tokens) internal { + token.approve(address(escrow), tokens); + } + + function _thawEscrow(address collector, address receiver, uint256 amount) internal { + (, address msgSender, ) = vm.readCallers(); + uint256 expectedThawEndTimestamp = block.timestamp + withdrawEscrowThawingPeriod; + vm.expectEmit(address(escrow)); + emit IPaymentsEscrow.Thaw(msgSender, collector, receiver, amount, expectedThawEndTimestamp); + escrow.thaw(collector, receiver, amount); + + (, uint256 amountThawing, uint256 thawEndTimestamp) = escrow.escrowAccounts(msgSender, collector, receiver); + assertEq(amountThawing, amount); + assertEq(thawEndTimestamp, expectedThawEndTimestamp); + } + + function _cancelThawEscrow(address collector, address receiver) internal { + (, address msgSender, ) = vm.readCallers(); + (, uint256 amountThawingBefore, uint256 thawEndTimestampBefore) = escrow.escrowAccounts( + msgSender, + collector, + receiver + ); + + vm.expectEmit(address(escrow)); + emit IPaymentsEscrow.CancelThaw(msgSender, collector, receiver, amountThawingBefore, thawEndTimestampBefore); + escrow.cancelThaw(collector, receiver); + + (, uint256 amountThawing, uint256 thawEndTimestamp) = escrow.escrowAccounts(msgSender, collector, receiver); + assertEq(amountThawing, 0); + assertEq(thawEndTimestamp, 0); + } + + function _withdrawEscrow(address collector, address receiver) internal { + (, address msgSender, ) = vm.readCallers(); + + (uint256 balanceBefore, uint256 amountThawingBefore, ) = escrow.escrowAccounts(msgSender, collector, receiver); + uint256 tokenBalanceBeforeSender = token.balanceOf(msgSender); + uint256 tokenBalanceBeforeEscrow = token.balanceOf(address(escrow)); + + uint256 amountToWithdraw = amountThawingBefore > balanceBefore ? balanceBefore : amountThawingBefore; + vm.expectEmit(address(escrow)); + emit IPaymentsEscrow.Withdraw(msgSender, collector, receiver, amountToWithdraw); + escrow.withdraw(collector, receiver); + + (uint256 balanceAfter, uint256 tokensThawingAfter, uint256 thawEndTimestampAfter) = escrow.escrowAccounts( + msgSender, + collector, + receiver + ); + uint256 tokenBalanceAfterSender = token.balanceOf(msgSender); + uint256 tokenBalanceAfterEscrow = token.balanceOf(address(escrow)); + + assertEq(balanceAfter, balanceBefore - amountToWithdraw); + assertEq(tokensThawingAfter, 0); + assertEq(thawEndTimestampAfter, 0); + + assertEq(tokenBalanceAfterSender, tokenBalanceBeforeSender + amountToWithdraw); + assertEq(tokenBalanceAfterEscrow, tokenBalanceBeforeEscrow - amountToWithdraw); + } + + struct CollectPaymentData { + uint256 escrowBalance; + uint256 paymentsBalance; + uint256 receiverBalance; + uint256 delegationPoolBalance; + uint256 dataServiceBalance; + uint256 payerEscrowBalance; + } + + struct CollectTokensData { + uint256 tokensProtocol; + uint256 tokensDataService; + uint256 tokensDelegation; + uint256 receiverExpectedPayment; + } + + function _collectEscrow( + IGraphPayments.PaymentTypes _paymentType, + address _payer, + address _receiver, + uint256 _tokens, + address _dataService, + uint256 _dataServiceCut, + address _paymentsDestination + ) internal { + (, address _collector, ) = vm.readCallers(); + + // Previous balances + CollectPaymentData memory previousBalances = CollectPaymentData({ + escrowBalance: token.balanceOf(address(escrow)), + paymentsBalance: token.balanceOf(address(payments)), + receiverBalance: token.balanceOf(_receiver), + delegationPoolBalance: staking.getDelegatedTokensAvailable(_receiver, _dataService), + dataServiceBalance: token.balanceOf(_dataService), + payerEscrowBalance: 0 + }); + CollectTokensData memory collectTokensData = CollectTokensData({ + tokensProtocol: 0, + tokensDataService: 0, + tokensDelegation: 0, + receiverExpectedPayment: 0 + }); + + { + (uint256 payerEscrowBalance, , ) = escrow.escrowAccounts(_payer, _collector, _receiver); + previousBalances.payerEscrowBalance = payerEscrowBalance; + } + + vm.expectEmit(address(escrow)); + emit IPaymentsEscrow.EscrowCollected( + _paymentType, + _payer, + _collector, + _receiver, + _tokens, + _paymentsDestination + ); + escrow.collect(_paymentType, _payer, _receiver, _tokens, _dataService, _dataServiceCut, _paymentsDestination); + + // Calculate cuts + // this is nasty but stack is indeed too deep + collectTokensData.tokensProtocol = _tokens.mulPPMRoundUp(payments.PROTOCOL_PAYMENT_CUT()); + collectTokensData.tokensDataService = (_tokens - collectTokensData.tokensProtocol).mulPPMRoundUp( + _dataServiceCut + ); + + IHorizonStakingTypes.DelegationPool memory pool = staking.getDelegationPool(_receiver, _dataService); + if (pool.shares > 0) { + collectTokensData.tokensDelegation = (_tokens - + collectTokensData.tokensProtocol - + collectTokensData.tokensDataService).mulPPMRoundUp( + staking.getDelegationFeeCut(_receiver, _dataService, _paymentType) + ); + } + collectTokensData.receiverExpectedPayment = + _tokens - + collectTokensData.tokensProtocol - + collectTokensData.tokensDataService - + collectTokensData.tokensDelegation; + + // After balances + CollectPaymentData memory afterBalances = CollectPaymentData({ + escrowBalance: token.balanceOf(address(escrow)), + paymentsBalance: token.balanceOf(address(payments)), + receiverBalance: token.balanceOf(_receiver), + delegationPoolBalance: staking.getDelegatedTokensAvailable(_receiver, _dataService), + dataServiceBalance: token.balanceOf(_dataService), + payerEscrowBalance: 0 + }); + { + (uint256 afterPayerEscrowBalance, , ) = escrow.escrowAccounts(_payer, _collector, _receiver); + afterBalances.payerEscrowBalance = afterPayerEscrowBalance; + } + + // Check receiver balance after payment + assertEq( + afterBalances.receiverBalance - previousBalances.receiverBalance, + collectTokensData.receiverExpectedPayment + ); + assertEq(token.balanceOf(address(payments)), 0); + + // Check delegation pool balance after payment + assertEq( + afterBalances.delegationPoolBalance - previousBalances.delegationPoolBalance, + collectTokensData.tokensDelegation + ); + + // Check that the escrow account has been updated + assertEq(previousBalances.escrowBalance, afterBalances.escrowBalance + _tokens); + + // Check that payments balance didn't change + assertEq(previousBalances.paymentsBalance, afterBalances.paymentsBalance); + + // Check data service balance after payment + assertEq( + afterBalances.dataServiceBalance - previousBalances.dataServiceBalance, + collectTokensData.tokensDataService + ); + + // Check payers escrow balance after payment + assertEq(previousBalances.payerEscrowBalance - _tokens, afterBalances.payerEscrowBalance); + } +} diff --git a/packages/horizon/test/unit/escrow/collect.t.sol b/packages/horizon/test/unit/escrow/collect.t.sol new file mode 100644 index 000000000..9de98ba0b --- /dev/null +++ b/packages/horizon/test/unit/escrow/collect.t.sol @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +import { GraphEscrowTest } from "./GraphEscrow.t.sol"; + +contract GraphEscrowCollectTest is GraphEscrowTest { + /* + * TESTS + */ + + // use users.verifier as collector + function testCollect_Tokens( + uint256 tokens, + uint256 tokensToCollect, + uint256 delegationTokens, + uint256 dataServiceCut + ) + public + useIndexer + useProvision(tokens, 0, 0) + useDelegationFeeCut(IGraphPayments.PaymentTypes.QueryFee, delegationFeeCut) + { + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + tokensToCollect = bound(tokensToCollect, 1, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + resetPrank(users.gateway); + _depositTokens(users.verifier, users.indexer, tokensToCollect); + + // burn some tokens to prevent overflow + resetPrank(users.indexer); + token.burn(MAX_STAKING_TOKENS); + + resetPrank(users.verifier); + _collectEscrow( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + tokensToCollect, + subgraphDataServiceAddress, + dataServiceCut, + users.indexer + ); + } + + function testCollect_Tokens_NoProvision( + uint256 tokens, + uint256 dataServiceCut + ) public useIndexer useDelegationFeeCut(IGraphPayments.PaymentTypes.QueryFee, delegationFeeCut) { + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + + resetPrank(users.gateway); + _depositTokens(users.verifier, users.indexer, tokens); + + // burn some tokens to prevent overflow + resetPrank(users.indexer); + token.burn(MAX_STAKING_TOKENS); + + resetPrank(users.verifier); + _collectEscrow( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + tokens, + subgraphDataServiceAddress, + dataServiceCut, + users.indexer + ); + } + + function testCollect_RevertWhen_SenderHasInsufficientAmountInEscrow( + uint256 amount, + uint256 insufficientAmount + ) public useGateway useDeposit(insufficientAmount) { + vm.assume(amount > 0); + vm.assume(insufficientAmount < amount); + + vm.startPrank(users.verifier); + bytes memory expectedError = abi.encodeWithSignature( + "PaymentsEscrowInsufficientBalance(uint256,uint256)", + insufficientAmount, + amount + ); + vm.expectRevert(expectedError); + escrow.collect( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + amount, + subgraphDataServiceAddress, + 0, + users.indexer + ); + vm.stopPrank(); + } + + function testCollect_MultipleCollections( + uint256 depositAmount, + uint256 firstCollect, + uint256 secondCollect + ) public useIndexer { + // Tests multiple collect operations from the same escrow account + vm.assume(firstCollect < MAX_STAKING_TOKENS); + vm.assume(secondCollect < MAX_STAKING_TOKENS); + vm.assume(depositAmount > 0); + vm.assume(firstCollect > 0 && firstCollect < depositAmount); + vm.assume(secondCollect > 0 && secondCollect <= depositAmount - firstCollect); + + resetPrank(users.gateway); + _depositTokens(users.verifier, users.indexer, depositAmount); + + // burn some tokens to prevent overflow + resetPrank(users.indexer); + token.burn(MAX_STAKING_TOKENS); + + resetPrank(users.verifier); + _collectEscrow( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + firstCollect, + subgraphDataServiceAddress, + 0, + users.indexer + ); + } +} diff --git a/packages/horizon/test/unit/escrow/deposit.t.sol b/packages/horizon/test/unit/escrow/deposit.t.sol new file mode 100644 index 000000000..bab8d0e5f --- /dev/null +++ b/packages/horizon/test/unit/escrow/deposit.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { GraphEscrowTest } from "./GraphEscrow.t.sol"; + +contract GraphEscrowDepositTest is GraphEscrowTest { + /* + * TESTS + */ + + function testDeposit_Tokens(uint256 amount) public useGateway useDeposit(amount) { + (uint256 indexerEscrowBalance, , ) = escrow.escrowAccounts(users.gateway, users.verifier, users.indexer); + assertEq(indexerEscrowBalance, amount); + } + + function testDepositTo_Tokens(uint256 amount) public { + resetPrank(users.delegator); + token.approve(address(escrow), amount); + _depositToTokens(users.gateway, users.verifier, users.indexer, amount); + } + + // Tests multiple deposits accumulate correctly in the escrow account + function testDeposit_MultipleDeposits(uint256 amount1, uint256 amount2) public useGateway { + vm.assume(amount1 > 0); + vm.assume(amount2 > 0); + vm.assume(amount1 <= MAX_STAKING_TOKENS); + vm.assume(amount2 <= MAX_STAKING_TOKENS); + + _depositTokens(users.verifier, users.indexer, amount1); + _depositTokens(users.verifier, users.indexer, amount2); + + (uint256 balance, , ) = escrow.escrowAccounts(users.gateway, users.verifier, users.indexer); + assertEq(balance, amount1 + amount2); + } +} diff --git a/packages/horizon/test/unit/escrow/getters.t.sol b/packages/horizon/test/unit/escrow/getters.t.sol new file mode 100644 index 000000000..262192125 --- /dev/null +++ b/packages/horizon/test/unit/escrow/getters.t.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +import { GraphEscrowTest } from "./GraphEscrow.t.sol"; + +contract GraphEscrowGettersTest is GraphEscrowTest { + /* + * TESTS + */ + + function testGetBalance(uint256 amount) public useGateway useDeposit(amount) { + uint256 balance = escrow.getBalance(users.gateway, users.verifier, users.indexer); + assertEq(balance, amount); + } + + function testGetBalance_WhenThawing( + uint256 amountDeposit, + uint256 amountThawing + ) public useGateway useDeposit(amountDeposit) { + vm.assume(amountThawing > 0); + vm.assume(amountDeposit >= amountThawing); + + // thaw some funds + _thawEscrow(users.verifier, users.indexer, amountThawing); + + uint256 balance = escrow.getBalance(users.gateway, users.verifier, users.indexer); + assertEq(balance, amountDeposit - amountThawing); + } + + function testGetBalance_WhenCollectedOverThawing( + uint256 amountDeposit, + uint256 amountThawing, + uint256 amountCollected + ) public useGateway useDeposit(amountDeposit) { + vm.assume(amountThawing > 0); + vm.assume(amountDeposit > 0); + vm.assume(amountDeposit >= amountThawing); + vm.assume(amountDeposit >= amountCollected); + vm.assume(amountDeposit - amountCollected < amountThawing); + + // thaw some funds + _thawEscrow(users.verifier, users.indexer, amountThawing); + + // users start with max uint256 balance so we burn to avoid overflow + // TODO: we should modify all tests to consider users have a max balance thats less than max uint256 + resetPrank(users.indexer); + token.burn(amountCollected); + + // collect some funds to get the balance of the account below the amount thawing + resetPrank(users.verifier); + _collectEscrow( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + amountCollected, + subgraphDataServiceAddress, + 0, + users.indexer + ); + + // balance should always be 0 since thawing funds > available funds + uint256 balance = escrow.getBalance(users.gateway, users.verifier, users.indexer); + assertEq(balance, 0); + } +} diff --git a/packages/horizon/test/unit/escrow/paused.t.sol b/packages/horizon/test/unit/escrow/paused.t.sol new file mode 100644 index 000000000..815d75dc4 --- /dev/null +++ b/packages/horizon/test/unit/escrow/paused.t.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; + +import { GraphEscrowTest } from "./GraphEscrow.t.sol"; + +contract GraphEscrowPausedTest is GraphEscrowTest { + /* + * MODIFIERS + */ + + modifier usePaused(bool paused) { + address msgSender; + (, msgSender, ) = vm.readCallers(); + resetPrank(users.governor); + controller.setPaused(paused); + resetPrank(msgSender); + _; + } + + /* + * TESTS + */ + + // Escrow + + function testPaused_RevertWhen_Deposit(uint256 tokens) public useGateway usePaused(true) { + vm.expectRevert(abi.encodeWithSelector(IPaymentsEscrow.PaymentsEscrowIsPaused.selector)); + escrow.deposit(users.verifier, users.indexer, tokens); + } + + function testPaused_RevertWhen_DepositTo(uint256 tokens) public usePaused(true) { + resetPrank(users.operator); + vm.expectRevert(abi.encodeWithSelector(IPaymentsEscrow.PaymentsEscrowIsPaused.selector)); + escrow.depositTo(users.gateway, users.verifier, users.indexer, tokens); + } + + function testPaused_RevertWhen_ThawTokens(uint256 tokens) public useGateway useDeposit(tokens) usePaused(true) { + vm.expectRevert(abi.encodeWithSelector(IPaymentsEscrow.PaymentsEscrowIsPaused.selector)); + escrow.thaw(users.verifier, users.indexer, tokens); + } + + function testPaused_RevertWhen_WithdrawTokens( + uint256 tokens, + uint256 thawAmount + ) public useGateway depositAndThawTokens(tokens, thawAmount) usePaused(true) { + // advance time + skip(withdrawEscrowThawingPeriod + 1); + + vm.expectRevert(abi.encodeWithSelector(IPaymentsEscrow.PaymentsEscrowIsPaused.selector)); + escrow.withdraw(users.verifier, users.indexer); + } + + // Collect + + function testPaused_RevertWhen_CollectTokens(uint256 tokens, uint256 tokensDataService) public usePaused(true) { + resetPrank(users.verifier); + vm.expectRevert(abi.encodeWithSelector(IPaymentsEscrow.PaymentsEscrowIsPaused.selector)); + escrow.collect( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + tokens, + subgraphDataServiceAddress, + tokensDataService, + users.indexer + ); + } +} diff --git a/packages/horizon/test/unit/escrow/thaw.t.sol b/packages/horizon/test/unit/escrow/thaw.t.sol new file mode 100644 index 000000000..f7c23371b --- /dev/null +++ b/packages/horizon/test/unit/escrow/thaw.t.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { GraphEscrowTest } from "./GraphEscrow.t.sol"; + +contract GraphEscrowThawTest is GraphEscrowTest { + /* + * TESTS + */ + + function testThaw_PartialBalanceThaw( + uint256 amountDeposited, + uint256 amountThawed + ) public useGateway useDeposit(amountDeposited) { + vm.assume(amountThawed > 0); + vm.assume(amountThawed <= amountDeposited); + _thawEscrow(users.verifier, users.indexer, amountThawed); + } + + function testThaw_FullBalanceThaw(uint256 amount) public useGateway useDeposit(amount) { + vm.assume(amount > 0); + _thawEscrow(users.verifier, users.indexer, amount); + + uint256 availableBalance = escrow.getBalance(users.gateway, users.verifier, users.indexer); + assertEq(availableBalance, 0); + } + + function testThaw_Tokens_SuccesiveCalls(uint256 amount) public useGateway { + amount = bound(amount, 2, type(uint256).max - 10); + _depositTokens(users.verifier, users.indexer, amount); + + uint256 firstAmountToThaw = (amount + 2 - 1) / 2; + uint256 secondAmountToThaw = (amount + 10 - 1) / 10; + _thawEscrow(users.verifier, users.indexer, firstAmountToThaw); + _thawEscrow(users.verifier, users.indexer, secondAmountToThaw); + + (, address msgSender, ) = vm.readCallers(); + (, uint256 amountThawing, uint256 thawEndTimestamp) = escrow.escrowAccounts( + msgSender, + users.verifier, + users.indexer + ); + assertEq(amountThawing, secondAmountToThaw); + assertEq(thawEndTimestamp, block.timestamp + withdrawEscrowThawingPeriod); + } + + function testThaw_Tokens_RevertWhen_AmountIsZero() public useGateway { + bytes memory expectedError = abi.encodeWithSignature("PaymentsEscrowInvalidZeroTokens()"); + vm.expectRevert(expectedError); + escrow.thaw(users.verifier, users.indexer, 0); + } + + function testThaw_RevertWhen_InsufficientAmount( + uint256 amount, + uint256 overAmount + ) public useGateway useDeposit(amount) { + overAmount = bound(overAmount, amount + 1, type(uint256).max); + bytes memory expectedError = abi.encodeWithSignature( + "PaymentsEscrowInsufficientBalance(uint256,uint256)", + amount, + overAmount + ); + vm.expectRevert(expectedError); + escrow.thaw(users.verifier, users.indexer, overAmount); + } + + function testThaw_CancelRequest(uint256 amount) public useGateway useDeposit(amount) { + _thawEscrow(users.verifier, users.indexer, amount); + _cancelThawEscrow(users.verifier, users.indexer); + } + + function testThaw_CancelRequest_RevertWhen_NoThawing(uint256 amount) public useGateway useDeposit(amount) { + bytes memory expectedError = abi.encodeWithSignature("PaymentsEscrowNotThawing()"); + vm.expectRevert(expectedError); + escrow.cancelThaw(users.verifier, users.indexer); + } +} diff --git a/packages/horizon/test/unit/escrow/withdraw.t.sol b/packages/horizon/test/unit/escrow/withdraw.t.sol new file mode 100644 index 000000000..0a4e9b1af --- /dev/null +++ b/packages/horizon/test/unit/escrow/withdraw.t.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { GraphEscrowTest } from "./GraphEscrow.t.sol"; + +contract GraphEscrowWithdrawTest is GraphEscrowTest { + /* + * TESTS + */ + + function testWithdraw_Tokens( + uint256 amount, + uint256 thawAmount + ) public useGateway depositAndThawTokens(amount, thawAmount) { + // advance time + skip(withdrawEscrowThawingPeriod + 1); + + _withdrawEscrow(users.verifier, users.indexer); + vm.stopPrank(); + } + + function testWithdraw_RevertWhen_NotThawing(uint256 amount) public useGateway useDeposit(amount) { + bytes memory expectedError = abi.encodeWithSignature("PaymentsEscrowNotThawing()"); + vm.expectRevert(expectedError); + escrow.withdraw(users.verifier, users.indexer); + } + + function testWithdraw_RevertWhen_StillThawing( + uint256 amount, + uint256 thawAmount + ) public useGateway depositAndThawTokens(amount, thawAmount) { + bytes memory expectedError = abi.encodeWithSignature( + "PaymentsEscrowStillThawing(uint256,uint256)", + block.timestamp, + block.timestamp + withdrawEscrowThawingPeriod + ); + vm.expectRevert(expectedError); + escrow.withdraw(users.verifier, users.indexer); + } + + function testWithdraw_BalanceAfterCollect( + uint256 amountDeposited, + uint256 amountThawed, + uint256 amountCollected + ) public useGateway depositAndThawTokens(amountDeposited, amountThawed) { + vm.assume(amountCollected > 0); + vm.assume(amountCollected <= amountDeposited); + + // burn some tokens to prevent overflow + resetPrank(users.indexer); + token.burn(MAX_STAKING_TOKENS); + + // collect + resetPrank(users.verifier); + _collectEscrow( + IGraphPayments.PaymentTypes.QueryFee, + users.gateway, + users.indexer, + amountCollected, + subgraphDataServiceAddress, + 0, + users.indexer + ); + + // Advance time to simulate the thawing period + skip(withdrawEscrowThawingPeriod + 1); + + // withdraw the remaining thawed balance + resetPrank(users.gateway); + _withdrawEscrow(users.verifier, users.indexer); + } +} diff --git a/packages/horizon/test/unit/libraries/LinkedList.t.sol b/packages/horizon/test/unit/libraries/LinkedList.t.sol new file mode 100644 index 000000000..9bc78a026 --- /dev/null +++ b/packages/horizon/test/unit/libraries/LinkedList.t.sol @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import "forge-std/console.sol"; +import { Test } from "forge-std/Test.sol"; +import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; +import { ListImplementation } from "./ListImplementation.sol"; + +contract LinkedListTest is Test, ListImplementation { + using LinkedList for ILinkedList.List; + + function setUp() internal { + list = ILinkedList.List({ head: bytes32(0), tail: bytes32(0), nonce: 0, count: 0 }); + } + + /// forge-config: default.allow_internal_expect_revert = true + function test_Add_RevertGiven_TheItemIdIsZero() external { + vm.expectRevert(ILinkedList.LinkedListInvalidZeroId.selector); + list.addTail(bytes32(0)); + } + + function test_Add_GivenTheListIsEmpty() external { + _assert_addItem(_buildItemId(list.nonce), 0); + } + + function test_Add_GivenTheListIsNotEmpty() external { + // init list + _assert_addItem(_buildItemId(list.nonce), 0); + + // add to a non empty list + _assert_addItem(_buildItemId(list.nonce), 1); + } + + /// forge-config: default.allow_internal_expect_revert = true + function test_Add_RevertGiven_TheListIsAtMaxSize() external { + for (uint256 i = 0; i < LinkedList.MAX_ITEMS; i++) { + bytes32 id = _buildItemId(list.nonce); + _addItemToList(list, id, i); + } + + vm.expectRevert(ILinkedList.LinkedListMaxElementsExceeded.selector); + list.addTail(_buildItemId(list.nonce)); + } + + /// forge-config: default.allow_internal_expect_revert = true + function test_Remove_RevertGiven_TheListIsEmpty() external { + vm.expectRevert(ILinkedList.LinkedListEmptyList.selector); + list.removeHead(_getNextItem, _deleteItem); + } + + function test_Remove_GivenTheListIsNotEmpty() external { + _assert_addItem(_buildItemId(list.nonce), 0); + _assert_removeItem(); + } + + function test_TraverseGivenTheListIsEmpty() external { + _assert_traverseList(_processItemAddition, abi.encode(0), 0, abi.encode(0)); + } + + modifier givenTheListIsNotEmpty() { + for (uint256 i = 0; i < LIST_LENGTH; i++) { + bytes32 id = _buildItemId(list.nonce); + _assert_addItem(id, i); + } + _; + } + + function test_TraverseWhenIterationsAreNotSpecified() external givenTheListIsNotEmpty { + // calculate sum of all item idexes - it's what _processItemAddition does + uint256 sum = 0; + for (uint256 i = 0; i < list.count; i++) { + sum += i; + } + _assert_traverseList(_processItemAddition, abi.encode(0), 0, abi.encode(sum)); + } + + function test_TraverseWhenIterationsAreSpecified(uint256 n) external givenTheListIsNotEmpty { + vm.assume(n > 0); + vm.assume(n < LIST_LENGTH); + uint256 sum = 0; + for (uint256 i = 0; i < n; i++) { + sum += i; + } + _assert_traverseList(_processItemAddition, abi.encode(0), n, abi.encode(sum)); + } + + /// forge-config: default.allow_internal_expect_revert = true + function test_TraverseWhenIterationsAreInvalid() external givenTheListIsNotEmpty { + uint256 n = LIST_LENGTH + 1; + uint256 sum = 0; + for (uint256 i = 0; i < n; i++) { + sum += i; + } + vm.expectRevert(ILinkedList.LinkedListInvalidIterations.selector); + _assert_traverseList(_processItemAddition, abi.encode(0), n, abi.encode(sum)); + } + + // -- Assertions -- + function _assert_addItem(bytes32 id, uint256 idIndex) internal { + uint256 beforeNonce = list.nonce; + uint256 beforeCount = list.count; + bytes32 beforeHead = list.head; + + ids[idIndex] = _addItemToList(list, id, idIndex); + + uint256 afterNonce = list.nonce; + uint256 afterCount = list.count; + bytes32 afterTail = list.tail; + bytes32 afterHead = list.head; + + assertEq(afterNonce, beforeNonce + 1); + assertEq(afterCount, beforeCount + 1); + + if (beforeCount == 0) { + assertEq(afterHead, id); + } else { + assertEq(afterHead, beforeHead); + } + assertEq(afterTail, id); + } + + function _assert_removeItem() internal { + uint256 beforeNonce = list.nonce; + uint256 beforeCount = list.count; + bytes32 beforeTail = list.tail; + bytes32 beforeHead = list.head; + + Item memory beforeHeadItem = items[beforeHead]; + + list.removeHead(_getNextItem, _deleteItem); + + uint256 afterNonce = list.nonce; + uint256 afterCount = list.count; + bytes32 afterTail = list.tail; + bytes32 afterHead = list.head; + + assertEq(afterNonce, beforeNonce); + assertEq(afterCount, beforeCount - 1); + + if (afterCount == 0) { + assertEq(afterTail, bytes32(0)); + } else { + assertEq(afterTail, beforeTail); + } + assertEq(afterHead, beforeHeadItem.next); + } + + function _assert_traverseList( + function(bytes32, bytes memory) internal returns (bool, bytes memory) _processItem, + bytes memory _initAcc, + uint256 _n, + bytes memory _expectedAcc + ) internal { + uint256 beforeNonce = list.nonce; + uint256 beforeCount = list.count; + bytes32 beforeTail = list.tail; + bytes32 beforeHead = list.head; + + // calculate after head item + bytes32 calcAfterHead = beforeHead; + if (_n != 0) { + for (uint256 i = 0; i < _n; i++) { + calcAfterHead = _getNextItem(calcAfterHead); + } + } + + (uint256 processedCount, bytes memory acc) = list.traverse( + _getNextItem, + _processItem, + _deleteItem, + _initAcc, + _n + ); + uint256 afterNonce = list.nonce; + uint256 afterCount = list.count; + bytes32 afterTail = list.tail; + bytes32 afterHead = list.head; + + assertEq(processedCount, _n == 0 ? beforeCount : _n); + assertEq(acc, _expectedAcc); + + assertEq(afterNonce, beforeNonce); + assertEq(afterCount, _n == 0 ? 0 : beforeCount - _n); + + if (_n == 0) { + assertEq(afterTail, bytes32(0)); + assertEq(afterHead, bytes32(0)); + } else { + assertEq(afterTail, beforeTail); + assertEq(afterHead, calcAfterHead); + } + } +} diff --git a/packages/horizon/test/unit/libraries/ListImplementation.sol b/packages/horizon/test/unit/libraries/ListImplementation.sol new file mode 100644 index 000000000..dad859f59 --- /dev/null +++ b/packages/horizon/test/unit/libraries/ListImplementation.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; +import { LinkedList } from "../../../contracts/libraries/LinkedList.sol"; + +contract ListImplementation { + using LinkedList for ILinkedList.List; + + uint256 constant LIST_LENGTH = 100; + + struct Item { + uint256 data; + bytes32 next; + } + + ILinkedList.List public list; + mapping(bytes32 id => Item data) public items; + bytes32[LIST_LENGTH] public ids; + + function _addItemToList(ILinkedList.List storage _list, bytes32 _id, uint256 _data) internal returns (bytes32) { + items[_id] = Item({ data: _data, next: bytes32(0) }); + if (_list.count != 0) { + items[_list.tail].next = _id; + } + _list.addTail(_id); + return _id; + } + + function _deleteItem(bytes32 _id) internal { + delete items[_id]; + } + + function _getNextItem(bytes32 _id) internal view returns (bytes32) { + return items[_id].next; + } + + function _processItemAddition(bytes32 _id, bytes memory _acc) internal view returns (bool, bytes memory) { + uint256 sum = abi.decode(_acc, (uint256)); + sum += items[_id].data; + return (false, abi.encode(sum)); // dont break, do delete + } + + function _buildItemId(uint256 nonce) internal view returns (bytes32) { + // use block.number to salt the id generation to avoid + // accidentally using dirty state on repeat tests + return bytes32(keccak256(abi.encode(nonce, block.number))); + } +} diff --git a/packages/horizon/test/unit/libraries/PPMMath.t.sol b/packages/horizon/test/unit/libraries/PPMMath.t.sol new file mode 100644 index 000000000..a2d011aeb --- /dev/null +++ b/packages/horizon/test/unit/libraries/PPMMath.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import "forge-std/console.sol"; +import { Test } from "forge-std/Test.sol"; +import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; + +contract PPMMathTest is Test { + uint32 private constant MAX_PPM = 1000000; + + function test_mulPPM(uint256 a, uint256 b) public pure { + a = bound(a, 0, MAX_PPM); + b = bound(b, 0, type(uint256).max / MAX_PPM); + + uint256 result = PPMMath.mulPPM(a, b); + assertEq(result, (a * b) / MAX_PPM); + } + + function test_mulPPMRoundUp(uint256 a, uint256 b) public pure { + a = bound(a, 0, type(uint256).max / MAX_PPM); + b = bound(b, 0, MAX_PPM); + + uint256 result = PPMMath.mulPPMRoundUp(a, b); + assertEq(result, a - PPMMath.mulPPM(a, MAX_PPM - b)); + } + + function test_isValidPPM(uint256 value) public pure { + bool result = PPMMath.isValidPPM(value); + assert(result == (value <= MAX_PPM)); + } + + /// forge-config: default.allow_internal_expect_revert = true + function test_mullPPM_RevertWhen_InvalidPPM(uint256 a, uint256 b) public { + a = bound(a, MAX_PPM + 1, type(uint256).max); + b = bound(b, MAX_PPM + 1, type(uint256).max); + bytes memory expectedError = abi.encodeWithSelector(PPMMath.PPMMathInvalidMulPPM.selector, a, b); + vm.expectRevert(expectedError); + PPMMath.mulPPM(a, b); + } + + /// forge-config: default.allow_internal_expect_revert = true + function test_mullPPMRoundUp_RevertWhen_InvalidPPM(uint256 a, uint256 b) public { + b = bound(b, MAX_PPM + 1, type(uint256).max); + bytes memory expectedError = abi.encodeWithSelector(PPMMath.PPMMathInvalidPPM.selector, b); + vm.expectRevert(expectedError); + PPMMath.mulPPMRoundUp(a, b); + } +} diff --git a/packages/horizon/test/unit/payments/GraphPayments.t.sol b/packages/horizon/test/unit/payments/GraphPayments.t.sol new file mode 100644 index 000000000..61659a9ab --- /dev/null +++ b/packages/horizon/test/unit/payments/GraphPayments.t.sol @@ -0,0 +1,472 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { GraphPayments } from "../../../contracts/payments/GraphPayments.sol"; + +import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { PPMMath } from "../../../contracts/libraries/PPMMath.sol"; +import { IERC20Errors } from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; + +contract GraphPaymentsExtended is GraphPayments { + constructor(address controller, uint256 protocolPaymentCut) GraphPayments(controller, protocolPaymentCut) {} + + function readController() external view returns (address) { + return address(_graphController()); + } +} + +contract GraphPaymentsTest is HorizonStakingSharedTest { + using PPMMath for uint256; + + struct CollectPaymentData { + uint256 escrowBalance; + uint256 paymentsBalance; + uint256 receiverBalance; + uint256 receiverDestinationBalance; + uint256 delegationPoolBalance; + uint256 dataServiceBalance; + uint256 receiverStake; + } + + struct CollectTokensData { + uint256 tokensProtocol; + uint256 tokensDataService; + uint256 tokensDelegation; + uint256 receiverExpectedPayment; + } + + function _collect( + IGraphPayments.PaymentTypes _paymentType, + address _receiver, + uint256 _tokens, + address _dataService, + uint256 _dataServiceCut, + address _paymentsDestination + ) private { + // Previous balances + CollectPaymentData memory previousBalances = CollectPaymentData({ + escrowBalance: token.balanceOf(address(escrow)), + paymentsBalance: token.balanceOf(address(payments)), + receiverBalance: token.balanceOf(_receiver), + receiverDestinationBalance: token.balanceOf(_paymentsDestination), + delegationPoolBalance: staking.getDelegatedTokensAvailable(_receiver, _dataService), + dataServiceBalance: token.balanceOf(_dataService), + receiverStake: staking.getStake(_receiver) + }); + + // Calculate cuts + CollectTokensData memory collectTokensData = CollectTokensData({ + tokensProtocol: 0, + tokensDataService: 0, + tokensDelegation: 0, + receiverExpectedPayment: 0 + }); + collectTokensData.tokensProtocol = _tokens.mulPPMRoundUp(payments.PROTOCOL_PAYMENT_CUT()); + collectTokensData.tokensDataService = (_tokens - collectTokensData.tokensProtocol).mulPPMRoundUp( + _dataServiceCut + ); + + { + IHorizonStakingTypes.DelegationPool memory pool = staking.getDelegationPool(_receiver, _dataService); + if (pool.shares > 0) { + collectTokensData.tokensDelegation = (_tokens - + collectTokensData.tokensProtocol - + collectTokensData.tokensDataService).mulPPMRoundUp( + staking.getDelegationFeeCut(_receiver, _dataService, _paymentType) + ); + } + } + + collectTokensData.receiverExpectedPayment = + _tokens - + collectTokensData.tokensProtocol - + collectTokensData.tokensDataService - + collectTokensData.tokensDelegation; + + (, address msgSender, ) = vm.readCallers(); + vm.expectEmit(address(payments)); + emit IGraphPayments.GraphPaymentCollected( + _paymentType, + msgSender, + _receiver, + _dataService, + _tokens, + collectTokensData.tokensProtocol, + collectTokensData.tokensDataService, + collectTokensData.tokensDelegation, + collectTokensData.receiverExpectedPayment, + _paymentsDestination + ); + payments.collect(_paymentType, _receiver, _tokens, _dataService, _dataServiceCut, _paymentsDestination); + + // After balances + CollectPaymentData memory afterBalances = CollectPaymentData({ + escrowBalance: token.balanceOf(address(escrow)), + paymentsBalance: token.balanceOf(address(payments)), + receiverBalance: token.balanceOf(_receiver), + receiverDestinationBalance: token.balanceOf(_paymentsDestination), + delegationPoolBalance: staking.getDelegatedTokensAvailable(_receiver, _dataService), + dataServiceBalance: token.balanceOf(_dataService), + receiverStake: staking.getStake(_receiver) + }); + + // Check receiver balance after payment + assertEq( + afterBalances.receiverBalance - previousBalances.receiverBalance, + _paymentsDestination == _receiver ? collectTokensData.receiverExpectedPayment : 0 + ); + assertEq(token.balanceOf(address(payments)), 0); + + // Check receiver destination balance after payment + assertEq( + afterBalances.receiverDestinationBalance - previousBalances.receiverDestinationBalance, + _paymentsDestination == address(0) ? 0 : collectTokensData.receiverExpectedPayment + ); + + // Check receiver stake after payment + assertEq( + afterBalances.receiverStake - previousBalances.receiverStake, + _paymentsDestination == address(0) ? collectTokensData.receiverExpectedPayment : 0 + ); + + // Check delegation pool balance after payment + assertEq( + afterBalances.delegationPoolBalance - previousBalances.delegationPoolBalance, + collectTokensData.tokensDelegation + ); + + // Check that the escrow account has been updated + assertEq(previousBalances.escrowBalance, afterBalances.escrowBalance + _tokens); + + // Check that payments balance didn't change + assertEq(previousBalances.paymentsBalance, afterBalances.paymentsBalance); + + // Check data service balance after payment + assertEq( + afterBalances.dataServiceBalance - previousBalances.dataServiceBalance, + collectTokensData.tokensDataService + ); + } + + /* + * TESTS + */ + + function testConstructor() public { + uint256 protocolCut = 100_000; + GraphPaymentsExtended newPayments = new GraphPaymentsExtended(address(controller), protocolCut); + assertEq(address(newPayments.readController()), address(controller)); + assertEq(newPayments.PROTOCOL_PAYMENT_CUT(), protocolCut); + } + + function testConstructor_RevertIf_InvalidProtocolPaymentCut(uint256 protocolPaymentCut) public { + protocolPaymentCut = bound(protocolPaymentCut, MAX_PPM + 1, type(uint256).max); + + resetPrank(users.deployer); + bytes memory expectedError = abi.encodeWithSelector( + IGraphPayments.GraphPaymentsInvalidCut.selector, + protocolPaymentCut + ); + vm.expectRevert(expectedError); + new GraphPayments(address(controller), protocolPaymentCut); + } + + function testInitialize() public { + // Deploy new instance to test initialization + GraphPayments newPayments = new GraphPayments(address(controller), 100_000); + + // Should revert if not called by onlyInitializer + vm.expectRevert(); + newPayments.initialize(); + } + + function testCollect( + uint256 amount, + uint256 amountToCollect, + uint256 dataServiceCut, + uint256 tokensDelegate, + uint256 delegationFeeCut + ) public useIndexer useProvision(amount, 0, 0) { + amountToCollect = bound(amountToCollect, 1, MAX_STAKING_TOKENS); + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + tokensDelegate = bound(tokensDelegate, 1, MAX_STAKING_TOKENS); + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); // Covers zero, max, and everything in between + + // Set delegation fee cut + _setDelegationFeeCut( + users.indexer, + subgraphDataServiceAddress, + IGraphPayments.PaymentTypes.QueryFee, + delegationFeeCut + ); + + // Delegate tokens + tokensDelegate = bound(tokensDelegate, MIN_DELEGATION, MAX_STAKING_TOKENS); + vm.startPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, tokensDelegate, 0); + + // Add tokens in escrow + address escrowAddress = address(escrow); + mint(escrowAddress, amount); + vm.startPrank(escrowAddress); + approve(address(payments), amount); + + // Collect payments through GraphPayments + _collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + dataServiceCut, + users.indexer + ); + vm.stopPrank(); + } + + function testCollect_WithRestaking( + uint256 amount, + uint256 amountToCollect, + uint256 dataServiceCut, + uint256 tokensDelegate, + uint256 delegationFeeCut + ) public useIndexer useProvision(amount, 0, 0) { + amountToCollect = bound(amountToCollect, 1, MAX_STAKING_TOKENS); + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + tokensDelegate = bound(tokensDelegate, 1, MAX_STAKING_TOKENS); + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); // Covers zero, max, and everything in between + + // Set delegation fee cut + _setDelegationFeeCut( + users.indexer, + subgraphDataServiceAddress, + IGraphPayments.PaymentTypes.QueryFee, + delegationFeeCut + ); + + // Delegate tokens + tokensDelegate = bound(tokensDelegate, MIN_DELEGATION, MAX_STAKING_TOKENS); + vm.startPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, tokensDelegate, 0); + + // Add tokens in escrow + address escrowAddress = address(escrow); + mint(escrowAddress, amount); + vm.startPrank(escrowAddress); + approve(address(payments), amount); + + // Collect payments through GraphPayments + _collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + dataServiceCut, + address(0) + ); + vm.stopPrank(); + } + + function testCollect_WithBeneficiary( + uint256 amount, + uint256 amountToCollect, + uint256 dataServiceCut, + uint256 tokensDelegate, + uint256 delegationFeeCut + ) public useIndexer useProvision(amount, 0, 0) { + amountToCollect = bound(amountToCollect, 1, MAX_STAKING_TOKENS); + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + tokensDelegate = bound(tokensDelegate, 1, MAX_STAKING_TOKENS); + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); // Covers zero, max, and everything in between + + // Set delegation fee cut + _setDelegationFeeCut( + users.indexer, + subgraphDataServiceAddress, + IGraphPayments.PaymentTypes.QueryFee, + delegationFeeCut + ); + + // Delegate tokens + tokensDelegate = bound(tokensDelegate, MIN_DELEGATION, MAX_STAKING_TOKENS); + vm.startPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, tokensDelegate, 0); + + // Add tokens in escrow + address escrowAddress = address(escrow); + mint(escrowAddress, amount); + vm.startPrank(escrowAddress); + approve(address(payments), amount); + + // Collect payments through GraphPayments + _collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + dataServiceCut, + vm.addr(1) // use some random address as beneficiary + ); + vm.stopPrank(); + } + + function testCollect_NoProvision( + uint256 amount, + uint256 dataServiceCut, + uint256 delegationFeeCut + ) public useIndexer { + amount = bound(amount, 1, MAX_STAKING_TOKENS); + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); // Covers zero, max, and everything in between + + // Set delegation fee cut + _setDelegationFeeCut( + users.indexer, + subgraphDataServiceAddress, + IGraphPayments.PaymentTypes.QueryFee, + delegationFeeCut + ); + + // Add tokens in escrow + address escrowAddress = address(escrow); + mint(escrowAddress, amount); + vm.startPrank(escrowAddress); + approve(address(payments), amount); + + // burn some tokens to prevent overflow + resetPrank(users.indexer); + token.burn(MAX_STAKING_TOKENS); + + // Collect payments through GraphPayments + vm.startPrank(escrowAddress); + _collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + dataServiceCut, + users.indexer + ); + vm.stopPrank(); + } + + function testCollect_RevertWhen_InvalidDataServiceCut( + uint256 amount, + uint256 dataServiceCut + ) + public + useIndexer + useProvision(amount, 0, 0) + useDelegationFeeCut(IGraphPayments.PaymentTypes.QueryFee, delegationFeeCut) + { + dataServiceCut = bound(dataServiceCut, MAX_PPM + 1, type(uint256).max); + + resetPrank(users.deployer); + bytes memory expectedError = abi.encodeWithSelector( + IGraphPayments.GraphPaymentsInvalidCut.selector, + dataServiceCut + ); + vm.expectRevert(expectedError); + payments.collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + dataServiceCut, + users.indexer + ); + } + + function testCollect_WithZeroAmount(uint256 amount) public useIndexer useProvision(amount, 0, 0) { + _collect(IGraphPayments.PaymentTypes.QueryFee, users.indexer, 0, subgraphDataServiceAddress, 0, users.indexer); + } + + function testCollect_RevertWhen_UnauthorizedCaller(uint256 amount) public useIndexer useProvision(amount, 0, 0) { + vm.assume(amount > 0 && amount <= MAX_STAKING_TOKENS); + + // Try to collect without being the escrow + resetPrank(users.indexer); + + vm.expectRevert( + abi.encodeWithSelector(IERC20Errors.ERC20InsufficientAllowance.selector, address(payments), 0, amount) + ); + + payments.collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + 0, + users.indexer + ); + } + + function testCollect_WithNoDelegation( + uint256 amount, + uint256 dataServiceCut, + uint256 delegationFeeCut + ) public useIndexer useProvision(amount, 0, 0) { + dataServiceCut = bound(dataServiceCut, 0, MAX_PPM); + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); + + // Set delegation fee cut + _setDelegationFeeCut( + users.indexer, + subgraphDataServiceAddress, + IGraphPayments.PaymentTypes.QueryFee, + delegationFeeCut + ); + + // Add tokens in escrow + address escrowAddress = address(escrow); + mint(escrowAddress, amount); + vm.startPrank(escrowAddress); + approve(address(payments), amount); + + // Collect payments through GraphPayments + _collect( + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + dataServiceCut, + users.indexer + ); + vm.stopPrank(); + } + + function testCollect_ViaMulticall(uint256 amount) public useIndexer { + amount = bound(amount, 1, MAX_STAKING_TOKENS / 2); // Divide by 2 as we'll make two calls + + address escrowAddress = address(escrow); + mint(escrowAddress, amount * 2); + vm.startPrank(escrowAddress); + approve(address(payments), amount * 2); + + bytes[] memory data = new bytes[](2); + data[0] = abi.encodeWithSelector( + payments.collect.selector, + IGraphPayments.PaymentTypes.QueryFee, + users.indexer, + amount, + subgraphDataServiceAddress, + 100_000, // 10% + users.indexer + ); + data[1] = abi.encodeWithSelector( + payments.collect.selector, + IGraphPayments.PaymentTypes.IndexingFee, + users.indexer, + amount, + subgraphDataServiceAddress, + 200_000, // 20% + users.indexer + ); + + payments.multicall(data); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol new file mode 100644 index 000000000..74c468186 --- /dev/null +++ b/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; +import { IPaymentsCollector } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsCollector.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; +import { GraphTallyCollector } from "../../../../contracts/payments/collectors/GraphTallyCollector.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; + +import { HorizonStakingSharedTest } from "../../shared/horizon-staking/HorizonStakingShared.t.sol"; +import { PaymentsEscrowSharedTest } from "../../shared/payments-escrow/PaymentsEscrowShared.t.sol"; + +contract GraphTallyTest is HorizonStakingSharedTest, PaymentsEscrowSharedTest { + using PPMMath for uint256; + + address signer; + uint256 signerPrivateKey; + + /* + * MODIFIERS + */ + + modifier useSigner() { + uint256 proofDeadline = block.timestamp + 1; + bytes memory signerProof = _getSignerProof(proofDeadline, signerPrivateKey); + _authorizeSigner(signer, proofDeadline, signerProof); + _; + } + + /* + * SET UP + */ + + function setUp() public virtual override { + super.setUp(); + (signer, signerPrivateKey) = makeAddrAndKey("signer"); + vm.label({ account: signer, newLabel: "signer" }); + } + + /* + * HELPERS + */ + + function _getSignerProof(uint256 _proofDeadline, uint256 _signer) internal returns (bytes memory) { + (, address msgSender, ) = vm.readCallers(); + bytes32 messageHash = keccak256( + abi.encodePacked( + block.chainid, + address(graphTallyCollector), + "authorizeSignerProof", + _proofDeadline, + msgSender + ) + ); + bytes32 proofToDigest = MessageHashUtils.toEthSignedMessageHash(messageHash); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_signer, proofToDigest); + return abi.encodePacked(r, s, v); + } + + /* + * ACTIONS + */ + + function _authorizeSigner(address _signer, uint256 _proofDeadline, bytes memory _proof) internal { + (, address msgSender, ) = vm.readCallers(); + + vm.expectEmit(address(graphTallyCollector)); + emit IAuthorizable.SignerAuthorized(msgSender, _signer); + + graphTallyCollector.authorizeSigner(_signer, _proofDeadline, _proof); + assertTrue(graphTallyCollector.isAuthorized(msgSender, _signer)); + assertEq(graphTallyCollector.getThawEnd(_signer), 0); + } + + function _thawSigner(address _signer) internal { + (, address msgSender, ) = vm.readCallers(); + uint256 expectedThawEndTimestamp = block.timestamp + revokeSignerThawingPeriod; + + vm.expectEmit(address(graphTallyCollector)); + emit IAuthorizable.SignerThawing(msgSender, _signer, expectedThawEndTimestamp); + + graphTallyCollector.thawSigner(_signer); + + assertTrue(graphTallyCollector.isAuthorized(msgSender, _signer)); + assertEq(graphTallyCollector.getThawEnd(_signer), expectedThawEndTimestamp); + } + + function _cancelThawSigner(address _signer) internal { + (, address msgSender, ) = vm.readCallers(); + + vm.expectEmit(address(graphTallyCollector)); + emit IAuthorizable.SignerThawCanceled(msgSender, _signer, graphTallyCollector.getThawEnd(_signer)); + + graphTallyCollector.cancelThawSigner(_signer); + + assertTrue(graphTallyCollector.isAuthorized(msgSender, _signer)); + assertEq(graphTallyCollector.getThawEnd(_signer), 0); + } + + function _revokeAuthorizedSigner(address _signer) internal { + (, address msgSender, ) = vm.readCallers(); + + assertTrue(graphTallyCollector.isAuthorized(msgSender, _signer)); + assertLt(graphTallyCollector.getThawEnd(_signer), block.timestamp); + + vm.expectEmit(address(graphTallyCollector)); + emit IAuthorizable.SignerRevoked(msgSender, _signer); + + graphTallyCollector.revokeAuthorizedSigner(_signer); + + assertFalse(graphTallyCollector.isAuthorized(msgSender, _signer)); + } + + function _collect(IGraphPayments.PaymentTypes _paymentType, bytes memory _data) internal { + __collect(_paymentType, _data, 0); + } + + function _collect(IGraphPayments.PaymentTypes _paymentType, bytes memory _data, uint256 _tokensToCollect) internal { + __collect(_paymentType, _data, _tokensToCollect); + } + + function __collect( + IGraphPayments.PaymentTypes _paymentType, + bytes memory _data, + uint256 _tokensToCollect + ) internal { + (IGraphTallyCollector.SignedRAV memory signedRAV, ) = abi.decode( + _data, + (IGraphTallyCollector.SignedRAV, uint256) + ); + uint256 tokensAlreadyCollected = graphTallyCollector.tokensCollected( + signedRAV.rav.dataService, + signedRAV.rav.collectionId, + signedRAV.rav.serviceProvider, + signedRAV.rav.payer + ); + uint256 tokensToCollect = _tokensToCollect == 0 + ? signedRAV.rav.valueAggregate - tokensAlreadyCollected + : _tokensToCollect; + + vm.expectEmit(address(graphTallyCollector)); + emit IPaymentsCollector.PaymentCollected( + _paymentType, + signedRAV.rav.collectionId, + signedRAV.rav.payer, + signedRAV.rav.serviceProvider, + signedRAV.rav.dataService, + tokensToCollect + ); + vm.expectEmit(address(graphTallyCollector)); + emit IGraphTallyCollector.RAVCollected( + signedRAV.rav.collectionId, + signedRAV.rav.payer, + signedRAV.rav.serviceProvider, + signedRAV.rav.dataService, + signedRAV.rav.timestampNs, + signedRAV.rav.valueAggregate, + signedRAV.rav.metadata, + signedRAV.signature + ); + uint256 tokensCollected = _tokensToCollect == 0 + ? graphTallyCollector.collect(_paymentType, _data) + : graphTallyCollector.collect(_paymentType, _data, _tokensToCollect); + + uint256 tokensCollectedAfter = graphTallyCollector.tokensCollected( + signedRAV.rav.dataService, + signedRAV.rav.collectionId, + signedRAV.rav.serviceProvider, + signedRAV.rav.payer + ); + assertEq(tokensCollected, tokensToCollect); + assertEq( + tokensCollectedAfter, + _tokensToCollect == 0 ? signedRAV.rav.valueAggregate : tokensAlreadyCollected + _tokensToCollect + ); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol new file mode 100644 index 000000000..fbc5bae06 --- /dev/null +++ b/packages/horizon/test/unit/payments/graph-tally-collector/collect/collect.t.sol @@ -0,0 +1,486 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; + +contract GraphTallyCollectTest is GraphTallyTest { + /* + * HELPERS + */ + + struct CollectTestParams { + uint256 tokens; + address allocationId; + address payer; + address indexer; + address collector; + } + + function _getQueryFeeEncodedData( + uint256 _signerPrivateKey, + CollectTestParams memory params + ) private view returns (bytes memory) { + IGraphTallyCollector.ReceiptAggregateVoucher memory rav = _getRAV( + params.allocationId, + params.payer, + params.indexer, + params.collector, + uint128(params.tokens) + ); + bytes32 messageHash = graphTallyCollector.encodeRAV(rav); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_signerPrivateKey, messageHash); + bytes memory signature = abi.encodePacked(r, s, v); + IGraphTallyCollector.SignedRAV memory signedRAV = IGraphTallyCollector.SignedRAV(rav, signature); + return abi.encode(signedRAV); + } + + function _getRAV( + address _allocationId, + address _payer, + address _indexer, + address _dataService, + uint128 _tokens + ) private pure returns (IGraphTallyCollector.ReceiptAggregateVoucher memory rav) { + return + IGraphTallyCollector.ReceiptAggregateVoucher({ + collectionId: bytes32(uint256(uint160(_allocationId))), + payer: _payer, + dataService: _dataService, + serviceProvider: _indexer, + timestampNs: 0, + valueAggregate: _tokens, + metadata: abi.encode("") + }); + } + + /* + * TESTS + */ + + function testGraphTally_Collect( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + _collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_Multiple( + uint256 tokens, + uint8 steps + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + steps = uint8(bound(steps, 1, 100)); + tokens = bound(tokens, steps, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + resetPrank(users.verifier); + uint256 payed = 0; + uint256 tokensPerStep = tokens / steps; + for (uint256 i = 0; i < steps; i++) { + CollectTestParams memory params = CollectTestParams({ + tokens: payed + tokensPerStep, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + _collect(IGraphPayments.PaymentTypes.QueryFee, data); + payed += tokensPerStep; + } + } + + function testGraphTally_Collect_RevertWhen_NoProvision(uint256 tokens) public useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + bytes memory expectedError = abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorUnauthorizedDataService.selector, + users.verifier + ); + vm.expectRevert(expectedError); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_RevertWhen_ProvisionEmpty( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + // thaw tokens from the provision + resetPrank(users.indexer); + staking.thaw(users.indexer, users.verifier, 100); + + tokens = bound(tokens, 1, type(uint128).max); + + resetPrank(users.gateway); + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + bytes memory expectedError = abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorUnauthorizedDataService.selector, + users.verifier + ); + vm.expectRevert(expectedError); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_PreventSignerAttack( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + resetPrank(users.gateway); + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + // The sender authorizes another signer + (address anotherSigner, uint256 anotherSignerPrivateKey) = makeAddrAndKey("anotherSigner"); + { + uint256 proofDeadline = block.timestamp + 1; + bytes memory anotherSignerProof = _getSignerProof(proofDeadline, anotherSignerPrivateKey); + _authorizeSigner(anotherSigner, proofDeadline, anotherSignerProof); + } + + // And crafts a RAV using the new signer as the data service + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: anotherSigner + }); + bytes memory data = _getQueryFeeEncodedData(anotherSignerPrivateKey, params); + + // the call should revert because the service provider has no provision with the "data service" + resetPrank(anotherSigner); + bytes memory expectedError = abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorUnauthorizedDataService.selector, + anotherSigner + ); + vm.expectRevert(expectedError); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_RevertWhen_CallerNotDataService(uint256 tokens) public useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + resetPrank(users.gateway); + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.indexer); + bytes memory expectedError = abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorCallerNotDataService.selector, + users.indexer, + users.verifier + ); + vm.expectRevert(expectedError); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_RevertWhen_PayerMismatch( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + resetPrank(users.gateway); + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + (address anotherPayer, ) = makeAddrAndKey("anotherPayer"); + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: anotherPayer, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + vm.expectRevert(IGraphTallyCollector.GraphTallyCollectorInvalidRAVSigner.selector); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_RevertWhen_InconsistentRAVTokens( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + _collect(IGraphPayments.PaymentTypes.QueryFee, data); + + // Attempt to collect again + vm.expectRevert( + abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorInconsistentRAVTokens.selector, + tokens, + tokens + ) + ); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_RevertWhen_SignerNotAuthorized(uint256 tokens) public useGateway { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + vm.expectRevert(abi.encodeWithSelector(IGraphTallyCollector.GraphTallyCollectorInvalidRAVSigner.selector)); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_ThawingSigner( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + // Start thawing signer + _thawSigner(signer); + skip(revokeSignerThawingPeriod + 1); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + _collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_RevertIf_SignerWasRevoked(uint256 tokens) public useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + // Start thawing signer + _thawSigner(signer); + skip(revokeSignerThawingPeriod + 1); + _revokeAuthorizedSigner(signer); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + vm.expectRevert(abi.encodeWithSelector(IGraphTallyCollector.GraphTallyCollectorInvalidRAVSigner.selector)); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_Collect_ThawingSignerCanceled( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + // Start thawing signer + _thawSigner(signer); + skip(revokeSignerThawingPeriod + 1); + _cancelThawSigner(signer); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + _collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testGraphTally_CollectPartial( + uint256 tokens, + uint256 tokensToCollect + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max); + tokensToCollect = bound(tokensToCollect, 1, tokens); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + _collect(IGraphPayments.PaymentTypes.QueryFee, data, tokensToCollect); + } + + function testGraphTally_CollectPartial_RevertWhen_AmountTooHigh( + uint256 tokens, + uint256 tokensToCollect + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint128).max - 1); + + _depositTokens(address(graphTallyCollector), users.indexer, tokens); + + CollectTestParams memory params = CollectTestParams({ + tokens: tokens, + allocationId: _allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, params); + + resetPrank(users.verifier); + uint256 tokensAlreadyCollected = graphTallyCollector.tokensCollected( + users.verifier, + bytes32(uint256(uint160(_allocationId))), + users.indexer, + users.gateway + ); + tokensToCollect = bound(tokensToCollect, tokens - tokensAlreadyCollected + 1, type(uint128).max); + + vm.expectRevert( + abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorInvalidTokensToCollectAmount.selector, + tokensToCollect, + tokens - tokensAlreadyCollected + ) + ); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data, tokensToCollect); + } + + function testGraphTally_Collect_SeparateAllocationTracking( + uint256 tokens + ) public useIndexer useProvisionDataService(users.verifier, 100, 0, 0) useGateway useSigner { + tokens = bound(tokens, 1, type(uint64).max); + uint8 numAllocations = 10; + + _depositTokens(address(graphTallyCollector), users.indexer, tokens * numAllocations); + // Array with collectTestParams for each allocation + CollectTestParams[] memory collectTestParams = new CollectTestParams[](numAllocations); + + // Collect tokens for each allocation + resetPrank(users.verifier); + for (uint256 i = 0; i < numAllocations; i++) { + address allocationId = makeAddr(string.concat("allocation", vm.toString(i))); + collectTestParams[i] = CollectTestParams({ + tokens: tokens, + allocationId: allocationId, + payer: users.gateway, + indexer: users.indexer, + collector: users.verifier + }); + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, collectTestParams[i]); + _collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + for (uint256 i = 0; i < numAllocations; i++) { + assertEq( + graphTallyCollector.tokensCollected( + collectTestParams[i].collector, + bytes32(uint256(uint160(collectTestParams[i].allocationId))), + collectTestParams[i].indexer, + collectTestParams[i].payer + ), + collectTestParams[i].tokens, + "Incorrect tokens collected for allocation" + ); + + // Try to collect again with the same allocation - should revert + bytes memory data = _getQueryFeeEncodedData(signerPrivateKey, collectTestParams[i]); + vm.expectRevert( + abi.encodeWithSelector( + IGraphTallyCollector.GraphTallyCollectorInconsistentRAVTokens.selector, + tokens, + tokens + ) + ); + graphTallyCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data); + } + + // Increase tokens for allocation 0 by 1000 ether and collect again + resetPrank(users.gateway); + _depositTokens(address(graphTallyCollector), users.indexer, 1000 ether); + + resetPrank(users.verifier); + collectTestParams[0].tokens = tokens + 1000 ether; + bytes memory allocation0Data = _getQueryFeeEncodedData(signerPrivateKey, collectTestParams[0]); + _collect(IGraphPayments.PaymentTypes.QueryFee, allocation0Data); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol new file mode 100644 index 000000000..c2cfc6dcd --- /dev/null +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/authorizeSigner.t.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; + +import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; + +contract GraphTallyAuthorizeSignerTest is GraphTallyTest { + uint256 constant SECP256K1_CURVE_ORDER = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141; + + /* + * TESTS + */ + + function testGraphTally_AuthorizeSigner(uint256 signerKey) public useGateway { + signerKey = bound(signerKey, 1, SECP256K1_CURVE_ORDER - 1); + uint256 proofDeadline = block.timestamp + 1; + bytes memory signerProof = _getSignerProof(proofDeadline, signerKey); + _authorizeSigner(vm.addr(signerKey), proofDeadline, signerProof); + } + + function testGraphTally_AuthorizeSigner_RevertWhen_Invalid() public useGateway { + // Sign proof with payer + uint256 proofDeadline = block.timestamp + 1; + bytes memory signerProof = _getSignerProof(proofDeadline, signerPrivateKey); + + // Attempt to authorize delegator with payer's proof + vm.expectRevert(IAuthorizable.AuthorizableInvalidSignerProof.selector); + graphTallyCollector.authorizeSigner(users.delegator, proofDeadline, signerProof); + } + + function testGraphTally_AuthorizeSigner_RevertWhen_AlreadyAuthroized() public useGateway { + // Authorize signer + uint256 proofDeadline = block.timestamp + 1; + bytes memory signerProof = _getSignerProof(proofDeadline, signerPrivateKey); + _authorizeSigner(signer, proofDeadline, signerProof); + + // Attempt to authorize signer again + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerAlreadyAuthorized.selector, + users.gateway, + signer, + false + ); + vm.expectRevert(expectedError); + graphTallyCollector.authorizeSigner(signer, proofDeadline, signerProof); + } + + function testGraphTally_AuthorizeSigner_RevertWhen_AlreadyAuthroizedAfterRevoking() public useGateway { + // Authorize signer + uint256 proofDeadline = block.timestamp + 1; + bytes memory signerProof = _getSignerProof(proofDeadline, signerPrivateKey); + _authorizeSigner(signer, proofDeadline, signerProof); + // Revoke signer + _thawSigner(signer); + skip(revokeSignerThawingPeriod + 1); + _revokeAuthorizedSigner(signer); + + // Attempt to authorize signer again + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerAlreadyAuthorized.selector, + users.gateway, + signer, + true + ); + vm.expectRevert(expectedError); + graphTallyCollector.authorizeSigner(signer, proofDeadline, signerProof); + } + + function testGraphTally_AuthorizeSigner_RevertWhen_ProofExpired() public useGateway { + // Sign proof with payer + uint256 proofDeadline = block.timestamp - 1; + bytes memory signerProof = _getSignerProof(proofDeadline, signerPrivateKey); + + // Attempt to authorize delegator with expired proof + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableInvalidSignerProofDeadline.selector, + proofDeadline, + block.timestamp + ); + vm.expectRevert(expectedError); + graphTallyCollector.authorizeSigner(users.delegator, proofDeadline, signerProof); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol new file mode 100644 index 000000000..2523f10c6 --- /dev/null +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/cancelThawSigner.t.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; + +import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; + +contract GraphTallyCancelThawSignerTest is GraphTallyTest { + /* + * TESTS + */ + + function testGraphTally_CancelThawSigner() public useGateway useSigner { + _thawSigner(signer); + _cancelThawSigner(signer); + } + + function testGraphTally_CancelThawSigner_RevertWhen_NotAuthorized() public useGateway { + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + users.gateway, + signer + ); + vm.expectRevert(expectedError); + graphTallyCollector.thawSigner(signer); + } + + function testGraphTally_CancelThawSigner_RevertWhen_NotThawing() public useGateway useSigner { + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotThawing.selector, + signer + ); + vm.expectRevert(expectedError); + graphTallyCollector.cancelThawSigner(signer); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol new file mode 100644 index 000000000..eacd8b5bd --- /dev/null +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/revokeSigner.t.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; + +import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; + +contract GraphTallyRevokeAuthorizedSignerTest is GraphTallyTest { + /* + * TESTS + */ + + function testGraphTally_RevokeAuthorizedSigner() public useGateway useSigner { + _thawSigner(signer); + + // Advance time to thaw signer + skip(revokeSignerThawingPeriod + 1); + + _revokeAuthorizedSigner(signer); + } + + function testGraphTally_RevokeAuthorizedSigner_RevertWhen_NotAuthorized() public useGateway { + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + users.gateway, + signer + ); + vm.expectRevert(expectedError); + graphTallyCollector.revokeAuthorizedSigner(signer); + } + + function testGraphTally_RevokeAuthorizedSigner_RevertWhen_NotThawing() public useGateway useSigner { + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotThawing.selector, + signer + ); + vm.expectRevert(expectedError); + graphTallyCollector.revokeAuthorizedSigner(signer); + } + + function testGraphTally_RevokeAuthorizedSigner_RevertWhen_StillThawing() public useGateway useSigner { + _thawSigner(signer); + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerStillThawing.selector, + block.timestamp, + block.timestamp + revokeSignerThawingPeriod + ); + vm.expectRevert(expectedError); + graphTallyCollector.revokeAuthorizedSigner(signer); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol new file mode 100644 index 000000000..a868d44a4 --- /dev/null +++ b/packages/horizon/test/unit/payments/graph-tally-collector/signer/thawSigner.t.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; + +import { GraphTallyTest } from "../GraphTallyCollector.t.sol"; + +contract GraphTallyThawSignerTest is GraphTallyTest { + /* + * TESTS + */ + + function testGraphTally_ThawSigner() public useGateway useSigner { + _thawSigner(signer); + } + + function testGraphTally_ThawSigner_RevertWhen_NotAuthorized() public useGateway { + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + users.gateway, + signer + ); + vm.expectRevert(expectedError); + graphTallyCollector.thawSigner(signer); + } + + function testGraphTally_ThawSigner_RevertWhen_AlreadyRevoked() public useGateway useSigner { + _thawSigner(signer); + skip(revokeSignerThawingPeriod + 1); + _revokeAuthorizedSigner(signer); + + bytes memory expectedError = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + users.gateway, + signer + ); + vm.expectRevert(expectedError); + graphTallyCollector.thawSigner(signer); + } + + function testGraphTally_ThawSigner_AlreadyThawing() public useGateway useSigner { + _thawSigner(signer); + uint256 originalThawEnd = graphTallyCollector.getThawEnd(signer); + skip(1); + + graphTallyCollector.thawSigner(signer); + uint256 currentThawEnd = graphTallyCollector.getThawEnd(signer); + vm.assertEq(originalThawEnd, block.timestamp + revokeSignerThawingPeriod - 1); + vm.assertEq(currentThawEnd, block.timestamp + revokeSignerThawingPeriod); + } +} diff --git a/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol b/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol new file mode 100644 index 000000000..f89a7fafa --- /dev/null +++ b/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol @@ -0,0 +1,2485 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { GraphBaseTest } from "../../GraphBase.t.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IHorizonStakingBase } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingBase.sol"; +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; +import { MathUtils } from "../../../../contracts/libraries/MathUtils.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; +import { ExponentialRebates } from "../../../../contracts/staking/libraries/ExponentialRebates.sol"; + +abstract contract HorizonStakingSharedTest is GraphBaseTest { + using LinkedList for ILinkedList.List; + using PPMMath for uint256; + + event Transfer(address indexed from, address indexed to, uint tokens); + + address internal _allocationId = makeAddr("allocationId"); + bytes32 internal constant _subgraphDeploymentID = keccak256("subgraphDeploymentID"); + uint256 internal constant MAX_ALLOCATION_EPOCHS = 28; + + uint32 internal alphaNumerator = 100; + uint32 internal alphaDenominator = 100; + uint32 internal lambdaNumerator = 60; + uint32 internal lambdaDenominator = 100; + + /* + * MODIFIERS + */ + + modifier useIndexer() { + vm.startPrank(users.indexer); + _; + vm.stopPrank(); + } + + modifier useOperator() { + vm.startPrank(users.indexer); + _setOperator(subgraphDataServiceAddress, users.operator, true); + vm.startPrank(users.operator); + _; + vm.stopPrank(); + } + + modifier useStake(uint256 amount) { + vm.assume(amount > 0); + _stake(amount); + _; + } + + modifier useProvision(uint256 tokens, uint32 maxVerifierCut, uint64 thawingPeriod) virtual { + _useProvision(subgraphDataServiceAddress, tokens, maxVerifierCut, thawingPeriod); + _; + } + + modifier useProvisionDataService(address dataService, uint256 tokens, uint32 maxVerifierCut, uint64 thawingPeriod) { + _useProvision(dataService, tokens, maxVerifierCut, thawingPeriod); + _; + } + + modifier useDelegationFeeCut(IGraphPayments.PaymentTypes paymentType, uint256 cut) { + _setDelegationFeeCut(users.indexer, subgraphDataServiceAddress, paymentType, cut); + _; + } + + function _useProvision(address dataService, uint256 tokens, uint32 maxVerifierCut, uint64 thawingPeriod) internal { + // use assume instead of bound to avoid the bounding falling out of scope + vm.assume(tokens > 0); + vm.assume(tokens <= MAX_STAKING_TOKENS); + vm.assume(maxVerifierCut <= MAX_PPM); + vm.assume(thawingPeriod <= MAX_THAWING_PERIOD); + + _createProvision(users.indexer, dataService, tokens, maxVerifierCut, thawingPeriod); + } + + modifier useAllocation(uint256 tokens) { + vm.assume(tokens <= MAX_STAKING_TOKENS); + _createAllocation(users.indexer, _allocationId, _subgraphDeploymentID, tokens); + _; + } + + modifier useRebateParameters() { + _setStorage_RebateParameters(alphaNumerator, alphaDenominator, lambdaNumerator, lambdaDenominator); + _; + } + + /* + * HELPERS: these are shortcuts to perform common actions that often involve multiple contract calls + */ + function _createProvision( + address serviceProvider, + address verifier, + uint256 tokens, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) internal { + _stakeTo(serviceProvider, tokens); + _provision(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod); + } + + // This allows setting up contract state with legacy allocations + function _createAllocation( + address serviceProvider, + address allocationId, + bytes32 subgraphDeploymentID, + uint256 tokens + ) internal { + _setStorage_MaxAllocationEpochs(MAX_ALLOCATION_EPOCHS); + + IHorizonStakingExtension.Allocation memory _allocation = IHorizonStakingExtension.Allocation({ + indexer: serviceProvider, + subgraphDeploymentID: subgraphDeploymentID, + tokens: tokens, + createdAtEpoch: block.timestamp, + closedAtEpoch: 0, + collectedFees: 0, + __DEPRECATED_effectiveAllocation: 0, + accRewardsPerAllocatedToken: 0, + distributedRebates: 0 + }); + _setStorage_allocation(_allocation, allocationId, tokens); + + // delegation pool initialized + _setStorage_DelegationPool(serviceProvider, 0, uint32(PPMMath.MAX_PPM), uint32(PPMMath.MAX_PPM)); + + token.transfer(address(staking), tokens); + } + + /* + * ACTIONS: these are individual contract calls wrapped in assertion blocks to ensure they work as expected + */ + function _stake(uint256 tokens) internal { + (, address msgSender, ) = vm.readCallers(); + _stakeTo(msgSender, tokens); + } + + function _stakeTo(address serviceProvider, uint256 tokens) internal { + (, address msgSender, ) = vm.readCallers(); + + // before + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + uint256 beforeSenderBalance = token.balanceOf(msgSender); + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + + // stakeTo + token.approve(address(staking), tokens); + vm.expectEmit(); + emit IHorizonStakingBase.HorizonStakeDeposited(serviceProvider, tokens); + staking.stakeTo(serviceProvider, tokens); + + // after + uint256 afterStakingBalance = token.balanceOf(address(staking)); + uint256 afterSenderBalance = token.balanceOf(msgSender); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + + // assert + assertEq(afterStakingBalance, beforeStakingBalance + tokens); + assertEq(afterSenderBalance, beforeSenderBalance - tokens); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked + tokens); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + } + + function _stakeToProvision(address serviceProvider, address verifier, uint256 tokens) internal { + (, address msgSender, ) = vm.readCallers(); + + // before + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + uint256 beforeSenderBalance = token.balanceOf(msgSender); + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + Provision memory beforeProvision = staking.getProvision(serviceProvider, verifier); + + // stakeTo + token.approve(address(staking), tokens); + vm.expectEmit(); + emit IHorizonStakingBase.HorizonStakeDeposited(serviceProvider, tokens); + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionIncreased(serviceProvider, verifier, tokens); + staking.stakeToProvision(serviceProvider, verifier, tokens); + + // after + uint256 afterStakingBalance = token.balanceOf(address(staking)); + uint256 afterSenderBalance = token.balanceOf(msgSender); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + + // assert - stakeTo + assertEq(afterStakingBalance, beforeStakingBalance + tokens); + assertEq(afterSenderBalance, beforeSenderBalance - tokens); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked + tokens); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned + tokens); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + + // assert - addToProvision + assertEq(afterProvision.tokens, beforeProvision.tokens + tokens); + assertEq(afterProvision.tokensThawing, beforeProvision.tokensThawing); + assertEq(afterProvision.sharesThawing, beforeProvision.sharesThawing); + assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCut); + assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriod); + assertEq(afterProvision.createdAt, beforeProvision.createdAt); + assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt); + assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending); + assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked + tokens); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned + tokens); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + } + + function _unstake(uint256 _tokens) internal { + (, address msgSender, ) = vm.readCallers(); + + uint256 deprecatedThawingPeriod = staking.__DEPRECATED_getThawingPeriod(); + + // before + uint256 beforeSenderBalance = token.balanceOf(msgSender); + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(msgSender); + + bool withdrawCalled = beforeServiceProvider.__DEPRECATED_tokensLocked != 0 && + block.number >= beforeServiceProvider.__DEPRECATED_tokensLockedUntil; + + if (deprecatedThawingPeriod != 0 && beforeServiceProvider.__DEPRECATED_tokensLocked > 0) { + deprecatedThawingPeriod = MathUtils.weightedAverageRoundingUp( + MathUtils.diffOrZero( + withdrawCalled ? 0 : beforeServiceProvider.__DEPRECATED_tokensLockedUntil, + block.number + ), + withdrawCalled ? 0 : beforeServiceProvider.__DEPRECATED_tokensLocked, + deprecatedThawingPeriod, + _tokens + ); + } + + // unstake + if (deprecatedThawingPeriod == 0) { + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.HorizonStakeWithdrawn(msgSender, _tokens); + } else { + if (withdrawCalled) { + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.HorizonStakeWithdrawn( + msgSender, + beforeServiceProvider.__DEPRECATED_tokensLocked + ); + } + + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.HorizonStakeLocked( + msgSender, + withdrawCalled ? _tokens : beforeServiceProvider.__DEPRECATED_tokensLocked + _tokens, + block.number + deprecatedThawingPeriod + ); + } + staking.unstake(_tokens); + + // after + uint256 afterSenderBalance = token.balanceOf(msgSender); + uint256 afterStakingBalance = token.balanceOf(address(staking)); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(msgSender); + + // assert + if (deprecatedThawingPeriod == 0) { + assertEq(afterSenderBalance, _tokens + beforeSenderBalance); + assertEq(afterStakingBalance, beforeStakingBalance - _tokens); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked - _tokens); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned); + assertEq( + afterServiceProvider.__DEPRECATED_tokensAllocated, + beforeServiceProvider.__DEPRECATED_tokensAllocated + ); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + } else { + assertEq( + afterServiceProvider.tokensStaked, + withdrawCalled + ? beforeServiceProvider.tokensStaked - beforeServiceProvider.__DEPRECATED_tokensLocked + : beforeServiceProvider.tokensStaked + ); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLocked, + _tokens + (withdrawCalled ? 0 : beforeServiceProvider.__DEPRECATED_tokensLocked) + ); + assertEq(afterServiceProvider.__DEPRECATED_tokensLockedUntil, block.number + deprecatedThawingPeriod); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned); + assertEq( + afterServiceProvider.__DEPRECATED_tokensAllocated, + beforeServiceProvider.__DEPRECATED_tokensAllocated + ); + uint256 tokensTransferred = (withdrawCalled ? beforeServiceProvider.__DEPRECATED_tokensLocked : 0); + assertEq(afterSenderBalance, beforeSenderBalance + tokensTransferred); + assertEq(afterStakingBalance, beforeStakingBalance - tokensTransferred); + } + } + + function _withdraw() internal { + (, address msgSender, ) = vm.readCallers(); + + // before + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(msgSender); + uint256 beforeSenderBalance = token.balanceOf(msgSender); + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + + // withdraw + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.HorizonStakeWithdrawn(msgSender, beforeServiceProvider.__DEPRECATED_tokensLocked); + staking.withdraw(); + + // after + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(msgSender); + uint256 afterSenderBalance = token.balanceOf(msgSender); + uint256 afterStakingBalance = token.balanceOf(address(staking)); + + // assert + assertEq(afterSenderBalance - beforeSenderBalance, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq(beforeStakingBalance - afterStakingBalance, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.tokensStaked, + beforeServiceProvider.tokensStaked - beforeServiceProvider.__DEPRECATED_tokensLocked + ); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, 0); + assertEq(afterServiceProvider.__DEPRECATED_tokensLockedUntil, 0); + } + + function _provision( + address serviceProvider, + address verifier, + uint256 tokens, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) internal { + __provision(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod, false); + } + + function _provisionLocked( + address serviceProvider, + address verifier, + uint256 tokens, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) internal { + __provision(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod, true); + } + + function __provision( + address serviceProvider, + address verifier, + uint256 tokens, + uint32 maxVerifierCut, + uint64 thawingPeriod, + bool locked + ) private { + // before + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + + // provision + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionCreated(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod); + if (locked) { + staking.provisionLocked(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod); + } else { + staking.provision(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod); + } + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + + // assert + assertEq(afterProvision.tokens, tokens); + assertEq(afterProvision.tokensThawing, 0); + assertEq(afterProvision.sharesThawing, 0); + assertEq(afterProvision.maxVerifierCut, maxVerifierCut); + assertEq(afterProvision.thawingPeriod, thawingPeriod); + assertEq(afterProvision.createdAt, uint64(block.timestamp)); + assertEq(afterProvision.maxVerifierCutPending, maxVerifierCut); + assertEq(afterProvision.thawingPeriodPending, thawingPeriod); + assertEq(afterProvision.lastParametersStagedAt, 0); + assertEq(afterProvision.thawingNonce, 0); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked); + assertEq(afterServiceProvider.tokensProvisioned, tokens + beforeServiceProvider.tokensProvisioned); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + } + + function _addToProvision(address serviceProvider, address verifier, uint256 tokens) internal { + // before + Provision memory beforeProvision = staking.getProvision(serviceProvider, verifier); + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + + // addToProvision + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionIncreased(serviceProvider, verifier, tokens); + staking.addToProvision(serviceProvider, verifier, tokens); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + + // assert + assertEq(afterProvision.tokens, beforeProvision.tokens + tokens); + assertEq(afterProvision.tokensThawing, beforeProvision.tokensThawing); + assertEq(afterProvision.sharesThawing, beforeProvision.sharesThawing); + assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCut); + assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriod); + assertEq(afterProvision.createdAt, beforeProvision.createdAt); + assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt); + assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending); + assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked); + assertEq(afterServiceProvider.tokensProvisioned, beforeServiceProvider.tokensProvisioned + tokens); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + } + + function _thaw(address serviceProvider, address verifier, uint256 tokens) internal returns (bytes32) { + // before + Provision memory beforeProvision = staking.getProvision(serviceProvider, verifier); + ILinkedList.List memory beforeThawRequestList = staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider + ); + + bytes32 expectedThawRequestId = keccak256( + abi.encodePacked(users.indexer, verifier, users.indexer, beforeThawRequestList.nonce) + ); + uint256 thawingShares = beforeProvision.tokensThawing == 0 + ? tokens + : (beforeProvision.sharesThawing * tokens) / beforeProvision.tokensThawing; + + // thaw + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestCreated( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider, + thawingShares, + uint64(block.timestamp + beforeProvision.thawingPeriod), + expectedThawRequestId, + beforeProvision.thawingNonce + ); + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ProvisionThawed(serviceProvider, verifier, tokens); + bytes32 thawRequestId = staking.thaw(serviceProvider, verifier, tokens); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + ThawRequest memory afterThawRequest = staking.getThawRequest( + IHorizonStakingTypes.ThawRequestType.Provision, + thawRequestId + ); + ILinkedList.List memory afterThawRequestList = _getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider + ); + ThawRequest memory afterPreviousTailThawRequest = staking.getThawRequest( + IHorizonStakingTypes.ThawRequestType.Provision, + beforeThawRequestList.tail + ); + + // assert + assertEq(afterProvision.tokens, beforeProvision.tokens); + assertEq(afterProvision.tokensThawing, beforeProvision.tokensThawing + tokens); + assertEq( + afterProvision.sharesThawing, + beforeProvision.tokensThawing == 0 ? thawingShares : beforeProvision.sharesThawing + thawingShares + ); + assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCut); + assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriod); + assertEq(afterProvision.createdAt, beforeProvision.createdAt); + assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending); + assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt); + assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce); + assertEq(thawRequestId, expectedThawRequestId); + assertEq(afterThawRequest.shares, thawingShares); + assertEq(afterThawRequest.thawingUntil, block.timestamp + beforeProvision.thawingPeriod); + assertEq(afterThawRequest.nextRequest, bytes32(0)); + assertEq( + afterThawRequestList.head, + beforeThawRequestList.count == 0 ? thawRequestId : beforeThawRequestList.head + ); + assertEq(afterThawRequestList.tail, thawRequestId); + assertEq(afterThawRequestList.count, beforeThawRequestList.count + 1); + assertEq(afterThawRequestList.nonce, beforeThawRequestList.nonce + 1); + if (beforeThawRequestList.count != 0) { + assertEq(afterPreviousTailThawRequest.nextRequest, thawRequestId); + } + + return thawRequestId; + } + + function _deprovision(address serviceProvider, address verifier, uint256 nThawRequests) internal { + // before + Provision memory beforeProvision = staking.getProvision(serviceProvider, verifier); + ServiceProviderInternal memory beforeServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + ILinkedList.List memory beforeThawRequestList = staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider + ); + + Params_CalcThawRequestData memory params = Params_CalcThawRequestData({ + thawRequestType: IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider: serviceProvider, + verifier: verifier, + owner: serviceProvider, + iterations: nThawRequests, + delegation: false + }); + CalcValues_ThawRequestData memory calcValues = calcThawRequestData(params); + + // deprovision + for (uint i = 0; i < calcValues.thawRequestsFulfilledList.length; i++) { + ThawRequest memory thawRequest = calcValues.thawRequestsFulfilledList[i]; + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestFulfilled( + params.thawRequestType, + calcValues.thawRequestsFulfilledListIds[i], + calcValues.thawRequestsFulfilledListTokens[i], + thawRequest.shares, + thawRequest.thawingUntil, + beforeProvision.thawingNonce == thawRequest.thawingNonce + ); + } + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestsFulfilled( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider, + calcValues.thawRequestsFulfilledList.length, + calcValues.tokensThawed + ); + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.TokensDeprovisioned(serviceProvider, verifier, calcValues.tokensThawed); + staking.deprovision(serviceProvider, verifier, nThawRequests); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + ILinkedList.List memory afterThawRequestList = staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider + ); + + // assert + assertEq(afterProvision.tokens, beforeProvision.tokens - calcValues.tokensThawed); + assertEq(afterProvision.tokensThawing, calcValues.tokensThawing); + assertEq(afterProvision.sharesThawing, calcValues.sharesThawing); + assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCut); + assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriod); + assertEq(afterProvision.createdAt, beforeProvision.createdAt); + assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending); + assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt); + assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce); + assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked); + assertEq( + afterServiceProvider.tokensProvisioned, + beforeServiceProvider.tokensProvisioned - calcValues.tokensThawed + ); + assertEq(afterServiceProvider.__DEPRECATED_tokensAllocated, beforeServiceProvider.__DEPRECATED_tokensAllocated); + assertEq(afterServiceProvider.__DEPRECATED_tokensLocked, beforeServiceProvider.__DEPRECATED_tokensLocked); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeServiceProvider.__DEPRECATED_tokensLockedUntil + ); + for (uint i = 0; i < calcValues.thawRequestsFulfilledListIds.length; i++) { + ThawRequest memory thawRequest = staking.getThawRequest( + IHorizonStakingTypes.ThawRequestType.Provision, + calcValues.thawRequestsFulfilledListIds[i] + ); + assertEq(thawRequest.shares, 0); + assertEq(thawRequest.thawingUntil, 0); + assertEq(thawRequest.nextRequest, bytes32(0)); + } + if (calcValues.thawRequestsFulfilledList.length == 0) { + assertEq(afterThawRequestList.head, beforeThawRequestList.head); + } else { + assertEq( + afterThawRequestList.head, + calcValues.thawRequestsFulfilledList.length == beforeThawRequestList.count + ? bytes32(0) + : calcValues.thawRequestsFulfilledList[calcValues.thawRequestsFulfilledList.length - 1].nextRequest + ); + } + assertEq( + afterThawRequestList.tail, + calcValues.thawRequestsFulfilledList.length == beforeThawRequestList.count + ? bytes32(0) + : beforeThawRequestList.tail + ); + assertEq(afterThawRequestList.count, beforeThawRequestList.count - calcValues.thawRequestsFulfilledList.length); + assertEq(afterThawRequestList.nonce, beforeThawRequestList.nonce); + } + + struct BeforeValues_Reprovision { + Provision provision; + Provision provisionNewVerifier; + ServiceProviderInternal serviceProvider; + ILinkedList.List thawRequestList; + } + + function _reprovision( + address serviceProvider, + address verifier, + address newVerifier, + uint256 nThawRequests + ) internal { + // before + BeforeValues_Reprovision memory beforeValues = BeforeValues_Reprovision({ + provision: staking.getProvision(serviceProvider, verifier), + provisionNewVerifier: staking.getProvision(serviceProvider, newVerifier), + serviceProvider: _getStorage_ServiceProviderInternal(serviceProvider), + thawRequestList: staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider + ) + }); + + // calc + Params_CalcThawRequestData memory params = Params_CalcThawRequestData({ + thawRequestType: IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider: serviceProvider, + verifier: verifier, + owner: serviceProvider, + iterations: nThawRequests, + delegation: false + }); + CalcValues_ThawRequestData memory calcValues = calcThawRequestData(params); + + // reprovision + for (uint i = 0; i < calcValues.thawRequestsFulfilledList.length; i++) { + ThawRequest memory thawRequest = calcValues.thawRequestsFulfilledList[i]; + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestFulfilled( + params.thawRequestType, + calcValues.thawRequestsFulfilledListIds[i], + calcValues.thawRequestsFulfilledListTokens[i], + thawRequest.shares, + thawRequest.thawingUntil, + beforeValues.provision.thawingNonce == thawRequest.thawingNonce + ); + } + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestsFulfilled( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider, + calcValues.thawRequestsFulfilledList.length, + calcValues.tokensThawed + ); + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.TokensDeprovisioned(serviceProvider, verifier, calcValues.tokensThawed); + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionIncreased(serviceProvider, newVerifier, calcValues.tokensThawed); + staking.reprovision(serviceProvider, verifier, newVerifier, nThawRequests); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + Provision memory afterProvisionNewVerifier = staking.getProvision(serviceProvider, newVerifier); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + ILinkedList.List memory afterThawRequestList = staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Provision, + serviceProvider, + verifier, + serviceProvider + ); + + // assert: provision old verifier + assertEq(afterProvision.tokens, beforeValues.provision.tokens - calcValues.tokensThawed); + assertEq(afterProvision.tokensThawing, calcValues.tokensThawing); + assertEq(afterProvision.sharesThawing, calcValues.sharesThawing); + assertEq(afterProvision.maxVerifierCut, beforeValues.provision.maxVerifierCut); + assertEq(afterProvision.thawingPeriod, beforeValues.provision.thawingPeriod); + assertEq(afterProvision.createdAt, beforeValues.provision.createdAt); + assertEq(afterProvision.maxVerifierCutPending, beforeValues.provision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriodPending, beforeValues.provision.thawingPeriodPending); + assertEq(afterProvision.lastParametersStagedAt, beforeValues.provision.lastParametersStagedAt); + assertEq(afterProvision.thawingNonce, beforeValues.provision.thawingNonce); + + // assert: provision new verifier + assertEq(afterProvisionNewVerifier.tokens, beforeValues.provisionNewVerifier.tokens + calcValues.tokensThawed); + assertEq(afterProvisionNewVerifier.tokensThawing, beforeValues.provisionNewVerifier.tokensThawing); + assertEq(afterProvisionNewVerifier.sharesThawing, beforeValues.provisionNewVerifier.sharesThawing); + assertEq(afterProvisionNewVerifier.maxVerifierCut, beforeValues.provisionNewVerifier.maxVerifierCut); + assertEq(afterProvisionNewVerifier.thawingPeriod, beforeValues.provisionNewVerifier.thawingPeriod); + assertEq(afterProvisionNewVerifier.createdAt, beforeValues.provisionNewVerifier.createdAt); + assertEq( + afterProvisionNewVerifier.maxVerifierCutPending, + beforeValues.provisionNewVerifier.maxVerifierCutPending + ); + assertEq( + afterProvisionNewVerifier.thawingPeriodPending, + beforeValues.provisionNewVerifier.thawingPeriodPending + ); + assertEq(afterProvisionNewVerifier.thawingNonce, beforeValues.provisionNewVerifier.thawingNonce); + + // assert: service provider + assertEq(afterServiceProvider.tokensStaked, beforeValues.serviceProvider.tokensStaked); + assertEq( + afterServiceProvider.tokensProvisioned, + beforeValues.serviceProvider.tokensProvisioned + calcValues.tokensThawed - calcValues.tokensThawed + ); + assertEq( + afterServiceProvider.__DEPRECATED_tokensAllocated, + beforeValues.serviceProvider.__DEPRECATED_tokensAllocated + ); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLocked, + beforeValues.serviceProvider.__DEPRECATED_tokensLocked + ); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeValues.serviceProvider.__DEPRECATED_tokensLockedUntil + ); + + // assert: thaw request list old verifier + for (uint i = 0; i < calcValues.thawRequestsFulfilledListIds.length; i++) { + ThawRequest memory thawRequest = staking.getThawRequest( + IHorizonStakingTypes.ThawRequestType.Provision, + calcValues.thawRequestsFulfilledListIds[i] + ); + assertEq(thawRequest.shares, 0); + assertEq(thawRequest.thawingUntil, 0); + assertEq(thawRequest.nextRequest, bytes32(0)); + } + if (calcValues.thawRequestsFulfilledList.length == 0) { + assertEq(afterThawRequestList.head, beforeValues.thawRequestList.head); + } else { + assertEq( + afterThawRequestList.head, + calcValues.thawRequestsFulfilledList.length == beforeValues.thawRequestList.count + ? bytes32(0) + : calcValues.thawRequestsFulfilledList[calcValues.thawRequestsFulfilledList.length - 1].nextRequest + ); + } + assertEq( + afterThawRequestList.tail, + calcValues.thawRequestsFulfilledList.length == beforeValues.thawRequestList.count + ? bytes32(0) + : beforeValues.thawRequestList.tail + ); + assertEq( + afterThawRequestList.count, + beforeValues.thawRequestList.count - calcValues.thawRequestsFulfilledList.length + ); + assertEq(afterThawRequestList.nonce, beforeValues.thawRequestList.nonce); + } + + function _setProvisionParameters( + address serviceProvider, + address verifier, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) internal { + // before + Provision memory beforeProvision = staking.getProvision(serviceProvider, verifier); + + // setProvisionParameters + bool paramsChanged = beforeProvision.maxVerifierCut != maxVerifierCut || + beforeProvision.thawingPeriod != thawingPeriod; + if (paramsChanged) { + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionParametersStaged( + serviceProvider, + verifier, + maxVerifierCut, + thawingPeriod + ); + } + staking.setProvisionParameters(serviceProvider, verifier, maxVerifierCut, thawingPeriod); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + + // assert + assertEq(afterProvision.tokens, beforeProvision.tokens); + assertEq(afterProvision.tokensThawing, beforeProvision.tokensThawing); + assertEq(afterProvision.sharesThawing, beforeProvision.sharesThawing); + assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCut); + assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriod); + assertEq(afterProvision.createdAt, beforeProvision.createdAt); + assertEq(afterProvision.maxVerifierCutPending, maxVerifierCut); + assertEq(afterProvision.thawingPeriodPending, thawingPeriod); + assertEq( + afterProvision.lastParametersStagedAt, + paramsChanged ? block.timestamp : beforeProvision.lastParametersStagedAt + ); + assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce); + } + + function _acceptProvisionParameters(address serviceProvider) internal { + (, address msgSender, ) = vm.readCallers(); + + // before + Provision memory beforeProvision = staking.getProvision(serviceProvider, msgSender); + + // acceptProvisionParameters + if ( + beforeProvision.maxVerifierCutPending != beforeProvision.maxVerifierCut || + beforeProvision.thawingPeriodPending != beforeProvision.thawingPeriod + ) { + vm.expectEmit(); + emit IHorizonStakingMain.ProvisionParametersSet( + serviceProvider, + msgSender, + beforeProvision.maxVerifierCutPending, + beforeProvision.thawingPeriodPending + ); + } + staking.acceptProvisionParameters(serviceProvider); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, msgSender); + + // assert + assertEq(afterProvision.tokens, beforeProvision.tokens); + assertEq(afterProvision.tokensThawing, beforeProvision.tokensThawing); + assertEq(afterProvision.sharesThawing, beforeProvision.sharesThawing); + assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCutPending); + assertEq(afterProvision.maxVerifierCut, afterProvision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriodPending); + assertEq(afterProvision.thawingPeriod, afterProvision.thawingPeriodPending); + assertEq(afterProvision.createdAt, beforeProvision.createdAt); + assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt); + assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce); + } + + function _setOperator(address verifier, address operator, bool allow) internal { + __setOperator(verifier, operator, allow, false); + } + + function _setOperatorLocked(address verifier, address operator, bool allow) internal { + __setOperator(verifier, operator, allow, true); + } + + function __setOperator(address verifier, address operator, bool allow, bool locked) private { + (, address msgSender, ) = vm.readCallers(); + + // staking contract knows the address of the legacy subgraph service + // but we cannot read it as it's an immutable, we have to use the global var :/ + bool legacy = verifier == subgraphDataServiceLegacyAddress; + + // before + bool beforeOperatorAllowed = _getStorage_OperatorAuth(msgSender, verifier, operator, legacy); + bool beforeOperatorAllowedGetter = staking.isAuthorized(msgSender, verifier, operator); + assertEq(beforeOperatorAllowed, beforeOperatorAllowedGetter); + + // setOperator + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.OperatorSet(msgSender, verifier, operator, allow); + if (locked) { + staking.setOperatorLocked(verifier, operator, allow); + } else { + staking.setOperator(verifier, operator, allow); + } + + // after + bool afterOperatorAllowed = _getStorage_OperatorAuth(msgSender, verifier, operator, legacy); + bool afterOperatorAllowedGetter = staking.isAuthorized(msgSender, verifier, operator); + assertEq(afterOperatorAllowed, afterOperatorAllowedGetter, "afterOperatorAllowedGetter FAIL"); + + // assert + assertEq(afterOperatorAllowed, allow); + } + + function _delegate(address serviceProvider, address verifier, uint256 tokens, uint256 minSharesOut) internal { + __delegate(serviceProvider, verifier, tokens, minSharesOut, false); + } + + function _delegate(address serviceProvider, uint256 tokens) internal { + __delegate(serviceProvider, subgraphDataServiceLegacyAddress, tokens, 0, true); + } + + function __delegate( + address serviceProvider, + address verifier, + uint256 tokens, + uint256 minSharesOut, + bool legacy + ) private { + (, address delegator, ) = vm.readCallers(); + + // before + DelegationPoolInternalTest memory beforePool = _getStorage_DelegationPoolInternal( + serviceProvider, + verifier, + legacy + ); + DelegationInternal memory beforeDelegation = _getStorage_Delegation( + serviceProvider, + verifier, + delegator, + legacy + ); + uint256 beforeDelegatorBalance = token.balanceOf(delegator); + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + + uint256 calcShares = (beforePool.tokens == 0 || beforePool.tokens == beforePool.tokensThawing) + ? tokens + : ((tokens * beforePool.shares) / (beforePool.tokens - beforePool.tokensThawing)); + + // delegate + token.approve(address(staking), tokens); + vm.expectEmit(); + emit IHorizonStakingMain.TokensDelegated(serviceProvider, verifier, delegator, tokens, calcShares); + if (legacy) { + staking.delegate(serviceProvider, tokens); + } else { + staking.delegate(serviceProvider, verifier, tokens, minSharesOut); + } + + // after + DelegationPoolInternalTest memory afterPool = _getStorage_DelegationPoolInternal( + serviceProvider, + verifier, + legacy + ); + DelegationInternal memory afterDelegation = _getStorage_Delegation( + serviceProvider, + verifier, + delegator, + legacy + ); + uint256 afterDelegatorBalance = token.balanceOf(delegator); + uint256 afterStakingBalance = token.balanceOf(address(staking)); + + uint256 deltaShares = afterDelegation.shares - beforeDelegation.shares; + + // assertions + assertEq(beforePool.tokens + tokens, afterPool.tokens, "afterPool.tokens FAIL"); + assertEq(beforePool.shares + calcShares, afterPool.shares, "afterPool.shares FAIL"); + assertEq(beforePool.tokensThawing, afterPool.tokensThawing); + assertEq(beforePool.sharesThawing, afterPool.sharesThawing); + assertEq(beforePool.thawingNonce, afterPool.thawingNonce); + assertEq(beforeDelegation.shares + calcShares, afterDelegation.shares); + assertEq(beforeDelegation.__DEPRECATED_tokensLocked, afterDelegation.__DEPRECATED_tokensLocked); + assertEq(beforeDelegation.__DEPRECATED_tokensLockedUntil, afterDelegation.__DEPRECATED_tokensLockedUntil); + assertGe(deltaShares, minSharesOut); + assertEq(calcShares, deltaShares); + assertEq(beforeDelegatorBalance - tokens, afterDelegatorBalance); + assertEq(beforeStakingBalance + tokens, afterStakingBalance); + } + + function _undelegate(address serviceProvider, address verifier, uint256 shares) internal { + (, address caller, ) = vm.readCallers(); + __undelegate(IHorizonStakingTypes.ThawRequestType.Delegation, serviceProvider, verifier, shares, false, caller); + } + + function _undelegate(address serviceProvider, uint256 shares) internal { + (, address caller, ) = vm.readCallers(); + __undelegate( + IHorizonStakingTypes.ThawRequestType.Delegation, + serviceProvider, + subgraphDataServiceLegacyAddress, + shares, + true, + caller + ); + } + + struct BeforeValues_Undelegate { + DelegationPoolInternalTest pool; + DelegationInternal delegation; + ILinkedList.List thawRequestList; + uint256 delegatedTokens; + } + struct CalcValues_Undelegate { + uint256 tokens; + uint256 thawingShares; + uint64 thawingUntil; + bytes32 thawRequestId; + } + + function __undelegate( + IHorizonStakingTypes.ThawRequestType thawRequestType, + address serviceProvider, + address verifier, + uint256 shares, + bool legacy, + address beneficiary + ) private { + (, address delegator, ) = vm.readCallers(); + + // before + BeforeValues_Undelegate memory beforeValues; + beforeValues.pool = _getStorage_DelegationPoolInternal(serviceProvider, verifier, legacy); + beforeValues.delegation = _getStorage_Delegation(serviceProvider, verifier, delegator, legacy); + beforeValues.thawRequestList = staking.getThawRequestList( + thawRequestType, + serviceProvider, + verifier, + delegator + ); + beforeValues.delegatedTokens = staking.getDelegatedTokensAvailable(serviceProvider, verifier); + + // calc + CalcValues_Undelegate memory calcValues; + calcValues.tokens = + ((beforeValues.pool.tokens - beforeValues.pool.tokensThawing) * shares) / beforeValues.pool.shares; + calcValues.thawingShares = beforeValues.pool.tokensThawing == 0 + ? calcValues.tokens + : (beforeValues.pool.sharesThawing * calcValues.tokens) / beforeValues.pool.tokensThawing; + calcValues.thawingUntil = + staking.getProvision(serviceProvider, verifier).thawingPeriod + uint64(block.timestamp); + calcValues.thawRequestId = keccak256( + abi.encodePacked(serviceProvider, verifier, beneficiary, beforeValues.thawRequestList.nonce) + ); + + // undelegate + vm.expectEmit(); + emit IHorizonStakingMain.ThawRequestCreated( + thawRequestType, + serviceProvider, + verifier, + beneficiary, + calcValues.thawingShares, + calcValues.thawingUntil, + calcValues.thawRequestId, + beforeValues.pool.thawingNonce + ); + vm.expectEmit(); + emit IHorizonStakingMain.TokensUndelegated(serviceProvider, verifier, delegator, calcValues.tokens, shares); + if (legacy) { + staking.undelegate(serviceProvider, shares); + } else if (thawRequestType == IHorizonStakingTypes.ThawRequestType.Delegation) { + staking.undelegate(serviceProvider, verifier, shares); + } else { + revert("Invalid thaw request type"); + } + + // after + DelegationPoolInternalTest memory afterPool = _getStorage_DelegationPoolInternal( + users.indexer, + verifier, + legacy + ); + DelegationInternal memory afterDelegation = _getStorage_Delegation( + serviceProvider, + verifier, + beneficiary, + legacy + ); + ILinkedList.List memory afterThawRequestList = staking.getThawRequestList( + thawRequestType, + serviceProvider, + verifier, + beneficiary + ); + ThawRequest memory afterThawRequest = staking.getThawRequest(thawRequestType, calcValues.thawRequestId); + uint256 afterDelegatedTokens = staking.getDelegatedTokensAvailable(serviceProvider, verifier); + + // assertions + assertEq(beforeValues.pool.shares, afterPool.shares + shares); + assertEq(beforeValues.pool.tokens, afterPool.tokens); + assertEq(beforeValues.pool.tokensThawing + calcValues.tokens, afterPool.tokensThawing); + assertEq( + beforeValues.pool.tokensThawing == 0 + ? calcValues.thawingShares + : beforeValues.pool.sharesThawing + calcValues.thawingShares, + afterPool.sharesThawing + ); + assertEq(beforeValues.pool.thawingNonce, afterPool.thawingNonce); + assertEq(beforeValues.delegation.shares - shares, afterDelegation.shares); + assertEq(afterThawRequest.shares, calcValues.thawingShares); + assertEq(afterThawRequest.thawingUntil, calcValues.thawingUntil); + assertEq(afterThawRequest.nextRequest, bytes32(0)); + assertEq(calcValues.thawRequestId, afterThawRequestList.tail); + assertEq(beforeValues.thawRequestList.nonce + 1, afterThawRequestList.nonce); + assertEq(beforeValues.thawRequestList.count + 1, afterThawRequestList.count); + assertEq(afterDelegatedTokens + calcValues.tokens, beforeValues.delegatedTokens); + } + + function _withdrawDelegated(address serviceProvider, address verifier, uint256 nThawRequests) internal { + Params_WithdrawDelegated memory params = Params_WithdrawDelegated({ + thawRequestType: IHorizonStakingTypes.ThawRequestType.Delegation, + serviceProvider: serviceProvider, + verifier: verifier, + newServiceProvider: address(0), + newVerifier: address(0), + minSharesForNewProvider: 0, + nThawRequests: nThawRequests, + legacy: verifier == subgraphDataServiceLegacyAddress + }); + __withdrawDelegated(params); + } + + function _redelegate( + address serviceProvider, + address verifier, + address newServiceProvider, + address newVerifier, + uint256 minSharesForNewProvider, + uint256 nThawRequests + ) internal { + Params_WithdrawDelegated memory params = Params_WithdrawDelegated({ + thawRequestType: IHorizonStakingTypes.ThawRequestType.Delegation, + serviceProvider: serviceProvider, + verifier: verifier, + newServiceProvider: newServiceProvider, + newVerifier: newVerifier, + minSharesForNewProvider: minSharesForNewProvider, + nThawRequests: nThawRequests, + legacy: false + }); + __withdrawDelegated(params); + } + + struct BeforeValues_WithdrawDelegated { + DelegationPoolInternalTest pool; + DelegationPoolInternalTest newPool; + DelegationInternal newDelegation; + ILinkedList.List thawRequestList; + uint256 senderBalance; + uint256 stakingBalance; + } + struct AfterValues_WithdrawDelegated { + DelegationPoolInternalTest pool; + DelegationPoolInternalTest newPool; + DelegationInternal newDelegation; + ILinkedList.List thawRequestList; + uint256 senderBalance; + uint256 stakingBalance; + } + + struct Params_WithdrawDelegated { + IHorizonStakingTypes.ThawRequestType thawRequestType; + address serviceProvider; + address verifier; + address newServiceProvider; + address newVerifier; + uint256 minSharesForNewProvider; + uint256 nThawRequests; + bool legacy; + } + + function __withdrawDelegated(Params_WithdrawDelegated memory params) private { + (, address msgSender, ) = vm.readCallers(); + + bool reDelegate = params.newServiceProvider != address(0) && params.newVerifier != address(0); + + // before + BeforeValues_WithdrawDelegated memory beforeValues; + beforeValues.pool = _getStorage_DelegationPoolInternal(params.serviceProvider, params.verifier, params.legacy); + beforeValues.newPool = _getStorage_DelegationPoolInternal( + params.newServiceProvider, + params.newVerifier, + params.legacy + ); + beforeValues.newDelegation = _getStorage_Delegation( + params.newServiceProvider, + params.newVerifier, + msgSender, + params.legacy + ); + beforeValues.thawRequestList = staking.getThawRequestList( + params.thawRequestType, + params.serviceProvider, + params.verifier, + msgSender + ); + beforeValues.senderBalance = token.balanceOf(msgSender); + beforeValues.stakingBalance = token.balanceOf(address(staking)); + + Params_CalcThawRequestData memory paramsCalc = Params_CalcThawRequestData({ + thawRequestType: params.thawRequestType, + serviceProvider: params.serviceProvider, + verifier: params.verifier, + owner: msgSender, + iterations: params.nThawRequests, + delegation: true + }); + CalcValues_ThawRequestData memory calcValues = calcThawRequestData(paramsCalc); + + // withdrawDelegated + for (uint i = 0; i < calcValues.thawRequestsFulfilledList.length; i++) { + ThawRequest memory thawRequest = calcValues.thawRequestsFulfilledList[i]; + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestFulfilled( + params.thawRequestType, + calcValues.thawRequestsFulfilledListIds[i], + calcValues.thawRequestsFulfilledListTokens[i], + thawRequest.shares, + thawRequest.thawingUntil, + beforeValues.pool.thawingNonce == thawRequest.thawingNonce + ); + } + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawRequestsFulfilled( + params.thawRequestType, + params.serviceProvider, + params.verifier, + msgSender, + calcValues.thawRequestsFulfilledList.length, + calcValues.tokensThawed + ); + if (calcValues.tokensThawed != 0) { + vm.expectEmit(); + if (reDelegate) { + emit IHorizonStakingMain.TokensDelegated( + params.newServiceProvider, + params.newVerifier, + msgSender, + calcValues.tokensThawed, + calcValues.sharesThawed + ); + } else { + emit Transfer(address(staking), msgSender, calcValues.tokensThawed); + + vm.expectEmit(); + emit IHorizonStakingMain.DelegatedTokensWithdrawn( + params.serviceProvider, + params.verifier, + msgSender, + calcValues.tokensThawed + ); + } + } + + if (reDelegate) { + staking.redelegate( + params.serviceProvider, + params.verifier, + params.newServiceProvider, + params.newVerifier, + params.minSharesForNewProvider, + params.nThawRequests + ); + } else if (params.thawRequestType == IHorizonStakingTypes.ThawRequestType.Delegation) { + staking.withdrawDelegated(params.serviceProvider, params.verifier, params.nThawRequests); + } else { + revert("Invalid thaw request type"); + } + + // after + AfterValues_WithdrawDelegated memory afterValues; + afterValues.pool = _getStorage_DelegationPoolInternal(params.serviceProvider, params.verifier, params.legacy); + afterValues.newPool = _getStorage_DelegationPoolInternal( + params.newServiceProvider, + params.newVerifier, + params.legacy + ); + afterValues.newDelegation = _getStorage_Delegation( + params.newServiceProvider, + params.newVerifier, + msgSender, + params.legacy + ); + afterValues.thawRequestList = staking.getThawRequestList( + params.thawRequestType, + params.serviceProvider, + params.verifier, + msgSender + ); + afterValues.senderBalance = token.balanceOf(msgSender); + afterValues.stakingBalance = token.balanceOf(address(staking)); + + // assert + assertEq(afterValues.pool.tokens, beforeValues.pool.tokens - calcValues.tokensThawed); + assertEq(afterValues.pool.shares, beforeValues.pool.shares); + assertEq(afterValues.pool.tokensThawing, calcValues.tokensThawing); + assertEq(afterValues.pool.sharesThawing, calcValues.sharesThawing); + assertEq(afterValues.pool.thawingNonce, beforeValues.pool.thawingNonce); + + for (uint i = 0; i < calcValues.thawRequestsFulfilledListIds.length; i++) { + ThawRequest memory thawRequest = staking.getThawRequest( + params.thawRequestType, + calcValues.thawRequestsFulfilledListIds[i] + ); + assertEq(thawRequest.shares, 0); + assertEq(thawRequest.thawingUntil, 0); + assertEq(thawRequest.nextRequest, bytes32(0)); + } + if (calcValues.thawRequestsFulfilledList.length == 0) { + assertEq(afterValues.thawRequestList.head, beforeValues.thawRequestList.head); + } else { + assertEq( + afterValues.thawRequestList.head, + calcValues.thawRequestsFulfilledList.length == beforeValues.thawRequestList.count + ? bytes32(0) + : calcValues.thawRequestsFulfilledList[calcValues.thawRequestsFulfilledList.length - 1].nextRequest + ); + } + assertEq( + afterValues.thawRequestList.tail, + calcValues.thawRequestsFulfilledList.length == beforeValues.thawRequestList.count + ? bytes32(0) + : beforeValues.thawRequestList.tail + ); + assertEq( + afterValues.thawRequestList.count, + beforeValues.thawRequestList.count - calcValues.thawRequestsFulfilledList.length + ); + assertEq(afterValues.thawRequestList.nonce, beforeValues.thawRequestList.nonce); + + if (reDelegate) { + uint256 calcShares = (afterValues.newPool.tokens == 0 || + afterValues.newPool.tokens == afterValues.newPool.tokensThawing) + ? calcValues.tokensThawed + : ((calcValues.tokensThawed * afterValues.newPool.shares) / + (afterValues.newPool.tokens - afterValues.newPool.tokensThawing)); + uint256 deltaShares = afterValues.newDelegation.shares - beforeValues.newDelegation.shares; + + assertEq(afterValues.newPool.tokens, beforeValues.newPool.tokens + calcValues.tokensThawed); + assertEq(afterValues.newPool.shares, beforeValues.newPool.shares + calcShares); + assertEq(afterValues.newPool.tokensThawing, beforeValues.newPool.tokensThawing); + assertEq(afterValues.newPool.sharesThawing, beforeValues.newPool.sharesThawing); + assertEq(afterValues.newDelegation.shares, beforeValues.newDelegation.shares + calcShares); + assertEq( + afterValues.newDelegation.__DEPRECATED_tokensLocked, + beforeValues.newDelegation.__DEPRECATED_tokensLocked + ); + assertEq( + afterValues.newDelegation.__DEPRECATED_tokensLockedUntil, + beforeValues.newDelegation.__DEPRECATED_tokensLockedUntil + ); + assertGe(deltaShares, params.minSharesForNewProvider); + assertEq(calcShares, deltaShares); + assertEq(afterValues.senderBalance - beforeValues.senderBalance, 0); + assertEq(beforeValues.stakingBalance - afterValues.stakingBalance, 0); + } else { + assertEq(beforeValues.stakingBalance - afterValues.stakingBalance, calcValues.tokensThawed); + assertEq(afterValues.senderBalance - beforeValues.senderBalance, calcValues.tokensThawed); + } + } + + function _addToDelegationPool(address serviceProvider, address verifier, uint256 tokens) internal { + (, address msgSender, ) = vm.readCallers(); + + // staking contract knows the address of the legacy subgraph service + // but we cannot read it as it's an immutable, we have to use the global var :/ + bool legacy = verifier == subgraphDataServiceLegacyAddress; + + // before + DelegationPoolInternalTest memory beforePool = _getStorage_DelegationPoolInternal( + serviceProvider, + verifier, + legacy + ); + uint256 beforeSenderBalance = token.balanceOf(msgSender); + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + + // addToDelegationPool + vm.expectEmit(); + emit Transfer(msgSender, address(staking), tokens); + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.TokensToDelegationPoolAdded(serviceProvider, verifier, tokens); + staking.addToDelegationPool(serviceProvider, verifier, tokens); + + // after + DelegationPoolInternalTest memory afterPool = _getStorage_DelegationPoolInternal( + serviceProvider, + verifier, + legacy + ); + uint256 afterSenderBalance = token.balanceOf(msgSender); + uint256 afterStakingBalance = token.balanceOf(address(staking)); + + // assert + assertEq(beforeSenderBalance - tokens, afterSenderBalance); + assertEq(beforeStakingBalance + tokens, afterStakingBalance); + assertEq(beforePool.tokens + tokens, afterPool.tokens); + assertEq(beforePool.shares, afterPool.shares); + assertEq(beforePool.tokensThawing, afterPool.tokensThawing); + assertEq(beforePool.sharesThawing, afterPool.sharesThawing); + assertEq(beforePool.thawingNonce, afterPool.thawingNonce); + } + + function _setDelegationFeeCut( + address serviceProvider, + address verifier, + IGraphPayments.PaymentTypes paymentType, + uint256 feeCut + ) internal { + // setDelegationFeeCut + vm.expectEmit(); + emit IHorizonStakingMain.DelegationFeeCutSet(serviceProvider, verifier, paymentType, feeCut); + staking.setDelegationFeeCut(serviceProvider, verifier, paymentType, feeCut); + + // after + uint256 afterDelegationFeeCut = staking.getDelegationFeeCut(serviceProvider, verifier, paymentType); + + // assert + assertEq(afterDelegationFeeCut, feeCut); + } + + function _setAllowedLockedVerifier(address verifier, bool allowed) internal { + // setAllowedLockedVerifier + vm.expectEmit(); + emit IHorizonStakingMain.AllowedLockedVerifierSet(verifier, allowed); + staking.setAllowedLockedVerifier(verifier, allowed); + + // after + bool afterAllowed = staking.isAllowedLockedVerifier(verifier); + + // assert + assertEq(afterAllowed, allowed); + } + + function _setDelegationSlashingEnabled() internal { + // setDelegationSlashingEnabled + vm.expectEmit(); + emit IHorizonStakingMain.DelegationSlashingEnabled(); + staking.setDelegationSlashingEnabled(); + + // after + bool afterEnabled = staking.isDelegationSlashingEnabled(); + + // assert + assertEq(afterEnabled, true); + } + + function _clearThawingPeriod() internal { + // clearThawingPeriod + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ThawingPeriodCleared(); + staking.clearThawingPeriod(); + + // after + uint64 afterThawingPeriod = staking.__DEPRECATED_getThawingPeriod(); + + // assert + assertEq(afterThawingPeriod, 0); + } + + function _setMaxThawingPeriod(uint64 maxThawingPeriod) internal { + // setMaxThawingPeriod + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.MaxThawingPeriodSet(maxThawingPeriod); + staking.setMaxThawingPeriod(maxThawingPeriod); + + // after + uint64 afterMaxThawingPeriod = staking.getMaxThawingPeriod(); + + // assert + assertEq(afterMaxThawingPeriod, maxThawingPeriod); + } + + struct BeforeValues_Slash { + Provision provision; + DelegationPoolInternalTest pool; + ServiceProviderInternal serviceProvider; + uint256 stakingBalance; + uint256 verifierBalance; + } + struct CalcValues_Slash { + uint256 tokensToSlash; + uint256 providerTokensSlashed; + uint256 delegationTokensSlashed; + } + + function _slash(address serviceProvider, address verifier, uint256 tokens, uint256 verifierCutAmount) internal { + bool isDelegationSlashingEnabled = staking.isDelegationSlashingEnabled(); + + // staking contract knows the address of the legacy subgraph service + // but we cannot read it as it's an immutable, we have to use the global var :/ + bool legacy = verifier == subgraphDataServiceLegacyAddress; + + // before + BeforeValues_Slash memory before; + before.provision = staking.getProvision(serviceProvider, verifier); + before.pool = _getStorage_DelegationPoolInternal(serviceProvider, verifier, legacy); + before.serviceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + before.stakingBalance = token.balanceOf(address(staking)); + before.verifierBalance = token.balanceOf(verifier); + + // Calculate expected tokens after slashing + CalcValues_Slash memory calcValues; + calcValues.tokensToSlash = MathUtils.min(tokens, before.provision.tokens + before.pool.tokens); + calcValues.providerTokensSlashed = MathUtils.min(before.provision.tokens, calcValues.tokensToSlash); + calcValues.delegationTokensSlashed = calcValues.tokensToSlash - calcValues.providerTokensSlashed; + + if (calcValues.tokensToSlash > 0) { + if (verifierCutAmount > 0) { + vm.expectEmit(address(token)); + emit Transfer(address(staking), verifier, verifierCutAmount); + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.VerifierTokensSent(serviceProvider, verifier, verifier, verifierCutAmount); + } + if (calcValues.providerTokensSlashed - verifierCutAmount > 0) { + vm.expectEmit(address(token)); + emit Transfer(address(staking), address(0), calcValues.providerTokensSlashed - verifierCutAmount); + } + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.ProvisionSlashed(serviceProvider, verifier, calcValues.providerTokensSlashed); + } + + if (calcValues.delegationTokensSlashed > 0) { + if (isDelegationSlashingEnabled) { + vm.expectEmit(address(token)); + emit Transfer(address(staking), address(0), calcValues.delegationTokensSlashed); + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.DelegationSlashed( + serviceProvider, + verifier, + calcValues.delegationTokensSlashed + ); + } else { + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.DelegationSlashingSkipped( + serviceProvider, + verifier, + calcValues.delegationTokensSlashed + ); + } + } + staking.slash(serviceProvider, tokens, verifierCutAmount, verifier); + + // after + Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); + DelegationPoolInternalTest memory afterPool = _getStorage_DelegationPoolInternal( + serviceProvider, + verifier, + legacy + ); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal(serviceProvider); + uint256 afterStakingBalance = token.balanceOf(address(staking)); + uint256 afterVerifierBalance = token.balanceOf(verifier); + + { + uint256 tokensSlashed = calcValues.providerTokensSlashed + + (isDelegationSlashingEnabled ? calcValues.delegationTokensSlashed : 0); + uint256 provisionThawingTokens = (before.provision.tokensThawing * + (before.provision.tokens - calcValues.providerTokensSlashed)) / before.provision.tokens; + + // assert + assertEq(afterProvision.tokens + calcValues.providerTokensSlashed, before.provision.tokens); + assertEq(afterProvision.tokensThawing, provisionThawingTokens); + assertEq( + afterProvision.sharesThawing, + afterProvision.tokensThawing == 0 ? 0 : before.provision.sharesThawing + ); + assertEq(afterProvision.maxVerifierCut, before.provision.maxVerifierCut); + assertEq(afterProvision.maxVerifierCutPending, before.provision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriod, before.provision.thawingPeriod); + assertEq(afterProvision.thawingPeriodPending, before.provision.thawingPeriodPending); + assertEq( + afterProvision.thawingNonce, + (before.provision.sharesThawing != 0 && afterProvision.sharesThawing == 0) + ? before.provision.thawingNonce + 1 + : before.provision.thawingNonce + ); + if (isDelegationSlashingEnabled) { + uint256 poolThawingTokens = (before.pool.tokensThawing * + (before.pool.tokens - calcValues.delegationTokensSlashed)) / before.pool.tokens; + assertEq(afterPool.tokens + calcValues.delegationTokensSlashed, before.pool.tokens); + assertEq(afterPool.shares, before.pool.shares); + assertEq(afterPool.tokensThawing, poolThawingTokens); + assertEq(afterPool.sharesThawing, afterPool.tokensThawing == 0 ? 0 : before.pool.sharesThawing); + assertEq( + afterPool.thawingNonce, + (before.pool.sharesThawing != 0 && afterPool.sharesThawing == 0) + ? before.pool.thawingNonce + 1 + : before.pool.thawingNonce + ); + } + + assertEq(before.stakingBalance - tokensSlashed, afterStakingBalance); + assertEq(before.verifierBalance + verifierCutAmount, afterVerifierBalance); + + assertEq( + afterServiceProvider.tokensStaked + calcValues.providerTokensSlashed, + before.serviceProvider.tokensStaked + ); + assertEq( + afterServiceProvider.tokensProvisioned + calcValues.providerTokensSlashed, + before.serviceProvider.tokensProvisioned + ); + } + } + + // use struct to avoid 'stack too deep' error + struct CalcValues_CloseAllocation { + uint256 rewards; + uint256 delegatorRewards; + uint256 indexerRewards; + } + struct BeforeValues_CloseAllocation { + IHorizonStakingExtension.Allocation allocation; + DelegationPoolInternalTest pool; + ServiceProviderInternal serviceProvider; + uint256 subgraphAllocations; + uint256 stakingBalance; + uint256 indexerBalance; + uint256 beneficiaryBalance; + } + + // Current rewards manager is mocked and assumed to mint fixed rewards + function _closeAllocation(address allocationId, bytes32 poi) internal { + (, address msgSender, ) = vm.readCallers(); + + // before + BeforeValues_CloseAllocation memory beforeValues; + beforeValues.allocation = staking.getAllocation(allocationId); + beforeValues.pool = _getStorage_DelegationPoolInternal( + beforeValues.allocation.indexer, + subgraphDataServiceLegacyAddress, + true + ); + beforeValues.serviceProvider = _getStorage_ServiceProviderInternal(beforeValues.allocation.indexer); + beforeValues.subgraphAllocations = _getStorage_SubgraphAllocations( + beforeValues.allocation.subgraphDeploymentID + ); + beforeValues.stakingBalance = token.balanceOf(address(staking)); + beforeValues.indexerBalance = token.balanceOf(beforeValues.allocation.indexer); + beforeValues.beneficiaryBalance = token.balanceOf( + _getStorage_RewardsDestination(beforeValues.allocation.indexer) + ); + + bool isAuth = staking.isAuthorized( + beforeValues.allocation.indexer, + subgraphDataServiceLegacyAddress, + msgSender + ); + address rewardsDestination = _getStorage_RewardsDestination(beforeValues.allocation.indexer); + + CalcValues_CloseAllocation memory calcValues = CalcValues_CloseAllocation({ + rewards: ALLOCATIONS_REWARD_CUT, + delegatorRewards: ALLOCATIONS_REWARD_CUT - + uint256(beforeValues.pool.__DEPRECATED_indexingRewardCut).mulPPM(ALLOCATIONS_REWARD_CUT), + indexerRewards: 0 + }); + calcValues.indexerRewards = + ALLOCATIONS_REWARD_CUT - (beforeValues.pool.tokens > 0 ? calcValues.delegatorRewards : 0); + + // closeAllocation + vm.expectEmit(address(staking)); + emit IHorizonStakingExtension.AllocationClosed( + beforeValues.allocation.indexer, + beforeValues.allocation.subgraphDeploymentID, + epochManager.currentEpoch(), + beforeValues.allocation.tokens, + allocationId, + msgSender, + poi, + !isAuth + ); + staking.closeAllocation(allocationId, poi); + + // after + IHorizonStakingExtension.Allocation memory afterAllocation = staking.getAllocation(allocationId); + DelegationPoolInternalTest memory afterPool = _getStorage_DelegationPoolInternal( + beforeValues.allocation.indexer, + subgraphDataServiceLegacyAddress, + true + ); + ServiceProviderInternal memory afterServiceProvider = _getStorage_ServiceProviderInternal( + beforeValues.allocation.indexer + ); + uint256 afterSubgraphAllocations = _getStorage_SubgraphAllocations( + beforeValues.allocation.subgraphDeploymentID + ); + uint256 afterStakingBalance = token.balanceOf(address(staking)); + uint256 afterIndexerBalance = token.balanceOf(beforeValues.allocation.indexer); + uint256 afterBeneficiaryBalance = token.balanceOf(rewardsDestination); + + if (beforeValues.allocation.tokens > 0) { + if (isAuth && poi != 0) { + if (rewardsDestination != address(0)) { + assertEq( + beforeValues.stakingBalance + calcValues.rewards - calcValues.indexerRewards, + afterStakingBalance + ); + assertEq(beforeValues.indexerBalance, afterIndexerBalance); + assertEq(beforeValues.beneficiaryBalance + calcValues.indexerRewards, afterBeneficiaryBalance); + } else { + assertEq(beforeValues.stakingBalance + calcValues.rewards, afterStakingBalance); + assertEq(beforeValues.indexerBalance, afterIndexerBalance); + assertEq(beforeValues.beneficiaryBalance, afterBeneficiaryBalance); + } + } else { + assertEq(beforeValues.stakingBalance, afterStakingBalance); + assertEq(beforeValues.indexerBalance, afterIndexerBalance); + assertEq(beforeValues.beneficiaryBalance, afterBeneficiaryBalance); + } + } else { + assertEq(beforeValues.stakingBalance, afterStakingBalance); + assertEq(beforeValues.indexerBalance, afterIndexerBalance); + assertEq(beforeValues.beneficiaryBalance, afterBeneficiaryBalance); + } + + assertEq(afterAllocation.indexer, beforeValues.allocation.indexer); + assertEq(afterAllocation.subgraphDeploymentID, beforeValues.allocation.subgraphDeploymentID); + assertEq(afterAllocation.tokens, beforeValues.allocation.tokens); + assertEq(afterAllocation.createdAtEpoch, beforeValues.allocation.createdAtEpoch); + assertEq(afterAllocation.closedAtEpoch, epochManager.currentEpoch()); + assertEq(afterAllocation.collectedFees, beforeValues.allocation.collectedFees); + assertEq( + afterAllocation.__DEPRECATED_effectiveAllocation, + beforeValues.allocation.__DEPRECATED_effectiveAllocation + ); + assertEq(afterAllocation.accRewardsPerAllocatedToken, beforeValues.allocation.accRewardsPerAllocatedToken); + assertEq(afterAllocation.distributedRebates, beforeValues.allocation.distributedRebates); + + if (beforeValues.allocation.tokens > 0 && isAuth && poi != 0 && rewardsDestination == address(0)) { + assertEq( + afterServiceProvider.tokensStaked, + beforeValues.serviceProvider.tokensStaked + calcValues.indexerRewards + ); + } else { + assertEq(afterServiceProvider.tokensStaked, beforeValues.serviceProvider.tokensStaked); + } + assertEq(afterServiceProvider.tokensProvisioned, beforeValues.serviceProvider.tokensProvisioned); + assertEq( + afterServiceProvider.__DEPRECATED_tokensAllocated + beforeValues.allocation.tokens, + beforeValues.serviceProvider.__DEPRECATED_tokensAllocated + ); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLocked, + beforeValues.serviceProvider.__DEPRECATED_tokensLocked + ); + assertEq( + afterServiceProvider.__DEPRECATED_tokensLockedUntil, + beforeValues.serviceProvider.__DEPRECATED_tokensLockedUntil + ); + + assertEq(afterSubgraphAllocations + beforeValues.allocation.tokens, beforeValues.subgraphAllocations); + + if (beforeValues.allocation.tokens > 0 && isAuth && poi != 0 && beforeValues.pool.tokens > 0) { + assertEq(afterPool.tokens, beforeValues.pool.tokens + calcValues.delegatorRewards); + } else { + assertEq(afterPool.tokens, beforeValues.pool.tokens); + } + } + + // use struct to avoid 'stack too deep' error + struct BeforeValues_Collect { + IHorizonStakingExtension.Allocation allocation; + DelegationPoolInternalTest pool; + ServiceProviderInternal serviceProvider; + uint256 stakingBalance; + uint256 senderBalance; + uint256 curationBalance; + uint256 beneficiaryBalance; + } + struct CalcValues_Collect { + uint256 protocolTaxTokens; + uint256 queryFees; + uint256 curationCutTokens; + uint256 newRebates; + uint256 payment; + uint256 delegationFeeCut; + } + struct AfterValues_Collect { + IHorizonStakingExtension.Allocation allocation; + DelegationPoolInternalTest pool; + ServiceProviderInternal serviceProvider; + uint256 stakingBalance; + uint256 senderBalance; + uint256 curationBalance; + uint256 beneficiaryBalance; + } + + function _collect(uint256 tokens, address allocationId) internal { + (, address msgSender, ) = vm.readCallers(); + + // before + BeforeValues_Collect memory beforeValues; + beforeValues.allocation = staking.getAllocation(allocationId); + beforeValues.pool = _getStorage_DelegationPoolInternal( + beforeValues.allocation.indexer, + subgraphDataServiceLegacyAddress, + true + ); + beforeValues.serviceProvider = _getStorage_ServiceProviderInternal(beforeValues.allocation.indexer); + + (uint32 curationPercentage, uint32 protocolPercentage) = _getStorage_ProtocolTaxAndCuration(); + address rewardsDestination = _getStorage_RewardsDestination(beforeValues.allocation.indexer); + + beforeValues.stakingBalance = token.balanceOf(address(staking)); + beforeValues.senderBalance = token.balanceOf(msgSender); + beforeValues.curationBalance = token.balanceOf(address(curation)); + beforeValues.beneficiaryBalance = token.balanceOf(rewardsDestination); + + // calc some stuff + CalcValues_Collect memory calcValues; + calcValues.protocolTaxTokens = tokens.mulPPMRoundUp(protocolPercentage); + calcValues.queryFees = tokens - calcValues.protocolTaxTokens; + calcValues.curationCutTokens = 0; + if (curation.isCurated(beforeValues.allocation.subgraphDeploymentID)) { + calcValues.curationCutTokens = calcValues.queryFees.mulPPMRoundUp(curationPercentage); + calcValues.queryFees -= calcValues.curationCutTokens; + } + calcValues.newRebates = ExponentialRebates.exponentialRebates( + calcValues.queryFees + beforeValues.allocation.collectedFees, + beforeValues.allocation.tokens, + alphaNumerator, + alphaDenominator, + lambdaNumerator, + lambdaDenominator + ); + calcValues.payment = calcValues.newRebates > calcValues.queryFees + ? calcValues.queryFees + : calcValues.newRebates; + calcValues.delegationFeeCut = 0; + if (beforeValues.pool.tokens > 0) { + calcValues.delegationFeeCut = + calcValues.payment - calcValues.payment.mulPPM(beforeValues.pool.__DEPRECATED_queryFeeCut); + calcValues.payment -= calcValues.delegationFeeCut; + } + + // staking.collect() + if (tokens > 0) { + vm.expectEmit(address(staking)); + emit IHorizonStakingExtension.RebateCollected( + msgSender, + beforeValues.allocation.indexer, + beforeValues.allocation.subgraphDeploymentID, + allocationId, + epochManager.currentEpoch(), + tokens, + calcValues.protocolTaxTokens, + calcValues.curationCutTokens, + calcValues.queryFees, + calcValues.payment, + calcValues.delegationFeeCut + ); + } + staking.collect(tokens, allocationId); + + // after + AfterValues_Collect memory afterValues; + afterValues.allocation = staking.getAllocation(allocationId); + afterValues.pool = _getStorage_DelegationPoolInternal( + beforeValues.allocation.indexer, + subgraphDataServiceLegacyAddress, + true + ); + afterValues.serviceProvider = _getStorage_ServiceProviderInternal(beforeValues.allocation.indexer); + afterValues.stakingBalance = token.balanceOf(address(staking)); + afterValues.senderBalance = token.balanceOf(msgSender); + afterValues.curationBalance = token.balanceOf(address(curation)); + afterValues.beneficiaryBalance = token.balanceOf(rewardsDestination); + + // assert + assertEq(afterValues.senderBalance + tokens, beforeValues.senderBalance); + assertEq(afterValues.curationBalance, beforeValues.curationBalance + calcValues.curationCutTokens); + if (rewardsDestination != address(0)) { + assertEq(afterValues.beneficiaryBalance, beforeValues.beneficiaryBalance + calcValues.payment); + assertEq(afterValues.stakingBalance, beforeValues.stakingBalance + calcValues.delegationFeeCut); + } else { + assertEq(afterValues.beneficiaryBalance, beforeValues.beneficiaryBalance); + assertEq( + afterValues.stakingBalance, + beforeValues.stakingBalance + calcValues.delegationFeeCut + calcValues.payment + ); + } + + assertEq( + afterValues.allocation.collectedFees, + beforeValues.allocation.collectedFees + tokens - calcValues.protocolTaxTokens - calcValues.curationCutTokens + ); + assertEq(afterValues.allocation.indexer, beforeValues.allocation.indexer); + assertEq(afterValues.allocation.subgraphDeploymentID, beforeValues.allocation.subgraphDeploymentID); + assertEq(afterValues.allocation.tokens, beforeValues.allocation.tokens); + assertEq(afterValues.allocation.createdAtEpoch, beforeValues.allocation.createdAtEpoch); + assertEq(afterValues.allocation.closedAtEpoch, beforeValues.allocation.closedAtEpoch); + assertEq( + afterValues.allocation.accRewardsPerAllocatedToken, + beforeValues.allocation.accRewardsPerAllocatedToken + ); + assertEq( + afterValues.allocation.distributedRebates, + beforeValues.allocation.distributedRebates + calcValues.newRebates + ); + + assertEq(afterValues.pool.tokens, beforeValues.pool.tokens + calcValues.delegationFeeCut); + assertEq(afterValues.pool.shares, beforeValues.pool.shares); + assertEq(afterValues.pool.tokensThawing, beforeValues.pool.tokensThawing); + assertEq(afterValues.pool.sharesThawing, beforeValues.pool.sharesThawing); + assertEq(afterValues.pool.thawingNonce, beforeValues.pool.thawingNonce); + + assertEq(afterValues.serviceProvider.tokensProvisioned, beforeValues.serviceProvider.tokensProvisioned); + if (rewardsDestination != address(0)) { + assertEq(afterValues.serviceProvider.tokensStaked, beforeValues.serviceProvider.tokensStaked); + } else { + assertEq( + afterValues.serviceProvider.tokensStaked, + beforeValues.serviceProvider.tokensStaked + calcValues.payment + ); + } + } + + /* + * STORAGE HELPERS + */ + function _getStorage_ServiceProviderInternal( + address serviceProvider + ) internal view returns (ServiceProviderInternal memory) { + uint256 slotNumber = 14; + uint256 baseSlotUint = uint256(keccak256(abi.encode(serviceProvider, slotNumber))); + + ServiceProviderInternal memory serviceProviderInternal = ServiceProviderInternal({ + tokensStaked: uint256(vm.load(address(staking), bytes32(baseSlotUint))), + __DEPRECATED_tokensAllocated: uint256(vm.load(address(staking), bytes32(baseSlotUint + 1))), + __DEPRECATED_tokensLocked: uint256(vm.load(address(staking), bytes32(baseSlotUint + 2))), + __DEPRECATED_tokensLockedUntil: uint256(vm.load(address(staking), bytes32(baseSlotUint + 3))), + tokensProvisioned: uint256(vm.load(address(staking), bytes32(baseSlotUint + 4))) + }); + + return serviceProviderInternal; + } + + function _getStorage_OperatorAuth( + address serviceProvider, + address verifier, + address operator, + bool legacy + ) internal view returns (bool) { + uint256 slotNumber = legacy ? 21 : 31; + uint256 slot; + + if (legacy) { + slot = uint256(keccak256(abi.encode(operator, keccak256(abi.encode(serviceProvider, slotNumber))))); + } else { + slot = uint256( + keccak256( + abi.encode( + operator, + keccak256(abi.encode(verifier, keccak256(abi.encode(serviceProvider, slotNumber)))) + ) + ) + ); + } + return vm.load(address(staking), bytes32(slot)) == bytes32(uint256(1)); + } + + function _setStorage_DeprecatedThawingPeriod(uint32 _thawingPeriod) internal { + uint256 slot = 13; + + // Read the current value of the slot + uint256 currentSlotValue = uint256(vm.load(address(staking), bytes32(slot))); + + // Create a mask to clear the bits for __DEPRECATED_thawingPeriod (bits 0-31) + uint256 mask = ~(uint256(0xFFFFFFFF)); // Mask to clear the first 32 bits + + // Clear the bits for __DEPRECATED_thawingPeriod and set the new value + uint256 newSlotValue = (currentSlotValue & mask) | uint256(_thawingPeriod); + + // Store the updated value back into the slot + vm.store(address(staking), bytes32(slot), bytes32(newSlotValue)); + } + + function _setStorage_ServiceProvider( + address _indexer, + uint256 _tokensStaked, + uint256 _tokensAllocated, + uint256 _tokensLocked, + uint256 _tokensLockedUntil, + uint256 _tokensProvisioned + ) internal { + uint256 serviceProviderSlot = 14; + bytes32 serviceProviderBaseSlot = keccak256(abi.encode(_indexer, serviceProviderSlot)); + vm.store(address(staking), bytes32(uint256(serviceProviderBaseSlot)), bytes32(_tokensStaked)); + vm.store(address(staking), bytes32(uint256(serviceProviderBaseSlot) + 1), bytes32(_tokensAllocated)); + vm.store(address(staking), bytes32(uint256(serviceProviderBaseSlot) + 2), bytes32(_tokensLocked)); + vm.store(address(staking), bytes32(uint256(serviceProviderBaseSlot) + 3), bytes32(_tokensLockedUntil)); + vm.store(address(staking), bytes32(uint256(serviceProviderBaseSlot) + 4), bytes32(_tokensProvisioned)); + } + + // DelegationPoolInternal contains a mapping, solidity doesn't allow constructing structs with + // nested mappings on memory: "Struct containing a (nested) mapping cannot be constructed" + // So we use a custom struct here and remove the nested mapping which we don't need anyways + struct DelegationPoolInternalTest { + // (Deprecated) Time, in blocks, an indexer must wait before updating delegation parameters + uint32 __DEPRECATED_cooldownBlocks; + // (Deprecated) Percentage of indexing rewards for the service provider, in PPM + uint32 __DEPRECATED_indexingRewardCut; + // (Deprecated) Percentage of query fees for the service provider, in PPM + uint32 __DEPRECATED_queryFeeCut; + // (Deprecated) Block when the delegation parameters were last updated + uint256 __DEPRECATED_updatedAtBlock; + // Total tokens as pool reserves + uint256 tokens; + // Total shares minted in the pool + uint256 shares; + // Delegation details by delegator + uint256 _gap_delegators_mapping; + // Tokens thawing in the pool + uint256 tokensThawing; + // Shares representing the thawing tokens + uint256 sharesThawing; + // Thawing nonce + uint256 thawingNonce; + } + + function _getStorage_DelegationPoolInternal( + address serviceProvider, + address verifier, + bool legacy + ) internal view returns (DelegationPoolInternalTest memory) { + uint256 slotNumber = legacy ? 20 : 33; + uint256 baseSlot; + if (legacy) { + baseSlot = uint256(keccak256(abi.encode(serviceProvider, slotNumber))); + } else { + baseSlot = uint256(keccak256(abi.encode(verifier, keccak256(abi.encode(serviceProvider, slotNumber))))); + } + + uint256 packedData = uint256(vm.load(address(staking), bytes32(baseSlot))); + + DelegationPoolInternalTest memory delegationPoolInternal = DelegationPoolInternalTest({ + __DEPRECATED_cooldownBlocks: uint32(packedData & 0xFFFFFFFF), + __DEPRECATED_indexingRewardCut: uint32((packedData >> 32) & 0xFFFFFFFF), + __DEPRECATED_queryFeeCut: uint32((packedData >> 64) & 0xFFFFFFFF), + __DEPRECATED_updatedAtBlock: uint256(vm.load(address(staking), bytes32(baseSlot + 1))), + tokens: uint256(vm.load(address(staking), bytes32(baseSlot + 2))), + shares: uint256(vm.load(address(staking), bytes32(baseSlot + 3))), + _gap_delegators_mapping: uint256(vm.load(address(staking), bytes32(baseSlot + 4))), + tokensThawing: uint256(vm.load(address(staking), bytes32(baseSlot + 5))), + sharesThawing: uint256(vm.load(address(staking), bytes32(baseSlot + 6))), + thawingNonce: uint256(vm.load(address(staking), bytes32(baseSlot + 7))) + }); + + return delegationPoolInternal; + } + + function _getStorage_Delegation( + address serviceProvider, + address verifier, + address delegator, + bool legacy + ) internal view returns (DelegationInternal memory) { + uint256 slotNumber = legacy ? 20 : 33; + uint256 baseSlot; + + // DelegationPool + if (legacy) { + baseSlot = uint256(keccak256(abi.encode(serviceProvider, slotNumber))); + } else { + baseSlot = uint256(keccak256(abi.encode(verifier, keccak256(abi.encode(serviceProvider, slotNumber))))); + } + + // delegators slot in DelegationPool + baseSlot += 4; + + // Delegation + baseSlot = uint256(keccak256(abi.encode(delegator, baseSlot))); + + DelegationInternal memory delegation = DelegationInternal({ + shares: uint256(vm.load(address(staking), bytes32(baseSlot))), + __DEPRECATED_tokensLocked: uint256(vm.load(address(staking), bytes32(baseSlot + 1))), + __DEPRECATED_tokensLockedUntil: uint256(vm.load(address(staking), bytes32(baseSlot + 2))) + }); + + return delegation; + } + + function _setStorage_allocation( + IHorizonStakingExtension.Allocation memory allocation, + address allocationId, + uint256 tokens + ) internal { + // __DEPRECATED_allocations + uint256 allocationsSlot = 15; + bytes32 allocationBaseSlot = keccak256(abi.encode(allocationId, allocationsSlot)); + vm.store(address(staking), allocationBaseSlot, bytes32(uint256(uint160(allocation.indexer)))); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 1), allocation.subgraphDeploymentID); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 2), bytes32(tokens)); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 3), bytes32(allocation.createdAtEpoch)); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 4), bytes32(allocation.closedAtEpoch)); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 5), bytes32(allocation.collectedFees)); + vm.store( + address(staking), + bytes32(uint256(allocationBaseSlot) + 6), + bytes32(allocation.__DEPRECATED_effectiveAllocation) + ); + vm.store( + address(staking), + bytes32(uint256(allocationBaseSlot) + 7), + bytes32(allocation.accRewardsPerAllocatedToken) + ); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 8), bytes32(allocation.distributedRebates)); + + // _serviceProviders + uint256 serviceProviderSlot = 14; + bytes32 serviceProviderBaseSlot = keccak256(abi.encode(allocation.indexer, serviceProviderSlot)); + uint256 currentTokensStaked = uint256(vm.load(address(staking), serviceProviderBaseSlot)); + uint256 currentTokensProvisioned = uint256( + vm.load(address(staking), bytes32(uint256(serviceProviderBaseSlot) + 1)) + ); + vm.store( + address(staking), + bytes32(uint256(serviceProviderBaseSlot) + 0), + bytes32(currentTokensStaked + tokens) + ); + vm.store( + address(staking), + bytes32(uint256(serviceProviderBaseSlot) + 1), + bytes32(currentTokensProvisioned + tokens) + ); + + // __DEPRECATED_subgraphAllocations + uint256 subgraphsAllocationsSlot = 16; + bytes32 subgraphAllocationsBaseSlot = keccak256( + abi.encode(allocation.subgraphDeploymentID, subgraphsAllocationsSlot) + ); + uint256 currentAllocatedTokens = uint256(vm.load(address(staking), subgraphAllocationsBaseSlot)); + vm.store(address(staking), subgraphAllocationsBaseSlot, bytes32(currentAllocatedTokens + tokens)); + } + + function _getStorage_SubgraphAllocations(bytes32 subgraphDeploymentID) internal view returns (uint256) { + uint256 subgraphsAllocationsSlot = 16; + bytes32 subgraphAllocationsBaseSlot = keccak256(abi.encode(subgraphDeploymentID, subgraphsAllocationsSlot)); + return uint256(vm.load(address(staking), subgraphAllocationsBaseSlot)); + } + + function _setStorage_RewardsDestination(address serviceProvider, address destination) internal { + uint256 rewardsDestinationSlot = 23; + bytes32 rewardsDestinationSlotBaseSlot = keccak256(abi.encode(serviceProvider, rewardsDestinationSlot)); + vm.store(address(staking), rewardsDestinationSlotBaseSlot, bytes32(uint256(uint160(destination)))); + } + + function _getStorage_RewardsDestination(address serviceProvider) internal view returns (address) { + uint256 rewardsDestinationSlot = 23; + bytes32 rewardsDestinationSlotBaseSlot = keccak256(abi.encode(serviceProvider, rewardsDestinationSlot)); + return address(uint160(uint256(vm.load(address(staking), rewardsDestinationSlotBaseSlot)))); + } + + function _setStorage_MaxAllocationEpochs(uint256 maxAllocationEpochs) internal { + uint256 slot = 13; + + // Read the current value of the storage slot + uint256 currentSlotValue = uint256(vm.load(address(staking), bytes32(slot))); + + // Mask to clear the specific bits for __DEPRECATED_maxAllocationEpochs (bits 128-159) + uint256 mask = ~(uint256(0xFFFFFFFF) << 128); + + // Clear the bits and set the new maxAllocationEpochs value + uint256 newSlotValue = (currentSlotValue & mask) | (uint256(maxAllocationEpochs) << 128); + + // Store the updated value back into the slot + vm.store(address(staking), bytes32(slot), bytes32(newSlotValue)); + + uint256 readMaxAllocationEpochs = _getStorage_MaxAllocationEpochs(); + assertEq(readMaxAllocationEpochs, maxAllocationEpochs); + } + + function _getStorage_MaxAllocationEpochs() internal view returns (uint256) { + uint256 slot = 13; + + // Read the current value of the storage slot + uint256 currentSlotValue = uint256(vm.load(address(staking), bytes32(slot))); + + // Mask to isolate bits 128-159 + uint256 mask = uint256(0xFFFFFFFF) << 128; + + // Extract the maxAllocationEpochs by masking and shifting + uint256 maxAllocationEpochs = (currentSlotValue & mask) >> 128; + + return maxAllocationEpochs; + } + + function _setStorage_DelegationPool( + address serviceProvider, + uint256 tokens, + uint32 indexingRewardCut, + uint32 queryFeeCut + ) internal { + bytes32 baseSlot = keccak256(abi.encode(serviceProvider, uint256(20))); + bytes32 feeCutValues = bytes32( + (uint256(indexingRewardCut) << uint256(32)) | (uint256(queryFeeCut) << uint256(64)) + ); + bytes32 tokensSlot = bytes32(uint256(baseSlot) + 2); + vm.store(address(staking), baseSlot, feeCutValues); + vm.store(address(staking), tokensSlot, bytes32(tokens)); + } + + function _setStorage_RebateParameters( + uint32 alphaNumerator_, + uint32 alphaDenominator_, + uint32 lambdaNumerator_, + uint32 lambdaDenominator_ + ) internal { + // Store alpha numerator and denominator in slot 13 + uint256 alphaSlot = 13; + + uint256 newAlphaSlotValue; + { + uint256 alphaNumeratorOffset = 160; // Offset for __DEPRECATED_alphaNumerator (20th byte) + uint256 alphaDenominatorOffset = 192; // Offset for __DEPRECATED_alphaDenominator (24th byte) + + // Read current value of the slot + uint256 currentAlphaSlotValue = uint256(vm.load(address(staking), bytes32(alphaSlot))); + + // Create a mask to clear the bits for alphaNumerator and alphaDenominator + uint256 alphaMask = ~(uint256(0xFFFFFFFF) << alphaNumeratorOffset) & + ~(uint256(0xFFFFFFFF) << alphaDenominatorOffset); + + // Clear and set new values + newAlphaSlotValue = + (currentAlphaSlotValue & alphaMask) | + (uint256(alphaNumerator_) << alphaNumeratorOffset) | + (uint256(alphaDenominator_) << alphaDenominatorOffset); + } + + // Store the updated value back into the slot + vm.store(address(staking), bytes32(alphaSlot), bytes32(newAlphaSlotValue)); + + // Store lambda numerator and denominator in slot 25 + uint256 lambdaSlot = 25; + + uint256 newLambdaSlotValue; + { + uint256 lambdaNumeratorOffset = 160; // Offset for lambdaNumerator (20th byte) + uint256 lambdaDenominatorOffset = 192; // Offset for lambdaDenominator (24th byte) + + // Read current value of the slot + uint256 currentLambdaSlotValue = uint256(vm.load(address(staking), bytes32(lambdaSlot))); + + // Create a mask to clear the bits for lambdaNumerator and lambdaDenominator + uint256 lambdaMask = ~(uint256(0xFFFFFFFF) << lambdaNumeratorOffset) & + ~(uint256(0xFFFFFFFF) << lambdaDenominatorOffset); + + // Clear and set new values + newLambdaSlotValue = + (currentLambdaSlotValue & lambdaMask) | + (uint256(lambdaNumerator_) << lambdaNumeratorOffset) | + (uint256(lambdaDenominator_) << lambdaDenominatorOffset); + } + + // Store the updated value back into the slot + vm.store(address(staking), bytes32(lambdaSlot), bytes32(newLambdaSlotValue)); + + // Verify the storage + ( + uint32 readAlphaNumerator, + uint32 readAlphaDenominator, + uint32 readLambdaNumerator, + uint32 readLambdaDenominator + ) = _getStorage_RebateParameters(); + assertEq(readAlphaNumerator, alphaNumerator_); + assertEq(readAlphaDenominator, alphaDenominator_); + assertEq(readLambdaNumerator, lambdaNumerator_); + assertEq(readLambdaDenominator, lambdaDenominator_); + } + + function _getStorage_RebateParameters() internal view returns (uint32, uint32, uint32, uint32) { + // Read alpha numerator and denominator + uint256 alphaSlot = 13; + uint256 alphaValues = uint256(vm.load(address(staking), bytes32(alphaSlot))); + uint32 alphaNumerator_ = uint32(alphaValues >> 160); + uint32 alphaDenominator_ = uint32(alphaValues >> 192); + + // Read lambda numerator and denominator + uint256 lambdaSlot = 25; + uint256 lambdaValues = uint256(vm.load(address(staking), bytes32(lambdaSlot))); + uint32 lambdaNumerator_ = uint32(lambdaValues >> 160); + uint32 lambdaDenominator_ = uint32(lambdaValues >> 192); + + return (alphaNumerator_, alphaDenominator_, lambdaNumerator_, lambdaDenominator_); + } + + // function _setStorage_ProtocolTaxAndCuration(uint32 curationPercentage, uint32 taxPercentage) private { + // bytes32 slot = bytes32(uint256(13)); + // uint256 curationOffset = 4; + // uint256 protocolTaxOffset = 8; + // bytes32 originalValue = vm.load(address(staking), slot); + + // bytes32 newProtocolTaxValue = bytes32( + // ((uint256(originalValue) & + // ~((0xFFFFFFFF << (8 * curationOffset)) | (0xFFFFFFFF << (8 * protocolTaxOffset)))) | + // (uint256(curationPercentage) << (8 * curationOffset))) | + // (uint256(taxPercentage) << (8 * protocolTaxOffset)) + // ); + // vm.store(address(staking), slot, newProtocolTaxValue); + + // (uint32 readCurationPercentage, uint32 readTaxPercentage) = _getStorage_ProtocolTaxAndCuration(); + // assertEq(readCurationPercentage, curationPercentage); + // } + + function _setStorage_ProtocolTaxAndCuration(uint32 curationPercentage, uint32 taxPercentage) internal { + bytes32 slot = bytes32(uint256(13)); + + // Offsets for the percentages + uint256 curationOffset = 32; // __DEPRECATED_curationPercentage (2nd uint32, bits 32-63) + uint256 protocolTaxOffset = 64; // __DEPRECATED_protocolPercentage (3rd uint32, bits 64-95) + + // Read the current slot value + uint256 originalValue = uint256(vm.load(address(staking), slot)); + + // Create masks to clear the specific bits for the two percentages + uint256 mask = ~(uint256(0xFFFFFFFF) << curationOffset) & ~(uint256(0xFFFFFFFF) << protocolTaxOffset); // Mask for curationPercentage // Mask for protocolTax + + // Clear the existing bits and set the new values + uint256 newSlotValue = (originalValue & mask) | + (uint256(curationPercentage) << curationOffset) | + (uint256(taxPercentage) << protocolTaxOffset); + + // Store the updated slot value + vm.store(address(staking), slot, bytes32(newSlotValue)); + + // Verify the values were set correctly + (uint32 readCurationPercentage, uint32 readTaxPercentage) = _getStorage_ProtocolTaxAndCuration(); + assertEq(readCurationPercentage, curationPercentage); + assertEq(readTaxPercentage, taxPercentage); + } + + function _getStorage_ProtocolTaxAndCuration() internal view returns (uint32, uint32) { + bytes32 slot = bytes32(uint256(13)); + bytes32 value = vm.load(address(staking), slot); + uint32 curationPercentage = uint32(uint256(value) >> 32); + uint32 taxPercentage = uint32(uint256(value) >> 64); + return (curationPercentage, taxPercentage); + } + + /* + * MISC: private functions to help with testing + */ + // use struct to avoid 'stack too deep' error + struct CalcValues_ThawRequestData { + uint256 tokensThawed; + uint256 tokensThawing; + uint256 sharesThawed; + uint256 sharesThawing; + ThawRequest[] thawRequestsFulfilledList; + bytes32[] thawRequestsFulfilledListIds; + uint256[] thawRequestsFulfilledListTokens; + } + + struct ThawingData { + uint256 tokensThawed; + uint256 tokensThawing; + uint256 sharesThawing; + uint256 thawRequestsFulfilled; + } + + struct Params_CalcThawRequestData { + IHorizonStakingTypes.ThawRequestType thawRequestType; + address serviceProvider; + address verifier; + address owner; + uint256 iterations; + bool delegation; + } + + function calcThawRequestData( + Params_CalcThawRequestData memory params + ) private view returns (CalcValues_ThawRequestData memory) { + ILinkedList.List memory thawRequestList = _getThawRequestList( + params.thawRequestType, + params.serviceProvider, + params.verifier, + params.owner + ); + if (thawRequestList.count == 0) { + return CalcValues_ThawRequestData(0, 0, 0, 0, new ThawRequest[](0), new bytes32[](0), new uint256[](0)); + } + + Provision memory prov = staking.getProvision(params.serviceProvider, params.verifier); + DelegationPool memory pool = staking.getDelegationPool(params.serviceProvider, params.verifier); + + uint256 tokensThawed = 0; + uint256 sharesThawed = 0; + uint256 tokensThawing = params.delegation ? pool.tokensThawing : prov.tokensThawing; + uint256 sharesThawing = params.delegation ? pool.sharesThawing : prov.sharesThawing; + uint256 thawRequestsFulfilled = 0; + + bytes32 thawRequestId = thawRequestList.head; + while (thawRequestId != bytes32(0) && (params.iterations == 0 || thawRequestsFulfilled < params.iterations)) { + ThawRequest memory thawRequest = _getThawRequest(params.thawRequestType, thawRequestId); + bool isThawRequestValid = thawRequest.thawingNonce == + (params.delegation ? pool.thawingNonce : prov.thawingNonce); + if (thawRequest.thawingUntil <= block.timestamp) { + thawRequestsFulfilled++; + if (isThawRequestValid) { + uint256 tokens = params.delegation + ? (thawRequest.shares * pool.tokensThawing) / pool.sharesThawing + : (thawRequest.shares * prov.tokensThawing) / prov.sharesThawing; + tokensThawed += tokens; + tokensThawing -= tokens; + sharesThawed += thawRequest.shares; + sharesThawing -= thawRequest.shares; + } + } else { + break; + } + thawRequestId = thawRequest.nextRequest; + } + + // we need to do a second pass because solidity doesnt allow dynamic arrays on memory + CalcValues_ThawRequestData memory thawRequestData; + thawRequestData.tokensThawed = tokensThawed; + thawRequestData.tokensThawing = tokensThawing; + thawRequestData.sharesThawed = sharesThawed; + thawRequestData.sharesThawing = sharesThawing; + thawRequestData.thawRequestsFulfilledList = new ThawRequest[](thawRequestsFulfilled); + thawRequestData.thawRequestsFulfilledListIds = new bytes32[](thawRequestsFulfilled); + thawRequestData.thawRequestsFulfilledListTokens = new uint256[](thawRequestsFulfilled); + uint256 i = 0; + thawRequestId = thawRequestList.head; + while (thawRequestId != bytes32(0) && (params.iterations == 0 || i < params.iterations)) { + ThawRequest memory thawRequest = _getThawRequest(params.thawRequestType, thawRequestId); + bool isThawRequestValid = thawRequest.thawingNonce == + (params.delegation ? pool.thawingNonce : prov.thawingNonce); + + if (thawRequest.thawingUntil <= block.timestamp) { + if (isThawRequestValid) { + thawRequestData.thawRequestsFulfilledListTokens[i] = params.delegation + ? (thawRequest.shares * pool.tokensThawing) / pool.sharesThawing + : (thawRequest.shares * prov.tokensThawing) / prov.sharesThawing; + } + thawRequestData.thawRequestsFulfilledListIds[i] = thawRequestId; + thawRequestData.thawRequestsFulfilledList[i] = _getThawRequest(params.thawRequestType, thawRequestId); + thawRequestId = thawRequestData.thawRequestsFulfilledList[i].nextRequest; + i++; + } else { + break; + } + thawRequestId = thawRequest.nextRequest; + } + + assertEq(thawRequestsFulfilled, thawRequestData.thawRequestsFulfilledList.length); + assertEq(thawRequestsFulfilled, thawRequestData.thawRequestsFulfilledListIds.length); + assertEq(thawRequestsFulfilled, thawRequestData.thawRequestsFulfilledListTokens.length); + + return thawRequestData; + } + + function _getThawRequestList( + IHorizonStakingTypes.ThawRequestType thawRequestType, + address serviceProvider, + address verifier, + address owner + ) private view returns (ILinkedList.List memory) { + return staking.getThawRequestList(thawRequestType, serviceProvider, verifier, owner); + } + + function _getThawRequest( + IHorizonStakingTypes.ThawRequestType thawRequestType, + bytes32 thawRequestId + ) private view returns (ThawRequest memory) { + return staking.getThawRequest(thawRequestType, thawRequestId); + } +} diff --git a/packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol b/packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol new file mode 100644 index 000000000..edd84f5cd --- /dev/null +++ b/packages/horizon/test/unit/shared/payments-escrow/PaymentsEscrowShared.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; +import { GraphBaseTest } from "../../GraphBase.t.sol"; + +abstract contract PaymentsEscrowSharedTest is GraphBaseTest { + /* + * MODIFIERS + */ + + modifier useGateway() { + vm.startPrank(users.gateway); + _; + vm.stopPrank(); + } + + /* + * HELPERS + */ + + function _depositTokens(address _collector, address _receiver, uint256 _tokens) internal { + (, address msgSender, ) = vm.readCallers(); + (uint256 escrowBalanceBefore, , ) = escrow.escrowAccounts(msgSender, _collector, _receiver); + token.approve(address(escrow), _tokens); + + vm.expectEmit(address(escrow)); + emit IPaymentsEscrow.Deposit(msgSender, _collector, _receiver, _tokens); + escrow.deposit(_collector, _receiver, _tokens); + + (uint256 escrowBalanceAfter, , ) = escrow.escrowAccounts(msgSender, _collector, _receiver); + assertEq(escrowBalanceAfter - _tokens, escrowBalanceBefore); + } + + function _depositToTokens(address _payer, address _collector, address _receiver, uint256 _tokens) internal { + (uint256 escrowBalanceBefore, , ) = escrow.escrowAccounts(_payer, _collector, _receiver); + token.approve(address(escrow), _tokens); + + vm.expectEmit(address(escrow)); + emit IPaymentsEscrow.Deposit(_payer, _collector, _receiver, _tokens); + escrow.depositTo(_payer, _collector, _receiver, _tokens); + + (uint256 escrowBalanceAfter, , ) = escrow.escrowAccounts(_payer, _collector, _receiver); + assertEq(escrowBalanceAfter - _tokens, escrowBalanceBefore); + } +} diff --git a/packages/horizon/test/unit/staking/HorizonStaking.t.sol b/packages/horizon/test/unit/staking/HorizonStaking.t.sol new file mode 100644 index 000000000..5dd4d6153 --- /dev/null +++ b/packages/horizon/test/unit/staking/HorizonStaking.t.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; +import { stdStorage, StdStorage } from "forge-std/Test.sol"; + +import { HorizonStakingSharedTest } from "../shared/horizon-staking/HorizonStakingShared.t.sol"; + +contract HorizonStakingTest is HorizonStakingSharedTest { + using stdStorage for StdStorage; + + /* + * MODIFIERS + */ + + modifier usePausedStaking() { + vm.startPrank(users.governor); + controller.setPaused(true); + vm.stopPrank(); + _; + } + + modifier useThawAndDeprovision(uint256 amount, uint64 thawingPeriod) { + vm.assume(amount > 0); + _thaw(users.indexer, subgraphDataServiceAddress, amount); + skip(thawingPeriod + 1); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + _; + } + + modifier useDelegation(uint256 delegationAmount) { + address msgSender; + (, msgSender, ) = vm.readCallers(); + vm.assume(delegationAmount >= MIN_DELEGATION); + vm.assume(delegationAmount <= MAX_STAKING_TOKENS); + vm.startPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + vm.startPrank(msgSender); + _; + } + + modifier useLockedVerifier(address verifier) { + address msgSender; + (, msgSender, ) = vm.readCallers(); + resetPrank(users.governor); + _setAllowedLockedVerifier(verifier, true); + resetPrank(msgSender); + _; + } + + modifier useDelegationSlashing() { + address msgSender; + (, msgSender, ) = vm.readCallers(); + resetPrank(users.governor); + staking.setDelegationSlashingEnabled(); + resetPrank(msgSender); + _; + } + + modifier useUndelegate(uint256 shares) { + resetPrank(users.delegator); + + DelegationPoolInternalTest memory pool = _getStorage_DelegationPoolInternal( + users.indexer, + subgraphDataServiceAddress, + false + ); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + + shares = bound(shares, 1, delegation.shares); + uint256 tokens = (shares * (pool.tokens - pool.tokensThawing)) / pool.shares; + if (shares < delegation.shares) { + uint256 remainingTokens = (shares * (pool.tokens - pool.tokensThawing - tokens)) / pool.shares; + vm.assume(remainingTokens >= MIN_DELEGATION); + } + + _undelegate(users.indexer, subgraphDataServiceAddress, shares); + _; + } +} diff --git a/packages/horizon/test/unit/staking/allocation/allocation.t.sol b/packages/horizon/test/unit/staking/allocation/allocation.t.sol new file mode 100644 index 000000000..5c9bb179d --- /dev/null +++ b/packages/horizon/test/unit/staking/allocation/allocation.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; + +contract HorizonStakingAllocationTest is HorizonStakingTest { + /* + * TESTS + */ + + function testAllocation_GetAllocationState_Active(uint256 tokens) public useIndexer useAllocation(tokens) { + IHorizonStakingExtension.AllocationState state = staking.getAllocationState(_allocationId); + assertEq(uint16(state), uint16(IHorizonStakingExtension.AllocationState.Active)); + } + + function testAllocation_GetAllocationState_Null() public view { + IHorizonStakingExtension.AllocationState state = staking.getAllocationState(_allocationId); + assertEq(uint16(state), uint16(IHorizonStakingExtension.AllocationState.Null)); + } + + function testAllocation_IsAllocation(uint256 tokens) public useIndexer useAllocation(tokens) { + bool isAllocation = staking.isAllocation(_allocationId); + assertTrue(isAllocation); + } + + function testAllocation_IsNotAllocation() public view { + bool isAllocation = staking.isAllocation(_allocationId); + assertFalse(isAllocation); + } +} diff --git a/packages/horizon/test/unit/staking/allocation/close.t.sol b/packages/horizon/test/unit/staking/allocation/close.t.sol new file mode 100644 index 000000000..cac390099 --- /dev/null +++ b/packages/horizon/test/unit/staking/allocation/close.t.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; + +contract HorizonStakingCloseAllocationTest is HorizonStakingTest { + using PPMMath for uint256; + + bytes32 internal constant _poi = keccak256("poi"); + + /* + * MODIFIERS + */ + + modifier useLegacyOperator() { + resetPrank(users.indexer); + _setOperator(subgraphDataServiceLegacyAddress, users.operator, true); + vm.startPrank(users.operator); + _; + vm.stopPrank(); + } + + /* + * TESTS + */ + + function testCloseAllocation(uint256 tokens) public useIndexer useAllocation(1 ether) { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + // Skip 15 epochs + vm.roll(15); + + _closeAllocation(_allocationId, _poi); + } + + function testCloseAllocation_Operator(uint256 tokens) public useLegacyOperator useAllocation(1 ether) { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + // Skip 15 epochs + vm.roll(15); + + _closeAllocation(_allocationId, _poi); + } + + function testCloseAllocation_WithBeneficiaryAddress(uint256 tokens) public useIndexer useAllocation(1 ether) { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + address beneficiary = makeAddr("beneficiary"); + _setStorage_RewardsDestination(users.indexer, beneficiary); + + // Skip 15 epochs + vm.roll(15); + + _closeAllocation(_allocationId, _poi); + } + + function testCloseAllocation_RevertWhen_NotActive() public { + vm.expectRevert("!active"); + staking.closeAllocation(_allocationId, _poi); + } + + function testCloseAllocation_RevertWhen_NotIndexer() public useIndexer useAllocation(1 ether) { + resetPrank(users.delegator); + vm.expectRevert("!auth"); + staking.closeAllocation(_allocationId, _poi); + } + + function testCloseAllocation_AfterMaxEpochs_AnyoneCanClose( + uint256 tokens + ) public useIndexer useAllocation(1 ether) { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + // Skip to over the max allocation epochs + vm.roll((MAX_ALLOCATION_EPOCHS + 1) * EPOCH_LENGTH + 1); + + resetPrank(users.delegator); + _closeAllocation(_allocationId, 0x0); + } + + function testCloseAllocation_RevertWhen_ZeroTokensNotAuthorized() public useIndexer useAllocation(1 ether) { + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, 100 ether, 0, 0); + + resetPrank(users.delegator); + vm.expectRevert("!auth"); + staking.closeAllocation(_allocationId, 0x0); + } + + function testCloseAllocation_WithDelegation( + uint256 tokens, + uint256 delegationTokens, + uint32 indexingRewardCut + ) public useIndexer useAllocation(1 ether) { + tokens = bound(tokens, 2, MAX_STAKING_TOKENS); + delegationTokens = bound(delegationTokens, 0, MAX_STAKING_TOKENS); + vm.assume(indexingRewardCut <= MAX_PPM); + + uint256 legacyAllocationTokens = tokens / 2; + uint256 provisionTokens = tokens - legacyAllocationTokens; + + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, provisionTokens, 0, 0); + _setStorage_DelegationPool(users.indexer, delegationTokens, indexingRewardCut, 0); + + // Skip 15 epochs + vm.roll(15); + + _closeAllocation(_allocationId, _poi); + } +} diff --git a/packages/horizon/test/unit/staking/allocation/collect.t.sol b/packages/horizon/test/unit/staking/allocation/collect.t.sol new file mode 100644 index 000000000..31a5138b2 --- /dev/null +++ b/packages/horizon/test/unit/staking/allocation/collect.t.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; +import { ExponentialRebates } from "../../../../contracts/staking/libraries/ExponentialRebates.sol"; +import { PPMMath } from "../../../../contracts/libraries/PPMMath.sol"; + +contract HorizonStakingCollectAllocationTest is HorizonStakingTest { + using PPMMath for uint256; + + /* + * TESTS + */ + + function testCollectAllocation_RevertWhen_InvalidAllocationId( + uint256 tokens + ) public useIndexer useAllocation(1 ether) { + vm.expectRevert("!alloc"); + staking.collect(tokens, address(0)); + } + + function testCollectAllocation_RevertWhen_Null(uint256 tokens) public { + vm.expectRevert("!collect"); + staking.collect(tokens, _allocationId); + } + + function testCollect_Tokens( + uint256 allocationTokens, + uint256 collectTokens, + uint256 curationTokens, + uint32 curationPercentage, + uint32 protocolTaxPercentage, + uint256 delegationTokens, + uint32 queryFeeCut + ) public useIndexer useRebateParameters useAllocation(allocationTokens) { + collectTokens = bound(collectTokens, 0, MAX_STAKING_TOKENS); + curationTokens = bound(curationTokens, 0, MAX_STAKING_TOKENS); + delegationTokens = bound(delegationTokens, 0, MAX_STAKING_TOKENS); + vm.assume(curationPercentage <= MAX_PPM); + vm.assume(protocolTaxPercentage <= MAX_PPM); + vm.assume(queryFeeCut <= MAX_PPM); + + resetPrank(users.indexer); + _setStorage_ProtocolTaxAndCuration(curationPercentage, protocolTaxPercentage); + console.log("queryFeeCut", queryFeeCut); + _setStorage_DelegationPool(users.indexer, delegationTokens, 0, queryFeeCut); + curation.signal(_subgraphDeploymentID, curationTokens); + + resetPrank(users.gateway); + approve(address(staking), collectTokens); + _collect(collectTokens, _allocationId); + } + + function testCollect_WithBeneficiaryAddress( + uint256 allocationTokens, + uint256 collectTokens + ) public useIndexer useRebateParameters useAllocation(allocationTokens) { + collectTokens = bound(collectTokens, 0, MAX_STAKING_TOKENS); + + address beneficiary = makeAddr("beneficiary"); + _setStorage_RewardsDestination(users.indexer, beneficiary); + + resetPrank(users.gateway); + approve(address(staking), collectTokens); + _collect(collectTokens, _allocationId); + + uint256 newRebates = ExponentialRebates.exponentialRebates( + collectTokens, + allocationTokens, + alphaNumerator, + alphaDenominator, + lambdaNumerator, + lambdaDenominator + ); + uint256 payment = newRebates > collectTokens ? collectTokens : newRebates; + + assertEq(token.balanceOf(beneficiary), payment); + } +} diff --git a/packages/horizon/test/unit/staking/delegation/addToPool.t.sol b/packages/horizon/test/unit/staking/delegation/addToPool.t.sol new file mode 100644 index 000000000..a070bd803 --- /dev/null +++ b/packages/horizon/test/unit/staking/delegation/addToPool.t.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingDelegationAddToPoolTest is HorizonStakingTest { + modifier useValidDelegationAmount(uint256 tokens) { + vm.assume(tokens <= MAX_STAKING_TOKENS); + vm.assume(tokens >= MIN_DELEGATION); + _; + } + + modifier useValidAddToPoolAmount(uint256 tokens) { + vm.assume(tokens > 0); + vm.assume(tokens <= MAX_STAKING_TOKENS); + _; + } + + /* + * TESTS + */ + + function test_Delegation_AddToPool_Verifier( + uint256 amount, + uint256 delegationAmount, + uint256 addToPoolAmount + ) + public + useIndexer + useProvision(amount, 0, 0) + useValidDelegationAmount(delegationAmount) + useValidAddToPoolAmount(addToPoolAmount) + { + delegationAmount = bound(delegationAmount, 1, MAX_STAKING_TOKENS); + + // Initialize delegation pool + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + + resetPrank(subgraphDataServiceAddress); + mint(subgraphDataServiceAddress, addToPoolAmount); + token.approve(address(staking), addToPoolAmount); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, addToPoolAmount); + } + + function test_Delegation_AddToPool_Payments( + uint256 amount, + uint256 delegationAmount + ) + public + useIndexer + useProvision(amount, 0, 0) + useValidDelegationAmount(delegationAmount) + useValidAddToPoolAmount(delegationAmount) + { + // Initialize delegation pool + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + + resetPrank(address(payments)); + mint(address(payments), delegationAmount); + token.approve(address(staking), delegationAmount); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, delegationAmount); + } + + function test_Delegation_AddToPool_RevertWhen_ZeroTokens( + uint256 amount + ) public useIndexer useProvision(amount, 0, 0) { + vm.startPrank(subgraphDataServiceAddress); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidZeroTokens.selector + ); + vm.expectRevert(expectedError); + staking.addToDelegationPool(users.indexer, subgraphDataServiceAddress, 0); + } + + function test_Delegation_AddToPool_RevertWhen_PoolHasNoShares( + uint256 amount + ) public useIndexer useProvision(amount, 0, 0) { + vm.startPrank(subgraphDataServiceAddress); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidDelegationPool.selector, + users.indexer, + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.addToDelegationPool(users.indexer, subgraphDataServiceAddress, 1); + } + + function test_Delegation_AddToPool_RevertWhen_NoProvision() public { + vm.startPrank(subgraphDataServiceAddress); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidProvision.selector, + users.indexer, + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.addToDelegationPool(users.indexer, subgraphDataServiceAddress, 1); + } + + function test_Delegation_AddToPool_WhenInvalidPool( + uint256 tokens, + uint256 delegationTokens, + uint256 recoverAmount + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + recoverAmount = bound(recoverAmount, 1, MAX_STAKING_TOKENS); + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + // create delegation pool + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // slash entire provision + pool + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // recover pool by adding tokens + resetPrank(users.indexer); + token.approve(address(staking), recoverAmount); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, recoverAmount); + } + + function test_Delegation_AddToPool_WhenInvalidPool_RevertWhen_PoolHasNoShares( + uint256 tokens, + uint256 delegationTokens, + uint256 recoverAmount + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + recoverAmount = bound(recoverAmount, 1, MAX_STAKING_TOKENS); + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + // create delegation pool + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // undelegate shares so we have thawing shares/tokens + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + resetPrank(users.delegator); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares); + + // slash entire provision + pool + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // addTokens + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidDelegationPool.selector, + users.indexer, + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.addToDelegationPool(users.indexer, subgraphDataServiceAddress, 1); + } +} diff --git a/packages/horizon/test/unit/staking/delegation/delegate.t.sol b/packages/horizon/test/unit/staking/delegation/delegate.t.sol new file mode 100644 index 000000000..bd5faac32 --- /dev/null +++ b/packages/horizon/test/unit/staking/delegation/delegate.t.sol @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingDelegateTest is HorizonStakingTest { + /* + * TESTS + */ + + function testDelegate_Tokens( + uint256 amount, + uint256 delegationAmount + ) public useIndexer useProvision(amount, 0, 0) useDelegation(delegationAmount) {} + + function testDelegate_Tokens_WhenThawing( + uint256 amount, + uint256 delegationAmount, + uint256 undelegateAmount + ) public useIndexer useProvision(amount, 0, 1 days) { + amount = bound(amount, 1 ether, MAX_STAKING_TOKENS); + // there is a min delegation amount of 1 ether after undelegating so we start with 1 ether + 1 wei + delegationAmount = bound(delegationAmount, 1 ether + 1 wei, MAX_STAKING_TOKENS); + + vm.startPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + undelegateAmount = bound(undelegateAmount, 1 wei, delegation.shares - 1 ether); + _undelegate(users.indexer, subgraphDataServiceAddress, undelegateAmount); + + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + } + + function testDelegate_Tokens_WhenAllThawing( + uint256 amount, + uint256 delegationAmount + ) public useIndexer useProvision(amount, 0, 1 days) { + delegationAmount = bound(delegationAmount, 1 ether, MAX_STAKING_TOKENS); + + vm.startPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares); + + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + } + + function testDelegate_RevertWhen_ZeroTokens(uint256 amount) public useIndexer useProvision(amount, 0, 0) { + vm.startPrank(users.delegator); + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroTokens()"); + vm.expectRevert(expectedError); + staking.delegate(users.indexer, subgraphDataServiceAddress, 0, 0); + } + + function testDelegate_RevertWhen_UnderMinDelegation( + uint256 amount, + uint256 delegationAmount + ) public useIndexer useProvision(amount, 0, 0) { + delegationAmount = bound(delegationAmount, 1, MIN_DELEGATION - 1); + vm.startPrank(users.delegator); + token.approve(address(staking), delegationAmount); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInsufficientDelegationTokens.selector, + delegationAmount, + MIN_DELEGATION + ); + vm.expectRevert(expectedError); + staking.delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + } + + function testDelegate_LegacySubgraphService(uint256 amount, uint256 delegationAmount) public useIndexer { + amount = bound(amount, 1 ether, MAX_STAKING_TOKENS); + delegationAmount = bound(delegationAmount, MIN_DELEGATION, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, amount, 0, 0); + + resetPrank(users.delegator); + _delegate(users.indexer, delegationAmount); + } + + function testDelegate_RevertWhen_InvalidPool( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // slash entire provision + pool + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // attempt to delegate to a pool on invalid state, should revert + resetPrank(users.delegator); + token.approve(address(staking), delegationTokens); + vm.expectRevert( + abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidDelegationPoolState.selector, + users.indexer, + subgraphDataServiceAddress + ) + ); + staking.delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + } + + function testDelegate_RevertWhen_ThawingShares_InvalidPool( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION * 2, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // undelegate some shares but not all + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares / 2); + + // slash entire provision + pool + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // attempt to delegate to a pool on invalid state, should revert + resetPrank(users.delegator); + token.approve(address(staking), delegationTokens); + vm.expectRevert( + abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidDelegationPoolState.selector, + users.indexer, + subgraphDataServiceAddress + ) + ); + staking.delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + } + + function testDelegate_AfterRecoveringPool( + uint256 tokens, + uint256 delegationTokens, + uint256 recoverAmount + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + recoverAmount = bound(recoverAmount, 1, MAX_STAKING_TOKENS); + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + // create delegation pool + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // slash entire provision + pool + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // recover pool by adding tokens + resetPrank(users.indexer); + token.approve(address(staking), recoverAmount); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, recoverAmount); + + // delegate to pool - should be allowed now + vm.assume(delegationTokens >= recoverAmount); // to avoid getting issued 0 shares + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + } + + function testDelegate_RevertWhen_ProvisionNotCreated(uint256 delegationAmount) public { + delegationAmount = bound(delegationAmount, MIN_DELEGATION, MAX_STAKING_TOKENS); + + vm.startPrank(users.delegator); + token.approve(address(staking), delegationAmount); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidProvision.selector, + users.indexer, + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + } +} diff --git a/packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol b/packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol new file mode 100644 index 000000000..e5ba447e4 --- /dev/null +++ b/packages/horizon/test/unit/staking/delegation/legacyWithdraw.t.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; +import { LinkedList } from "../../../../contracts/libraries/LinkedList.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingLegacyWithdrawDelegationTest is HorizonStakingTest { + /* + * MODIFIERS + */ + + modifier useDelegator() { + resetPrank(users.delegator); + _; + } + + /* + * HELPERS + */ + + function _setLegacyDelegation( + address _indexer, + address _delegator, + uint256 _shares, + uint256 __DEPRECATED_tokensLocked, + uint256 __DEPRECATED_tokensLockedUntil + ) public { + // Calculate the base storage slot for the serviceProvider in the mapping + bytes32 baseSlot = keccak256(abi.encode(_indexer, uint256(20))); + + // Calculate the slot for the delegator's DelegationInternal struct + bytes32 delegatorSlot = keccak256(abi.encode(_delegator, bytes32(uint256(baseSlot) + 4))); + + // Use vm.store to set each field of the struct + vm.store(address(staking), bytes32(uint256(delegatorSlot)), bytes32(_shares)); + vm.store(address(staking), bytes32(uint256(delegatorSlot) + 1), bytes32(__DEPRECATED_tokensLocked)); + vm.store(address(staking), bytes32(uint256(delegatorSlot) + 2), bytes32(__DEPRECATED_tokensLockedUntil)); + } + + /* + * ACTIONS + */ + + function _legacyWithdrawDelegated(address _indexer) internal { + (, address delegator, ) = vm.readCallers(); + IHorizonStakingTypes.DelegationPool memory pool = staking.getDelegationPool( + _indexer, + subgraphDataServiceLegacyAddress + ); + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + uint256 beforeDelegatorBalance = token.balanceOf(users.delegator); + + vm.expectEmit(address(staking)); + emit IHorizonStakingMain.StakeDelegatedWithdrawn(_indexer, delegator, pool.tokens); + staking.withdrawDelegated(users.indexer, address(0)); + + uint256 afterStakingBalance = token.balanceOf(address(staking)); + uint256 afterDelegatorBalance = token.balanceOf(users.delegator); + + assertEq(afterStakingBalance, beforeStakingBalance - pool.tokens); + assertEq(afterDelegatorBalance - pool.tokens, beforeDelegatorBalance); + + DelegationInternal memory delegation = _getStorage_Delegation( + _indexer, + subgraphDataServiceLegacyAddress, + delegator, + true + ); + assertEq(delegation.shares, 0); + assertEq(delegation.__DEPRECATED_tokensLocked, 0); + assertEq(delegation.__DEPRECATED_tokensLockedUntil, 0); + } + + /* + * TESTS + */ + + function testWithdraw_Legacy(uint256 tokensLocked) public useDelegator { + vm.assume(tokensLocked > 0); + + _setStorage_DelegationPool(users.indexer, tokensLocked, 0, 0); + _setLegacyDelegation(users.indexer, users.delegator, 0, tokensLocked, 1); + token.transfer(address(staking), tokensLocked); + + _legacyWithdrawDelegated(users.indexer); + } + + function testWithdraw_Legacy_RevertWhen_NoTokens() public useDelegator { + _setStorage_DelegationPool(users.indexer, 0, 0, 0); + _setLegacyDelegation(users.indexer, users.delegator, 0, 0, 0); + + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingNothingToWithdraw()"); + vm.expectRevert(expectedError); + staking.withdrawDelegated(users.indexer, address(0)); + } +} diff --git a/packages/horizon/test/unit/staking/delegation/redelegate.t.sol b/packages/horizon/test/unit/staking/delegation/redelegate.t.sol new file mode 100644 index 000000000..71afe7837 --- /dev/null +++ b/packages/horizon/test/unit/staking/delegation/redelegate.t.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingWithdrawDelegationTest is HorizonStakingTest { + /* + * HELPERS + */ + + function _setupNewIndexer(uint256 tokens) private returns (address) { + (, address msgSender, ) = vm.readCallers(); + + address newIndexer = createUser("newIndexer"); + vm.startPrank(newIndexer); + _createProvision(newIndexer, subgraphDataServiceAddress, tokens, 0, MAX_THAWING_PERIOD); + + vm.startPrank(msgSender); + return newIndexer; + } + + function _setupNewIndexerAndVerifier(uint256 tokens) private returns (address, address) { + (, address msgSender, ) = vm.readCallers(); + + address newIndexer = createUser("newIndexer"); + address newVerifier = makeAddr("newVerifier"); + vm.startPrank(newIndexer); + _createProvision(newIndexer, newVerifier, tokens, 0, MAX_THAWING_PERIOD); + + vm.startPrank(msgSender); + return (newIndexer, newVerifier); + } + + /* + * TESTS + */ + + function testRedelegate_MoveToNewServiceProvider( + uint256 delegationAmount, + uint256 withdrawShares + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(withdrawShares) + { + skip(MAX_THAWING_PERIOD + 1); + + // Setup new service provider + address newIndexer = _setupNewIndexer(10_000_000 ether); + _redelegate(users.indexer, subgraphDataServiceAddress, newIndexer, subgraphDataServiceAddress, 0, 0); + } + + function testRedelegate_MoveToNewServiceProviderAndNewVerifier( + uint256 delegationAmount, + uint256 withdrawShares + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(withdrawShares) + { + skip(MAX_THAWING_PERIOD + 1); + + // Setup new service provider + (address newIndexer, address newVerifier) = _setupNewIndexerAndVerifier(10_000_000 ether); + _redelegate(users.indexer, subgraphDataServiceAddress, newIndexer, newVerifier, 0, 0); + } + + function testRedelegate_RevertWhen_VerifierZeroAddress( + uint256 delegationAmount + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(delegationAmount) + { + skip(MAX_THAWING_PERIOD + 1); + + // Setup new service provider + address newIndexer = _setupNewIndexer(10_000_000 ether); + vm.expectRevert(abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingInvalidVerifierZeroAddress.selector)); + staking.redelegate(users.indexer, subgraphDataServiceAddress, newIndexer, address(0), 0, 0); + } + + function testRedelegate_RevertWhen_ServiceProviderZeroAddress( + uint256 delegationAmount + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(delegationAmount) + { + skip(MAX_THAWING_PERIOD + 1); + + // Setup new verifier + address newVerifier = makeAddr("newVerifier"); + vm.expectRevert( + abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingInvalidServiceProviderZeroAddress.selector) + ); + staking.redelegate(users.indexer, subgraphDataServiceAddress, address(0), newVerifier, 0, 0); + } + + function testRedelegate_MoveZeroTokensToNewServiceProviderAndVerifier( + uint256 delegationAmount, + uint256 withdrawShares + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(withdrawShares) + { + // Setup new service provider + (address newIndexer, address newVerifier) = _setupNewIndexerAndVerifier(10_000_000 ether); + + uint256 previousBalance = token.balanceOf(users.delegator); + _redelegate(users.indexer, subgraphDataServiceAddress, newIndexer, newVerifier, 0, 0); + + uint256 newBalance = token.balanceOf(users.delegator); + assertEq(newBalance, previousBalance); + + uint256 delegatedTokens = staking.getDelegatedTokensAvailable(newIndexer, newVerifier); + assertEq(delegatedTokens, 0); + } +} diff --git a/packages/horizon/test/unit/staking/delegation/undelegate.t.sol b/packages/horizon/test/unit/staking/delegation/undelegate.t.sol new file mode 100644 index 000000000..0f58ec8d5 --- /dev/null +++ b/packages/horizon/test/unit/staking/delegation/undelegate.t.sol @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingUndelegateTest is HorizonStakingTest { + /* + * TESTS + */ + + function testUndelegate_Tokens( + uint256 amount, + uint256 delegationAmount + ) public useIndexer useProvision(amount, 0, 0) useDelegation(delegationAmount) { + resetPrank(users.delegator); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares); + } + + function testMultipleUndelegate_Tokens( + uint256 amount, + uint256 delegationAmount, + uint256 undelegateSteps + ) public useIndexer useProvision(amount, 0, 0) { + undelegateSteps = bound(undelegateSteps, 1, 10); + delegationAmount = bound(delegationAmount, MIN_DELEGATION * undelegateSteps, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationAmount, 0); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + + uint256 undelegateAmount = delegation.shares / undelegateSteps; + for (uint i = 0; i < undelegateSteps - 1; i++) { + _undelegate(users.indexer, subgraphDataServiceAddress, undelegateAmount); + } + + delegation = _getStorage_Delegation(users.indexer, subgraphDataServiceAddress, users.delegator, false); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares); + } + + function testUndelegate_RevertWhen_InsuficientTokens( + uint256 amount, + uint256 delegationAmount, + uint256 undelegateAmount + ) public useIndexer useProvision(amount, 0, 0) useDelegation(delegationAmount) { + undelegateAmount = bound(undelegateAmount, 1, delegationAmount); + resetPrank(users.delegator); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + undelegateAmount = bound(undelegateAmount, delegation.shares - MIN_DELEGATION + 1, delegation.shares - 1); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInsufficientTokens.selector, + delegation.shares - undelegateAmount, + MIN_DELEGATION + ); + vm.expectRevert(expectedError); + staking.undelegate(users.indexer, subgraphDataServiceAddress, undelegateAmount); + } + + function testUndelegate_RevertWhen_TooManyUndelegations() + public + useIndexer + useProvision(1000 ether, 0, 0) + useDelegation(10000 ether) + { + resetPrank(users.delegator); + + for (uint i = 0; i < MAX_THAW_REQUESTS; i++) { + _undelegate(users.indexer, subgraphDataServiceAddress, 1 ether); + } + + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingTooManyThawRequests()"); + vm.expectRevert(expectedError); + staking.undelegate(users.indexer, subgraphDataServiceAddress, 1 ether); + } + + function testUndelegate_RevertWhen_ZeroShares( + uint256 amount, + uint256 delegationAmount + ) public useIndexer useProvision(amount, 0, 0) useDelegation(delegationAmount) { + resetPrank(users.delegator); + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroShares()"); + vm.expectRevert(expectedError); + staking.undelegate(users.indexer, subgraphDataServiceAddress, 0); + } + + function testUndelegate_RevertWhen_OverShares( + uint256 amount, + uint256 delegationAmount, + uint256 overDelegationShares + ) public useIndexer useProvision(amount, 0, 0) useDelegation(delegationAmount) { + resetPrank(users.delegator); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + overDelegationShares = bound(overDelegationShares, delegation.shares + 1, MAX_STAKING_TOKENS + 1); + + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInsufficientShares(uint256,uint256)", + delegation.shares, + overDelegationShares + ); + vm.expectRevert(expectedError); + staking.undelegate(users.indexer, subgraphDataServiceAddress, overDelegationShares); + } + + function testUndelegate_LegacySubgraphService(uint256 amount, uint256 delegationAmount) public useIndexer { + amount = bound(amount, 1, MAX_STAKING_TOKENS); + delegationAmount = bound(delegationAmount, MIN_DELEGATION, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, amount, 0, 0); + + resetPrank(users.delegator); + _delegate(users.indexer, delegationAmount); + + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + true + ); + _undelegate(users.indexer, delegation.shares); + } + + function testUndelegate_RevertWhen_InvalidPool( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // slash all of the provision + delegation + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // attempt to undelegate - should revert + resetPrank(users.delegator); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + vm.expectRevert( + abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidDelegationPoolState.selector, + users.indexer, + subgraphDataServiceAddress + ) + ); + staking.undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares); + } + + function testUndelegate_AfterRecoveringPool( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, 0, 0) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + // delegate + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // slash all of the provision + delegation + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // recover the delegation pool + resetPrank(users.indexer); + token.approve(address(staking), delegationTokens); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, delegationTokens); + + // undelegate -- should now work + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + resetPrank(users.delegator); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares); + } + + function testUndelegate_ThawingShares_AfterRecoveringPool() + public + useIndexer + useProvision(MAX_STAKING_TOKENS, 0, 0) + useDelegationSlashing + { + uint256 delegationTokens = MAX_STAKING_TOKENS / 10; + + // delegate + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // undelegate half shares so we have some thawing shares/tokens + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + resetPrank(users.delegator); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares / 2); + + // slash all of the provision + delegation + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, MAX_STAKING_TOKENS + delegationTokens, 0); + + // recover the delegation pool + resetPrank(users.indexer); + token.approve(address(staking), delegationTokens); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, delegationTokens); + + // undelegate the rest + resetPrank(users.delegator); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares - delegation.shares / 2); + } +} diff --git a/packages/horizon/test/unit/staking/delegation/withdraw.t.sol b/packages/horizon/test/unit/staking/delegation/withdraw.t.sol new file mode 100644 index 000000000..948961591 --- /dev/null +++ b/packages/horizon/test/unit/staking/delegation/withdraw.t.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingWithdrawDelegationTest is HorizonStakingTest { + /* + * TESTS + */ + + function testWithdrawDelegation_Tokens( + uint256 delegationAmount, + uint256 withdrawShares + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(withdrawShares) + { + ILinkedList.List memory thawingRequests = staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Delegation, + users.indexer, + subgraphDataServiceAddress, + users.delegator + ); + ThawRequest memory thawRequest = staking.getThawRequest( + IHorizonStakingTypes.ThawRequestType.Delegation, + thawingRequests.tail + ); + + skip(thawRequest.thawingUntil + 1); + + _withdrawDelegated(users.indexer, subgraphDataServiceAddress, 0); + } + + function testWithdrawDelegation_RevertWhen_NotThawing( + uint256 delegationAmount + ) public useIndexer useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) useDelegation(delegationAmount) { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingNothingThawing()"); + vm.expectRevert(expectedError); + staking.withdrawDelegated(users.indexer, subgraphDataServiceAddress, 0); + } + + function testWithdrawDelegation_ZeroTokens( + uint256 delegationAmount + ) + public + useIndexer + useProvision(10_000_000 ether, 0, MAX_THAWING_PERIOD) + useDelegation(delegationAmount) + useUndelegate(delegationAmount) + { + uint256 previousBalance = token.balanceOf(users.delegator); + _withdrawDelegated(users.indexer, subgraphDataServiceAddress, 0); + + // Nothing changed since thawing period hasn't finished + uint256 newBalance = token.balanceOf(users.delegator); + assertEq(newBalance, previousBalance); + } + + function testWithdrawDelegation_LegacySubgraphService(uint256 delegationAmount) public useIndexer { + delegationAmount = bound(delegationAmount, MIN_DELEGATION, MAX_STAKING_TOKENS); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, 10_000_000 ether, 0, MAX_THAWING_PERIOD); + + resetPrank(users.delegator); + _delegate(users.indexer, delegationAmount); + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + true + ); + _undelegate(users.indexer, delegation.shares); + + ILinkedList.List memory thawingRequests = staking.getThawRequestList( + IHorizonStakingTypes.ThawRequestType.Delegation, + users.indexer, + subgraphDataServiceLegacyAddress, + users.delegator + ); + ThawRequest memory thawRequest = staking.getThawRequest( + IHorizonStakingTypes.ThawRequestType.Delegation, + thawingRequests.tail + ); + + skip(thawRequest.thawingUntil + 1); + + _withdrawDelegated(users.indexer, subgraphDataServiceLegacyAddress, 0); + } + + function testWithdrawDelegation_RevertWhen_InvalidPool( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, 0, MAX_THAWING_PERIOD) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION * 2, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // undelegate some shares + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares / 2); + + // slash all of the provision + delegation + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // fast forward in time and attempt to withdraw + skip(MAX_THAWING_PERIOD + 1); + resetPrank(users.delegator); + vm.expectRevert( + abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidDelegationPoolState.selector, + users.indexer, + subgraphDataServiceAddress + ) + ); + staking.withdrawDelegated(users.indexer, subgraphDataServiceAddress, 0); + } + + function testWithdrawDelegation_AfterRecoveringPool( + uint256 tokens + ) public useIndexer useProvision(tokens, 0, MAX_THAWING_PERIOD) useDelegationSlashing { + uint256 delegationTokens = MAX_STAKING_TOKENS / 10; + + // delegate + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // undelegate some shares + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares / 2); + + // slash all of the provision + delegation + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + + // recover the delegation pool + resetPrank(users.indexer); + token.approve(address(staking), delegationTokens); + _addToDelegationPool(users.indexer, subgraphDataServiceAddress, delegationTokens); + + // fast forward in time and withdraw - this withdraw will net 0 tokens + skip(MAX_THAWING_PERIOD + 1); + resetPrank(users.delegator); + _withdrawDelegated(users.indexer, subgraphDataServiceAddress, 0); + } +} diff --git a/packages/horizon/test/unit/staking/governance/governance.t.sol b/packages/horizon/test/unit/staking/governance/governance.t.sol new file mode 100644 index 000000000..2fe4a46da --- /dev/null +++ b/packages/horizon/test/unit/staking/governance/governance.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingGovernanceTest is HorizonStakingTest { + /* + * MODIFIERS + */ + + modifier useGovernor() { + vm.startPrank(users.governor); + _; + } + + /* + * TESTS + */ + + function testGovernance_SetAllowedLockedVerifier() public useGovernor { + _setAllowedLockedVerifier(subgraphDataServiceAddress, true); + } + + function testGovernance_RevertWhen_SetAllowedLockedVerifier_NotGovernor() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature("ManagedOnlyGovernor()"); + vm.expectRevert(expectedError); + staking.setAllowedLockedVerifier(subgraphDataServiceAddress, true); + } + + function testGovernance_SetDelgationSlashingEnabled() public useGovernor { + _setDelegationSlashingEnabled(); + } + + function testGovernance_SetDelgationSlashing_NotGovernor() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature("ManagedOnlyGovernor()"); + vm.expectRevert(expectedError); + staking.setDelegationSlashingEnabled(); + } + + function testGovernance_ClearThawingPeriod(uint32 thawingPeriod) public useGovernor { + // simulate previous thawing period + _setStorage_DeprecatedThawingPeriod(thawingPeriod); + + _clearThawingPeriod(); + } + + function testGovernance_ClearThawingPeriod_NotGovernor() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature("ManagedOnlyGovernor()"); + vm.expectRevert(expectedError); + staking.clearThawingPeriod(); + } + + function testGovernance__SetMaxThawingPeriod(uint64 maxThawingPeriod) public useGovernor { + _setMaxThawingPeriod(maxThawingPeriod); + } + + function testGovernance__SetMaxThawingPeriod_NotGovernor() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature("ManagedOnlyGovernor()"); + vm.expectRevert(expectedError); + staking.setMaxThawingPeriod(MAX_THAWING_PERIOD); + } +} diff --git a/packages/horizon/test/unit/staking/operator/locked.t.sol b/packages/horizon/test/unit/staking/operator/locked.t.sol new file mode 100644 index 000000000..0568e8cb3 --- /dev/null +++ b/packages/horizon/test/unit/staking/operator/locked.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingOperatorLockedTest is HorizonStakingTest { + /* + * TESTS + */ + + function testOperatorLocked_Set() public useIndexer useLockedVerifier(subgraphDataServiceAddress) { + _setOperatorLocked(subgraphDataServiceAddress, users.operator, true); + } + + function testOperatorLocked_RevertWhen_VerifierNotAllowed() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingVerifierNotAllowed(address)", + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.setOperatorLocked(subgraphDataServiceAddress, users.operator, true); + } + + function testOperatorLocked_RevertWhen_CallerIsServiceProvider() + public + useIndexer + useLockedVerifier(subgraphDataServiceAddress) + { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingCallerIsServiceProvider()"); + vm.expectRevert(expectedError); + staking.setOperatorLocked(subgraphDataServiceAddress, users.indexer, true); + } + + function testOperatorLocked_SetLegacySubgraphService() + public + useIndexer + useLockedVerifier(subgraphDataServiceLegacyAddress) + { + _setOperatorLocked(subgraphDataServiceLegacyAddress, users.operator, true); + } +} diff --git a/packages/horizon/test/unit/staking/operator/operator.t.sol b/packages/horizon/test/unit/staking/operator/operator.t.sol new file mode 100644 index 000000000..664414047 --- /dev/null +++ b/packages/horizon/test/unit/staking/operator/operator.t.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingOperatorTest is HorizonStakingTest { + /* + * TESTS + */ + + function testOperator_SetOperator() public useIndexer { + _setOperator(subgraphDataServiceAddress, users.operator, true); + } + + function testOperator_RevertWhen_CallerIsServiceProvider() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingCallerIsServiceProvider()"); + vm.expectRevert(expectedError); + staking.setOperator(subgraphDataServiceAddress, users.indexer, true); + } + + function testOperator_RemoveOperator() public useIndexer { + _setOperator(subgraphDataServiceAddress, users.operator, true); + _setOperator(subgraphDataServiceAddress, users.operator, false); + } +} diff --git a/packages/horizon/test/unit/staking/provision/deprovision.t.sol b/packages/horizon/test/unit/staking/provision/deprovision.t.sol new file mode 100644 index 000000000..4fa97da6c --- /dev/null +++ b/packages/horizon/test/unit/staking/provision/deprovision.t.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingDeprovisionTest is HorizonStakingTest { + /* + * TESTS + */ + + function testDeprovision_AllRequests( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 thawCount, + uint256 deprovisionCount + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + thawCount = bound(thawCount, 1, 100); + deprovisionCount = bound(deprovisionCount, 0, thawCount); + vm.assume(amount >= thawCount); // ensure the provision has at least 1 token for each thaw step + uint256 individualThawAmount = amount / thawCount; + + for (uint i = 0; i < thawCount; i++) { + _thaw(users.indexer, subgraphDataServiceAddress, individualThawAmount); + } + + skip(thawingPeriod + 1); + + _deprovision(users.indexer, subgraphDataServiceAddress, deprovisionCount); + } + + function testDeprovision_ThawedRequests( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 thawCount + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + thawCount = bound(thawCount, 2, 100); + vm.assume(amount >= thawCount); // ensure the provision has at least 1 token for each thaw step + uint256 individualThawAmount = amount / thawCount; + + for (uint i = 0; i < thawCount / 2; i++) { + _thaw(users.indexer, subgraphDataServiceAddress, individualThawAmount); + } + + skip(thawingPeriod + 1); + + for (uint i = 0; i < thawCount / 2; i++) { + _thaw(users.indexer, subgraphDataServiceAddress, individualThawAmount); + } + + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + } + + function testDeprovision_OperatorMovingTokens( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) useOperator { + _thaw(users.indexer, subgraphDataServiceAddress, amount); + skip(thawingPeriod + 1); + + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + } + + function testDeprovision_RevertWhen_OperatorNotAuthorized( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + _thaw(users.indexer, subgraphDataServiceAddress, amount); + + vm.startPrank(users.operator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + users.operator + ); + vm.expectRevert(expectedError); + staking.deprovision(users.indexer, subgraphDataServiceAddress, 0); + } + + function testDeprovision_RevertWhen_NoThawingTokens( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingNothingThawing()"); + vm.expectRevert(expectedError); + staking.deprovision(users.indexer, subgraphDataServiceAddress, 0); + } + + function testDeprovision_StillThawing( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + vm.assume(thawingPeriod > 0); + + _thaw(users.indexer, subgraphDataServiceAddress, amount); + + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + } + + function testDeprovision_AfterProvisionFullySlashed( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + // thaw some funds so there are some shares and tokens thawing + thawAmount = bound(thawAmount, 1, amount); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // slash all of it + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, amount, 0); + + // now deprovision + resetPrank(users.indexer); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + } + + function testDeprovision_AfterResetingThawingPool( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + // thaw some funds so there are some shares and tokens thawing + thawAmount = bound(thawAmount, 1, amount); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // slash all of it + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, amount, 0); + + // put some funds back in + resetPrank(users.indexer); + _stake(amount); + _addToProvision(users.indexer, subgraphDataServiceAddress, amount); + + // thaw some funds again + resetPrank(users.indexer); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // now deprovision + resetPrank(users.indexer); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + } +} diff --git a/packages/horizon/test/unit/staking/provision/locked.t.sol b/packages/horizon/test/unit/staking/provision/locked.t.sol new file mode 100644 index 000000000..bc44a32f1 --- /dev/null +++ b/packages/horizon/test/unit/staking/provision/locked.t.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingProvisionLockedTest is HorizonStakingTest { + /* + * TESTS + */ + + function testProvisionLocked_Create( + uint256 amount + ) public useIndexer useStake(amount) useLockedVerifier(subgraphDataServiceAddress) { + uint256 provisionTokens = staking.getProviderTokensAvailable(users.indexer, subgraphDataServiceAddress); + assertEq(provisionTokens, 0); + + _setOperatorLocked(subgraphDataServiceAddress, users.operator, true); + + vm.startPrank(users.operator); + _provisionLocked(users.indexer, subgraphDataServiceAddress, amount, MAX_PPM, MAX_THAWING_PERIOD); + + provisionTokens = staking.getProviderTokensAvailable(users.indexer, subgraphDataServiceAddress); + assertEq(provisionTokens, amount); + } + + function testProvisionLocked_RevertWhen_VerifierNotAllowed( + uint256 amount + ) public useIndexer useStake(amount) useLockedVerifier(subgraphDataServiceAddress) { + uint256 provisionTokens = staking.getProviderTokensAvailable(users.indexer, subgraphDataServiceAddress); + assertEq(provisionTokens, 0); + + // Set operator + _setOperatorLocked(subgraphDataServiceAddress, users.operator, true); + + // Disable locked verifier + vm.startPrank(users.governor); + _setAllowedLockedVerifier(subgraphDataServiceAddress, false); + + vm.startPrank(users.operator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingVerifierNotAllowed(address)", + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.provisionLocked(users.indexer, subgraphDataServiceAddress, amount, MAX_PPM, MAX_THAWING_PERIOD); + } + + function testProvisionLocked_RevertWhen_OperatorNotAllowed( + uint256 amount + ) public useIndexer useStake(amount) useLockedVerifier(subgraphDataServiceAddress) { + uint256 provisionTokens = staking.getProviderTokensAvailable(users.indexer, subgraphDataServiceAddress); + assertEq(provisionTokens, 0); + + vm.startPrank(users.operator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + users.operator + ); + vm.expectRevert(expectedError); + staking.provisionLocked(users.indexer, subgraphDataServiceAddress, amount, MAX_PPM, MAX_THAWING_PERIOD); + } +} diff --git a/packages/horizon/test/unit/staking/provision/parameters.t.sol b/packages/horizon/test/unit/staking/provision/parameters.t.sol new file mode 100644 index 000000000..f7c74f508 --- /dev/null +++ b/packages/horizon/test/unit/staking/provision/parameters.t.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; + +contract HorizonStakingProvisionParametersTest is HorizonStakingTest { + /* + * MODIFIERS + */ + + modifier useValidParameters(uint32 maxVerifierCut, uint64 thawingPeriod) { + vm.assume(maxVerifierCut <= MAX_PPM); + vm.assume(thawingPeriod <= MAX_THAWING_PERIOD); + _; + } + + /* + * TESTS + */ + + function test_ProvisionParametersSet( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, 0, 0) useValidParameters(maxVerifierCut, thawingPeriod) { + _setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + } + + function test_ProvisionParametersSet_RevertWhen_ProvisionNotExists( + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useValidParameters(maxVerifierCut, thawingPeriod) { + vm.expectRevert( + abi.encodeWithSignature( + "HorizonStakingInvalidProvision(address,address)", + users.indexer, + subgraphDataServiceAddress + ) + ); + staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + } + + function test_ProvisionParametersSet_RevertWhen_CallerNotAuthorized( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + vm.startPrank(msg.sender); // stop impersonating the indexer + vm.expectRevert( + abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + msg.sender + ) + ); + staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + vm.stopPrank(); + } + + function test_ProvisionParametersSet_RevertWhen_ProtocolPaused( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) usePausedStaking { + vm.expectRevert(abi.encodeWithSignature("ManagedIsPaused()")); + staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + } + + function test_ProvisionParametersSet_MaxMaxThawingPeriodChanged( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer { + vm.assume(amount > 0); + vm.assume(amount <= MAX_STAKING_TOKENS); + vm.assume(maxVerifierCut <= MAX_PPM); + + // create provision with initial parameters + uint32 initialMaxVerifierCut = 1000; + uint64 initialThawingPeriod = 14 days; // Max thawing period is 28 days + _createProvision( + users.indexer, + subgraphDataServiceAddress, + amount, + initialMaxVerifierCut, + initialThawingPeriod + ); + + // change the max thawing period allowed so that the initial thawing period is not valid anymore + uint64 newMaxThawingPeriod = 7 days; + resetPrank(users.governor); + _setMaxThawingPeriod(newMaxThawingPeriod); + + // set the verifier cut to a new value - keep the thawing period the same, it should be allowed + resetPrank(users.indexer); + _setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, initialThawingPeriod); + + // now try to change the thawing period to a new value that is invalid + vm.assume(thawingPeriod > initialThawingPeriod); + vm.expectRevert( + abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidThawingPeriod.selector, + thawingPeriod, + newMaxThawingPeriod + ) + ); + staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + } + + function test_ProvisionParametersAccept( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + _setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + + vm.startPrank(subgraphDataServiceAddress); + _acceptProvisionParameters(users.indexer); + vm.stopPrank(); + } + + function test_ProvisionParametersAccept_SameParameters( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + _setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + + vm.startPrank(subgraphDataServiceAddress); + _acceptProvisionParameters(users.indexer); + _acceptProvisionParameters(users.indexer); + vm.stopPrank(); + } + + function test_ProvisionParameters_RevertIf_InvalidMaxVerifierCut( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + maxVerifierCut = uint32(bound(maxVerifierCut, MAX_PPM + 1, type(uint32).max)); + vm.assume(thawingPeriod <= MAX_THAWING_PERIOD); + vm.expectRevert( + abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingInvalidMaxVerifierCut.selector, maxVerifierCut) + ); + staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + } + + function test_ProvisionParameters_RevertIf_InvalidThawingPeriod( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + vm.assume(maxVerifierCut <= MAX_PPM); + thawingPeriod = uint64(bound(thawingPeriod, MAX_THAWING_PERIOD + 1, type(uint64).max)); + vm.expectRevert( + abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingInvalidThawingPeriod.selector, + thawingPeriod, + MAX_THAWING_PERIOD + ) + ); + staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod); + } + + function test_ProvisionParametersAccept_RevertWhen_ProvisionNotExists() public useIndexer { + resetPrank(subgraphDataServiceAddress); + vm.expectRevert( + abi.encodeWithSignature( + "HorizonStakingInvalidProvision(address,address)", + users.indexer, + subgraphDataServiceAddress + ) + ); + staking.acceptProvisionParameters(users.indexer); + } +} diff --git a/packages/horizon/test/unit/staking/provision/provision.t.sol b/packages/horizon/test/unit/staking/provision/provision.t.sol new file mode 100644 index 000000000..c87e13a45 --- /dev/null +++ b/packages/horizon/test/unit/staking/provision/provision.t.sol @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingProvisionTest is HorizonStakingTest { + /* + * TESTS + */ + + function testProvision_Create(uint256 tokens, uint32 maxVerifierCut, uint64 thawingPeriod) public useIndexer { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + maxVerifierCut = uint32(bound(maxVerifierCut, 0, MAX_PPM)); + thawingPeriod = uint32(bound(thawingPeriod, 0, MAX_THAWING_PERIOD)); + + _createProvision(users.indexer, subgraphDataServiceAddress, tokens, maxVerifierCut, thawingPeriod); + } + + function testProvision_RevertWhen_ZeroTokens() public useIndexer useStake(1000 ether) { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroTokens()"); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, 0, 0, 0); + } + + function testProvision_RevertWhen_MaxVerifierCutTooHigh( + uint256 amount, + uint32 maxVerifierCut + ) public useIndexer useStake(amount) { + vm.assume(maxVerifierCut > MAX_PPM); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInvalidMaxVerifierCut(uint32)", + maxVerifierCut + ); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, amount, maxVerifierCut, 0); + } + + function testProvision_RevertWhen_ThawingPeriodTooHigh( + uint256 amount, + uint64 thawingPeriod + ) public useIndexer useStake(amount) { + vm.assume(thawingPeriod > MAX_THAWING_PERIOD); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInvalidThawingPeriod(uint64,uint64)", + thawingPeriod, + MAX_THAWING_PERIOD + ); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, amount, 0, thawingPeriod); + } + + function testProvision_RevertWhen_ThereIsNoIdleStake( + uint256 amount, + uint256 provisionTokens + ) public useIndexer useStake(amount) { + vm.assume(provisionTokens > amount); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInsufficientIdleStake(uint256,uint256)", + provisionTokens, + amount + ); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, provisionTokens, 0, 0); + } + + function testProvision_RevertWhen_AlreadyExists( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount / 2, maxVerifierCut, thawingPeriod) { + resetPrank(users.indexer); + + token.approve(address(staking), amount / 2); + _stake(amount / 2); + + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingProvisionAlreadyExists()"); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, amount / 2, maxVerifierCut, thawingPeriod); + } + + function testProvision_RevertWhen_OperatorNotAuthorized( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + vm.startPrank(users.operator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + users.operator + ); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, amount, maxVerifierCut, thawingPeriod); + } + + function testProvision_RevertWhen_VerifierIsNotSubgraphDataServiceDuringTransitionPeriod( + uint256 amount + ) public useIndexer useStake(amount) { + // simulate the transition period + _setStorage_DeprecatedThawingPeriod(THAWING_PERIOD_IN_BLOCKS); + + // oddly we use subgraphDataServiceLegacyAddress as the subgraph service address + // so subgraphDataServiceAddress is not the subgraph service ¯\_(ツ)_/¯ + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInvalidVerifier(address)", + subgraphDataServiceAddress + ); + vm.expectRevert(expectedError); + staking.provision(users.indexer, subgraphDataServiceAddress, amount, 0, 0); + } + + function testProvision_AddTokensToProvision( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Add more tokens to the provision + _stakeTo(users.indexer, tokensToAdd); + _addToProvision(users.indexer, subgraphDataServiceAddress, tokensToAdd); + } + + function testProvision_OperatorAddTokensToProvision( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) useOperator { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Add more tokens to the provision + _stakeTo(users.indexer, tokensToAdd); + _addToProvision(users.indexer, subgraphDataServiceAddress, tokensToAdd); + } + + function testProvision_AddTokensToProvision_RevertWhen_NotAuthorized( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Add more tokens to the provision + _stakeTo(users.indexer, tokensToAdd); + + // use delegator as a non authorized operator + vm.startPrank(users.delegator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + users.delegator + ); + vm.expectRevert(expectedError); + staking.addToProvision(users.indexer, subgraphDataServiceAddress, amount); + } + + function testProvision_StakeToProvision( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Add more tokens to the provision + _stakeToProvision(users.indexer, subgraphDataServiceAddress, tokensToAdd); + } + + function testProvision_Operator_StakeToProvision( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) useOperator { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Add more tokens to the provision + _stakeToProvision(users.indexer, subgraphDataServiceAddress, tokensToAdd); + } + + function testProvision_Verifier_StakeToProvision( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Ensure the verifier has enough tokens to then stake to the provision + token.transfer(subgraphDataServiceAddress, tokensToAdd); + + // Add more tokens to the provision + resetPrank(subgraphDataServiceAddress); + _stakeToProvision(users.indexer, subgraphDataServiceAddress, tokensToAdd); + } + + function testProvision_StakeToProvision_RevertWhen_NotAuthorized( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod, + uint256 tokensToAdd + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + tokensToAdd = bound(tokensToAdd, 1, MAX_STAKING_TOKENS); + + // Add more tokens to the provision + vm.startPrank(users.delegator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + users.delegator + ); + vm.expectRevert(expectedError); + staking.stakeToProvision(users.indexer, subgraphDataServiceAddress, tokensToAdd); + } +} diff --git a/packages/horizon/test/unit/staking/provision/reprovision.t.sol b/packages/horizon/test/unit/staking/provision/reprovision.t.sol new file mode 100644 index 000000000..be650019f --- /dev/null +++ b/packages/horizon/test/unit/staking/provision/reprovision.t.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingReprovisionTest is HorizonStakingTest { + /* + * VARIABLES + */ + + address private newDataService = makeAddr("newDataService"); + + /* + * TESTS + */ + + function testReprovision_MovingTokens( + uint64 thawingPeriod, + uint256 provisionAmount + ) public useIndexer useProvision(provisionAmount, 0, thawingPeriod) { + _thaw(users.indexer, subgraphDataServiceAddress, provisionAmount); + skip(thawingPeriod + 1); + + _createProvision(users.indexer, newDataService, 1 ether, 0, thawingPeriod); + + _reprovision(users.indexer, subgraphDataServiceAddress, newDataService, 0); + } + + function testReprovision_OperatorMovingTokens( + uint64 thawingPeriod, + uint256 provisionAmount + ) public useOperator useProvision(provisionAmount, 0, thawingPeriod) { + _thaw(users.indexer, subgraphDataServiceAddress, provisionAmount); + skip(thawingPeriod + 1); + + // Switch to indexer to set operator for new data service + vm.startPrank(users.indexer); + _setOperator(newDataService, users.operator, true); + + // Switch back to operator + vm.startPrank(users.operator); + _createProvision(users.indexer, newDataService, 1 ether, 0, thawingPeriod); + _reprovision(users.indexer, subgraphDataServiceAddress, newDataService, 0); + } + + function testReprovision_RevertWhen_OperatorNotAuthorizedForNewDataService( + uint256 provisionAmount + ) public useOperator useProvision(provisionAmount, 0, 0) { + _thaw(users.indexer, subgraphDataServiceAddress, provisionAmount); + + // Switch to indexer to create new provision + vm.startPrank(users.indexer); + _createProvision(users.indexer, newDataService, 1 ether, 0, 0); + + // Switch back to operator + vm.startPrank(users.operator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + newDataService, + users.operator + ); + vm.expectRevert(expectedError); + staking.reprovision(users.indexer, subgraphDataServiceAddress, newDataService, 0); + } + + function testReprovision_RevertWhen_NoThawingTokens(uint256 amount) public useIndexer useProvision(amount, 0, 0) { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingNothingThawing()"); + vm.expectRevert(expectedError); + staking.reprovision(users.indexer, subgraphDataServiceAddress, newDataService, 0); + } +} diff --git a/packages/horizon/test/unit/staking/provision/thaw.t.sol b/packages/horizon/test/unit/staking/provision/thaw.t.sol new file mode 100644 index 000000000..7beabd1ad --- /dev/null +++ b/packages/horizon/test/unit/staking/provision/thaw.t.sol @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingThawTest is HorizonStakingTest { + /* + * TESTS + */ + + function testThaw_Tokens( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + thawAmount = bound(thawAmount, 1, amount); + + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + function testThaw_MultipleRequests( + uint256 amount, + uint64 thawingPeriod, + uint256 thawCount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + thawCount = bound(thawCount, 1, 100); + vm.assume(amount >= thawCount); // ensure the provision has at least 1 token for each thaw step + uint256 individualThawAmount = amount / thawCount; + + for (uint i = 0; i < thawCount; i++) { + _thaw(users.indexer, subgraphDataServiceAddress, individualThawAmount); + } + } + + function testThaw_OperatorCanStartThawing( + uint256 amount, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, 0, thawingPeriod) useOperator { + _thaw(users.indexer, subgraphDataServiceAddress, amount); + } + + function testThaw_RevertWhen_OperatorNotAuthorized( + uint256 amount, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + vm.startPrank(users.operator); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingNotAuthorized(address,address,address)", + users.indexer, + subgraphDataServiceAddress, + users.operator + ); + vm.expectRevert(expectedError); + staking.thaw(users.indexer, subgraphDataServiceAddress, amount); + } + + function testThaw_RevertWhen_InsufficientTokensAvailable( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + vm.assume(thawAmount > amount); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInsufficientTokens(uint256,uint256)", + amount, + thawAmount + ); + vm.expectRevert(expectedError); + staking.thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + function testThaw_RevertWhen_OverMaxThawRequests() public useIndexer useProvision(10000 ether, 0, 0) { + uint256 thawAmount = 1 ether; + + for (uint256 i = 0; i < MAX_THAW_REQUESTS; i++) { + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingTooManyThawRequests()"); + vm.expectRevert(expectedError); + staking.thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + function testThaw_RevertWhen_ThawingZeroTokens( + uint256 amount, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + uint256 thawAmount = 0 ether; + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroTokens()"); + vm.expectRevert(expectedError); + staking.thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + function testThaw_RevertWhen_ProvisionFullySlashed( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + thawAmount = bound(thawAmount, 1, amount); + + // slash all of it + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, amount, 0); + + // Attempt to thaw on a provision that has been fully slashed + resetPrank(users.indexer); + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInsufficientTokens(uint256,uint256)", + 0, + thawAmount + ); + vm.expectRevert(expectedError); + staking.thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + function testThaw_AfterResetingThawingPool( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + // thaw some funds so there are some shares thawing and tokens thawing + thawAmount = bound(thawAmount, 1, amount); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // slash all of it + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, amount, 0); + + // put some funds back in + resetPrank(users.indexer); + _stake(amount); + _addToProvision(users.indexer, subgraphDataServiceAddress, amount); + + // we should be able to thaw again + resetPrank(users.indexer); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + function testThaw_GetThawedTokens( + uint256 amount, + uint64 thawingPeriod, + uint256 thawSteps + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + thawSteps = bound(thawSteps, 1, 10); + + uint256 thawAmount = amount / thawSteps; + vm.assume(thawAmount > 0); + for (uint256 i = 0; i < thawSteps; i++) { + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + } + + skip(thawingPeriod + 1); + + uint256 thawedTokens = staking.getThawedTokens( + ThawRequestType.Provision, + users.indexer, + subgraphDataServiceAddress, + users.indexer + ); + vm.assertEq(thawedTokens, thawAmount * thawSteps); + } + + function testThaw_GetThawedTokens_AfterProvisionFullySlashed( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + // thaw some funds so there are some shares thawing and tokens thawing + thawAmount = bound(thawAmount, 1, amount); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // skip to after the thawing period has passed + skip(thawingPeriod + 1); + + // slash all of it + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, amount, 0); + + // get the thawed tokens - should be zero now as the pool was reset + uint256 thawedTokens = staking.getThawedTokens( + ThawRequestType.Provision, + users.indexer, + subgraphDataServiceAddress, + users.indexer + ); + vm.assertEq(thawedTokens, 0); + } + + function testThaw_GetThawedTokens_AfterRecoveringProvision( + uint256 amount, + uint64 thawingPeriod, + uint256 thawAmount + ) public useIndexer useProvision(amount, 0, thawingPeriod) { + // thaw some funds so there are some shares thawing and tokens thawing + thawAmount = bound(thawAmount, 1, amount); + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // skip to after the thawing period has passed + skip(thawingPeriod + 1); + + // slash all of it + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, amount, 0); + + // get the thawed tokens - should be zero now as the pool was reset + uint256 thawedTokens = staking.getThawedTokens( + ThawRequestType.Provision, + users.indexer, + subgraphDataServiceAddress, + users.indexer + ); + vm.assertEq(thawedTokens, 0); + + // put some funds back in + resetPrank(users.indexer); + _stake(amount); + _addToProvision(users.indexer, subgraphDataServiceAddress, amount); + + // thaw some more funds + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + + // skip to after the thawing period has passed + skip(block.timestamp + thawingPeriod + 1); + + // get the thawed tokens - should be the amount we thawed + thawedTokens = staking.getThawedTokens( + ThawRequestType.Provision, + users.indexer, + subgraphDataServiceAddress, + users.indexer + ); + vm.assertEq(thawedTokens, thawAmount); + } +} diff --git a/packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol b/packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol new file mode 100644 index 000000000..9d6a87fc0 --- /dev/null +++ b/packages/horizon/test/unit/staking/serviceProvider/serviceProvider.t.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingServiceProviderTest is HorizonStakingTest { + /* + * TESTS + */ + + function testServiceProvider_GetProvider( + uint256 amount, + uint256 operatorAmount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + operatorAmount = bound(operatorAmount, 1, MAX_STAKING_TOKENS); + ServiceProvider memory sp = staking.getServiceProvider(users.indexer); + assertEq(sp.tokensStaked, amount); + assertEq(sp.tokensProvisioned, amount); + + _setOperator(subgraphDataServiceAddress, users.operator, true); + resetPrank(users.operator); + _stakeTo(users.indexer, operatorAmount); + sp = staking.getServiceProvider(users.indexer); + assertEq(sp.tokensStaked, amount + operatorAmount); + assertEq(sp.tokensProvisioned, amount); + } + + function testServiceProvider_SetDelegationFeeCut(uint256 feeCut, uint8 paymentTypeInput) public useIndexer { + vm.assume(paymentTypeInput < 3); + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes(paymentTypeInput); + feeCut = bound(feeCut, 0, MAX_PPM); + _setDelegationFeeCut(users.indexer, subgraphDataServiceAddress, paymentType, feeCut); + } + + function testServiceProvider_GetProvision( + uint256 amount, + uint256 thawAmount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + thawAmount = bound(thawAmount, 1, amount); + Provision memory p = staking.getProvision(users.indexer, subgraphDataServiceAddress); + assertEq(p.tokens, amount); + assertEq(p.tokensThawing, 0); + assertEq(p.sharesThawing, 0); + assertEq(p.maxVerifierCut, maxVerifierCut); + assertEq(p.thawingPeriod, thawingPeriod); + assertEq(p.createdAt, block.timestamp); + assertEq(p.maxVerifierCutPending, maxVerifierCut); + assertEq(p.thawingPeriodPending, thawingPeriod); + + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + p = staking.getProvision(users.indexer, subgraphDataServiceAddress); + assertEq(p.tokensThawing, thawAmount); + } + + function testServiceProvider_GetTokensAvailable( + uint256 amount, + uint256 thawAmount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + thawAmount = bound(thawAmount, 1, amount); + uint256 tokensAvailable = staking.getTokensAvailable(users.indexer, subgraphDataServiceAddress, 0); + assertEq(tokensAvailable, amount); + + _thaw(users.indexer, subgraphDataServiceAddress, thawAmount); + tokensAvailable = staking.getTokensAvailable(users.indexer, subgraphDataServiceAddress, 0); + assertEq(tokensAvailable, amount - thawAmount); + } + + function testServiceProvider_GetTokensAvailable_WithDelegation( + uint256 amount, + uint256 delegationAmount, + uint32 delegationRatio + ) public useIndexer useProvision(amount, MAX_PPM, MAX_THAWING_PERIOD) useDelegation(delegationAmount) { + uint256 tokensAvailable = staking.getTokensAvailable( + users.indexer, + subgraphDataServiceAddress, + delegationRatio + ); + + uint256 tokensDelegatedMax = amount * (uint256(delegationRatio)); + uint256 tokensDelegatedCapacity = delegationAmount > tokensDelegatedMax ? tokensDelegatedMax : delegationAmount; + assertEq(tokensAvailable, amount + tokensDelegatedCapacity); + } + + function testServiceProvider_GetProviderTokensAvailable( + uint256 amount, + uint256 delegationAmount + ) public useIndexer useProvision(amount, MAX_PPM, MAX_THAWING_PERIOD) useDelegation(delegationAmount) { + uint256 providerTokensAvailable = staking.getProviderTokensAvailable(users.indexer, subgraphDataServiceAddress); + // Should not include delegated tokens + assertEq(providerTokensAvailable, amount); + } + + function testServiceProvider_HasStake( + uint256 amount + ) public useIndexer useProvision(amount, MAX_PPM, MAX_THAWING_PERIOD) { + assertTrue(staking.hasStake(users.indexer)); + + _thaw(users.indexer, subgraphDataServiceAddress, amount); + skip(MAX_THAWING_PERIOD + 1); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + staking.unstake(amount); + + assertFalse(staking.hasStake(users.indexer)); + } + + function testServiceProvider_GetIndexerStakedTokens( + uint256 amount + ) public useIndexer useProvision(amount, MAX_PPM, MAX_THAWING_PERIOD) { + assertEq(staking.getIndexerStakedTokens(users.indexer), amount); + + _thaw(users.indexer, subgraphDataServiceAddress, amount); + // Does not discount thawing tokens + assertEq(staking.getIndexerStakedTokens(users.indexer), amount); + + skip(MAX_THAWING_PERIOD + 1); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + // Does not discount thawing tokens + assertEq(staking.getIndexerStakedTokens(users.indexer), amount); + + staking.unstake(amount); + assertEq(staking.getIndexerStakedTokens(users.indexer), 0); + } + + function testServiceProvider_RevertIf_InvalidDelegationFeeCut( + uint256 cut, + uint8 paymentTypeInput + ) public useIndexer { + vm.assume(paymentTypeInput < 3); + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes(paymentTypeInput); + cut = bound(cut, MAX_PPM + 1, MAX_PPM + 100); + vm.expectRevert( + abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingInvalidDelegationFeeCut.selector, cut) + ); + staking.setDelegationFeeCut(users.indexer, subgraphDataServiceAddress, paymentType, cut); + } +} diff --git a/packages/horizon/test/unit/staking/slash/legacySlash.t.sol b/packages/horizon/test/unit/staking/slash/legacySlash.t.sol new file mode 100644 index 000000000..1af4670db --- /dev/null +++ b/packages/horizon/test/unit/staking/slash/legacySlash.t.sol @@ -0,0 +1,253 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingLegacySlashTest is HorizonStakingTest { + /* + * MODIFIERS + */ + + modifier useLegacySlasher(address slasher) { + bytes32 storageKey = keccak256(abi.encode(slasher, 18)); + vm.store(address(staking), storageKey, bytes32(uint256(1))); + _; + } + + /* + * HELPERS + */ + + function _setIndexer( + address _indexer, + uint256 _tokensStaked, + uint256 _tokensAllocated, + uint256 _tokensLocked, + uint256 _tokensLockedUntil + ) public { + bytes32 baseSlot = keccak256(abi.encode(_indexer, 14)); + + vm.store(address(staking), bytes32(uint256(baseSlot)), bytes32(_tokensStaked)); + vm.store(address(staking), bytes32(uint256(baseSlot) + 1), bytes32(_tokensAllocated)); + vm.store(address(staking), bytes32(uint256(baseSlot) + 2), bytes32(_tokensLocked)); + vm.store(address(staking), bytes32(uint256(baseSlot) + 3), bytes32(_tokensLockedUntil)); + } + + /* + * ACTIONS + */ + + function _legacySlash(address _indexer, uint256 _tokens, uint256 _rewards, address _beneficiary) internal { + // before + uint256 beforeStakingBalance = token.balanceOf(address(staking)); + uint256 beforeRewardsDestinationBalance = token.balanceOf(_beneficiary); + ServiceProviderInternal memory beforeIndexer = _getStorage_ServiceProviderInternal(_indexer); + + // calculate slashable stake + uint256 slashableStake = beforeIndexer.tokensStaked - beforeIndexer.tokensProvisioned; + uint256 actualTokens = _tokens; + uint256 actualRewards = _rewards; + if (slashableStake == 0) { + actualTokens = 0; + actualRewards = 0; + } else if (_tokens > slashableStake) { + actualRewards = (_rewards * slashableStake) / _tokens; + actualTokens = slashableStake; + } + + // slash + vm.expectEmit(address(staking)); + emit IHorizonStakingExtension.StakeSlashed(_indexer, actualTokens, actualRewards, _beneficiary); + staking.slash(_indexer, _tokens, _rewards, _beneficiary); + + // after + uint256 afterStakingBalance = token.balanceOf(address(staking)); + uint256 afterRewardsDestinationBalance = token.balanceOf(_beneficiary); + ServiceProviderInternal memory afterIndexer = _getStorage_ServiceProviderInternal(_indexer); + + assertEq(beforeStakingBalance - actualTokens, afterStakingBalance); + assertEq(beforeRewardsDestinationBalance, afterRewardsDestinationBalance - actualRewards); + assertEq(afterIndexer.tokensStaked, beforeIndexer.tokensStaked - actualTokens); + } + + /* + * TESTS + */ + function testSlash_Legacy( + uint256 tokensStaked, + uint256 tokensProvisioned, + uint256 slashTokens, + uint256 reward + ) public useIndexer useLegacySlasher(users.legacySlasher) { + vm.assume(tokensStaked > 0); + vm.assume(tokensStaked <= MAX_STAKING_TOKENS); + vm.assume(tokensProvisioned > 0); + vm.assume(tokensProvisioned <= tokensStaked); + slashTokens = bound(slashTokens, 1, tokensStaked); + reward = bound(reward, 0, slashTokens); + + _stake(tokensStaked); + _provision(users.indexer, subgraphDataServiceLegacyAddress, tokensProvisioned, 0, 0); + + resetPrank(users.legacySlasher); + _legacySlash(users.indexer, slashTokens, reward, makeAddr("fisherman")); + } + + function testSlash_Legacy_UsingLockedTokens( + uint256 tokens, + uint256 slashTokens, + uint256 reward + ) public useIndexer useLegacySlasher(users.legacySlasher) { + vm.assume(tokens > 1); + slashTokens = bound(slashTokens, 1, tokens); + reward = bound(reward, 0, slashTokens); + + _setIndexer(users.indexer, tokens, 0, tokens, block.timestamp + 1); + // Send tokens manually to staking + token.transfer(address(staking), tokens); + + resetPrank(users.legacySlasher); + _legacySlash(users.indexer, slashTokens, reward, makeAddr("fisherman")); + } + + function testSlash_Legacy_UsingAllocatedTokens( + uint256 tokens, + uint256 slashTokens, + uint256 reward + ) public useIndexer useLegacySlasher(users.legacySlasher) { + vm.assume(tokens > 1); + slashTokens = bound(slashTokens, 1, tokens); + reward = bound(reward, 0, slashTokens); + + _setIndexer(users.indexer, tokens, 0, tokens, 0); + // Send tokens manually to staking + token.transfer(address(staking), tokens); + + resetPrank(users.legacySlasher); + staking.legacySlash(users.indexer, slashTokens, reward, makeAddr("fisherman")); + } + + function testSlash_Legacy_RevertWhen_CallerNotSlasher( + uint256 tokens, + uint256 slashTokens, + uint256 reward + ) public useIndexer { + vm.assume(tokens > 0); + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + vm.expectRevert("!slasher"); + staking.legacySlash(users.indexer, slashTokens, reward, makeAddr("fisherman")); + } + + function testSlash_Legacy_RevertWhen_RewardsOverSlashTokens( + uint256 tokens, + uint256 slashTokens, + uint256 reward + ) public useIndexer useLegacySlasher(users.legacySlasher) { + vm.assume(tokens > 0); + vm.assume(slashTokens > 0); + vm.assume(reward > slashTokens); + + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + resetPrank(users.legacySlasher); + vm.expectRevert("rewards>slash"); + staking.legacySlash(users.indexer, slashTokens, reward, makeAddr("fisherman")); + } + + function testSlash_Legacy_RevertWhen_NoStake( + uint256 slashTokens, + uint256 reward + ) public useLegacySlasher(users.legacySlasher) { + vm.assume(slashTokens > 0); + reward = bound(reward, 0, slashTokens); + + resetPrank(users.legacySlasher); + vm.expectRevert("!stake"); + staking.legacySlash(users.indexer, slashTokens, reward, makeAddr("fisherman")); + } + + function testSlash_Legacy_RevertWhen_ZeroTokens( + uint256 tokens + ) public useIndexer useLegacySlasher(users.legacySlasher) { + vm.assume(tokens > 0); + + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + resetPrank(users.legacySlasher); + vm.expectRevert("!tokens"); + staking.legacySlash(users.indexer, 0, 0, makeAddr("fisherman")); + } + + function testSlash_Legacy_RevertWhen_NoBeneficiary( + uint256 tokens, + uint256 slashTokens, + uint256 reward + ) public useIndexer useLegacySlasher(users.legacySlasher) { + vm.assume(tokens > 0); + slashTokens = bound(slashTokens, 1, tokens); + reward = bound(reward, 0, slashTokens); + + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, 0); + + resetPrank(users.legacySlasher); + vm.expectRevert("!beneficiary"); + staking.legacySlash(users.indexer, slashTokens, reward, address(0)); + } + + function test_LegacySlash_WhenTokensAllocatedGreaterThanStake() + public + useIndexer + useLegacySlasher(users.legacySlasher) + { + // Setup indexer with: + // - tokensStaked = 1000 GRT + // - tokensAllocated = 800 GRT + // - tokensLocked = 300 GRT + // This means tokensUsed (1100 GRT) > tokensStaked (1000 GRT) + _setIndexer( + users.indexer, + 1000 ether, // tokensStaked + 800 ether, // tokensAllocated + 300 ether, // tokensLocked + 0 // tokensLockedUntil + ); + + // Send tokens manually to staking + token.transfer(address(staking), 1100 ether); + + resetPrank(users.legacySlasher); + _legacySlash(users.indexer, 1000 ether, 500 ether, makeAddr("fisherman")); + } + + function test_LegacySlash_WhenDelegateCallFails() public useIndexer useLegacySlasher(users.legacySlasher) { + // Setup indexer with: + // - tokensStaked = 1000 GRT + // - tokensAllocated = 800 GRT + // - tokensLocked = 300 GRT + + _setIndexer( + users.indexer, + 1000 ether, // tokensStaked + 800 ether, // tokensAllocated + 300 ether, // tokensLocked + 0 // tokensLockedUntil + ); + + // Send tokens manually to staking + token.transfer(address(staking), 1100 ether); + + // Change staking extension code to an invalid opcode so the delegatecall reverts + address stakingExtension = staking.getStakingExtension(); + vm.etch(stakingExtension, hex"fe"); + + resetPrank(users.legacySlasher); + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingLegacySlashFailed()"); + vm.expectRevert(expectedError); + staking.slash(users.indexer, 1000 ether, 500 ether, makeAddr("fisherman")); + } +} diff --git a/packages/horizon/test/unit/staking/slash/slash.t.sol b/packages/horizon/test/unit/staking/slash/slash.t.sol new file mode 100644 index 000000000..e5c365d67 --- /dev/null +++ b/packages/horizon/test/unit/staking/slash/slash.t.sol @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingSlashTest is HorizonStakingTest { + /* + * TESTS + */ + + function testSlash_Tokens( + uint256 tokens, + uint32 maxVerifierCut, + uint256 slashTokens, + uint256 verifierCutAmount + ) public useIndexer useProvision(tokens, maxVerifierCut, 0) { + slashTokens = bound(slashTokens, 1, tokens); + uint256 maxVerifierTokens = (slashTokens * maxVerifierCut) / MAX_PPM; + vm.assume(verifierCutAmount <= maxVerifierTokens); + + vm.startPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, slashTokens, verifierCutAmount); + } + + function testSlash_Tokens_RevertWhen_TooManyVerifierTokens( + uint256 tokens, + uint32 maxVerifierCut, + uint256 slashTokens, + uint256 verifierCutAmount + ) public useIndexer useProvision(tokens, maxVerifierCut, 0) { + slashTokens = bound(slashTokens, 1, tokens); + uint256 maxVerifierTokens = (slashTokens * maxVerifierCut) / MAX_PPM; + vm.assume(verifierCutAmount > maxVerifierTokens); + + vm.startPrank(subgraphDataServiceAddress); + vm.assume(slashTokens > 0); + bytes memory expectedError = abi.encodeWithSelector( + IHorizonStakingMain.HorizonStakingTooManyTokens.selector, + verifierCutAmount, + maxVerifierTokens + ); + vm.expectRevert(expectedError); + staking.slash(users.indexer, slashTokens, verifierCutAmount, subgraphDataServiceAddress); + } + + function testSlash_DelegationDisabled_SlashingOverProviderTokens( + uint256 tokens, + uint256 slashTokens, + uint256 verifierCutAmount, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, MAX_PPM, 0) { + vm.assume(slashTokens > tokens); + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + verifierCutAmount = bound(verifierCutAmount, 0, MAX_PPM); + vm.assume(verifierCutAmount <= tokens); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + vm.startPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, slashTokens, verifierCutAmount); + } + + function testSlash_DelegationEnabled_SlashingOverProviderTokens( + uint256 tokens, + uint256 slashTokens, + uint256 verifierCutAmount, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, MAX_PPM, 0) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + slashTokens = bound(slashTokens, tokens + 1, tokens + 1 + delegationTokens); + verifierCutAmount = bound(verifierCutAmount, 0, tokens); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + vm.startPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, slashTokens, verifierCutAmount); + } + + function testSlash_OverProvisionSize( + uint256 tokens, + uint256 slashTokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, MAX_PPM, 0) { + delegationTokens = bound(delegationTokens, 0, MAX_STAKING_TOKENS); + vm.assume(slashTokens > tokens + delegationTokens); + + vm.startPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, slashTokens, 0); + } + + function testSlash_RevertWhen_NoProvision(uint256 tokens, uint256 slashTokens) public useIndexer useStake(tokens) { + vm.assume(slashTokens > 0); + bytes memory expectedError = abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingNoTokensToSlash.selector); + vm.expectRevert(expectedError); + vm.startPrank(subgraphDataServiceAddress); + staking.slash(users.indexer, slashTokens, 0, subgraphDataServiceAddress); + } + + function testSlash_Everything( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useProvision(tokens, MAX_PPM, 0) useDelegationSlashing { + delegationTokens = bound(delegationTokens, MIN_DELEGATION, MAX_STAKING_TOKENS); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + vm.startPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + } + + function testSlash_Everything_WithUndelegation( + uint256 tokens + ) public useIndexer useProvision(tokens, MAX_PPM, 0) useDelegationSlashing { + uint256 delegationTokens = MAX_STAKING_TOKENS / 10; + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + + // undelegate half shares so we have some thawing shares/tokens + DelegationInternal memory delegation = _getStorage_Delegation( + users.indexer, + subgraphDataServiceAddress, + users.delegator, + false + ); + resetPrank(users.delegator); + _undelegate(users.indexer, subgraphDataServiceAddress, delegation.shares / 2); + + vm.startPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0); + } + + function testSlash_RoundDown_TokensThawing_Provision( + uint256 tokens, + uint256 slashTokens, + uint256 tokensToThaw + ) public useIndexer { + vm.assume(slashTokens <= tokens); + vm.assume(tokensToThaw <= tokens); + vm.assume(tokensToThaw > 0); + + _useProvision(subgraphDataServiceAddress, tokens, MAX_PPM, MAX_THAWING_PERIOD); + _thaw(users.indexer, subgraphDataServiceAddress, tokensToThaw); + + Provision memory beforeProvision = staking.getProvision(users.indexer, subgraphDataServiceAddress); + + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, slashTokens, 0); + + Provision memory afterProvision = staking.getProvision(users.indexer, subgraphDataServiceAddress); + assertEq(afterProvision.tokens, beforeProvision.tokens - slashTokens); + assertEq( + afterProvision.tokensThawing, + (beforeProvision.tokensThawing * (beforeProvision.tokens - slashTokens)) / beforeProvision.tokens + ); + } + + function testSlash_RoundDown_TokensThawing_Delegation( + uint256 tokens, + uint256 delegationTokensToSlash, + uint256 delegationTokensToUndelegate + ) public useIndexer useProvision(tokens, MAX_PPM, 0) useDelegationSlashing { + uint256 delegationTokens = 10 ether; + + vm.assume(delegationTokensToSlash <= delegationTokens); + vm.assume(delegationTokensToUndelegate <= delegationTokens); + vm.assume(delegationTokensToUndelegate > 0); + + resetPrank(users.delegator); + _delegate(users.indexer, subgraphDataServiceAddress, delegationTokens, 0); + _undelegate(users.indexer, subgraphDataServiceAddress, delegationTokensToUndelegate); + + DelegationPool memory beforePool = staking.getDelegationPool(users.indexer, subgraphDataServiceAddress); + + // Slash + resetPrank(subgraphDataServiceAddress); + _slash(users.indexer, subgraphDataServiceAddress, tokens + delegationTokensToSlash, 0); + + DelegationPool memory afterPool = staking.getDelegationPool(users.indexer, subgraphDataServiceAddress); + assertEq(afterPool.tokens, beforePool.tokens - delegationTokensToSlash); + assertEq( + afterPool.tokensThawing, + (beforePool.tokensThawing * (beforePool.tokens - delegationTokensToSlash)) / beforePool.tokens + ); + } +} diff --git a/packages/horizon/test/unit/staking/stake/stake.t.sol b/packages/horizon/test/unit/staking/stake/stake.t.sol new file mode 100644 index 000000000..bf62de8b7 --- /dev/null +++ b/packages/horizon/test/unit/staking/stake/stake.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingStakeTest is HorizonStakingTest { + /* + * TESTS + */ + + function testStake_Tokens(uint256 amount) public useIndexer { + amount = bound(amount, 1, MAX_STAKING_TOKENS); + _stake(amount); + } + + function testStake_RevertWhen_ZeroTokens() public useIndexer { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroTokens()"); + vm.expectRevert(expectedError); + staking.stake(0); + } + + function testStakeTo_Tokens(uint256 amount) public useOperator { + amount = bound(amount, 1, MAX_STAKING_TOKENS); + _stakeTo(users.indexer, amount); + } + + function testStakeTo_RevertWhen_ZeroTokens() public useOperator { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroTokens()"); + vm.expectRevert(expectedError); + staking.stakeTo(users.indexer, 0); + } +} diff --git a/packages/horizon/test/unit/staking/stake/unstake.t.sol b/packages/horizon/test/unit/staking/stake/unstake.t.sol new file mode 100644 index 000000000..83c6a0a81 --- /dev/null +++ b/packages/horizon/test/unit/staking/stake/unstake.t.sol @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingUnstakeTest is HorizonStakingTest { + /* + * TESTS + */ + + function testUnstake_Tokens( + uint256 tokens, + uint256 tokensToUnstake, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(tokens, maxVerifierCut, thawingPeriod) { + tokensToUnstake = bound(tokensToUnstake, 1, tokens); + + // thaw, wait and deprovision + _thaw(users.indexer, subgraphDataServiceAddress, tokens); + skip(thawingPeriod + 1); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + + _unstake(tokensToUnstake); + } + + function testUnstake_LockingPeriodGreaterThanZero_NoThawing( + uint256 tokens, + uint256 tokensToUnstake, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(tokens, maxVerifierCut, thawingPeriod) { + tokensToUnstake = bound(tokensToUnstake, 1, tokens); + + // simulate transition period + _setStorage_DeprecatedThawingPeriod(THAWING_PERIOD_IN_BLOCKS); + + // thaw, wait and deprovision + _thaw(users.indexer, subgraphDataServiceAddress, tokens); + skip(thawingPeriod + 1); + _deprovision(users.indexer, subgraphDataServiceAddress, 0); + + // unstake + _unstake(tokensToUnstake); + } + + function testUnstake_LockingPeriodGreaterThanZero_TokensDoneThawing( + uint256 tokens, + uint256 tokensToUnstake, + uint256 tokensLocked + ) public useIndexer { + // bounds + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + tokensToUnstake = bound(tokensToUnstake, 1, tokens); + tokensLocked = bound(tokensLocked, 1, MAX_STAKING_TOKENS); + + // simulate locked tokens with past locking period + _setStorage_DeprecatedThawingPeriod(THAWING_PERIOD_IN_BLOCKS); + token.transfer(address(staking), tokensLocked); + _setStorage_ServiceProvider(users.indexer, tokensLocked, 0, tokensLocked, block.number, 0); + + // create provision, thaw and deprovision + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, MAX_THAWING_PERIOD); + _thaw(users.indexer, subgraphDataServiceLegacyAddress, tokens); + skip(MAX_THAWING_PERIOD + 1); + _deprovision(users.indexer, subgraphDataServiceLegacyAddress, 0); + + // unstake + _unstake(tokensToUnstake); + } + + function testUnstake_LockingPeriodGreaterThanZero_TokensStillThawing( + uint256 tokens, + uint256 tokensToUnstake, + uint256 tokensThawing, + uint32 tokensThawingUntilBlock + ) public useIndexer { + // bounds + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + tokensToUnstake = bound(tokensToUnstake, 1, tokens); + tokensThawing = bound(tokensThawing, 1, MAX_STAKING_TOKENS); + vm.assume(tokensThawingUntilBlock > block.number); + vm.assume(tokensThawingUntilBlock < block.number + THAWING_PERIOD_IN_BLOCKS); + + // simulate locked tokens still thawing + _setStorage_DeprecatedThawingPeriod(THAWING_PERIOD_IN_BLOCKS); + token.transfer(address(staking), tokensThawing); + _setStorage_ServiceProvider(users.indexer, tokensThawing, 0, tokensThawing, tokensThawingUntilBlock, 0); + + // create provision, thaw and deprovision + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, MAX_THAWING_PERIOD); + _thaw(users.indexer, subgraphDataServiceLegacyAddress, tokens); + skip(MAX_THAWING_PERIOD + 1); + _deprovision(users.indexer, subgraphDataServiceLegacyAddress, 0); + + // unstake + _unstake(tokensToUnstake); + } + + function testUnstake_RevertWhen_ZeroTokens( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) + public + useIndexer + useProvision(amount, maxVerifierCut, thawingPeriod) + useThawAndDeprovision(amount, thawingPeriod) + { + bytes memory expectedError = abi.encodeWithSignature("HorizonStakingInvalidZeroTokens()"); + vm.expectRevert(expectedError); + staking.unstake(0); + } + + function testUnstake_RevertWhen_NoIdleStake( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInsufficientIdleStake(uint256,uint256)", + amount, + 0 + ); + vm.expectRevert(expectedError); + staking.unstake(amount); + } + + function testUnstake_RevertWhen_NotDeprovision( + uint256 amount, + uint32 maxVerifierCut, + uint64 thawingPeriod + ) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) { + _thaw(users.indexer, subgraphDataServiceAddress, amount); + skip(thawingPeriod + 1); + + bytes memory expectedError = abi.encodeWithSignature( + "HorizonStakingInsufficientIdleStake(uint256,uint256)", + amount, + 0 + ); + vm.expectRevert(expectedError); + staking.unstake(amount); + } +} diff --git a/packages/horizon/test/unit/staking/stake/withdraw.t.sol b/packages/horizon/test/unit/staking/stake/withdraw.t.sol new file mode 100644 index 000000000..eac19e416 --- /dev/null +++ b/packages/horizon/test/unit/staking/stake/withdraw.t.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IHorizonStakingMain } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingMain.sol"; + +import { HorizonStakingTest } from "../HorizonStaking.t.sol"; + +contract HorizonStakingWithdrawTest is HorizonStakingTest { + /* + * TESTS + */ + + function testWithdraw_Tokens(uint256 tokens, uint256 tokensLocked) public useIndexer { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + tokensLocked = bound(tokensLocked, 1, tokens); + + // simulate locked tokens ready to withdraw + token.transfer(address(staking), tokens); + _setStorage_ServiceProvider(users.indexer, tokens, 0, tokensLocked, block.number, 0); + + _createProvision(users.indexer, subgraphDataServiceAddress, tokens, 0, MAX_THAWING_PERIOD); + + _withdraw(); + } + + function testWithdraw_RevertWhen_ZeroTokens(uint256 tokens) public useIndexer { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + + // simulate zero locked tokens + token.transfer(address(staking), tokens); + _setStorage_ServiceProvider(users.indexer, tokens, 0, 0, 0, 0); + + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, MAX_THAWING_PERIOD); + + vm.expectRevert(abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingInvalidZeroTokens.selector)); + staking.withdraw(); + } + + function testWithdraw_RevertWhen_StillThawing(uint256 tokens, uint256 tokensLocked) public useIndexer { + tokens = bound(tokens, 1, MAX_STAKING_TOKENS); + tokensLocked = bound(tokensLocked, 1, tokens); + + // simulate locked tokens still thawing + uint256 thawUntil = block.timestamp + 1; + token.transfer(address(staking), tokens); + _setStorage_ServiceProvider(users.indexer, tokens, 0, tokensLocked, thawUntil, 0); + + _createProvision(users.indexer, subgraphDataServiceLegacyAddress, tokens, 0, MAX_THAWING_PERIOD); + + vm.expectRevert(abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingStillThawing.selector, thawUntil)); + staking.withdraw(); + } +} diff --git a/packages/horizon/test/unit/utilities/Authorizable.t.sol b/packages/horizon/test/unit/utilities/Authorizable.t.sol new file mode 100644 index 000000000..33713c436 --- /dev/null +++ b/packages/horizon/test/unit/utilities/Authorizable.t.sol @@ -0,0 +1,405 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { Test } from "forge-std/Test.sol"; + +import { Authorizable } from "../../../contracts/utilities/Authorizable.sol"; +import { IAuthorizable } from "@graphprotocol/interfaces/contracts/horizon/IAuthorizable.sol"; +import { Bounder } from "../utils/Bounder.t.sol"; + +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +contract AuthorizableImp is Authorizable { + constructor(uint256 _revokeAuthorizationThawingPeriod) Authorizable(_revokeAuthorizationThawingPeriod) {} +} + +contract AuthorizableTest is Test, Bounder { + AuthorizableImp public authorizable; + AuthorizableHelper authHelper; + + modifier withFuzzyThaw(uint256 _thawPeriod) { + // Max thaw period is 1 year to allow for thawing tests + _thawPeriod = bound(_thawPeriod, 1, 60 * 60 * 24 * 365); + setupAuthorizable(new AuthorizableImp(_thawPeriod)); + _; + } + + function setUp() public virtual { + setupAuthorizable(new AuthorizableImp(0)); + } + + function setupAuthorizable(AuthorizableImp _authorizable) internal { + authorizable = _authorizable; + authHelper = new AuthorizableHelper(authorizable); + } + + function test_AuthorizeSigner(uint256 _unboundedKey, address _authorizer) public { + vm.assume(_authorizer != address(0)); + uint256 signerKey = boundKey(_unboundedKey); + + authHelper.authorizeSignerWithChecks(_authorizer, signerKey); + } + + function test_AuthorizeSigner_Revert_WhenAlreadyAuthorized( + uint256[] memory _unboundedAuthorizers, + uint256 _unboundedKey + ) public { + vm.assume(_unboundedAuthorizers.length > 1); + address[] memory authorizers = new address[](_unboundedAuthorizers.length); + for (uint256 i = 0; i < authorizers.length; i++) { + authorizers[i] = boundAddr(_unboundedAuthorizers[i]); + } + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + + address validAuthorizer = authorizers[0]; + authHelper.authorizeSignerWithChecks(validAuthorizer, signerKey); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerAlreadyAuthorized.selector, + validAuthorizer, + signer, + false + ); + + for (uint256 i = 0; i < authorizers.length; i++) { + vm.expectRevert(expectedErr); + vm.prank(authorizers[i]); + authorizable.authorizeSigner(signer, 0, ""); + } + } + + function test_AuthorizeSigner_Revert_WhenInvalidProofDeadline(uint256 _proofDeadline, uint256 _now) public { + _now = bound(_now, 0, type(uint64).max - 1); + _proofDeadline = bound(_proofDeadline, 0, _now); + vm.warp(_now); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableInvalidSignerProofDeadline.selector, + _proofDeadline, + _now + ); + vm.expectRevert(expectedErr); + authorizable.authorizeSigner(address(0), _proofDeadline, ""); + } + + function test_AuthorizeSigner_Revert_WhenAuthorizableInvalidSignerProof( + uint256 _now, + uint256 _unboundedAuthorizer, + uint256 _unboundedKey, + uint256 _proofDeadline, + uint256 _chainid, + uint256 _wrong + ) public { + _now = bound(_now, 0, type(uint64).max - 1); + address authorizer = boundAddr(_unboundedAuthorizer); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + _proofDeadline = boundTimestampMin(_proofDeadline, _now + 1); + vm.assume(_wrong != _proofDeadline); + _chainid = boundChainId(_chainid); + vm.assume(_wrong != _chainid); + (uint256 wrongKey, address wrongAddress) = boundAddrAndKey(_wrong); + vm.assume(wrongKey != signerKey); + vm.assume(wrongAddress != authorizer); + + vm.chainId(_chainid); + vm.warp(_now); + + bytes memory validProof = authHelper.generateAuthorizationProof( + _chainid, + address(authorizable), + _proofDeadline, + authorizer, + signerKey + ); + bytes[5] memory proofs = [ + authHelper.generateAuthorizationProof(_wrong, address(authorizable), _proofDeadline, authorizer, signerKey), + authHelper.generateAuthorizationProof(_chainid, wrongAddress, _proofDeadline, authorizer, signerKey), + authHelper.generateAuthorizationProof(_chainid, address(authorizable), _wrong, authorizer, signerKey), + authHelper.generateAuthorizationProof( + _chainid, + address(authorizable), + _proofDeadline, + wrongAddress, + signerKey + ), + authHelper.generateAuthorizationProof(_chainid, address(authorizable), _proofDeadline, authorizer, wrongKey) + ]; + + for (uint256 i = 0; i < proofs.length; i++) { + vm.expectRevert(IAuthorizable.AuthorizableInvalidSignerProof.selector); + vm.prank(authorizer); + authorizable.authorizeSigner(signer, _proofDeadline, proofs[i]); + } + + vm.prank(authorizer); + authorizable.authorizeSigner(signer, _proofDeadline, validProof); + authHelper.assertAuthorized(authorizer, signer); + } + + function test_ThawSigner(address _authorizer, uint256 _unboundedKey, uint256 _thaw) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + uint256 signerKey = boundKey(_unboundedKey); + + authHelper.authorizeAndThawSignerWithChecks(_authorizer, signerKey); + } + + function test_ThawSigner_Revert_WhenNotAuthorized(address _authorizer, address _signer) public { + vm.assume(_authorizer != address(0)); + vm.assume(_signer != address(0)); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + _authorizer, + _signer + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.thawSigner(_signer); + } + + function test_ThawSigner_Revert_WhenAuthorizationRevoked( + address _authorizer, + uint256 _unboundedKey, + uint256 _thaw + ) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + authHelper.authorizeAndRevokeSignerWithChecks(_authorizer, signerKey); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + _authorizer, + signer + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.thawSigner(signer); + } + + function test_CancelThawSigner( + address _authorizer, + uint256 _unboundedKey, + uint256 _thaw + ) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + + authHelper.authorizeAndThawSignerWithChecks(_authorizer, signerKey); + vm.expectEmit(address(authorizable)); + emit IAuthorizable.SignerThawCanceled(_authorizer, signer, authorizable.getThawEnd(signer)); + vm.prank(_authorizer); + authorizable.cancelThawSigner(signer); + + authHelper.assertAuthorized(_authorizer, signer); + } + + function test_CancelThawSigner_Revert_When_NotAuthorized(address _authorizer, address _signer) public { + vm.assume(_authorizer != address(0)); + vm.assume(_signer != address(0)); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + _authorizer, + _signer + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.cancelThawSigner(_signer); + } + + function test_CancelThawSigner_Revert_WhenAuthorizationRevoked( + address _authorizer, + uint256 _unboundedKey, + uint256 _thaw + ) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + authHelper.authorizeAndRevokeSignerWithChecks(_authorizer, signerKey); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + _authorizer, + signer + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.cancelThawSigner(signer); + } + + function test_CancelThawSigner_Revert_When_NotThawing(address _authorizer, uint256 _unboundedKey) public { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + + authHelper.authorizeSignerWithChecks(_authorizer, signerKey); + + bytes memory expectedErr = abi.encodeWithSelector(IAuthorizable.AuthorizableSignerNotThawing.selector, signer); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.cancelThawSigner(signer); + } + + function test_RevokeAuthorizedSigner( + address _authorizer, + uint256 _unboundedKey, + uint256 _thaw + ) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + uint256 signerKey = boundKey(_unboundedKey); + + authHelper.authorizeAndRevokeSignerWithChecks(_authorizer, signerKey); + } + + function test_RevokeAuthorizedSigner_Revert_WhenNotAuthorized(address _authorizer, address _signer) public { + vm.assume(_authorizer != address(0)); + vm.assume(_signer != address(0)); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + _authorizer, + _signer + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.revokeAuthorizedSigner(_signer); + } + + function test_RevokeAuthorizedSigner_Revert_WhenAuthorizationRevoked( + address _authorizer, + uint256 _unboundedKey, + uint256 _thaw + ) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + authHelper.authorizeAndRevokeSignerWithChecks(_authorizer, signerKey); + + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerNotAuthorized.selector, + _authorizer, + signer + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.revokeAuthorizedSigner(signer); + } + + function test_RevokeAuthorizedSigner_Revert_WhenNotThawing(address _authorizer, uint256 _unboundedKey) public { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + + authHelper.authorizeSignerWithChecks(_authorizer, signerKey); + bytes memory expectedErr = abi.encodeWithSelector(IAuthorizable.AuthorizableSignerNotThawing.selector, signer); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.revokeAuthorizedSigner(signer); + } + + function test_RevokeAuthorizedSigner_Revert_WhenStillThawing( + address _authorizer, + uint256 _unboundedKey, + uint256 _thaw, + uint256 _skip + ) public withFuzzyThaw(_thaw) { + vm.assume(_authorizer != address(0)); + (uint256 signerKey, address signer) = boundAddrAndKey(_unboundedKey); + + authHelper.authorizeAndThawSignerWithChecks(_authorizer, signerKey); + + _skip = bound(_skip, 0, authorizable.REVOKE_AUTHORIZATION_THAWING_PERIOD() - 1); + skip(_skip); + bytes memory expectedErr = abi.encodeWithSelector( + IAuthorizable.AuthorizableSignerStillThawing.selector, + block.timestamp, + block.timestamp - _skip + authorizable.REVOKE_AUTHORIZATION_THAWING_PERIOD() + ); + vm.expectRevert(expectedErr); + vm.prank(_authorizer); + authorizable.revokeAuthorizedSigner(signer); + } + + function test_IsAuthorized_Revert_WhenZero(address signer) public view { + authHelper.assertNotAuthorized(address(0), signer); + } +} + +contract AuthorizableHelper is Test { + AuthorizableImp internal authorizable; + + constructor(AuthorizableImp _authorizable) { + authorizable = _authorizable; + } + + function authorizeAndThawSignerWithChecks(address _authorizer, uint256 _signerKey) public { + address signer = vm.addr(_signerKey); + authorizeSignerWithChecks(_authorizer, _signerKey); + + uint256 thawEndTimestamp = block.timestamp + authorizable.REVOKE_AUTHORIZATION_THAWING_PERIOD(); + vm.expectEmit(address(authorizable)); + emit IAuthorizable.SignerThawing(_authorizer, signer, thawEndTimestamp); + vm.prank(_authorizer); + authorizable.thawSigner(signer); + + assertAuthorized(_authorizer, signer); + } + + function authorizeAndRevokeSignerWithChecks(address _authorizer, uint256 _signerKey) public { + address signer = vm.addr(_signerKey); + authorizeAndThawSignerWithChecks(_authorizer, _signerKey); + skip(authorizable.REVOKE_AUTHORIZATION_THAWING_PERIOD() + 1); + vm.expectEmit(address(authorizable)); + emit IAuthorizable.SignerRevoked(_authorizer, signer); + vm.prank(_authorizer); + authorizable.revokeAuthorizedSigner(signer); + + assertNotAuthorized(_authorizer, signer); + } + + function authorizeSignerWithChecks(address _authorizer, uint256 _signerKey) public { + address signer = vm.addr(_signerKey); + assertNotAuthorized(_authorizer, signer); + + uint256 proofDeadline = block.timestamp + 1; + bytes memory proof = generateAuthorizationProof( + block.chainid, + address(authorizable), + proofDeadline, + _authorizer, + _signerKey + ); + vm.expectEmit(address(authorizable)); + emit IAuthorizable.SignerAuthorized(_authorizer, signer); + vm.prank(_authorizer); + authorizable.authorizeSigner(signer, proofDeadline, proof); + + assertAuthorized(_authorizer, signer); + } + + function assertNotAuthorized(address _authorizer, address _signer) public view { + assertFalse(authorizable.isAuthorized(_authorizer, _signer), "Should not be authorized"); + } + + function assertAuthorized(address _authorizer, address _signer) public view { + assertTrue(authorizable.isAuthorized(_authorizer, _signer), "Should be authorized"); + } + + function generateAuthorizationProof( + uint256 _chainId, + address _verifyingContract, + uint256 _proofDeadline, + address _authorizer, + uint256 _signerPrivateKey + ) public pure returns (bytes memory) { + // Generate the message hash + bytes32 messageHash = keccak256( + abi.encodePacked(_chainId, _verifyingContract, "authorizeSignerProof", _proofDeadline, _authorizer) + ); + + // Generate the digest to sign + bytes32 digest = MessageHashUtils.toEthSignedMessageHash(messageHash); + + // Sign the digest + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_signerPrivateKey, digest); + + // Encode the signature + return abi.encodePacked(r, s, v); + } +} diff --git a/packages/horizon/test/unit/utilities/GraphDirectory.t.sol b/packages/horizon/test/unit/utilities/GraphDirectory.t.sol new file mode 100644 index 000000000..180590a1e --- /dev/null +++ b/packages/horizon/test/unit/utilities/GraphDirectory.t.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; +import { stdStorage, StdStorage } from "forge-std/Test.sol"; +import { GraphBaseTest } from "../GraphBase.t.sol"; +import { GraphDirectory } from "./../../../contracts/utilities/GraphDirectory.sol"; +import { GraphDirectoryImplementation } from "./GraphDirectoryImplementation.sol"; + +contract GraphDirectoryTest is GraphBaseTest { + function test_WhenTheContractIsDeployedWithAValidController() external { + vm.expectEmit(); + emit GraphDirectory.GraphDirectoryInitialized( + _getContractFromController("GraphToken"), + _getContractFromController("Staking"), + _getContractFromController("GraphPayments"), + _getContractFromController("PaymentsEscrow"), + address(controller), + _getContractFromController("EpochManager"), + _getContractFromController("RewardsManager"), + _getContractFromController("GraphTokenGateway"), + _getContractFromController("GraphProxyAdmin"), + _getContractFromController("Curation") + ); + _deployImplementation(address(controller)); + } + + function test_RevertWhen_TheContractIsDeployedWithAnInvalidController(address controller_) external { + vm.assume(controller_ != address(controller)); + vm.assume(uint160(controller_) > 9); // Skip precompiled contracts + + vm.expectRevert(); // call to getContractProxy on a random address reverts + _deployImplementation(controller_); + } + + function test_RevertWhen_TheContractIsDeployedWithTheZeroAddressAsTheInvalidController() external { + vm.expectRevert(abi.encodeWithSelector(GraphDirectory.GraphDirectoryInvalidZeroAddress.selector, "Controller")); // call to getContractProxy on a random address reverts + _deployImplementation(address(0)); + } + + function test_WhenTheContractGettersAreCalled() external { + GraphDirectoryImplementation directory = _deployImplementation(address(controller)); + + assertEq(_getContractFromController("GraphToken"), address(directory.graphToken())); + assertEq(_getContractFromController("Staking"), address(directory.graphStaking())); + assertEq(_getContractFromController("GraphPayments"), address(directory.graphPayments())); + assertEq(_getContractFromController("PaymentsEscrow"), address(directory.graphPaymentsEscrow())); + assertEq(_getContractFromController("EpochManager"), address(directory.graphEpochManager())); + assertEq(_getContractFromController("RewardsManager"), address(directory.graphRewardsManager())); + assertEq(_getContractFromController("GraphTokenGateway"), address(directory.graphTokenGateway())); + assertEq(_getContractFromController("GraphProxyAdmin"), address(directory.graphProxyAdmin())); + assertEq(_getContractFromController("Curation"), address(directory.graphCuration())); + } + + function test_RevertWhen_AnInvalidContractGetterIsCalled() external { + // Zero out the Staking contract address to simulate a non registered contract + bytes32 storageSlot = keccak256(abi.encode(keccak256("Staking"), 5)); + vm.store(address(controller), storageSlot, bytes32(0)); + + vm.expectRevert(abi.encodeWithSelector(GraphDirectory.GraphDirectoryInvalidZeroAddress.selector, "Staking")); + _deployImplementation(address(controller)); + } + + function _deployImplementation(address _controller) private returns (GraphDirectoryImplementation) { + return new GraphDirectoryImplementation(_controller); + } + + function _getContractFromController(bytes memory _contractName) private view returns (address) { + return controller.getContractProxy(keccak256(_contractName)); + } +} diff --git a/packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol b/packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol new file mode 100644 index 000000000..f62576084 --- /dev/null +++ b/packages/horizon/test/unit/utilities/GraphDirectoryImplementation.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IGraphToken } from "@graphprotocol/contracts/contracts/token/IGraphToken.sol"; +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; + +import { IController } from "@graphprotocol/interfaces/contracts/contracts/governance/IController.sol"; +import { IEpochManager } from "@graphprotocol/interfaces/contracts/contracts/epochs/IEpochManager.sol"; +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; +import { ITokenGateway } from "@graphprotocol/interfaces/contracts/contracts/arbitrum/ITokenGateway.sol"; +import { IGraphProxyAdmin } from "@graphprotocol/interfaces/contracts/contracts/upgrades/IGraphProxyAdmin.sol"; +import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curation/ICuration.sol"; + +import { GraphDirectory } from "./../../../contracts/utilities/GraphDirectory.sol"; + +contract GraphDirectoryImplementation is GraphDirectory { + constructor(address controller) GraphDirectory(controller) {} + + function getContractFromController(bytes memory contractName) external view returns (address) { + return _graphController().getContractProxy(keccak256(contractName)); + } + function graphToken() external view returns (IGraphToken) { + return _graphToken(); + } + + function graphStaking() external view returns (IHorizonStaking) { + return _graphStaking(); + } + + function graphPayments() external view returns (IGraphPayments) { + return _graphPayments(); + } + + function graphPaymentsEscrow() external view returns (IPaymentsEscrow) { + return _graphPaymentsEscrow(); + } + + function graphController() external view returns (IController) { + return _graphController(); + } + + function graphEpochManager() external view returns (IEpochManager) { + return _graphEpochManager(); + } + + function graphRewardsManager() external view returns (IRewardsManager) { + return _graphRewardsManager(); + } + + function graphTokenGateway() external view returns (ITokenGateway) { + return _graphTokenGateway(); + } + + function graphProxyAdmin() external view returns (IGraphProxyAdmin) { + return _graphProxyAdmin(); + } + + function graphCuration() external view returns (ICuration) { + return _graphCuration(); + } +} diff --git a/packages/horizon/test/unit/utils/Bounder.t.sol b/packages/horizon/test/unit/utils/Bounder.t.sol new file mode 100644 index 000000000..44e977f57 --- /dev/null +++ b/packages/horizon/test/unit/utils/Bounder.t.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.27; + +import { Test } from "forge-std/Test.sol"; + +contract Bounder is Test { + uint256 constant SECP256K1_CURVE_ORDER = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141; + + function boundAddrAndKey(uint256 _value) internal pure returns (uint256, address) { + uint256 signerKey = bound(_value, 1, SECP256K1_CURVE_ORDER - 1); + return (signerKey, vm.addr(signerKey)); + } + + function boundAddr(uint256 _value) internal pure returns (address) { + (, address addr) = boundAddrAndKey(_value); + return addr; + } + + function boundKey(uint256 _value) internal pure returns (uint256) { + (uint256 key, ) = boundAddrAndKey(_value); + return key; + } + + function boundChainId(uint256 _value) internal pure returns (uint256) { + return bound(_value, 1, (2 ^ 64) - 1); + } + + function boundTimestampMin(uint256 _value, uint256 _min) internal pure returns (uint256) { + return bound(_value, _min, type(uint256).max); + } +} diff --git a/packages/horizon/test/unit/utils/Constants.sol b/packages/horizon/test/unit/utils/Constants.sol new file mode 100644 index 000000000..0aa53700d --- /dev/null +++ b/packages/horizon/test/unit/utils/Constants.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +abstract contract Constants { + uint32 internal constant MAX_PPM = 1000000; // 100% in parts per million + uint256 internal constant delegationFeeCut = 100000; // 10% in parts per million + uint256 internal constant MAX_STAKING_TOKENS = 10_000_000_000 ether; + // GraphEscrow parameters + uint256 internal constant withdrawEscrowThawingPeriod = 60; + // GraphPayments parameters + uint256 internal constant protocolPaymentCut = 10000; + // Staking constants + uint256 internal constant MAX_THAW_REQUESTS = 1_000; + uint64 internal constant MAX_THAWING_PERIOD = 28 days; + uint32 internal constant THAWING_PERIOD_IN_BLOCKS = 300; + uint256 internal constant MIN_DELEGATION = 1e18; + // Epoch manager + uint256 internal constant EPOCH_LENGTH = 1; + // Rewards manager + uint256 internal constant ALLOCATIONS_REWARD_CUT = 100 ether; + // GraphTallyCollector + uint256 internal constant revokeSignerThawingPeriod = 7 days; +} diff --git a/packages/horizon/test/unit/utils/Users.sol b/packages/horizon/test/unit/utils/Users.sol new file mode 100644 index 000000000..6213e4e82 --- /dev/null +++ b/packages/horizon/test/unit/utils/Users.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +struct Users { + address governor; + address deployer; + address indexer; + address operator; + address gateway; + address verifier; + address delegator; + address legacySlasher; +} diff --git a/packages/horizon/test/unit/utils/Utils.sol b/packages/horizon/test/unit/utils/Utils.sol new file mode 100644 index 000000000..be42f269f --- /dev/null +++ b/packages/horizon/test/unit/utils/Utils.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +abstract contract Utils is Test { + /// @dev Stops the active prank and sets a new one. + function resetPrank(address msgSender) internal { + vm.stopPrank(); + vm.startPrank(msgSender); + } +} diff --git a/packages/horizon/tsconfig.json b/packages/horizon/tsconfig.json new file mode 100644 index 000000000..b64264422 --- /dev/null +++ b/packages/horizon/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": [ + "hardhat.config.ts", + "types/**/*.ts", + "scripts/**/*.ts", + "tasks/**/*.ts", + "test/**/*.ts", + "ignition/**/*.ts", + "eslint.config.js", + "prettier.config.js", + "natspec-smells.config.js" + ] +} diff --git a/packages/sdk/.markdownlint.json b/packages/interfaces/.markdownlint.json similarity index 100% rename from packages/sdk/.markdownlint.json rename to packages/interfaces/.markdownlint.json diff --git a/packages/common/.solhint.json b/packages/interfaces/.solhint.json similarity index 100% rename from packages/common/.solhint.json rename to packages/interfaces/.solhint.json diff --git a/packages/interfaces/CHANGELOG.md b/packages/interfaces/CHANGELOG.md new file mode 100644 index 000000000..336f3ec11 --- /dev/null +++ b/packages/interfaces/CHANGELOG.md @@ -0,0 +1,78 @@ +# @graphprotocol/interfaces + +## 0.6.0 + +### Minor Changes + +- Updated indexer struct and function signature + +## 0.5.2 + +### Patch Changes + +- fix: add missing nextAccountSeqID and multicall to IL2GNSToolshed interface + +## 0.5.1 + +### Patch Changes + +- Fix export conditions order to resolve Next.js import errors + +## 0.5.0 + +### Minor Changes + +- Add vesting interfaces for Horizon protocol + - Add IGraphTokenLockWallet base interface for core vesting functionality + - Add IGraphTokenLockWalletToolshed interface with Horizon protocol interactions + - Include functions for stake management, provision management, delegation, and configuration + - Support both current and legacy withdrawDelegated signatures for backward compatibility + +## 0.4.0 + +### Minor Changes + +- Add ethers v5 type generation to interfaces package + +## 0.3.0 + +### Minor Changes + +- Add wagmi type generation for interfaces package + +## 0.2.5 + +### Patch Changes + +- fbe38f9: Add ICuration to L2Curation interface +- Add missing events to SubgraphService and RewardsManager interfaces + +## 0.2.4 + +### Patch Changes + +- Ensure latest build is published to npm + +## 0.2.3 + +### Patch Changes + +- Add missing interfaces to SubgraphService and ServiceRegistry contracts + +## 0.2.2 + +### Patch Changes + +- Ensure dist files are published to NPM + +## 0.2.1 + +### Patch Changes + +- Make interfaces package public + +## 0.2.0 + +### Minor Changes + +- Extracted contract interfaces into its own package diff --git a/packages/interfaces/README.md b/packages/interfaces/README.md new file mode 100644 index 000000000..ff0fe932d --- /dev/null +++ b/packages/interfaces/README.md @@ -0,0 +1,66 @@ +# @graphprotocol/interfaces + +Contract interfaces and types for The Graph protocol. + +## Overview + +This package contains contract interfaces and types used in dependent packages, which makes building systems that interact with The Graph contracts simpler, as the implementation information is not included. + +## Installation + +```bash +pnpm add @graphprotocol/interfaces +``` + +## Usage + +### Contract interfaces + +Solidity contract interfaces can be imported from `@graphprotocol/interfaces/contracts/...`: + +```solidity +pragma solidity 0.8.27; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract GraphPayments is IGraphPayments { + ... +} +``` + +Note that contracts in the `toolshed/` directory are not meant to be imported by Solidity code, they only exist to +generate complete TypeScript types. + +### TypeScript types + +This package provides types generated with [Typechain](https://github.com/dethcrypto/TypeChain) compatible with ethers v6. To use them import with: + +```ts +import { + GraphPayments, + GraphTallyCollector, + HorizonStaking, + L2GraphToken, + PaymentsEscrow, + SubgraphService, +} from '@graphprotocol/interfaces' +``` + +### TypeScript library + +Additionally, the package exposes a few helper functions to facilitate the creation of fully typed ethers v6 contracts: + +| Function Name | Description | +| -------------------- | ----------------------------------------------------------- | +| `getInterface` | Retrieves the contract interface for a given contract name. | +| `getMergedInterface` | Loads and merges interfaces from multiple contract names. | +| `getAbi` | Gets the ABI for a given contract name. | + +```ts +import { + getInterface, + SubgraphService +} from '@graphprotocol/interfaces + +const subgraphService = new ethers.Contract('0x12...90', getInterface('SubgraphService')) as SubgraphService +``` diff --git a/packages/common/contracts/eligibility/IRewardsEligibilityOracle.sol b/packages/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol similarity index 100% rename from packages/common/contracts/eligibility/IRewardsEligibilityOracle.sol rename to packages/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol diff --git a/packages/interfaces/contracts/token/IGraphToken.sol b/packages/interfaces/contracts/token/IGraphToken.sol new file mode 100644 index 000000000..abb6a4319 --- /dev/null +++ b/packages/interfaces/contracts/token/IGraphToken.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +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 + * @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 minter to the contract + * @param _account The account to add as a minter + */ + function addMinter(address _account) external; + + /** + * @notice Removes a minter from the contract + * @param _account The account to remove as a minter + */ + function removeMinter(address _account) external; + + /** + * @notice Renounces minter role for the caller + */ + function renounceMinter() external; + + /** + * @notice Checks if an account is a minter + * @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, + uint256 _value, + uint256 _deadline, + uint8 _v, + bytes32 _r, + bytes32 _s + ) external; + + // -- 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/hardhat.config.ts b/packages/interfaces/hardhat.config.ts new file mode 100644 index 000000000..869544e67 --- /dev/null +++ b/packages/interfaces/hardhat.config.ts @@ -0,0 +1,12 @@ +import '@nomicfoundation/hardhat-toolbox' + +const config = { + solidity: { + compilers: [{ version: '0.8.27' }, { version: '0.7.6' }], + }, + typechain: { + outDir: 'types', + }, +} + +module.exports = config diff --git a/packages/interfaces/package.json b/packages/interfaces/package.json new file mode 100644 index 000000000..8de3a67b5 --- /dev/null +++ b/packages/interfaces/package.json @@ -0,0 +1,66 @@ +{ + "name": "@graphprotocol/interfaces", + "version": "0.6.0", + "publishConfig": { + "access": "public" + }, + "description": "Contract interfaces for The Graph protocol", + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + }, + "./types-v5": { + "types": "./dist/types-v5/index.d.ts", + "default": "./dist/types-v5/index.js" + }, + "./wagmi": { + "types": "./dist/wagmi/generated.d.ts", + "default": "./dist/wagmi/generated.js" + } + }, + "files": [ + "artifacts/**/*", + "dist/**/*", + "contracts/**/*", + "types/**/*", + "types-v5/**/*", + "wagmi/**/*", + "README.md" + ], + "author": "The Graph Team", + "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: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: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: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-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", + "typechain": "^8.3.2", + "viem": "^2.31.7" + } +} diff --git a/packages/interfaces/prettier.config.cjs b/packages/interfaces/prettier.config.cjs new file mode 100644 index 000000000..4e8dcf4f3 --- /dev/null +++ b/packages/interfaces/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/interfaces/scripts/build.sh b/packages/interfaces/scripts/build.sh new file mode 100755 index 000000000..30f723a44 --- /dev/null +++ b/packages/interfaces/scripts/build.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Complete build script for the interfaces package +# This script handles: +# 1. Hardhat compilation (generates artifacts and ethers-v6 types) +# 2. Type generation (WAGMI and ethers-v5 types) +# 3. TypeScript compilation (both v6 and v5 types) + +set -e # Exit on any error + +echo "🔨 Starting complete build process..." + +# 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/ + +echo "✅ Build completed successfully!" +echo "📄 Generated types:" +echo " - ethers-v6: dist/types/" +echo " - ethers-v5: dist/types-v5/" +echo " - wagmi: dist/wagmi/" \ No newline at end of file diff --git a/packages/interfaces/src/index.ts b/packages/interfaces/src/index.ts new file mode 100644 index 000000000..4601ab75e --- /dev/null +++ b/packages/interfaces/src/index.ts @@ -0,0 +1,180 @@ +import { ContractRunner, Interface } from 'ethers' + +import { factories } from '../types' + +export * from './types/horizon' +export * from './types/subgraph-service' + +/** + * Interface representing a static contract factory with methods to create interfaces and connect to contracts + * @template ContractType - The type of the contract instance + * @template InterfaceType - The type of the contract interface + */ +interface ContractFactoryStatic { + readonly abi: unknown[] + createInterface(): InterfaceType + connect(address: string, runner?: ContractRunner | null): ContractType +} + +/** + * Gets the contract interface for a given contract name + * @param {string} contractName - The name of the contract to get the interface for + * @returns {Interface} The contract interface + * @throws {Error} If no interface is found for the given contract name + */ +export function getInterface(contractName: string): Interface { + const alternatives = getContractNameAlternatives(contractName) + for (const alternative of alternatives) { + const factory = collectFactoriesMap(factories)[alternative] + if (factory) { + return factory.createInterface() + } + } + throw new Error(`No interface found for contract ${contractName}`) +} + +/** + * Loads and merges interfaces from multiple contract names. + * + * @param names Array of contract names + * @returns Merged ethers.js Interface + */ +export function getMergedInterface(names: string[]): Interface { + const abis = names.map((name) => { + const iface = getInterface(name) + return (iface as Interface).fragments + }) + + const mergedFragments = abis.flat() + + return new Interface(mergedFragments) +} + +/** + * Gets the ABI for a given contract name + * @param {string} contractName - The name of the contract to get the ABI for + * @returns {unknown[]} The contract ABI + * @throws {Error} If no ABI is found for the given contract name + */ +export function getAbi(contractName: string): unknown[] { + const alternatives = getContractNameAlternatives(contractName) + for (const alternative of alternatives) { + const factory = collectFactoriesMap(factories)[alternative] + if (factory) { + return factory.abi + } + } + throw new Error(`No abi found for contract ${contractName}`) +} + +/** + * Collects all contract factories from the given object into a map by recursively traversing the object structure. + * Handles factory name overrides and normalizes contract names by removing '__factory' suffix. + * + * @param {unknown} obj - The object containing contract factories to be collected + * @returns {Record} A map of contract names to their factory instances + * @private + */ +function collectFactoriesMap(obj: unknown): Record { + const factoriesMap: Record = {} + + // For factory name 'x', use contract name 'y' + const factoryNameOverrides: Record = { + 'contracts.contracts.disputes.IDisputeManager__factory': 'ILegacyDisputeManager', + } + + // For contract name 'x', also create an entry for alias 'y' in the factory map + const factoryNameAliases: Record = { + IServiceRegistry: 'ILegacyServiceRegistry', + } + + function recurse(value: unknown, path: string[] = []) { + if (typeof value !== 'object' || value === null) { + return + } + + const entries = Object.entries(value) + + for (const [key, val] of entries) { + const currentPath = [...path, key] + const currentPathString = currentPath.join('.') + + if (key.endsWith('__factory')) { + const descriptor = Object.getOwnPropertyDescriptor(value, key) + const factory = descriptor?.get ? descriptor.get.call(value) : val + + const contractName = factoryNameOverrides[currentPathString] + ? factoryNameOverrides[currentPathString] + : key.replace(/__factory$/, '') + + if (factoriesMap[contractName]) { + console.log( + `⚠️ Duplicate factory for contract "${contractName}" found at path "${currentPathString}". Keeping the first occurrence. If both are needed add overrides.`, + ) + continue + } + + // Add main entry + factoriesMap[contractName] = factory as ContractFactoryStatic + + // If alias exists, add alias entry too + if (factoryNameAliases[contractName]) { + const aliasName = factoryNameAliases[contractName] + + if (factoriesMap[aliasName]) { + console.log( + `⚠️ Duplicate factory for alias "${aliasName}" derived from "${contractName}". Keeping the first occurrence.`, + ) + } else { + factoriesMap[aliasName] = factory as ContractFactoryStatic + } + } + } else if (typeof val === 'object' && val !== null) { + recurse(val, currentPath) + } + } + } + + recurse(obj) + + return factoriesMap +} + +/** + * Gets alternative names for a contract to handle interface naming conventions + * For any given value passed to it, returns `ContractName` and `IContractName` + * Note that this function will apply toolshed overrides, this returns a more complete interface + * @param {string} contractName - The original contract name + * @returns {string[]} Array of possible contract names including interface variants + * @private + */ +function getContractNameAlternatives(contractName: string): string[] { + const nameOverrides: Record = { + Controller: 'ControllerToolshed', + DisputeManager: 'DisputeManagerToolshed', + EpochManager: 'EpochManagerToolshed', + L2GNS: 'L2GNSToolshed', + GraphTallyCollector: 'GraphTallyCollectorToolshed', + GraphTokenLockWallet: 'GraphTokenLockWalletToolshed', + HorizonStaking: 'HorizonStakingToolshed', + L2Curation: 'L2CurationToolshed', + PaymentsEscrow: 'PaymentsEscrowToolshed', + RewardsManager: 'RewardsManagerToolshed', + ServiceRegistry: 'ServiceRegistryToolshed', + SubgraphService: 'SubgraphServiceToolshed', + } + + if (nameOverrides[contractName]) { + contractName = nameOverrides[contractName] + } + + const alternatives: string[] = [contractName] + + if (contractName.startsWith('I')) { + alternatives.push(contractName.replace('I', '')) + } else { + alternatives.push(`I${contractName}`) + } + + return alternatives +} diff --git a/packages/interfaces/tsconfig.json b/packages/interfaces/tsconfig.json new file mode 100644 index 000000000..acc289254 --- /dev/null +++ b/packages/interfaces/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["hardhat.config.ts", "src/**/*.ts", "types/**/*.ts", "wagmi/**/*.ts"] +} diff --git a/packages/interfaces/tsconfig.v5.json b/packages/interfaces/tsconfig.v5.json new file mode 100644 index 000000000..d11ea1f04 --- /dev/null +++ b/packages/interfaces/tsconfig.v5.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist-v5", + "baseUrl": ".", + "paths": { + "ethers": ["node_modules/ethers-v5"], + "ethers/*": ["node_modules/ethers-v5/*"], + "@ethersproject/abi": ["node_modules/@ethersproject/abi"], + "@ethersproject/providers": ["node_modules/@ethersproject/providers"], + "@ethersproject/*": ["node_modules/@ethersproject/*"] + } + }, + "include": ["types-v5/**/*.ts"] +} diff --git a/packages/interfaces/wagmi.config.mts b/packages/interfaces/wagmi.config.mts new file mode 100644 index 000000000..cd7d02ca2 --- /dev/null +++ b/packages/interfaces/wagmi.config.mts @@ -0,0 +1,51 @@ +import { defineConfig, type Config } from '@wagmi/cli' +import { Abi } from 'viem' + +import GraphToken from './artifacts/contracts/contracts/token/IGraphToken.sol/IGraphToken.json' +import L2GNS from './artifacts/contracts/toolshed/IL2GNSToolshed.sol/IL2GNSToolshed.json' +import L2Curation from './artifacts/contracts/toolshed/IL2CurationToolshed.sol/IL2CurationToolshed.json' +import HorizonStaking from './artifacts/contracts/toolshed/IHorizonStakingToolshed.sol/IHorizonStakingToolshed.json' +import EpochManager from './artifacts/contracts/toolshed/IEpochManagerToolshed.sol/IEpochManagerToolshed.json' +import RewardsManager from './artifacts/contracts/toolshed/IRewardsManagerToolshed.sol/IRewardsManagerToolshed.json' +import L2GraphTokenGateway from './artifacts/contracts/contracts/l2/gateway/IL2GraphTokenGateway.sol/IL2GraphTokenGateway.json' +import GraphTokenLockWallet from './artifacts/contracts/toolshed/IGraphTokenLockWalletToolshed.sol/IGraphTokenLockWalletToolshed.json' + +// Only generate wagmi types for contracts that are used by the Explorer +export default defineConfig({ + out: 'wagmi/generated.ts', + contracts: [ + { + name: 'L2GNS', + abi: L2GNS.abi as Abi, + }, + { + name: 'L2Curation', + abi: L2Curation.abi as Abi, + }, + { + name: 'L2GraphToken', + abi: GraphToken.abi as Abi, + }, + { + name: 'HorizonStaking', + abi: HorizonStaking.abi as Abi, + }, + { + name: 'EpochManager', + abi: EpochManager.abi as Abi, + }, + { + name: 'RewardsManager', + abi: RewardsManager.abi as Abi, + }, + { + name: 'L2GraphTokenGateway', + abi: L2GraphTokenGateway.abi as Abi, + }, + { + name: 'GraphTokenLockWallet', + abi: GraphTokenLockWallet.abi as Abi, + }, + ], + plugins: [] +}) as Config diff --git a/packages/issuance/contracts/common/BaseUpgradeable.sol b/packages/issuance/contracts/common/BaseUpgradeable.sol index 85610f0c9..30df91cbd 100644 --- a/packages/issuance/contracts/common/BaseUpgradeable.sol +++ b/packages/issuance/contracts/common/BaseUpgradeable.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.27; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import { AccessControlUpgradeable } from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import { IGraphToken } from "@graphprotocol/common/contracts/token/IGraphToken.sol"; +import { IGraphToken } from "@graphprotocol/interfaces/contracts/token/IGraphToken.sol"; /** * @title BaseUpgradeable diff --git a/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol index 447ff7547..3d3a79196 100644 --- a/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol +++ b/packages/issuance/contracts/eligibility/RewardsEligibilityOracle.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.27; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol"; import { BaseUpgradeable } from "../common/BaseUpgradeable.sol"; /** diff --git a/packages/issuance/contracts/test/InterfaceIdExtractor.sol b/packages/issuance/contracts/test/InterfaceIdExtractor.sol index 22a2e4ee9..0efbb9d0a 100644 --- a/packages/issuance/contracts/test/InterfaceIdExtractor.sol +++ b/packages/issuance/contracts/test/InterfaceIdExtractor.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.0; -import { IRewardsEligibilityOracle } from "@graphprotocol/common/contracts/eligibility/IRewardsEligibilityOracle.sol"; +import { IRewardsEligibilityOracle } from "@graphprotocol/interfaces/contracts/eligibility/IRewardsEligibilityOracle.sol"; /** * @title InterfaceIdExtractor diff --git a/packages/issuance/package.json b/packages/issuance/package.json index 790234619..7971edc2a 100644 --- a/packages/issuance/package.json +++ b/packages/issuance/package.json @@ -35,7 +35,7 @@ "author": "The Graph Team", "license": "GPL-2.0-or-later", "devDependencies": { - "@graphprotocol/common": "workspace:^", + "@graphprotocol/interfaces": "workspace:^", "@nomicfoundation/hardhat-ethers": "catalog:", "@nomicfoundation/hardhat-verify": "catalog:", "@openzeppelin/contracts": "^5.3.0", diff --git a/packages/issuance/test/package.json b/packages/issuance/test/package.json index 51cb1a397..699469872 100644 --- a/packages/issuance/test/package.json +++ b/packages/issuance/test/package.json @@ -13,9 +13,8 @@ }, "dependencies": { "@graphprotocol/issuance": "workspace:^", - "@graphprotocol/common": "workspace:^", - "@graphprotocol/contracts": "workspace:^", - "@graphprotocol/sdk": "workspace:^" + "@graphprotocol/interfaces": "workspace:^", + "@graphprotocol/contracts": "workspace:^" }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", @@ -49,7 +48,7 @@ "clean": "rm -rf build", "test": "pnpm test:self", "test:self": "pnpm test:hardhat", - "test:hardhat": "pnpm --filter @graphprotocol/contracts --filter @graphprotocol/issuance --filter @graphprotocol/sdk build && hardhat test tests/*.test.ts tests/**/*.test.ts", + "test:hardhat": "pnpm --filter @graphprotocol/contracts --filter @graphprotocol/issuance build && hardhat test tests/*.test.ts tests/**/*.test.ts", "test:coverage": "scripts/coverage", "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/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md deleted file mode 100644 index 20a787d51..000000000 --- a/packages/sdk/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -# @graphprotocol/sdk - -## 0.5.0 - -### Minor Changes - -- 554af2c: feat(utils): add utility to parse subgraph ids - -### Patch Changes - -- c5641c5: Ensure L2 aliased addresses are the correct length -- Updated dependencies -- Updated dependencies [554af2c] - - @graphprotocol/contracts@6.2.0 diff --git a/packages/sdk/package.json b/packages/sdk/package.json deleted file mode 100644 index 4d41215d3..000000000 --- a/packages/sdk/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "@graphprotocol/sdk", - "version": "0.6.0", - "description": "TypeScript based SDK to interact with The Graph protocol contracts", - "main": "types/sdk/src/index.js", - "types": "types/sdk/src/index.d.ts", - "exports": { - ".": { - "default": "./types/sdk/src/index.js", - "types": "./types/sdk/src/index.d.ts" - }, - "./gre": { - "default": "./types/sdk/src/gre/index.js", - "types": "./types/sdk/src/gre/index.d.ts" - } - }, - "repository": "git@github.com:graphprotocol/sdk.git", - "author": "tomas@edgeandnode.com", - "license": "MIT", - "dependencies": { - "@arbitrum/sdk": "~3.1.13", - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/experimental": "^5.7.0", - "@ethersproject/providers": "^5.8.0", - "@graphprotocol/common-ts": "^2.0.7", - "@graphprotocol/contracts": "workspace:^", - "@nomicfoundation/hardhat-network-helpers": "^1.0.9", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "debug": "^4.3.4", - "ethers": "^5.7.0", - "hardhat": "catalog:", - "hardhat-secure-accounts": "0.0.6", - "inquirer": "^8.0.0", - "lodash": "^4.17.21", - "yaml": "^1.10.2" - }, - "devDependencies": { - "@eslint/js": "catalog:", - "@types/chai": "^4.3.9", - "@types/chai-as-promised": "^7.1.7", - "@types/debug": "^4.1.10", - "@types/inquirer": "^8.0.0", - "@types/lodash": "^4.14.200", - "@types/mocha": "^10.0.3", - "@types/node": "^20.17.50", - "chai": "^4.3.10", - "chai-as-promised": "^7.1.1", - "eslint": "catalog:", - "globals": "16.1.0", - "markdownlint-cli": "0.45.0", - "mocha": "^11.7.1", - "prettier": "catalog:", - "ts-node": "^10.9.2", - "typescript": "catalog:" - }, - "scripts": { - "lint": "pnpm lint:ts; 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:md": "markdownlint --fix --ignore-path ../../.gitignore '**/*.md'; prettier -w --cache --log-level warn '**/*.md'", - "lint:json": "prettier -w --cache --log-level warn '**/*.json'", - "prettier": "prettier --write '**/*.{js,ts,cjs,mjs,jsx,tsx}'", - "test": "pnpm test:self", - "test:self": "pnpm build && pnpm test:gre", - "test:gre": "mocha --exit --recursive 'src/gre/test/**/*.test.ts'", - "clean": "rm -rf cache dist", - "build": "pnpm build:dep && pnpm build:self", - "build:dep": "pnpm --filter @graphprotocol/contracts build", - "build:self": "tsc", - "build:clean": "pnpm clean && pnpm build" - }, - "files": [ - "types/*", - "src/*", - "README.md", - "CHANGELOG.md", - "LICENSE" - ] -} diff --git a/packages/sdk/src/chain/id.ts b/packages/sdk/src/chain/id.ts deleted file mode 100644 index 433a1c037..000000000 --- a/packages/sdk/src/chain/id.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { GraphChainList } from './list' -import type { GraphChainId, GraphL1ChainId, GraphL2ChainId } from './types' -import { isGraphChainId, isGraphL1ChainId, isGraphL2ChainId } from './types' - -/** A list of all L1 chain ids supported by the protocol */ -export const l1Chains: GraphL1ChainId[] = GraphChainList.map((c) => c.l1.id) -/** A list of all L2 chain ids supported by the protocol */ -export const l2Chains: GraphL2ChainId[] = GraphChainList.map((c) => c.l2.id) -/** A list of all chain ids supported by the protocol */ -export const chains: GraphChainId[] = [...l1Chains, ...l2Chains] - -/** - * Gets the L2 chain id that corresponds to the given L1 chain id - * @param chainId The L1 chain id - * @returns The L2 chain id - * - * @throws Error if the given chain id is not a valid L1 chain id - */ -export const l1ToL2 = (chainId: number): GraphChainId => { - if (!isGraphL1ChainId(chainId)) throw new Error(`Invalid L1 chain id: ${chainId}`) - const pair = GraphChainList.find((cp) => cp.l1.id === chainId) - if (pair === undefined) { - throw new Error(`Could not find L2 chain id for L1 chain id: ${chainId}`) - } - return pair.l2.id -} -/** - * Gets the L1 chain id that corresponds to the given L2 chain id - * @param chainId The L2 chain id - * @returns The L1 chain id - * - * @throws Error if the given chain id is not a valid L2 chain id - */ -export const l2ToL1 = (chainId: number): GraphChainId => { - if (!isGraphL2ChainId(chainId)) throw new Error(`Invalid L2 chain id: ${chainId}`) - const pair = GraphChainList.find((cp) => cp.l2.id === chainId) - if (pair === undefined) { - throw new Error(`Could not find L1 chain id for L2 chain id: ${chainId}`) - } - return pair.l1.id -} -/** - * Gets the counterpart chain id to the given L1 or L2 chain id - * @param chainId The chain id - * @returns The counterpart chain id - * - * @throws Error if the given chain id is not a valid chain id - */ -export const counterpart = (chainId: number): GraphChainId => { - if (!isGraphChainId(chainId)) throw new Error(`Invalid chain id: ${chainId}`) - return isGraphL1ChainId(chainId) ? l1ToL2(chainId) : l2ToL1(chainId) -} diff --git a/packages/sdk/src/chain/index.ts b/packages/sdk/src/chain/index.ts deleted file mode 100644 index 3ea96085a..000000000 --- a/packages/sdk/src/chain/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { chains, counterpart, l1Chains, l1ToL2, l2Chains, l2ToL1 } from './id' -export { chainNames, counterpartName, l1ChainNames, l1ToL2Name, l2ChainNames, l2ToL1Name } from './name' -export type { GraphChainId, GraphL1ChainId, GraphL1ChainName, GraphL2ChainId, GraphL2ChainName } from './types' -export { - isGraphChainId, - isGraphChainL1Localhost, - isGraphChainL2Localhost, - isGraphChainName, - isGraphL1ChainId, - isGraphL1ChainName, - isGraphL2ChainId, - isGraphL2ChainName, -} from './types' diff --git a/packages/sdk/src/chain/list.ts b/packages/sdk/src/chain/list.ts deleted file mode 100644 index 471fd0407..000000000 --- a/packages/sdk/src/chain/list.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Master chain list for all the chain pairs supported by the Graph Protocol - * See {@link GraphChainPair} for details on the structure of a chain pair - * @enum - */ -export const GraphChainList = [ - { - l1: { - id: 1, - name: 'mainnet', - }, - l2: { - id: 42161, - name: 'arbitrum-one', - }, - }, - { - l1: { - id: 4, - name: 'rinkeby', - }, - l2: { - id: 421611, - name: 'arbitrum-rinkeby', - }, - }, - { - l1: { - id: 11155111, - name: 'sepolia', - }, - l2: { - id: 421614, - name: 'arbitrum-sepolia', - }, - }, - { - l1: { - id: 5, - name: 'goerli', - }, - l2: { - id: 421613, - name: 'arbitrum-goerli', - }, - }, - { - l1: { - id: 1337, - name: 'localnitrol1', - }, - l2: { - id: 412346, - name: 'localnitrol2', - }, - }, -] as const diff --git a/packages/sdk/src/chain/name.ts b/packages/sdk/src/chain/name.ts deleted file mode 100644 index 658e1d3e4..000000000 --- a/packages/sdk/src/chain/name.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { GraphChainList } from './list' -import type { GraphChainName, GraphL1ChainName, GraphL2ChainName } from './types' -import { isGraphChainName, isGraphL1ChainName, isGraphL2ChainName } from './types' - -/** A list of all L1 chain names supported by the protocol */ -export const l1ChainNames: GraphL1ChainName[] = GraphChainList.map((c) => c.l1.name) -/** A list of all L2 chain names supported by the protocol */ -export const l2ChainNames: GraphL2ChainName[] = GraphChainList.map((c) => c.l2.name) -/** A list of all chain names supported by the protocol */ -export const chainNames: GraphChainName[] = [...l1ChainNames, ...l2ChainNames] - -/** - * Gets the L2 chain name that corresponds to the given L1 chain name - * @param name The L1 chain name - * @returns The L2 chain name - * - * @throws Error if the given chain name is not a valid L1 chain name - */ -export const l1ToL2Name = (name: string): GraphChainName => { - if (!isGraphL1ChainName(name)) throw new Error(`Invalid L1 chain name: ${name}`) - const pair = GraphChainList.find((cp) => cp.l1.name === name) - if (pair === undefined) { - throw new Error(`Could not find L2 chain name for L1 chain name: ${name}`) - } - return pair.l2.name -} -/** - * Gets the L1 chain name that corresponds to the given L2 chain name - * @param name The L2 chain name - * @returns The L1 chain name - * - * @throws Error if the given chain name is not a valid L2 chain name - */ -export const l2ToL1Name = (name: string): GraphChainName => { - if (!isGraphL2ChainName(name)) throw new Error(`Invalid L2 chain name: ${name}`) - const pair = GraphChainList.find((cp) => cp.l2.name === name) - if (pair === undefined) { - throw new Error(`Could not find L1 chain name for L2 chain name: ${name}`) - } - return pair.l1.name -} -/** - * Gets the counterpart chain name to the given L1 or L2 chain name - * @param chainId The chain name - * @returns The counterpart chain name - * - * @throws Error if the given chain name is not a valid chain name - */ -export const counterpartName = (name: string): GraphChainName => { - if (!isGraphChainName(name)) throw new Error(`Invalid chain name: ${name}`) - return isGraphL1ChainName(name) ? l1ToL2Name(name) : l2ToL1Name(name) -} diff --git a/packages/sdk/src/chain/types.ts b/packages/sdk/src/chain/types.ts deleted file mode 100644 index 9caf122fc..000000000 --- a/packages/sdk/src/chain/types.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { l1Chains, l2Chains } from './id' -import type { GraphChainList } from './list' -import { l1ChainNames, l2ChainNames } from './name' - -/** - * A chain pair is an object containing a valid L1 and L2 chain pairing - * - * @example - * { - * l1: { - * id: 1, - * name: 'mainnet', - * }, - * l2: { - * id: 42161, - * name: 'arbitrum-one', - * }, - * } - */ -export type GraphChainPair = (typeof GraphChainList)[number] - -/** L1 chain ids supported by the protocol */ -export type GraphL1ChainId = GraphChainPair['l1']['id'] -/** L2 chain ids supported by the protocol */ -export type GraphL2ChainId = GraphChainPair['l2']['id'] -/** L1 and L2 chain ids supported by the protocol */ -export type GraphChainId = GraphL1ChainId | GraphL2ChainId - -/** L1 chain names supported by the protocol */ -export type GraphL1ChainName = GraphChainPair['l1']['name'] -/** L2 chain names supported by the protocol */ -export type GraphL2ChainName = GraphChainPair['l2']['name'] -/** L1 and L2 chain names supported by the protocol */ -export type GraphChainName = GraphL1ChainName | GraphL2ChainName - -// ** Type guards ** - -/** Type guard for {@link GraphL1ChainId} */ -export function isGraphL1ChainId(value: unknown): value is GraphL1ChainId { - return typeof value === 'number' && l1Chains.includes(value as GraphL1ChainId) -} -/** Type guard for {@link GraphL2ChainId} */ -export function isGraphL2ChainId(value: unknown): value is GraphL2ChainId { - return typeof value === 'number' && l2Chains.includes(value as GraphL2ChainId) -} -/** Type guard for {@link GraphChainId} */ -export function isGraphChainId(value: unknown): value is GraphChainId { - return typeof value === 'number' && (isGraphL1ChainId(value) || isGraphL2ChainId(value)) -} - -export function isGraphChainL1Localhost(value: unknown): value is GraphChainId { - return typeof value === 'number' && value === 1337 -} - -/** Type guard for {@link GraphL1ChainName} */ -export function isGraphL1ChainName(value: unknown): value is GraphL1ChainName { - return typeof value === 'string' && l1ChainNames.includes(value as GraphL1ChainName) -} -/** Type guard for {@link GraphL2ChainName} */ -export function isGraphL2ChainName(value: unknown): value is GraphL2ChainName { - return typeof value === 'string' && l2ChainNames.includes(value as GraphL2ChainName) -} -/** Type guard for {@link GraphChainName} */ -export function isGraphChainName(value: unknown): value is GraphChainName { - return typeof value === 'string' && (isGraphL1ChainName(value) || isGraphL2ChainName(value)) -} - -export function isGraphChainL2Localhost(value: unknown): value is GraphChainId { - return typeof value === 'number' && value === 1337 -} diff --git a/packages/sdk/src/deployments/index.ts b/packages/sdk/src/deployments/index.ts deleted file mode 100644 index b9487d4e9..000000000 --- a/packages/sdk/src/deployments/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -export { AddressBook, SimpleAddressBook } from './lib/address-book' -export { writeConfig } from './lib/config' -export { loadContractAt } from './lib/contracts/load' -export { DeployType } from './lib/types/deploy' - -// Export configuration and contract types -export type { ABRefReplace, ContractConfig, ContractConfigCall, ContractConfigParam } from './lib/types/config' -export type { ContractList, ContractParam } from './lib/types/contract' - -// Graph Network Contracts -export * from './network/actions/bridge-config' -export * from './network/actions/bridge-to-l1' -export * from './network/actions/bridge-to-l2' -export * from './network/actions/disputes' -export * from './network/actions/gns' -export * from './network/actions/governed' -export * from './network/actions/graph-token' -export * from './network/actions/pause' -export * from './network/actions/staking' -export type { GraphNetworkAction } from './network/actions/types' -export { GraphNetworkAddressBook } from './network/deployment/address-book' -export { - getDefaults, - GraphNetworkConfigContractList, - GraphNetworkConfigGeneralParams, - updateContractParams, - updateGeneralParams, -} from './network/deployment/config' -export { deploy, deployGraphNetwork, deployMockGraphNetwork } from './network/deployment/contracts/deploy' -export type { GraphNetworkContractName } from './network/deployment/contracts/list' -export { - GraphNetworkContractNameList, - GraphNetworkGovernedContractNameList, - GraphNetworkL1ContractNameList, - GraphNetworkL2ContractNameList, - isGraphNetworkContractName, -} from './network/deployment/contracts/list' -export type { GraphNetworkContracts } from './network/deployment/contracts/load' -export { loadGraphNetworkContracts } from './network/deployment/contracts/load' diff --git a/packages/sdk/src/deployments/lib/address-book.ts b/packages/sdk/src/deployments/lib/address-book.ts deleted file mode 100644 index 98c5be8f0..000000000 --- a/packages/sdk/src/deployments/lib/address-book.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { AssertionError } from 'assert' -import fs from 'fs' - -import { assertObject } from '../../utils/assertions' -import { logInfo } from '../logger' -import type { AddressBookEntry, AddressBookJson } from './types/address-book' - -/** - * Format JSON content using Prettier to match project formatting standards - */ -function formatJsonWithPrettier(content: string): string { - try { - // Try to use prettier if available - const prettier = require('prettier') - // Look for prettier config starting from the contracts package directory - const configPath = require('path').resolve(__dirname, '../../../..') - const prettierConfig = prettier.resolveConfigSync(configPath) || {} - return prettier.format(content, { - ...prettierConfig, - parser: 'json', - }) - } catch (error) { - // Fallback to standard JSON formatting if prettier is not available - const errorMessage = error instanceof Error ? error.message : String(error) - logInfo(`Prettier formatting failed: ${errorMessage}, using standard JSON formatting`) - return content - } -} - -/** - * An abstract class to manage the address book - * Must be extended and implement `assertChainId` and `assertAddressBookJson` - */ -export abstract class AddressBook { - // The path to the address book file - public file: string - - // The chain id of the network the address book should be loaded for - public chainId: ChainId - - // The raw contents of the address book file - public addressBook: AddressBookJson - - public strictAssert: boolean - - /** - * Constructor for the `AddressBook` class - * - * @param _file the path to the address book file - * @param _chainId the chain id of the network the address book should be loaded for - * - * @throws AssertionError if the target file is not a valid address book - * @throws Error if the target file does not exist - */ - constructor(_file: string, _chainId: number, strictAssert = false) { - this.strictAssert = strictAssert - this.file = _file - if (!fs.existsSync(this.file)) throw new Error(`Address book path provided does not exist!`) - - logInfo(`Loading address book for chainId ${_chainId} from ${this.file}`) - this.assertChainId(_chainId) - this.chainId = _chainId - - // Ensure file is a valid address book - this.addressBook = JSON.parse(fs.readFileSync(this.file, 'utf8') || '{}') - this.assertAddressBookJson(this.addressBook) - - // If the address book is empty for this chain id, initialize it with an empty object - if (!this.addressBook[this.chainId]) { - this.addressBook[this.chainId] = {} as Record - } - } - - abstract assertChainId(chainId: string | number): asserts chainId is ChainId - - abstract assertAddressBookJson(json: unknown): asserts json is AddressBookJson - - // Assertion helper: call from `assertAddressBookJson` implementation - _assertAddressBookJson(json: unknown): asserts json is AddressBookJson { - assertObject(json, 'Assertion failed: address book is not an object') - - const contractList = json[this.chainId] - try { - assertObject(contractList, 'Assertion failed: chain contract list is not an object') - } catch (error) { - if (this.strictAssert) throw error - else return - } - - const contractNames = Object.keys(contractList) - for (const contractName of contractNames) { - this._assertAddressBookEntry(contractList[contractName]) - } - } - - _assertAddressBookEntry(json: unknown): asserts json is AddressBookEntry { - assertObject(json) - - try { - if (typeof json.address !== 'string') throw new AssertionError({ message: 'Invalid address' }) - if (json.constructorArgs && !Array.isArray(json.constructorArgs)) - throw new AssertionError({ message: 'Invalid constructorArgs' }) - if (json.initArgs && !Array.isArray(json.initArgs)) throw new AssertionError({ message: 'Invalid initArgs' }) - if (json.creationCodeHash && typeof json.creationCodeHash !== 'string') - throw new AssertionError({ message: 'Invalid creationCodeHash' }) - if (json.runtimeCodeHash && typeof json.runtimeCodeHash !== 'string') - throw new AssertionError({ message: 'Invalid runtimeCodeHash' }) - if (json.txHash && typeof json.txHash !== 'string') throw new AssertionError({ message: 'Invalid txHash' }) - if (json.proxy && typeof json.proxy !== 'boolean') throw new AssertionError({ message: 'Invalid proxy' }) - if (json.implementation && typeof json.implementation !== 'object') - throw new AssertionError({ message: 'Invalid implementation' }) - if (json.libraries && typeof json.libraries !== 'object') - throw new AssertionError({ message: 'Invalid libraries' }) - } catch (error) { - if (this.strictAssert) throw error - else return - } - } - /** - * List entry names in the address book - * - * @returns a list with all the names of the entries in the address book - */ - listEntries(): ContractName[] { - return Object.keys(this.addressBook[this.chainId]) as ContractName[] - } - - /** - * Get an entry from the address book - * - * @param name the name of the contract to get - * @returns the address book entry for the contract - * Returns an empty address book entry if the contract is not found - */ - getEntry(name: ContractName): AddressBookEntry { - try { - return this.addressBook[this.chainId][name] - } catch { - // TODO: should we throw instead? - // We could use ethers.constants.AddressZero but it's a costly import - return { address: '0x0000000000000000000000000000000000000000' } - } - } - - /** - * Save an entry to the address book - * - * @param name the name of the contract to save - * @param entry the address book entry for the contract - */ - setEntry(name: ContractName, entry: AddressBookEntry): void { - this.addressBook[this.chainId][name] = entry - try { - const jsonContent = JSON.stringify(this.addressBook, null, 2) - // Format with prettier to match project standards - const formattedContent = formatJsonWithPrettier(jsonContent) - fs.writeFileSync(this.file, formattedContent) - } catch (e: unknown) { - if (e instanceof Error) console.log(`Error saving artifacts: ${e.message}`) - else console.log(`Error saving artifacts: ${e}`) - } - } -} - -export class SimpleAddressBook extends AddressBook { - assertChainId(chainId: string | number): asserts chainId is number {} - assertAddressBookJson(json: unknown): asserts json is AddressBookJson {} -} diff --git a/packages/sdk/src/deployments/lib/config.ts b/packages/sdk/src/deployments/lib/config.ts deleted file mode 100644 index 9f82b880b..000000000 --- a/packages/sdk/src/deployments/lib/config.ts +++ /dev/null @@ -1,157 +0,0 @@ -import fs from 'fs' -import YAML from 'yaml' -import { Scalar, YAMLMap } from 'yaml/types' - -import { AddressBook } from './address-book' -import type { ABRefReplace, ContractConfig, ContractConfigCall, ContractConfigParam } from './types/config' -import type { ContractParam } from './types/contract' - -// TODO: tidy this up -const ABRefMatcher = /\${{([A-Z]\w.+)}}/ - -function parseConfigValue(value: string, addressBook: AddressBook, deployerAddress: string) { - return isAddressBookRef(value) - ? parseAddressBookRef(addressBook, value, [{ ref: 'Env.deployer', replace: deployerAddress }]) - : value -} - -function isAddressBookRef(value: string): boolean { - return ABRefMatcher.test(value) -} - -function parseAddressBookRef(addressBook: AddressBook, value: string, abInject: ABRefReplace[]): string { - const valueMatch = ABRefMatcher.exec(value) - if (valueMatch === null) { - throw new Error('Could not parse address book reference') - } - const ref = valueMatch[1] - const [contractName, contractAttr] = ref.split('.') - - // This is a convention to inject variables into the config, for example the deployer address - const inject = abInject.find((ab) => ab.ref === ref) - if (inject) { - return inject.replace - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const entry = addressBook.getEntry(contractName) as { [key: string]: any } - return entry[contractAttr] -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function readConfig(path: string, retainMetadata = false): any { - const file = fs.readFileSync(path, 'utf8') - return retainMetadata ? YAML.parseDocument(file) : YAML.parse(file) -} - -export function writeConfig(path: string, data: string): void { - fs.writeFileSync(path, data) -} - -export function loadCallParams( - values: Array, - addressBook: AddressBook, - deployerAddress: string, -): Array { - return values.map((value) => parseConfigValue(value as string, addressBook, deployerAddress)) -} - -export function getContractConfig( - config: Record, - addressBook: AddressBook, - name: string, - deployerAddress: string, -): ContractConfig { - const contractConfig = ((config.contracts as Record)[name] as Record) || {} - const contractParams: Array = [] - const contractCalls: Array = [] - let proxy = false - - const optsList = Object.entries(contractConfig) as Array> - for (const [name, value] of optsList) { - // Process constructor params - if (name.startsWith('init')) { - const initList = Object.entries(contractConfig.init as Record) as Array> - for (const [initName, initValue] of initList) { - contractParams.push({ - name: initName, - value: parseConfigValue(initValue, addressBook, deployerAddress), - }) - } - continue - } - - // Process contract calls - if (name.startsWith('calls')) { - for (const entry of contractConfig.calls as Array>) { - const fn = entry['fn'] as string - const params = Object.values(entry).slice(1) as Array // skip fn - contractCalls.push({ fn, params }) - } - continue - } - - // Process proxy - if (name.startsWith('proxy')) { - proxy = Boolean(value) - continue - } - } - - return { - params: contractParams, - calls: contractCalls, - proxy, - } -} - -// YAML helper functions -const getNode = (doc: YAML.Document.Parsed, path: string[]): YAMLMap | undefined => { - try { - let node: YAMLMap | undefined - for (const p of path) { - node = node === undefined ? doc.get(p) : node.get(p) - } - return node - } catch { - throw new Error(`Could not find node: ${path}.`) - } -} - -function getItem(node: YAMLMap, key: string): Scalar { - if (!node.has(key)) { - throw new Error(`Could not find item: ${key}.`) - } - return node.get(key, true) as Scalar -} - -function getItemFromPath(doc: YAML.Document.Parsed, path: string) { - const splitPath = path.split('/') - const itemKey = splitPath.pop() - if (itemKey === undefined) { - throw new Error('Badly formed path.') - } - - const node = getNode(doc, splitPath) - if (node === undefined) { - return undefined - } - - const item = getItem(node, itemKey) - return item -} - -export const getItemValue = (doc: YAML.Document.Parsed, path: string): unknown => { - const item = getItemFromPath(doc, path) - return item?.value -} - -export const updateItemValue = (doc: YAML.Document.Parsed, path: string, value: unknown): boolean => { - const item = getItemFromPath(doc, path) - if (item === undefined) { - throw new Error(`Could not find item: ${path}.`) - } - const updated = item.value !== value - item.value = value - return updated -} diff --git a/packages/sdk/src/deployments/lib/contracts/load.ts b/packages/sdk/src/deployments/lib/contracts/load.ts deleted file mode 100644 index 92e26d6f8..000000000 --- a/packages/sdk/src/deployments/lib/contracts/load.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Contract, providers, Signer } from 'ethers' - -import { AddressBook } from '../address-book' -import { loadArtifact } from '../deploy/artifacts' -import type { ContractList } from '../types/contract' -import { getWrappedConnect, wrapCalls } from './wrap' - -/** - * Loads a contract instance for a given contract name and address - * - * @param name Name of the contract - * @param address Address of the contract - * @param signerOrProvider Signer or provider to use - * @returns the loaded contract - */ -export const loadContractAt = ( - name: string, - address: string, - artifactsPath?: string | string[], - signerOrProvider?: Signer | providers.Provider, -): Contract => { - return new Contract(address, loadArtifact(name, artifactsPath).abi, signerOrProvider) -} - -/** - * Loads a contract from an address book - * - * @param name Name of the contract - * @param addressBook Address book to use - * @param signerOrProvider Signer or provider to use - * @param enableTxLogging Enable transaction logging to console and output file. Defaults to `true` - * @param optional If true, the contract is optional and will not throw if it cannot be loaded - * @returns the loaded contract - * - * @throws Error if the contract could not be loaded - */ -export function loadContract( - name: ContractName, - addressBook: AddressBook, - artifactsPath: string | string[], - signerOrProvider?: Signer | providers.Provider, - enableTxLogging = true, - preloadedContract?: Contract, -): Contract { - const contractEntry = addressBook.getEntry(name) - - try { - let contract = preloadedContract ?? loadContractAt(name, contractEntry.address, artifactsPath) - - if (enableTxLogging) { - contract.connect = getWrappedConnect(contract, name) - contract = wrapCalls(contract, name) - } - - if (signerOrProvider) { - contract = contract.connect(signerOrProvider) - } - - return contract - } catch (err: unknown) { - if (err instanceof Error) { - throw new Error(`Could not load contract ${name} - ${err.message}`) - } else { - throw new Error(`Could not load contract ${name}`) - } - } -} - -/** - * Loads all contracts from an address book - * - * @param addressBook Address book to use - * @param signerOrProvider Signer or provider to use - * @param enableTxLogging Enable transaction logging to console and output file. Defaults to `true` - * @returns the loaded contracts - */ -export const loadContracts = ( - addressBook: AddressBook, - artifactsPath: string | string[], - signerOrProvider?: Signer | providers.Provider, - enableTXLogging = true, - optionalContractNames?: string[], -): ContractList => { - const contracts = {} as ContractList - for (const contractName of addressBook.listEntries()) { - try { - const contract = loadContract(contractName, addressBook, artifactsPath, signerOrProvider, enableTXLogging) - contracts[contractName] = contract - } catch (error) { - if (optionalContractNames?.includes(contractName)) { - console.log(`Skipping optional contract ${contractName}`) - continue - } else { - throw error - } - } - } - - return contracts -} diff --git a/packages/sdk/src/deployments/lib/contracts/log.ts b/packages/sdk/src/deployments/lib/contracts/log.ts deleted file mode 100644 index d0371e102..000000000 --- a/packages/sdk/src/deployments/lib/contracts/log.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { ContractReceipt, ContractTransaction } from 'ethers' -import fs from 'fs' - -import { logInfo } from '../../logger' -import type { ContractParam } from '../types/contract' - -export function logContractCall(tx: ContractTransaction, contractName: string, fn: string, args: Array) { - const msg: string[] = [] - msg.push(`> Sending transaction: ${contractName}.${fn}`) - msg.push(` = Sender: ${tx.from}`) - msg.push(` = Contract: ${tx.to}`) - msg.push(` = Params: [ ${args} ]`) - msg.push(` = TxHash: ${tx.hash}`) - - logToConsoleAndFile(msg) -} - -export function logContractDeploy(tx: ContractTransaction, contractName: string, args: Array) { - const msg: string[] = [] - msg.push(`> Deploying contract: ${contractName}`) - msg.push(` = Sender: ${tx.from}`) - msg.push(` = Params: [ ${args} ]`) - msg.push(` = TxHash: ${tx.hash}`) - logToConsoleAndFile(msg) -} - -export function logContractDeployReceipt(receipt: ContractReceipt, creationCodeHash: string, runtimeCodeHash: string) { - const msg: string[] = [] - msg.push(` = Contract deployed at: ${receipt.contractAddress}`) - msg.push(` = CreationCodeHash: ${creationCodeHash}`) - msg.push(` = RuntimeCodeHash: ${runtimeCodeHash}`) - logToConsoleAndFile(msg) - logContractReceipt(receipt) -} - -export function logContractReceipt(receipt: ContractReceipt) { - const msg: string[] = [] - msg.push(receipt.status ? ` ✔ Transaction succeeded!` : ` ✖ Transaction failed!`) - logToConsoleAndFile(msg) -} - -export function logToConsoleAndFile(msg: string[]) { - const isoDate = new Date().toISOString() - const fileName = `tx-${isoDate.substring(0, 10)}.log` - - msg.map((line) => { - logInfo(line) - fs.appendFileSync(fileName, `[${isoDate}] ${line}\n`) - }) -} diff --git a/packages/sdk/src/deployments/lib/contracts/wrap.ts b/packages/sdk/src/deployments/lib/contracts/wrap.ts deleted file mode 100644 index 33c1c5845..000000000 --- a/packages/sdk/src/deployments/lib/contracts/wrap.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { Provider } from '@ethersproject/providers' -import type { Contract, ContractFunction, ContractTransaction, Signer } from 'ethers' -import lodash from 'lodash' - -import type { ContractParam } from '../types/contract' -import { logContractCall, logContractReceipt } from './log' - -class WrappedContract { - // The meta-class properties - [key: string]: ContractFunction | unknown -} - -function isContractTransaction(call: ContractTransaction | unknown): call is ContractTransaction { - return typeof call === 'object' && (call as ContractTransaction).hash !== undefined -} - -/** - * Modifies a contract connect function to return a contract wrapped with {@link wrapCalls} - * - * @param contract Contract to wrap - * @param contractName Name of the contract - * @returns the contract connect function - */ -export function getWrappedConnect( - contract: Contract, - contractName: string, -): (signerOrProvider: string | Provider | Signer) => Contract { - const call = contract.connect.bind(contract) - const override = (signerOrProvider: string | Provider | Signer): Contract => { - const connectedContract = call(signerOrProvider) - connectedContract.connect = getWrappedConnect(connectedContract, contractName) - return wrapCalls(connectedContract, contractName) - } - return override -} - -/** - * Wraps contract calls with a modified call function that logs the tx details - * - * @remarks - * The override function will: - * 1. Make the contract call - * 2. Wait for tx confirmation using `provider.waitForTransaction()` - * 3. Log the tx details and the receipt details, both to the console and to a file - * - * @param contract Contract to be wrapped - * @param contractName Name of the contract - * @returns the wrapped contract - */ -export function wrapCalls(contract: Contract, contractName: string): Contract { - const wrappedContract = lodash.cloneDeep(contract) as WrappedContract - - for (const fn of Object.keys(contract.functions)) { - const call = contract.functions[fn] - const override = async (...args: Array): Promise => { - const response = await call(...args) - - // If it's a read only call, return the response - if (!isContractTransaction(response)) { - return Array.isArray(response) && response.length === 1 ? response[0] : response - } - - // Otherwise it's a tx, log the details - logContractCall(response, contractName, fn, args) - - // And wait for confirmation - const receipt = await contract.provider.waitForTransaction(response.hash) - logContractReceipt(receipt) - - // Finally return the tx response - return response - } - - wrappedContract[fn] = override - ;(wrappedContract.functions as Record)[fn] = override - } - - return wrappedContract as Contract -} diff --git a/packages/sdk/src/deployments/lib/deploy/artifacts.ts b/packages/sdk/src/deployments/lib/deploy/artifacts.ts deleted file mode 100644 index abe90a52e..000000000 --- a/packages/sdk/src/deployments/lib/deploy/artifacts.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { artifactsDir } from '@graphprotocol/contracts' -import * as fs from 'fs' -import { Artifacts } from 'hardhat/internal/artifacts' -import type { Artifact } from 'hardhat/types' -import * as path from 'path' - -// Cache for contract path mappings to avoid repeated directory walking -const contractPathCache = new Map>() - -/** - * Load a contract's artifact from the build output folder - * This function works like an API - it finds artifacts using module resolution, - * not relative to the calling code's location. - * @param name Name of the contract - * @param buildDir Path to the build output folder(s). Optional override for module resolution. - * @returns The artifact corresponding to the contract name - */ -export const loadArtifact = (name: string, buildDir?: string[] | string): Artifact => { - let artifacts: Artifacts | undefined - let artifact: Artifact | undefined - - // Use imported artifacts directory if no buildDir provided or empty - if (!buildDir || (Array.isArray(buildDir) && buildDir.length === 0)) { - buildDir = [artifactsDir] - } - - if (typeof buildDir === 'string') { - buildDir = [buildDir] - } - - for (const dir of buildDir) { - try { - artifacts = new Artifacts(dir) - - // When using instrumented artifacts, try fully qualified name first to avoid conflicts - if (buildDir.length > 0 && buildDir[0] !== artifactsDir && name.indexOf(':') === -1) { - const localQualifiedName = getCachedContractPath(name, dir) - if (localQualifiedName) { - try { - artifact = artifacts.readArtifactSync(localQualifiedName) - break - } catch { - // Fall back to original name if fully qualified doesn't work - } - } - } - - artifact = artifacts.readArtifactSync(name) - break - } catch (error) { - const message = error instanceof Error ? error.message : error - console.error(`Could not load artifact ${name} from ${dir} - ${message}`) - } - } - - if (artifact === undefined) { - throw new Error(`Could not load artifact ${name}`) - } - - return artifact -} - -/** - * Get the fully qualified contract path using a cached lookup. - * Builds and caches the contract path mapping once per artifacts directory for performance. - * @param contractName Name of the contract to find - * @param artifactsDir Path to the artifacts directory - * @returns Fully qualified contract path or null if not found - */ -function getCachedContractPath(contractName: string, artifactsDir: string): string | null { - // Check if we have a cache for this artifacts directory - let dirCache = contractPathCache.get(artifactsDir) - - if (!dirCache) { - // Build cache for this directory - dirCache = buildContractPathCache(artifactsDir) - contractPathCache.set(artifactsDir, dirCache) - } - - return dirCache.get(contractName) || null -} - -/** - * Build a complete cache of all contract paths in an artifacts directory. - * Walks the directory tree once and maps contract names to their fully qualified paths. - * @param artifactsDir Path to the artifacts directory - * @returns Map of contract names to fully qualified paths - */ -function buildContractPathCache(artifactsDir: string): Map { - const cache = new Map() - - try { - const contractsDir = path.join(artifactsDir, 'contracts') - if (!fs.existsSync(contractsDir)) { - return cache - } - - // Walk the entire directory tree once and cache all contracts - walkDirectoryAndCache(contractsDir, contractsDir, cache) - } catch { - // Return empty cache on error - } - - return cache -} - -// Recursively walk directory and cache all contract paths -function walkDirectoryAndCache(dir: string, contractsDir: string, cache: Map): void { - try { - const entries = fs.readdirSync(dir, { withFileTypes: true }) - - for (const entry of entries) { - const fullPath = path.join(dir, entry.name) - - if (entry.isDirectory()) { - // Check if this is a .sol directory that might contain contracts - if (entry.name.endsWith('.sol')) { - // Look for all .json files in this directory (excluding .dbg.json) - try { - const contractFiles = fs.readdirSync(fullPath, { withFileTypes: true }) - for (const contractFile of contractFiles) { - if ( - contractFile.isFile() && - contractFile.name.endsWith('.json') && - !contractFile.name.endsWith('.dbg.json') - ) { - const contractName = contractFile.name.replace('.json', '') - const relativePath = path.relative(contractsDir, fullPath) - const qualifiedName = `contracts/${relativePath.replace(/\.sol$/, '')}.sol:${contractName}` - cache.set(contractName, qualifiedName) - } - } - } catch { - // Skip directories we can't read - } - } - - // Recursively search subdirectories - walkDirectoryAndCache(fullPath, contractsDir, cache) - } - } - } catch { - // Skip directories we can't read - } -} diff --git a/packages/sdk/src/deployments/lib/deploy/contract.ts b/packages/sdk/src/deployments/lib/deploy/contract.ts deleted file mode 100644 index b89b09365..000000000 --- a/packages/sdk/src/deployments/lib/deploy/contract.ts +++ /dev/null @@ -1,125 +0,0 @@ -import type { Signer } from 'ethers' - -import { hashHexString } from '../../../utils/hash' -import { logInfo } from '../../logger' -import { AddressBook } from '../address-book' -import { logContractDeploy, logContractDeployReceipt } from '../contracts/log' -import type { DeployAddressBookFunction, DeployData, DeployFunction, DeployResult } from '../types/deploy' -import { loadArtifact } from './artifacts' -import { getContractFactory } from './factory' - -/** - * Deploys a contract - * - * @remarks This function will autolink, that means it will automatically deploy external libraries - * and link them to the contract if needed - * - * @param sender Signer to deploy the contract with, must be already connected to a provider - * @param name Name of the contract to deploy - * @param args Contract constructor arguments - * @param autolink Wether or not to autolink. Defaults to true. - * @returns the deployed contract and deployment metadata associated to it - * - * @throws Error if the sender is not connected to a provider - */ -export const deployContract: DeployFunction = async ( - sender: Signer, - contractData: DeployData, -): Promise => { - const name = contractData.name - const args = contractData.args ?? [] - const opts = contractData.opts ?? {} - const artifactsPath = contractData.artifactsPath - - if (!sender.provider) { - throw Error('Sender must be connected to a provider') - } - - // Autolink - const libraries = {} as Record - if (opts?.autolink ?? true) { - const artifact = loadArtifact(name, artifactsPath) - if (artifact.linkReferences && Object.keys(artifact.linkReferences).length > 0) { - for (const fileReferences of Object.values(artifact.linkReferences)) { - for (const libName of Object.keys(fileReferences)) { - const deployResult = await deployContract(sender, { - name: libName, - args: [], - opts: { autolink: false }, - artifactsPath: artifactsPath, - }) - libraries[libName] = deployResult.contract.address - } - } - } - } - - // Deploy - const factory = getContractFactory(name, libraries, artifactsPath) - const contract = await factory.connect(sender).deploy(...args) - const txHash = contract.deployTransaction.hash - logContractDeploy(contract.deployTransaction, name, args) - const receipt = await sender.provider.waitForTransaction(txHash) - - // Receipt - const creationCodeHash = hashHexString(factory.bytecode) - const runtimeCodeHash = hashHexString(await sender.provider.getCode(contract.address)) - logContractDeployReceipt(receipt, creationCodeHash, runtimeCodeHash) - - return { contract, creationCodeHash, runtimeCodeHash, txHash, libraries } -} - -/** - * Deploys a contract and saves the deployment result to the address book - * - * @remarks Same as {@link deployContract} but this variant will also save the deployment result to the address book. - * - * @param sender Signer to deploy the contract with, must be already connected to a provider - * @param name Name of the contract to deploy - * @param args Contract constructor arguments - * @param addressBook Address book to save the deployment result to - * @returns the deployed contract and deployment metadata associated to it - * - * @throws Error if the sender is not connected to a provider - */ -export const deployContractAndSave: DeployAddressBookFunction = async ( - sender: Signer, - contractData: DeployData, - addressBook: AddressBook, -): Promise => { - const name = contractData.name - const args = contractData.args ?? [] - - if (!sender.provider) { - throw Error('Sender must be connected to a provider') - } - - // Deploy the contract - const deployResult = await deployContract(sender, { - name: name, - args: args, - artifactsPath: contractData.artifactsPath, - }) - - const constructorArgs = args.map((e) => { - if (Array.isArray(e)) { - return e.map((e) => e.toString()) - } else { - return e.toString() - } - }) - - // Save address entry - addressBook.setEntry(name, { - address: deployResult.contract.address, - constructorArgs: constructorArgs, - creationCodeHash: deployResult.creationCodeHash, - runtimeCodeHash: deployResult.runtimeCodeHash, - txHash: deployResult.txHash, - libraries: - deployResult.libraries && Object.keys(deployResult.libraries).length > 0 ? deployResult.libraries : undefined, - }) - logInfo('> Contract saved to address book') - - return deployResult -} diff --git a/packages/sdk/src/deployments/lib/deploy/deploy.ts b/packages/sdk/src/deployments/lib/deploy/deploy.ts deleted file mode 100644 index ddae70e63..000000000 --- a/packages/sdk/src/deployments/lib/deploy/deploy.ts +++ /dev/null @@ -1,94 +0,0 @@ -import type { Signer } from 'ethers' -import { providers } from 'ethers' - -import { assertObject } from '../../../utils/assertions' -import { hashHexString } from '../../../utils/hash' -import type { AddressBook } from '../address-book' -import type { DeployData, DeployResult } from '../types/deploy' -import { DeployType, isDeployType } from '../types/deploy' -import { loadArtifact } from './artifacts' -import { deployContract, deployContractAndSave } from './contract' - -/** - * Checks wether a contract is deployed or not - * - * @param name Name of the contract to check - * @param proxyName Name of the contract proxy if there is one - * @param address Address of the contract - * @param addressBook Address book to use - * @param provider Provider to use - * @param checkCreationCode Check the creation code of the contract. Defaults to `true` - * @returns `true` if the contract is deployed, `false` otherwise. - */ -export const isContractDeployed = async ( - name: string, - proxyName: string, - address: string | undefined, - addressBook: AddressBook, - provider: providers.Provider, - artifactsPath?: string | string[], - checkCreationCode = true, -): Promise => { - console.info(`Checking for valid ${name} contract...`) - if (!address || address === '') { - console.warn('This contract is not in our address book.') - return false - } - - const addressEntry = addressBook.getEntry(name) - - // If the contract is behind a proxy we check the Proxy artifact instead - const artifact = - addressEntry.proxy === true ? loadArtifact(proxyName, artifactsPath) : loadArtifact(name, artifactsPath) - - if (checkCreationCode) { - const savedCreationCodeHash = addressEntry.creationCodeHash - const creationCodeHash = hashHexString(artifact.bytecode) - if (!savedCreationCodeHash || savedCreationCodeHash !== creationCodeHash) { - console.warn(`creationCodeHash in our address book doesn't match ${name} artifacts`) - console.info(`${savedCreationCodeHash} !== ${creationCodeHash}`) - return false - } - } - - const savedRuntimeCodeHash = addressEntry.runtimeCodeHash - const runtimeCodeHash = hashHexString(await provider.getCode(address)) - if (runtimeCodeHash === hashHexString('0x00') || runtimeCodeHash === hashHexString('0x')) { - console.warn('No runtimeCode exists at the address in our address book') - return false - } - if (savedRuntimeCodeHash !== runtimeCodeHash) { - console.warn(`runtimeCodeHash for ${address} does not match what's in our address book`) - console.info(`${savedRuntimeCodeHash} !== ${runtimeCodeHash}`) - return false - } - return true -} - -export const deploy = async ( - type: DeployType | unknown, - sender: Signer, - contractData: DeployData, - addressBook?: AddressBook, - _proxyData?: DeployData, -): Promise => { - if (!isDeployType(type)) { - throw new Error('Please provide the correct option for deploy type') - } - - switch (type) { - case DeployType.Deploy: - console.info(`Deploying contract ${contractData.name}...`) - return await deployContract(sender, contractData) - case DeployType.DeployAndSave: - console.info(`Deploying contract ${contractData.name} and saving to address book...`) - assertObject(addressBook) - return await deployContractAndSave(sender, contractData, addressBook) - case DeployType.DeployWithProxy: - case DeployType.DeployWithProxyAndSave: - case DeployType.DeployImplementationAndSave: - throw new Error(`Base SDK does not implement ${type} deployments.`) - default: - throw new Error('Please provide the correct option for deploy type') - } -} diff --git a/packages/sdk/src/deployments/lib/deploy/factory.ts b/packages/sdk/src/deployments/lib/deploy/factory.ts deleted file mode 100644 index f465a8085..000000000 --- a/packages/sdk/src/deployments/lib/deploy/factory.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ContractFactory } from 'ethers' -import type { Artifact } from 'hardhat/types' - -import type { Libraries } from '../types/artifacts' -import { loadArtifact } from './artifacts' - -/** - * Gets a contract factory for a given contract name - * - * @param name Name of the contract - * @param libraries Libraries to link - * @param artifactsPath Path to artifacts directory - * @returns the contract factory - */ -export const getContractFactory = ( - name: string, - libraries?: Libraries, - artifactsPath?: string | string[], -): ContractFactory => { - const artifact = loadArtifact(name, artifactsPath) - // Fixup libraries - if (libraries && Object.keys(libraries).length > 0) { - artifact.bytecode = linkLibraries(artifact, libraries) - } - return new ContractFactory(artifact.abi, artifact.bytecode) -} - -const linkLibraries = (artifact: Artifact, libraries?: Libraries): string => { - let bytecode = artifact.bytecode - - if (libraries) { - if (artifact.linkReferences) { - for (const fileReferences of Object.values(artifact.linkReferences)) { - for (const [libName, fixups] of Object.entries(fileReferences)) { - const addr = libraries[libName] - if (addr === undefined) { - continue - } - - for (const fixup of fixups) { - bytecode = - bytecode.substr(0, 2 + fixup.start * 2) + - addr.substr(2) + - bytecode.substr(2 + (fixup.start + fixup.length) * 2) - } - } - } - } - } - return bytecode -} diff --git a/packages/sdk/src/deployments/lib/types/address-book.ts b/packages/sdk/src/deployments/lib/types/address-book.ts deleted file mode 100644 index ea0861bfb..000000000 --- a/packages/sdk/src/deployments/lib/types/address-book.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { DeployResult } from './deploy' - -// TODO: doc this - -// JSON format: -// { -// "": { -// "": {} -// ... -// } -// } -export type AddressBookJson = Record< - ChainId, - Record -> - -export type ConstructorArg = string | Array - -export type AddressBookEntry = { - address: string - constructorArgs?: Array - initArgs?: Array - proxy?: boolean - implementation?: AddressBookEntry -} & Partial> diff --git a/packages/sdk/src/deployments/lib/types/artifacts.ts b/packages/sdk/src/deployments/lib/types/artifacts.ts deleted file mode 100644 index 384e861ab..000000000 --- a/packages/sdk/src/deployments/lib/types/artifacts.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Libraries { - [libraryName: string]: string -} diff --git a/packages/sdk/src/deployments/lib/types/config.ts b/packages/sdk/src/deployments/lib/types/config.ts deleted file mode 100644 index f62f6e2ee..000000000 --- a/packages/sdk/src/deployments/lib/types/config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ContractParam } from './contract' - -export type ContractConfigParam = { name: string; value: string } -export type ContractConfigCall = { fn: string; params: Array } -export interface ContractConfig { - params: Array - calls: Array - proxy: boolean -} - -export interface ABRefReplace { - ref: string - replace: string -} diff --git a/packages/sdk/src/deployments/lib/types/contract.ts b/packages/sdk/src/deployments/lib/types/contract.ts deleted file mode 100644 index 700689445..000000000 --- a/packages/sdk/src/deployments/lib/types/contract.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { BigNumber, Contract } from 'ethers' - -export type ContractList = Partial> - -export type ContractParam = string | BigNumber | number | Array diff --git a/packages/sdk/src/deployments/lib/types/deploy.ts b/packages/sdk/src/deployments/lib/types/deploy.ts deleted file mode 100644 index 4cbbb1124..000000000 --- a/packages/sdk/src/deployments/lib/types/deploy.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { AddressBook } from '../address-book' -import { isSomeEnum } from '../../../utils/type-guard' - -import type { Contract, Signer } from 'ethers' -import type { ContractParam } from './contract' -import type { Libraries } from './artifacts' - -export enum DeployType { - Deploy = 'deploy', - DeployAndSave = 'deploy-save', - DeployWithProxy = 'deploy-with-proxy', - DeployWithProxyAndSave = 'deploy-with-proxy-save', - DeployImplementationAndSave = 'deploy-implementation-save', -} - -export type DeployData = { - name: string - args?: Array - opts?: Record - artifactsPath?: string | string[] -} - -export type DeployResult = { - contract: Contract - creationCodeHash: string - runtimeCodeHash: string - txHash: string - libraries?: Libraries -} - -// Utility type to add parameters to a function interface -// https://stackoverflow.com/a/69668215 -type AddParameters any, TParameters extends [...args: any]> = ( - ...args: [...Parameters, ...TParameters] -) => ReturnType - -export type DeployFunction = (sender: Signer, contract: DeployData) => Promise - -export type DeployAddressBookFunction = ( - sender: Signer, - contract: DeployData, - addressBook: AddressBook, -) => Promise -export type DeployAddressBookWithProxyFunction = AddParameters - -// ** Type guards ** -export function isDeployType(value: unknown): value is DeployType { - return isSomeEnum(DeployType)(value) -} diff --git a/packages/sdk/src/deployments/network/actions/bridge-config.ts b/packages/sdk/src/deployments/network/actions/bridge-config.ts deleted file mode 100644 index d28e89f03..000000000 --- a/packages/sdk/src/deployments/network/actions/bridge-config.ts +++ /dev/null @@ -1,119 +0,0 @@ -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' - -import { SimpleAddressBook } from '../../lib/address-book' -import type { GraphNetworkContracts } from '../deployment/contracts/load' -import type { GraphNetworkAction } from './types' - -export const configureL1Bridge: GraphNetworkAction<{ - l2GRTAddress: string - l2GRTGatewayAddress: string - l2GNSAddress: string - l2StakingAddress: string - arbAddressBookPath: string - chainId: number -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { - l2GRTAddress: string - l2GRTGatewayAddress: string - l2GNSAddress: string - l2StakingAddress: string - arbAddressBookPath: string - chainId: number - }, -): Promise => { - const { l2GRTAddress, l2GRTGatewayAddress, l2GNSAddress, l2StakingAddress, arbAddressBookPath, chainId } = args - console.info(`>>> Setting L1 Bridge Configuration <<<\n`) - - const arbAddressBook = new SimpleAddressBook(arbAddressBookPath, chainId) - - const gateway = contracts.L1GraphTokenGateway! - - // Gateway - console.info('L2 GRT address: ' + l2GRTAddress) - await gateway.connect(signer).setL2TokenAddress(l2GRTAddress) - - console.info('L2 Gateway address: ' + l2GRTGatewayAddress) - await gateway.connect(signer).setL2CounterpartAddress(l2GRTGatewayAddress) - - // Escrow - const bridgeEscrow = contracts.BridgeEscrow! - console.info('Escrow address: ' + bridgeEscrow.address) - await gateway.connect(signer).setEscrowAddress(bridgeEscrow.address) - await bridgeEscrow.connect(signer).approveAll(gateway.address) - - const l1Inbox = arbAddressBook.getEntry('IInbox') - const l1Router = arbAddressBook.getEntry('L1GatewayRouter') - console.info('L1 Inbox address: ' + l1Inbox.address + ' and L1 Router address: ' + l1Router.address) - await gateway.connect(signer).setArbitrumAddresses(l1Inbox.address, l1Router.address) - - // GNS - const gns = contracts.L1GNS! - console.info('GNS address: ' + gns.address) - console.info('L2 GNS address: ' + l2GNSAddress) - await gns.connect(signer).setCounterpartGNSAddress(l2GNSAddress) - await gateway.connect(signer).addToCallhookAllowlist(gns.address) - - // Staking - const staking = contracts.L1Staking! - console.info('Staking address: ' + staking.address) - console.info('L2 Staking address: ' + l2StakingAddress) - await staking.connect(signer).setCounterpartStakingAddress(l2StakingAddress) - await gateway.connect(signer).addToCallhookAllowlist(staking.address) -} - -export const configureL2Bridge: GraphNetworkAction<{ - l1GRTAddress: string - l1GRTGatewayAddress: string - l1GNSAddress: string - l1StakingAddress: string - arbAddressBookPath: string - chainId: number -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { - l1GRTAddress: string - l1GRTGatewayAddress: string - l1GNSAddress: string - l1StakingAddress: string - arbAddressBookPath: string - chainId: number - }, -): Promise => { - const { l1GRTAddress, l1GRTGatewayAddress, l1GNSAddress, l1StakingAddress, arbAddressBookPath, chainId } = args - console.info(`>>> Setting L2 Bridge Configuration <<<\n`) - - const arbAddressBook = new SimpleAddressBook(arbAddressBookPath, chainId) - - const gateway = contracts.L2GraphTokenGateway! - const token = contracts.L2GraphToken! - - // Gateway - console.info('L1 GRT address: ' + l1GRTAddress) - await gateway.connect(signer).setL1TokenAddress(l1GRTAddress) - await token.connect(signer).setL1Address(l1GRTAddress) - - console.info('L1 Gateway address: ' + l1GRTGatewayAddress) - await gateway.connect(signer).setL1CounterpartAddress(l1GRTGatewayAddress) - - const l2Router = arbAddressBook.getEntry('L2GatewayRouter') - console.info('L2 Router address: ' + l2Router.address) - await gateway.connect(signer).setL2Router(l2Router.address) - - console.info('L2 Gateway address: ' + gateway.address) - await token.connect(signer).setGateway(gateway.address) - - // GNS - const gns = contracts.L2GNS! - console.info('GNS address: ' + gns.address) - console.info('L1 GNS address: ' + l1GNSAddress) - await gns.connect(signer).setCounterpartGNSAddress(l1GNSAddress) - - // Staking - const staking = contracts.L2Staking! - console.info('Staking address: ' + staking.address) - console.info('L1 Staking address: ' + l1StakingAddress) - await staking.connect(signer).setCounterpartStakingAddress(l1StakingAddress) -} diff --git a/packages/sdk/src/deployments/network/actions/bridge-to-l1.ts b/packages/sdk/src/deployments/network/actions/bridge-to-l1.ts deleted file mode 100644 index cc6251e3c..000000000 --- a/packages/sdk/src/deployments/network/actions/bridge-to-l1.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { L2ToL1MessageStatus, L2ToL1MessageWriter, L2TransactionReceipt } from '@arbitrum/sdk' -import type { L2GraphToken, L2GraphTokenGateway } from '@graphprotocol/contracts' -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber } from 'ethers' -import { Contract, providers } from 'ethers' - -import { getL2ToL1MessageReader, getL2ToL1MessageWriter } from '../../../utils/arbitrum' -import { wait as waitFn } from '../../../utils/time' -import type { GraphNetworkContracts } from '../deployment/contracts/load' -import type { GraphNetworkAction } from './types' - -const LEGACY_L2_GRT_ADDRESS = '0x23A941036Ae778Ac51Ab04CEa08Ed6e2FE103614' -const LEGACY_L2_GATEWAY_ADDRESS = '0x09e9222e96e7b4ae2a407b98d48e330053351eee' - -const FOURTEEN_DAYS_IN_SECONDS = 24 * 3600 * 14 -const BLOCK_SEARCH_THRESHOLD = 6 * 3600 - -export const startSendToL1: GraphNetworkAction<{ - l1Provider: providers.Provider - amount: BigNumber - recipient: string - legacyToken: boolean -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { - l1Provider: providers.Provider - amount: BigNumber - recipient: string - legacyToken?: boolean - }, -): Promise => { - const { l1Provider, amount, recipient, legacyToken } = args - const l2Provider = contracts.GraphToken.provider - - console.info(`>>> Sending tokens to L1 <<<\n`) - console.info(`Will send ${amount} GRT to ${recipient}`) - - // GRT - const GraphToken = legacyToken - ? (new Contract(LEGACY_L2_GRT_ADDRESS, contracts.GraphToken.interface, signer) as L2GraphToken) - : contracts.GraphToken - console.info(`Using L2 GRT ${GraphToken.address}`) - - // Gateway - const GraphTokenGateway = ( - legacyToken - ? new Contract(LEGACY_L2_GATEWAY_ADDRESS, contracts.GraphTokenGateway.interface, signer) - : contracts.GraphTokenGateway - ) as L2GraphTokenGateway - console.info(`Using L2 gateway ${GraphTokenGateway.address}`) - const l1GraphTokenAddress = await GraphTokenGateway.l1Counterpart() - - // Check sender balance - const senderBalance = await GraphToken.balanceOf(signer.address) - if (senderBalance.lt(amount)) { - throw new Error('Sender balance is insufficient for the transfer') - } - - if (!legacyToken) { - console.info('Approving token transfer') - await GraphToken.connect(signer).approve(GraphTokenGateway.address, amount) - } - console.info('Sending outbound transfer transaction') - const tx = await GraphTokenGateway['outboundTransfer(address,address,uint256,bytes)']( - l1GraphTokenAddress, - recipient, - amount, - '0x', - ) - const receipt = await tx.wait() - - const l2ToL1Message = await getL2ToL1MessageReader(receipt, l1Provider, l2Provider) - const l2Receipt = new L2TransactionReceipt(receipt) - - const ethBlockNum = await l2ToL1Message.getFirstExecutableBlock(l2Provider) - if (ethBlockNum === null) { - console.info(`L2 to L1 message can or already has been executed. If not finalized call`) - } else { - console.info(`The transaction generated an L2 to L1 message in outbox with eth block number:`) - console.info(ethBlockNum.toString()) - console.info(`After the dispute period is finalized (in ~1 week), you can finalize this by calling`) - } - console.info(`finish-send-to-l1 with the following txhash:`) - console.info(l2Receipt.transactionHash) -} - -export const finishSendToL1: GraphNetworkAction<{ - l1Provider: providers.Provider - legacyToken: boolean - txHash?: string - wait?: boolean - retryDelaySeconds?: number -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { - l1Provider: providers.Provider - legacyToken: boolean - txHash?: string - wait?: boolean - retryDelaySeconds?: number - }, -): Promise => { - const { l1Provider, legacyToken, wait, retryDelaySeconds } = args - let txHash = args.txHash - const l2Provider = contracts.GraphToken.provider - - console.info(`>>> Finishing transaction sending tokens to L1 <<<\n`) - - // Gateway - const GraphTokenGateway = ( - legacyToken - ? new Contract(LEGACY_L2_GATEWAY_ADDRESS, contracts.GraphTokenGateway.interface, signer) - : contracts.GraphTokenGateway - ) as L2GraphTokenGateway - console.info(`Using L2 gateway ${GraphTokenGateway.address}`) - - if (txHash === undefined) { - console.info(`Looking for withdrawals initiated by ${signer.address} in roughly the last 14 days`) - const fromBlock = await searchForArbBlockByTimestamp( - l2Provider, - Math.round(Date.now() / 1000) - FOURTEEN_DAYS_IN_SECONDS, - ) - const filt = GraphTokenGateway.filters.WithdrawalInitiated(null, signer.address) - const allEvents = await GraphTokenGateway.queryFilter(filt, BigNumber.from(fromBlock).toHexString()) - if (allEvents.length == 0) { - throw new Error('No withdrawals found') - } - txHash = allEvents[allEvents.length - 1].transactionHash - } - - console.info(`Getting receipt from transaction ${txHash}`) - const l2ToL1Message = await getL2ToL1MessageWriter(txHash, l1Provider, l2Provider, signer) - - if (wait) { - const retryDelayMs = (retryDelaySeconds ?? 60) * 1000 - console.info('Waiting for outbox entry to be created, this can take a full week...') - await waitUntilOutboxEntryCreatedWithCb(l2ToL1Message, l2Provider, retryDelayMs, () => { - console.info('Still waiting...') - }) - } else { - const status = await l2ToL1Message.status(l2Provider) - if (status == L2ToL1MessageStatus.EXECUTED) { - throw new Error('Message already executed!') - } else if (status != L2ToL1MessageStatus.CONFIRMED) { - throw new Error( - `Transaction is not confirmed, status is ${status} when it should be ${L2ToL1MessageStatus.CONFIRMED}. Has the dispute period passed?`, - ) - } - } - - console.info('Executing outbox transaction') - const tx = await l2ToL1Message.execute(l2Provider) - const outboxExecuteReceipt = await tx.wait() - console.info('Transaction succeeded! tx hash:') - console.info(outboxExecuteReceipt.transactionHash) -} - -const searchForArbBlockByTimestamp = async (l2Provider: providers.Provider, timestamp: number): Promise => { - let step = 131072 - let block = await l2Provider.getBlock('latest') - while (block.timestamp > timestamp) { - while (block.number - step < 0) { - step = Math.round(step / 2) - } - block = await l2Provider.getBlock(block.number - step) - } - while (step > 1 && Math.abs(block.timestamp - timestamp) > BLOCK_SEARCH_THRESHOLD) { - step = Math.round(step / 2) - if (block.timestamp - timestamp > 0) { - block = await l2Provider.getBlock(block.number - step) - } else { - block = await l2Provider.getBlock(block.number + step) - } - } - return block.number -} - -const waitUntilOutboxEntryCreatedWithCb = async ( - msg: L2ToL1MessageWriter, - provider: providers.Provider, - retryDelay: number, - callback: () => void, -) => { - let done = false - while (!done) { - const status = await msg.status(provider) - if (status == L2ToL1MessageStatus.CONFIRMED || status == L2ToL1MessageStatus.EXECUTED) { - done = true - } else { - callback() - await waitFn(retryDelay) - } - } -} diff --git a/packages/sdk/src/deployments/network/actions/bridge-to-l2.ts b/packages/sdk/src/deployments/network/actions/bridge-to-l2.ts deleted file mode 100644 index ed78baed4..000000000 --- a/packages/sdk/src/deployments/network/actions/bridge-to-l2.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { L1ToL2MessageStatus, L1ToL2MessageWriter, L1TransactionReceipt } from '@arbitrum/sdk' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber, providers, utils } from 'ethers' - -import { estimateRetryableTxGas, getL1ToL2MessageWriter } from '../../../utils/arbitrum' -import { GraphNetworkContracts } from '../deployment/contracts/load' -import { setGRTAllowance } from './graph-token' -import { GraphNetworkAction } from './types' - -export const sendToL2: GraphNetworkAction<{ - l2Provider: providers.Provider - amount: BigNumber - recipient: string - calldata?: string - maxGas: BigNumber - gasPriceBid: BigNumber - maxSubmissionCost: BigNumber -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { - l2Provider: providers.Provider - amount: BigNumber - recipient: string - calldata?: string - maxGas: BigNumber - gasPriceBid: BigNumber - maxSubmissionCost: BigNumber - }, -): Promise => { - const { l2Provider, amount, recipient } = args - const l1Provider = contracts.GraphToken.provider - const calldata = args.calldata ?? '0x' - - console.info(`>>> Sending tokens to L2 <<<\n`) - - const l1GatewayAddress = contracts.GraphTokenGateway.address - const l2GatewayAddress = await contracts.L1GraphTokenGateway!.l2Counterpart() - - console.info(`Will send ${amount} GRT to ${recipient}`) - console.info(`Using L1 gateway ${l1GatewayAddress} and L2 gateway ${l2GatewayAddress}`) - await setGRTAllowance(contracts, signer, { spender: l1GatewayAddress, allowance: amount }) - - // estimate L2 ticket - // See https://github.com/OffchainLabs/arbitrum/blob/master/packages/arb-ts/src/lib/bridge.ts - const depositCalldata = await contracts.L1GraphTokenGateway!.getOutboundCalldata( - contracts.GraphToken.address, - signer.address, - recipient, - amount, - calldata, - ) - const { maxGas, gasPriceBid, maxSubmissionCost } = await estimateRetryableTxGas( - l1Provider, - l2Provider, - l1GatewayAddress, - l2GatewayAddress, - depositCalldata, - { - maxGas: args.maxGas, - gasPriceBid: args.gasPriceBid, - maxSubmissionCost: args.maxSubmissionCost, - }, - ) - const ethValue = maxSubmissionCost.add(gasPriceBid.mul(maxGas)) - console.info( - `Using maxGas:${maxGas}, gasPriceBid:${gasPriceBid}, maxSubmissionCost:${maxSubmissionCost} = tx value: ${ethValue}`, - ) - - // build transaction - console.info('Sending outbound transfer transaction') - const txData = utils.defaultAbiCoder.encode(['uint256', 'bytes'], [maxSubmissionCost, calldata]) - const tx = await contracts - .L1GraphTokenGateway!.connect(signer) - .outboundTransfer(contracts.GraphToken.address, recipient, amount, maxGas, gasPriceBid, txData, { - value: ethValue, - }) - const receipt = await tx.wait() - - // get l2 ticket status - if (receipt.status == 1) { - console.info('Waiting for message to propagate to L2...') - try { - const l1ToL2Message = await getL1ToL2MessageWriter(receipt, l1Provider, l2Provider) - await checkAndRedeemMessage(l1ToL2Message) - } catch (e) { - console.error('Auto redeem failed') - console.error(e) - console.error('You can re-attempt using redeem-send-to-l2 with the following txHash:') - console.error(receipt.transactionHash) - } - } -} - -export const redeemSendToL2: GraphNetworkAction<{ - txHash: string - l2Provider: providers.Provider -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { - txHash: string - l2Provider: providers.Provider - }, -): Promise => { - console.info(`>>> Redeeming pending tokens on L2 <<<\n`) - const l1Provider = contracts.GraphToken.provider - const l2Provider = args.l2Provider - - const receipt = await l1Provider.getTransactionReceipt(args.txHash) - const l1Receipt = new L1TransactionReceipt(receipt) - const l1ToL2Messages = await l1Receipt.getL1ToL2Messages(signer.connect(l2Provider)) - const l1ToL2Message = l1ToL2Messages[0] - - console.info('Checking message status in L2...') - await checkAndRedeemMessage(l1ToL2Message) -} - -const logAutoRedeemReason = (autoRedeemRec: unknown) => { - if (autoRedeemRec == null) { - console.info(`Auto redeem was not attempted.`) - return - } - console.info(`Auto redeem reverted.`) -} - -const checkAndRedeemMessage = async (l1ToL2Message: L1ToL2MessageWriter) => { - console.info(`Waiting for status of ${l1ToL2Message.retryableCreationId}`) - const res = await l1ToL2Message.waitForStatus() - console.info('Getting auto redeem attempt') - const autoRedeemRec = await l1ToL2Message.getAutoRedeemAttempt() - const l2TxReceipt = res.status === L1ToL2MessageStatus.REDEEMED ? res.l2TxReceipt : autoRedeemRec - let l2TxHash = l2TxReceipt ? l2TxReceipt.transactionHash : 'null' - if (res.status === L1ToL2MessageStatus.FUNDS_DEPOSITED_ON_L2) { - /** Message wasn't auto-redeemed! */ - console.warn('Funds were deposited on L2 but the retryable ticket was not redeemed') - logAutoRedeemReason(autoRedeemRec) - console.info('Attempting to redeem...') - await l1ToL2Message.redeem(process.env.CI ? { gasLimit: 2_000_000 } : {}) - const redeemAttempt = await l1ToL2Message.getSuccessfulRedeem() - if (redeemAttempt.status == L1ToL2MessageStatus.REDEEMED) { - l2TxHash = redeemAttempt.l2TxReceipt ? redeemAttempt.l2TxReceipt.transactionHash : 'null' - } else { - throw new Error(`Unexpected L1ToL2MessageStatus after redeem attempt: ${res.status}`) - } - } else if (res.status != L1ToL2MessageStatus.REDEEMED) { - throw new Error(`Unexpected L1ToL2MessageStatus ${res.status}`) - } - console.info(`Transfer successful: ${l2TxHash}`) -} diff --git a/packages/sdk/src/deployments/network/actions/disputes.ts b/packages/sdk/src/deployments/network/actions/disputes.ts deleted file mode 100644 index d44c18ae6..000000000 --- a/packages/sdk/src/deployments/network/actions/disputes.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - Attestation, - createAttestation, - encodeAttestation as encodeAttestationLib, - Receipt, -} from '@graphprotocol/common-ts' - -import { GraphChainId } from '../../../chain' - -export async function buildAttestation( - receipt: Receipt, - signer: string, - disputeManagerAddress: string, - chainId: GraphChainId, -) { - return await createAttestation(signer, chainId, disputeManagerAddress, receipt, '0') -} - -export function encodeAttestation(attestation: Attestation): string { - return encodeAttestationLib(attestation) -} diff --git a/packages/sdk/src/deployments/network/actions/gns.ts b/packages/sdk/src/deployments/network/actions/gns.ts deleted file mode 100644 index a690fe5fa..000000000 --- a/packages/sdk/src/deployments/network/actions/gns.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber, ethers } from 'ethers' - -import { randomHexBytes } from '../../../utils/bytes' -import { buildSubgraphId } from '../../../utils/subgraph' -import type { GraphNetworkContracts } from '../deployment/contracts/load' -import { setGRTAllowances } from './graph-token' -import type { GraphNetworkAction } from './types' - -export const mintSignal: GraphNetworkAction<{ subgraphId: string; amount: BigNumber }> = async ( - contracts: GraphNetworkContracts, - curator: SignerWithAddress, - args: { - subgraphId: string - amount: BigNumber - }, -): Promise => { - const { subgraphId, amount } = args - - // Approve - await setGRTAllowances(contracts, curator, [{ spender: contracts.GNS.address, allowance: amount }]) - - // Add signal - console.log( - `\nCurator ${curator.address} add ${ethers.utils.formatEther(amount)} in signal to subgraphId ${subgraphId}..`, - ) - const tx = await contracts.GNS.connect(curator).mintSignal(subgraphId, amount, 0, { - gasLimit: 4_000_000, - }) - await tx.wait() -} - -export const publishNewSubgraph: GraphNetworkAction<{ deploymentId: string; chainId: number }, string> = async ( - contracts: GraphNetworkContracts, - publisher: SignerWithAddress, - args: { deploymentId: string; chainId: number }, -): Promise => { - const { deploymentId, chainId } = args - - console.log(`\nPublishing new subgraph with deploymentId ${deploymentId}...`) - const subgraphId = await buildSubgraphId( - publisher.address, - await contracts.GNS.nextAccountSeqID(publisher.address), - chainId, - ) - const tx = await contracts.GNS.connect(publisher).publishNewSubgraph( - deploymentId, - randomHexBytes(), - randomHexBytes(), - { gasLimit: 4_000_000 }, - ) - await tx.wait() - - return subgraphId -} - -export const recreatePreviousSubgraphId: GraphNetworkAction< - { - owner: string - previousIndex: number - chainId: number - }, - string -> = async ( - contracts: GraphNetworkContracts, - _signer: SignerWithAddress, - args: { owner: string; previousIndex: number; chainId: number }, -): Promise => { - const { owner, previousIndex, chainId } = args - const seqID = (await contracts.GNS.nextAccountSeqID(owner)).sub(previousIndex) - return buildSubgraphId(owner, seqID, chainId) -} diff --git a/packages/sdk/src/deployments/network/actions/governed.ts b/packages/sdk/src/deployments/network/actions/governed.ts deleted file mode 100644 index e9ce59c92..000000000 --- a/packages/sdk/src/deployments/network/actions/governed.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { Contract, ContractTransaction, ethers } from 'ethers' - -import type { GraphNetworkContractName } from '../deployment/contracts/list' -import type { GraphNetworkContracts } from '../deployment/contracts/load' -import type { GraphNetworkAction } from './types' - -type GovernedContract = Contract & { - pendingGovernor?: (_overrides: ethers.CallOverrides) => Promise - acceptOwnership?: (_overrides: ethers.CallOverrides) => Promise -} - -export const acceptOwnership: GraphNetworkAction< - { - contractName: GraphNetworkContractName - }, - ContractTransaction | undefined -> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { contractName: GraphNetworkContractName }, -): Promise => { - const { contractName } = args - const contract = contracts[contractName] - - if (!contract) { - throw new Error(`Contract ${contractName} not found`) - } - - // Safely call pendingGovernor with proper error handling for coverage environment - const contractWithSigner = (contract as GovernedContract).connect(signer) - - let pendingGovernor: string - try { - pendingGovernor = await contractWithSigner.pendingGovernor() - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error) - console.log(`Contract ${contractName} at ${contract.address} failed to call pendingGovernor(): ${errorMessage}`) - console.log(`Skipping ownership acceptance for this contract`) - return - } - - if (pendingGovernor === ethers.constants.AddressZero) { - console.log(`No pending governor for ${contract.address}`) - return - } - - if (pendingGovernor === signer.address) { - console.log(`Accepting ownership of ${contract.address}`) - - try { - const tx = await contractWithSigner.acceptOwnership() - await tx.wait() - return tx - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error) - console.log(`Contract ${contractName} at ${contract.address} failed to call acceptOwnership(): ${errorMessage}`) - console.log(`Skipping ownership acceptance for this contract`) - return - } - } else { - console.log(`Signer ${signer.address} is not the pending governor of ${contract.address}, it is ${pendingGovernor}`) - } -} diff --git a/packages/sdk/src/deployments/network/actions/graph-token.ts b/packages/sdk/src/deployments/network/actions/graph-token.ts deleted file mode 100644 index 3ad7de4b0..000000000 --- a/packages/sdk/src/deployments/network/actions/graph-token.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber, ethers } from 'ethers' - -import type { GraphNetworkAction, GraphNetworkContracts } from '../..' - -export const setGRTBalances: GraphNetworkAction< - { - address: string - balance: BigNumber - }[] -> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { address: string; balance: BigNumber }[], -): Promise => { - for (const arg of args) { - await setGRTBalance(contracts, signer, { address: arg.address, balance: arg.balance }) - } -} - -export const setGRTBalance: GraphNetworkAction<{ - address: string - balance: BigNumber -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { address: string; balance: BigNumber }, -): Promise => { - const { address, balance } = args - - const currentBalance = await contracts.GraphToken.balanceOf(address) - const balanceDif = BigNumber.from(balance).sub(currentBalance) - - if (balanceDif.gt(0)) { - console.log(`Funding ${address} with ${ethers.utils.formatEther(balanceDif)} GRT...`) - const tx = await contracts.GraphToken.connect(signer).transfer(address, balanceDif) - await tx.wait() - } -} - -export const setGRTAllowances: GraphNetworkAction<{ spender: string; allowance: BigNumber }[]> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { spender: string; allowance: BigNumber }[], -): Promise => { - for (const arg of args) { - await setGRTAllowance(contracts, signer, { - spender: arg.spender, - allowance: arg.allowance, - }) - } -} - -export const setGRTAllowance: GraphNetworkAction<{ - spender: string - allowance: BigNumber -}> = async ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: { spender: string; allowance: BigNumber }, -): Promise => { - const { spender, allowance } = args - - const currentAllowance = await contracts.GraphToken.allowance(signer.address, spender) - if (!currentAllowance.eq(allowance)) { - console.log( - `Approving ${spender} with ${ethers.utils.formatEther(allowance)} GRT on behalf of ${signer.address}...`, - ) - const tx = await contracts.GraphToken.connect(signer).approve(spender, allowance) - await tx.wait() - } -} diff --git a/packages/sdk/src/deployments/network/actions/pause.ts b/packages/sdk/src/deployments/network/actions/pause.ts deleted file mode 100644 index e5a7cc994..000000000 --- a/packages/sdk/src/deployments/network/actions/pause.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' - -import { GraphNetworkContracts } from '../deployment/contracts/load' -import { GraphNetworkAction } from './types' - -export const setPausedProtocol: GraphNetworkAction<{ paused: boolean }> = async ( - contracts: GraphNetworkContracts, - governorOrPauseGuardian: SignerWithAddress, - args: { paused: boolean }, -): Promise => { - const { paused } = args - const { Controller } = contracts - - console.log(`\nSetting protocol paused to ${paused}...`) - const tx = await Controller.connect(governorOrPauseGuardian).setPaused(paused) - await tx.wait() -} - -export const setPausedBridge: GraphNetworkAction<{ paused: boolean }> = async ( - contracts: GraphNetworkContracts, - governorOrPauseGuardian: SignerWithAddress, - args: { paused: boolean }, -): Promise => { - const { paused } = args - const { GraphTokenGateway } = contracts - - console.log(`\nSetting bridge ${GraphTokenGateway.address} paused to ${paused}...`) - const tx = await GraphTokenGateway.connect(governorOrPauseGuardian).setPaused(paused) - await tx.wait() -} diff --git a/packages/sdk/src/deployments/network/actions/staking.ts b/packages/sdk/src/deployments/network/actions/staking.ts deleted file mode 100644 index 4d94964ee..000000000 --- a/packages/sdk/src/deployments/network/actions/staking.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber, ethers } from 'ethers' - -import { ChannelKey } from '../../../utils' -import { randomHexBytes } from '../../../utils/bytes' -import type { GraphNetworkContracts } from '../deployment/contracts/load' -import { setGRTAllowances } from './graph-token' -import type { GraphNetworkAction } from './types' - -export const stake: GraphNetworkAction<{ amount: BigNumber }> = async ( - contracts: GraphNetworkContracts, - indexer: SignerWithAddress, - args: { amount: BigNumber }, -) => { - const { amount } = args - - // Approve - await setGRTAllowances(contracts, indexer, [{ spender: contracts.Staking.address, allowance: amount }]) - const allowance = await contracts.GraphToken.allowance(indexer.address, contracts.Staking.address) - console.log(`Allowance: ${ethers.utils.formatEther(allowance)}`) - - // Stake - console.log(`\nStaking ${ethers.utils.formatEther(amount)} tokens...`) - const tx = await contracts.Staking.connect(indexer).stake(amount) - await tx.wait() -} - -export const allocateFrom: GraphNetworkAction<{ - channelKey: ChannelKey - subgraphDeploymentID: string - amount: BigNumber -}> = async ( - contracts: GraphNetworkContracts, - indexer: SignerWithAddress, - args: { channelKey: ChannelKey; subgraphDeploymentID: string; amount: BigNumber }, -): Promise => { - const { channelKey, subgraphDeploymentID, amount } = args - - const allocationId = channelKey.address - const proof = await channelKey.generateProof(indexer.address) - const metadata = ethers.constants.HashZero - - console.log(`\nAllocating ${amount} tokens on ${allocationId}...`) - const extraArgs: ethers.Overrides = {} - if (process.env.CI) { - extraArgs.gasLimit = BigNumber.from('400000') - } - const tx = await contracts.Staking.connect(indexer).allocateFrom( - indexer.address, - subgraphDeploymentID, - amount, - allocationId, - metadata, - proof, - extraArgs, - ) - await tx.wait() -} - -export const closeAllocation: GraphNetworkAction<{ allocationId: string }> = async ( - contracts: GraphNetworkContracts, - indexer: SignerWithAddress, - args: { allocationId: string }, -): Promise => { - const { allocationId } = args - - const poi = randomHexBytes() - - console.log(`\nClosing ${allocationId}...`) - const tx = await contracts.Staking.connect(indexer).closeAllocation(allocationId, poi, { - gasLimit: 4_000_000, - }) - await tx.wait() -} diff --git a/packages/sdk/src/deployments/network/actions/types.ts b/packages/sdk/src/deployments/network/actions/types.ts deleted file mode 100644 index 10d6486f9..000000000 --- a/packages/sdk/src/deployments/network/actions/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' - -import type { GraphNetworkContracts } from '../deployment/contracts/load' - -export type GraphNetworkAction = ( - contracts: GraphNetworkContracts, - signer: SignerWithAddress, - args: A, -) => Promise diff --git a/packages/sdk/src/deployments/network/deployment/address-book.ts b/packages/sdk/src/deployments/network/deployment/address-book.ts deleted file mode 100644 index 22f5d9cb2..000000000 --- a/packages/sdk/src/deployments/network/deployment/address-book.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GraphChainId, isGraphChainId } from '../../..' -import { AddressBook } from '../../lib/address-book' -import type { AddressBookJson } from '../../lib/types/address-book' -import { GraphNetworkContractName, isGraphNetworkContractName } from './contracts/list' - -export class GraphNetworkAddressBook extends AddressBook { - assertChainId(chainId: string | number): asserts chainId is GraphChainId { - if (!isGraphChainId(chainId)) { - throw new Error(`ChainId not supported: ${chainId}`) - } - } - - // Asserts the provided object is a valid address book - // Logs warnings for unsupported chain ids or invalid contract names - // TODO: should we enforce json format here and throw instead of just logging? - assertAddressBookJson(json: unknown): asserts json is AddressBookJson { - this._assertAddressBookJson(json) - - // // Validate contract names - const contractList = json[this.chainId] - - const contractNames = contractList ? Object.keys(contractList) : [] - for (const contract of contractNames) { - if (!isGraphNetworkContractName(contract)) { - const message = `Detected invalid GraphNetworkContract in address book: ${contract}, for chainId ${this.chainId}` - if (this.strictAssert) { - throw new Error(message) - } else { - console.error(message) - } - } - } - } -} diff --git a/packages/sdk/src/deployments/network/deployment/config.ts b/packages/sdk/src/deployments/network/deployment/config.ts deleted file mode 100644 index 78be9c3e9..000000000 --- a/packages/sdk/src/deployments/network/deployment/config.ts +++ /dev/null @@ -1,169 +0,0 @@ -import YAML from 'yaml' - -import { toBN } from '../../../utils' -import { getItemValue, updateItemValue } from '../../lib/config' -import type { GraphNetworkContractName } from './contracts/list' -import type { GraphNetworkContracts } from './contracts/load' - -interface GeneralParam { - contract: GraphNetworkContractName // contract where the param is defined - name: string // name of the parameter -} - -interface Contract { - name: string - initParams: ContractInitParam[] -} - -interface ContractInitParam { - name: string // as declared in config.yml - type: 'number' | 'BigNumber' // as returned by the contract - getter?: string // name of function to get the value from the contract. Defaults to 'name' - format?: 'number' // some parameters are stored in different formats than what the contract reports. -} - -const epochManager: Contract = { - name: 'EpochManager', - initParams: [{ name: 'lengthInBlocks', type: 'BigNumber', getter: 'epochLength', format: 'number' }], -} - -const curation: Contract = { - name: 'Curation', - initParams: [ - { name: 'reserveRatio', type: 'number', getter: 'defaultReserveRatio' }, - { name: 'curationTaxPercentage', type: 'number' }, - { name: 'minimumCurationDeposit', type: 'BigNumber' }, - ], -} - -const disputeManager: Contract = { - name: 'DisputeManager', - initParams: [ - { name: 'minimumDeposit', type: 'BigNumber' }, - { name: 'fishermanRewardPercentage', type: 'number' }, - { name: 'idxSlashingPercentage', type: 'number' }, - { name: 'qrySlashingPercentage', type: 'number' }, - ], -} - -const staking: Contract = { - name: 'Staking', - initParams: [ - { name: 'minimumIndexerStake', type: 'BigNumber' }, - { name: 'thawingPeriod', type: 'number' }, - { name: 'protocolPercentage', type: 'number' }, - { name: 'curationPercentage', type: 'number' }, - { name: 'maxAllocationEpochs', type: 'number' }, - { name: 'delegationUnbondingPeriod', type: 'number' }, - { name: 'delegationRatio', type: 'number' }, - { name: 'rebateAlphaNumerator', type: 'number', getter: 'alphaNumerator' }, - { name: 'rebateAlphaDenominator', type: 'number', getter: 'alphaDenominator' }, - { name: 'rebateLambdaNumerator', type: 'number', getter: 'lambdaNumerator' }, - { name: 'rebateLambdaDenominator', type: 'number', getter: 'lambdaDenominator' }, - ], -} - -const rewardsManager: Contract = { - name: 'RewardsManager', - initParams: [{ name: 'issuancePerBlock', type: 'BigNumber' }], -} - -export const GraphNetworkConfigContractList: Contract[] = [ - epochManager, - curation, - disputeManager, - staking, - rewardsManager, -] - -export const GraphNetworkConfigGeneralParams: GeneralParam[] = [ - { - contract: 'DisputeManager', - name: 'arbitrator', - }, - { - contract: 'Controller', - name: 'governor', - }, - { - contract: 'AllocationExchange', - name: 'authority', - }, -] - -export const updateGeneralParams = async ( - contracts: GraphNetworkContracts, - param: GeneralParam, - config: YAML.Document.Parsed, -) => { - // TODO: can we fix this? - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const value = await contracts[param.contract][param.name]() - const updated = updateItemValue(config, `general/${param.name}`, value) - if (updated) { - console.log(`\t- Updated ${param.name} to ${value}`) - } -} - -export const updateContractParams = async ( - contracts: GraphNetworkContracts, - contract: Contract, - config: YAML.Document.Parsed, -) => { - for (const param of contract.initParams) { - // TODO: can we fix this? - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - let value = await contracts[contract.name][param.getter ?? param.name]() - if (param.type === 'BigNumber') { - if (param.format === 'number') { - value = value.toNumber() - } else { - value = value.toString() - } - } - - const updated = updateItemValue(config, `contracts/${contract.name}/init/${param.name}`, value) - if (updated) { - console.log(`\t- Updated ${param.name} to ${value}`) - } - } -} - -export const getDefaults = (config: YAML.Document.Parsed, isL1: boolean) => { - const staking = isL1 ? 'L1Staking' : 'L2Staking' - return { - curation: { - reserveRatio: getItemValue(config, 'contracts/Curation/init/reserveRatio'), - minimumCurationDeposit: getItemValue(config, 'contracts/Curation/init/minimumCurationDeposit'), - l2MinimumCurationDeposit: toBN(1), - curationTaxPercentage: getItemValue(config, 'contracts/Curation/init/curationTaxPercentage'), - }, - dispute: { - minimumDeposit: getItemValue(config, 'contracts/DisputeManager/init/minimumDeposit'), - fishermanRewardPercentage: getItemValue(config, 'contracts/DisputeManager/init/fishermanRewardPercentage'), - qrySlashingPercentage: getItemValue(config, 'contracts/DisputeManager/init/qrySlashingPercentage'), - idxSlashingPercentage: getItemValue(config, 'contracts/DisputeManager/init/idxSlashingPercentage'), - }, - epochs: { - lengthInBlocks: getItemValue(config, 'contracts/EpochManager/init/lengthInBlocks'), - }, - staking: { - minimumIndexerStake: getItemValue(config, `contracts/${staking}/init/minimumIndexerStake`), - maxAllocationEpochs: getItemValue(config, `contracts/${staking}/init/maxAllocationEpochs`), - thawingPeriod: getItemValue(config, `contracts/${staking}/init/thawingPeriod`), - delegationUnbondingPeriod: getItemValue(config, `contracts/${staking}/init/delegationUnbondingPeriod`), - alphaNumerator: getItemValue(config, `contracts/${staking}/init/rebateParameters/alphaNumerator`), - alphaDenominator: getItemValue(config, `contracts/${staking}/init/rebateParameters/alphaDenominator`), - lambdaNumerator: getItemValue(config, `contracts/${staking}/init/rebateParameters/lambdaNumerator`), - lambdaDenominator: getItemValue(config, `contracts/${staking}/init/rebateParameters/lambdaDenominator`), - }, - token: { - initialSupply: getItemValue(config, 'contracts/GraphToken/init/initialSupply'), - }, - rewards: { - issuancePerBlock: '114155251141552511415', - }, - } -} diff --git a/packages/sdk/src/deployments/network/deployment/contracts/deploy.ts b/packages/sdk/src/deployments/network/deployment/contracts/deploy.ts deleted file mode 100644 index 2e5dcf4dd..000000000 --- a/packages/sdk/src/deployments/network/deployment/contracts/deploy.ts +++ /dev/null @@ -1,317 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import type { ContractTransaction, providers, Signer } from 'ethers' -import { Contract, ethers, Wallet } from 'ethers' -import * as path from 'path' - -import { type GraphChainId, isGraphL1ChainId, isGraphL2ChainId } from '../../../../chain' -import { setCode } from '../../../../helpers/code' -import { assertObject } from '../../../../utils/assertions' -import { confirm } from '../../../../utils/prompt' -import type { AddressBook } from '../../../lib/address-book' -import { getContractConfig, loadCallParams, readConfig } from '../../../lib/config' -import { logContractCall, logContractReceipt } from '../../../lib/contracts/log' -import { deployContract, deployContractAndSave } from '../../../lib/deploy/contract' -import { isContractDeployed } from '../../../lib/deploy/deploy' -import type { DeployData, DeployResult } from '../../../lib/types/deploy' -import { DeployType, isDeployType } from '../../../lib/types/deploy' -import { logDebug } from '../../../logger' -import { acceptOwnership } from '../../actions/governed' -import { setPausedProtocol } from '../../actions/pause' -import { GraphNetworkAddressBook } from '../address-book' -import { - type GraphNetworkContractName, - GraphNetworkGovernedContractNameList, - GraphNetworkL1ContractNameList, - GraphNetworkL2ContractNameList, - GraphNetworkSharedContractNameList, -} from './list' -import { GraphNetworkContracts, loadGraphNetworkContracts } from './load' -import { deployContractImplementationAndSave, deployContractWithProxy, deployContractWithProxyAndSave } from './proxy' - -export async function deployGraphNetwork( - addressBookFileName: string, - graphConfigFileName: string, - chainId: GraphChainId, - deployer: SignerWithAddress, - provider: providers.Provider, - opts?: { - governor?: SignerWithAddress - skipConfirmation?: boolean - forceDeploy?: boolean - buildAcceptTx?: boolean - l2Deploy?: boolean - enableTxLogging?: boolean - artifactsDir?: string | string[] - }, -): Promise { - // Validate addressBookFileName - should not start with '.' to avoid path confusion - if (addressBookFileName.startsWith('.')) { - throw new Error( - `addressBookFileName should be a filename, not a relative path. Got: ${addressBookFileName}. Use just the filename like 'addresses-local.json'`, - ) - } - - // Validate graphConfigFileName - should not start with '.' to avoid path confusion - if (graphConfigFileName.startsWith('.')) { - throw new Error( - `graphConfigFileName should be a filename, not a relative path. Got: ${graphConfigFileName}. Use just the filename like 'graph.hardhat.yml'`, - ) - } - - const { addressBookDir, configDir } = require('@graphprotocol/contracts') - const addressBookPath = path.join(addressBookDir, addressBookFileName) - const graphConfigPath = path.join(configDir, graphConfigFileName) - - // Opts - const governor = opts?.governor ?? undefined - const skipConfirmation = opts?.skipConfirmation ?? false - const forceDeploy = opts?.forceDeploy ?? false - const buildAcceptTx = opts?.buildAcceptTx ?? false - const l2Deploy = opts?.l2Deploy ?? false - const enableTxLogging = opts?.enableTxLogging ?? true - - // Snapshot deployer - const beforeDeployerNonce = await deployer.getTransactionCount() - const beforeDeployerBalance = await deployer.getBalance() - - // Ensure action - const sure = await confirm('Are you sure you want to migrate contracts?', skipConfirmation) - if (!sure) return - - // Build list of contracts to deploy - // We force AllocationExchange to the end, it requires GraphToken and Staking to be deployed beforehand - const contractList: GraphNetworkContractName[] = [ - ...GraphNetworkSharedContractNameList.filter((c) => c !== 'AllocationExchange'), - ] - if (!l2Deploy && isGraphL1ChainId(chainId)) { - contractList.push(...GraphNetworkL1ContractNameList) - } - if (l2Deploy || isGraphL2ChainId(chainId)) { - contractList.push(...GraphNetworkL2ContractNameList) - } - contractList.push('AllocationExchange') - - logDebug(`>>> Migrating contracts <<<\n`) - - //////////////////////////////////////// - // Deploy contracts - //////////////////////////////////////// - - logDebug(`>>> Contracts deployment\n`) - - const graphConfig = readConfig(graphConfigPath) - const addressBook = new GraphNetworkAddressBook(addressBookPath, chainId) - - const pendingContractCalls = [] - const contracts = [] - for (const name of contractList) { - // Get address book info - const addressEntry = addressBook.getEntry(name) - const savedAddress = addressEntry && addressEntry.address - - logDebug(`= Deploy: ${name}`) - - // Check if contract already deployed - if (!forceDeploy) { - const isDeployed = await isContractDeployed( - name, - 'GraphProxy', - savedAddress, - addressBook, - provider, - opts?.artifactsDir, - ) - if (isDeployed) { - logDebug(`${name} is up to date, no action required`) - logDebug(`Address: ${savedAddress}\n`) - continue - } - } - - // Get config and deploy contract - const contractConfig = getContractConfig(graphConfig, addressBook, name, deployer.address) - const contract = await deploy( - contractConfig.proxy ? DeployType.DeployWithProxyAndSave : DeployType.DeployAndSave, - deployer, - { - name: name, - args: contractConfig.params.map((a) => a.value), - artifactsPath: opts?.artifactsDir, - }, - addressBook, - { - name: 'GraphProxy', - opts: { - buildAcceptTx: buildAcceptTx, - }, - artifactsPath: opts?.artifactsDir, - }, - ) - contracts.push({ contract: contract, name: name }) - logDebug('') - - // Defer contract calls after deploying every contract - if (contractConfig.calls) { - pendingContractCalls.push({ name, contract, calls: contractConfig.calls }) - } - } - logDebug('Contract deployments done! Contract calls are next') - - //////////////////////////////////////// - // Run contracts calls - //////////////////////////////////////// - logDebug('') - logDebug(`>>> Contracts calls\n`) - if (pendingContractCalls.length > 0) { - for (const entry of pendingContractCalls) { - if (entry.calls.length == 0) continue - - logDebug(`= Config: ${entry.name}`) - for (const call of entry.calls) { - logDebug(`* Calling ${call.fn}`) - try { - const params = loadCallParams(call.params, addressBook, deployer.address) - logDebug(`- Params: ${params.join(', ')}`) - const overrides = process.env.CI ? { gasLimit: 2_000_000 } : {} - const response: ContractTransaction = await entry.contract.contract - .connect(deployer) - .functions[call.fn](...params, overrides) - logContractCall(response, entry.name, call.fn, params) - const receipt = await entry.contract.contract.provider.waitForTransaction(response.hash) - logContractReceipt(receipt) - } catch (error) { - // TODO: can we clean this up? - // Fallback for StakingExtension methods - if (['L1Staking', 'L2Staking'].includes(entry.name)) { - const StakingExtension = contracts.find((c) => c.name === 'StakingExtension') - if (StakingExtension === undefined) { - throw new Error('StakingExtension not found') - } - const ExtendedStaking = new Contract( - entry.contract.contract.address, - StakingExtension.contract.contract.interface, - deployer, - ) - await ExtendedStaking.connect(deployer).functions[call.fn]( - ...loadCallParams(call.params, addressBook, deployer.address), - ) - } else { - throw error - } - } - } - logDebug('') - } - } else { - logDebug('Nothing to do') - } - - //////////////////////////////////////// - // Load contracts - //////////////////////////////////////// - const loadedContracts = loadGraphNetworkContracts(addressBookFileName, chainId, provider, opts?.artifactsDir, { - l2Load: l2Deploy, - enableTxLogging: enableTxLogging, - }) - - //////////////////////////////////////// - // Post deploy - //////////////////////////////////////// - // If a governor was provided, accept ownership of contracts and unpause the protocol - if (governor) { - const txs: ContractTransaction[] = [] - for (const contract of GraphNetworkGovernedContractNameList) { - const tx = await acceptOwnership(loadedContracts, governor, { contractName: contract }) - if (tx) { - txs.push() - } - } - await Promise.all(txs.map((tx) => tx.wait())) - await setPausedProtocol(loadedContracts, governor, { paused: false }) - } - - //////////////////////////////////////// - // Print summary - //////////////////////////////////////// - logDebug('') - logDebug(`>>> Summary\n`) - logDebug('All done!') - - const afterDeployerNonce = await deployer.getTransactionCount() - const afterDeployerBalance = await deployer.getBalance() - - const spent = ethers.utils.formatEther(beforeDeployerBalance.sub(afterDeployerBalance)) - const nTx = afterDeployerNonce - beforeDeployerNonce - logDebug(`Sent ${nTx} transaction${nTx === 1 ? '' : 's'} & spent ${ethers.constants.EtherSymbol} ${spent}`) - - return loadedContracts -} - -export async function deployMockGraphNetwork(l2Deploy: boolean) { - // Contract list - const contractList: GraphNetworkContractName[] = [ - ...GraphNetworkSharedContractNameList.filter((c) => c !== 'AllocationExchange'), - ] - contractList.push(...(l2Deploy ? GraphNetworkL2ContractNameList : GraphNetworkL1ContractNameList)) - contractList.push('AllocationExchange') - - const contracts: Partial> = {} - for (const name of contractList) { - const fake = Wallet.createRandom() - await setCode(fake.address, '0x1234') - contracts[name] = new Contract(fake.address, [], fake) - } - - return contracts as GraphNetworkContracts -} - -export const deploy = async ( - type: DeployType | unknown, - sender: Signer, - contractData: DeployData, - addressBook?: AddressBook, - proxyData?: DeployData, -): Promise => { - if (!isDeployType(type)) { - throw new Error('Please provide the correct option for deploy type') - } - - switch (type) { - case DeployType.Deploy: - logDebug(`Deploying contract ${contractData.name}...`) - return await deployContract(sender, contractData) - case DeployType.DeployAndSave: - logDebug(`Deploying contract ${contractData.name} and saving to address book...`) - assertObject(addressBook) - return await deployContractAndSave(sender, contractData, addressBook) - case DeployType.DeployWithProxy: - logDebug(`Deploying contract ${contractData.name} with proxy ...`) - assertObject(addressBook) - validateProxyData(proxyData) - // TODO - for some reason proxyData's type is not being narrowed down to DeployData - // so we force non-null assertion - return await deployContractWithProxy(sender, contractData, addressBook, proxyData!) - case DeployType.DeployWithProxyAndSave: - logDebug(`Deploying contract ${contractData.name} with proxy and saving to address book...`) - assertObject(addressBook) - validateProxyData(proxyData) - // TODO - for some reason proxyData's type is not being narrowed down to DeployData - // so we force non-null assertion - return await deployContractWithProxyAndSave(sender, contractData, addressBook, proxyData!) - case DeployType.DeployImplementationAndSave: - logDebug(`Deploying contract ${contractData.name} implementation and saving to address book...`) - assertObject(addressBook) - validateProxyData(proxyData) - // TODO - for some reason proxyData's type is not being narrowed down to DeployData - // so we force non-null assertion - return await deployContractImplementationAndSave(sender, contractData, addressBook, proxyData!) - default: - throw new Error('Please provide the correct option for deploy type') - } -} - -function validateProxyData(proxyData: DeployData | undefined): void { - if (!proxyData) { - throw new Error('Proxy data not provided!') - } -} diff --git a/packages/sdk/src/deployments/network/deployment/contracts/list.ts b/packages/sdk/src/deployments/network/deployment/contracts/list.ts deleted file mode 100644 index dd1066fb7..000000000 --- a/packages/sdk/src/deployments/network/deployment/contracts/list.ts +++ /dev/null @@ -1,58 +0,0 @@ -// List of contract names for the Graph Network - -export const GraphNetworkSharedContractNameList = [ - 'GraphProxyAdmin', - 'BancorFormula', - 'Controller', - 'EpochManager', - 'GraphCurationToken', - 'ServiceRegistry', - 'SubgraphNFTDescriptor', - 'SubgraphNFT', - 'StakingExtension', - 'RewardsManager', - 'DisputeManager', - 'AllocationExchange', -] as const -export const GraphNetworkOptionalContractNameList = [ - 'IENS', - 'ENS', - 'IEthereumDIDRegistry', - 'EthereumDIDRegistry', -] as const -export const GraphNetworkL1ContractNameList = [ - 'GraphToken', - 'Curation', - 'L1GNS', - 'L1Staking', - 'L1GraphTokenGateway', - 'BridgeEscrow', -] as const -export const GraphNetworkL2ContractNameList = [ - 'L2GraphToken', - 'L2Curation', - 'L2GNS', - 'L2Staking', - 'L2GraphTokenGateway', - 'SubgraphAvailabilityManager', -] as const - -export const GraphNetworkContractNameList = [ - ...GraphNetworkSharedContractNameList, - ...GraphNetworkOptionalContractNameList, - ...GraphNetworkL1ContractNameList, - ...GraphNetworkL2ContractNameList, -] as const - -export type GraphNetworkContractName = (typeof GraphNetworkContractNameList)[number] - -export function isGraphNetworkContractName(name: unknown): name is GraphNetworkContractName { - return typeof name === 'string' && GraphNetworkContractNameList.includes(name as GraphNetworkContractName) -} - -export const GraphNetworkGovernedContractNameList: GraphNetworkContractName[] = [ - 'GraphToken', - 'Controller', - 'GraphProxyAdmin', - 'SubgraphNFT', -] diff --git a/packages/sdk/src/deployments/network/deployment/contracts/load.ts b/packages/sdk/src/deployments/network/deployment/contracts/load.ts deleted file mode 100644 index ec5582897..000000000 --- a/packages/sdk/src/deployments/network/deployment/contracts/load.ts +++ /dev/null @@ -1,207 +0,0 @@ -import type { - AllocationExchange, - BancorFormula, - BridgeEscrow, - Controller, - Curation, - DisputeManager, - EpochManager, - GraphCurationToken, - GraphProxyAdmin, - GraphToken, - IENS, - L1GNS, - L1GraphTokenGateway, - L1Staking, - L2Curation, - L2GNS, - L2GraphToken, - L2GraphTokenGateway, - L2Staking, - RewardsManager, - ServiceRegistry, - StakingExtension, - SubgraphAvailabilityManager, - SubgraphNFT, - SubgraphNFTDescriptor, -} from '@graphprotocol/contracts' -import { Contract, providers, Signer } from 'ethers' -import * as path from 'path' - -import type { GraphChainId } from '../../../..' -import { isGraphChainId, isGraphL1ChainId } from '../../../..' -import { mergeABIs } from '../../../../utils/abi' -import { assertObject } from '../../../../utils/assertions' -import { loadContract, loadContracts } from '../../../lib/contracts/load' -import { loadArtifact } from '../../../lib/deploy/artifacts' -import { ContractList } from '../../../lib/types/contract' -import { GraphNetworkAddressBook } from '../address-book' -import type { GraphNetworkContractName } from './list' -import { - GraphNetworkL1ContractNameList, - GraphNetworkL2ContractNameList, - GraphNetworkOptionalContractNameList, - GraphNetworkSharedContractNameList, - isGraphNetworkContractName, -} from './list' - -export type L1ExtendedStaking = L1Staking & StakingExtension -export type L2ExtendedStaking = L2Staking & StakingExtension - -export interface GraphNetworkContracts extends ContractList { - EpochManager: EpochManager - DisputeManager: DisputeManager - ServiceRegistry: ServiceRegistry - RewardsManager: RewardsManager - GraphProxyAdmin: GraphProxyAdmin - Controller: Controller - BancorFormula: BancorFormula - AllocationExchange: AllocationExchange - SubgraphNFT: SubgraphNFT - SubgraphNFTDescriptor: SubgraphNFTDescriptor - GraphCurationToken: GraphCurationToken - StakingExtension: StakingExtension - IENS?: IENS - SubgraphAvailabilityManager: SubgraphAvailabilityManager - - // Only L1 - L1GraphToken?: GraphToken - L1Staking?: L1Staking - L1GNS?: L1GNS - L1Curation?: Curation - L1GraphTokenGateway?: L1GraphTokenGateway - BridgeEscrow?: BridgeEscrow - - // Only L2 - L2GraphToken?: L2GraphToken - L2Staking?: L2Staking - L2GNS?: L2GNS - L2Curation?: L2Curation - L2GraphTokenGateway?: L2GraphTokenGateway - - // Alias - GNS: L1GNS | L2GNS - Staking: L1ExtendedStaking | L2ExtendedStaking - GraphToken: GraphToken | L2GraphToken - Curation: Curation | L2Curation - GraphTokenGateway: L1GraphTokenGateway | L2GraphTokenGateway - - // Iterator - [Symbol.iterator]: () => Generator -} - -export function loadGraphNetworkContracts( - addressBookFileName: string, - chainId: number, - signerOrProvider?: Signer | providers.Provider, - artifactsPath?: string | string[], - opts?: { - enableTxLogging?: boolean - strictAssert?: boolean - l2Load?: boolean - }, -): GraphNetworkContracts { - if (!isGraphChainId(chainId)) { - throw new Error(`ChainId not supported: ${chainId}`) - } - - // Validate addressBookFileName - should not start with '.' to avoid path confusion - if (addressBookFileName.startsWith('.')) { - throw new Error( - `addressBookFileName should be a filename, not a path. Got: ${addressBookFileName}. Use just the filename like 'addresses-local.json'`, - ) - } - - const { addressBookDir } = require('@graphprotocol/contracts') - const addressBookPath = path.join(addressBookDir, addressBookFileName) - - const addressBook = new GraphNetworkAddressBook(addressBookPath, chainId) - const contracts = loadContracts( - addressBook, - artifactsPath ?? [], // Pass empty array since loadContractAt now ignores this - signerOrProvider, - opts?.enableTxLogging ?? true, - GraphNetworkOptionalContractNameList as unknown as GraphNetworkContractName[], // This is ugly but safe - ) - - assertGraphNetworkContracts(contracts, chainId, opts?.strictAssert) - - // Alias - // One of L1/L2 should always be defined so we can safely assert the types - const loadL1 = isGraphL1ChainId(chainId) && !opts?.l2Load - contracts.GraphToken = loadL1 ? contracts.GraphToken! : contracts.L2GraphToken! - contracts.GNS = loadL1 ? contracts.L1GNS! : contracts.L2GNS! - contracts.Curation = loadL1 ? contracts.Curation! : contracts.L2Curation! - contracts.GraphTokenGateway = loadL1 ? contracts.L1GraphTokenGateway! : contracts.L2GraphTokenGateway! - - // Staking is a special snowflake! - // Since staking contract is a proxy for StakingExtension we need to manually - // merge the ABIs and override the contract instance - const stakingName = loadL1 ? 'L1Staking' : 'L2Staking' - const staking = contracts[stakingName] - if (staking) { - const stakingOverride = loadContract( - stakingName, - addressBook, - artifactsPath ?? [], // Use provided artifacts path or empty array - signerOrProvider, - opts?.enableTxLogging ?? true, - new Contract( - staking.address, - mergeABIs(loadArtifact(stakingName).abi, loadArtifact('StakingExtension').abi), - signerOrProvider, - ), - ) as L1ExtendedStaking | L2ExtendedStaking - contracts.Staking = stakingOverride - if (loadL1) contracts.L1Staking = stakingOverride as L1ExtendedStaking - if (!loadL1) contracts.L2Staking = stakingOverride as L2ExtendedStaking - } - - // Iterator - contracts[Symbol.iterator] = function* () { - for (const key of Object.keys(this)) { - yield this[key as GraphNetworkContractName] as Contract - } - } - - return contracts -} - -function assertGraphNetworkContracts( - contracts: unknown, - chainId: GraphChainId, - strictAssert?: boolean, -): asserts contracts is GraphNetworkContracts { - assertObject(contracts) - - // Allow loading contracts not defined in GraphNetworkContractNameList but raise a warning - const contractNames = Object.keys(contracts) - if (!contractNames.every((c) => isGraphNetworkContractName(c))) { - console.warn(`Loaded invalid GraphNetworkContract: ${contractNames.filter((c) => !isGraphNetworkContractName(c))}`) - } - - // Assert that all shared GraphNetworkContracts were loaded - for (const contractName of GraphNetworkSharedContractNameList) { - if (!contracts[contractName]) { - const errMessage = `Missing GraphNetworkContract: ${contractName} for chainId ${chainId}` - console.error(errMessage) - if (strictAssert) { - throw new Error(errMessage) - } - } - } - - // Assert that L1/L2 specific GraphNetworkContracts were loaded - const layerSpecificContractNames = isGraphL1ChainId(chainId) - ? GraphNetworkL1ContractNameList - : GraphNetworkL2ContractNameList - for (const contractName of layerSpecificContractNames) { - if (!contracts[contractName]) { - const errMessage = `Missing GraphNetworkContract: ${contractName} for chainId ${chainId}` - console.error(errMessage) - if (strictAssert) { - throw new Error(errMessage) - } - } - } -} diff --git a/packages/sdk/src/deployments/network/deployment/contracts/proxy.ts b/packages/sdk/src/deployments/network/deployment/contracts/proxy.ts deleted file mode 100644 index 3c070be95..000000000 --- a/packages/sdk/src/deployments/network/deployment/contracts/proxy.ts +++ /dev/null @@ -1,248 +0,0 @@ -import type { Contract, Signer } from 'ethers' - -import { hashHexString } from '../../../../utils/hash' -import { AddressBook } from '../../../lib/address-book' -import { loadContractAt } from '../../../lib/contracts/load' -import { loadArtifact } from '../../../lib/deploy/artifacts' -import { deployContract, deployContractAndSave } from '../../../lib/deploy/contract' -import type { ContractParam } from '../../../lib/types/contract' -import type { DeployAddressBookWithProxyFunction, DeployData, DeployResult } from '../../../lib/types/deploy' -import { logDebug } from '../../../logger' - -/** - * Deploys a contract with a proxy - * - * @remarks Sets a contract as the proxy admin - * @remarks The proxy admin needs to - * @remarks This function can deploy any proxy contract as long as the constructor has the following signature: - * `constructor(address implementation, address admin)` - * - * @param sender Signer to deploy the contract with, must be already connected to a provider - * @param name Name of the contract to deploy - * @param args Contract constructor arguments - * @param proxyName Name of the proxy contract to deploy - * @param proxyAdmin Contract to be used as the proxy admin - * @param buildAcceptTx If set to true it will build the accept tx and print it to the console. Defaults to `false` - * @returns the deployed contract with the proxy address - * - * @throws Error if the sender is not connected to a provider - */ -export const deployContractWithProxy: DeployAddressBookWithProxyFunction = async ( - sender: Signer, - contractData: DeployData, - addressBook: AddressBook, - proxyData: DeployData, -): Promise => { - if (!sender.provider) { - throw Error('Sender must be connected to a provider') - } - - const proxyAdmin = getProxyAdmin(addressBook, contractData.artifactsPath) - - // Deploy implementation - const implDeployResult = await deployContract(sender, { - name: contractData.name, - args: [], - artifactsPath: contractData.artifactsPath, - }) - - // Deploy proxy - const { contract: proxy } = await deployContract(sender, { - name: proxyData.name, - args: [implDeployResult.contract.address, proxyAdmin.address], - opts: { autolink: false }, - artifactsPath: proxyData.artifactsPath, - }) - - // Accept implementation upgrade - await proxyAdminAcceptUpgrade( - sender, - implDeployResult.contract, - contractData.args ?? [], - proxyAdmin, - proxy.address, - proxyData.opts?.buildAcceptTx ?? false, - ) - - // Use interface of contract but with the proxy address - implDeployResult.contract = implDeployResult.contract.attach(proxy.address) - return implDeployResult -} - -/** - * Deploys a contract with a proxy and saves the deployment result to the address book - * - * @remarks Same as {@link deployContractWithProxy} but this variant will also save the deployment result to the address book. - * - * @param proxyName Name of the proxy contract to deploy - * @param proxyAdmin Proxy admin contract - * @param name Name of the contract to deploy - * @param args Contract constructor arguments - * @param sender Signer to deploy the contract with, must be already connected to a provider - * @param buildAcceptTx If set to true it will build the accept tx and print it to the console. Defaults to `false` - * @returns the deployed contract with the proxy address - * - * @throws Error if the sender is not connected to a provider - */ -export const deployContractWithProxyAndSave: DeployAddressBookWithProxyFunction = async ( - sender: Signer, - contractData: DeployData, - addressBook: AddressBook, - proxyData: DeployData, -): Promise => { - if (!sender.provider) { - throw Error('Sender must be connected to a provider') - } - - const proxyAdmin = getProxyAdmin(addressBook, contractData.artifactsPath) - - // Deploy implementation - const implDeployResult = await deployContractAndSave( - sender, - { - name: contractData.name, - args: [], - artifactsPath: contractData.artifactsPath, - }, - addressBook, - ) - - // Deploy proxy - const { contract: proxy } = await deployContract(sender, { - name: proxyData.name, - args: [implDeployResult.contract.address, proxyAdmin.address], - opts: { autolink: false }, - artifactsPath: proxyData.artifactsPath, - }) - - // Accept implementation upgrade - await proxyAdminAcceptUpgrade( - sender, - implDeployResult.contract, - contractData.args ?? [], - proxyAdmin, - proxy.address, - proxyData.opts?.buildAcceptTx ?? false, - ) - - // Overwrite address entry with proxy - const artifact = loadArtifact(proxyData.name, proxyData.artifactsPath) - const contractEntry = addressBook.getEntry(contractData.name) - - addressBook.setEntry(contractData.name, { - address: proxy.address, - initArgs: contractData.args?.length === 0 ? undefined : contractData.args?.map((e) => e.toString()), - creationCodeHash: hashHexString(artifact.bytecode), - runtimeCodeHash: hashHexString(await sender.provider.getCode(proxy.address)), - txHash: proxy.deployTransaction.hash, - proxy: true, - implementation: contractEntry, - }) - logDebug('> Contract saved to address book') - - // Use interface of contract but with the proxy address - implDeployResult.contract = implDeployResult.contract.attach(proxy.address) - return implDeployResult -} - -export const deployContractImplementationAndSave: DeployAddressBookWithProxyFunction = async ( - sender: Signer, - contractData: DeployData, - addressBook: AddressBook, - proxyData: DeployData, -): Promise => { - if (!sender.provider) { - throw Error('Sender must be connected to a provider') - } - - const proxyAdmin = getProxyAdmin(addressBook, contractData.artifactsPath) - - // Deploy implementation - const implDeployResult = await deployContract(sender, { - name: contractData.name, - args: [], - artifactsPath: contractData.artifactsPath, - }) - - // Get proxy entry - const contractEntry = addressBook.getEntry(contractData.name) - - // Accept implementation upgrade - await proxyAdminAcceptUpgrade( - sender, - implDeployResult.contract, - contractData.args ?? [], - proxyAdmin, - contractEntry.address, - proxyData.opts?.buildAcceptTx ?? false, - ) - - // Save address entry - contractEntry.implementation = { - address: implDeployResult.contract.address, - constructorArgs: contractData.args?.length === 0 ? undefined : contractData.args?.map((e) => e.toString()), - creationCodeHash: implDeployResult.creationCodeHash, - runtimeCodeHash: implDeployResult.runtimeCodeHash, - txHash: implDeployResult.txHash, - libraries: - implDeployResult.libraries && Object.keys(implDeployResult.libraries).length > 0 - ? implDeployResult.libraries - : undefined, - } - addressBook.setEntry(contractData.name, contractEntry) - logDebug('> Contract saved to address book') - - // Use interface of contract but with the proxy address - implDeployResult.contract = implDeployResult.contract.attach(contractEntry.address) - return implDeployResult -} - -/** - * Accepts an upgrade for a proxy contract managed by a proxy admin - * - * @remarks Initializes the implementation if init arguments are provided - * - * @privateRemarks This function is highly specific to the graph protocol proxy system - * - * @param sender Signer to make the call to the proxy admin contract - * @param contract Implementation contract - * @param args Implementation initialization arguments - * @param proxyAdmin Proxy admin contract - * @param buildAcceptTx If set to true it will build the accept tx and print it to the console. Defaults to `false` - */ -const proxyAdminAcceptUpgrade = async ( - sender: Signer, - contract: Contract, - args: Array, - proxyAdmin: Contract, - proxyAddress: string, - buildAcceptTx = false, -) => { - const initTx = args ? await contract.populateTransaction.initialize(...args) : null - const acceptFunctionName = initTx ? 'acceptProxyAndCall' : 'acceptProxy' - const acceptFunctionParams = initTx ? [contract.address, proxyAddress, initTx.data] : [contract.address, proxyAddress] - - if (buildAcceptTx) { - console.info( - ` - Copy this data in the Gnosis Multisig UI, or a similar app and call ${acceptFunctionName} - -------------------------------------------------------------------------------------- - > Contract Address: ${proxyAdmin.address} - > Implementation: ${contract.address} - > Proxy: ${proxyAddress} - > Data: ${initTx && initTx.data} - `, - ) - } else { - await proxyAdmin.connect(sender)[acceptFunctionName](...acceptFunctionParams) - } -} - -// Get the proxy admin to own the proxy for this contract -function getProxyAdmin(addressBook: AddressBook, artifactsPath?: string | string[]): Contract { - const proxyAdminEntry = addressBook.getEntry('GraphProxyAdmin') - if (!proxyAdminEntry) { - throw new Error('GraphProxyAdmin not detected in the config, must be deployed first!') - } - return loadContractAt('GraphProxyAdmin', proxyAdminEntry.address, artifactsPath) -} diff --git a/packages/sdk/src/gre/README.md b/packages/sdk/src/gre/README.md deleted file mode 100644 index f698d85f6..000000000 --- a/packages/sdk/src/gre/README.md +++ /dev/null @@ -1,322 +0,0 @@ -# Graph Runtime Environment (GRE) - -GRE is a hardhat plugin that extends hardhat's runtime environment to inject additional functionality related to the usage of the Graph Protocol. - -## Features - -- Provides a simple interface to interact with protocol contracts -- Exposes protocol configuration via graph config file and address book -- Provides account management methods for convenience -- Detailed logging of transactions to file -- Multichain! Supports both L1 and L2 layers of the protocol simultaneously -- Integrates seamlessly with [hardhat-secure-accounts](https://www.npmjs.com/package/hardhat-secure-accounts) -- Convenience method to create tasks that use GRE - -## Usage - -### Example - -Import GRE using `import '@graphprotocol/sdk/gre'` on your hardhat config file and then: - -```js -// Use L2 governor account to set the L1 token address on the L2 gateway -const { l1, l2 } = hre.graph() - -const { GraphToken } = l1.contracts - -const { L2GraphTokenGateway } = l2.contracts -const { governor } = await l2.getNamedAccounts() - -const tx = L2GraphTokenGateway.connect(governor).setL1TokenAddress(GraphToken.address) -``` - -**Note**: Project must run hardhat@~2.14.0 due to - -#### Network selection - -GRE supports both the L1 and L2 networks of the Graph Protocol by default. It will use hardhat's network defined via `--network` as the "main" network and then automatically detect which is the appropriate counterpart network in L1 or L2. - -Example: - -```bash -# L1: goerli and L2: arbitrum-goerli -hh console --network goerli - -# L1: mainnet and L2: arbitrum-one -hh console --network arbitrum-one - -# L1: mainnet and L2: arbitrum-one > same as previous -hh console --network mainnet -``` - -#### Configuration - -To use GRE you'll need to configure the target networks. That is done via either hardhat's config file using the `networks` [config field](https://hardhat.org/hardhat-runner/docs/config#json-rpc-based-networks) or by passing the appropriate arguments to `hre.graph()` initializer. - -**Note**: The "main" network, defined by hardhat's `--network` flag _MUST_ be properly configured for GRE to initialize successfully. It's not necessary to configure the counterpart network if you don't plan on using it. - -### Hardhat: Network config - -```js -networks: { - goerli: { - chainId: 5, - url: `https://goerli.infura.io/v3/123456` - accounts: { - mnemonic: 'test test test test test test test test test test test test', - }, - graphConfig: 'config/graph.goerli.yml' - }, -} -``` - -Fields: - -- **(_REQUIRED_) chainId**: the chainId of the network. This field is not required by hardhat but it's used by GRE to simplify the API. -- **(_REQUIRED_) url**: the RPC endpoint of the network. -- **(_OPTIONAL_) accounts**: the accounts to use on the network. These will be used by the account management functions on GRE. -- **(_OPTIONAL_) graphConfig**: the path to the graph config file for the network. - -### Hardhat: Graph config - -Additionally, the plugin adds a new config field to hardhat's config file: `graphConfig`. This can be used used to define defaults for the graph config file. - -```js -... -networks: { -... -}, -graph: { - addressBook: 'addresses.json' - l1GraphConfig: 'config/graph.mainnet.yml' - l2GraphConfig: 'config/graph.arbitrum-one.yml' -} -... -``` - -Fields: - -- **(_OPTIONAL_) addressBook**: the path to the address book. -- **(_REQUIRED_) l1GraphConfig**: default path to the graph config file for L1 networks. This will be used if the `graphConfig` field is not defined on the network config. -- **(_REQUIRED_) l2GraphConfig**: default path to the graph config file for L2 networks. This will be used if the `graphConfig` field is not defined on the network config. - -### Options: Graph initializer - -The GRE initializer also allows you to set the address book and the graph config files like so: - -```js -const graph = hre.graph({ - addressBook: 'addresses.json', - l1GraphConfig: 'config/graph.mainnet.yml' - l2GraphConfig: 'config/graph.arbitrum-one.yml' -}) - -// Here graphConfig will apply only to the "main" network given by --network -const graph = hre.graph({ - addressBook: 'addresses.json', - graphConfig: 'config/graph.mainnet.yml' -}) -``` - -### Config priority - -The path to the graph config and the address book can be set in multiple ways. The plugin will use the following order to determine the path to the graph config file: - -1. `hre.graph({ ... })` init parameters `l1GraphConfigPath` and `l2GraphConfigPath` -2. `hre.graph({ ...})` init parameter graphConfigPath (but only for the "main" network) -3. `networks..graphConfig` network config parameter `graphConfig` in hardhat config file -4. `graph.lGraphConfig` graph config parameters `l1GraphConfig` and `l2GraphConfig` in hardhat config file - -The priority for the address book is: - -1. `hre.graph({ ... })` init parameter `addressBook` -2. `graph.addressBook` graph config parameter `addressBook` in hardhat config file - -### Graph task convenience method - -GRE accepts a few parameters when being initialized. When using GRE in the context of a hardhat task these parameters would typically be configured as task options. - -In order to simplify the creation of hardhat tasks that will make use of GRE and would require several options to be defined we provide a convenience method: `greTask`. This is a drop in replacement for hardhat's `task` that includes GRE related boilerplate, you can still customize the task as you would do with `task`. - -you avoid having to define GRE's options on all of your tasks. - -Here is an example of a task using this convenience method: - -```ts -import { greTask } from '../../gre/gre' - -greTask('hello-world', 'Say hi!', async (args, hre) => { - console.log('hello world') - const graph = hre.graph(args) -}) -``` - -```bash -✗ npx hardhat hello-world --help -Hardhat version 2.10.1 - -Usage: hardhat [GLOBAL OPTIONS] test-graph [--address-book ] [--disable-secure-accounts] [--graph-config ] [--l1-graph-config ] [--l2-graph-config ] - -OPTIONS: - - --address-book Path to the address book file. - --disable-secure-accounts Disable secure accounts. - --enable-tx-logging Enable transaction logging. - --graph-config Path to the graph config file for the network specified using --network. - --l1-graph-config Path to the graph config file for the L1 network. - --l2-graph-config Path to the graph config file for the L2 network. - -hello-world: Say hi! - -For global options help run: hardhat help -``` - -### Transaction Logging - -By default all transactions executed via GRE will be logged to a file. The file will be created on the first transaction with the following convention `tx-.log`. Here is a sample log file: - -```text -[2024-01-15T14:33:26.747Z] > Sending transaction: GraphToken.addMinter -[2024-01-15T14:33:26.747Z] = Sender: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 -[2024-01-15T14:33:26.747Z] = Contract: 0x428aAe4Fa354c21600b6ec0077F2a6855C7dcbC8 -[2024-01-15T14:33:26.747Z] = Params: [ 0x05eA50dc2C0389117A067D393e0395ACc32c53b6 ] -[2024-01-15T14:33:26.747Z] = TxHash: 0xa9096e5f9f9a2208202ac3a8b895561dc3f781fa7e19350b0855098a08d193f7 -[2024-01-15T14:33:26.750Z] ✔ Transaction succeeded! -[2024-01-15T14:33:26.777Z] > Sending transaction: GraphToken.renounceMinter -[2024-01-15T14:33:26.777Z] = Sender: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 -[2024-01-15T14:33:26.777Z] = Contract: 0x428aAe4Fa354c21600b6ec0077F2a6855C7dcbC8 -[2024-01-15T14:33:26.777Z] = Params: [ ] -[2024-01-15T14:33:26.777Z] = TxHash: 0x48233b256a1f98cb3fecc3dd48d7f7c0175042142e1ca7b9b1f9fc91169bb588 -[2024-01-15T14:33:26.780Z] ✔ Transaction succeeded! -``` - -If you want to disable transaction logging you can do so by setting the `enableTxLogging` option to `false` when initializing GRE: `g=graph({ disableSecureAccounts: true })` - -## API - -GRE exposes functionality via a simple API: - -```js -const graph = hre.graph() - -// To access the L1 object -graph.l1 - -// To access the L2 object -graph.l2 -``` - -The interface for both `l1` and `l2` objects looks like this: - -```ts -export interface GraphNetworkEnvironment { - chainId: number - contracts: NetworkContracts - provider: EthersProviderWrapper - graphConfig: any - addressBook: AddressBook - getNamedAccounts: () => Promise - getTestAccounts: () => Promise - getDeployer: () => Promise -} -``` - -### ChainId - -The chainId of the network. - -### Contracts - -Returns an object with all the contracts available in the network. Connects using a provider created with the URL specified in hardhat's network configuration (it doesn't use the usual hardhat `hre.ethers.provider`). - -```js -> const graph = hre.graph() - -// Print curation default reserve ratio on L1 -> await g.l1.contracts.Curation.defaultReserveRatio() -500000 -``` - -### Graph Config - -Returns an object that grants raw access to the YAML parse of the graph config file for the protocol. The graph config file is a YAML file that contains all the parameters with which the protocol was deployed. - -> TODO: add better APIs to interact with the graph config file. - -### Address Book - -Returns an object that allows interacting with the address book. - -```js -> const graph = hre.graph() -> graph.l1.addressBook.getEntry('Curation') -{ - address: '0xE59B4820dDE28D2c235Bd9A73aA4e8716Cb93E9B', - initArgs: [ - '0x48eD7AfbaB432d1Fc6Ea84EEC70E745d9DAcaF3B', - '0x2DFDC3e11E035dD96A4aB30Ef67fab4Fb6EC01f2', - '0x8bEd0a89F18a801Da9dEA994D475DEa74f75A059', - '500000', - '10000', - '1000000000000000000' - ], - creationCodeHash: '0x25a7b6cafcebb062169bc25fca9bcce8f23bd7411235859229ae3cc99b9a7d58', - runtimeCodeHash: '0xaf2d63813a0e5059f63ec46e1b280eb9d129d5ad548f0cdd1649d9798fde10b6', - txHash: '0xf1b1f0f28b80068bcc9fd6ef475be6324a8b23cbdb792f7344f05ce00aa997d7', - proxy: true, - implementation: { - address: '0xAeaA2B058539750b740E858f97159E6856948670', - creationCodeHash: '0x022576ab4b739ee17dab126ea7e5a6814bda724aa0e4c6735a051b38a76bd597', - runtimeCodeHash: '0xc7b1f9bef01ef92779aab0ae9be86376c47584118c508f5b4e612a694a4aab93', - txHash: '0x400bfb7b6c384363b859a66930590507ddca08ebedf64b20c4b5f6bc8e76e125' - } -} -``` - -**Account management: getNamedAccounts** -Returns an object with all the named accounts available in the network. Named accounts are accounts that have special roles in the protocol, they are defined in the graph config file. - -```js -> const graph = hre.graph() -> const namedAccounts = await g.l1.getNamedAccounts() -> namedAccounts.governor.address -'0xf1135bFF22512FF2A585b8d4489426CE660f204c' -``` - -The accounts are initialized from the graph config file but if the correct mnemonic or private key is provided via hardhat network configuration then they will be fully capable of signing transactions. Accounts are already connected to the network provider. - -**Account management: getTestAccounts** -Returns an object with accounts which can be used for testing/interacting with the protocol. These are obtained from hardhat's network configuration using the provided mnemonic or private key. Accounts are already connected to the network provider. - -**Account management: getDeployer** -Returns an object with the would-be deployer account. The deployer is by convention the first (index 0) account derived from the mnemonic or private key provided via hardhat network configuration. Deployer account is already connected to the network provider. - -It's important to note that the deployer is not a named account as it's derived from the provided mnemonic so it won't necessarily match the actual deployer for a given deployment. It's the account that would be used to deploy the protocol with the current configuration. It's not possible at the moment to recover the actual deployer account from a deployed protocol. - -**Account management: getWallets** -Returns an object with wallets derived from the mnemonic or private key provided via hardhat network configuration. These wallets are not connected to a provider. - -**Account management: getWallet** -Returns a wallet derived from the mnemonic or private key provided via hardhat network configuration that matches a given address. This wallet is not connected to a provider. - -### Integration with hardhat-secure-accounts - -[hardhat-secure-accounts](https://www.npmjs.com/package/hardhat-secure-accounts) is a hardhat plugin that allows you to use encrypted keystore files to store your private keys. GRE has built-in support to use this plugin. By default is enabled but can be disabled by setting the `disableSecureAccounts` option to `true` when instantiating the GRE object. When enabled, each time you call any of the account management methods you will be prompted for an account name and password to unlock: - -```js -// Without secure accounts -> const graph = hre.graph({ disableSecureAccounts: true }) -> const deployer = await g.l1.getDeployer() -> deployer.address -'0xBc7f4d3a85B820fDB1058FD93073Eb6bc9AAF59b' - -// With secure accounts -> const graph = hre.graph() -> const deployer = await g.l1.getDeployer() -== Using secure accounts, please unlock an account for L1(goerli) -Available accounts: goerli-deployer, arbitrum-goerli-deployer, rinkeby-deployer, test-mnemonic -Choose an account to unlock (use tab to autocomplete): test-mnemonic -Enter the password for this account: ************ -> deployer.address -'0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1' -``` diff --git a/packages/sdk/src/gre/accounts.ts b/packages/sdk/src/gre/accounts.ts deleted file mode 100644 index f4c72657f..000000000 --- a/packages/sdk/src/gre/accounts.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { EthersProviderWrapper } from '@nomiclabs/hardhat-ethers/internal/ethers-provider-wrapper' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { Wallet } from 'ethers' -import { derivePrivateKeys } from 'hardhat/internal/core/providers/util' -import { HttpNetworkHDAccountsConfig, NetworksConfig } from 'hardhat/types' - -import { getItemValue, readConfig } from '../deployments/lib/config' -import { GREPluginError } from './helpers/error' -import { getNetworkName } from './helpers/network' -import type { AccountNames, NamedAccounts } from './types' - -const namedAccountList: AccountNames[] = [ - 'arbitrator', - 'governor', - 'authority', - 'availabilityOracle', - 'pauseGuardian', - 'allocationExchangeOwner', -] - -export async function getNamedAccounts( - provider: EthersProviderWrapper, - graphConfigPath: string, -): Promise { - const namedAccounts = namedAccountList.reduce( - async (accountsPromise, name) => { - const accounts = await accountsPromise - let address: string | undefined - try { - address = getItemValue(readConfig(graphConfigPath, true), `general/${name}`) as string | undefined - } catch { - // Skip if not found - } - if (address) { - accounts[name] = await SignerWithAddress.create(provider.getSigner(address)) - } - return accounts - }, - Promise.resolve({} as NamedAccounts), - ) - - return namedAccounts -} - -export async function getDeployer(provider: EthersProviderWrapper): Promise { - const signer = provider.getSigner(0) - return SignerWithAddress.create(signer) -} - -export async function getTestAccounts( - provider: EthersProviderWrapper, - graphConfigPath: string, -): Promise { - // Get list of privileged accounts we don't want as test accounts - const namedAccounts = await getNamedAccounts(provider, graphConfigPath) - const blacklist = namedAccountList.reduce((accounts: string[], name) => { - const account = namedAccounts[name] - if (account) { - accounts.push(account.address) - } - return accounts - }, []) - blacklist.push((await getDeployer(provider)).address) - - // Get signers and filter out blacklisted accounts - const accounts = await provider.listAccounts() - const signers = await Promise.all( - accounts.map(async (account) => await SignerWithAddress.create(provider.getSigner(account))), - ) - - return signers.filter((s) => { - return !blacklist.includes(s.address) - }) -} - -export async function getAllAccounts(provider: EthersProviderWrapper): Promise { - const accounts = await provider.listAccounts() - return await Promise.all(accounts.map(async (account) => await SignerWithAddress.create(provider.getSigner(account)))) -} - -export async function getWallets( - networks: NetworksConfig, - chainId: number, - mainNetworkName: string, -): Promise { - const networkName = getNetworkName(networks, chainId, mainNetworkName) - if (networkName === undefined) { - throw new GREPluginError(`Could not find networkName for chainId: ${chainId}!`) - } - const accounts = networks[networkName].accounts - const mnemonic = (accounts as HttpNetworkHDAccountsConfig).mnemonic - - if (mnemonic) { - const privateKeys = derivePrivateKeys(mnemonic, "m/44'/60'/0'/0/", 0, 20, '') - return privateKeys.map((privateKey) => new Wallet(privateKey)) - } - - return [] -} - -export async function getWallet( - networks: NetworksConfig, - chainId: number, - mainNetworkName: string, - address: string, -): Promise { - const wallets = await getWallets(networks, chainId, mainNetworkName) - const found = wallets.find((w) => w.address === address) - if (found === undefined) { - throw new GREPluginError(`Could not find wallet for address: ${address}!`) - } - return found -} diff --git a/packages/sdk/src/gre/config.ts b/packages/sdk/src/gre/config.ts deleted file mode 100644 index 35298b11f..000000000 --- a/packages/sdk/src/gre/config.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { EthersProviderWrapper } from '@nomiclabs/hardhat-ethers/internal/ethers-provider-wrapper' -import fs from 'fs' -import { HardhatRuntimeEnvironment } from 'hardhat/types/runtime' -import path from 'path' - -import { counterpart, isGraphChainId, isGraphL1ChainId, isGraphL2ChainId } from '..' -import { GREPluginError } from './helpers/error' -import { logDebug } from './helpers/logger' -import { getNetworkConfig } from './helpers/network' -import { normalizePath } from './helpers/utils' -import { getDefaultProvider } from './providers' -import type { GraphRuntimeEnvironmentOptions } from './types' - -interface GREChains { - l1ChainId: number - l2ChainId: number - isHHL1: boolean - isHHL2: boolean -} - -interface GREProviders { - l1Provider: EthersProviderWrapper | undefined - l2Provider: EthersProviderWrapper | undefined -} - -interface GREGraphConfigs { - l1GraphConfigPath: string | undefined - l2GraphConfigPath: string | undefined -} - -export function getAddressBookPath(hre: HardhatRuntimeEnvironment, opts: GraphRuntimeEnvironmentOptions): string { - logDebug('== Getting address book path') - logDebug(`Graph base dir: ${hre.config.paths.graph}`) - logDebug(`1) opts.addressBook: ${opts.addressBook}`) - logDebug(`2) hre.network.config.addressBook: ${hre.network.config?.addressBook}`) - logDebug(`3) hre.config.graph.addressBook: ${hre.config.graph?.addressBook}`) - - let addressBookFileName = opts.addressBook ?? hre.network.config?.addressBook ?? hre.config.graph?.addressBook - - if (addressBookFileName === undefined) { - throw new GREPluginError('Must set a an addressBook path!') - } - - // If it's a relative or absolute path, extract just the filename - addressBookFileName = path.basename(addressBookFileName) - - // Use module resolution to find the contracts package directory - try { - const contractsModulePath = require.resolve('@graphprotocol/contracts') - const contractsPackageDir = path.dirname(contractsModulePath) - const addressBookPath = path.join(contractsPackageDir, addressBookFileName) - - if (!fs.existsSync(addressBookPath)) { - throw new GREPluginError(`Address book not found: ${addressBookPath}`) - } - - logDebug(`Address book path found: ${addressBookPath}`) - return addressBookPath - } catch (error) { - throw new GREPluginError(`Could not resolve @graphprotocol/contracts package: ${error}`) - } -} - -export function getChains(mainChainId: number | undefined): GREChains { - logDebug('== Getting chain ids') - logDebug(`Hardhat chain id: ${mainChainId}`) - - if (!isGraphChainId(mainChainId)) { - throw new GREPluginError(`Chain ${mainChainId} is not supported!`) - } - - // If mainChainId is supported there is a supported counterpart chainId so both chains are not undefined - mainChainId = mainChainId! - - const secondaryChainId = counterpart(mainChainId) - logDebug(`Secondary chain id: ${secondaryChainId}`) - - const isHHL1 = isGraphL1ChainId(mainChainId) - const isHHL2 = isGraphL2ChainId(mainChainId) - const l1ChainId = isHHL1 ? mainChainId : secondaryChainId - const l2ChainId = isHHL2 ? mainChainId : secondaryChainId - - logDebug(`L1 chain id: ${l1ChainId} - Is HHL1: ${isHHL1}`) - logDebug(`L2 chain id: ${l2ChainId} - Is HHL2: ${isHHL2}`) - - return { - l1ChainId, - l2ChainId, - isHHL1, - isHHL2, - } -} - -export function getDefaultProviders( - hre: HardhatRuntimeEnvironment, - l1ChainId: number, - l2ChainId: number, - isHHL1: boolean, -): GREProviders { - logDebug('== Getting providers') - - const l1Provider = getDefaultProvider(hre.config.networks, l1ChainId, hre.network, isHHL1, 'L1') - const l2Provider = getDefaultProvider(hre.config.networks, l2ChainId, hre.network, !isHHL1, 'L2') - - return { - l1Provider, - l2Provider, - } -} - -export function getGraphConfigPaths( - hre: HardhatRuntimeEnvironment, - opts: GraphRuntimeEnvironmentOptions, - l1ChainId: number, - l2ChainId: number, - isHHL1: boolean, -): GREGraphConfigs { - logDebug('== Getting graph config paths') - logDebug(`Graph base dir: ${hre.config.paths.graph}`) - - const l1Network = getNetworkConfig(hre.config.networks, l1ChainId, hre.network.name) - const l2Network = getNetworkConfig(hre.config.networks, l2ChainId, hre.network.name) - - // Priority is as follows: - // - hre.graph() init parameter l1GraphConfigPath/l2GraphConfigPath - // - hre.graph() init parameter graphConfigPath (only for layer corresponding to hh network) - // - hh network config - // - hh graph config (layer specific: l1GraphConfig, l2GraphConfig) - let l1GraphConfigPath = - opts.l1GraphConfig ?? - (isHHL1 ? opts.graphConfig : undefined) ?? - l1Network?.graphConfig ?? - hre.config.graph.l1GraphConfig - - logDebug(`> L1 graph config`) - logDebug(`1) opts.l1GraphConfig: ${opts.l1GraphConfig}`) - logDebug(`2) opts.graphConfig: ${isHHL1 ? opts.graphConfig : undefined}`) - logDebug(`3) l1Network.graphConfig: ${l1Network?.graphConfig}`) - logDebug(`4) hre.config.graph.l1GraphConfig: ${hre.config.graph.l1GraphConfig}`) - - if (isHHL1 && l1GraphConfigPath === undefined) { - throw new GREPluginError('Must specify a graph config file for L1!') - } - - if (l1GraphConfigPath !== undefined) { - l1GraphConfigPath = normalizePath(l1GraphConfigPath, hre.config.paths.graph) - } - - let l2GraphConfigPath = - opts.l2GraphConfig ?? - (!isHHL1 ? opts.graphConfig : undefined) ?? - l2Network?.graphConfig ?? - hre.config.graph.l2GraphConfig - - logDebug(`> L2 graph config`) - logDebug(`1) opts.l2GraphConfig: ${opts.l2GraphConfig}`) - logDebug(`2) opts.graphConfig: ${!isHHL1 ? opts.graphConfig : undefined}`) - logDebug(`3) l2Network.graphConfig: ${l2Network?.graphConfig}`) - logDebug(`4) hre.config.graph.l2GraphConfig: ${hre.config.graph.l2GraphConfig}`) - - if (!isHHL1 && l2GraphConfigPath === undefined) { - throw new GREPluginError('Must specify a graph config file for L2!') - } - - if (l2GraphConfigPath !== undefined) { - l2GraphConfigPath = normalizePath(l2GraphConfigPath, hre.config.paths.graph) - } - - for (const configPath of [l1GraphConfigPath, l2GraphConfigPath]) { - if (configPath !== undefined && !fs.existsSync(configPath)) { - throw new GREPluginError(`Graph config file not found: ${configPath}`) - } - } - - logDebug(`L1 graph config path: ${l1GraphConfigPath}`) - logDebug(`L2 graph config path: ${l2GraphConfigPath}`) - - return { - l1GraphConfigPath: l1GraphConfigPath, - l2GraphConfigPath: l2GraphConfigPath, - } -} diff --git a/packages/sdk/src/gre/gre.ts b/packages/sdk/src/gre/gre.ts deleted file mode 100644 index bc5253473..000000000 --- a/packages/sdk/src/gre/gre.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { EthersProviderWrapper } from '@nomiclabs/hardhat-ethers/internal/ethers-provider-wrapper' -import { Wallet } from 'ethers' -import { lazyFunction, lazyObject } from 'hardhat/plugins' -import { HardhatConfig, HardhatRuntimeEnvironment, HardhatUserConfig } from 'hardhat/types' -import path from 'path' - -import { GraphNetworkAddressBook, loadGraphNetworkContracts } from '..' -import { getDefaults } from '..' -import { readConfig } from '../deployments/lib/config' -import { getAllAccounts, getDeployer, getNamedAccounts, getTestAccounts, getWallet, getWallets } from './accounts' -import { getAddressBookPath, getChains, getDefaultProviders, getGraphConfigPaths } from './config' -import { logDebug, logWarn } from './helpers/logger' -import { getSecureAccountsProvider } from './providers' -import type { GraphNetworkEnvironment, GraphRuntimeEnvironment, GraphRuntimeEnvironmentOptions } from './types' - -export const greExtendConfig = (config: HardhatConfig, userConfig: Readonly) => { - // Source for the path convention: - // https://github.com/NomicFoundation/hardhat-ts-plugin-boilerplate/blob/d450d89f4b6ed5d26a8ae32b136b9c55d2aadab5/src/index.ts - const userPath = userConfig.paths?.graph - - let newPath: string - if (userPath === undefined) { - newPath = config.paths.root - } else { - if (path.isAbsolute(userPath)) { - newPath = userPath - } else { - newPath = path.normalize(path.join(config.paths.root, userPath)) - } - } - - config.paths.graph = newPath -} - -export const greExtendEnvironment = (hre: HardhatRuntimeEnvironment) => { - hre.graph = (opts: GraphRuntimeEnvironmentOptions = {}) => { - logDebug('*** Initializing Graph Runtime Environment (GRE) ***') - logDebug(`Main network: ${hre.network.name}`) - - logDebug('== Features') - - // Tx logging - const enableTxLogging = opts.enableTxLogging ?? true - logDebug(`Tx logging: ${enableTxLogging ? 'enabled' : 'disabled'}`) - - // Secure accounts - const secureAccounts = !(opts.disableSecureAccounts ?? hre.config.graph?.disableSecureAccounts ?? false) - logDebug(`Secure accounts: ${secureAccounts ? 'enabled' : 'disabled'}`) - - // Forking - const fork = opts.fork ?? hre.config.graph?.fork ?? false - logDebug(`Forking: ${fork ? 'enabled' : 'disabled'}`) - - if (fork && hre.network.config.accounts !== 'remote') { - console.log(hre.network.config.accounts) - - logWarn('Forking is enabled but the network is not configured to use remote accounts') - } - - const { l1ChainId, l2ChainId, isHHL1 } = getChains(hre.network.config.chainId) - - // Default providers for L1 and L2 - const { l1Provider, l2Provider } = getDefaultProviders(hre, l1ChainId, l2ChainId, isHHL1) - - // Getters to unlock secure account providers for L1 and L2 - const l1UnlockProvider = (caller: string) => - getSecureAccountsProvider( - hre.accounts, - hre.config.networks, - l1ChainId, - hre.network.name, - isHHL1, - 'L1', - caller, - opts.l1AccountName, - opts.l1AccountPassword, - ) - - const l2UnlockProvider = (caller: string) => - getSecureAccountsProvider( - hre.accounts, - hre.config.networks, - l2ChainId, - hre.network.name, - !isHHL1, - 'L2', - caller, - opts.l2AccountName, - opts.l2AccountPassword, - ) - - const addressBookPath = getAddressBookPath(hre, opts) - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths(hre, opts, l1ChainId, l2ChainId, isHHL1) - - // Wallet functions - const l1GetWallets = () => getWallets(hre.config.networks, l1ChainId, hre.network.name) - const l1GetWallet = (address: string) => getWallet(hre.config.networks, l1ChainId, hre.network.name, address) - const l2GetWallets = () => getWallets(hre.config.networks, l2ChainId, hre.network.name) - const l2GetWallet = (address: string) => getWallet(hre.config.networks, l2ChainId, hre.network.name, address) - - // Build the Graph Runtime Environment (GRE) - const l1Graph: GraphNetworkEnvironment | null = buildGraphNetworkEnvironment( - l1ChainId, - l1Provider, - l1GraphConfigPath, - addressBookPath, - isHHL1, - enableTxLogging, - secureAccounts, - fork, - l1GetWallets, - l1GetWallet, - l1UnlockProvider, - ) - - const l2Graph: GraphNetworkEnvironment | null = buildGraphNetworkEnvironment( - l2ChainId, - l2Provider, - l2GraphConfigPath, - addressBookPath, - isHHL1, - enableTxLogging, - secureAccounts, - fork, - l2GetWallets, - l2GetWallet, - l2UnlockProvider, - ) - - const gre: GraphRuntimeEnvironment = { - ...(isHHL1 ? (l1Graph as GraphNetworkEnvironment) : (l2Graph as GraphNetworkEnvironment)), - l1: l1Graph, - l2: l2Graph, - } - - logDebug('GRE initialized successfully!') - logDebug(`Main network: L${isHHL1 ? '1' : '2'}`) - logDebug(`Secondary network: ${gre.l2 !== null ? (isHHL1 ? 'L2' : 'L1') : 'not initialized'}`) - return gre - } -} - -function buildGraphNetworkEnvironment( - chainId: number, - provider: EthersProviderWrapper | undefined, - graphConfigPath: string | undefined, - addressBookPath: string, - isHHL1: boolean, - enableTxLogging: boolean, - secureAccounts: boolean, - fork: boolean, - getWallets: () => Promise, - getWallet: (address: string) => Promise, - unlockProvider: (caller: string) => Promise, -): GraphNetworkEnvironment | null { - if (graphConfigPath === undefined) { - logWarn(`No graph config file provided for chain: ${chainId}. ${isHHL1 ? 'L2' : 'L1'} will not be initialized.`) - return null - } - - if (provider === undefined) { - logWarn(`No provider URL found for: ${chainId}. ${isHHL1 ? 'L2' : 'L1'} will not be initialized.`) - return null - } - - // Upgrade provider to secure accounts if feature is enabled - const getUpdatedProvider = async (caller: string) => (secureAccounts ? await unlockProvider(caller) : provider) - - return { - chainId: chainId, - provider: provider, - addressBook: lazyObject(() => new GraphNetworkAddressBook(addressBookPath, chainId)), - graphConfig: lazyObject(() => { - const config = readConfig(graphConfigPath, true) - config.defaults = getDefaults(config, isHHL1) - return config - }), - contracts: lazyObject(() => - loadGraphNetworkContracts(addressBookPath, chainId, provider, undefined, { - enableTxLogging, - }), - ), - getWallets: lazyFunction(() => () => getWallets()), - getWallet: lazyFunction(() => (address: string) => getWallet(address)), - getDeployer: lazyFunction(() => async () => getDeployer(await getUpdatedProvider('getDeployer'))), - getNamedAccounts: lazyFunction( - () => async () => - getNamedAccounts(fork ? provider : await getUpdatedProvider('getNamedAccounts'), graphConfigPath), - ), - getTestAccounts: lazyFunction( - () => async () => getTestAccounts(await getUpdatedProvider('getTestAccounts'), graphConfigPath), - ), - getAllAccounts: lazyFunction(() => async () => getAllAccounts(await getUpdatedProvider('getAllAccounts'))), - } -} diff --git a/packages/sdk/src/gre/helpers/argv.ts b/packages/sdk/src/gre/helpers/argv.ts deleted file mode 100644 index fa701e7bc..000000000 --- a/packages/sdk/src/gre/helpers/argv.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { GraphRuntimeEnvironmentOptions } from '../types' - -export function getGREOptsFromArgv(): GraphRuntimeEnvironmentOptions { - const argv = process.argv.slice(2) - - const getArgv = (index: number): string | undefined => - argv[index] && argv[index] !== 'undefined' ? argv[index] : undefined - - return { - addressBook: getArgv(0), - graphConfig: getArgv(1), - l1GraphConfig: getArgv(2), - l2GraphConfig: getArgv(3), - disableSecureAccounts: getArgv(4) === 'true', - fork: getArgv(5) === 'true', - } -} diff --git a/packages/sdk/src/gre/helpers/network.ts b/packages/sdk/src/gre/helpers/network.ts deleted file mode 100644 index 25e2d4cd7..000000000 --- a/packages/sdk/src/gre/helpers/network.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { NetworkConfig, NetworksConfig } from 'hardhat/types/config' - -import { counterpartName } from '../..' -import { GREPluginError } from './error' -import { logDebug, logWarn } from './logger' - -export function getNetworkConfig( - networks: NetworksConfig, - chainId: number, - mainNetworkName: string, -): (NetworkConfig & { name: string }) | undefined { - const candidateNetworks = Object.keys(networks) - .map((n) => ({ ...networks[n], name: n })) - .filter((n) => n.chainId === chainId) - - if (candidateNetworks.length > 1) { - logWarn(`Found multiple networks with chainId ${chainId}, trying to use main network name to desambiguate`) - - const filteredByMainNetworkName = candidateNetworks.filter((n) => n.name === mainNetworkName) - - if (filteredByMainNetworkName.length === 1) { - logDebug(`Found network with chainId ${chainId} and name ${mainNetworkName}`) - return filteredByMainNetworkName[0] - } else { - logWarn(`Could not desambiguate with main network name, trying secondary network name`) - const secondaryNetworkName = counterpartName(mainNetworkName) - const filteredBySecondaryNetworkName = candidateNetworks.filter((n) => n.name === secondaryNetworkName) - - if (filteredBySecondaryNetworkName.length === 1) { - logDebug(`Found network with chainId ${chainId} and name ${mainNetworkName}`) - return filteredBySecondaryNetworkName[0] - } else { - throw new GREPluginError(`Could not desambiguate network with chainID ${chainId}. Use case not supported!`) - } - } - } else if (candidateNetworks.length === 1) { - return candidateNetworks[0] - } else { - return undefined - } -} - -export function getNetworkName(networks: NetworksConfig, chainId: number, mainNetworkName: string): string | undefined { - const network = getNetworkConfig(networks, chainId, mainNetworkName) - return network?.name -} diff --git a/packages/sdk/src/gre/helpers/utils.ts b/packages/sdk/src/gre/helpers/utils.ts deleted file mode 100644 index 3fcf810d7..000000000 --- a/packages/sdk/src/gre/helpers/utils.ts +++ /dev/null @@ -1,8 +0,0 @@ -import path from 'path' - -export function normalizePath(_path: string, graphPath?: string): string { - if (!path.isAbsolute(_path) && graphPath !== undefined) { - _path = path.join(graphPath, _path) - } - return _path -} diff --git a/packages/sdk/src/gre/providers.ts b/packages/sdk/src/gre/providers.ts deleted file mode 100644 index e35dbc771..000000000 --- a/packages/sdk/src/gre/providers.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { EthersProviderWrapper } from '@nomiclabs/hardhat-ethers/internal/ethers-provider-wrapper' -import { HARDHAT_NETWORK_NAME } from 'hardhat/plugins' -import { HttpNetworkConfig, NetworksConfig } from 'hardhat/types/config' -import { Network } from 'hardhat/types/runtime' -import { AccountsRuntimeEnvironment } from 'hardhat-secure-accounts/dist/src/type-extensions' - -import { GREPluginError } from './helpers/error' -import { logDebug } from './helpers/logger' -import { getNetworkConfig, getNetworkName } from './helpers/network' - -export const getDefaultProvider = ( - networks: NetworksConfig, - chainId: number, - network: Network, - isMainProvider: boolean, - chainLabel: string, -): EthersProviderWrapper | undefined => { - // Don't recreate provider if we are on hardhat network. This avoids issues with - // hardhat node not responding to requests from the recreated provider - if (network.name === 'hardhat') { - logDebug(`Hardhat network detected; using default provider for ${chainLabel}(${network.name})`) - return new EthersProviderWrapper(network.provider) - } - - const { networkConfig, networkName } = getNetworkData(networks, chainId, network.name, isMainProvider, chainLabel) - - if (networkConfig === undefined || networkName === undefined) { - return undefined - } - - logDebug(`Creating provider for ${chainLabel}(${networkName})`) - const ethersProviderWrapper = new EthersProviderWrapper(network.provider) - return ethersProviderWrapper -} - -export const getSecureAccountsProvider = async ( - accounts: AccountsRuntimeEnvironment, - networks: NetworksConfig, - chainId: number, - mainNetworkName: string, - isMainProvider: boolean, - chainLabel: string, - caller: string, - accountName?: string, - accountPassword?: string, -): Promise => { - const { networkConfig, networkName } = getNetworkData(networks, chainId, mainNetworkName, isMainProvider, chainLabel) - - if (networkConfig === undefined || networkName === undefined) { - throw new GREPluginError( - `Could not get secure accounts provider for ${chainLabel}(${networkName})! - Caller is ${caller}`, - ) - } - - logDebug(`Using secure accounts provider for ${chainLabel}(${networkName}) - Caller is ${caller}`) - if (accountName === undefined || accountPassword === undefined) { - console.log( - `== Using secure accounts, please unlock an account for ${chainLabel}(${networkName}) - Caller is ${caller}`, - ) - } - - return await accounts.getProvider( - { name: networkName, config: networkConfig } as Network, - accountName, - accountPassword, - ) -} - -const getNetworkData = ( - networks: NetworksConfig, - chainId: number, - mainNetworkName: string, - isMainProvider: boolean, - chainLabel: string, -): { networkConfig: HttpNetworkConfig | undefined; networkName: string | undefined } => { - const networkConfig = getNetworkConfig(networks, chainId, mainNetworkName) as HttpNetworkConfig - const networkName = getNetworkName(networks, chainId, mainNetworkName) - - logDebug(`Provider url for ${chainLabel}(${networkName}): ${networkConfig?.url}`) - - // Ensure at least main provider is configured - // For Hardhat network we don't need url to create a provider - if ( - isMainProvider && - (networkConfig === undefined || networkConfig.url === undefined) && - networkName !== HARDHAT_NETWORK_NAME - ) { - throw new GREPluginError(`Must set a provider url for chain: ${chainId}!`) - } - - return { networkConfig, networkName } -} diff --git a/packages/sdk/src/gre/task.ts b/packages/sdk/src/gre/task.ts deleted file mode 100644 index ca6690b7a..000000000 --- a/packages/sdk/src/gre/task.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { task } from 'hardhat/config' -import { ActionType, ConfigurableTaskDefinition } from 'hardhat/types/runtime' - -function grePrefix(text: string): string { - return `[GRE] ${text}` -} - -export function greTask( - name: string, - description?: string | undefined, - action?: ActionType | undefined, -): ConfigurableTaskDefinition { - return task(name, description, action) - .addOptionalParam('addressBook', grePrefix('Path to the address book file.')) - .addOptionalParam( - 'graphConfig', - grePrefix( - 'Path to the graph config file for the network specified using --network. Lower priority than --l1GraphConfig and --l2GraphConfig.', - ), - ) - .addOptionalParam('l1GraphConfig', grePrefix('Path to the graph config file for the L1 network.')) - .addOptionalParam('l2GraphConfig', grePrefix('Path to the graph config file for the L2 network.')) - .addFlag('disableSecureAccounts', grePrefix('Disable secure accounts plugin.')) - .addFlag('enableTxLogging', grePrefix('Enable transaction logging.')) - .addFlag('fork', grePrefix('Wether or not the network is a fork.')) -} diff --git a/packages/sdk/src/gre/test/accounts.test.ts b/packages/sdk/src/gre/test/accounts.test.ts deleted file mode 100644 index c9dbdac19..000000000 --- a/packages/sdk/src/gre/test/accounts.test.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import chai, { expect } from 'chai' -import chaiAsPromised from 'chai-as-promised' -import { ethers } from 'ethers' - -import type { AccountNames, GraphRuntimeEnvironment } from '../types' -import { useEnvironment } from './helpers' - -chai.use(chaiAsPromised) - -const mnemonic = 'pumpkin orient can short never warm truth legend cereal tourist craft skin' - -describe.skip('GRE usage > account management', function () { - // Tests that loop through all the wallets take more than the default timeout - this.timeout(10_000) - - useEnvironment('graph-config', 'hardhat') - - let graph: GraphRuntimeEnvironment - - beforeEach(function () { - graph = this.hre.graph() - }) - - describe('getWallets', function () { - it('should return 20 wallets', async function () { - const wallets = await graph.getWallets() - expect(wallets.length).to.equal(20) - }) - - it('should derive wallets from hardhat config mnemonic', async function () { - const wallets = await graph.getWallets() - - for (let i = 0; i < wallets.length; i++) { - const derived = ethers.Wallet.fromMnemonic(mnemonic, `m/44'/60'/0'/0/${i}`) - expect(wallets[i].address).to.equal(derived.address) - } - }) - - it('should return wallets capable of signing messages', async function () { - const wallets = await graph.getWallets() - - for (const wallet of wallets) { - await expect(wallet.signMessage('test')).to.eventually.be.fulfilled - } - }) - - it('should return wallets not connected to a provider', async function () { - const wallets = await graph.getWallets() - - for (const wallet of wallets) { - expect(wallet.provider).to.be.null - } - }) - }) - - describe('getWallet', function () { - it('should return wallet if provided address can be derived from mnemonic', async function () { - for (let i = 0; i < 20; i++) { - const derived = ethers.Wallet.fromMnemonic(mnemonic, `m/44'/60'/0'/0/${i}`) - const wallet = await graph.getWallet(derived.address) - expect(wallet.address).to.equal(derived.address) - } - }) - - it('should return wallet capable of signing messages', async function () { - for (let i = 0; i < 20; i++) { - const derived = ethers.Wallet.fromMnemonic(mnemonic, `m/44'/60'/0'/0/${i}`) - const wallet = await graph.getWallet(derived.address) - await expect(wallet.signMessage('test')).to.eventually.be.fulfilled - } - }) - - it('should return wallet not connected to a provider', async function () { - for (let i = 0; i < 20; i++) { - const derived = ethers.Wallet.fromMnemonic(mnemonic, `m/44'/60'/0'/0/${i}`) - const wallet = await graph.getWallet(derived.address) - expect(wallet.provider).to.be.null - } - }) - - it('should throw if provided address cant be derived from mnemonic', async function () { - const getWallet = graph.getWallet('0x0000000000000000000000000000000000000000') - await expect(getWallet).to.eventually.be.rejectedWith(/Could not find wallet for address: /) - }) - }) -}) - -describe.skip('GRE usage > secure accounts', function () { - useEnvironment('graph-config', 'hardhat') - - let graph: GraphRuntimeEnvironment - let graphSecureAccounts: GraphRuntimeEnvironment - - beforeEach(function () { - graph = this.hre.graph({ - disableSecureAccounts: true, - }) - - graphSecureAccounts = this.hre.graph({ - disableSecureAccounts: false, - l1AccountName: 'test-account', - l1AccountPassword: 'batman-with-cheese', - l2AccountName: 'test-account-l2', - l2AccountPassword: 'batman-with-cheese', - }) - }) - - describe('getDeployer', function () { - it('should return different accounts', async function () { - const deployer = await graph.l1!.getDeployer() - const deployerSecureAccount = await graphSecureAccounts.l1!.getDeployer() - - expect(deployer.address).not.to.equal(deployerSecureAccount.address) - expect(deployer.address).to.equal('0x2770fb12b368a9aBf4A02DB34B0F6057fC03BD0d') - expect(deployerSecureAccount.address).to.equal('0xC108fda1b5b2903751594298769Efd4904b146bD') - }) - - it('should return accounts capable of signing messages', async function () { - const deployer = await graph.l1!.getDeployer() - const deployerSecureAccount = await graphSecureAccounts.l1!.getDeployer() - - await expect(deployer.signMessage('test')).to.eventually.be.fulfilled - await expect(deployerSecureAccount.signMessage('test')).to.eventually.be.fulfilled - }) - }) - - describe('getNamedAccounts', function () { - it('should return the same accounts', async function () { - const accounts = await graph.l1!.getNamedAccounts() - const secureAccounts = await graphSecureAccounts.l1!.getNamedAccounts() - - const accountNames = Object.keys(accounts) as AccountNames[] - const secureAccountNames = Object.keys(secureAccounts) - - expect(accountNames.length).to.equal(secureAccountNames.length) - - for (const name of accountNames) { - const account = accounts[name] - const secureAccount = secureAccounts[name] - - expect(account.address).to.equal(secureAccount.address) - } - }) - - it('should return accounts incapable of signing messages', async function () { - const accounts = await graph.l1!.getNamedAccounts() - const secureAccounts = await graphSecureAccounts.l1!.getNamedAccounts() - - const accountNames = Object.keys(accounts) as AccountNames[] - - for (const name of accountNames) { - const account = accounts[name] - const secureAccount = secureAccounts[name] - - await expect(account.signMessage('test')).to.eventually.be.rejectedWith(/unknown account/) - await expect(secureAccount.signMessage('test')).to.eventually.be.rejected - const tx = account.sendTransaction({ - to: ethers.constants.AddressZero, - value: ethers.utils.parseEther('0'), - }) - await expect(tx).to.eventually.be.rejected - } - }) - }) - - describe('getTestAccounts', function () { - it('should return different accounts', async function () { - const accounts = await graph.l1!.getTestAccounts() - const secureAccounts = await graphSecureAccounts.l1!.getTestAccounts() - - expect(accounts.length).to.equal(secureAccounts.length) - - for (let i = 0; i < accounts.length; i++) { - expect(accounts[i].address).not.to.equal(secureAccounts[i].address) - } - }) - - it('should return accounts capable of signing messages', async function () { - const accounts = await graph.l1!.getTestAccounts() - const secureAccounts = await graphSecureAccounts.l1!.getTestAccounts() - - for (let i = 0; i < accounts.length; i++) { - await expect(accounts[i].signMessage('test')).to.eventually.be.fulfilled - await expect(secureAccounts[i].signMessage('test')).to.eventually.be.fulfilled - } - }) - }) -}) - -describe.skip('GRE usage > fork', function () { - useEnvironment('graph-config', 'hardhat') - - let graph: GraphRuntimeEnvironment - - beforeEach(function () { - graph = this.hre.graph({ - fork: true, - }) - }) - describe('getNamedAccounts', function () { - it('should allow impersonating named accounts', async function () { - const accounts = await graph.l1!.getNamedAccounts() - const secureAccounts = await graph.l1!.getNamedAccounts() - - const accountNames = Object.keys(accounts) as AccountNames[] - - for (const name of accountNames) { - const account: SignerWithAddress = accounts[name] - const secureAccount: SignerWithAddress = secureAccounts[name] - - await expect(account.signMessage('test')).to.eventually.be.rejectedWith(/unknown account/) - await expect(secureAccount.signMessage('test')).to.eventually.be.rejected - - const tx = account.sendTransaction({ - to: ethers.constants.AddressZero, - value: ethers.utils.parseEther('0'), - }) - await expect(tx).to.eventually.be.fulfilled - } - }) - }) -}) diff --git a/packages/sdk/src/gre/test/config.test.ts b/packages/sdk/src/gre/test/config.test.ts deleted file mode 100644 index 06c29011a..000000000 --- a/packages/sdk/src/gre/test/config.test.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { expect } from 'chai' -import path from 'path' - -import { getAddressBookPath, getChains, getDefaultProviders, getGraphConfigPaths } from '../config' -import { getNetworkName } from '../helpers/network' -import { useEnvironment } from './helpers' - -describe('GRE init functions', function () { - describe('getAddressBookPath with graph-config project', function () { - useEnvironment('graph-config') - - it.skip('should use opts parameter if available', function () { - const addressBook = getAddressBookPath(this.hre, { - addressBook: 'addresses-opts.json', - }) - expect(path.basename(addressBook)).to.equal('addresses-opts.json') - }) - - it.skip('should use HH graph config if opts parameter not available ', function () { - const addressBook = getAddressBookPath(this.hre, {}) - expect(path.basename(addressBook)).to.equal('addresses-hre.json') - }) - }) - - describe('getAddressBookPath with default-config project', function () { - useEnvironment('default-config') - - it('should throw if no address book is specified', function () { - expect(() => getAddressBookPath(this.hre, {})).to.throw('Must set a an addressBook path!') - }) - }) - - describe('getAddressBookPath with graph-config-bad project', function () { - useEnvironment('graph-config-bad') - - it("should throw if address book doesn't exist", function () { - expect(() => getAddressBookPath(this.hre, {})).to.throw(/Address book not found: /) - }) - }) - - describe('getChains', function () { - it('should return L1 and L2 chain ids for a supported L1 chain', function () { - const { l1ChainId, l2ChainId, isHHL1, isHHL2 } = getChains(5) // Goerli - - expect(l1ChainId).to.equal(5) - expect(l2ChainId).to.equal(421613) - expect(isHHL1).to.equal(true) - expect(isHHL2).to.equal(false) - }) - it('should return L1 and L2 chain ids for a supported L2 chain', function () { - const { l1ChainId, l2ChainId, isHHL1, isHHL2 } = getChains(42161) // Arbitrum One - - expect(l1ChainId).to.equal(1) - expect(l2ChainId).to.equal(42161) - expect(isHHL1).to.equal(false) - expect(isHHL2).to.equal(true) - }) - it('should throw if provided chain is not supported', function () { - const badChainId = 999 - expect(() => getChains(badChainId)).to.throw(`Chain ${badChainId} is not supported!`) - }) - }) - - describe('getDefaultProviders with graph-config project', function () { - useEnvironment('graph-config') - - it('should return L1 and L2 providers for supported networks (HH L1)', function () { - const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 5, 421613, true) - expect(l1Provider).to.be.an('object') - expect(l2Provider).to.be.an('object') - }) - - it('should return L1 and L2 providers for supported networks (HH L2)', function () { - const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 5, 421613, false) - expect(l1Provider).to.be.an('object') - expect(l2Provider).to.be.an('object') - }) - - it.skip('should return only L1 provider if L2 is not supported (HH L1)', function () { - const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 5, 123456, true) - expect(l1Provider).to.be.an('object') - expect(l2Provider).to.be.undefined - }) - - it.skip('should return only L2 provider if L1 is not supported (HH L2)', function () { - const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 123456, 421613, false) - expect(l1Provider).to.be.undefined - expect(l2Provider).to.be.an('object') - }) - }) - - describe('getDefaultProviders with graph-config-bad project', function () { - useEnvironment('graph-config-bad') - - it.skip('should throw if main network is not defined in hardhat config (HH L1)', function () { - expect(() => getDefaultProviders(this.hre, 4, 421611, true)).to.throw(/Must set a provider url for chain: /) - }) - - it.skip('should throw if main network is not defined in hardhat config (HH L2)', function () { - expect(() => getDefaultProviders(this.hre, 5, 421613, false)).to.throw(/Must set a provider url for chain: /) - }) - }) - - describe('getProviders with graph-config-desambiguate project', function () { - useEnvironment('graph-config-desambiguate', 'localnitrol1') - - it('should use main network name to desambiguate if multiple chains are defined with same chainId', async function () { - const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 1337, 412346, true) - expect(l1Provider).to.be.an('object') - expect(l2Provider).to.be.an('object') - - const l1NetworkName = getNetworkName(this.hre.config.networks, 1337, 'localnitrol1') - const l2NetworkName = getNetworkName(this.hre.config.networks, 412346, 'localnitrol1') - expect(l1NetworkName).to.equal('localnitrol1') - expect(l2NetworkName).to.equal('localnitrol2') - }) - }) - - describe('getProviders with graph-config-desambiguate project', function () { - useEnvironment('graph-config-desambiguate', 'localnitrol2') - - it('should use secondary network name to desambiguate if multiple chains are defined with same chainId', async function () { - const { l1Provider, l2Provider } = getDefaultProviders(this.hre, 1337, 412346, true) - expect(l1Provider).to.be.an('object') - expect(l2Provider).to.be.an('object') - - const l1NetworkName = getNetworkName(this.hre.config.networks, 1337, 'localnitrol2') - const l2NetworkName = getNetworkName(this.hre.config.networks, 412346, 'localnitrol2') - expect(l1NetworkName).to.equal('localnitrol1') - expect(l2NetworkName).to.equal('localnitrol2') - }) - }) - - describe('getGraphConfigPaths with graph-config-full project', function () { - useEnvironment('graph-config-full') - - it('should use opts parameters if available', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths( - this.hre, - { l1GraphConfig: 'config/graph.opts.yml', l2GraphConfig: 'config/graph.arbitrum-opts.yml' }, - 5, - 421613, - true, - ) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.opts.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-opts.yml') - }) - - it('should use opts graphConfig parameter only for main network if available (HH L1)', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths( - this.hre, - { graphConfig: 'config/graph.opts.yml' }, - 4, - 421611, - true, - ) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.opts.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-hre.yml') - }) - - it('should use opts graphConfig parameter only for main network if available (HH L2)', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths( - this.hre, - { graphConfig: 'config/graph.arbitrum-opts.yml' }, - 4, - 421611, - false, - ) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.hre.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-opts.yml') - }) - - it('should ignore graphConfig parameter if both config paths are provided (HH L1)', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths( - this.hre, - { - graphConfig: 'config/graph.opts2.yml', - l1GraphConfig: 'config/graph.opts.yml', - l2GraphConfig: 'config/graph.arbitrum-opts.yml', - }, - 5, - 421613, - true, - ) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.opts.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-opts.yml') - }) - - it('should ignore graphConfig parameter if both config paths are provided (HH L2)', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths( - this.hre, - { - graphConfig: 'config/graph.opts2.yml', - l1GraphConfig: 'config/graph.opts.yml', - l2GraphConfig: 'config/graph.arbitrum-opts.yml', - }, - 5, - 421613, - false, - ) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.opts.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-opts.yml') - }) - - it('should use network specific config if no opts given', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths(this.hre, {}, 1, 42161, false) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.mainnet.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-goerli.yml') - }) - - it('should use graph generic config if nothing else given', function () { - const { l1GraphConfigPath, l2GraphConfigPath } = getGraphConfigPaths(this.hre, {}, 4, 421611, false) - expect(l1GraphConfigPath).not.to.be.undefined - expect(l2GraphConfigPath).not.to.be.undefined - expect(path.basename(l1GraphConfigPath!)).to.equal('graph.hre.yml') - expect(path.basename(l2GraphConfigPath!)).to.equal('graph.arbitrum-hre.yml') - }) - }) - - describe('getGraphConfigPaths with graph-config-bad project', function () { - useEnvironment('graph-config-bad') - - it('should throw if no config file for main network (HH L1)', function () { - expect(() => getGraphConfigPaths(this.hre, {}, 5, 421611, true)).to.throw( - 'Must specify a graph config file for L1!', - ) - }) - - it('should throw if no config file for main network (HH L2)', function () { - expect(() => getGraphConfigPaths(this.hre, {}, 5, 421611, false)).to.throw( - 'Must specify a graph config file for L2!', - ) - }) - - it('should throw if config file does not exist', function () { - expect(() => getGraphConfigPaths(this.hre, {}, 1, 421611, true)).to.throw(/Graph config file not found: /) - }) - }) -}) diff --git a/packages/sdk/src/gre/test/files/config/graph.goerli.yml b/packages/sdk/src/gre/test/files/config/graph.goerli.yml deleted file mode 100644 index fccf5797c..000000000 --- a/packages/sdk/src/gre/test/files/config/graph.goerli.yml +++ /dev/null @@ -1,7 +0,0 @@ -general: - arbitrator: &arbitrator '0xFD01aa87BeB04D0ac764FC298aCFd05FfC5439cD' # Arbitration Council - governor: &governor '0xf1135bFF22512FF2A585b8d4489426CE660f204c' # Graph Council - authority: &authority '0x52e498aE9B8A5eE2A5Cd26805F06A9f29A7F489F' # Authority that signs payment vouchers - availabilityOracle: &availabilityOracle '0x14053D40ea2E81D3AB0739728a54ab84F21200F9' # Subgraph Availability Oracle - pauseGuardian: &pauseGuardian '0x6855D551CaDe60754D145fb5eDCD90912D860262' # Protocol pause guardian - allocationExchangeOwner: &allocationExchangeOwner '0xf1135bFF22512FF2A585b8d4489426CE660f204c' # Allocation Exchange owner diff --git a/packages/sdk/src/gre/test/files/config/graph.opts.yml b/packages/sdk/src/gre/test/files/config/graph.opts.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sdk/src/gre/test/files/config/graph.opts2.yml b/packages/sdk/src/gre/test/files/config/graph.opts2.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/sdk/src/gre/test/fixture-projects/graph-config-bad/hardhat.config.ts b/packages/sdk/src/gre/test/fixture-projects/graph-config-bad/hardhat.config.ts deleted file mode 100644 index 314b3a5d1..000000000 --- a/packages/sdk/src/gre/test/fixture-projects/graph-config-bad/hardhat.config.ts +++ /dev/null @@ -1,43 +0,0 @@ -import '../../..' - -module.exports = { - paths: { - graph: '../../files', - }, - solidity: '0.8.9', - defaultNetwork: 'hardhat', - networks: { - hardhat: { - chainId: 1337, - }, - mainnet: { - chainId: 1, - graphConfig: 'config/graph.mainnet-does-not-exist.yml', - url: `https://mainnet.infura.io/v3/123456`, - }, - 'arbitrum-one': { - chainId: 42161, - url: 'https://arb1.arbitrum.io/rpc', - graphConfig: 'config/graph.arbitrum-does-not-exist.yml', - }, - goerli: { - chainId: 5, - url: `https://goerli.infura.io/v3/123456`, - }, - // 'arbitrum-goerli': { - // chainId: 421613, - // url: 'https://goerli-rollup.arbitrum.io/rpc', - // }, - // rinkeby: { - // chainId: 4, - // url: `https://goerli.infura.io/v3/123456`, - // }, - 'arbitrum-rinkeby': { - chainId: 421611, - url: `https://goerli.infura.io/v3/123456`, - }, - }, - graph: { - addressBook: 'addresses-does-not-exist.json', - }, -} diff --git a/packages/sdk/src/gre/test/fixture-projects/graph-config-desambiguate/hardhat.config.ts b/packages/sdk/src/gre/test/fixture-projects/graph-config-desambiguate/hardhat.config.ts deleted file mode 100644 index 8fcfb1dd0..000000000 --- a/packages/sdk/src/gre/test/fixture-projects/graph-config-desambiguate/hardhat.config.ts +++ /dev/null @@ -1,59 +0,0 @@ -import '../../..' - -module.exports = { - paths: { - graph: '../../files', - }, - solidity: '0.8.9', - defaultNetwork: 'hardhat', - networks: { - hardhat: { - chainId: 1337, - }, - localhost: { - chainId: 1337, - url: `http://127.0.0.1:8545`, - }, - localnitrol1: { - chainId: 1337, - url: `http://127.0.0.1:8545`, - }, - localnitrol2: { - chainId: 412346, - url: `http://127.0.0.1:8547`, - }, - mainnet: { - chainId: 1, - graphConfig: 'config/graph.mainnet.yml', - url: `https://mainnet.infura.io/v3/123456`, - }, - 'arbitrum-one': { - chainId: 42161, - url: 'https://arb1.arbitrum.io/rpc', - graphConfig: 'config/graph.arbitrum-goerli.yml', - }, - goerli: { - chainId: 5, - url: `https://goerli.infura.io/v3/123456`, - graphConfig: 'config/graph.goerli.yml', - }, - 'arbitrum-goerli': { - chainId: 421613, - url: 'https://goerli-rollup.arbitrum.io/rpc', - graphConfig: 'config/graph.arbitrum-goerli.yml', - }, - rinkeby: { - chainId: 4, - url: `https://goerli.infura.io/v3/123456`, - }, - 'arbitrum-rinkeby': { - chainId: 421611, - url: `https://goerli.infura.io/v3/123456`, - }, - }, - graph: { - addressBook: 'addresses-hre.json', - l1GraphConfig: 'config/graph.hre.yml', - l2GraphConfig: 'config/graph.arbitrum-hre.yml', - }, -} diff --git a/packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account-l2.json b/packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account-l2.json deleted file mode 100644 index ab1ae36bb..000000000 --- a/packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account-l2.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "address": "5baa8472c470a400f830e2458ddb97b13cc8eb32", - "id": "ead5a876-efae-4cdf-aeab-ab81907427c8", - "version": 3, - "Crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { "iv": "5e90eb61380cee63382bd8c935eea554" }, - "ciphertext": "67800c67ab32b8baf2df4a697aa1108ee7f91b5a182ff2e29fa562009e1bbd9f", - "kdf": "scrypt", - "kdfparams": { - "salt": "415db4971651654fb4b381f86525c273e4c7470a69307f7c83f71ec38aca7d12", - "n": 131072, - "dklen": 32, - "p": 1, - "r": 8 - }, - "mac": "f5611372940c7da01e774aaf35046a5b3c4eec050d482b9f0912707ba645e681" - }, - "x-ethers": { - "client": "ethers.js", - "gethFilename": "UTC--2022-08-25T14-48-23.0Z--5baa8472c470a400f830e2458ddb97b13cc8eb32", - "mnemonicCounter": "b84bf04ecd5d0ab111950ee4cf168d86", - "mnemonicCiphertext": "672a53846059b4e8bae97747d684529a", - "path": "m/44'/60'/0'/0/0", - "locale": "en", - "version": "0.1" - } -} diff --git a/packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account.json b/packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account.json deleted file mode 100644 index de055e684..000000000 --- a/packages/sdk/src/gre/test/fixture-projects/graph-config/.accounts/test-account.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "address": "c108fda1b5b2903751594298769efd4904b146bd", - "id": "37ec99f7-8244-4982-b2d4-173c244784f3", - "version": 3, - "Crypto": { - "cipher": "aes-128-ctr", - "cipherparams": { "iv": "1eb9d55c0882a50e7988a09e674c2402" }, - "ciphertext": "822fd907f44e48d15d500433200ac244b70487813982936a88c0830fa9cd66b6", - "kdf": "scrypt", - "kdfparams": { - "salt": "f6d158afdf9a11d3353fbe736cbb769626c8428015603c6449ca1fa0b42e3c2e", - "n": 131072, - "dklen": 32, - "p": 1, - "r": 8 - }, - "mac": "1af4526f4e62b6722226ee1c3a18d7f5dfff0d5b7862ca123989e7a464153f28" - }, - "x-ethers": { - "client": "ethers.js", - "gethFilename": "UTC--2022-08-24T12-27-39.0Z--c108fda1b5b2903751594298769efd4904b146bd", - "mnemonicCounter": "3bd3b82c7148351fe0cdc005a631d445", - "mnemonicCiphertext": "f2bc1c5598c60fe265bf7908344fde6d", - "path": "m/44'/60'/0'/0/0", - "locale": "en", - "version": "0.1" - } -} diff --git a/packages/sdk/src/gre/test/gre.test.ts b/packages/sdk/src/gre/test/gre.test.ts deleted file mode 100644 index e75e8726c..000000000 --- a/packages/sdk/src/gre/test/gre.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { expect } from 'chai' - -import { useEnvironment } from './helpers' - -describe.skip('GRE usage', function () { - describe('graph-config project setting --network to an L1', function () { - useEnvironment('graph-config', 'mainnet') - - it('should return L1 and L2 configured objects', function () { - const g = this.hre.graph() - - expect(g).to.be.an('object') - expect(g.l1).to.be.an('object') - expect(g.l2).to.be.an('object') - expect(g.l1?.chainId).to.equal(1) - expect(g.l2?.chainId).to.equal(42161) - expect(g.chainId).to.equal(1) - }) - }) - - describe('graph-config project setting --network to an L2', function () { - useEnvironment('graph-config', 'arbitrum-goerli') - - it('should return L1 and L2 configured objects', function () { - const g = this.hre.graph() - - expect(g).to.be.an('object') - expect(g.l1).to.be.an('object') - expect(g.l2).to.be.an('object') - expect(g.l1?.chainId).to.equal(5) - expect(g.l2?.chainId).to.equal(421613) - expect(g.chainId).to.equal(421613) - }) - }) - - describe('graph-config project setting --network to hardhat network', function () { - useEnvironment('graph-config', 'hardhat') - - it('should return L1 configured object and L2 unconfigured', function () { - const g = this.hre.graph() - - expect(g).to.be.an('object') - expect(g.l1).to.be.an('object') - expect(g.l2).to.be.null - expect(g.l1?.chainId).to.equal(1337) - expect(g.chainId).to.equal(1337) - }) - }) - - describe('graph-config project setting --network to an L1 with no configured counterpart', function () { - useEnvironment('graph-config', 'localhost') - - it('should return L1 configured object and L2 unconfigured', function () { - const g = this.hre.graph() - - expect(g).to.be.an('object') - expect(g.l1).to.be.an('object') - expect(g.l2).to.be.null - expect(g.l1?.chainId).to.equal(1337) - expect(g.chainId).to.equal(1337) - }) - }) - - describe('graph-config project setting --network to an L2 with no configured counterpart', function () { - useEnvironment('graph-config', 'arbitrum-rinkeby') - - it('should return L2 configured object and L1 unconfigured', function () { - const g = this.hre.graph() - - expect(g).to.be.an('object') - expect(g.l1).to.be.null - expect(g.l2).to.be.an('object') - expect(g.l2?.chainId).to.equal(421611) - expect(g.chainId).to.equal(421611) - }) - }) - - describe('default-config project', function () { - useEnvironment('default-config', 'mainnet') - - it('should throw', function () { - expect(() => this.hre.graph()).to.throw() - }) - }) -}) diff --git a/packages/sdk/src/gre/test/helpers.ts b/packages/sdk/src/gre/test/helpers.ts deleted file mode 100644 index 81c97cd9b..000000000 --- a/packages/sdk/src/gre/test/helpers.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { resetHardhatContext } from 'hardhat/plugins-testing' -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import path from 'path' - -declare module 'mocha' { - interface Context { - hre: HardhatRuntimeEnvironment - } -} - -export function useEnvironment(fixtureProjectName: string, network?: string): void { - beforeEach('Loading hardhat environment', function () { - process.chdir(path.join(__dirname, 'fixture-projects', fixtureProjectName)) - - if (network !== undefined) { - process.env.HARDHAT_NETWORK = network - } - this.hre = require('hardhat') - }) - - afterEach('Resetting hardhat', function () { - resetHardhatContext() - delete process.env.HARDHAT_NETWORK - }) -} diff --git a/packages/sdk/src/gre/type-extensions.ts b/packages/sdk/src/gre/type-extensions.ts deleted file mode 100644 index a653a09fc..000000000 --- a/packages/sdk/src/gre/type-extensions.ts +++ /dev/null @@ -1,49 +0,0 @@ -// To extend one of Hardhat's types, you need to import the module where it has been defined, and redeclare it. -import 'hardhat/types/config' -import 'hardhat/types/runtime' - -import type { GraphRuntimeEnvironment, GraphRuntimeEnvironmentOptions } from './types' - -declare module 'hardhat/types/runtime' { - export interface HardhatRuntimeEnvironment { - graph: (opts?: GraphRuntimeEnvironmentOptions) => GraphRuntimeEnvironment - } -} - -declare module 'hardhat/types/config' { - export interface HardhatConfig { - graph: Omit - } - - export interface HardhatUserConfig { - graph: Omit - } - - export interface HardhatNetworkConfig { - graphConfig?: string - addressBook?: string - } - - export interface HardhatNetworkUserConfig { - graphConfig?: string - addressBook?: string - } - - export interface HttpNetworkConfig { - graphConfig?: string - addressBook?: string - } - - export interface HttpNetworkUserConfig { - graphConfig?: string - addressBook?: string - } - - export interface ProjectPathsConfig { - graph?: string - } - - export interface ProjectPathsUserConfig { - graph?: string - } -} diff --git a/packages/sdk/src/gre/types.ts b/packages/sdk/src/gre/types.ts deleted file mode 100644 index 5191723d2..000000000 --- a/packages/sdk/src/gre/types.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { EthersProviderWrapper } from '@nomiclabs/hardhat-ethers/internal/ethers-provider-wrapper' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { Wallet } from 'ethers' -import YAML from 'yaml' - -import { GraphNetworkAddressBook, GraphNetworkContracts } from '..' - -export interface GraphRuntimeEnvironmentOptions { - addressBook?: string - l1GraphConfig?: string - l2GraphConfig?: string - graphConfig?: string - enableTxLogging?: boolean - disableSecureAccounts?: boolean - fork?: boolean - - // These are mostly for testing purposes - l1AccountName?: string - l2AccountName?: string - l1AccountPassword?: string - l2AccountPassword?: string -} - -export type AccountNames = - | 'arbitrator' - | 'governor' - | 'authority' - | 'availabilityOracle' - | 'pauseGuardian' - | 'allocationExchangeOwner' - -export type NamedAccounts = { - [name in AccountNames]: SignerWithAddress -} - -export interface GraphNetworkEnvironment { - chainId: number - provider: EthersProviderWrapper - contracts: GraphNetworkContracts - graphConfig: YAML.Document.Parsed - addressBook: GraphNetworkAddressBook - getNamedAccounts: () => Promise - getTestAccounts: () => Promise - getAllAccounts: () => Promise - getDeployer: () => Promise - getWallets: () => Promise - getWallet: (address: string) => Promise -} - -export interface GraphRuntimeEnvironment extends GraphNetworkEnvironment { - l1: GraphNetworkEnvironment | null - l2: GraphNetworkEnvironment | null -} diff --git a/packages/sdk/src/helpers/arbitrum.ts b/packages/sdk/src/helpers/arbitrum.ts deleted file mode 100644 index 6f8152a50..000000000 --- a/packages/sdk/src/helpers/arbitrum.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { addCustomNetwork } from '@arbitrum/sdk' -import type { BridgeMock, InboxMock, OutboxMock } from '@graphprotocol/contracts' -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { ethers, providers, Wallet } from 'ethers' -import fs from 'fs' - -import { deploy, DeployType } from '../deployments' -import { applyL1ToL2Alias } from '../utils/arbitrum/' -import { setCode } from './code' -import { impersonateAccount } from './impersonate' - -export interface L1ArbitrumMocks { - bridgeMock: BridgeMock - inboxMock: InboxMock - outboxMock: OutboxMock - routerMock: Wallet -} - -export interface L2ArbitrumMocks { - routerMock: Wallet -} - -export async function deployL1MockBridge( - deployer: SignerWithAddress, - arbitrumAddressBook: string, - provider: providers.Provider, -): Promise { - // Deploy mock contracts - const bridgeMock = (await deploy(DeployType.Deploy, deployer, { name: 'BridgeMock' })).contract as BridgeMock - const inboxMock = (await deploy(DeployType.Deploy, deployer, { name: 'InboxMock' })).contract as InboxMock - const outboxMock = (await deploy(DeployType.Deploy, deployer, { name: 'OutboxMock' })).contract as OutboxMock - - // "deploy" router - set dummy code so that it appears as a contract - const routerMock = Wallet.createRandom() - await setCode(routerMock.address, '0x1234') - - // Configure mock contracts - await bridgeMock.connect(deployer).setInbox(inboxMock.address, true) - await bridgeMock.connect(deployer).setOutbox(outboxMock.address, true) - await inboxMock.connect(deployer).setBridge(bridgeMock.address) - await outboxMock.connect(deployer).setBridge(bridgeMock.address) - - // Update address book - const deployment = fs.existsSync(arbitrumAddressBook) ? JSON.parse(fs.readFileSync(arbitrumAddressBook, 'utf-8')) : {} - const addressBook = { - '1337': { - L1GatewayRouter: { - address: routerMock.address, - }, - IInbox: { - address: inboxMock.address, - }, - }, - '412346': { - L2GatewayRouter: { - address: deployment['412346']?.L2GatewayRouter?.address ?? '', - }, - }, - } - - fs.writeFileSync(arbitrumAddressBook, JSON.stringify(addressBook)) - - return { - bridgeMock: bridgeMock.connect(provider), - inboxMock: inboxMock.connect(provider), - outboxMock: outboxMock.connect(provider), - routerMock: routerMock.connect(provider), - } -} - -export async function deployL2MockBridge( - deployer: SignerWithAddress, - arbitrumAddressBook: string, - provider: providers.Provider, -): Promise { - // "deploy" router - set dummy code so that it appears as a contract - const routerMock = Wallet.createRandom() - await setCode(routerMock.address, '0x1234') - - // Update address book - const deployment = fs.existsSync(arbitrumAddressBook) ? JSON.parse(fs.readFileSync(arbitrumAddressBook, 'utf-8')) : {} - const addressBook = { - '1337': { - L1GatewayRouter: { - address: deployment['1337']?.L1GatewayRouter?.address, - }, - IInbox: { - address: deployment['1337']?.IInbox?.address, - }, - }, - '412346': { - L2GatewayRouter: { - address: routerMock.address, - }, - }, - } - - fs.writeFileSync(arbitrumAddressBook, JSON.stringify(addressBook)) - - return { - routerMock: routerMock.connect(provider), - } -} - -export async function getL2SignerFromL1(l1Address: string): Promise { - const l2Address = applyL1ToL2Alias(l1Address) - return impersonateAccount(l2Address) -} - -export function addLocalNetwork(deploymentFile: string) { - if (!fs.existsSync(deploymentFile)) { - throw new Error(`Deployment file not found: ${deploymentFile}`) - } - const deployment = JSON.parse(fs.readFileSync(deploymentFile, 'utf-8')) - addCustomNetwork({ - customL1Network: deployment.l1Network, - customL2Network: deployment.l2Network, - }) -} - -// Use prefunded genesis address to fund accounts -// See: https://docs.arbitrum.io/node-running/how-tos/local-dev-node#default-endpoints-and-addresses -export async function fundLocalAccounts(accounts: SignerWithAddress[], provider: providers.Provider) { - for (const account of accounts) { - const amount = ethers.utils.parseEther('10') - const wallet = new Wallet('b6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659') - const tx = await wallet.connect(provider).sendTransaction({ - value: amount, - to: account.address, - }) - await tx.wait() - } -} diff --git a/packages/sdk/src/helpers/balance.ts b/packages/sdk/src/helpers/balance.ts deleted file mode 100644 index 88ab4153b..000000000 --- a/packages/sdk/src/helpers/balance.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { setBalance as hardhatSetBalance } from '@nomicfoundation/hardhat-network-helpers' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import type { BigNumber } from 'ethers' - -export async function setBalance(address: string, balance: BigNumber | number, funder?: SignerWithAddress) { - try { - await hardhatSetBalance(address, balance) - } catch (error) { - if (funder === undefined) throw error - await funder.sendTransaction({ to: address, value: balance }) - } -} - -export async function setBalances(args: { address: string; balance: BigNumber }[], funder?: SignerWithAddress) { - for (let i = 0; i < args.length; i++) { - await setBalance(args[i].address, args[i].balance, funder) - } -} diff --git a/packages/sdk/src/helpers/code.ts b/packages/sdk/src/helpers/code.ts deleted file mode 100644 index f1797caf0..000000000 --- a/packages/sdk/src/helpers/code.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { setCode as hardhatSetCode } from '@nomicfoundation/hardhat-network-helpers' - -export async function setCode(address: string, code: string): Promise { - return hardhatSetCode(address, code) -} diff --git a/packages/sdk/src/helpers/epoch.ts b/packages/sdk/src/helpers/epoch.ts deleted file mode 100644 index 0996316f5..000000000 --- a/packages/sdk/src/helpers/epoch.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { EpochManager } from '@graphprotocol/contracts' - -import { mine } from './mine' - -export type PartialEpochManager = Pick - -export async function mineEpoch(epochManager: PartialEpochManager, epochs?: number): Promise { - epochs = epochs ?? 1 - for (let i = 0; i < epochs; i++) { - epochManager - await _mineEpoch(epochManager) - } -} - -async function _mineEpoch(epochManager: PartialEpochManager): Promise { - const blocksSinceEpoch = await epochManager.currentEpochBlockSinceStart() - const epochLen = await epochManager.epochLength() - return mine(epochLen.sub(blocksSinceEpoch)) -} diff --git a/packages/sdk/src/helpers/impersonate.ts b/packages/sdk/src/helpers/impersonate.ts deleted file mode 100644 index 8f7858322..000000000 --- a/packages/sdk/src/helpers/impersonate.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { impersonateAccount as hardhatImpersonateAccount } from '@nomicfoundation/hardhat-network-helpers' -import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' - -export async function impersonateAccount(address: string): Promise { - const hre = await import('hardhat') - await hardhatImpersonateAccount(address) - - // This allows the dynamic import to work on both ts and js - const ethers = hre.ethers ?? hre.default.ethers - return ethers.getSigner(address) -} diff --git a/packages/sdk/src/helpers/index.ts b/packages/sdk/src/helpers/index.ts deleted file mode 100644 index 2403831a7..000000000 --- a/packages/sdk/src/helpers/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './arbitrum' -export * from './balance' -export * from './code' -export * from './epoch' -export * from './impersonate' -export * from './mine' -export * from './snapshot' -export * from './time' diff --git a/packages/sdk/src/helpers/mine.ts b/packages/sdk/src/helpers/mine.ts deleted file mode 100644 index 02b81d0bd..000000000 --- a/packages/sdk/src/helpers/mine.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { mine as hardhatMine, mineUpTo as hardhatMineUpTo } from '@nomicfoundation/hardhat-network-helpers' -import type { BigNumber } from 'ethers' - -export async function mine( - blocks?: string | number | BigNumber, - interval?: string | number | BigNumber, -): Promise { - return hardhatMine(blocks, { interval }) -} - -export async function mineUpTo(blockNumber: string | number | BigNumber): Promise { - return hardhatMineUpTo(blockNumber) -} - -export async function setAutoMine(autoMine: boolean): Promise { - const hre = await import('hardhat') - - // This allows the dynamic import to work on both ts and js - const network = hre.network ?? hre.default.network - return network.provider.send('evm_setAutomine', [autoMine]) -} - -export async function setIntervalMining(interval: number): Promise { - const hre = await import('hardhat') - - // This allows the dynamic import to work on both ts and js - const network = hre.network ?? hre.default.network - return network.provider.send('evm_setIntervalMining', [interval]) -} diff --git a/packages/sdk/src/helpers/snapshot.ts b/packages/sdk/src/helpers/snapshot.ts deleted file mode 100644 index 62d0b91a8..000000000 --- a/packages/sdk/src/helpers/snapshot.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SnapshotRestorer, takeSnapshot as hardhatTakeSnapshot } from '@nomicfoundation/hardhat-network-helpers' - -export async function takeSnapshot(): Promise { - return hardhatTakeSnapshot() -} - -export async function restoreSnapshot(snapshot: SnapshotRestorer): Promise { - return snapshot.restore() -} - -export type { SnapshotRestorer } from '@nomicfoundation/hardhat-network-helpers' diff --git a/packages/sdk/src/helpers/time.ts b/packages/sdk/src/helpers/time.ts deleted file mode 100644 index 427678ae1..000000000 --- a/packages/sdk/src/helpers/time.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { time } from '@nomicfoundation/hardhat-network-helpers' - -export async function latestBlock(): Promise { - return time.latestBlock() -} diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts deleted file mode 100644 index 3bc0457f5..000000000 --- a/packages/sdk/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './chain' -export * from './deployments' -export * as helpers from './helpers' -export * from './utils' diff --git a/packages/sdk/src/utils/abi.ts b/packages/sdk/src/utils/abi.ts deleted file mode 100644 index fc21be582..000000000 --- a/packages/sdk/src/utils/abi.ts +++ /dev/null @@ -1,13 +0,0 @@ -interface ABIItem { - name?: string - [key: string]: unknown -} - -export function mergeABIs(abi1: ABIItem[], abi2: ABIItem[]) { - for (const item of abi2) { - if (abi1.find((v) => v.name === item.name) === undefined) { - abi1.push(item) - } - } - return abi1 -} diff --git a/packages/sdk/src/utils/address.ts b/packages/sdk/src/utils/address.ts deleted file mode 100644 index 0ca1a5d33..000000000 --- a/packages/sdk/src/utils/address.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { getAddress } from 'ethers/lib/utils' - -import { randomHexBytes } from './bytes' - -export const randomAddress = (): string => getAddress(randomHexBytes(20)) diff --git a/packages/sdk/src/utils/allocation.ts b/packages/sdk/src/utils/allocation.ts deleted file mode 100644 index 552ea73b6..000000000 --- a/packages/sdk/src/utils/allocation.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Signer } from 'ethers' -import { utils, Wallet } from 'ethers' - -export enum AllocationState { - Null, - Active, - Closed, - Finalized, - Claimed, -} - -export interface ChannelKey { - privKey: string - pubKey: string - address: string - wallet: Signer - generateProof: (address: string) => Promise -} - -export const deriveChannelKey = (): ChannelKey => { - const w = Wallet.createRandom() - return { - privKey: w.privateKey, - pubKey: w.publicKey, - address: w.address, - wallet: w, - generateProof: (indexerAddress: string): Promise => { - const messageHash = utils.solidityKeccak256(['address', 'address'], [indexerAddress, w.address]) - const messageHashBytes = utils.arrayify(messageHash) - return w.signMessage(messageHashBytes) - }, - } -} diff --git a/packages/sdk/src/utils/arbitrum/address.ts b/packages/sdk/src/utils/arbitrum/address.ts deleted file mode 100644 index 89e2fb489..000000000 --- a/packages/sdk/src/utils/arbitrum/address.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { hexZeroPad } from 'ethers/lib/utils' - -import { toBN } from '../units' - -// Adapted from: -// https://github.com/livepeer/arbitrum-lpt-bridge/blob/e1a81edda3594e434dbcaa4f1ebc95b7e67ecf2a/utils/arbitrum/messaging.ts#L118 -export const applyL1ToL2Alias = (l1Address: string): string => { - const offset = toBN('0x1111000000000000000000000000000000001111') - const l1AddressAsNumber = toBN(l1Address) - const l2AddressAsNumber = l1AddressAsNumber.add(offset) - - const mask = toBN(2).pow(160) - return hexZeroPad(l2AddressAsNumber.mod(mask).toHexString(), 20) -} diff --git a/packages/sdk/src/utils/arbitrum/gas.ts b/packages/sdk/src/utils/arbitrum/gas.ts deleted file mode 100644 index 147bcc2fc..000000000 --- a/packages/sdk/src/utils/arbitrum/gas.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { L1ToL2MessageGasEstimator } from '@arbitrum/sdk' -import type { L1ToL2MessageNoGasParams } from '@arbitrum/sdk/dist/lib/message/L1ToL2MessageCreator' -import type { GasOverrides } from '@arbitrum/sdk/dist/lib/message/L1ToL2MessageGasEstimator' -import type { BigNumber, providers } from 'ethers' -import { parseEther } from 'ethers/lib/utils' - -export interface L2GasParams { - maxGas: BigNumber - gasPriceBid: BigNumber - maxSubmissionCost: BigNumber -} - -/** - * Estimate gas parameters for a retryable ticket creation - * - * @remark Uses Arbitrum's SDK to estimate the parameters - * - * @param l1Provider Provider for the L1 network (ethereum) - * @param l2Provider Provider for the L2 network (arbitrum) - * @param gatewayAddress Address where the tickets will be sent from in L1 - * @param l2Dest Address of the destination in L2 - * @param depositCalldata Calldata to be sent to L2 - * @param opts Gas parameters to be used if not auto-estimated - * @returns estimated gas parameters - */ -export const estimateRetryableTxGas = async ( - l1Provider: providers.Provider, - l2Provider: providers.Provider, - gatewayAddress: string, - l2Dest: string, - depositCalldata: string, - opts: L2GasParams, -): Promise => { - const autoEstimate = opts && (!opts.maxGas || !opts.gasPriceBid || !opts.maxSubmissionCost) - if (!autoEstimate) { - return opts - } - - console.info('Estimating retryable ticket gas:') - const baseFee = (await l1Provider.getBlock('latest')).baseFeePerGas - const gasEstimator = new L1ToL2MessageGasEstimator(l2Provider) - const retryableEstimateData: L1ToL2MessageNoGasParams = { - from: gatewayAddress, - to: l2Dest, - data: depositCalldata, - l2CallValue: parseEther('0'), - excessFeeRefundAddress: gatewayAddress, - callValueRefundAddress: gatewayAddress, - } - - const estimateOpts: GasOverrides = {} - if (opts.maxGas) estimateOpts.gasLimit = { base: opts.maxGas } - if (opts.maxSubmissionCost) estimateOpts.maxSubmissionFee = { base: opts.maxSubmissionCost } - if (opts.gasPriceBid) estimateOpts.maxFeePerGas = { base: opts.gasPriceBid } - - const gasParams = await gasEstimator.estimateAll( - retryableEstimateData, - baseFee as BigNumber, - l1Provider, - estimateOpts, - ) - - return { - maxGas: opts.maxGas ?? gasParams.gasLimit, - gasPriceBid: opts.gasPriceBid ?? gasParams.maxFeePerGas, - maxSubmissionCost: opts.maxSubmissionCost ?? gasParams.maxSubmissionCost, - } -} diff --git a/packages/sdk/src/utils/arbitrum/index.ts b/packages/sdk/src/utils/arbitrum/index.ts deleted file mode 100644 index 9e449cf5c..000000000 --- a/packages/sdk/src/utils/arbitrum/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { applyL1ToL2Alias } from './address' -export { estimateRetryableTxGas, type L2GasParams } from './gas' -export * from './message' diff --git a/packages/sdk/src/utils/arbitrum/message.ts b/packages/sdk/src/utils/arbitrum/message.ts deleted file mode 100644 index c0f52909d..000000000 --- a/packages/sdk/src/utils/arbitrum/message.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - L1ToL2MessageReader, - L1ToL2MessageStatus, - L1ToL2MessageWriter, - L1TransactionReceipt, - L2ToL1MessageReader, - L2ToL1MessageStatus, - L2ToL1MessageWriter, - L2TransactionReceipt, -} from '@arbitrum/sdk' -import type { Provider } from '@ethersproject/abstract-provider' -import type { providers, Signer } from 'ethers' - -// L1 -> L2 -export async function getL1ToL2MessageWriter( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, -): Promise { - return (await getL1ToL2Message(txHashOrReceipt, l1Provider, l2Provider)) as L1ToL2MessageWriter -} - -export async function getL1ToL2MessageReader( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, -): Promise { - return await getL1ToL2Message(txHashOrReceipt, l1Provider, l2Provider) -} - -export async function getL1ToL2MessageStatus( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, -): Promise { - const message = await getL1ToL2Message(txHashOrReceipt, l1Provider, l2Provider) - return await message.status() -} - -async function getL1ToL2Message( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, -): Promise { - const txReceipt = - typeof txHashOrReceipt === 'string' ? await l1Provider.getTransactionReceipt(txHashOrReceipt) : txHashOrReceipt - const l1Receipt = new L1TransactionReceipt(txReceipt) - const l1ToL2Messages = await l1Receipt.getL1ToL2Messages(l2Provider) - return l1ToL2Messages[0] -} - -// L2 -> L1 -export async function getL2ToL1MessageWriter( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, - signer: Signer, -): Promise { - return (await getL2ToL1Message(txHashOrReceipt, l1Provider, l2Provider, signer)) as L2ToL1MessageWriter -} - -export async function getL2ToL1MessageReader( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, -): Promise { - return await getL2ToL1Message(txHashOrReceipt, l1Provider, l2Provider) -} - -export async function getL2ToL1MessageStatus( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, -): Promise { - const message = await getL2ToL1Message(txHashOrReceipt, l1Provider, l2Provider) - return await message.status(l2Provider) -} - -async function getL2ToL1Message( - txHashOrReceipt: string | providers.TransactionReceipt, - l1Provider: Provider, - l2Provider: Provider, - signer?: Signer, -) { - const txReceipt = - typeof txHashOrReceipt === 'string' ? await l2Provider.getTransactionReceipt(txHashOrReceipt) : txHashOrReceipt - const l1SignerOrProvider = signer ? signer.connect(l1Provider) : l1Provider - const l2Receipt = new L2TransactionReceipt(txReceipt) - const l2ToL1Messages = await l2Receipt.getL2ToL1Messages(l1SignerOrProvider) - return l2ToL1Messages[0] -} diff --git a/packages/sdk/src/utils/bytes.ts b/packages/sdk/src/utils/bytes.ts deleted file mode 100644 index 551be450c..000000000 --- a/packages/sdk/src/utils/bytes.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ethers } from 'ethers' -import { hexlify, randomBytes } from 'ethers/lib/utils' - -export const randomHexBytes = (n = 32): string => hexlify(randomBytes(n)) - -export const base58ToHex = (base58: string): string => { - return ethers.utils.hexlify(ethers.utils.base58.decode(base58)) -} diff --git a/packages/sdk/src/utils/eip712.ts b/packages/sdk/src/utils/eip712.ts deleted file mode 100644 index c277829de..000000000 --- a/packages/sdk/src/utils/eip712.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { eip712 } from '@graphprotocol/common-ts/dist/attestations' -import { BigNumber, BytesLike, Signature } from 'ethers' -import { keccak256, SigningKey } from 'ethers/lib/utils' - -export interface Permit { - owner: string - spender: string - value: BigNumber - nonce: BigNumber - deadline: BigNumber -} - -const PERMIT_TYPE_HASH = eip712.typeHash( - 'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)', -) - -export function signPermit( - signer: BytesLike, - chainId: number, - contractAddress: string, - permit: Permit, - salt: string, -): Signature { - const domainSeparator = eip712.domainSeparator({ - name: 'Graph Token', - version: '0', - chainId, - verifyingContract: contractAddress, - salt: salt, - }) - const hashEncodedPermit = hashEncodePermit(permit) - const message = eip712.encode(domainSeparator, hashEncodedPermit) - const messageHash = keccak256(message) - const signingKey = new SigningKey(signer) - return signingKey.signDigest(messageHash) -} - -function hashEncodePermit(permit: Permit) { - return eip712.hashStruct( - PERMIT_TYPE_HASH, - ['address', 'address', 'uint256', 'uint256', 'uint256'], - [permit.owner, permit.spender, permit.value, permit.nonce, permit.deadline], - ) -} diff --git a/packages/sdk/src/utils/hash.ts b/packages/sdk/src/utils/hash.ts deleted file mode 100644 index ab860c928..000000000 --- a/packages/sdk/src/utils/hash.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { keccak256 } from 'ethers/lib/utils' - -export const hashHexString = (input: string): string => keccak256(`0x${input.replace(/^0x/, '')}`) diff --git a/packages/sdk/src/utils/index.ts b/packages/sdk/src/utils/index.ts deleted file mode 100644 index 92ccdcf07..000000000 --- a/packages/sdk/src/utils/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './address' -export * from './allocation' -export * from './arbitrum' -export * from './bytes' -export * from './eip712' -export * from './hash' -export * from './prompt' -export * from './subgraph' -export * from './units' diff --git a/packages/sdk/src/utils/nonce.ts b/packages/sdk/src/utils/nonce.ts deleted file mode 100644 index d17440498..000000000 --- a/packages/sdk/src/utils/nonce.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NonceManager } from '@ethersproject/experimental' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import type { providers } from 'ethers' - -export class NonceManagerWithAddress extends NonceManager { - public address: string - public signerWithAddress: SignerWithAddress - - constructor(signer: SignerWithAddress) { - super(signer) - this.address = signer.address - this.signerWithAddress = signer - } - - connect(provider: providers.Provider): NonceManager { - return new NonceManagerWithAddress(this.signerWithAddress.connect(provider)) - } -} diff --git a/packages/sdk/src/utils/prompt.ts b/packages/sdk/src/utils/prompt.ts deleted file mode 100644 index 1c8f0d324..000000000 --- a/packages/sdk/src/utils/prompt.ts +++ /dev/null @@ -1,15 +0,0 @@ -import inquirer from 'inquirer' - -export const confirm = async (message: string, skip: boolean): Promise => { - if (skip) return true - const res = await inquirer.prompt({ - name: 'confirm', - type: 'confirm', - message, - }) - if (!res.confirm) { - console.info('Cancelled') - return false - } - return true -} diff --git a/packages/sdk/src/utils/subgraph.ts b/packages/sdk/src/utils/subgraph.ts deleted file mode 100644 index 3f7565a67..000000000 --- a/packages/sdk/src/utils/subgraph.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { BigNumber } from 'ethers' -import { solidityKeccak256 } from 'ethers/lib/utils' - -import { base58ToHex, randomHexBytes } from './bytes' - -export interface PublishSubgraph { - subgraphDeploymentID: string - versionMetadata: string - subgraphMetadata: string -} - -export interface Subgraph { - vSignal: BigNumber - nSignal: BigNumber - subgraphDeploymentID: string - reserveRatioDeprecated: number - disabled: boolean - withdrawableGRT: BigNumber - id?: string -} - -export const buildSubgraphId = async ( - account: string, - seqId: number | BigNumber, - chainId: number | BigNumber, -): Promise => { - return solidityKeccak256(['address', 'uint256', 'uint256'], [account, seqId, chainId]) -} - -export const buildLegacySubgraphId = (account: string, seqID: BigNumber): string => - solidityKeccak256(['address', 'uint256'], [account, seqID]) - -export const buildSubgraph = (): PublishSubgraph => { - return { - subgraphDeploymentID: randomHexBytes(), - versionMetadata: randomHexBytes(), - subgraphMetadata: randomHexBytes(), - } -} - -export const subgraphIdToHex = (id: string): string => { - id = id.startsWith('Qm') ? id : `Qm${id}` - return `0x${base58ToHex(id).slice(6)}` -} diff --git a/packages/sdk/src/utils/time.ts b/packages/sdk/src/utils/time.ts deleted file mode 100644 index 87e1bdeba..000000000 --- a/packages/sdk/src/utils/time.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const wait = (ms: number): Promise => { - return new Promise((res) => setTimeout(res, ms)) -} diff --git a/packages/sdk/src/utils/type-guard.ts b/packages/sdk/src/utils/type-guard.ts deleted file mode 100644 index f742f2461..000000000 --- a/packages/sdk/src/utils/type-guard.ts +++ /dev/null @@ -1,12 +0,0 @@ -// https://stackoverflow.com/questions/58278652/generic-enum-type-guard -export function isSomeEnum>(e: T): (token: unknown) => token is T[keyof T] { - const keys = Object.keys(e).filter((k) => { - return !/^\d/.test(k) - }) - const values = keys.map((k) => { - return e[k] - }) - return (token: unknown): token is T[keyof T] => { - return values.includes(token) - } -} diff --git a/packages/sdk/src/utils/units.ts b/packages/sdk/src/utils/units.ts deleted file mode 100644 index 997d47050..000000000 --- a/packages/sdk/src/utils/units.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BigNumber } from 'ethers' -import { formatUnits, parseUnits } from 'ethers/lib/utils' - -export const toBN = (value: string | number): BigNumber => BigNumber.from(value) -export const toGRT = (value: string | number): BigNumber => { - return parseUnits(typeof value === 'number' ? value.toString() : value, '18') -} -export const formatGRT = (value: BigNumber): string => formatUnits(value, '18') diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json deleted file mode 100644 index ce270caa1..000000000 --- a/packages/sdk/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "tsBuildInfoFile": "./cache/tsbuildinfo", - "removeComments": true, - "types": ["@nomiclabs/hardhat-ethers"], - "outDir": "./types" - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules", "build", "types", "cache", "test"] -} diff --git a/packages/subgraph-service/CHANGELOG.md b/packages/subgraph-service/CHANGELOG.md new file mode 100644 index 000000000..4afa92410 --- /dev/null +++ b/packages/subgraph-service/CHANGELOG.md @@ -0,0 +1,79 @@ +# @graphprotocol/subgraph-service + +## 0.5.0 + +### Minor Changes + +- Updated indexer struct and function signature + +## 0.4.1 + +### Patch Changes + +- Ensure latest build is published to npm + +## 0.4.0 + +### Minor Changes + +- Extracted contract interfaces into its own package + +## 0.3.5 + +### Patch Changes + +- Add GNS to deployments + +## 0.3.4 + +### Patch Changes + +- chore: fix package visibility + +## 0.3.3 + +### Patch Changes + +- Fix missing public getter from toolshed interface + +## 0.3.2 + +### Patch Changes + +- Fix IServiceRegistry import in subgraph service toolshed deployment + +## 0.3.1 + +### Patch Changes + +- Use proper types for Curation contract, add epochLength to EpochManager import in Horizon. + +## 0.3.0 + +### Minor Changes + +- Publish types for contracts packages + +## 0.2.1 + +### Patch Changes + +- Pin ethers version + +## 0.2.0 + +### Minor Changes + +- Publish scratch testnet 2 address book + +## 0.1.1 + +### Patch Changes + +- Publish fork 1 deployment + +## 0.1.0 + +### Minor Changes + +- Publish initial dev versions diff --git a/packages/subgraph-service/README.md b/packages/subgraph-service/README.md new file mode 100644 index 000000000..ec180b952 --- /dev/null +++ b/packages/subgraph-service/README.md @@ -0,0 +1,74 @@ +# 🌅 Subgraph Service 🌅 + +The Subgraph Service is a data service designed to work with Graph Horizon that supports indexing subgraphs and serving queries to consumers. + +## Configuration + +The following environment variables might be required: + +| Variable | Description | +| ---------------------- | ------------------------------------------------------------------------------- | +| `ARBISCAN_API_KEY` | Arbiscan API key - for contract verification | +| `ARBITRUM_ONE_RPC` | Arbitrum One RPC URL - defaults to `https://arb1.arbitrum.io/rpc` | +| `ARBITRUM_SEPOLIA_RPC` | Arbitrum Sepolia RPC URL - defaults to `https://sepolia-rollup.arbitrum.io/rpc` | +| `LOCALHOST_RPC` | Localhost RPC URL - defaults to `http://localhost:8545` | + +You can set them using Hardhat: + +```bash +npx hardhat vars set +``` + +## Build + +```bash +pnpm install +pnpm build +``` + +## Deployment + +Note that this instructions will help you deploy Graph Horizon contracts alongside the Subgraph Service. If you want to deploy just the core Horizon contracts please refer to the [Horizon README](../horizon/README.md) for deploy instructions. + +### New deployment + +To deploy Graph Horizon from scratch including the Subgraph Service run the following command: + +```bash +npx hardhat deploy:protocol --network hardhat +``` + +### Upgrade deployment + +Usually you would run this against a network (or a fork) where the original Graph Protocol was previously deployed. To upgrade an existing deployment of the original Graph Protocol to Graph Horizon including the Subgraph Service, run the following commands. Note that some steps might need to be run by different accounts (deployer vs governor): + +```bash +cd ../ +cd horizon && npx hardhat deploy:migrate --network hardhat --step 1 && cd .. +cd subgraph-service && npx hardhat deploy:migrate --network hardhat --step 1 && cd .. +cd horizon && npx hardhat deploy:migrate --network hardhat --step 2 && cd .. # Run with governor. Optionally add --patch-config +cd horizon && npx hardhat deploy:migrate --network hardhat --step 3 && cd .. # Optionally add --patch-config +cd subgraph-service && npx hardhat deploy:migrate --network hardhat --step 2 && cd .. # Optionally add --patch-config +cd horizon && npx hardhat deploy:migrate --network hardhat --step 4 && cd .. # Run with governor. Optionally add --patch-config +``` + +Horizon Steps 2, 3 and 4, and Subgraph Service Step 2 require patching the configuration file with addresses from previous steps. The files are located in the `ignition/configs` directory and need to be manually edited. You can also pass `--patch-config` flag to the deploy command to automatically patch the configuration reading values from the address book. Note that this will NOT update the configuration file. + +## Testing + +- **unit**: Unit tests can be run with `pnpm test` +- **integration**: Integration tests can be run with `pnpm test:integration` - Need to set `BLOCKCHAIN_RPC` for a chain where The Graph is already deployed - If no `BLOCKCHAIN_RPC` is detected it will try using `ARBITRUM_SEPOLIA_RPC` +- **deployment**: Deployment tests can be run with `pnpm test:deployment --network `, the following environment variables allow customizing the test suite for different scenarios: + - `TEST_DEPLOYMENT_STEP` (default: 1) - Specify the latest deployment step that has been executed. Tests for later steps will be skipped. + - `TEST_DEPLOYMENT_TYPE` (default: migrate) - The deployment type `protocol/migrate` that is being tested. Test suite has been developed for `migrate` use case but can be run against a `protocol` deployment, likely with some failed tests. + - `TEST_DEPLOYMENT_CONFIG` (default: `hre.network.name`) - The Ignition config file name to use for the test suite. + +## Verification + +To verify contracts on a network, run the following commands: + +```bash +./scripts/pre-verify +npx hardhat ignition verify --network --include-unrelated-contracts +./scripts/post-verify +``` diff --git a/packages/subgraph-service/addresses-integration-tests.json b/packages/subgraph-service/addresses-integration-tests.json new file mode 100644 index 000000000..5bddc12bb --- /dev/null +++ b/packages/subgraph-service/addresses-integration-tests.json @@ -0,0 +1,35 @@ +{ + "421614": { + "L2Curation": { + "address": "0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4", + "proxy": "graph", + "implementation": "0x9CCD9B656f8A558879974ef2505496eEd7Ef7210" + }, + "L2GNS": { + "address": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "proxy": "graph", + "implementation": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9" + }, + "SubgraphNFT": { + "address": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A" + }, + "LegacyDisputeManager": { + "address": "0x7C9B82717f9433932507dF6EdA93A9678b258698" + }, + "LegacyServiceRegistry": { + "address": "0x888541878CbDDEd880Cd58c728f1Af5C47343F86" + }, + "SubgraphService": { + "address": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0", + "proxy": "transparent", + "proxyAdmin": "0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6", + "implementation": "0x30b34eAaF354cAdd64836Bc0846F4414254271ea" + }, + "DisputeManager": { + "address": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "proxy": "transparent", + "proxyAdmin": "0x9a8C3B6D649108bd11670de0B9b981ae3C167707", + "implementation": "0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8" + } + } +} diff --git a/packages/subgraph-service/addresses.json b/packages/subgraph-service/addresses.json new file mode 100644 index 000000000..5bddc12bb --- /dev/null +++ b/packages/subgraph-service/addresses.json @@ -0,0 +1,35 @@ +{ + "421614": { + "L2Curation": { + "address": "0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4", + "proxy": "graph", + "implementation": "0x9CCD9B656f8A558879974ef2505496eEd7Ef7210" + }, + "L2GNS": { + "address": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "proxy": "graph", + "implementation": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9" + }, + "SubgraphNFT": { + "address": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A" + }, + "LegacyDisputeManager": { + "address": "0x7C9B82717f9433932507dF6EdA93A9678b258698" + }, + "LegacyServiceRegistry": { + "address": "0x888541878CbDDEd880Cd58c728f1Af5C47343F86" + }, + "SubgraphService": { + "address": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0", + "proxy": "transparent", + "proxyAdmin": "0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6", + "implementation": "0x30b34eAaF354cAdd64836Bc0846F4414254271ea" + }, + "DisputeManager": { + "address": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "proxy": "transparent", + "proxyAdmin": "0x9a8C3B6D649108bd11670de0B9b981ae3C167707", + "implementation": "0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8" + } + } +} diff --git a/packages/subgraph-service/contracts/DisputeManager.sol b/packages/subgraph-service/contracts/DisputeManager.sol new file mode 100644 index 000000000..390efb8ce --- /dev/null +++ b/packages/subgraph-service/contracts/DisputeManager.sol @@ -0,0 +1,701 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity 0.8.27; + +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"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; + +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { MathUtils } from "@graphprotocol/horizon/contracts/libraries/MathUtils.sol"; +import { Attestation } from "./libraries/Attestation.sol"; + +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { GraphDirectory } from "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol"; +import { DisputeManagerV1Storage } from "./DisputeManagerStorage.sol"; +import { AttestationManager } from "./utilities/AttestationManager.sol"; + +/** + * @title DisputeManager + * @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. + * + * Query Disputes: + * Graph nodes receive queries and return responses with signed receipts called attestations. + * An attestation can be disputed if the consumer thinks the query response was invalid. + * Indexers use the derived private key for an allocation to sign attestations. + * + * Indexing Disputes: + * Indexers periodically present a Proof of Indexing (POI) to prove they are indexing a subgraph. + * The Subgraph Service contract emits that proof which includes the POI. Any fisherman can dispute the + * validity of a POI by submitting a dispute to this contract along with a deposit. + * + * Arbitration: + * Disputes can only be accepted, rejected or drawn by the arbitrator role that can be delegated + * to a EOA or DAO. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract DisputeManager is + Initializable, + OwnableUpgradeable, + GraphDirectory, + AttestationManager, + DisputeManagerV1Storage, + IDisputeManager +{ + using TokenUtils for IGraphToken; + using PPMMath for uint256; + + // -- Constants -- + + /// @notice Maximum value for fisherman reward cut in PPM + uint32 public constant MAX_FISHERMAN_REWARD_CUT = 500000; // 50% + + /// @notice Minimum value for dispute deposit + uint256 public constant MIN_DISPUTE_DEPOSIT = 1e18; // 1 GRT + + // -- Modifiers -- + + /** + * @notice Check if the caller is the arbitrator. + */ + modifier onlyArbitrator() { + require(msg.sender == arbitrator, DisputeManagerNotArbitrator()); + _; + } + + /** + * @notice Check if the dispute exists and is pending. + * @param disputeId The dispute Id + */ + modifier onlyPendingDispute(bytes32 disputeId) { + require(isDisputeCreated(disputeId), DisputeManagerInvalidDispute(disputeId)); + require( + disputes[disputeId].status == IDisputeManager.DisputeStatus.Pending, + DisputeManagerDisputeNotPending(disputes[disputeId].status) + ); + _; + } + + /** + * @notice Check if the caller is the fisherman of the dispute. + * @param disputeId The dispute Id + */ + modifier onlyFisherman(bytes32 disputeId) { + require(isDisputeCreated(disputeId), DisputeManagerInvalidDispute(disputeId)); + require(msg.sender == disputes[disputeId].fisherman, DisputeManagerNotFisherman()); + _; + } + + /** + * @notice Contract constructor + * @param controller Address of the controller + */ + constructor(address controller) GraphDirectory(controller) { + _disableInitializers(); + } + + /// @inheritdoc IDisputeManager + function initialize( + address owner, + address arbitrator_, + uint64 disputePeriod_, + uint256 disputeDeposit_, + uint32 fishermanRewardCut_, + uint32 maxSlashingCut_ + ) external override initializer { + __Ownable_init(owner); + __AttestationManager_init(); + + _setArbitrator(arbitrator_); + _setDisputePeriod(disputePeriod_); + _setDisputeDeposit(disputeDeposit_); + _setFishermanRewardCut(fishermanRewardCut_); + _setMaxSlashingCut(maxSlashingCut_); + } + + /// @inheritdoc IDisputeManager + function createIndexingDispute( + address allocationId, + bytes32 poi, + uint256 blockNumber + ) external override returns (bytes32) { + // Get funds from fisherman + _graphToken().pullTokens(msg.sender, disputeDeposit); + + // Create a dispute + return _createIndexingDisputeWithAllocation(msg.sender, disputeDeposit, allocationId, poi, blockNumber); + } + + /// @inheritdoc IDisputeManager + function createQueryDispute(bytes calldata attestationData) external override returns (bytes32) { + // Get funds from fisherman + _graphToken().pullTokens(msg.sender, disputeDeposit); + + // Create a dispute + return + _createQueryDisputeWithAttestation( + msg.sender, + disputeDeposit, + Attestation.parse(attestationData), + attestationData + ); + } + + /// @inheritdoc IDisputeManager + function createQueryDisputeConflict( + bytes calldata attestationData1, + bytes calldata attestationData2 + ) external override returns (bytes32, bytes32) { + address fisherman = msg.sender; + + // Parse each attestation + IAttestation.State memory attestation1 = Attestation.parse(attestationData1); + IAttestation.State memory attestation2 = Attestation.parse(attestationData2); + + // Test that attestations are conflicting + require( + Attestation.areConflicting(attestation1, attestation2), + DisputeManagerNonConflictingAttestations( + attestation1.requestCID, + attestation1.responseCID, + attestation1.subgraphDeploymentId, + attestation2.requestCID, + attestation2.responseCID, + attestation2.subgraphDeploymentId + ) + ); + + // Get funds from fisherman + _graphToken().pullTokens(msg.sender, disputeDeposit); + + // Create the disputes + // The deposit is zero for conflicting attestations + bytes32 dId1 = _createQueryDisputeWithAttestation( + fisherman, + disputeDeposit / 2, + attestation1, + attestationData1 + ); + bytes32 dId2 = _createQueryDisputeWithAttestation( + fisherman, + disputeDeposit / 2, + attestation2, + attestationData2 + ); + + // Store the linked disputes to be resolved + disputes[dId1].relatedDisputeId = dId2; + disputes[dId2].relatedDisputeId = dId1; + + // Emit event that links the two created disputes + emit DisputeLinked(dId1, dId2); + + return (dId1, dId2); + } + + /// @inheritdoc IDisputeManager + function createAndAcceptLegacyDispute( + address allocationId, + address fisherman, + uint256 tokensSlash, + uint256 tokensRewards + ) external override onlyArbitrator returns (bytes32) { + // Create a disputeId + bytes32 disputeId = keccak256(abi.encodePacked(allocationId, "legacy")); + + // Get the indexer for the legacy allocation + address indexer = _graphStaking().getAllocation(allocationId).indexer; + require(indexer != address(0), DisputeManagerIndexerNotFound(allocationId)); + + // Store dispute + disputes[disputeId] = Dispute( + indexer, + fisherman, + 0, + 0, + DisputeType.LegacyDispute, + IDisputeManager.DisputeStatus.Accepted, + block.timestamp, + block.timestamp + disputePeriod, + 0 + ); + + // Slash the indexer + ISubgraphService subgraphService_ = _getSubgraphService(); + subgraphService_.slash(indexer, abi.encode(tokensSlash, tokensRewards)); + + // Reward the fisherman + _graphToken().pushTokens(fisherman, tokensRewards); + + emit LegacyDisputeCreated(disputeId, indexer, fisherman, allocationId, tokensSlash, tokensRewards); + emit DisputeAccepted(disputeId, indexer, fisherman, tokensRewards); + + return disputeId; + } + + /// @inheritdoc IDisputeManager + function acceptDispute( + bytes32 disputeId, + uint256 tokensSlash + ) external override onlyArbitrator onlyPendingDispute(disputeId) { + require(!_isDisputeInConflict(disputes[disputeId]), DisputeManagerDisputeInConflict(disputeId)); + Dispute storage dispute = disputes[disputeId]; + _acceptDispute(disputeId, dispute, tokensSlash); + } + + /// @inheritdoc IDisputeManager + function acceptDisputeConflict( + bytes32 disputeId, + uint256 tokensSlash, + bool acceptDisputeInConflict, + uint256 tokensSlashRelated + ) external override onlyArbitrator onlyPendingDispute(disputeId) { + require(_isDisputeInConflict(disputes[disputeId]), DisputeManagerDisputeNotInConflict(disputeId)); + Dispute storage dispute = disputes[disputeId]; + _acceptDispute(disputeId, dispute, tokensSlash); + + if (acceptDisputeInConflict) { + _acceptDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId], tokensSlashRelated); + } else { + _drawDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId]); + } + } + + /// @inheritdoc IDisputeManager + function rejectDispute(bytes32 disputeId) external override onlyArbitrator onlyPendingDispute(disputeId) { + Dispute storage dispute = disputes[disputeId]; + require(!_isDisputeInConflict(dispute), DisputeManagerDisputeInConflict(disputeId)); + _rejectDispute(disputeId, dispute); + } + + /// @inheritdoc IDisputeManager + function drawDispute(bytes32 disputeId) external override onlyArbitrator onlyPendingDispute(disputeId) { + Dispute storage dispute = disputes[disputeId]; + _drawDispute(disputeId, dispute); + + if (_isDisputeInConflict(dispute)) { + _drawDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId]); + } + } + + /// @inheritdoc IDisputeManager + function cancelDispute(bytes32 disputeId) external override onlyFisherman(disputeId) onlyPendingDispute(disputeId) { + Dispute storage dispute = disputes[disputeId]; + + // Check if dispute period has finished + require(dispute.cancellableAt <= block.timestamp, DisputeManagerDisputePeriodNotFinished()); + _cancelDispute(disputeId, dispute); + + if (_isDisputeInConflict(dispute)) { + _cancelDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId]); + } + } + + /// @inheritdoc IDisputeManager + function setArbitrator(address arbitrator) external override onlyOwner { + _setArbitrator(arbitrator); + } + + /// @inheritdoc IDisputeManager + function setDisputePeriod(uint64 disputePeriod) external override onlyOwner { + _setDisputePeriod(disputePeriod); + } + + /// @inheritdoc IDisputeManager + function setDisputeDeposit(uint256 disputeDeposit) external override onlyOwner { + _setDisputeDeposit(disputeDeposit); + } + + /// @inheritdoc IDisputeManager + function setFishermanRewardCut(uint32 fishermanRewardCut_) external override onlyOwner { + _setFishermanRewardCut(fishermanRewardCut_); + } + + /// @inheritdoc IDisputeManager + function setMaxSlashingCut(uint32 maxSlashingCut_) external override onlyOwner { + _setMaxSlashingCut(maxSlashingCut_); + } + + /// @inheritdoc IDisputeManager + function setSubgraphService(address subgraphService_) external override onlyOwner { + _setSubgraphService(subgraphService_); + } + + /// @inheritdoc IDisputeManager + function encodeReceipt(IAttestation.Receipt calldata receipt) external view override returns (bytes32) { + return _encodeReceipt(receipt); + } + + /// @inheritdoc IDisputeManager + function getFishermanRewardCut() external view override returns (uint32) { + return fishermanRewardCut; + } + + /// @inheritdoc IDisputeManager + function getDisputePeriod() external view override returns (uint64) { + return disputePeriod; + } + + /// @inheritdoc IDisputeManager + function getStakeSnapshot(address indexer) external view override returns (uint256) { + return _getStakeSnapshot(indexer); + } + + /// @inheritdoc IDisputeManager + function areConflictingAttestations( + IAttestation.State calldata attestation1, + IAttestation.State calldata attestation2 + ) external pure override returns (bool) { + return Attestation.areConflicting(attestation1, attestation2); + } + + /// @inheritdoc IDisputeManager + function getAttestationIndexer(IAttestation.State memory attestation) public view returns (address) { + // Get attestation signer. Indexers signs with the allocationId + address allocationId = _recoverSigner(attestation); + + IAllocation.State memory alloc = _getSubgraphService().getAllocation(allocationId); + require(alloc.indexer != address(0), DisputeManagerIndexerNotFound(allocationId)); + require( + alloc.subgraphDeploymentId == attestation.subgraphDeploymentId, + DisputeManagerNonMatchingSubgraphDeployment(alloc.subgraphDeploymentId, attestation.subgraphDeploymentId) + ); + return alloc.indexer; + } + + /// @inheritdoc IDisputeManager + function isDisputeCreated(bytes32 disputeId) public view override returns (bool) { + return disputes[disputeId].status != DisputeStatus.Null; + } + + /** + * @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 + * @param _fisherman Creator of dispute + * @param _deposit Amount of tokens staked as deposit + * @param _attestation Attestation struct parsed from bytes + * @param _attestationData Attestation bytes submitted by the fisherman + * @return DisputeId + */ + function _createQueryDisputeWithAttestation( + address _fisherman, + uint256 _deposit, + IAttestation.State memory _attestation, + bytes memory _attestationData + ) private returns (bytes32) { + // Get the indexer that signed the attestation + address indexer = getAttestationIndexer(_attestation); + + // Create a disputeId + bytes32 disputeId = keccak256( + abi.encodePacked( + _attestation.requestCID, + _attestation.responseCID, + _attestation.subgraphDeploymentId, + indexer, + _fisherman + ) + ); + + // Only one dispute at a time + require(!isDisputeCreated(disputeId), DisputeManagerDisputeAlreadyCreated(disputeId)); + + // The indexer is disputable + uint256 stakeSnapshot = _getStakeSnapshot(indexer); + require(stakeSnapshot != 0, DisputeManagerZeroTokens()); + + // Store dispute + uint256 cancellableAt = block.timestamp + disputePeriod; + disputes[disputeId] = Dispute( + indexer, + _fisherman, + _deposit, + 0, // no related dispute, + DisputeType.QueryDispute, + IDisputeManager.DisputeStatus.Pending, + block.timestamp, + cancellableAt, + stakeSnapshot + ); + + emit QueryDisputeCreated( + disputeId, + indexer, + _fisherman, + _deposit, + _attestation.subgraphDeploymentId, + _attestationData, + cancellableAt, + stakeSnapshot + ); + + return disputeId; + } + + /** + * @notice Create indexing dispute internal function. + * @param _fisherman The fisherman creating the dispute + * @param _deposit Amount of tokens staked as deposit + * @param _allocationId Allocation disputed + * @param _poi The POI being disputed + * @param _blockNumber The block number for which the POI was calculated + * @return The dispute id + */ + function _createIndexingDisputeWithAllocation( + address _fisherman, + uint256 _deposit, + address _allocationId, + bytes32 _poi, + uint256 _blockNumber + ) private returns (bytes32) { + // Create a disputeId + bytes32 disputeId = keccak256(abi.encodePacked(_allocationId, _poi, _blockNumber)); + + // Only one dispute for an allocationId at a time + require(!isDisputeCreated(disputeId), DisputeManagerDisputeAlreadyCreated(disputeId)); + + // Allocation must exist + ISubgraphService subgraphService_ = _getSubgraphService(); + IAllocation.State memory alloc = subgraphService_.getAllocation(_allocationId); + address indexer = alloc.indexer; + require(indexer != address(0), DisputeManagerIndexerNotFound(_allocationId)); + + // The indexer must be disputable + uint256 stakeSnapshot = _getStakeSnapshot(indexer); + require(stakeSnapshot != 0, DisputeManagerZeroTokens()); + + // Store dispute + uint256 cancellableAt = block.timestamp + disputePeriod; + disputes[disputeId] = Dispute( + alloc.indexer, + _fisherman, + _deposit, + 0, + DisputeType.IndexingDispute, + IDisputeManager.DisputeStatus.Pending, + block.timestamp, + cancellableAt, + stakeSnapshot + ); + + emit IndexingDisputeCreated( + disputeId, + alloc.indexer, + _fisherman, + _deposit, + _allocationId, + _poi, + _blockNumber, + stakeSnapshot, + cancellableAt + ); + + return disputeId; + } + + /** + * @notice Accept a dispute + * @param _disputeId The id of the dispute + * @param _dispute The dispute + * @param _tokensSlashed The amount of tokens to slash + */ + function _acceptDispute(bytes32 _disputeId, Dispute storage _dispute, uint256 _tokensSlashed) private { + uint256 tokensToReward = _slashIndexer(_dispute.indexer, _tokensSlashed, _dispute.stakeSnapshot); + _dispute.status = IDisputeManager.DisputeStatus.Accepted; + _graphToken().pushTokens(_dispute.fisherman, tokensToReward + _dispute.deposit); + + emit DisputeAccepted(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit + tokensToReward); + } + + /** + * @notice Reject a dispute + * @param _disputeId The id of the dispute + * @param _dispute The dispute + */ + function _rejectDispute(bytes32 _disputeId, Dispute storage _dispute) private { + _dispute.status = IDisputeManager.DisputeStatus.Rejected; + _graphToken().burnTokens(_dispute.deposit); + + emit DisputeRejected(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit); + } + + /** + * @notice Draw a dispute + * @param _disputeId The id of the dispute + * @param _dispute The dispute + */ + function _drawDispute(bytes32 _disputeId, Dispute storage _dispute) private { + _dispute.status = IDisputeManager.DisputeStatus.Drawn; + _graphToken().pushTokens(_dispute.fisherman, _dispute.deposit); + + emit DisputeDrawn(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit); + } + + /** + * @notice Cancel a dispute + * @param _disputeId The id of the dispute + * @param _dispute The dispute + */ + function _cancelDispute(bytes32 _disputeId, Dispute storage _dispute) private { + _dispute.status = IDisputeManager.DisputeStatus.Cancelled; + _graphToken().pushTokens(_dispute.fisherman, _dispute.deposit); + + emit DisputeCancelled(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit); + } + + /** + * @notice Make the subgraph service contract slash the indexer and reward the fisherman. + * Give the fisherman a reward equal to the fishermanRewardCut of slashed amount + * @param _indexer Address of the indexer + * @param _tokensSlash Amount of tokens to slash from the indexer + * @param _tokensStakeSnapshot Snapshot of the indexer's stake at the time of the dispute creation + * @return The amount of tokens rewarded to the fisherman + */ + function _slashIndexer( + address _indexer, + uint256 _tokensSlash, + uint256 _tokensStakeSnapshot + ) private returns (uint256) { + ISubgraphService subgraphService_ = _getSubgraphService(); + + // Get slashable amount for indexer + IHorizonStaking.Provision memory provision = _graphStaking().getProvision(_indexer, address(subgraphService_)); + + // Ensure slash amount is within the cap + uint256 maxTokensSlash = _tokensStakeSnapshot.mulPPM(maxSlashingCut); + require( + _tokensSlash != 0 && _tokensSlash <= maxTokensSlash, + DisputeManagerInvalidTokensSlash(_tokensSlash, maxTokensSlash) + ); + + // Rewards calculation: + // - Rewards can only be extracted from service provider tokens so we grab the minimum between the slash + // amount and indexer's tokens + // - The applied cut is the minimum between the provision's maxVerifierCut and the current fishermanRewardCut. This + // protects the indexer from sudden changes to the fishermanRewardCut while ensuring the slashing does not revert due + // to excessive rewards being requested. + uint256 maxRewardableTokens = MathUtils.min(_tokensSlash, provision.tokens); + uint256 effectiveCut = MathUtils.min(provision.maxVerifierCut, fishermanRewardCut); + uint256 tokensRewards = effectiveCut.mulPPM(maxRewardableTokens); + + subgraphService_.slash(_indexer, abi.encode(_tokensSlash, tokensRewards)); + return tokensRewards; + } + + /** + * @notice Set the arbitrator address. + * @dev Update the arbitrator to `_arbitrator` + * @param _arbitrator The address of the arbitration contract or party + */ + function _setArbitrator(address _arbitrator) private { + require(_arbitrator != address(0), DisputeManagerInvalidZeroAddress()); + arbitrator = _arbitrator; + emit ArbitratorSet(_arbitrator); + } + + /** + * @notice Set the dispute period. + * @dev Update the dispute period to `_disputePeriod` in seconds + * @param _disputePeriod Dispute period in seconds + */ + function _setDisputePeriod(uint64 _disputePeriod) private { + require(_disputePeriod != 0, DisputeManagerDisputePeriodZero()); + disputePeriod = _disputePeriod; + emit DisputePeriodSet(_disputePeriod); + } + + /** + * @notice Set the dispute deposit required to create a dispute. + * @dev Update the dispute deposit to `_disputeDeposit` Graph Tokens + * @param _disputeDeposit The dispute deposit in Graph Tokens + */ + function _setDisputeDeposit(uint256 _disputeDeposit) private { + require(_disputeDeposit >= MIN_DISPUTE_DEPOSIT, DisputeManagerInvalidDisputeDeposit(_disputeDeposit)); + disputeDeposit = _disputeDeposit; + emit DisputeDepositSet(_disputeDeposit); + } + + /** + * @notice Set the reward cut that the fisherman gets when slashing occurs. + * @dev Update the reward cut to `_fishermanRewardCut` + * @param _fishermanRewardCut The fisherman reward cut, in PPM + */ + function _setFishermanRewardCut(uint32 _fishermanRewardCut) private { + require( + _fishermanRewardCut <= MAX_FISHERMAN_REWARD_CUT, + DisputeManagerInvalidFishermanReward(_fishermanRewardCut) + ); + fishermanRewardCut = _fishermanRewardCut; + emit FishermanRewardCutSet(_fishermanRewardCut); + } + + /** + * @notice Set the maximum cut that can be used for slashing indexers. + * @param _maxSlashingCut Max slashing cut, in PPM + */ + function _setMaxSlashingCut(uint32 _maxSlashingCut) private { + require(PPMMath.isValidPPM(_maxSlashingCut), DisputeManagerInvalidMaxSlashingCut(_maxSlashingCut)); + maxSlashingCut = _maxSlashingCut; + emit MaxSlashingCutSet(maxSlashingCut); + } + + /** + * @notice Set the subgraph service address. + * @dev Update the subgraph service to `_subgraphService` + * @param _subgraphService The address of the subgraph service contract + */ + function _setSubgraphService(address _subgraphService) private { + require(_subgraphService != address(0), DisputeManagerInvalidZeroAddress()); + subgraphService = ISubgraphService(_subgraphService); + emit SubgraphServiceSet(_subgraphService); + } + + /** + * @notice Get the address of the subgraph service + * @dev Will revert if the subgraph service is not set + * @return The subgraph service address + */ + function _getSubgraphService() private view returns (ISubgraphService) { + require(address(subgraphService) != address(0), DisputeManagerSubgraphServiceNotSet()); + return subgraphService; + } + + /** + * @notice Returns whether the dispute is for a conflicting attestation or not. + * @param _dispute Dispute + * @return True conflicting attestation dispute + */ + function _isDisputeInConflict(Dispute storage _dispute) private view returns (bool) { + return _dispute.relatedDisputeId != bytes32(0); + } + + /** + * @notice Get the total stake snapshot for and indexer. + * @dev A few considerations: + * - We include both indexer and delegators stake. + * - Thawing stake is not excluded from the snapshot. + * + * Note that the snapshot can be inflated by delegators front-running the dispute creation with a delegation + * to the indexer. Given the snapshot is a cap, the dispute outcome is uncertain and considering the cost of capital + * and slashing risk, this is not a concern. + * @param _indexer Indexer address + * @return Total stake snapshot + */ + function _getStakeSnapshot(address _indexer) private view returns (uint256) { + address subgraphService = address(_getSubgraphService()); + + IHorizonStaking.Provision memory provision = _graphStaking().getProvision(_indexer, subgraphService); + uint256 delegatorsStake = _graphStaking().getDelegationPool(_indexer, subgraphService).tokens; + + return provision.tokens + delegatorsStake; + } +} diff --git a/packages/subgraph-service/contracts/DisputeManagerStorage.sol b/packages/subgraph-service/contracts/DisputeManagerStorage.sol new file mode 100644 index 000000000..7441efd00 --- /dev/null +++ b/packages/subgraph-service/contracts/DisputeManagerStorage.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; + +/** + * @title DisputeManagerStorage + * @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. + */ +abstract contract DisputeManagerV1Storage { + /// @notice The Subgraph Service contract address + ISubgraphService public subgraphService; + + /// @notice The arbitrator is solely in control of arbitrating disputes + address public arbitrator; + + /// @notice dispute period in seconds + uint64 public disputePeriod; + + /// @notice Deposit required to create a Dispute + uint256 public disputeDeposit; + + /// @notice Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute. In PPM. + uint32 public fishermanRewardCut; + + /// @notice Maximum percentage of indexer stake that can be slashed on a dispute. In PPM. + uint32 public maxSlashingCut; + + /// @notice List of disputes created + mapping(bytes32 disputeId => IDisputeManager.Dispute dispute) public disputes; +} diff --git a/packages/subgraph-service/contracts/SubgraphService.sol b/packages/subgraph-service/contracts/SubgraphService.sol new file mode 100644 index 000000000..aeb4eb827 --- /dev/null +++ b/packages/subgraph-service/contracts/SubgraphService.sol @@ -0,0 +1,601 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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"; +import { IRewardsIssuer } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsIssuer.sol"; +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; +import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol"; + +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import { MulticallUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol"; +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { DataServicePausableUpgradeable } from "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol"; +import { DataService } from "@graphprotocol/horizon/contracts/data-service/DataService.sol"; +import { DataServiceFees } from "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol"; +import { Directory } from "./utilities/Directory.sol"; +import { AllocationManager } from "./utilities/AllocationManager.sol"; +import { SubgraphServiceV1Storage } from "./SubgraphServiceStorage.sol"; + +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { Allocation } from "./libraries/Allocation.sol"; + +/** + * @title SubgraphService contract + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +contract SubgraphService is + Initializable, + OwnableUpgradeable, + MulticallUpgradeable, + DataService, + DataServicePausableUpgradeable, + DataServiceFees, + Directory, + AllocationManager, + SubgraphServiceV1Storage, + IRewardsIssuer, + ISubgraphService +{ + using PPMMath for uint256; + using Allocation for mapping(address => IAllocation.State); + using Allocation for IAllocation.State; + using TokenUtils for IGraphToken; + + /** + * @notice Checks that an indexer is registered + * @param indexer The address of the indexer + */ + modifier onlyRegisteredIndexer(address indexer) { + require(bytes(indexers[indexer].url).length > 0, SubgraphServiceIndexerNotRegistered(indexer)); + _; + } + + /** + * @notice Constructor for the SubgraphService contract + * @dev DataService and Directory constructors set a bunch of immutable variables + * @param graphController The address of the Graph Controller contract + * @param disputeManager The address of the DisputeManager contract + * @param graphTallyCollector The address of the GraphTallyCollector contract + * @param curation The address of the Curation contract + */ + constructor( + address graphController, + address disputeManager, + address graphTallyCollector, + address curation + ) DataService(graphController) Directory(address(this), disputeManager, graphTallyCollector, curation) { + _disableInitializers(); + } + + /// @inheritdoc ISubgraphService + function initialize( + address owner, + uint256 minimumProvisionTokens, + uint32 maximumDelegationRatio, + uint256 stakeToFeesRatio_ + ) external initializer { + __Ownable_init(owner); + __Multicall_init(); + __DataService_init(); + __DataServicePausable_init(); + __AllocationManager_init("SubgraphService", "1.0"); + + _setProvisionTokensRange(minimumProvisionTokens, type(uint256).max); + _setDelegationRatio(maximumDelegationRatio); + _setStakeToFeesRatio(stakeToFeesRatio_); + } + + /** + * @notice + * @dev Implements {IDataService.register} + * + * Requirements: + * - The URL must not be empty + * - The provision must be valid according to the subgraph service rules + * + * Emits a {ServiceProviderRegistered} event + * + * @param indexer The address of the indexer to register + * @param data Encoded registration data: + * - string `url`: The URL of the indexer + * - string `geohash`: The geohash of the indexer + * - address `paymentsDestination`: The address where the indexer wants to receive payments. + * Use zero address for automatically restaking payments. + */ + /// @inheritdoc IDataService + function register( + address indexer, + bytes calldata data + ) external override onlyAuthorizedForProvision(indexer) onlyValidProvision(indexer) whenNotPaused { + (string memory url, string memory geohash, address paymentsDestination_) = abi.decode( + data, + (string, string, address) + ); + + require(bytes(url).length > 0, SubgraphServiceEmptyUrl()); + require(bytes(geohash).length > 0, SubgraphServiceEmptyGeohash()); + + // Register the indexer + indexers[indexer] = Indexer({ url: url, geoHash: geohash }); + _setPaymentsDestination(indexer, paymentsDestination_); + + emit ServiceProviderRegistered(indexer, data); + } + + /** + * @notice Accept staged parameters in the provision of a service provider + * @dev Implements {IDataService-acceptProvisionPendingParameters} + * + * Requirements: + * - The indexer must be registered + * - Must have previously staged provision parameters, using {IHorizonStaking-setProvisionParameters} + * - The new provision parameters must be valid according to the subgraph service rules + * + * Emits a {ProvisionPendingParametersAccepted} event + * + * @param indexer The address of the indexer to accept the provision for + */ + /// @inheritdoc IDataService + function acceptProvisionPendingParameters( + address indexer, + bytes calldata + ) external override onlyAuthorizedForProvision(indexer) whenNotPaused { + _acceptProvisionParameters(indexer); + emit ProvisionPendingParametersAccepted(indexer); + } + + /** + * @notice Allocates tokens to subgraph deployment, manifesting the indexer's commitment to index it + * @dev This is the equivalent of the `allocate` function in the legacy Staking contract. + * + * Requirements: + * - The indexer must be registered + * - The provision must be valid according to the subgraph service rules + * - Allocation id cannot be zero + * - Allocation id cannot be reused from the legacy staking contract + * - The indexer must have enough available tokens to allocate + * + * The `allocationProof` is a 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationId)`. + * + * See {AllocationManager-allocate} for more details. + * + * Emits {ServiceStarted} and {AllocationCreated} events + * + * @param indexer The address of the indexer + * @param data Encoded data: + * - bytes32 `subgraphDeploymentId`: The id of the subgraph deployment + * - uint256 `tokens`: The amount of tokens to allocate + * - address `allocationId`: The id of the allocation + * - bytes `allocationProof`: Signed proof of the allocation id address ownership + */ + /// @inheritdoc IDataService + function startService( + address indexer, + bytes calldata data + ) + external + override + onlyAuthorizedForProvision(indexer) + onlyValidProvision(indexer) + onlyRegisteredIndexer(indexer) + whenNotPaused + { + (bytes32 subgraphDeploymentId, uint256 tokens, address allocationId, bytes memory allocationProof) = abi.decode( + data, + (bytes32, uint256, address, bytes) + ); + _allocate(indexer, allocationId, subgraphDeploymentId, tokens, allocationProof, _delegationRatio); + emit ServiceStarted(indexer, data); + } + + /** + * @notice Close an allocation, indicating that the indexer has stopped indexing the subgraph deployment + * @dev This is the equivalent of the `closeAllocation` function in the legacy Staking contract. + * There are a few notable differences with the legacy function: + * - allocations are nowlong lived. All service payments, including indexing rewards, should be collected periodically + * without the need of closing the allocation. Allocations should only be closed when indexers want to reclaim the allocated + * tokens for other purposes. + * - No POI is required to close an allocation. Indexers should present POIs to collect indexing rewards using {collect}. + * + * Requirements: + * - The indexer must be registered + * - Allocation must exist and be open + * + * Emits {ServiceStopped} and {AllocationClosed} events + * + * @param indexer The address of the indexer + * @param data Encoded data: + * - address `allocationId`: The id of the allocation + */ + /// @inheritdoc IDataService + function stopService( + address indexer, + bytes calldata data + ) external override onlyAuthorizedForProvision(indexer) onlyRegisteredIndexer(indexer) whenNotPaused { + address allocationId = abi.decode(data, (address)); + require( + _allocations.get(allocationId).indexer == indexer, + SubgraphServiceAllocationNotAuthorized(indexer, allocationId) + ); + _closeAllocation(allocationId, false); + emit ServiceStopped(indexer, data); + } + + /** + * @notice Collects payment for the service provided by the indexer + * Allows collecting different types of payments such as query fees and indexing rewards. + * It uses Graph Horizon payments protocol to process payments. + * Reverts if the payment type is not supported. + * @dev This function is the equivalent of the `collect` function for query fees and the `closeAllocation` function + * for indexing rewards in the legacy Staking contract. + * + * Requirements: + * - The indexer must be registered + * - The provision must be valid according to the subgraph service rules + * + * Emits a {ServicePaymentCollected} event. Emits payment type specific events. + * + * For query fees, see {SubgraphService-_collectQueryFees} for more details. + * For indexing rewards, see {AllocationManager-_collectIndexingRewards} for more details. + * + * @param indexer The address of the indexer + * @param paymentType The type of payment to collect as defined in {IGraphPayments} + * @param data Encoded data: + * - For query fees: + * - IGraphTallyCollector.SignedRAV `signedRav`: The signed RAV + * - For indexing rewards: + * - address `allocationId`: The id of the allocation + * - bytes32 `poi`: The POI being presented + * - bytes `poiMetadata`: The metadata associated with the POI. See {AllocationManager-_collectIndexingRewards} for more details. + */ + /// @inheritdoc IDataService + function collect( + address indexer, + IGraphPayments.PaymentTypes paymentType, + bytes calldata data + ) + external + override + onlyAuthorizedForProvision(indexer) + onlyValidProvision(indexer) + onlyRegisteredIndexer(indexer) + whenNotPaused + returns (uint256) + { + uint256 paymentCollected = 0; + + if (paymentType == IGraphPayments.PaymentTypes.QueryFee) { + paymentCollected = _collectQueryFees(indexer, data); + } else if (paymentType == IGraphPayments.PaymentTypes.IndexingRewards) { + paymentCollected = _collectIndexingRewards(indexer, data); + } else { + revert SubgraphServiceInvalidPaymentType(paymentType); + } + + emit ServicePaymentCollected(indexer, paymentType, paymentCollected); + return paymentCollected; + } + + /** + * @notice See {IHorizonStaking-slash} for more details. + * @dev Slashing is delegated to the {DisputeManager} contract which is the only one that can call this + * function. + */ + /// @inheritdoc IDataService + function slash(address indexer, bytes calldata data) external override onlyDisputeManager { + (uint256 tokens, uint256 reward) = abi.decode(data, (uint256, uint256)); + _graphStaking().slash(indexer, tokens, reward, address(_disputeManager())); + emit ServiceProviderSlashed(indexer, tokens); + } + + /// @inheritdoc ISubgraphService + function closeStaleAllocation(address allocationId) external override whenNotPaused { + IAllocation.State memory allocation = _allocations.get(allocationId); + require(allocation.isStale(maxPOIStaleness), SubgraphServiceCannotForceCloseAllocation(allocationId)); + require(!allocation.isAltruistic(), SubgraphServiceAllocationIsAltruistic(allocationId)); + _closeAllocation(allocationId, true); + } + + /// @inheritdoc ISubgraphService + function resizeAllocation( + address indexer, + address allocationId, + uint256 tokens + ) + external + onlyAuthorizedForProvision(indexer) + onlyValidProvision(indexer) + onlyRegisteredIndexer(indexer) + whenNotPaused + { + require( + _allocations.get(allocationId).indexer == indexer, + SubgraphServiceAllocationNotAuthorized(indexer, allocationId) + ); + _resizeAllocation(allocationId, tokens, _delegationRatio); + } + + /// @inheritdoc ISubgraphService + function migrateLegacyAllocation( + address indexer, + address allocationId, + bytes32 subgraphDeploymentID + ) external override onlyOwner { + _migrateLegacyAllocation(indexer, allocationId, subgraphDeploymentID); + } + + /// @inheritdoc ISubgraphService + function setPauseGuardian(address pauseGuardian, bool allowed) external override onlyOwner { + _setPauseGuardian(pauseGuardian, allowed); + } + + /// @inheritdoc ISubgraphService + function setPaymentsDestination(address paymentsDestination_) external override { + _setPaymentsDestination(msg.sender, paymentsDestination_); + } + + /// @inheritdoc ISubgraphService + function setMinimumProvisionTokens(uint256 minimumProvisionTokens) external override onlyOwner { + _setProvisionTokensRange(minimumProvisionTokens, DEFAULT_MAX_PROVISION_TOKENS); + } + + /// @inheritdoc ISubgraphService + function setDelegationRatio(uint32 delegationRatio) external override onlyOwner { + _setDelegationRatio(delegationRatio); + } + + /// @inheritdoc ISubgraphService + function setStakeToFeesRatio(uint256 stakeToFeesRatio_) external override onlyOwner { + _setStakeToFeesRatio(stakeToFeesRatio_); + } + + /// @inheritdoc ISubgraphService + function setMaxPOIStaleness(uint256 maxPOIStaleness_) external override onlyOwner { + _setMaxPOIStaleness(maxPOIStaleness_); + } + + /// @inheritdoc ISubgraphService + function setCurationCut(uint256 curationCut) external override onlyOwner { + require(PPMMath.isValidPPM(curationCut), SubgraphServiceInvalidCurationCut(curationCut)); + curationFeesCut = curationCut; + emit CurationCutSet(curationCut); + } + + /// @inheritdoc ISubgraphService + function getAllocation(address allocationId) external view override returns (IAllocation.State memory) { + return _allocations[allocationId]; + } + + /// @inheritdoc IRewardsIssuer + function getAllocationData( + address allocationId + ) external view override returns (bool, address, bytes32, uint256, uint256, uint256) { + IAllocation.State memory allo = _allocations[allocationId]; + return ( + allo.isOpen(), + allo.indexer, + allo.subgraphDeploymentId, + allo.tokens, + allo.accRewardsPerAllocatedToken, + allo.accRewardsPending + ); + } + + /// @inheritdoc IRewardsIssuer + function getSubgraphAllocatedTokens(bytes32 subgraphDeploymentId) external view override returns (uint256) { + return _subgraphAllocatedTokens[subgraphDeploymentId]; + } + + /// @inheritdoc ISubgraphService + function getLegacyAllocation(address allocationId) external view override returns (ILegacyAllocation.State memory) { + return _legacyAllocations[allocationId]; + } + + /// @inheritdoc ISubgraphService + function getDisputeManager() external view override returns (address) { + return address(_disputeManager()); + } + + /// @inheritdoc ISubgraphService + function getGraphTallyCollector() external view override returns (address) { + return address(_graphTallyCollector()); + } + + /// @inheritdoc ISubgraphService + function getCuration() external view override returns (address) { + return address(_curation()); + } + + /// @inheritdoc ISubgraphService + function encodeAllocationProof(address indexer, address allocationId) external view override returns (bytes32) { + return _encodeAllocationProof(indexer, allocationId); + } + + /// @inheritdoc ISubgraphService + function isOverAllocated(address indexer) external view override returns (bool) { + return _isOverAllocated(indexer, _delegationRatio); + } + + /** + * @notice Sets the payments destination for an indexer to receive payments + * @dev Emits a {PaymentsDestinationSet} event + * @param _indexer The address of the indexer + * @param _paymentsDestination The address where payments should be sent + */ + function _setPaymentsDestination(address _indexer, address _paymentsDestination) internal { + paymentsDestination[_indexer] = _paymentsDestination; + emit PaymentsDestinationSet(_indexer, _paymentsDestination); + } + + // -- Data service parameter getters -- + /** + * @notice Getter for the accepted thawing period range for provisions + * The accepted range is just the dispute period defined by {DisputeManager-getDisputePeriod} + * @dev This override ensures {ProvisionManager} uses the thawing period from the {DisputeManager} + * @return The minimum thawing period - the dispute period + * @return The maximum thawing period - the dispute period + */ + function _getThawingPeriodRange() internal view override returns (uint64, uint64) { + uint64 disputePeriod = _disputeManager().getDisputePeriod(); + return (disputePeriod, disputePeriod); + } + + /** + * @notice Getter for the accepted verifier cut range for provisions + * @return The minimum verifier cut which is defined by the fisherman reward cut {DisputeManager-getFishermanRewardCut} + * @return The maximum is 100% in PPM + */ + function _getVerifierCutRange() internal view override returns (uint32, uint32) { + return (_disputeManager().getFishermanRewardCut(), DEFAULT_MAX_VERIFIER_CUT); + } + + /** + * @notice Collect query fees + * Stake equal to the amount being collected times the `stakeToFeesRatio` is locked into a stake claim. + * This claim can be released at a later stage once expired. + * + * It's important to note that before collecting this function will attempt to release any expired stake claims. + * This could lead to an out of gas error if there are too many expired claims. In that case, the indexer will need to + * manually release the claims, see {IDataServiceFees-releaseStake}, before attempting to collect again. + * + * @dev This function is the equivalent of the legacy `collect` function for query fees. + * @dev Uses the {GraphTallyCollector} to collect payment from Graph Horizon payments protocol. + * Fees are distributed to service provider and delegators by {GraphPayments}, though curators + * share is distributed by this function. + * + * Query fees can be collected on closed allocations. + * + * Requirements: + * - Indexer must have enough available tokens to lock as economic security for fees + * + * Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released. + * Emits a {StakeClaimLocked} event. + * Emits a {QueryFeesCollected} event. + * + * @param _indexer The address of the indexer + * @param _data Encoded data: + * - IGraphTallyCollector.SignedRAV `signedRav`: The signed RAV + * - uint256 `tokensToCollect`: The amount of tokens to collect. Allows partially collecting a RAV. If 0, the entire RAV will + * be collected. + * @return The amount of fees collected + */ + function _collectQueryFees(address _indexer, bytes calldata _data) private returns (uint256) { + (IGraphTallyCollector.SignedRAV memory signedRav, uint256 tokensToCollect) = abi.decode( + _data, + (IGraphTallyCollector.SignedRAV, uint256) + ); + require( + signedRav.rav.serviceProvider == _indexer, + SubgraphServiceIndexerMismatch(signedRav.rav.serviceProvider, _indexer) + ); + + // Check that collectionId (256 bits) is a valid address (160 bits) + // collectionId is expected to be a zero padded address so it's safe to cast to uint160 + require( + uint256(signedRav.rav.collectionId) <= type(uint160).max, + SubgraphServiceInvalidCollectionId(signedRav.rav.collectionId) + ); + address allocationId = address(uint160(uint256(signedRav.rav.collectionId))); + IAllocation.State memory allocation = _allocations.get(allocationId); + + // Check RAV is consistent - RAV indexer must match the allocation's indexer + require(allocation.indexer == _indexer, SubgraphServiceInvalidRAV(_indexer, allocation.indexer)); + bytes32 subgraphDeploymentId = allocation.subgraphDeploymentId; + + // release expired stake claims + _releaseStake(_indexer, 0); + + // Collect from GraphPayments - only curators cut is sent back to the subgraph service + uint256 tokensCollected; + uint256 tokensCurators; + { + uint256 balanceBefore = _graphToken().balanceOf(address(this)); + + tokensCollected = _graphTallyCollector().collect( + IGraphPayments.PaymentTypes.QueryFee, + _encodeGraphTallyData(signedRav, _curation().isCurated(subgraphDeploymentId) ? curationFeesCut : 0), + tokensToCollect + ); + + uint256 balanceAfter = _graphToken().balanceOf(address(this)); + require(balanceAfter >= balanceBefore, SubgraphServiceInconsistentCollection(balanceBefore, balanceAfter)); + tokensCurators = balanceAfter - balanceBefore; + } + + if (tokensCollected > 0) { + // lock stake as economic security for fees + _lockStake( + _indexer, + tokensCollected * stakeToFeesRatio, + block.timestamp + _disputeManager().getDisputePeriod() + ); + + if (tokensCurators > 0) { + // curation collection changes subgraph signal so we take rewards snapshot + _graphRewardsManager().onSubgraphSignalUpdate(subgraphDeploymentId); + + // Send GRT and bookkeep by calling collect() + _graphToken().pushTokens(address(_curation()), tokensCurators); + _curation().collect(subgraphDeploymentId, tokensCurators); + } + } + + emit QueryFeesCollected( + _indexer, + signedRav.rav.payer, + allocationId, + subgraphDeploymentId, + tokensCollected, + tokensCurators + ); + return tokensCollected; + } + + /** + * @notice Collect indexing rewards + * @param _indexer The address of the indexer + * @param _data Encoded data: + * - address `allocationId`: The id of the allocation + * - bytes32 `poi`: The POI being presented + * - bytes `poiMetadata`: The metadata associated with the POI. See {AllocationManager-_presentPOI} for more details. + * @return The amount of indexing rewards collected + */ + function _collectIndexingRewards(address _indexer, bytes calldata _data) private returns (uint256) { + (address allocationId, bytes32 poi_, bytes memory poiMetadata_) = abi.decode(_data, (address, bytes32, bytes)); + require( + _allocations.get(allocationId).indexer == _indexer, + SubgraphServiceAllocationNotAuthorized(_indexer, allocationId) + ); + return _presentPOI(allocationId, poi_, poiMetadata_, _delegationRatio, paymentsDestination[_indexer]); + } + + /** + * @notice Set the stake to fees ratio. + * @param _stakeToFeesRatio The stake to fees ratio + */ + function _setStakeToFeesRatio(uint256 _stakeToFeesRatio) private { + require(_stakeToFeesRatio != 0, SubgraphServiceInvalidZeroStakeToFeesRatio()); + stakeToFeesRatio = _stakeToFeesRatio; + emit StakeToFeesRatioSet(_stakeToFeesRatio); + } + + /** + * @notice Encodes the data for the GraphTallyCollector + * @dev The purpose of this function is just to avoid stack too deep errors + * @param _signedRav The signed RAV + * @param _curationCut The curation cut + * @return The encoded data + */ + function _encodeGraphTallyData( + IGraphTallyCollector.SignedRAV memory _signedRav, + uint256 _curationCut + ) private view returns (bytes memory) { + return abi.encode(_signedRav, _curationCut, paymentsDestination[_signedRav.rav.serviceProvider]); + } +} diff --git a/packages/subgraph-service/contracts/SubgraphServiceStorage.sol b/packages/subgraph-service/contracts/SubgraphServiceStorage.sol new file mode 100644 index 000000000..133963347 --- /dev/null +++ b/packages/subgraph-service/contracts/SubgraphServiceStorage.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +abstract contract SubgraphServiceV1Storage { + /// @notice Service providers registered in the data service + mapping(address indexer => ISubgraphService.Indexer details) public indexers; + + ///@notice Multiplier for how many tokens back collected query fees + uint256 public stakeToFeesRatio; + + /// @notice The cut curators take from query fee payments. In PPM. + uint256 public curationFeesCut; + + /// @notice Destination of indexer payments + mapping(address indexer => address destination) public paymentsDestination; +} diff --git a/packages/subgraph-service/contracts/libraries/Allocation.sol b/packages/subgraph-service/contracts/libraries/Allocation.sol new file mode 100644 index 000000000..88f7195b8 --- /dev/null +++ b/packages/subgraph-service/contracts/libraries/Allocation.sol @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; + +import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; + +/** + * @title Allocation library + * @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. + */ +library Allocation { + using Allocation for IAllocation.State; + + /** + * @notice Create a new allocation + * @dev Requirements: + * - The allocation must not exist + * @param self The allocation list mapping + * @param indexer The indexer that owns the allocation + * @param allocationId The allocation id + * @param subgraphDeploymentId The subgraph deployment id the allocation is for + * @param tokens The number of tokens allocated + * @param accRewardsPerAllocatedToken The initial accumulated rewards per allocated token + * @param createdAtEpoch The epoch when the allocation was created + * @return The allocation + */ + function create( + mapping(address => IAllocation.State) storage self, + address indexer, + address allocationId, + bytes32 subgraphDeploymentId, + uint256 tokens, + uint256 accRewardsPerAllocatedToken, + uint256 createdAtEpoch + ) internal returns (IAllocation.State memory) { + require(!self[allocationId].exists(), IAllocation.AllocationAlreadyExists(allocationId)); + + IAllocation.State memory allocation = IAllocation.State({ + indexer: indexer, + subgraphDeploymentId: subgraphDeploymentId, + tokens: tokens, + createdAt: block.timestamp, + closedAt: 0, + lastPOIPresentedAt: 0, + accRewardsPerAllocatedToken: accRewardsPerAllocatedToken, + accRewardsPending: 0, + createdAtEpoch: createdAtEpoch + }); + + self[allocationId] = allocation; + + return allocation; + } + + /** + * @notice Present a POI for an allocation + * @dev It only updates the last POI presented timestamp. + * Requirements: + * - The allocation must be open + * @param self The allocation list mapping + * @param allocationId The allocation id + */ + function presentPOI(mapping(address => IAllocation.State) storage self, address allocationId) internal { + IAllocation.State storage allocation = _get(self, allocationId); + require(allocation.isOpen(), IAllocation.AllocationClosed(allocationId, allocation.closedAt)); + allocation.lastPOIPresentedAt = block.timestamp; + } + + /** + * @notice Update the accumulated rewards per allocated token for an allocation + * @dev Requirements: + * - The allocation must be open + * @param self The allocation list mapping + * @param allocationId The allocation id + * @param accRewardsPerAllocatedToken The new accumulated rewards per allocated token + */ + function snapshotRewards( + mapping(address => IAllocation.State) storage self, + address allocationId, + uint256 accRewardsPerAllocatedToken + ) internal { + IAllocation.State storage allocation = _get(self, allocationId); + require(allocation.isOpen(), IAllocation.AllocationClosed(allocationId, allocation.closedAt)); + allocation.accRewardsPerAllocatedToken = accRewardsPerAllocatedToken; + } + + /** + * @notice Update the accumulated rewards pending to be claimed for an allocation + * @dev Requirements: + * - The allocation must be open + * @param self The allocation list mapping + * @param allocationId The allocation id + */ + function clearPendingRewards(mapping(address => IAllocation.State) storage self, address allocationId) internal { + IAllocation.State storage allocation = _get(self, allocationId); + require(allocation.isOpen(), IAllocation.AllocationClosed(allocationId, allocation.closedAt)); + allocation.accRewardsPending = 0; + } + + /** + * @notice Close an allocation + * @dev Requirements: + * - The allocation must be open + * @param self The allocation list mapping + * @param allocationId The allocation id + */ + function close(mapping(address => IAllocation.State) storage self, address allocationId) internal { + IAllocation.State storage allocation = _get(self, allocationId); + require(allocation.isOpen(), IAllocation.AllocationClosed(allocationId, allocation.closedAt)); + allocation.closedAt = block.timestamp; + } + + /** + * @notice Get an allocation + * @param self The allocation list mapping + * @param allocationId The allocation id + * @return The allocation + */ + function get( + mapping(address => IAllocation.State) storage self, + address allocationId + ) internal view returns (IAllocation.State memory) { + return _get(self, allocationId); + } + + /** + * @notice Checks if an allocation is stale + * @param self The allocation + * @param staleThreshold The time in blocks to consider an allocation stale + * @return True if the allocation is stale + */ + function isStale(IAllocation.State memory self, uint256 staleThreshold) internal view returns (bool) { + uint256 timeSinceLastPOI = block.timestamp - Math.max(self.createdAt, self.lastPOIPresentedAt); + return self.isOpen() && timeSinceLastPOI > staleThreshold; + } + + /** + * @notice Checks if an allocation exists + * @param self The allocation + * @return True if the allocation exists + */ + function exists(IAllocation.State memory self) internal pure returns (bool) { + return self.createdAt != 0; + } + + /** + * @notice Checks if an allocation is open + * @param self The allocation + * @return True if the allocation is open + */ + function isOpen(IAllocation.State memory self) internal pure returns (bool) { + return self.exists() && self.closedAt == 0; + } + + /** + * @notice Checks if an allocation is alturistic + * @param self The allocation + * @return True if the allocation is alturistic + */ + function isAltruistic(IAllocation.State memory self) internal pure returns (bool) { + return self.exists() && self.tokens == 0; + } + + /** + * @notice Get the allocation for an allocation id + * @dev Reverts if the allocation does not exist + * @param self The allocation list mapping + * @param allocationId The allocation id + * @return The allocation + */ + function _get( + mapping(address => IAllocation.State) storage self, + address allocationId + ) private view returns (IAllocation.State storage) { + IAllocation.State storage allocation = self[allocationId]; + require(allocation.exists(), IAllocation.AllocationDoesNotExist(allocationId)); + return allocation; + } +} diff --git a/packages/subgraph-service/contracts/libraries/Attestation.sol b/packages/subgraph-service/contracts/libraries/Attestation.sol new file mode 100644 index 000000000..d821fbfbc --- /dev/null +++ b/packages/subgraph-service/contracts/libraries/Attestation.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; + +/** + * @title Attestation library + * @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. + */ +library Attestation { + /// @notice Attestation size is the sum of the receipt (96) + signature (65) + uint256 private constant RECEIPT_SIZE_BYTES = 96; + + /// @notice The length of the r value of the signature + uint256 private constant SIG_R_LENGTH = 32; + + /// @notice The length of the s value of the signature + uint256 private constant SIG_S_LENGTH = 32; + + /// @notice The length of the v value of the signature + uint256 private constant SIG_V_LENGTH = 1; + + /// @notice The offset of the r value of the signature + uint256 private constant SIG_R_OFFSET = RECEIPT_SIZE_BYTES; + + /// @notice The offset of the s value of the signature + uint256 private constant SIG_S_OFFSET = RECEIPT_SIZE_BYTES + SIG_R_LENGTH; + + /// @notice The offset of the v value of the signature + uint256 private constant SIG_V_OFFSET = RECEIPT_SIZE_BYTES + SIG_R_LENGTH + SIG_S_LENGTH; + + /// @notice The size of the signature + uint256 private constant SIG_SIZE_BYTES = SIG_R_LENGTH + SIG_S_LENGTH + SIG_V_LENGTH; + + /// @notice The size of the attestation + uint256 private constant ATTESTATION_SIZE_BYTES = RECEIPT_SIZE_BYTES + SIG_SIZE_BYTES; + + /// @notice The length of the uint8 value + uint256 private constant UINT8_BYTE_LENGTH = 1; + + /// @notice The length of the bytes32 value + uint256 private constant BYTES32_BYTE_LENGTH = 32; + + /** + * @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 + */ + function areConflicting( + IAttestation.State memory _attestation1, + IAttestation.State memory _attestation2 + ) internal pure returns (bool) { + return (_attestation1.requestCID == _attestation2.requestCID && + _attestation1.subgraphDeploymentId == _attestation2.subgraphDeploymentId && + _attestation1.responseCID != _attestation2.responseCID); + } + + /** + * @dev Parse the bytes attestation into a struct from `_data`. + * @param _data The bytes to parse + * @return Attestation struct + */ + function parse(bytes memory _data) internal pure returns (IAttestation.State memory) { + // Check attestation data length + require( + _data.length == ATTESTATION_SIZE_BYTES, + IAttestation.AttestationInvalidBytesLength(_data.length, ATTESTATION_SIZE_BYTES) + ); + + // Decode receipt + (bytes32 requestCID, bytes32 responseCID, bytes32 subgraphDeploymentId) = abi.decode( + _data, + (bytes32, bytes32, bytes32) + ); + + // Decode signature + // Signature is expected to be in the order defined in the Attestation struct + bytes32 r = _toBytes32(_data, SIG_R_OFFSET); + bytes32 s = _toBytes32(_data, SIG_S_OFFSET); + uint8 v = _toUint8(_data, SIG_V_OFFSET); + + return IAttestation.State(requestCID, responseCID, subgraphDeploymentId, r, s, v); + } + + /** + * @dev Parse a uint8 from `_bytes` starting at offset `_start`. + * @param _bytes The bytes to parse + * @param _start The start offset + * @return uint8 value + */ + function _toUint8(bytes memory _bytes, uint256 _start) private pure returns (uint8) { + require( + _bytes.length >= _start + UINT8_BYTE_LENGTH, + IAttestation.AttestationInvalidBytesLength(_bytes.length, _start + UINT8_BYTE_LENGTH) + ); + uint8 tempUint; + + // solhint-disable-next-line no-inline-assembly + assembly { + // Load the 32-byte word from memory starting at `_bytes + _start + 1` + // The `0x1` accounts for the fact that we want only the first byte (uint8) + // of the loaded 32 bytes. + tempUint := mload(add(add(_bytes, 0x1), _start)) + } + + return tempUint; + } + + /** + * @dev Parse a bytes32 from `_bytes` starting at offset `_start`. + * @param _bytes The bytes to parse + * @param _start The start offset + * @return bytes32 value + */ + function _toBytes32(bytes memory _bytes, uint256 _start) private pure returns (bytes32) { + require( + _bytes.length >= _start + BYTES32_BYTE_LENGTH, + IAttestation.AttestationInvalidBytesLength(_bytes.length, _start + BYTES32_BYTE_LENGTH) + ); + bytes32 tempBytes32; + + // solhint-disable-next-line no-inline-assembly + assembly { + tempBytes32 := mload(add(add(_bytes, 0x20), _start)) + } + + return tempBytes32; + } +} diff --git a/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol b/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol new file mode 100644 index 000000000..2d73abd91 --- /dev/null +++ b/packages/subgraph-service/contracts/libraries/LegacyAllocation.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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. + * @custom:security-contact Please email security+contracts@thegraph.com if you find any + * bugs. We may have an active bug bounty program. + */ +library LegacyAllocation { + using LegacyAllocation for ILegacyAllocation.State; + + /** + * @notice Migrate a legacy allocation + * @dev Requirements: + * - The allocation must not have been previously migrated + * @param self The legacy allocation list mapping + * @param indexer The indexer that owns the allocation + * @param allocationId The allocation id + * @param subgraphDeploymentId The subgraph deployment id the allocation is for + * @custom:error LegacyAllocationAlreadyMigrated if the allocation has already been migrated + */ + function migrate( + mapping(address => ILegacyAllocation.State) storage self, + address indexer, + address allocationId, + bytes32 subgraphDeploymentId + ) internal { + require(!self[allocationId].exists(), ILegacyAllocation.LegacyAllocationAlreadyExists(allocationId)); + + self[allocationId] = ILegacyAllocation.State({ indexer: indexer, subgraphDeploymentId: subgraphDeploymentId }); + } + + /** + * @notice Get a legacy allocation + * @param self The legacy allocation list mapping + * @param allocationId The allocation id + * @return The legacy allocation details + */ + function get( + mapping(address => ILegacyAllocation.State) storage self, + address allocationId + ) internal view returns (ILegacyAllocation.State memory) { + return _get(self, allocationId); + } + + /** + * @notice Revert if a legacy allocation exists + * @dev We first check the migrated mapping then the old staking contract. + * @dev TRANSITION PERIOD: after the transition period when all the allocations are migrated we can + * remove the call to the staking contract. + * @param self The legacy allocation list mapping + * @param graphStaking The Horizon Staking contract + * @param allocationId The allocation id + */ + function revertIfExists( + mapping(address => ILegacyAllocation.State) storage self, + IHorizonStaking graphStaking, + address allocationId + ) internal view { + require(!self[allocationId].exists(), ILegacyAllocation.LegacyAllocationAlreadyExists(allocationId)); + require( + !graphStaking.isAllocation(allocationId), + ILegacyAllocation.LegacyAllocationAlreadyExists(allocationId) + ); + } + + /** + * @notice Check if a legacy allocation exists + * @param self The legacy allocation + * @return True if the allocation exists + */ + function exists(ILegacyAllocation.State memory self) internal pure returns (bool) { + return self.indexer != address(0); + } + + /** + * @notice Get a legacy allocation + * @param self The legacy allocation list mapping + * @param allocationId The allocation id + * @return The legacy allocation details + */ + function _get( + mapping(address => ILegacyAllocation.State) storage self, + address allocationId + ) private view returns (ILegacyAllocation.State storage) { + ILegacyAllocation.State storage allocation = self[allocationId]; + require(allocation.exists(), ILegacyAllocation.LegacyAllocationDoesNotExist(allocationId)); + return allocation; + } +} diff --git a/packages/subgraph-service/contracts/utilities/AllocationManager.sol b/packages/subgraph-service/contracts/utilities/AllocationManager.sol new file mode 100644 index 000000000..e095b3282 --- /dev/null +++ b/packages/subgraph-service/contracts/utilities/AllocationManager.sol @@ -0,0 +1,479 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; +import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol"; + +import { GraphDirectory } from "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol"; +import { AllocationManagerV1Storage } from "./AllocationManagerStorage.sol"; + +import { TokenUtils } from "@graphprotocol/contracts/contracts/utils/TokenUtils.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { EIP712Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol"; +import { Allocation } from "../libraries/Allocation.sol"; +import { LegacyAllocation } from "../libraries/LegacyAllocation.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { ProvisionTracker } from "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol"; + +/** + * @title AllocationManager contract + * @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 + * bugs. We may have an active bug bounty program. + */ +abstract contract AllocationManager is EIP712Upgradeable, GraphDirectory, AllocationManagerV1Storage { + using ProvisionTracker for mapping(address => uint256); + using Allocation for mapping(address => IAllocation.State); + using Allocation for IAllocation.State; + using LegacyAllocation for mapping(address => ILegacyAllocation.State); + using PPMMath for uint256; + using TokenUtils for IGraphToken; + + ///@dev EIP712 typehash for allocation id proof + bytes32 private constant EIP712_ALLOCATION_ID_PROOF_TYPEHASH = + keccak256("AllocationIdProof(address indexer,address allocationId)"); + + /** + * @notice Emitted when an indexer creates an allocation + * @param indexer The address of the indexer + * @param allocationId The id of the allocation + * @param subgraphDeploymentId The id of the subgraph deployment + * @param tokens The amount of tokens allocated + * @param currentEpoch The current epoch + */ + event AllocationCreated( + address indexed indexer, + address indexed allocationId, + bytes32 indexed subgraphDeploymentId, + uint256 tokens, + uint256 currentEpoch + ); + + /** + * @notice Emitted when an indexer collects indexing rewards for an allocation + * @param indexer The address of the indexer + * @param allocationId The id of the allocation + * @param subgraphDeploymentId The id of the subgraph deployment + * @param tokensRewards The amount of tokens collected + * @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 + */ + event IndexingRewardsCollected( + address indexed indexer, + address indexed allocationId, + bytes32 indexed subgraphDeploymentId, + uint256 tokensRewards, + uint256 tokensIndexerRewards, + uint256 tokensDelegationRewards, + bytes32 poi, + bytes poiMetadata, + uint256 currentEpoch + ); + + /** + * @notice Emitted when an indexer resizes an allocation + * @param indexer The address of the indexer + * @param allocationId The id of the allocation + * @param subgraphDeploymentId The id of the subgraph deployment + * @param newTokens The new amount of tokens allocated + * @param oldTokens The old amount of tokens allocated + */ + event AllocationResized( + address indexed indexer, + address indexed allocationId, + bytes32 indexed subgraphDeploymentId, + uint256 newTokens, + uint256 oldTokens + ); + + /** + * @dev 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 + * @param tokens The amount of tokens allocated + * @param forceClosed Whether the allocation was force closed + */ + event AllocationClosed( + address indexed indexer, + address indexed allocationId, + bytes32 indexed subgraphDeploymentId, + uint256 tokens, + bool forceClosed + ); + + /** + * @notice Emitted when a legacy allocation is migrated into the subgraph service + * @param indexer The address of the indexer + * @param allocationId The id of the allocation + * @param subgraphDeploymentId The id of the subgraph deployment + */ + event LegacyAllocationMigrated( + address indexed indexer, + address indexed allocationId, + bytes32 indexed subgraphDeploymentId + ); + + /** + * @notice Emitted when the maximum POI staleness is updated + * @param maxPOIStaleness The max POI staleness in seconds + */ + event MaxPOIStalenessSet(uint256 maxPOIStaleness); + + /** + * @notice Thrown when an allocation proof is invalid + * Both `signer` and `allocationId` should match for a valid proof. + * @param signer The address that signed the proof + * @param allocationId The id of the allocation + */ + error AllocationManagerInvalidAllocationProof(address signer, address allocationId); + + /** + * @notice Thrown when attempting to create an allocation with a zero allocation id + */ + error AllocationManagerInvalidZeroAllocationId(); + + /** + * @notice Thrown when attempting to collect indexing rewards on a closed allocationl + * @param allocationId The id of the allocation + */ + error AllocationManagerAllocationClosed(address allocationId); + + /** + * @notice Thrown when attempting to resize an allocation with the same size + * @param allocationId The id of the allocation + * @param tokens The amount of tokens + */ + error AllocationManagerAllocationSameSize(address allocationId, uint256 tokens); + + /** + * @notice Initializes the contract and parent contracts + * @param _name The name to use for EIP712 domain separation + * @param _version The version to use for EIP712 domain separation + */ + function __AllocationManager_init(string memory _name, string memory _version) internal onlyInitializing { + __EIP712_init(_name, _version); + __AllocationManager_init_unchained(); + } + + /** + * @notice Initializes the contract + */ + function __AllocationManager_init_unchained() internal onlyInitializing {} + + /** + * @notice Imports a legacy allocation id into the subgraph service + * This is a governor only action that is required to prevent indexers from re-using allocation ids from the + * legacy staking contract. It will revert with LegacyAllocationAlreadyMigrated if the allocation has already been migrated. + * @param _indexer The address of the indexer + * @param _allocationId The id of the allocation + * @param _subgraphDeploymentId The id of the subgraph deployment + */ + function _migrateLegacyAllocation(address _indexer, address _allocationId, bytes32 _subgraphDeploymentId) internal { + _legacyAllocations.migrate(_indexer, _allocationId, _subgraphDeploymentId); + emit LegacyAllocationMigrated(_indexer, _allocationId, _subgraphDeploymentId); + } + + /** + * @notice Create an allocation + * @dev The `_allocationProof` is a 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationId)` + * + * Requirements: + * - `_allocationId` must not be the zero address + * + * Emits a {AllocationCreated} event + * + * @param _indexer The address of the indexer + * @param _allocationId The id of the allocation to be created + * @param _subgraphDeploymentId The subgraph deployment Id + * @param _tokens The amount of tokens to allocate + * @param _allocationProof Signed proof of allocation id address ownership + * @param _delegationRatio The delegation ratio to consider when locking tokens + */ + function _allocate( + address _indexer, + address _allocationId, + bytes32 _subgraphDeploymentId, + uint256 _tokens, + bytes memory _allocationProof, + uint32 _delegationRatio + ) internal { + require(_allocationId != address(0), AllocationManagerInvalidZeroAllocationId()); + + _verifyAllocationProof(_indexer, _allocationId, _allocationProof); + + // Ensure allocation id is not reused + // need to check both subgraph service (on allocations.create()) and legacy allocations + _legacyAllocations.revertIfExists(_graphStaking(), _allocationId); + + uint256 currentEpoch = _graphEpochManager().currentEpoch(); + IAllocation.State memory allocation = _allocations.create( + _indexer, + _allocationId, + _subgraphDeploymentId, + _tokens, + _graphRewardsManager().onSubgraphAllocationUpdate(_subgraphDeploymentId), + currentEpoch + ); + + // Check that the indexer has enough tokens available + // Note that the delegation ratio ensures overdelegation cannot be used + allocationProvisionTracker.lock(_graphStaking(), _indexer, _tokens, _delegationRatio); + + // Update total allocated tokens for the subgraph deployment + _subgraphAllocatedTokens[allocation.subgraphDeploymentId] = + _subgraphAllocatedTokens[allocation.subgraphDeploymentId] + allocation.tokens; + + emit AllocationCreated(_indexer, _allocationId, _subgraphDeploymentId, allocation.tokens, currentEpoch); + } + + /** + * @notice Present a POI to collect indexing rewards for an allocation + * This function will mint indexing rewards using the {RewardsManager} and distribute them to the indexer and delegators. + * + * Conditions to qualify for indexing rewards: + * - POI must be non-zero + * - POI must not be stale, i.e: older than `maxPOIStaleness` + * - allocation must not be altruistic (allocated tokens = 0) + * - allocation must be open for at least one epoch + * + * Note that indexers are required to periodically (at most every `maxPOIStaleness`) present POIs to collect rewards. + * Rewards will not be issued to stale POIs, which means that indexers are advised to present a zero POI if they are + * unable to present a valid one to prevent being locked out of future rewards. + * + * Note on allocation duration restriction: this is required to ensure that non protocol chains have a valid block number for + * which to calculate POIs. EBO posts once per epoch typically at each epoch change, so we restrict rewards to allocations + * that have gone through at least one epoch change. + * + * Emits a {IndexingRewardsCollected} event. + * + * @param _allocationId The id of the allocation to collect rewards for + * @param _poi The POI being presented + * @param _poiMetadata The metadata associated with the POI. The data and encoding format is for off-chain components to define, this function will only emit the value in an event as-is. + * @param _delegationRatio The delegation ratio to consider when locking tokens + * @param _paymentsDestination The address where indexing rewards should be sent + * @return The amount of tokens collected + */ + function _presentPOI( + address _allocationId, + bytes32 _poi, + bytes memory _poiMetadata, + uint32 _delegationRatio, + address _paymentsDestination + ) internal returns (uint256) { + IAllocation.State memory allocation = _allocations.get(_allocationId); + require(allocation.isOpen(), AllocationManagerAllocationClosed(_allocationId)); + + // Mint indexing rewards if all conditions are met + uint256 tokensRewards = (!allocation.isStale(maxPOIStaleness) && + !allocation.isAltruistic() && + _poi != bytes32(0)) && _graphEpochManager().currentEpoch() > allocation.createdAtEpoch + ? _graphRewardsManager().takeRewards(_allocationId) + : 0; + + // ... but we still take a snapshot to ensure the rewards are not accumulated for the next valid POI + _allocations.snapshotRewards( + _allocationId, + _graphRewardsManager().onSubgraphAllocationUpdate(allocation.subgraphDeploymentId) + ); + _allocations.presentPOI(_allocationId); + + // Any pending rewards should have been collected now + _allocations.clearPendingRewards(_allocationId); + + uint256 tokensIndexerRewards = 0; + uint256 tokensDelegationRewards = 0; + if (tokensRewards != 0) { + // Distribute rewards to delegators + uint256 delegatorCut = _graphStaking().getDelegationFeeCut( + allocation.indexer, + address(this), + IGraphPayments.PaymentTypes.IndexingRewards + ); + IHorizonStakingTypes.DelegationPool memory delegationPool = _graphStaking().getDelegationPool( + allocation.indexer, + address(this) + ); + // If delegation pool has no shares then we don't need to distribute rewards to delegators + tokensDelegationRewards = delegationPool.shares > 0 ? tokensRewards.mulPPM(delegatorCut) : 0; + if (tokensDelegationRewards > 0) { + _graphToken().approve(address(_graphStaking()), tokensDelegationRewards); + _graphStaking().addToDelegationPool(allocation.indexer, address(this), tokensDelegationRewards); + } + + // Distribute rewards to indexer + tokensIndexerRewards = tokensRewards - tokensDelegationRewards; + if (tokensIndexerRewards > 0) { + if (_paymentsDestination == address(0)) { + _graphToken().approve(address(_graphStaking()), tokensIndexerRewards); + _graphStaking().stakeToProvision(allocation.indexer, address(this), tokensIndexerRewards); + } else { + _graphToken().pushTokens(_paymentsDestination, tokensIndexerRewards); + } + } + } + + emit IndexingRewardsCollected( + allocation.indexer, + _allocationId, + allocation.subgraphDeploymentId, + tokensRewards, + tokensIndexerRewards, + tokensDelegationRewards, + _poi, + _poiMetadata, + _graphEpochManager().currentEpoch() + ); + + // Check if the indexer is over-allocated and force close the allocation if necessary + if (_isOverAllocated(allocation.indexer, _delegationRatio)) { + _closeAllocation(_allocationId, true); + } + + return tokensRewards; + } + + /** + * @notice Resize an allocation + * @dev Will lock or release tokens in the provision tracker depending on the new allocation size. + * Rewards accrued but not issued before the resize will be accounted for as pending rewards. + * These will be paid out when the indexer presents a POI. + * + * Requirements: + * - `_indexer` must be the owner of the allocation + * - Allocation must be open + * - `_tokens` must be different from the current allocation size + * + * Emits a {AllocationResized} event. + * + * @param _allocationId The id of the allocation to be resized + * @param _tokens The new amount of tokens to allocate + * @param _delegationRatio The delegation ratio to consider when locking tokens + */ + function _resizeAllocation(address _allocationId, uint256 _tokens, uint32 _delegationRatio) internal { + IAllocation.State memory allocation = _allocations.get(_allocationId); + require(allocation.isOpen(), AllocationManagerAllocationClosed(_allocationId)); + require(_tokens != allocation.tokens, AllocationManagerAllocationSameSize(_allocationId, _tokens)); + + // Update provision tracker + uint256 oldTokens = allocation.tokens; + if (_tokens > oldTokens) { + allocationProvisionTracker.lock(_graphStaking(), allocation.indexer, _tokens - oldTokens, _delegationRatio); + } else { + allocationProvisionTracker.release(allocation.indexer, oldTokens - _tokens); + } + + // Calculate rewards that have been accrued since the last snapshot but not yet issued + uint256 accRewardsPerAllocatedToken = _graphRewardsManager().onSubgraphAllocationUpdate( + allocation.subgraphDeploymentId + ); + uint256 accRewardsPerAllocatedTokenPending = !allocation.isAltruistic() + ? accRewardsPerAllocatedToken - allocation.accRewardsPerAllocatedToken + : 0; + + // Update the allocation + _allocations[_allocationId].tokens = _tokens; + _allocations[_allocationId].accRewardsPerAllocatedToken = accRewardsPerAllocatedToken; + _allocations[_allocationId].accRewardsPending += _graphRewardsManager().calcRewards( + oldTokens, + accRewardsPerAllocatedTokenPending + ); + + // Update total allocated tokens for the subgraph deployment + if (_tokens > oldTokens) { + _subgraphAllocatedTokens[allocation.subgraphDeploymentId] += (_tokens - oldTokens); + } else { + _subgraphAllocatedTokens[allocation.subgraphDeploymentId] -= (oldTokens - _tokens); + } + + emit AllocationResized(allocation.indexer, _allocationId, allocation.subgraphDeploymentId, _tokens, oldTokens); + } + + /** + * @notice Close an allocation + * Does not require presenting a POI, use {_collectIndexingRewards} to present a POI and collect rewards + * @dev Note that allocations are nowlong lived. All service payments, including indexing rewards, should be collected periodically + * without the need of closing the allocation. Allocations should only be closed when indexers want to reclaim the allocated + * tokens for other purposes. + * + * Emits a {AllocationClosed} event + * + * @param _allocationId The id of the allocation to be closed + * @param _forceClosed Whether the allocation was force closed + */ + function _closeAllocation(address _allocationId, bool _forceClosed) internal { + IAllocation.State memory allocation = _allocations.get(_allocationId); + + // Take rewards snapshot to prevent other allos from counting tokens from this allo + _allocations.snapshotRewards( + _allocationId, + _graphRewardsManager().onSubgraphAllocationUpdate(allocation.subgraphDeploymentId) + ); + + _allocations.close(_allocationId); + allocationProvisionTracker.release(allocation.indexer, allocation.tokens); + + // Update total allocated tokens for the subgraph deployment + _subgraphAllocatedTokens[allocation.subgraphDeploymentId] = + _subgraphAllocatedTokens[allocation.subgraphDeploymentId] - allocation.tokens; + + emit AllocationClosed( + allocation.indexer, + _allocationId, + allocation.subgraphDeploymentId, + allocation.tokens, + _forceClosed + ); + } + + /** + * @notice Sets the maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards + * @dev Emits a {MaxPOIStalenessSet} event + * @param _maxPOIStaleness The max POI staleness in seconds + */ + function _setMaxPOIStaleness(uint256 _maxPOIStaleness) internal { + maxPOIStaleness = _maxPOIStaleness; + emit MaxPOIStalenessSet(_maxPOIStaleness); + } + + /** + * @notice Encodes the allocation proof for EIP712 signing + * @param _indexer The address of the indexer + * @param _allocationId The id of the allocation + * @return The encoded allocation proof + */ + function _encodeAllocationProof(address _indexer, address _allocationId) internal view returns (bytes32) { + return _hashTypedDataV4(keccak256(abi.encode(EIP712_ALLOCATION_ID_PROOF_TYPEHASH, _indexer, _allocationId))); + } + + /** + * @notice Checks if an allocation is over-allocated + * @param _indexer The address of the indexer + * @param _delegationRatio The delegation ratio to consider when locking tokens + * @return True if the allocation is over-allocated, false otherwise + */ + function _isOverAllocated(address _indexer, uint32 _delegationRatio) internal view returns (bool) { + return !allocationProvisionTracker.check(_graphStaking(), _indexer, _delegationRatio); + } + + /** + * @notice Verifies ownership of an allocation id by verifying an EIP712 allocation proof + * @dev Requirements: + * - Signer must be the allocation id address + * @param _indexer The address of the indexer + * @param _allocationId The id of the allocation + * @param _proof The EIP712 proof, an EIP712 signed message of (indexer,allocationId) + */ + function _verifyAllocationProof(address _indexer, address _allocationId, bytes memory _proof) private view { + address signer = ECDSA.recover(_encodeAllocationProof(_indexer, _allocationId), _proof); + require(signer == _allocationId, AllocationManagerInvalidAllocationProof(signer, _allocationId)); + } +} diff --git a/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol b/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol new file mode 100644 index 000000000..4c0870291 --- /dev/null +++ b/packages/subgraph-service/contracts/utilities/AllocationManagerStorage.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; +import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol"; + +/** + * @title AllocationManagerStorage + * @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. + */ +abstract contract AllocationManagerV1Storage { + /// @notice Allocation details + mapping(address allocationId => IAllocation.State allocation) internal _allocations; + + /// @notice Legacy allocation details + mapping(address allocationId => ILegacyAllocation.State allocation) internal _legacyAllocations; + + /// @notice Tracks allocated tokens per indexer + mapping(address indexer => uint256 tokens) public allocationProvisionTracker; + + /// @notice Maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards + uint256 public maxPOIStaleness; + + /// @notice Track total tokens allocated per subgraph deployment + /// @dev Used to calculate indexing rewards + mapping(bytes32 subgraphDeploymentId => uint256 tokens) internal _subgraphAllocatedTokens; + + /// @dev Gap to allow adding variables in future upgrades + uint256[50] private __gap; +} diff --git a/packages/subgraph-service/contracts/utilities/AttestationManager.sol b/packages/subgraph-service/contracts/utilities/AttestationManager.sol new file mode 100644 index 000000000..f385beeb5 --- /dev/null +++ b/packages/subgraph-service/contracts/utilities/AttestationManager.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; + +import { AttestationManagerV1Storage } from "./AttestationManagerStorage.sol"; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title AttestationManager contract + * @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. + */ +abstract contract AttestationManager is Initializable, AttestationManagerV1Storage { + /// @notice EIP712 type hash for Receipt struct + bytes32 private constant RECEIPT_TYPE_HASH = + keccak256("Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)"); + + /// @notice EIP712 domain type hash + bytes32 private constant DOMAIN_TYPE_HASH = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"); + + /// @notice EIP712 domain name + bytes32 private constant DOMAIN_NAME_HASH = keccak256("Graph Protocol"); + + /// @notice EIP712 domain version + bytes32 private constant DOMAIN_VERSION_HASH = keccak256("0"); + + /// @notice EIP712 domain salt + bytes32 private constant DOMAIN_SALT = 0xa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c2; + + /** + * @dev Initialize the AttestationManager contract and parent contracts + */ + // solhint-disable-next-line func-name-mixedcase + function __AttestationManager_init() internal onlyInitializing { + __AttestationManager_init_unchained(); + } + + /** + * @dev Initialize the AttestationManager contract + */ + // solhint-disable-next-line func-name-mixedcase + function __AttestationManager_init_unchained() internal onlyInitializing { + _domainSeparator = keccak256( + abi.encode( + DOMAIN_TYPE_HASH, + DOMAIN_NAME_HASH, + DOMAIN_VERSION_HASH, + block.chainid, + address(this), + DOMAIN_SALT + ) + ); + } + + /** + * @dev Recover the signer address of the `_attestation`. + * @param _attestation The attestation struct + * @return Signer address + */ + function _recoverSigner(IAttestation.State memory _attestation) internal view returns (address) { + // Obtain the hash of the fully-encoded message, per EIP-712 encoding + IAttestation.Receipt memory receipt = IAttestation.Receipt( + _attestation.requestCID, + _attestation.responseCID, + _attestation.subgraphDeploymentId + ); + bytes32 messageHash = _encodeReceipt(receipt); + + // Obtain the signer of the fully-encoded EIP-712 message hash + // NOTE: The signer of the attestation is the indexer that served the request + return ECDSA.recover(messageHash, abi.encodePacked(_attestation.r, _attestation.s, _attestation.v)); + } + + /** + * @dev Get the message hash that a indexer used to sign the receipt. + * 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 _encodeReceipt(IAttestation.Receipt memory _receipt) internal view returns (bytes32) { + return + keccak256( + abi.encodePacked( + "\x19\x01", // EIP-191 encoding pad, EIP-712 version 1 + _domainSeparator, + keccak256( + abi.encode( + RECEIPT_TYPE_HASH, + _receipt.requestCID, + _receipt.responseCID, + _receipt.subgraphDeploymentId + ) // EIP 712-encoded message hash + ) + ) + ); + } +} diff --git a/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol b/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol new file mode 100644 index 000000000..1c720ec8c --- /dev/null +++ b/packages/subgraph-service/contracts/utilities/AttestationManagerStorage.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +/** + * @title AttestationManagerStorage + * @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. + */ +abstract contract AttestationManagerV1Storage { + /// @dev EIP712 domain separator + bytes32 internal _domainSeparator; + + /// @dev Gap to allow adding variables in future upgrades + uint256[50] private __gap; +} diff --git a/packages/subgraph-service/contracts/utilities/Directory.sol b/packages/subgraph-service/contracts/utilities/Directory.sol new file mode 100644 index 000000000..6b96616f4 --- /dev/null +++ b/packages/subgraph-service/contracts/utilities/Directory.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.27; + +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"; +import { ICuration } from "@graphprotocol/interfaces/contracts/contracts/curation/ICuration.sol"; + +/** + * @title Directory contract + * @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 + * bugs. We may have an active bug bounty program. + */ +abstract contract Directory { + /// @notice The Subgraph Service contract address + ISubgraphService private immutable SUBGRAPH_SERVICE; + + /// @notice The Dispute Manager contract address + IDisputeManager private immutable DISPUTE_MANAGER; + + /// @notice The Graph Tally Collector contract address + /// @dev Required to collect payments via Graph Horizon payments protocol + IGraphTallyCollector private immutable GRAPH_TALLY_COLLECTOR; + + /// @notice The Curation contract address + /// @dev Required for curation fees distribution + ICuration private immutable CURATION; + + /** + * @notice Emitted when the Directory is initialized + * @param subgraphService The Subgraph Service contract address + * @param disputeManager The Dispute Manager contract address + * @param graphTallyCollector The Graph Tally Collector contract address + * @param curation The Curation contract address + */ + event SubgraphServiceDirectoryInitialized( + address subgraphService, + address disputeManager, + address graphTallyCollector, + address curation + ); + + /** + * @notice Thrown when the caller is not the Dispute Manager + * @param caller The caller address + * @param disputeManager The Dispute Manager address + */ + error DirectoryNotDisputeManager(address caller, address disputeManager); + + /** + * @notice Checks that the caller is the Dispute Manager + */ + modifier onlyDisputeManager() { + require( + msg.sender == address(DISPUTE_MANAGER), + DirectoryNotDisputeManager(msg.sender, address(DISPUTE_MANAGER)) + ); + _; + } + + /** + * @notice Constructor for the Directory contract + * @param subgraphService The Subgraph Service contract address + * @param disputeManager The Dispute Manager contract address + * @param graphTallyCollector The Graph Tally Collector contract address + * @param curation The Curation contract address + */ + constructor(address subgraphService, address disputeManager, address graphTallyCollector, address curation) { + SUBGRAPH_SERVICE = ISubgraphService(subgraphService); + DISPUTE_MANAGER = IDisputeManager(disputeManager); + GRAPH_TALLY_COLLECTOR = IGraphTallyCollector(graphTallyCollector); + CURATION = ICuration(curation); + + emit SubgraphServiceDirectoryInitialized(subgraphService, disputeManager, graphTallyCollector, curation); + } + + /** + * @notice Returns the Subgraph Service contract address + * @return The Subgraph Service contract + */ + function _subgraphService() internal view returns (ISubgraphService) { + return SUBGRAPH_SERVICE; + } + + /** + * @notice Returns the Dispute Manager contract address + * @return The Dispute Manager contract + */ + function _disputeManager() internal view returns (IDisputeManager) { + return DISPUTE_MANAGER; + } + + /** + * @notice Returns the Graph Tally Collector contract address + * @return The Graph Tally Collector contract + */ + function _graphTallyCollector() internal view returns (IGraphTallyCollector) { + return GRAPH_TALLY_COLLECTOR; + } + + /** + * @notice Returns the Curation contract address + * @return The Curation contract + */ + function _curation() internal view returns (ICuration) { + return CURATION; + } +} diff --git a/packages/subgraph-service/foundry.toml b/packages/subgraph-service/foundry.toml new file mode 100644 index 000000000..654dd9abe --- /dev/null +++ b/packages/subgraph-service/foundry.toml @@ -0,0 +1,9 @@ +[profile.default] +src = 'contracts' +out = 'build' +libs = ["node_modules"] +test = 'test' +cache_path = 'cache_forge' +fs_permissions = [{ access = "read", path = "./"}] +optimizer = true +optimizer_runs = 100 diff --git a/packages/subgraph-service/hardhat.config.ts b/packages/subgraph-service/hardhat.config.ts new file mode 100644 index 000000000..2aa8b6827 --- /dev/null +++ b/packages/subgraph-service/hardhat.config.ts @@ -0,0 +1,32 @@ +// Hardhat plugins +import '@nomicfoundation/hardhat-foundry' +import '@nomicfoundation/hardhat-toolbox' +import '@nomicfoundation/hardhat-ignition-ethers' +import 'hardhat-contract-sizer' +import 'hardhat-secure-accounts' +import 'solidity-docgen' +import 'hardhat-graph-protocol' + +import { hardhatBaseConfig, isProjectBuilt, loadTasks } from '@graphprotocol/toolshed/hardhat' +import { HardhatUserConfig } from 'hardhat/config' + +// Some tasks need compiled artifacts to run so we avoid loading them when building the project +if (isProjectBuilt(__dirname)) { + loadTasks(__dirname) +} + +const baseConfig = hardhatBaseConfig(require) +const config: HardhatUserConfig = { + ...baseConfig, + solidity: { + version: '0.8.27', + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + }, + }, +} + +export default config diff --git a/packages/subgraph-service/ignition/configs/migrate.default.json5 b/packages/subgraph-service/ignition/configs/migrate.default.json5 new file mode 100644 index 000000000..c81352a2d --- /dev/null +++ b/packages/subgraph-service/ignition/configs/migrate.default.json5 @@ -0,0 +1,36 @@ +{ + "$global": { + // Accounts already configured in the original Graph Protocol - Arbitrum Sepolia values + "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + "arbitrator": "0x1726A5d52e279d02ff4732eCeB2D67BFE5Add328", + "pauseGuardian": "0xa0444508232dA3FA6C2f96a5f105f3f0cc0d20D7", + + // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "curationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "curationImplementationAddress": "0xd90022aB67920212D0F902F5c427DE82732DE136", + "gnsProxyAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + + // Must be set for step 2 of the deployment + "disputeManagerProxyAddress": "", + "disputeManagerProxyAdminAddress": "", + "subgraphServiceProxyAddress": "", + "subgraphServiceProxyAdminAddress": "", + "graphTallyCollectorAddress": "" + }, + "DisputeManager": { + "disputePeriod": 2419200, + "disputeDeposit": "10000000000000000000000n", + "fishermanRewardCut": 500000, + "maxSlashingCut": 1000000, + }, + "SubgraphService": { + "minimumProvisionTokens": "100000000000000000000000n", + "maximumDelegationRatio": 16, + "stakeToFeesRatio": 2, + "maxPOIStaleness": 2419200, // 28 days = 2419200 seconds + "curationCut": 100000, + } +} diff --git a/packages/subgraph-service/ignition/configs/migrate.fork1.json5 b/packages/subgraph-service/ignition/configs/migrate.fork1.json5 new file mode 100644 index 000000000..2fef9940a --- /dev/null +++ b/packages/subgraph-service/ignition/configs/migrate.fork1.json5 @@ -0,0 +1,36 @@ +{ + "$global": { + // Accounts already configured in the original Graph Protocol - Arbitrum Sepolia values + "governor": "0x72ee30d43Fb5A90B3FE983156C5d2fBE6F6d07B3", + "arbitrator": "0x1726A5d52e279d02ff4732eCeB2D67BFE5Add328", + "pauseGuardian": "0xa0444508232dA3FA6C2f96a5f105f3f0cc0d20D7", + + // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "curationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "curationImplementationAddress": "0xd90022aB67920212D0F902F5c427DE82732DE136", + "gnsProxyAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + + // Must be set for step 2 of the deployment + "disputeManagerProxyAddress": "0x1CEBe1C314Cc454baf4bd553409d957C833623c0", + "disputeManagerProxyAdminAddress": "0x1a14fF838e7e06FdabFb20c2553b4ad613aD832b", + "subgraphServiceProxyAddress": "0x8A44C49eD477e7130249d4B8d5248d08B469Bf0d", + "subgraphServiceProxyAdminAddress": "0x7CB6291437029a4cFd28b3455c9e2242767010F3", + "graphTallyCollectorAddress": "0xF2DB533658a1728f3ce04A49Df4b545f4A53b620" + }, + "DisputeManager": { + "disputePeriod": 2419200, + "disputeDeposit": "10000000000000000000000n", + "fishermanRewardCut": 500000, + "maxSlashingCut": 1000000, + }, + "SubgraphService": { + "minimumProvisionTokens": "100000000000000000000000n", + "maximumDelegationRatio": 16, + "stakeToFeesRatio": 2, + "maxPOIStaleness": 2419200, // 28 days = 2419200 seconds + "curationCut": 100000, + } +} diff --git a/packages/subgraph-service/ignition/configs/migrate.integration.json5 b/packages/subgraph-service/ignition/configs/migrate.integration.json5 new file mode 100644 index 000000000..7af88d6eb --- /dev/null +++ b/packages/subgraph-service/ignition/configs/migrate.integration.json5 @@ -0,0 +1,37 @@ +{ + "$global": { + // Accounts for new deployment - derived from local network mnemonic + "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", + "arbitrator": "0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b", + "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", + + // Addresses for contracts deployed in the original Graph Protocol - Arbitrum Sepolia values + "controllerAddress": "0x9DB3ee191681f092607035d9BDA6e59FbEaCa695", + "curationProxyAddress": "0xDe761f075200E75485F4358978FB4d1dC8644FD5", + "curationImplementationAddress": "0xd90022aB67920212D0F902F5c427DE82732DE136", + "gnsProxyAddress": "0x3133948342F35b8699d8F94aeE064AbB76eDe965", + "gnsImplementationAddress": "0x00CBF5024d454255577Bf2b0fB6A43328a6828c9", + "subgraphNFTAddress": "0xF21Df5BbA7EB9b54D8F60C560aFb9bA63e6aED1A", + + + // Must be set for step 2 of the deployment + "disputeManagerProxyAddress": "", + "disputeManagerProxyAdminAddress": "", + "subgraphServiceProxyAddress": "", + "subgraphServiceProxyAdminAddress": "", + "graphTallyCollectorAddress": "" + }, + "DisputeManager": { + "disputePeriod": 2419200, + "disputeDeposit": "10000000000000000000000n", + "fishermanRewardCut": 500000, + "maxSlashingCut": 1000000, + }, + "SubgraphService": { + "minimumProvisionTokens": "100000000000000000000000n", + "maximumDelegationRatio": 16, + "stakeToFeesRatio": 2, + "maxPOIStaleness": 2419200, // 28 days = 2419200 seconds + "curationCut": 100000, + } +} diff --git a/packages/subgraph-service/ignition/configs/protocol.default.json5 b/packages/subgraph-service/ignition/configs/protocol.default.json5 new file mode 100644 index 000000000..77b2ac66e --- /dev/null +++ b/packages/subgraph-service/ignition/configs/protocol.default.json5 @@ -0,0 +1,36 @@ +{ + "$global": { + // Accounts for new deployment - derived from hardhat default mnemonic + "governor": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0", // index 1 + "arbitrator": "0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b", // index 2 + "pauseGuardian": "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d", // index 3 + + // Address of the new controller contract - must be set for step 2 of the deployment + "controllerAddress": "", + "curationProxyAddress": "", + "curationImplementationAddress": "", + "gnsProxyAddress": "", + "gnsImplementationAddress": "", + "subgraphNFTAddress": "", + + // Must be set for step 2 of the deployment + "disputeManagerProxyAddress": "", + "disputeManagerProxyAdminAddress": "", + "subgraphServiceProxyAddress": "", + "subgraphServiceProxyAdminAddress": "", + "graphTallyCollectorAddress": "" + }, + "DisputeManager": { + "disputePeriod": 2419200, + "disputeDeposit": "10000000000000000000000n", + "fishermanRewardCut": 500000, + "maxSlashingCut": 1000000, + }, + "SubgraphService": { + "minimumProvisionTokens": "100000000000000000000000n", + "maximumDelegationRatio": 16, + "stakeToFeesRatio": 2, + "maxPOIStaleness": 2419200, // 28 days = 2419200 seconds + "curationCut": 100000, + } +} diff --git a/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 new file mode 100644 index 000000000..bafa504cc --- /dev/null +++ b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 @@ -0,0 +1,36 @@ +{ + "$global": { + // Accounts for new deployment - derived from local network mnemonic + "governor": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", // index 0 + "arbitrator": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", // index 2 + "pauseGuardian": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", // index 3 + + // Address of the new controller contract - must be set for step 2 of the deployment + "controllerAddress": "", + "curationProxyAddress": "", + "curationImplementationAddress": "", + "gnsProxyAddress": "", + "gnsImplementationAddress": "", + "subgraphNFTAddress": "", + + // Must be set for step 2 of the deployment + "disputeManagerProxyAddress": "", + "disputeManagerProxyAdminAddress": "", + "subgraphServiceProxyAddress": "", + "subgraphServiceProxyAdminAddress": "", + "graphTallyCollectorAddress": "" + }, + "DisputeManager": { + "disputePeriod": 7200, // 2 hours = 7200 seconds + "disputeDeposit": "10000000000000000000000n", + "fishermanRewardCut": 500000, + "maxSlashingCut": 1000000, + }, + "SubgraphService": { + "minimumProvisionTokens": "100000000000000000000000n", + "maximumDelegationRatio": 16, + "stakeToFeesRatio": 2, + "maxPOIStaleness": 7200, // 2 hours = 7200 seconds + "curationCut": 100000, + } +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/Controller#Controller.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/Controller#Controller.json new file mode 100644 index 000000000..704f884a3 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/Controller#Controller.json @@ -0,0 +1,349 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Controller", + "sourceName": "contracts/governance/Controller.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPauseGuardian", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "NewPauseGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewPendingOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "isPaused", + "type": "bool" + } + ], + "name": "PartialPauseChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "isPaused", + "type": "bool" + } + ], + "name": "PauseChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "SetContractProxy", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + } + ], + "name": "getContractProxy", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPartialPauseTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPauseTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "partialPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseGuardian", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_contractAddress", + "type": "address" + } + ], + "name": "setContractProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_toPartialPause", + "type": "bool" + } + ], + "name": "setPartialPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauseGuardian", + "type": "address" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_toPause", + "type": "bool" + } + ], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + } + ], + "name": "unsetContractProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "updateController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506100243361003360201b6109b21760201c565b61002e6001610055565b6100e7565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600160159054906101000a900460ff1615158115151415610075576100e4565b6001805460ff60a81b1916600160a81b8315158102919091179182905560ff910416156100a157426003555b60015460408051600160a81b90920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a15b50565b610ba0806100f66000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a2578063e0e9929211610071578063e0e9929214610215578063e3056a3414610241578063eb5dd94f14610249578063f2fde38b14610275578063f7641a5e1461029b5761010b565b80635c975abb146101e057806379ba5097146101e85780639181df9c146101f057806391b4ded91461020d5761010b565b80632e292fc7116100de5780632e292fc71461017757806348bde20c146101935780634fc07d75146101b957806356371bd8146101c15761010b565b80630c340a2414610110578063147ddef51461013457806316c38b3c1461014e57806324a3d6221461016f575b600080fd5b6101186102b8565b604080516001600160a01b039092168252519081900360200190f35b61013c6102c7565b60408051918252519081900360200190f35b61016d6004803603602081101561016457600080fd5b503515156102cd565b005b610118610337565b61017f610346565b604080519115158252519081900360200190f35b61016d600480360360208110156101a957600080fd5b50356001600160a01b0316610356565b610118610412565b61016d600480360360208110156101d757600080fd5b50351515610421565b61017f610488565b61016d610498565b61016d6004803603602081101561020657600080fd5b50356105a6565b61013c610651565b61016d6004803603604081101561022b57600080fd5b50803590602001356001600160a01b0316610657565b61011861076e565b61016d6004803603604081101561025f57600080fd5b50803590602001356001600160a01b031661077d565b61016d6004803603602081101561028b57600080fd5b50356001600160a01b0316610899565b610118600480360360208110156102b157600080fd5b5035610997565b6000546001600160a01b031681565b60025481565b6000546001600160a01b03163314806102f057506004546001600160a01b031633145b61032b5760405162461bcd60e51b8152600401808060200182810382526022815260200180610b496022913960400191505060405180910390fd5b610334816109d4565b50565b6004546001600160a01b031681565b600154600160a01b900460ff1690565b6000546001600160a01b031633146103ae576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610409576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61033481610a65565b6000546001600160a01b031690565b6000546001600160a01b031633148061044457506004546001600160a01b031633145b61047f5760405162461bcd60e51b8152600401808060200182810382526022815260200180610b496022913960400191505060405180910390fd5b61033481610ab7565b600154600160a81b900460ff1690565b6001546001600160a01b031680158015906104bb5750336001600160a01b038216145b61050c576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b031633146105fe576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b600081815260056020908152604080832080546001600160a01b031916905580519283525183927f937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd92908290030190a250565b60035481565b6000546001600160a01b031633146106af576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661070a576040805162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742061646472657373206d7573742062652073657400000000604482015290519081900360640190fd5b60008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927f937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd92908290030190a25050565b6001546001600160a01b031681565b6000546001600160a01b031633146107d5576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610829576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b6000828152600560205260408082205481516392eefe9b60e01b81526001600160a01b038581166004830152925192909116926392eefe9b9260248084019382900301818387803b15801561087d57600080fd5b505af1158015610891573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146108f1576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610943576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000908152600560205260409020546001600160a01b031690565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600160159054906101000a900460ff16151581151514156109f457610334565b6001805460ff60a81b1916600160a81b8315158102919091179182905560ff91041615610a2057426003555b60015460408051600160a81b90920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b600160149054906101000a900460ff1615158115151415610ad757610334565b6001805460ff60a01b1916600160a01b8315158102919091179182905560ff91041615610b0357426002555b60015460408051600160a01b90920460ff1615158252517f511b770d1b1dc5cbd412a5017f55cbb2295b826385e5f46c1de2b6ebeb44ae02916020908290030190a15056fe4f6e6c7920476f7665726e6f72206f7220477561726469616e2063616e2063616c6ca26469706673582212207cecec10a8617577e80b5c52f6cd82da5e5974468c039848ed5e90b25c8267c764736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a2578063e0e9929211610071578063e0e9929214610215578063e3056a3414610241578063eb5dd94f14610249578063f2fde38b14610275578063f7641a5e1461029b5761010b565b80635c975abb146101e057806379ba5097146101e85780639181df9c146101f057806391b4ded91461020d5761010b565b80632e292fc7116100de5780632e292fc71461017757806348bde20c146101935780634fc07d75146101b957806356371bd8146101c15761010b565b80630c340a2414610110578063147ddef51461013457806316c38b3c1461014e57806324a3d6221461016f575b600080fd5b6101186102b8565b604080516001600160a01b039092168252519081900360200190f35b61013c6102c7565b60408051918252519081900360200190f35b61016d6004803603602081101561016457600080fd5b503515156102cd565b005b610118610337565b61017f610346565b604080519115158252519081900360200190f35b61016d600480360360208110156101a957600080fd5b50356001600160a01b0316610356565b610118610412565b61016d600480360360208110156101d757600080fd5b50351515610421565b61017f610488565b61016d610498565b61016d6004803603602081101561020657600080fd5b50356105a6565b61013c610651565b61016d6004803603604081101561022b57600080fd5b50803590602001356001600160a01b0316610657565b61011861076e565b61016d6004803603604081101561025f57600080fd5b50803590602001356001600160a01b031661077d565b61016d6004803603602081101561028b57600080fd5b50356001600160a01b0316610899565b610118600480360360208110156102b157600080fd5b5035610997565b6000546001600160a01b031681565b60025481565b6000546001600160a01b03163314806102f057506004546001600160a01b031633145b61032b5760405162461bcd60e51b8152600401808060200182810382526022815260200180610b496022913960400191505060405180910390fd5b610334816109d4565b50565b6004546001600160a01b031681565b600154600160a01b900460ff1690565b6000546001600160a01b031633146103ae576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610409576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61033481610a65565b6000546001600160a01b031690565b6000546001600160a01b031633148061044457506004546001600160a01b031633145b61047f5760405162461bcd60e51b8152600401808060200182810382526022815260200180610b496022913960400191505060405180910390fd5b61033481610ab7565b600154600160a81b900460ff1690565b6001546001600160a01b031680158015906104bb5750336001600160a01b038216145b61050c576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b031633146105fe576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b600081815260056020908152604080832080546001600160a01b031916905580519283525183927f937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd92908290030190a250565b60035481565b6000546001600160a01b031633146106af576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661070a576040805162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742061646472657373206d7573742062652073657400000000604482015290519081900360640190fd5b60008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927f937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd92908290030190a25050565b6001546001600160a01b031681565b6000546001600160a01b031633146107d5576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610829576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b6000828152600560205260408082205481516392eefe9b60e01b81526001600160a01b038581166004830152925192909116926392eefe9b9260248084019382900301818387803b15801561087d57600080fd5b505af1158015610891573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146108f1576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610943576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000908152600560205260409020546001600160a01b031690565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600160159054906101000a900460ff16151581151514156109f457610334565b6001805460ff60a81b1916600160a81b8315158102919091179182905560ff91041615610a2057426003555b60015460408051600160a81b90920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b600160149054906101000a900460ff1615158115151415610ad757610334565b6001805460ff60a01b1916600160a01b8315158102919091179182905560ff91041615610b0357426002555b60015460408051600160a01b90920460ff1615158252517f511b770d1b1dc5cbd412a5017f55cbb2295b826385e5f46c1de2b6ebeb44ae02916020908290030190a15056fe4f6e6c7920476f7665726e6f72206f7220477561726469616e2063616e2063616c6ca26469706673582212207cecec10a8617577e80b5c52f6cd82da5e5974468c039848ed5e90b25c8267c764736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.dbg.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.dbg.json new file mode 100644 index 000000000..d34dc828e --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/81754efc7e2eec76b7d493cc60c0f970.json" +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.json new file mode 100644 index 000000000..45c7dd257 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager.json @@ -0,0 +1,1557 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "DisputeManager", + "sourceName": "contracts/DisputeManager.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedLength", + "type": "uint256" + } + ], + "name": "AttestationInvalidBytesLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeAlreadyCreated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeNotInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + } + ], + "name": "DisputeManagerDisputeNotPending", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodNotFinished", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "DisputeManagerIndexerNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerInvalidDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidDisputeDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "cut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidFishermanReward", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidMaxSlashingCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensSlash", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidTokensSlash", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerMustAcceptRelatedDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "requestCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonConflictingAttestations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotArbitrator", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotFisherman", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerSubgraphServiceNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "ArbitratorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeDepositSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeDrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId1", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId2", + "type": "bytes32" + } + ], + "name": "DisputeLinked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "DisputePeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "fishermanRewardCut", + "type": "uint32" + } + ], + "name": "FishermanRewardCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "IndexingDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "LegacyDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "MaxSlashingCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "attestation", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "QueryDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "subgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FISHERMAN_REWARD_CUT", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_DISPUTE_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + } + ], + "name": "acceptDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "acceptDisputeInConflict", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "tokensSlashRelated", + "type": "uint256" + } + ], + "name": "acceptDisputeConflict", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "arbitrator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation2", + "type": "tuple" + } + ], + "name": "areConflictingAttestations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "cancelDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "createAndAcceptLegacyDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "createIndexingDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData", + "type": "bytes" + } + ], + "name": "createQueryDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "attestationData2", + "type": "bytes" + } + ], + "name": "createQueryDisputeConflict", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disputeDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "disputes", + "outputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + }, + { + "internalType": "enum IDisputeManager.DisputeType", + "name": "disputeType", + "type": "uint8" + }, + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "drawDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct Attestation.Receipt", + "name": "receipt", + "type": "tuple" + } + ], + "name": "encodeReceipt", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation", + "type": "tuple" + } + ], + "name": "getAttestationIndexer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getStakeSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "arbitrator_", + "type": "address" + }, + { + "internalType": "uint64", + "name": "disputePeriod_", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "disputeDeposit_", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "isDisputeCreated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxSlashingCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "rejectDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "setArbitrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "setDisputeDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "setDisputePeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + } + ], + "name": "setFishermanRewardCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "setMaxSlashingCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "subgraphService_", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract ISubgraphService", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101c060405234801561001157600080fd5b50604051613b6e380380613b6e8339810160408190526100309161049b565b806001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b29061033b565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e59061033b565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e9061033b565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b60208201526101589061033b565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b60208201526101909061033b565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb9061033b565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102099061033b565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102459061033b565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a9061033b565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a4506103356103e9565b50610519565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161037691815260200190565b602060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b7919061049b565b9050826001600160a01b0382166103e25760405163218f5add60e11b815260040161007191906104cb565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104395760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104985780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156104ad57600080fd5b81516001600160a01b03811681146104c457600080fd5b9392505050565b602081526000825180602084015260005b818110156104f957602081860181015160408684010152016104dc565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516135f261057c60003960005050600050506000505060005050600050506000505060005050600050506000611f23015260006119cc01526135f26000f3fe608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManagerProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManagerProxy.json new file mode 100644 index 000000000..bd6209923 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManagerProxy.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "ERC1967InvalidAdmin", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyDeniedAdminAccess", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212201a31c3db442064e980907a5ca999ca52c132d057688e882222814e029a3aad9064736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220098134bf3dcb274377e55b14b69b89c7eefde1171c4c5b1eb6233b5158fa785b64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212201a31c3db442064e980907a5ca999ca52c132d057688e882222814e029a3aad9064736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager_ProxyWithABI.json new file mode 100644 index 000000000..45c7dd257 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#DisputeManager_ProxyWithABI.json @@ -0,0 +1,1557 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "DisputeManager", + "sourceName": "contracts/DisputeManager.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedLength", + "type": "uint256" + } + ], + "name": "AttestationInvalidBytesLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeAlreadyCreated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeNotInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + } + ], + "name": "DisputeManagerDisputeNotPending", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodNotFinished", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "DisputeManagerIndexerNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerInvalidDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidDisputeDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "cut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidFishermanReward", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidMaxSlashingCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensSlash", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidTokensSlash", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerMustAcceptRelatedDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "requestCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonConflictingAttestations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotArbitrator", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotFisherman", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerSubgraphServiceNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "ArbitratorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeDepositSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeDrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId1", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId2", + "type": "bytes32" + } + ], + "name": "DisputeLinked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "DisputePeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "fishermanRewardCut", + "type": "uint32" + } + ], + "name": "FishermanRewardCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "IndexingDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "LegacyDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "MaxSlashingCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "attestation", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "QueryDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "subgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FISHERMAN_REWARD_CUT", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_DISPUTE_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + } + ], + "name": "acceptDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "acceptDisputeInConflict", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "tokensSlashRelated", + "type": "uint256" + } + ], + "name": "acceptDisputeConflict", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "arbitrator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation2", + "type": "tuple" + } + ], + "name": "areConflictingAttestations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "cancelDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "createAndAcceptLegacyDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "createIndexingDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData", + "type": "bytes" + } + ], + "name": "createQueryDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "attestationData2", + "type": "bytes" + } + ], + "name": "createQueryDisputeConflict", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disputeDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "disputes", + "outputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + }, + { + "internalType": "enum IDisputeManager.DisputeType", + "name": "disputeType", + "type": "uint8" + }, + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "drawDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct Attestation.Receipt", + "name": "receipt", + "type": "tuple" + } + ], + "name": "encodeReceipt", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation", + "type": "tuple" + } + ], + "name": "getAttestationIndexer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getStakeSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "arbitrator_", + "type": "address" + }, + { + "internalType": "uint64", + "name": "disputePeriod_", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "disputeDeposit_", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "isDisputeCreated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxSlashingCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "rejectDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "setArbitrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "setDisputeDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "setDisputePeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + } + ], + "name": "setFishermanRewardCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "setMaxSlashingCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "subgraphService_", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract ISubgraphService", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101c060405234801561001157600080fd5b50604051613b6e380380613b6e8339810160408190526100309161049b565b806001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b29061033b565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e59061033b565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e9061033b565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b60208201526101589061033b565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b60208201526101909061033b565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb9061033b565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102099061033b565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102459061033b565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a9061033b565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a4506103356103e9565b50610519565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161037691815260200190565b602060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b7919061049b565b9050826001600160a01b0382166103e25760405163218f5add60e11b815260040161007191906104cb565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104395760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104985780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156104ad57600080fd5b81516001600160a01b03811681146104c457600080fd5b9392505050565b602081526000825180602084015260005b818110156104f957602081860181015160408684010152016104dc565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516135f261057c60003960005050600050506000505060005050600050506000505060005050600050506000611f23015260006119cc01526135f26000f3fe608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#ProxyAdmin.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#ProxyAdmin.json new file mode 100644 index 000000000..a6fc103d5 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/DisputeManager#ProxyAdmin.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220098134bf3dcb274377e55b14b69b89c7eefde1171c4c5b1eb6233b5158fa785b64736f6c63430008180033", + "deployedBytecode": "0x608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220098134bf3dcb274377e55b14b69b89c7eefde1171c4c5b1eb6233b5158fa785b64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager.json new file mode 100644 index 000000000..7b6cdc168 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager.json @@ -0,0 +1,364 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "EpochManager", + "sourceName": "contracts/epochs/EpochManager.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epochLength", + "type": "uint256" + } + ], + "name": "EpochLengthUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "EpochRun", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_block", + "type": "uint256" + } + ], + "name": "blockHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "blockNum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpochBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpochBlockSinceStart", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epochLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + } + ], + "name": "epochsSince", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epochsSinceUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_epochLength", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isCurrentEpochRun", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastLengthUpdateBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastLengthUpdateEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastRunEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "runEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e05161010051610120516101405161103461016460003980610aac525080610a83525080610a5a525080610a31525080610a085250806109df5250806109b652506110346000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063a2594d82116100ad578063cd6dc68711610071578063cd6dc687146102c4578063d0cfa46e146102f0578063d6866ea5146102f8578063f77c479114610300578063faa1a23c146103245761012c565b8063a2594d821461027e578063ab93122c146102a4578063b4146a0b146102ac578063c46e58eb146102b4578063cc65149b146102bc5761012c565b806376671808116100f457806376671808146101ab57806385df51fd146101b35780638ae63d6d146101d057806392eefe9b146101d85780639ce7abe5146101fe5761012c565b806319c3b82d146101315780631b28126d1461014b5780631ce05d381461016857806354eea7961461018457806357d775f8146101a3575b600080fd5b61013961032c565b60408051918252519081900360200190f35b6101396004803603602081101561016157600080fd5b5035610353565b61017061037f565b604080519115158252519081900360200190f35b6101a16004803603602081101561019a57600080fd5b5035610392565b005b61013961047f565b610139610485565b610139600480360360208110156101c957600080fd5b503561049b565b61013961053b565b6101a1600480360360208110156101ee57600080fd5b50356001600160a01b031661053f565b6101a16004803603604081101561021457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b509092509050610553565b6101a16004803603602081101561029457600080fd5b50356001600160a01b03166106a9565b6101396107c4565b6101396107e6565b6101a16107ec565b610139610888565b6101a1600480360360408110156102da57600080fd5b506001600160a01b03813516906020013561088e565b610139610999565b6101a16109b1565b610308610ad2565b604080516001600160a01b039092168252519081900360200190f35b610139610ae1565b600061034e600c54610348600f5461034261053b565b90610ae7565b90610b49565b905090565b60008061035e610485565b905080831061036e576000610378565b6103788184610ae7565b9392505050565b6000610389610485565b600d5414905090565b61039a610bb0565b600081116103ea576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b600c5481141561042b5760405162461bcd60e51b8152600401808060200182810382526029815260200180610f666029913960400191505060405180910390fd5b610433610485565b600e5561043e6107c4565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a250565b600c5481565b600061034e61049261032c565b600e5490610c84565b6000806104a661053b565b90508083106104e65760405162461bcd60e51b8152600401808060200182810382526023815260200180610fdc6023913960400191505060405180910390fd5b6101008110806104fa575061010081038310155b6105355760405162461bcd60e51b815260040180806020018281038252602c815260200180610fb0602c913960400191505060405180910390fd5b50504090565b4390565b610547610cde565b61055081610d3d565b50565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561058f57600080fd5b505af11580156105a3573d6000803e3d6000fd5b505050506040513d60208110156105b957600080fd5b50516001600160a01b03163314610617576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106e557600080fd5b505af11580156106f9573d6000803e3d6000fd5b505050506040513d602081101561070f57600080fd5b50516001600160a01b0316331461076d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050505050565b600061034e6107dd600c546107d761032c565b90610de5565b600f5490610c84565b600e5481565b6107f461037f565b15610846576040805162461bcd60e51b815260206004820152601960248201527f43757272656e742065706f636820616c72656164792072756e00000000000000604482015290519081900360640190fd5b61084e610485565b600d8190556040805133815290517f666a37ccc682d20f8c51c5f6fd835cbadbcaaf09921e076282446e42d7264e3e9181900360200190a2565b600f5481565b610896610e3e565b6001600160a01b0316336001600160a01b0316146108f1576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b60008111610941576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b61094a82610547565b6001600e5561095761053b565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a25050565b60006109a36107c4565b6109ab61053b565b03905090565b6109da7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a037f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a2c7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a557f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a7e7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610aa77f0000000000000000000000000000000000000000000000000000000000000000610e63565b610ad07f0000000000000000000000000000000000000000000000000000000000000000610e63565b565b6000546001600160a01b031681565b600d5481565b600082821115610b3e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000808211610b9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610ba857fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d6020811015610c2657600080fd5b50516001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b600082820183811015610378576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116610d91576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600082610df457506000610b43565b82820282848281610e0157fe5b04146103785760405162461bcd60e51b8152600401808060200182810382526021815260200180610f8f6021913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50516000838152600160205260409020549091506001600160a01b03808316911614610f615760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25b505056fe45706f6368206c656e677468206d75737420626520646966666572656e7420746f2063757272656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616e206f6e6c792072657472696576652068617368657320666f72206c6173742032353620626c6f636b7343616e206f6e6c79207265747269657665207061737420626c6f636b20686173686573a264697066735822122045232c339fada874ae01964572e7664b10cfd18abe5a79dda984153cc999839564736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063a2594d82116100ad578063cd6dc68711610071578063cd6dc687146102c4578063d0cfa46e146102f0578063d6866ea5146102f8578063f77c479114610300578063faa1a23c146103245761012c565b8063a2594d821461027e578063ab93122c146102a4578063b4146a0b146102ac578063c46e58eb146102b4578063cc65149b146102bc5761012c565b806376671808116100f457806376671808146101ab57806385df51fd146101b35780638ae63d6d146101d057806392eefe9b146101d85780639ce7abe5146101fe5761012c565b806319c3b82d146101315780631b28126d1461014b5780631ce05d381461016857806354eea7961461018457806357d775f8146101a3575b600080fd5b61013961032c565b60408051918252519081900360200190f35b6101396004803603602081101561016157600080fd5b5035610353565b61017061037f565b604080519115158252519081900360200190f35b6101a16004803603602081101561019a57600080fd5b5035610392565b005b61013961047f565b610139610485565b610139600480360360208110156101c957600080fd5b503561049b565b61013961053b565b6101a1600480360360208110156101ee57600080fd5b50356001600160a01b031661053f565b6101a16004803603604081101561021457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b509092509050610553565b6101a16004803603602081101561029457600080fd5b50356001600160a01b03166106a9565b6101396107c4565b6101396107e6565b6101a16107ec565b610139610888565b6101a1600480360360408110156102da57600080fd5b506001600160a01b03813516906020013561088e565b610139610999565b6101a16109b1565b610308610ad2565b604080516001600160a01b039092168252519081900360200190f35b610139610ae1565b600061034e600c54610348600f5461034261053b565b90610ae7565b90610b49565b905090565b60008061035e610485565b905080831061036e576000610378565b6103788184610ae7565b9392505050565b6000610389610485565b600d5414905090565b61039a610bb0565b600081116103ea576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b600c5481141561042b5760405162461bcd60e51b8152600401808060200182810382526029815260200180610f666029913960400191505060405180910390fd5b610433610485565b600e5561043e6107c4565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a250565b600c5481565b600061034e61049261032c565b600e5490610c84565b6000806104a661053b565b90508083106104e65760405162461bcd60e51b8152600401808060200182810382526023815260200180610fdc6023913960400191505060405180910390fd5b6101008110806104fa575061010081038310155b6105355760405162461bcd60e51b815260040180806020018281038252602c815260200180610fb0602c913960400191505060405180910390fd5b50504090565b4390565b610547610cde565b61055081610d3d565b50565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561058f57600080fd5b505af11580156105a3573d6000803e3d6000fd5b505050506040513d60208110156105b957600080fd5b50516001600160a01b03163314610617576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106e557600080fd5b505af11580156106f9573d6000803e3d6000fd5b505050506040513d602081101561070f57600080fd5b50516001600160a01b0316331461076d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050505050565b600061034e6107dd600c546107d761032c565b90610de5565b600f5490610c84565b600e5481565b6107f461037f565b15610846576040805162461bcd60e51b815260206004820152601960248201527f43757272656e742065706f636820616c72656164792072756e00000000000000604482015290519081900360640190fd5b61084e610485565b600d8190556040805133815290517f666a37ccc682d20f8c51c5f6fd835cbadbcaaf09921e076282446e42d7264e3e9181900360200190a2565b600f5481565b610896610e3e565b6001600160a01b0316336001600160a01b0316146108f1576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b60008111610941576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b61094a82610547565b6001600e5561095761053b565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a25050565b60006109a36107c4565b6109ab61053b565b03905090565b6109da7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a037f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a2c7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a557f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a7e7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610aa77f0000000000000000000000000000000000000000000000000000000000000000610e63565b610ad07f0000000000000000000000000000000000000000000000000000000000000000610e63565b565b6000546001600160a01b031681565b600d5481565b600082821115610b3e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000808211610b9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610ba857fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d6020811015610c2657600080fd5b50516001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b600082820183811015610378576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116610d91576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600082610df457506000610b43565b82820282848281610e0157fe5b04146103785760405162461bcd60e51b8152600401808060200182810382526021815260200180610f8f6021913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50516000838152600160205260409020549091506001600160a01b03808316911614610f615760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25b505056fe45706f6368206c656e677468206d75737420626520646966666572656e7420746f2063757272656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616e206f6e6c792072657472696576652068617368657320666f72206c6173742032353620626c6f636b7343616e206f6e6c79207265747269657665207061737420626c6f636b20686173686573a264697066735822122045232c339fada874ae01964572e7664b10cfd18abe5a79dda984153cc999839564736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager_ProxyWithABI.json new file mode 100644 index 000000000..7b6cdc168 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#EpochManager_ProxyWithABI.json @@ -0,0 +1,364 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "EpochManager", + "sourceName": "contracts/epochs/EpochManager.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epochLength", + "type": "uint256" + } + ], + "name": "EpochLengthUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "EpochRun", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_block", + "type": "uint256" + } + ], + "name": "blockHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "blockNum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpochBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpochBlockSinceStart", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epochLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + } + ], + "name": "epochsSince", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epochsSinceUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_epochLength", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isCurrentEpochRun", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastLengthUpdateBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastLengthUpdateEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastRunEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "runEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e05161010051610120516101405161103461016460003980610aac525080610a83525080610a5a525080610a31525080610a085250806109df5250806109b652506110346000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063a2594d82116100ad578063cd6dc68711610071578063cd6dc687146102c4578063d0cfa46e146102f0578063d6866ea5146102f8578063f77c479114610300578063faa1a23c146103245761012c565b8063a2594d821461027e578063ab93122c146102a4578063b4146a0b146102ac578063c46e58eb146102b4578063cc65149b146102bc5761012c565b806376671808116100f457806376671808146101ab57806385df51fd146101b35780638ae63d6d146101d057806392eefe9b146101d85780639ce7abe5146101fe5761012c565b806319c3b82d146101315780631b28126d1461014b5780631ce05d381461016857806354eea7961461018457806357d775f8146101a3575b600080fd5b61013961032c565b60408051918252519081900360200190f35b6101396004803603602081101561016157600080fd5b5035610353565b61017061037f565b604080519115158252519081900360200190f35b6101a16004803603602081101561019a57600080fd5b5035610392565b005b61013961047f565b610139610485565b610139600480360360208110156101c957600080fd5b503561049b565b61013961053b565b6101a1600480360360208110156101ee57600080fd5b50356001600160a01b031661053f565b6101a16004803603604081101561021457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b509092509050610553565b6101a16004803603602081101561029457600080fd5b50356001600160a01b03166106a9565b6101396107c4565b6101396107e6565b6101a16107ec565b610139610888565b6101a1600480360360408110156102da57600080fd5b506001600160a01b03813516906020013561088e565b610139610999565b6101a16109b1565b610308610ad2565b604080516001600160a01b039092168252519081900360200190f35b610139610ae1565b600061034e600c54610348600f5461034261053b565b90610ae7565b90610b49565b905090565b60008061035e610485565b905080831061036e576000610378565b6103788184610ae7565b9392505050565b6000610389610485565b600d5414905090565b61039a610bb0565b600081116103ea576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b600c5481141561042b5760405162461bcd60e51b8152600401808060200182810382526029815260200180610f666029913960400191505060405180910390fd5b610433610485565b600e5561043e6107c4565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a250565b600c5481565b600061034e61049261032c565b600e5490610c84565b6000806104a661053b565b90508083106104e65760405162461bcd60e51b8152600401808060200182810382526023815260200180610fdc6023913960400191505060405180910390fd5b6101008110806104fa575061010081038310155b6105355760405162461bcd60e51b815260040180806020018281038252602c815260200180610fb0602c913960400191505060405180910390fd5b50504090565b4390565b610547610cde565b61055081610d3d565b50565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561058f57600080fd5b505af11580156105a3573d6000803e3d6000fd5b505050506040513d60208110156105b957600080fd5b50516001600160a01b03163314610617576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106e557600080fd5b505af11580156106f9573d6000803e3d6000fd5b505050506040513d602081101561070f57600080fd5b50516001600160a01b0316331461076d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050505050565b600061034e6107dd600c546107d761032c565b90610de5565b600f5490610c84565b600e5481565b6107f461037f565b15610846576040805162461bcd60e51b815260206004820152601960248201527f43757272656e742065706f636820616c72656164792072756e00000000000000604482015290519081900360640190fd5b61084e610485565b600d8190556040805133815290517f666a37ccc682d20f8c51c5f6fd835cbadbcaaf09921e076282446e42d7264e3e9181900360200190a2565b600f5481565b610896610e3e565b6001600160a01b0316336001600160a01b0316146108f1576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b60008111610941576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b61094a82610547565b6001600e5561095761053b565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a25050565b60006109a36107c4565b6109ab61053b565b03905090565b6109da7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a037f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a2c7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a557f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a7e7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610aa77f0000000000000000000000000000000000000000000000000000000000000000610e63565b610ad07f0000000000000000000000000000000000000000000000000000000000000000610e63565b565b6000546001600160a01b031681565b600d5481565b600082821115610b3e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000808211610b9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610ba857fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d6020811015610c2657600080fd5b50516001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b600082820183811015610378576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116610d91576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600082610df457506000610b43565b82820282848281610e0157fe5b04146103785760405162461bcd60e51b8152600401808060200182810382526021815260200180610f8f6021913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50516000838152600160205260409020549091506001600160a01b03808316911614610f615760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25b505056fe45706f6368206c656e677468206d75737420626520646966666572656e7420746f2063757272656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616e206f6e6c792072657472696576652068617368657320666f72206c6173742032353620626c6f636b7343616e206f6e6c79207265747269657665207061737420626c6f636b20686173686573a264697066735822122045232c339fada874ae01964572e7664b10cfd18abe5a79dda984153cc999839564736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063a2594d82116100ad578063cd6dc68711610071578063cd6dc687146102c4578063d0cfa46e146102f0578063d6866ea5146102f8578063f77c479114610300578063faa1a23c146103245761012c565b8063a2594d821461027e578063ab93122c146102a4578063b4146a0b146102ac578063c46e58eb146102b4578063cc65149b146102bc5761012c565b806376671808116100f457806376671808146101ab57806385df51fd146101b35780638ae63d6d146101d057806392eefe9b146101d85780639ce7abe5146101fe5761012c565b806319c3b82d146101315780631b28126d1461014b5780631ce05d381461016857806354eea7961461018457806357d775f8146101a3575b600080fd5b61013961032c565b60408051918252519081900360200190f35b6101396004803603602081101561016157600080fd5b5035610353565b61017061037f565b604080519115158252519081900360200190f35b6101a16004803603602081101561019a57600080fd5b5035610392565b005b61013961047f565b610139610485565b610139600480360360208110156101c957600080fd5b503561049b565b61013961053b565b6101a1600480360360208110156101ee57600080fd5b50356001600160a01b031661053f565b6101a16004803603604081101561021457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b509092509050610553565b6101a16004803603602081101561029457600080fd5b50356001600160a01b03166106a9565b6101396107c4565b6101396107e6565b6101a16107ec565b610139610888565b6101a1600480360360408110156102da57600080fd5b506001600160a01b03813516906020013561088e565b610139610999565b6101a16109b1565b610308610ad2565b604080516001600160a01b039092168252519081900360200190f35b610139610ae1565b600061034e600c54610348600f5461034261053b565b90610ae7565b90610b49565b905090565b60008061035e610485565b905080831061036e576000610378565b6103788184610ae7565b9392505050565b6000610389610485565b600d5414905090565b61039a610bb0565b600081116103ea576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b600c5481141561042b5760405162461bcd60e51b8152600401808060200182810382526029815260200180610f666029913960400191505060405180910390fd5b610433610485565b600e5561043e6107c4565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a250565b600c5481565b600061034e61049261032c565b600e5490610c84565b6000806104a661053b565b90508083106104e65760405162461bcd60e51b8152600401808060200182810382526023815260200180610fdc6023913960400191505060405180910390fd5b6101008110806104fa575061010081038310155b6105355760405162461bcd60e51b815260040180806020018281038252602c815260200180610fb0602c913960400191505060405180910390fd5b50504090565b4390565b610547610cde565b61055081610d3d565b50565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561058f57600080fd5b505af11580156105a3573d6000803e3d6000fd5b505050506040513d60208110156105b957600080fd5b50516001600160a01b03163314610617576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106e557600080fd5b505af11580156106f9573d6000803e3d6000fd5b505050506040513d602081101561070f57600080fd5b50516001600160a01b0316331461076d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050505050565b600061034e6107dd600c546107d761032c565b90610de5565b600f5490610c84565b600e5481565b6107f461037f565b15610846576040805162461bcd60e51b815260206004820152601960248201527f43757272656e742065706f636820616c72656164792072756e00000000000000604482015290519081900360640190fd5b61084e610485565b600d8190556040805133815290517f666a37ccc682d20f8c51c5f6fd835cbadbcaaf09921e076282446e42d7264e3e9181900360200190a2565b600f5481565b610896610e3e565b6001600160a01b0316336001600160a01b0316146108f1576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b60008111610941576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b61094a82610547565b6001600e5561095761053b565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a25050565b60006109a36107c4565b6109ab61053b565b03905090565b6109da7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a037f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a2c7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a557f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a7e7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610aa77f0000000000000000000000000000000000000000000000000000000000000000610e63565b610ad07f0000000000000000000000000000000000000000000000000000000000000000610e63565b565b6000546001600160a01b031681565b600d5481565b600082821115610b3e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000808211610b9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610ba857fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d6020811015610c2657600080fd5b50516001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b600082820183811015610378576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116610d91576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600082610df457506000610b43565b82820282848281610e0157fe5b04146103785760405162461bcd60e51b8152600401808060200182810382526021815260200180610f8f6021913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50516000838152600160205260409020549091506001600160a01b03808316911614610f615760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25b505056fe45706f6368206c656e677468206d75737420626520646966666572656e7420746f2063757272656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616e206f6e6c792072657472696576652068617368657320666f72206c6173742032353620626c6f636b7343616e206f6e6c79207265747269657665207061737420626c6f636b20686173686573a264697066735822122045232c339fada874ae01964572e7664b10cfd18abe5a79dda984153cc999839564736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#GraphProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#GraphProxy.json new file mode 100644 index 000000000..97963021c --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/EpochManager#GraphProxy.json @@ -0,0 +1,177 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxy", + "sourceName": "contracts/upgrades/GraphProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_impl", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldAdmin", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPendingImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newPendingImplementation", + "type": "address" + } + ], + "name": "PendingImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "acceptUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptUpgradeAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments.json new file mode 100644 index 000000000..ad6569c41 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments.json @@ -0,0 +1,337 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphPayments", + "sourceName": "contracts/payments/GraphPayments.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "cut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidProtocolPaymentCut", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "PPMMathInvalidPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensProtocol", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDataService", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationPool", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReceiver", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "GraphPaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [], + "name": "PROTOCOL_PAYMENT_CUT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b50604051611552380380611552833981016040819052610030916104ee565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610372565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610372565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610372565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610372565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610372565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610372565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610372565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610372565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610372565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a45061033a81620f4240101590565b819061035c576040516339b762e560e21b815260040161007191815260200190565b506101c081905261036b610420565b505061058a565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ad91815260200190565b602060405180830381865afa1580156103ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ee919061051a565b9050826001600160a01b0382166104195760405163218f5add60e11b8152600401610071919061053c565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104705760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104cf5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104e957600080fd5b919050565b6000806040838503121561050157600080fd5b61050a836104d2565b9150602083015190509250929050565b60006020828403121561052c57600080fd5b610535826104d2565b9392505050565b602081526000825180602084015260005b8181101561056a576020818601810151604086840101520161054d565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051610f546105fe600039600081816056015261021f0152600050506000505060005050600050506000505060005050600050506000505060006108b20152600061077f0152610f546000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments_ProxyWithABI.json new file mode 100644 index 000000000..ad6569c41 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphPayments#GraphPayments_ProxyWithABI.json @@ -0,0 +1,337 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphPayments", + "sourceName": "contracts/payments/GraphPayments.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "cut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidProtocolPaymentCut", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "PPMMathInvalidPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensProtocol", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDataService", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationPool", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReceiver", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "GraphPaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [], + "name": "PROTOCOL_PAYMENT_CUT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b50604051611552380380611552833981016040819052610030916104ee565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610372565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610372565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610372565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610372565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610372565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610372565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610372565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610372565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610372565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a45061033a81620f4240101590565b819061035c576040516339b762e560e21b815260040161007191815260200190565b506101c081905261036b610420565b505061058a565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ad91815260200190565b602060405180830381865afa1580156103ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ee919061051a565b9050826001600160a01b0382166104195760405163218f5add60e11b8152600401610071919061053c565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104705760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104cf5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104e957600080fd5b919050565b6000806040838503121561050157600080fd5b61050a836104d2565b9150602083015190509250929050565b60006020828403121561052c57600080fd5b610535826104d2565b9392505050565b602081526000825180602084015260005b8181101561056a576020818601810151604086840101520161054d565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051610f546105fe600039600081816056015261021f0152600050506000505060005050600050506000505060005050600050506000505060006108b20152600061077f0152610f546000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphProxyAdmin#GraphProxyAdmin.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphProxyAdmin#GraphProxyAdmin.json new file mode 100644 index 000000000..27c84f2ee --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphProxyAdmin#GraphProxyAdmin.json @@ -0,0 +1,234 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxyAdmin", + "sourceName": "contracts/upgrades/GraphProxyAdmin.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewPendingOwnership", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract GraphUpgradeable", + "name": "_implementation", + "type": "address" + }, + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract GraphUpgradeable", + "name": "_implementation", + "type": "address" + }, + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "changeProxyAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "getProxyAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "getProxyImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "getProxyPendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "upgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506100243361002960201b610a0c1760201c565b61004b565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b610a648061005a6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80637eff275e116100715780637eff275e146101b157806399a88ec4146101df578063e3056a341461020d578063eb451a0214610215578063f2fde38b14610243578063f3b7dead14610269576100a9565b806307ebde0e146100ae5780630c340a2414610139578063204e1c7a1461015d5780635bf410eb1461018357806379ba5097146101a9575b600080fd5b610137600480360360608110156100c457600080fd5b6001600160a01b0382358116926020810135909116918101906060810160408201356401000000008111156100f857600080fd5b82018360208201111561010a57600080fd5b8035906020019184600183028401116401000000008311171561012c57600080fd5b50909250905061028f565b005b610141610388565b604080516001600160a01b039092168252519081900360200190f35b6101416004803603602081101561017357600080fd5b50356001600160a01b0316610397565b6101416004803603602081101561019957600080fd5b50356001600160a01b031661046a565b610137610525565b610137600480360360408110156101c757600080fd5b506001600160a01b0381358116916020013516610633565b610137600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106f6565b61014161079d565b6101376004803603604081101561022b57600080fd5b506001600160a01b03813581169160200135166107ac565b6101376004803603602081101561025957600080fd5b50356001600160a01b0316610853565b6101416004803603602081101561027f57600080fd5b50356001600160a01b0316610951565b6000546001600160a01b031633146102e7576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b836001600160a01b0316639ce7abe58484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050945050505050600060405180830381600087803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031681565b6000806000836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146103f6576040519150601f19603f3d011682016040523d82523d6000602084013e6103fb565b606091505b50915091508161044b576040805162461bcd60e51b8152602060048201526016602482015275141c9bde1e481a5b5c1b0818d85b1b0819985a5b195960521b604482015290519081900360640190fd5b80806020019051602081101561046057600080fd5b5051949350505050565b6000806000836001600160a01b0316604051808063396f7b2360e01b8152506004019050600060405180830381855afa9150503d80600081146104c9576040519150601f19603f3d011682016040523d82523d6000602084013e6104ce565b606091505b50915091508161044b576040805162461bcd60e51b815260206004820152601d60248201527f50726f78792070656e64696e67496d706c2063616c6c206661696c6564000000604482015290519081900360640190fd5b6001546001600160a01b031680158015906105485750336001600160a01b038216145b610599576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b0316331461068b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b031663704b6c02826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461074e576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b6001546001600160a01b031681565b6000546001600160a01b03163314610804576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b031663a2594d82826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b6000546001600160a01b031633146108ab576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0381166108fd576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000806000836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146109b0576040519150601f19603f3d011682016040523d82523d6000602084013e6109b5565b606091505b50915091508161044b576040805162461bcd60e51b815260206004820152601760248201527f50726f78792061646d696e2063616c6c206661696c6564000000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b039290921691909117905556fea26469706673582212208b271ee4c7625d89f662c15e90f70e142245bf56f0595043fe9af742b09d958c64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80637eff275e116100715780637eff275e146101b157806399a88ec4146101df578063e3056a341461020d578063eb451a0214610215578063f2fde38b14610243578063f3b7dead14610269576100a9565b806307ebde0e146100ae5780630c340a2414610139578063204e1c7a1461015d5780635bf410eb1461018357806379ba5097146101a9575b600080fd5b610137600480360360608110156100c457600080fd5b6001600160a01b0382358116926020810135909116918101906060810160408201356401000000008111156100f857600080fd5b82018360208201111561010a57600080fd5b8035906020019184600183028401116401000000008311171561012c57600080fd5b50909250905061028f565b005b610141610388565b604080516001600160a01b039092168252519081900360200190f35b6101416004803603602081101561017357600080fd5b50356001600160a01b0316610397565b6101416004803603602081101561019957600080fd5b50356001600160a01b031661046a565b610137610525565b610137600480360360408110156101c757600080fd5b506001600160a01b0381358116916020013516610633565b610137600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106f6565b61014161079d565b6101376004803603604081101561022b57600080fd5b506001600160a01b03813581169160200135166107ac565b6101376004803603602081101561025957600080fd5b50356001600160a01b0316610853565b6101416004803603602081101561027f57600080fd5b50356001600160a01b0316610951565b6000546001600160a01b031633146102e7576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b836001600160a01b0316639ce7abe58484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050945050505050600060405180830381600087803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031681565b6000806000836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146103f6576040519150601f19603f3d011682016040523d82523d6000602084013e6103fb565b606091505b50915091508161044b576040805162461bcd60e51b8152602060048201526016602482015275141c9bde1e481a5b5c1b0818d85b1b0819985a5b195960521b604482015290519081900360640190fd5b80806020019051602081101561046057600080fd5b5051949350505050565b6000806000836001600160a01b0316604051808063396f7b2360e01b8152506004019050600060405180830381855afa9150503d80600081146104c9576040519150601f19603f3d011682016040523d82523d6000602084013e6104ce565b606091505b50915091508161044b576040805162461bcd60e51b815260206004820152601d60248201527f50726f78792070656e64696e67496d706c2063616c6c206661696c6564000000604482015290519081900360640190fd5b6001546001600160a01b031680158015906105485750336001600160a01b038216145b610599576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b0316331461068b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b031663704b6c02826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461074e576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b6001546001600160a01b031681565b6000546001600160a01b03163314610804576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b031663a2594d82826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b6000546001600160a01b031633146108ab576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0381166108fd576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000806000836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146109b0576040519150601f19603f3d011682016040523d82523d6000602084013e6109b5565b606091505b50915091508161044b576040805162461bcd60e51b815260206004820152601760248201527f50726f78792061646d696e2063616c6c206661696c6564000000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b039290921691909117905556fea26469706673582212208b271ee4c7625d89f662c15e90f70e142245bf56f0595043fe9af742b09d958c64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphTallyCollector#GraphTallyCollector.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphTallyCollector#GraphTallyCollector.json new file mode 100644 index 000000000..92095e0eb --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/GraphTallyCollector#GraphTallyCollector.json @@ -0,0 +1,900 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphTallyCollector", + "sourceName": "contracts/payments/collectors/GraphTallyCollector.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "eip712Name", + "type": "string" + }, + { + "internalType": "string", + "name": "eip712Version", + "type": "string" + }, + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "revokeSignerThawingPeriod", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AuthorizableInvalidSignerProof", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proofDeadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + } + ], + "name": "AuthorizableInvalidSignerProofDeadline", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "bool", + "name": "revoked", + "type": "bool" + } + ], + "name": "AuthorizableSignerAlreadyAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "AuthorizableSignerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "AuthorizableSignerNotThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "AuthorizableSignerStillThawing", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + } + ], + "name": "GraphTallyCollectorCallerNotDataService", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + } + ], + "name": "GraphTallyCollectorInconsistentRAVTokens", + "type": "error" + }, + { + "inputs": [], + "name": "GraphTallyCollectorInvalidRAVSigner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensToCollect", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensToCollect", + "type": "uint256" + } + ], + "name": "GraphTallyCollectorInvalidTokensToCollectAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dataService", + "type": "address" + } + ], + "name": "GraphTallyCollectorUnauthorizedDataService", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShortString", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestampNs", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "valueAggregate", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "RAVCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "SignerAuthorized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "SignerRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "SignerThawCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "SignerThawing", + "type": "event" + }, + { + "inputs": [], + "name": "REVOKE_AUTHORIZATION_THAWING_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "authorizations", + "outputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "revoked", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "proofDeadline", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + } + ], + "name": "authorizeSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "cancelThawSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "tokensToCollect", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint64", + "name": "timestampNs", + "type": "uint64" + }, + { + "internalType": "uint128", + "name": "valueAggregate", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "internalType": "struct IGraphTallyCollector.ReceiptAggregateVoucher", + "name": "rav", + "type": "tuple" + } + ], + "name": "encodeRAV", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "getThawEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "isAuthorized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint64", + "name": "timestampNs", + "type": "uint64" + }, + { + "internalType": "uint128", + "name": "valueAggregate", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "internalType": "struct IGraphTallyCollector.ReceiptAggregateVoucher", + "name": "rav", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct IGraphTallyCollector.SignedRAV", + "name": "signedRAV", + "type": "tuple" + } + ], + "name": "recoverRAVSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "revokeAuthorizedSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "thawSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + } + ], + "name": "tokensCollected", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c060405234801561001157600080fd5b506040516122bf3803806122bf833981016040819052610030916105e0565b8082858561003f8260006103e2565b6101205261004e8160016103e2565b61014052815160208084019190912060e052815190820120610100524660a0526100db60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b03811661012d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101e05260408051808201909152600a81526923b930b8342a37b5b2b760b11b602082015261016590610415565b6001600160a01b0316610160526040805180820190915260078152665374616b696e6760c81b602082015261019990610415565b6001600160a01b03166101805260408051808201909152600d81526c47726170685061796d656e747360981b60208201526101d390610415565b6001600160a01b03166101a05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261020e90610415565b6001600160a01b03166101c05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261024790610415565b6001600160a01b03166102005260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b602082015261028290610415565b6001600160a01b0316610220526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102c090610415565b6001600160a01b03166102405260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102fc90610415565b6001600160a01b03166102605260408051808201909152600881526721bab930ba34b7b760c11b602082015261033190610415565b6001600160a01b039081166102808190526101e05161018051610160516101a0516101c0516102005161022051610240516102605160408051968c168752948b166020870152928a1685850152908916606085015288166080840152871660a083015260c0820195909552935192851694918216939116917fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a439181900360e00190a4506102a0525061082d92505050565b60006020835110156103fe576103f7836104c3565b905061040f565b8161040984826106ea565b5060ff90505b92915050565b6000806101e0516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161045091815260200190565b602060405180830381865afa15801561046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049191906107a8565b9050826001600160a01b0382166104bc5760405163218f5add60e11b815260040161012491906107f6565b5092915050565b600080829050601f815111156104ee578260405163305a27a960e01b815260040161012491906107f6565b80516104f982610809565b179392505050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561053257818101518382015260200161051a565b50506000910152565b600082601f83011261054c57600080fd5b81516001600160401b0381111561056557610565610501565b604051601f8201601f19908116603f011681016001600160401b038111828210171561059357610593610501565b6040528181528382016020018510156105ab57600080fd5b6105bc826020830160208701610517565b949350505050565b80516001600160a01b03811681146105db57600080fd5b919050565b600080600080608085870312156105f657600080fd5b84516001600160401b0381111561060c57600080fd5b6106188782880161053b565b602087015190955090506001600160401b0381111561063657600080fd5b6106428782880161053b565b935050610651604086016105c4565b6060959095015193969295505050565b600181811c9082168061067557607f821691505b60208210810361069557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156106e557806000526020600020601f840160051c810160208510156106c25750805b601f840160051c820191505b818110156106e257600081556001016106ce565b50505b505050565b81516001600160401b0381111561070357610703610501565b610717816107118454610661565b8461069b565b6020601f82116001811461074b57600083156107335750848201515b600019600385901b1c1916600184901b1784556106e2565b600084815260208120601f198516915b8281101561077b578785015182556020948501946001909201910161075b565b50848210156107995786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082840312156107ba57600080fd5b6107c3826105c4565b9392505050565b600081518084526107e2816020860160208601610517565b601f01601f19169290920160200192915050565b6020815260006107c360208301846107ca565b805160208083015191908110156106955760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516119d06108ef60003960008181610247015261036501526000505060005050600050506000505060005050600050506000610a19015260005050600061083e0152600050506000610bb401526000610b8201526000610f2b01526000610f0301526000610e5e01526000610e8801526000610eb201526119d06000f3fe608060405234801561001057600080fd5b50600436106100ba5760003560e01c8063015cdd80146100bf5780631354f019146100d4578063181250ff146100e757806326969c4c1461013457806339aa7416146101475780633a13e1af1461015a57806363648817146101be57806365e4ad9e146101de578063692209ce146102015780637f07d2831461021457806384b0196e146102275780639b95288114610242578063bea5d2ab14610269578063fee9f01f14610295575b600080fd5b6100d26100cd3660046111d7565b6102a8565b005b6100d26100e23660046111d7565b610355565b6101216100f53660046111f4565b600360209081526000948552604080862082529385528385208152918452828420909152825290205481565b6040519081526020015b60405180910390f35b610121610142366004611247565b6103ea565b6100d26101553660046111d7565b610403565b6101976101683660046111d7565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169160ff1683565b604080516001600160a01b039094168452602084019290925215159082015260600161012b565b6101d16101cc366004611281565b6104cd565b60405161012b91906112bb565b6101f16101ec3660046112cf565b6104e0565b604051901515815260200161012b565b61012161020f36600461135f565b6104f3565b6101216102223660046113b8565b61050a565b61022f610521565b60405161012b9796959493929190611450565b6101217f000000000000000000000000000000000000000000000000000000000000000081565b6101216102773660046111d7565b6001600160a01b031660009081526002602052604090206001015490565b6100d26102a33660046114e8565b610567565b806102b33382610633565b6001600160a01b03821660009081526002602052604090206001015482906102f85760405163cd3cd55d60e01b81526004016102ef91906112bb565b60405180910390fd5b506001600160a01b038216600081815260026020908152604080832060010180549390555182815291929133917f3b4432b11b66b46d9a7b190aa989c0ae85a5395b543540220596dd94dd405ceb910160405180910390a3505050565b806103603382610633565b61038a7f000000000000000000000000000000000000000000000000000000000000000042611559565b6001600160a01b0383166000818152600260205260409081902060010183905551909133917fd939049941f6a15381248e4ac0010f15efdf0f3221923711244c200b5ff2cddf916103de9190815260200190565b60405180910390a35050565b60006103fd6103f88361170b565b610666565b92915050565b8061040e3382610633565b6001600160a01b038216600090815260026020526040902060010154828161044a5760405163cd3cd55d60e01b81526004016102ef91906112bb565b504281818111156104775760405163bd76307f60e01b8152600481019290925260248201526044016102ef565b50506001600160a01b0383166000818152600260208190526040808320909101805460ff191660011790555133917f2fc91dbd92d741cae16e0315578d7f6cf77043b771692c4bd993658ecfe8942291a3505050565b60006103fd6104db836117a8565b610738565b60006104ec8383610758565b9392505050565b6000610501858585856107bb565b95945050505050565b600061051984848460006107bb565b949350505050565b600060608060008060006060610535610b7b565b61053d610bad565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6001600160a01b0384811660009081526002602081905260409091208054910154911690859060ff1682156105cb57604051630c83a00f60e01b81526001600160a01b039384166004820152929091166024830152151560448201526064016102ef565b5050506105da82828587610bda565b6001600160a01b03841660008181526002602052604080822080546001600160a01b03191633908117909155905190917f6edcdd4150e63c6c36d965976c1c37375609c8b040c50d39e7156437b80e282891a350505050565b61063d8282610758565b8282909161066057604051631e58ab1f60e01b81526004016102ef9291906117b4565b50505050565b60006103fd7f2f8962be843489018f0fe44aa06adfead655e3c10d7347a020040f9524f392d3836000015184602001518560400151866060015187608001518860a001518960c001518051906020012060405160200161071d98979695949392919097885260208801969096526001600160a01b0394851660408801529284166060870152921660808501526001600160401b039190911660a08401526001600160801b031660c083015260e08201526101000190565b60405160208183030381529060405280519060200120610d17565b6000806107488360000151610666565b90506104ec818460200151610d44565b60006001600160a01b0383161580159061078e57506001600160a01b038281166000908152600260205260409020548116908416145b80156104ec5750506001600160a01b03166000908152600260208190526040909120015460ff1615919050565b60008080806107cc868801886117ce565b825160600151929550909350915033906001600160a01b038116821461080757604051632b65e49760e11b81526004016102ef9291906117b4565b505061081283610d6e565b8251805160608201516040928301519251630119cbed60e31b8152919290916000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308ce5f689061087590859087906004016117b4565b602060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190611828565b875160600151909150816108de5760405163037a2d1f60e61b81526004016102ef91906112bb565b5050855160a001516001600160a01b0380841660009081526003602090815260408083208884528252808320868516845282528083208b5183015190941683529290529081205490916001600160801b031690818180821161095c57604051637007d4a160e01b8152600481019290925260248201526044016102ef565b50508a600003610977576109708183611841565b92506109bd565b6109818183611841565b8b11158b61098f8385611841565b90916109b75760405163c5602bb160e01b8152600481019290925260248201526044016102ef565b50508a92505b50508015610aac576001600160a01b0380841660009081526003602090815260408083208884528252808320868516845282528083208b5183015190941683529290529081208054839290610a13908490611559565b909155507f000000000000000000000000000000000000000000000000000000000000000090506001600160a01b0316631230fa3e8d8960000151602001518585888c8c6040518863ffffffff1660e01b8152600401610a79979695949392919061188c565b600060405180830381600087803b158015610a9357600080fd5b505af1158015610aa7573d6000803e3d6000fd5b505050505b826001600160a01b03168760000151602001516001600160a01b0316857f481a17595c709e8f745444fb9ffc8f0b5e98458de94463971947f548e12bbdb48f8686604051610afc939291906118d8565b60405180910390a48651602080820151608083015160a084015160c090940151928b01516040516001600160a01b03808a16969416948a947f3943fc3b19ec289c87b57de7a8bf1448d81ced03d1806144ecaca4ba9e97605694610b64948b94919391611900565b60405180910390a49b9a5050505050505050505050565b6060610ba87f00000000000000000000000000000000000000000000000000000000000000006000610da6565b905090565b6060610ba87f00000000000000000000000000000000000000000000000000000000000000006001610da6565b8142808211610c055760405163d7705a0160e01b8152600481019290925260248201526044016102ef565b505060408051466020808301919091526001600160601b031930606090811b8216848601527330baba3437b934bd32a9b4b3b732b9283937b7b360611b60548501526068840187905233901b1660888301528251808303607c018152609c90920190925280519101207b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81209050826001600160a01b0316610ce88288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d4492505050565b6001600160a01b031614610d0f57604051631c07ed3360e31b815260040160405180910390fd5b505050505050565b60006103fd610d24610e51565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610d548686610f7c565b925092509250610d648282610fc9565b5090949350505050565b805160200151610d8690610d8183610738565b610758565b610da35760405163aa415c3360e01b815260040160405180910390fd5b50565b606060ff8314610dc057610db983611086565b90506103fd565b818054610dcc90611960565b80601f0160208091040260200160405190810160405280929190818152602001828054610df890611960565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505090506103fd565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610eaa57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ed457507f000000000000000000000000000000000000000000000000000000000000000090565b610ba8604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60008060008351604103610fb65760208401516040850151606086015160001a610fa8888285856110c5565b955095509550505050610fc2565b50508151600091506002905b9250925092565b6000826003811115610fdd57610fdd611854565b03610fe6575050565b6001826003811115610ffa57610ffa611854565b036110185760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561102c5761102c611854565b0361104d5760405163fce698f760e01b8152600481018290526024016102ef565b600382600381111561106157611061611854565b03611082576040516335e2f38360e21b8152600481018290526024016102ef565b5050565b606060006110938361118a565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411156110f65750600091506003905082611180565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561114a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661117657506000925060019150829050611180565b9250600091508190505b9450945094915050565b600060ff8216601f8111156103fd57604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0381168114610da357600080fd5b80356111d2816111b2565b919050565b6000602082840312156111e957600080fd5b81356104ec816111b2565b6000806000806080858703121561120a57600080fd5b8435611215816111b2565b935060208501359250604085013561122c816111b2565b9150606085013561123c816111b2565b939692955090935050565b60006020828403121561125957600080fd5b81356001600160401b0381111561126f57600080fd5b820160e081850312156104ec57600080fd5b60006020828403121561129357600080fd5b81356001600160401b038111156112a957600080fd5b8201604081850312156104ec57600080fd5b6001600160a01b0391909116815260200190565b600080604083850312156112e257600080fd5b82356112ed816111b2565b915060208301356112fd816111b2565b809150509250929050565b8035600381106111d257600080fd5b60008083601f84011261132957600080fd5b5081356001600160401b0381111561134057600080fd5b60208301915083602082850101111561135857600080fd5b9250929050565b6000806000806060858703121561137557600080fd5b61137e85611308565b935060208501356001600160401b0381111561139957600080fd5b6113a587828801611317565b9598909750949560400135949350505050565b6000806000604084860312156113cd57600080fd5b6113d684611308565b925060208401356001600160401b038111156113f157600080fd5b6113fd86828701611317565b9497909650939450505050565b6000815180845260005b8181101561143057602081850181015186830182015201611414565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e06020820152600061146f60e083018961140a565b8281036040840152611481818961140a565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b818110156114d75783518352602093840193909201916001016114b9565b50909b9a5050505050505050505050565b600080600080606085870312156114fe57600080fd5b8435611509816111b2565b93506020850135925060408501356001600160401b0381111561152b57600080fd5b61153787828801611317565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103fd576103fd611543565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156115a4576115a461156c565b60405290565b80356001600160401b03811681146111d257600080fd5b80356001600160801b03811681146111d257600080fd5b600082601f8301126115e957600080fd5b81356001600160401b038111156116025761160261156c565b604051601f8201601f19908116603f011681016001600160401b03811182821017156116305761163061156c565b60405281815283820160200185101561164857600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0828403121561167757600080fd5b61167f611582565b823581529050611691602083016111c7565b60208201526116a2604083016111c7565b60408201526116b3606083016111c7565b60608201526116c4608083016115aa565b60808201526116d560a083016115c1565b60a082015260c08201356001600160401b038111156116f357600080fd5b6116ff848285016115d8565b60c08301525092915050565b60006103fd3683611665565b60006040828403121561172957600080fd5b604080519081016001600160401b038111828210171561174b5761174b61156c565b60405290508082356001600160401b0381111561176757600080fd5b61177385828601611665565b82525060208301356001600160401b0381111561178f57600080fd5b61179b858286016115d8565b6020830152505092915050565b60006103fd3683611717565b6001600160a01b0392831681529116602082015260400190565b6000806000606084860312156117e357600080fd5b83356001600160401b038111156117f957600080fd5b61180586828701611717565b93505060208401359150604084013561181d816111b2565b809150509250925092565b60006020828403121561183a57600080fd5b5051919050565b818103818111156103fd576103fd611543565b634e487b7160e01b600052602160045260246000fd5b6003811061188857634e487b7160e01b600052602160045260246000fd5b9052565b60e0810161189a828a61186a565b6001600160a01b03978816602083015295871660408201526060810194909452918516608084015260a083015290921660c090920191909152919050565b606081016118e6828661186a565b6001600160a01b0393909316602082015260400152919050565b6001600160a01b03861681526001600160401b03851660208201526001600160801b038416604082015260a0606082018190526000906119429083018561140a565b8281036080840152611954818561140a565b98975050505050505050565b600181811c9082168061197457607f821691505b60208210810361199457634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212202168ccf8bac6984eef611a01a2e1c7b84ddb64fd4b819201ae6206ab6038e15764736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ba5760003560e01c8063015cdd80146100bf5780631354f019146100d4578063181250ff146100e757806326969c4c1461013457806339aa7416146101475780633a13e1af1461015a57806363648817146101be57806365e4ad9e146101de578063692209ce146102015780637f07d2831461021457806384b0196e146102275780639b95288114610242578063bea5d2ab14610269578063fee9f01f14610295575b600080fd5b6100d26100cd3660046111d7565b6102a8565b005b6100d26100e23660046111d7565b610355565b6101216100f53660046111f4565b600360209081526000948552604080862082529385528385208152918452828420909152825290205481565b6040519081526020015b60405180910390f35b610121610142366004611247565b6103ea565b6100d26101553660046111d7565b610403565b6101976101683660046111d7565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169160ff1683565b604080516001600160a01b039094168452602084019290925215159082015260600161012b565b6101d16101cc366004611281565b6104cd565b60405161012b91906112bb565b6101f16101ec3660046112cf565b6104e0565b604051901515815260200161012b565b61012161020f36600461135f565b6104f3565b6101216102223660046113b8565b61050a565b61022f610521565b60405161012b9796959493929190611450565b6101217f000000000000000000000000000000000000000000000000000000000000000081565b6101216102773660046111d7565b6001600160a01b031660009081526002602052604090206001015490565b6100d26102a33660046114e8565b610567565b806102b33382610633565b6001600160a01b03821660009081526002602052604090206001015482906102f85760405163cd3cd55d60e01b81526004016102ef91906112bb565b60405180910390fd5b506001600160a01b038216600081815260026020908152604080832060010180549390555182815291929133917f3b4432b11b66b46d9a7b190aa989c0ae85a5395b543540220596dd94dd405ceb910160405180910390a3505050565b806103603382610633565b61038a7f000000000000000000000000000000000000000000000000000000000000000042611559565b6001600160a01b0383166000818152600260205260409081902060010183905551909133917fd939049941f6a15381248e4ac0010f15efdf0f3221923711244c200b5ff2cddf916103de9190815260200190565b60405180910390a35050565b60006103fd6103f88361170b565b610666565b92915050565b8061040e3382610633565b6001600160a01b038216600090815260026020526040902060010154828161044a5760405163cd3cd55d60e01b81526004016102ef91906112bb565b504281818111156104775760405163bd76307f60e01b8152600481019290925260248201526044016102ef565b50506001600160a01b0383166000818152600260208190526040808320909101805460ff191660011790555133917f2fc91dbd92d741cae16e0315578d7f6cf77043b771692c4bd993658ecfe8942291a3505050565b60006103fd6104db836117a8565b610738565b60006104ec8383610758565b9392505050565b6000610501858585856107bb565b95945050505050565b600061051984848460006107bb565b949350505050565b600060608060008060006060610535610b7b565b61053d610bad565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6001600160a01b0384811660009081526002602081905260409091208054910154911690859060ff1682156105cb57604051630c83a00f60e01b81526001600160a01b039384166004820152929091166024830152151560448201526064016102ef565b5050506105da82828587610bda565b6001600160a01b03841660008181526002602052604080822080546001600160a01b03191633908117909155905190917f6edcdd4150e63c6c36d965976c1c37375609c8b040c50d39e7156437b80e282891a350505050565b61063d8282610758565b8282909161066057604051631e58ab1f60e01b81526004016102ef9291906117b4565b50505050565b60006103fd7f2f8962be843489018f0fe44aa06adfead655e3c10d7347a020040f9524f392d3836000015184602001518560400151866060015187608001518860a001518960c001518051906020012060405160200161071d98979695949392919097885260208801969096526001600160a01b0394851660408801529284166060870152921660808501526001600160401b039190911660a08401526001600160801b031660c083015260e08201526101000190565b60405160208183030381529060405280519060200120610d17565b6000806107488360000151610666565b90506104ec818460200151610d44565b60006001600160a01b0383161580159061078e57506001600160a01b038281166000908152600260205260409020548116908416145b80156104ec5750506001600160a01b03166000908152600260208190526040909120015460ff1615919050565b60008080806107cc868801886117ce565b825160600151929550909350915033906001600160a01b038116821461080757604051632b65e49760e11b81526004016102ef9291906117b4565b505061081283610d6e565b8251805160608201516040928301519251630119cbed60e31b8152919290916000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308ce5f689061087590859087906004016117b4565b602060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190611828565b875160600151909150816108de5760405163037a2d1f60e61b81526004016102ef91906112bb565b5050855160a001516001600160a01b0380841660009081526003602090815260408083208884528252808320868516845282528083208b5183015190941683529290529081205490916001600160801b031690818180821161095c57604051637007d4a160e01b8152600481019290925260248201526044016102ef565b50508a600003610977576109708183611841565b92506109bd565b6109818183611841565b8b11158b61098f8385611841565b90916109b75760405163c5602bb160e01b8152600481019290925260248201526044016102ef565b50508a92505b50508015610aac576001600160a01b0380841660009081526003602090815260408083208884528252808320868516845282528083208b5183015190941683529290529081208054839290610a13908490611559565b909155507f000000000000000000000000000000000000000000000000000000000000000090506001600160a01b0316631230fa3e8d8960000151602001518585888c8c6040518863ffffffff1660e01b8152600401610a79979695949392919061188c565b600060405180830381600087803b158015610a9357600080fd5b505af1158015610aa7573d6000803e3d6000fd5b505050505b826001600160a01b03168760000151602001516001600160a01b0316857f481a17595c709e8f745444fb9ffc8f0b5e98458de94463971947f548e12bbdb48f8686604051610afc939291906118d8565b60405180910390a48651602080820151608083015160a084015160c090940151928b01516040516001600160a01b03808a16969416948a947f3943fc3b19ec289c87b57de7a8bf1448d81ced03d1806144ecaca4ba9e97605694610b64948b94919391611900565b60405180910390a49b9a5050505050505050505050565b6060610ba87f00000000000000000000000000000000000000000000000000000000000000006000610da6565b905090565b6060610ba87f00000000000000000000000000000000000000000000000000000000000000006001610da6565b8142808211610c055760405163d7705a0160e01b8152600481019290925260248201526044016102ef565b505060408051466020808301919091526001600160601b031930606090811b8216848601527330baba3437b934bd32a9b4b3b732b9283937b7b360611b60548501526068840187905233901b1660888301528251808303607c018152609c90920190925280519101207b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81209050826001600160a01b0316610ce88288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d4492505050565b6001600160a01b031614610d0f57604051631c07ed3360e31b815260040160405180910390fd5b505050505050565b60006103fd610d24610e51565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610d548686610f7c565b925092509250610d648282610fc9565b5090949350505050565b805160200151610d8690610d8183610738565b610758565b610da35760405163aa415c3360e01b815260040160405180910390fd5b50565b606060ff8314610dc057610db983611086565b90506103fd565b818054610dcc90611960565b80601f0160208091040260200160405190810160405280929190818152602001828054610df890611960565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505090506103fd565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610eaa57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ed457507f000000000000000000000000000000000000000000000000000000000000000090565b610ba8604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60008060008351604103610fb65760208401516040850151606086015160001a610fa8888285856110c5565b955095509550505050610fc2565b50508151600091506002905b9250925092565b6000826003811115610fdd57610fdd611854565b03610fe6575050565b6001826003811115610ffa57610ffa611854565b036110185760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561102c5761102c611854565b0361104d5760405163fce698f760e01b8152600481018290526024016102ef565b600382600381111561106157611061611854565b03611082576040516335e2f38360e21b8152600481018290526024016102ef565b5050565b606060006110938361118a565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411156110f65750600091506003905082611180565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561114a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661117657506000925060019150829050611180565b9250600091508190505b9450945094915050565b600060ff8216601f8111156103fd57604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0381168114610da357600080fd5b80356111d2816111b2565b919050565b6000602082840312156111e957600080fd5b81356104ec816111b2565b6000806000806080858703121561120a57600080fd5b8435611215816111b2565b935060208501359250604085013561122c816111b2565b9150606085013561123c816111b2565b939692955090935050565b60006020828403121561125957600080fd5b81356001600160401b0381111561126f57600080fd5b820160e081850312156104ec57600080fd5b60006020828403121561129357600080fd5b81356001600160401b038111156112a957600080fd5b8201604081850312156104ec57600080fd5b6001600160a01b0391909116815260200190565b600080604083850312156112e257600080fd5b82356112ed816111b2565b915060208301356112fd816111b2565b809150509250929050565b8035600381106111d257600080fd5b60008083601f84011261132957600080fd5b5081356001600160401b0381111561134057600080fd5b60208301915083602082850101111561135857600080fd5b9250929050565b6000806000806060858703121561137557600080fd5b61137e85611308565b935060208501356001600160401b0381111561139957600080fd5b6113a587828801611317565b9598909750949560400135949350505050565b6000806000604084860312156113cd57600080fd5b6113d684611308565b925060208401356001600160401b038111156113f157600080fd5b6113fd86828701611317565b9497909650939450505050565b6000815180845260005b8181101561143057602081850181015186830182015201611414565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e06020820152600061146f60e083018961140a565b8281036040840152611481818961140a565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b818110156114d75783518352602093840193909201916001016114b9565b50909b9a5050505050505050505050565b600080600080606085870312156114fe57600080fd5b8435611509816111b2565b93506020850135925060408501356001600160401b0381111561152b57600080fd5b61153787828801611317565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103fd576103fd611543565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156115a4576115a461156c565b60405290565b80356001600160401b03811681146111d257600080fd5b80356001600160801b03811681146111d257600080fd5b600082601f8301126115e957600080fd5b81356001600160401b038111156116025761160261156c565b604051601f8201601f19908116603f011681016001600160401b03811182821017156116305761163061156c565b60405281815283820160200185101561164857600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0828403121561167757600080fd5b61167f611582565b823581529050611691602083016111c7565b60208201526116a2604083016111c7565b60408201526116b3606083016111c7565b60608201526116c4608083016115aa565b60808201526116d560a083016115c1565b60a082015260c08201356001600160401b038111156116f357600080fd5b6116ff848285016115d8565b60c08301525092915050565b60006103fd3683611665565b60006040828403121561172957600080fd5b604080519081016001600160401b038111828210171561174b5761174b61156c565b60405290508082356001600160401b0381111561176757600080fd5b61177385828601611665565b82525060208301356001600160401b0381111561178f57600080fd5b61179b858286016115d8565b6020830152505092915050565b60006103fd3683611717565b6001600160a01b0392831681529116602082015260400190565b6000806000606084860312156117e357600080fd5b83356001600160401b038111156117f957600080fd5b61180586828701611717565b93505060208401359150604084013561181d816111b2565b809150509250925092565b60006020828403121561183a57600080fd5b5051919050565b818103818111156103fd576103fd611543565b634e487b7160e01b600052602160045260246000fd5b6003811061188857634e487b7160e01b600052602160045260246000fd5b9052565b60e0810161189a828a61186a565b6001600160a01b03978816602083015295871660408201526060810194909452918516608084015260a083015290921660c090920191909152919050565b606081016118e6828661186a565b6001600160a01b0393909316602082015260400152919050565b6001600160a01b03861681526001600160401b03851660208201526001600160801b038416604082015260a0606082018190526000906119429083018561140a565b8281036080840152611954818561140a565b98975050505050505050565b600181811c9082168061197457607f821691505b60208210810361199457634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212202168ccf8bac6984eef611a01a2e1c7b84ddb64fd4b819201ae6206ab6038e15764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphPayments_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphPayments_ProxyWithABI.json new file mode 100644 index 000000000..ad6569c41 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphPayments_ProxyWithABI.json @@ -0,0 +1,337 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphPayments", + "sourceName": "contracts/payments/GraphPayments.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "cut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidProtocolPaymentCut", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "PPMMathInvalidPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensProtocol", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDataService", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationPool", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReceiver", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "GraphPaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [], + "name": "PROTOCOL_PAYMENT_CUT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b50604051611552380380611552833981016040819052610030916104ee565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610372565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610372565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610372565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610372565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610372565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610372565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610372565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610372565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610372565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a45061033a81620f4240101590565b819061035c576040516339b762e560e21b815260040161007191815260200190565b506101c081905261036b610420565b505061058a565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ad91815260200190565b602060405180830381865afa1580156103ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ee919061051a565b9050826001600160a01b0382166104195760405163218f5add60e11b8152600401610071919061053c565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104705760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104cf5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104e957600080fd5b919050565b6000806040838503121561050157600080fd5b61050a836104d2565b9150602083015190509250929050565b60006020828403121561052c57600080fd5b610535826104d2565b9392505050565b602081526000825180602084015260005b8181101561056a576020818601810151604086840101520161054d565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051610f546105fe600039600081816056015261021f0152600050506000505060005050600050506000505060005050600050506000505060006108b20152600061077f0152610f546000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphProxy.json new file mode 100644 index 000000000..97963021c --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#GraphProxy.json @@ -0,0 +1,177 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxy", + "sourceName": "contracts/upgrades/GraphProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_impl", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldAdmin", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPendingImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newPendingImplementation", + "type": "address" + } + ], + "name": "PendingImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "acceptUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptUpgradeAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_GraphPayments.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_GraphPayments.json new file mode 100644 index 000000000..bbe4fe0cb --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_GraphPayments.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Dummy", + "sourceName": "contracts/mocks/Dummy.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "deployedBytecode": "0x6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_PaymentsEscrow.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_PaymentsEscrow.json new file mode 100644 index 000000000..bbe4fe0cb --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#OZProxyDummy_PaymentsEscrow.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Dummy", + "sourceName": "contracts/mocks/Dummy.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "deployedBytecode": "0x6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#PaymentsEscrow_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#PaymentsEscrow_ProxyWithABI.json new file mode 100644 index 000000000..e4e9beada --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#PaymentsEscrow_ProxyWithABI.json @@ -0,0 +1,680 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PaymentsEscrow", + "sourceName": "contracts/payments/PaymentsEscrow.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "withdrawEscrowThawingPeriod", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInconsistentCollection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBalance", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowNotThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "PaymentsEscrowStillThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "thawingPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxWaitPeriod", + "type": "uint256" + } + ], + "name": "PaymentsEscrowThawingPeriodTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "CancelThaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "EscrowCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "Thaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_WAIT_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WITHDRAW_ESCROW_THAWING_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "cancelThaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "escrowAccounts", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "getBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b50604051611bb6380380611bb6833981016040819052610030916104ef565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610373565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610373565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610373565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610373565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610373565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610373565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610373565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610373565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610373565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450806276a7008082111561035c57604051635c0f65a160e01b815260048101929092526024820152604401610071565b50506101c081905261036c610421565b505061058b565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ae91815260200190565b602060405180830381865afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef919061051b565b9050826001600160a01b03821661041a5760405163218f5add60e11b8152600401610071919061053d565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104ea57600080fd5b919050565b6000806040838503121561050257600080fd5b61050b836104d3565b9150602083015190509250929050565b60006020828403121561052d57600080fd5b610536826104d3565b9392505050565b602081526000825180602084015260005b8181101561056b576020818601810151604086840101520161054e565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516115b3610603600039600081816101350152610b4e015260005050600050506000505060005050600050506000610d910152600050506000610dd90152600050506000610db501526115b36000f3fe608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_GraphPayments.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_GraphPayments.json new file mode 100644 index 000000000..d09104f29 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_GraphPayments.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "deployedBytecode": "0x60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_PaymentsEscrow.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_PaymentsEscrow.json new file mode 100644 index 000000000..d09104f29 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#ProxyAdmin_PaymentsEscrow.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "deployedBytecode": "0x60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_GraphPayments.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_GraphPayments.json new file mode 100644 index 000000000..ac5363776 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_GraphPayments.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "ERC1967InvalidAdmin", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyDeniedAdminAccess", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow.json new file mode 100644 index 000000000..ac5363776 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "ERC1967InvalidAdmin", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyDeniedAdminAccess", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#ExponentialRebates.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#ExponentialRebates.json new file mode 100644 index 000000000..b1bf62892 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#ExponentialRebates.json @@ -0,0 +1,55 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ExponentialRebates", + "sourceName": "contracts/staking/libraries/ExponentialRebates.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "fees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stake", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "alphaNumerator", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "alphaDenominator", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "lambdaNumerator", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "lambdaDenominator", + "type": "uint32" + } + ], + "name": "exponentialRebates", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x610c2d610039600b82828239805160001a607314602c57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c806349484d811461003a575b600080fd5b61004d610048366004610a66565b61005f565b60405190815260200160405180910390f35b6000806100728660030b8660030b61011c565b9050806000036100855787915050610112565b87600003610097576000915050610112565b60006100a98560030b8560030b61011c565b905060006100b8828a8c61013c565b9050600f6100c582610153565b13156100d657899350505050610112565b60006100ff6001607f1b6100fa866100f56100f087610ae2565b610169565b610882565b61089d565b905061010b818c6108d4565b9450505050505b9695505050505050565b600061013561012f846001607f1b610920565b83610988565b9392505050565b600061014b61012f8585610920565b949350505050565b60006101636001607f1b83610b14565b92915050565b60006101796101ff607c1b610ae2565b82121561018857506000919050565b8160000361019b57506001607f1b919050565b60008213156101c55760405162461bcd60e51b81526004016101bc90610b42565b60405180910390fd5b6000806101d66001607c1b85610b69565b91508190506001607f1b6101ea8280610b7d565b6101f49190610b14565b9050610208816710e1b3be415a0000610b7d565b6102129084610bad565b92506001607f1b6102238383610b7d565b61022d9190610b14565b9050610241816705a0913f6b1e0000610b7d565b61024b9084610bad565b92506001607f1b61025c8383610b7d565b6102669190610b14565b905061027a81670168244fdac78000610b7d565b6102849084610bad565b92506001607f1b6102958383610b7d565b61029f9190610b14565b90506102b281664807432bc18000610b7d565b6102bc9084610bad565b92506001607f1b6102cd8383610b7d565b6102d79190610b14565b90506102ea81660c0135dca04000610b7d565b6102f49084610bad565b92506001607f1b6103058383610b7d565b61030f9190610b14565b9050610322816601b707b1cdc000610b7d565b61032c9084610bad565b92506001607f1b61033d8383610b7d565b6103479190610b14565b9050610359816536e0f639b800610b7d565b6103639084610bad565b92506001607f1b6103748383610b7d565b61037e9190610b14565b905061039081650618fee9f800610b7d565b61039a9084610bad565b92506001607f1b6103ab8383610b7d565b6103b59190610b14565b90506103c681649c197dcc00610b7d565b6103d09084610bad565b92506001607f1b6103e18383610b7d565b6103eb9190610b14565b90506103fc81640e30dce400610b7d565b6104069084610bad565b92506001607f1b6104178383610b7d565b6104219190610b14565b90506104328164012ebd1300610b7d565b61043c9084610bad565b92506001607f1b61044d8383610b7d565b6104579190610b14565b9050610467816317499f00610b7d565b6104719084610bad565b92506001607f1b6104828383610b7d565b61048c9190610b14565b905061049c816301a9d480610b7d565b6104a69084610bad565b92506001607f1b6104b78383610b7d565b6104c19190610b14565b90506104d081621c6380610b7d565b6104da9084610bad565b92506001607f1b6104eb8383610b7d565b6104f59190610b14565b9050610504816201c638610b7d565b61050e9084610bad565b92506001607f1b61051f8383610b7d565b6105299190610b14565b905061053781611ab8610b7d565b6105419084610bad565b92506001607f1b6105528383610b7d565b61055c9190610b14565b905061056a8161017c610b7d565b6105749084610bad565b92506001607f1b6105858383610b7d565b61058f9190610b14565b905061059c816014610b7d565b6105a69084610bad565b92506001607f1b6105b78383610b7d565b6105c19190610b14565b90506105ce816001610b7d565b6105d89084610bad565b92506001607f1b826105f26721c3677c82b4000086610b14565b6105fc9190610bad565b6106069190610bad565b925061061184610ae2565b9350600160841b841615610657577243cbaf42a000812488fc5c220ad7b97bf6e99e61064a6cf1aaddd7742e56d32fb9f9974485610b7d565b6106549190610b14565b92505b600160831b84161561069c577105d27a9f51c31b7c2f8038212a057477999161068f6e0afe10820813d65dfe6a33c07f738f85610b7d565b6106999190610b14565b92505b600160821b8416156106e157701b4c902e273a58678d6d3bfdb93db96d026106d46f02582ab704279e8efd15e0265855c47a85610b7d565b6106de9190610b14565b92505b600160811b841615610726577003b1cc971a9bb5b9867477440d6d1577506107196f1152aaa3bf81cb9fdb76eae12d02957185610b7d565b6107239190610b14565b92505b600160801b84161561076b5770015bf0a8b1457695355fb8ac404e7a79e361075e6f2f16ac6c59de6f8d5d6f63c1482a7c8685610b7d565b6107689190610b14565b92505b6001607f1b8416156107af576fd3094c70f034de4b96ff7d5b6f99fcd86107a26f4da2cbf1be5827f9eb3ad1aa9866ebb385610b7d565b6107ac9190610b14565b92505b6001607e1b8416156107f3576fa45af1e1f40c333b3de1db4dd55f29a76107e66f63afbe7ab2082ba1a0ae5e4eb1b479dc85610b7d565b6107f09190610b14565b92505b6001607d1b841615610837576f910b022db7ae67ce76b441c27035c6a161082a6f70f5a893b608861e1f58934f97aea57d85610b7d565b6108349190610b14565b92505b6001607c1b84161561087b576f88415abbe9a76bead8d00cf112e4d4a861086e6f783eafef1c0a8f3978c7f81824d62ebf85610b7d565b6108789190610b14565b92505b5050919050565b60006001607f1b6108938484610920565b6101359190610b14565b6000600160ff1b82036108c25760405162461bcd60e51b81526004016101bc90610b42565b610135836108cf84610ae2565b6109f2565b6000808212156108f65760405162461bcd60e51b81526004016101bc90610b42565b60006109028484610920565b905060008113610916576000915050610163565b607f1c9392505050565b600082158061092d575081155b1561093a57506000610163565b508181028183828161094e5761094e610afe565b0514158061096b57508282828161096757610967610afe565b0514155b156101635760405162461bcd60e51b81526004016101bc90610bd5565b6000816000036109aa5760405162461bcd60e51b81526004016101bc90610bd5565b600160ff1b831480156109be575081600019145b156109db5760405162461bcd60e51b81526004016101bc90610bd5565b8183816109ea576109ea610afe565b059392505050565b818101600083128015610a055750600082125b8015610a1057508281135b8061096b5750600083138015610a265750600082135b801561096b5750828112156101635760405162461bcd60e51b81526004016101bc90610bd5565b803563ffffffff81168114610a6157600080fd5b919050565b60008060008060008060c08789031215610a7f57600080fd5b8635955060208701359450610a9660408801610a4d565b9350610aa460608801610a4d565b9250610ab260808801610a4d565b9150610ac060a08801610a4d565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b8201610af757610af7610acc565b5060000390565b634e487b7160e01b600052601260045260246000fd5b600082610b2357610b23610afe565b600160ff1b821460001984141615610b3d57610b3d610acc565b500590565b6020808252600d908201526c6f75742d6f662d626f756e647360981b604082015260600190565b600082610b7857610b78610afe565b500790565b80820260008212600160ff1b84141615610b9957610b99610acc565b818105831482151761016357610163610acc565b8082018281126000831280158216821582161715610bcd57610bcd610acc565b505092915050565b6020808252600890820152676f766572666c6f7760c01b60408201526060019056fea26469706673582212201ef3beb7da88d73c1ec2e008b9308e699e4621df52e1b4b35ff71522e3621d6464736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c806349484d811461003a575b600080fd5b61004d610048366004610a66565b61005f565b60405190815260200160405180910390f35b6000806100728660030b8660030b61011c565b9050806000036100855787915050610112565b87600003610097576000915050610112565b60006100a98560030b8560030b61011c565b905060006100b8828a8c61013c565b9050600f6100c582610153565b13156100d657899350505050610112565b60006100ff6001607f1b6100fa866100f56100f087610ae2565b610169565b610882565b61089d565b905061010b818c6108d4565b9450505050505b9695505050505050565b600061013561012f846001607f1b610920565b83610988565b9392505050565b600061014b61012f8585610920565b949350505050565b60006101636001607f1b83610b14565b92915050565b60006101796101ff607c1b610ae2565b82121561018857506000919050565b8160000361019b57506001607f1b919050565b60008213156101c55760405162461bcd60e51b81526004016101bc90610b42565b60405180910390fd5b6000806101d66001607c1b85610b69565b91508190506001607f1b6101ea8280610b7d565b6101f49190610b14565b9050610208816710e1b3be415a0000610b7d565b6102129084610bad565b92506001607f1b6102238383610b7d565b61022d9190610b14565b9050610241816705a0913f6b1e0000610b7d565b61024b9084610bad565b92506001607f1b61025c8383610b7d565b6102669190610b14565b905061027a81670168244fdac78000610b7d565b6102849084610bad565b92506001607f1b6102958383610b7d565b61029f9190610b14565b90506102b281664807432bc18000610b7d565b6102bc9084610bad565b92506001607f1b6102cd8383610b7d565b6102d79190610b14565b90506102ea81660c0135dca04000610b7d565b6102f49084610bad565b92506001607f1b6103058383610b7d565b61030f9190610b14565b9050610322816601b707b1cdc000610b7d565b61032c9084610bad565b92506001607f1b61033d8383610b7d565b6103479190610b14565b9050610359816536e0f639b800610b7d565b6103639084610bad565b92506001607f1b6103748383610b7d565b61037e9190610b14565b905061039081650618fee9f800610b7d565b61039a9084610bad565b92506001607f1b6103ab8383610b7d565b6103b59190610b14565b90506103c681649c197dcc00610b7d565b6103d09084610bad565b92506001607f1b6103e18383610b7d565b6103eb9190610b14565b90506103fc81640e30dce400610b7d565b6104069084610bad565b92506001607f1b6104178383610b7d565b6104219190610b14565b90506104328164012ebd1300610b7d565b61043c9084610bad565b92506001607f1b61044d8383610b7d565b6104579190610b14565b9050610467816317499f00610b7d565b6104719084610bad565b92506001607f1b6104828383610b7d565b61048c9190610b14565b905061049c816301a9d480610b7d565b6104a69084610bad565b92506001607f1b6104b78383610b7d565b6104c19190610b14565b90506104d081621c6380610b7d565b6104da9084610bad565b92506001607f1b6104eb8383610b7d565b6104f59190610b14565b9050610504816201c638610b7d565b61050e9084610bad565b92506001607f1b61051f8383610b7d565b6105299190610b14565b905061053781611ab8610b7d565b6105419084610bad565b92506001607f1b6105528383610b7d565b61055c9190610b14565b905061056a8161017c610b7d565b6105749084610bad565b92506001607f1b6105858383610b7d565b61058f9190610b14565b905061059c816014610b7d565b6105a69084610bad565b92506001607f1b6105b78383610b7d565b6105c19190610b14565b90506105ce816001610b7d565b6105d89084610bad565b92506001607f1b826105f26721c3677c82b4000086610b14565b6105fc9190610bad565b6106069190610bad565b925061061184610ae2565b9350600160841b841615610657577243cbaf42a000812488fc5c220ad7b97bf6e99e61064a6cf1aaddd7742e56d32fb9f9974485610b7d565b6106549190610b14565b92505b600160831b84161561069c577105d27a9f51c31b7c2f8038212a057477999161068f6e0afe10820813d65dfe6a33c07f738f85610b7d565b6106999190610b14565b92505b600160821b8416156106e157701b4c902e273a58678d6d3bfdb93db96d026106d46f02582ab704279e8efd15e0265855c47a85610b7d565b6106de9190610b14565b92505b600160811b841615610726577003b1cc971a9bb5b9867477440d6d1577506107196f1152aaa3bf81cb9fdb76eae12d02957185610b7d565b6107239190610b14565b92505b600160801b84161561076b5770015bf0a8b1457695355fb8ac404e7a79e361075e6f2f16ac6c59de6f8d5d6f63c1482a7c8685610b7d565b6107689190610b14565b92505b6001607f1b8416156107af576fd3094c70f034de4b96ff7d5b6f99fcd86107a26f4da2cbf1be5827f9eb3ad1aa9866ebb385610b7d565b6107ac9190610b14565b92505b6001607e1b8416156107f3576fa45af1e1f40c333b3de1db4dd55f29a76107e66f63afbe7ab2082ba1a0ae5e4eb1b479dc85610b7d565b6107f09190610b14565b92505b6001607d1b841615610837576f910b022db7ae67ce76b441c27035c6a161082a6f70f5a893b608861e1f58934f97aea57d85610b7d565b6108349190610b14565b92505b6001607c1b84161561087b576f88415abbe9a76bead8d00cf112e4d4a861086e6f783eafef1c0a8f3978c7f81824d62ebf85610b7d565b6108789190610b14565b92505b5050919050565b60006001607f1b6108938484610920565b6101359190610b14565b6000600160ff1b82036108c25760405162461bcd60e51b81526004016101bc90610b42565b610135836108cf84610ae2565b6109f2565b6000808212156108f65760405162461bcd60e51b81526004016101bc90610b42565b60006109028484610920565b905060008113610916576000915050610163565b607f1c9392505050565b600082158061092d575081155b1561093a57506000610163565b508181028183828161094e5761094e610afe565b0514158061096b57508282828161096757610967610afe565b0514155b156101635760405162461bcd60e51b81526004016101bc90610bd5565b6000816000036109aa5760405162461bcd60e51b81526004016101bc90610bd5565b600160ff1b831480156109be575081600019145b156109db5760405162461bcd60e51b81526004016101bc90610bd5565b8183816109ea576109ea610afe565b059392505050565b818101600083128015610a055750600082125b8015610a1057508281135b8061096b5750600083138015610a265750600082135b801561096b5750828112156101635760405162461bcd60e51b81526004016101bc90610bd5565b803563ffffffff81168114610a6157600080fd5b919050565b60008060008060008060c08789031215610a7f57600080fd5b8635955060208701359450610a9660408801610a4d565b9350610aa460608801610a4d565b9250610ab260808801610a4d565b9150610ac060a08801610a4d565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b8201610af757610af7610acc565b5060000390565b634e487b7160e01b600052601260045260246000fd5b600082610b2357610b23610afe565b600160ff1b821460001984141615610b3d57610b3d610acc565b500590565b6020808252600d908201526c6f75742d6f662d626f756e647360981b604082015260600190565b600082610b7857610b78610afe565b500790565b80820260008212600160ff1b84141615610b9957610b99610acc565b818105831482151761016357610163610acc565b8082018281126000831280158216821582161715610bcd57610bcd610acc565b505092915050565b6020808252600890820152676f766572666c6f7760c01b60408201526060019056fea26469706673582212201ef3beb7da88d73c1ec2e008b9308e699e4621df52e1b4b35ff71522e3621d6464736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking.json new file mode 100644 index 000000000..be304a1f6 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking.json @@ -0,0 +1,2481 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "HorizonStaking", + "sourceName": "contracts/staking/HorizonStaking.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "address", + "name": "stakingExtensionAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "subgraphDataServiceAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingCallerIsServiceProvider", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientDelegationTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientIdleStake", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientShares", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientStakeForLegacyAllocations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minRequired", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "HorizonStakingInvalidDelegationFeeCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPool", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPoolState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + } + ], + "name": "HorizonStakingInvalidMaxVerifierCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidProvision", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidServiceProviderZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidThawRequestType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "HorizonStakingInvalidThawingPeriod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidVerifier", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidVerifierZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroShares", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingLegacySlashFailed", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNoTokensToSlash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "HorizonStakingNotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingToWithdraw", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingProvisionAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingSlippageProtection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakingStillThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingTooManyThawRequests", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingTooManyTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingVerifierNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedOnlyController", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedOnlyGovernor", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "AllowedLockedVerifierSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegatedTokensWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "DelegationFeeCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "DelegationSlashingEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashingSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakeLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "MaxThawingPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "OperatorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersStaged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionThawed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "StakeDelegatedWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "ThawRequestCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bool", + "name": "valid", + "type": "bool" + } + ], + "name": "ThawRequestFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawRequestsFulfilled", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ThawRequestsFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ThawingPeriodCleared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensDelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensDeprovisioned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensToDelegationPoolAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensUndelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "VerifierTokensSent", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "acceptProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToDelegationPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clearThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSharesOut", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "deprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegatedTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "getDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Delegation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "getDelegationFeeCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegationPool", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.DelegationPool", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getIdleStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProviderTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProvision", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "internalType": "uint32", + "name": "maxVerifierCutPending", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriodPending", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastParametersStagedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Provision", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getServiceProvider", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokensStaked", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensProvisioned", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ServiceProvider", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingExtension", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + } + ], + "name": "getThawRequest", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "nextRequest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ThawRequest", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawRequestList", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "internalType": "struct LinkedList.List", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "getTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "isAllowedLockedVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isAuthorized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDelegationSlashingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provisionLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oldServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minSharesForNewProvider", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "redelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "reprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setAllowedLockedVerifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "setDelegationFeeCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "setDelegationSlashingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "setMaxThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperatorLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "newMaxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "newThawingPeriod", + "type": "uint64" + } + ], + "name": "setProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensVerifier", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifierDestination", + "type": "address" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "withdrawDelegated", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "withdrawDelegated", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61020060405234801561001157600080fd5b506040516162a33803806162a38339810160408190526100309161041b565b828181806001600160a01b03811661007d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b590610351565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e890610351565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261012190610351565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015b90610351565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019390610351565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101ce90610351565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020c90610351565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024890610351565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027d90610351565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103279790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b039081166101c052929092166101e052506104ce915050565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161038c91815260200190565b602060405180830381865afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cd919061045e565b9050826001600160a01b0382166103f85760405163218f5add60e11b81526004016100749190610480565b5092915050565b80516001600160a01b038116811461041657600080fd5b919050565b60008060006060848603121561043057600080fd5b610439846103ff565b9250610447602085016103ff565b9150610455604085016103ff565b90509250925092565b60006020828403121561047057600080fd5b610479826103ff565b9392505050565b602081526000825180602084015260005b818110156104ae5760208186018101516040868401015201610491565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615d2861057b6000396000818161025b0152818161055e01526128a3015260008181610a450152818161140a015281816130de015281816131a001528181614130015261447401526000505060005050600050506000505060006114e901526000613097015260005050600050506000505060006135670152615d286000f3fe608060405234801561001057600080fd5b50600436106102565760003560e01c8063872d048911610142578063872d0489146106225780638cc01c86146106355780639ce7abe514610663578063a02b942614610676578063a2594d8214610689578063a2a317221461069c578063a694fc3a146106af578063a784d498146106c2578063ac9650d8146106d5578063ad4d35b5146106f5578063ae4fe67a14610708578063ba7fb0b414610734578063bc735d9014610747578063ca94b0e91461075a578063ccebcabb1461076d578063d48de8451461078f578063e473522a146107de578063e56f8a1d146107e6578063e76fede61461082c578063ef58bd671461083f578063f64b359814610847578063f93f1cd01461085a578063fb744cc01461086d578063fc54fb2714610880578063fecc9cc11461088b57610256565b8063010167e51461029f578063026e402b146102b257806308ce5f68146102c557806321195373146102eb578063259bc435146102fe57806325d9897e146103115780632e17de78146104395780632f7cc5011461044c57806339514ad21461045f5780633993d8491461047a5780633a78b7321461048d5780633ccfd60b146104a057806342c51693146104a85780634ca7ac22146104bb5780634d99dd16146104ce57806351a60b02146104e1578063561285e4146104f45780636230001a1461054957806366ee1b281461055c578063746120921461058a5780637573ef4f1461059d5780637a766460146105b05780637c145cc7146105d957806381e21b56146105fc57806382d66cb81461060f575b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e818015610299578184f35b8184fd5b005b61029d6102ad3660046151dc565b61089e565b61029d6102c036600461523e565b61097a565b6102d86102d336600461526a565b610a70565b6040519081526020015b60405180910390f35b61029d6102f93660046152a3565b610a85565b61029d61030c3660046152e4565b610b55565b61042c61031f36600461526a565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516102e291906152ff565b61029d6104473660046153bf565b610c43565b6102d861045a3660046153e5565b610cd6565b601a546040516001600160401b0390911681526020016102e2565b61029d6104883660046152a3565b610dd8565b61029d61049b366004615441565b610e74565b61029d611040565b61029d6104b636600461546d565b6110d2565b61029d6104c93660046154ca565b611283565b61029d6104dc36600461523e565b61137d565b6102d86104ef36600461526a565b61142f565b61050761050236600461526a565b611629565b6040516102e29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b61029d6105573660046154f8565b61167b565b7f00000000000000000000000000000000000000000000000000000000000000006040516102e2919061553e565b61029d6105983660046152a3565b611742565b6102d86105ab366004615552565b61182e565b6102d86105be366004615441565b6001600160a01b03166000908152600e602052604090205490565b6105ec6105e7366004615599565b611892565b60405190151581526020016102e2565b61029d61060a3660046155e4565b61189f565b61029d61061d3660046151dc565b611b18565b6102d861063036600461563c565b611c1e565b610648610643366004615441565b611c73565b604080518251815260209283015192810192909252016102e2565b61029d61067136600461567a565b611caf565b6102d86106843660046152a3565b611daa565b61029d610697366004615441565b611e3e565b61029d6106aa36600461523e565b611f22565b61029d6106bd3660046153bf565b611fb3565b6102d86106d0366004615441565b612044565b6106e86106e33660046156ff565b61204f565b6040516102e29190615798565b61029d610703366004615818565b612136565b6105ec610716366004615441565b6001600160a01b031660009081526022602052604090205460ff1690565b61029d610742366004615858565b612204565b61029d610755366004615818565b612311565b61029d6107683660046152a3565b6123a3565b61078061077b366004615599565b6125dd565b604051905181526020016102e2565b6107a261079d366004615899565b61262f565b6040516102e29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61029d61269c565b6107f96107f43660046153e5565b61276e565b6040516102e291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b61029d61083a3660046158b7565b6127d6565b61029d612d38565b61029d6108553660046158f6565b612e0a565b6102d86108683660046152a3565b612eed565b6102d861087b36600461526a565b612fc1565b60205460ff166105ec565b61029d6108993660046152a3565b612fcd565b6108a6613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109079190615964565b1561092557604051632b37d9d160e21b815260040160405180910390fd5b84846109328282336130b9565b82823390919261096157604051630c76b97b60e41b815260040161095893929190615981565b60405180910390fd5b505050610971878688878761317d565b50505050505050565b610982613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190615964565b15610a0157604051632b37d9d160e21b815260040160405180910390fd5b80600003610a2257604051630a2a4e5b60e11b815260040160405180910390fd5b610a3f3382610a2f613565565b6001600160a01b03169190613589565b610a6c827f0000000000000000000000000000000000000000000000000000000000000000836000613641565b5050565b6000610a7c8383613846565b90505b92915050565b8282610a928282336130b9565b828233909192610ab857604051630c76b97b60e41b815260040161095893929190615981565b505050610ac3613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190615964565b15610b4257604051632b37d9d160e21b815260040160405180910390fd5b610b4d85858561387e565b505050505050565b610b5d613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe91906159a4565b6001600160a01b0316336001600160a01b031614610bef57604051635d9044cd60e01b815260040160405180910390fd5b601a80546001600160401b0319166001600160401b0383169081179091556040519081527fe8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f9060200160405180910390a150565b610c4b613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190615964565b15610cca57604051632b37d9d160e21b815260040160405180910390fd5b610cd3816139af565b50565b600080610ce586868686613b5c565b90508060030154600003610cfd576000915050610dd0565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b8015610dc7576000610d438c83613bc8565b90508460050154816003015403610dbc576001810154426001600160401b0390911611610db657600083858360000154610d7d91906159d7565b610d8791906159ee565b9050610d938186615a10565b8254909550610da29085615a10565b9350610dae8188615a23565b965050610dbc565b50610dc7565b600201549050610d31565b50929450505050505b949350505050565b610de0613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190615964565b15610e5f57604051632b37d9d160e21b815260040160405180910390fd5b610e6f8383600080600086613c18565b505050565b610e7c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd9190615964565b15610efb57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0381166000908152601b60209081526040808320338085529252909120600381015483908390600160601b90046001600160401b0316610f57576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff9081169116141580610f9a57506003810154600160c01b81046001600160401b03908116600160201b9092041614155b15610e6f57600381018054600160201b6001600160401b03600160c01b63ffffffff19841663ffffffff600160a01b8604811691821792909204831684026001600160601b03199095161793909317938490556040516001600160a01b0380881695908916947fa4c005afae9298a5ca51e7710c334ac406fb3d914588ade970850f917cedb1c694611033949183169392041690615a50565b60405180910390a3505050565b611048613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190615964565b156110c757604051632b37d9d160e21b815260040160405180910390fd5b6110d033613d9e565b565b6110da613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190615964565b1561115957604051632b37d9d160e21b815260040160405180910390fd5b83836111668282336130b9565b82823390919261118c57604051630c76b97b60e41b815260040161095893929190615981565b50505061119c83620f4240101590565b83906111be57604051631504950160e21b815260040161095891815260200190565b506001600160a01b038087166000908152601c60209081526040808320938916835292905290812084918660028111156111fa576111fa615a6f565b600281111561120b5761120b615a6f565b815260208101919091526040016000205583600281111561122e5761122e615a6f565b856001600160a01b0316876001600160a01b03167f3474eba30406cacbfbc5a596a7e471662bbcccf206f8d244dbb6f4cc578c52208660405161127391815260200190565b60405180910390a4505050505050565b61128b613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906159a4565b6001600160a01b0316336001600160a01b03161461131d57604051635d9044cd60e01b815260040160405180910390fd5b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4542960abc7f2d26dab244fc440acf511e3dd0f5cefad571ca802283b4751bbb91015b60405180910390a25050565b611385613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190615964565b1561140457604051632b37d9d160e21b815260040160405180910390fd5b610e6f827f000000000000000000000000000000000000000000000000000000000000000083613e79565b6000611439613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190615964565b156114b857604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260146020908152604080832033808552600482019093529083209192909190807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190615a85565b905060008360020154118015611583575082600201548110155b1561159057826001015491505b600082116115b05760405162cf4d4760e51b815260040160405180910390fd5b60006001840181905560028401556040518281526001600160a01b0386811691908a16907f1b2e7737e043c5cf1b587ceb4daeb7ae00148b9bda8f79f1093eead08f1419529060200160405180910390a361161e858361160e613565565b6001600160a01b031691906140f1565b509695505050505050565b61163161514b565b61163961514b565b6000611645858561412c565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b611683613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e49190615964565b1561170257604051632b37d9d160e21b815260040160405180910390fd5b8160000361172357604051630a2a4e5b60e11b815260040160405180910390fd5b6117303383610a2f613565565b61173c84848484613641565b50505050565b61174a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190615964565b156117c957604051632b37d9d160e21b815260040160405180910390fd5b82826117d68282336130b9565b806117e95750336001600160a01b038216145b82823390919261180f57604051630c76b97b60e41b815260040161095893929190615981565b50505061181c85846141b0565b6118278585856141e8565b5050505050565b6001600160a01b038084166000908152601c6020908152604080832093861683529290529081208183600281111561186857611868615a6f565b600281111561187957611879615a6f565b81526020019081526020016000205490505b9392505050565b6000610dd08484846130b9565b6118a7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190615964565b1561192657604051632b37d9d160e21b815260040160405180910390fd5b83836119338282336130b9565b82823390919261195957604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038681166000908152601b60209081526040808320938916835292905220600381015487908790600160601b90046001600160401b03166119b9576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff908116908716141590600160c01b90046001600160401b03908116908616141581806119f55750805b15611b0d578115611a56578663ffffffff8116620f42401015611a34576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b5060038301805463ffffffff60a01b1916600160a01b63ffffffff8a16021790555b8015611ab657601a5486906001600160401b03908116908216811015611a915760405163ee5602e160e01b8152600401610958929190615a9e565b50506003830180546001600160c01b0316600160c01b6001600160401b038916021790555b428360040181905550876001600160a01b0316896001600160a01b03167fe89cbb9d63ba60af555547b12dde6817283e88cbdd45feb2059f2ba71ea346ba8989604051611b04929190615a50565b60405180910390a35b505050505050505050565b611b20613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190615964565b15611b9f57604051632b37d9d160e21b815260040160405180910390fd5b8484611bac8282336130b9565b828233909192611bd257604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038616600090815260226020526040902054869060ff16611c1057604051622920f760e21b8152600401610958919061553e565b50610971878688878761317d565b600080611c2b8585613846565b90506000611c398686614328565b90506000611c4d63ffffffff8616846159d7565b90506000611c5b838361434b565b9050611c678185615a23565b98975050505050505050565b611c7b61517a565b611c8361517a565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906159a4565b6001600160a01b0316336001600160a01b031614611d445760405162461bcd60e51b815260040161095890615ab8565b60405163623faf6160e01b81526001600160a01b0385169063623faf6190611d729086908690600401615aef565b600060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b5050505050505050565b6000611db4613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190615964565b15611e3357604051632b37d9d160e21b815260040160405180910390fd5b610dd0848484613e79565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906159a4565b6001600160a01b0316336001600160a01b031614611ed35760405162461bcd60e51b815260040161095890615ab8565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f0e57600080fd5b505af1158015610b4d573d6000803e3d6000fd5b611f2a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b9190615964565b15611fa957604051632b37d9d160e21b815260040160405180910390fd5b610a6c82826141b0565b611fbb613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190615964565b1561203a57604051632b37d9d160e21b815260040160405180910390fd5b610cd333826141b0565b6000610a7f82614362565b604080516000815260208101909152606090826001600160401b0381111561207957612079615b1e565b6040519080825280602002602001820160405280156120ac57816020015b60608152602001906001900390816120975790505b50915060005b8381101561212e57612109308686848181106120d0576120d0615b34565b90506020028101906120e29190615b4a565b856040516020016120f593929190615b90565b6040516020818303038152906040526143d3565b83828151811061211b5761211b615b34565b60209081029190910101526001016120b2565b505092915050565b61213e613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190615964565b156121bd57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260226020526040902054839060ff166121f857604051622920f760e21b8152600401610958919061553e565b50610e6f838383614449565b61220c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d9190615964565b1561228b57604051632b37d9d160e21b815260040160405180910390fd5b83836122988282336130b9565b8282339091926122be57604051630c76b97b60e41b815260040161095893929190615981565b50505085846122ce8282336130b9565b8282339091926122f457604051630c76b97b60e41b815260040161095893929190615981565b505050600061230489898861387e565b9050611b0d8988836141e8565b612319613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190615964565b1561239857604051632b37d9d160e21b815260040160405180910390fd5b610e6f838383614449565b6123ab613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c9190615964565b1561242a57604051632b37d9d160e21b815260040160405180910390fd5b8060000361244b57604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038084166000908152601b6020908152604080832093861683529281529082902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff80821660608401526001600160401b03600160201b830481166080850152600160601b8304811660a08501819052600160a01b840490921660c0850152600160c01b90920490911660e08301526004830154610100830152600590920154610120820152908490849061252a576040516330acea0d60e11b8152600401610958929190615a36565b50506000612538858561412c565b90506000816003015411858590916125655760405163b6a70b3b60e01b8152600401610958929190615a36565b50508281600201546125779190615a23565b60028201556125893384610a2f613565565b836001600160a01b0316856001600160a01b03167f673007a04e501145e79f59aea5e0413b6e88344fdaf10326254530d6a1511530856040516125ce91815260200190565b60405180910390a35050505050565b6040805160208101909152600081526040805160208101909152600081526000612607868661412c565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b60408051608081018252600080825260208201819052918101829052606081019190915261265d8383613bc8565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b6126a4613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270591906159a4565b6001600160a01b0316336001600160a01b03161461273657604051635d9044cd60e01b815260040160405180910390fd5b600d805463ffffffff191690556040517f93be484d290d119d9cf99cce69d173c732f9403333ad84f69c807b590203d10990600090a1565b60408051608081018252600080825260208201819052918101829052606081019190915261279e85858585613b5c565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b6127de613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190615964565b1561285d57604051632b37d9d160e21b815260040160405180910390fd5b3360009081526012602052604090205460ff1615612966576040516001600160a01b038581166024830152604482018590526064820184905282811660848301526000917f00000000000000000000000000000000000000000000000000000000000000009091169060a40160408051601f198184030181529181526020820180516001600160e01b031663224451c160e11b179052516128fe9190615bb7565b600060405180830381855af49150503d8060008114612939576040519150601f19603f3d011682016040523d82523d6000602084013e61293e565b606091505b50509050806129605760405163ef370f5160e01b815260040160405180910390fd5b5061173c565b6001600160a01b0384166000908152601b6020908152604080832033808552925282209091612995878461412c565b90506000816002015483600001546129ad9190615a23565b9050806000036129d057604051630a8a55c960e31b815260040160405180910390fd5b60006129dc888361434b565b905060006129ee85600001548361434b565b90508015612be8576003850154600090612a1390839063ffffffff9081169061457916565b9050888181811015612a3a57604051632f514d5760e21b8152600401610958929190615bd3565b50508815612aa757612a4f888a61160e613565565b876001600160a01b0316876001600160a01b03168c6001600160a01b03167f95ff4196cd75fa49180ba673948ea43935f59e7c4ba101fa09b9fe0ec266d5828c604051612a9e91815260200190565b60405180910390a45b612acb612ab48a84615a10565b612abc613565565b6001600160a01b0316906145d9565b8554612ad78382615a10565b8760010154612ae691906159d7565b612af091906159ee565b60018701558554612b02908390615a10565b8655600286015415801590612b1957506001860154155b15612b3d5760006002870181905560058701805491612b3783615be1565b91905055505b6001600160a01b038b166000908152600e6020526040902060040154612b64908390615a10565b6001600160a01b038c166000908152600e60205260409020600481019190915554612b90908390615a10565b6001600160a01b038c81166000818152600e60209081526040918290209490945551858152918a169290917fe7b110f13cde981d5079ab7faa4249c5f331f5c292dbc6031969d2ce694188a3910160405180910390a3505b612bf28183615a10565b91508115612d2c5760205460ff1615612cde57612c1182612abc613565565b6002840154612c208382615a10565b8560050154612c2f91906159d7565b612c3991906159ee565b60058501556002840154612c4e908390615a10565b6002850155600684015415801590612c6857506005840154155b15612c8c5760006006850181905560078501805491612c8683615be1565b91905055505b856001600160a01b03168a6001600160a01b03167fc5d16dbb577cf07678b577232717c9a606197a014f61847e623d47fc6bf6b77184604051612cd191815260200190565b60405180910390a3612d2c565b856001600160a01b03168a6001600160a01b03167fdce44f0aeed2089c75db59f5a517b9a19a734bf0213412fa129f0d0434126b2484604051612d2391815260200190565b60405180910390a35b50505050505050505050565b612d40613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da191906159a4565b6001600160a01b0316336001600160a01b031614612dd257604051635d9044cd60e01b815260040160405180910390fd5b6020805460ff191660011790556040517f2192802a8934dbf383338406b279ec7f3eccee31e58d6c0444d6dd6bfff24b3590600090a1565b612e12613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e739190615964565b15612e9157604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038416612eb8576040516322347d6760e21b815260040160405180910390fd5b6001600160a01b038316612edf5760405163a962605960e01b815260040160405180910390fd5b610b4d868686868686613c18565b6000612ef7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f589190615964565b15612f7657604051632b37d9d160e21b815260040160405180910390fd5b8383612f838282336130b9565b828233909192612fa957604051630c76b97b60e41b815260040161095893929190615981565b505050612fb7868686614621565b9695505050505050565b6000610a7c8383614328565b612fd5613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190615964565b1561305457604051632b37d9d160e21b815260040160405180910390fd5b82826130618282336130b9565b82823390919261308757604051630c76b97b60e41b815260040161095893929190615981565b5050506118278585856141e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000836001600160a01b0316826001600160a01b0316036130dc5750600161188b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361314457506001600160a01b0380841660009081526015602090815260408083209385168352929052205460ff1661188b565b506001600160a01b038084166000908152601f60209081526040808320868516845282528083209385168352929052205460ff1661188b565b6000841161319e57604051630a2a4e5b60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614806131e45750600d5463ffffffff16155b83906132045760405163353666ff60e01b8152600401610958919061553e565b508163ffffffff8116620f42401015613239576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b50601a5481906001600160401b0390811690821681101561326f5760405163ee5602e160e01b8152600401610958929190615a9e565b50506001600160a01b038581166000908152601b6020908152604080832093871683529290522060030154600160601b90046001600160401b0316156132c857604051632b542c0d60e11b815260040160405180910390fd5b60006132d386614362565b90508481808211156132fa5760405163ccaf28a960e01b8152600401610958929190615bd3565b505060405180610140016040528086815260200160008152602001600081526020018463ffffffff168152602001836001600160401b03168152602001426001600160401b031681526020018463ffffffff168152602001836001600160401b03168152602001600081526020016000815250601b6000886001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600301600c6101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160030160146101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160030160186101000a8154816001600160401b0302191690836001600160401b03160217905550610100820151816004015561012082015181600501559050506000600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002090508581600401546134fa9190615a23565b60048201556040805187815263ffffffff861660208201526001600160401b0385168183015290516001600160a01b0387811692908a16917f88b4c2d08cea0f01a24841ff5d14814ddb5b14ac44b05e0835fcc0dcd8c7bc259181900360600190a350505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610e6f576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af11580156135e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136099190615964565b610e6f5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610958565b81670de0b6b3a76400008082101561366e5760405163b86d885760e01b8152600401610958929190615bd3565b50506001600160a01b038481166000908152601b602090815260408083209387168352929052206003015484908490600160601b90046001600160401b03166136cc576040516330acea0d60e11b8152600401610958929190615a36565b505060006136da858561412c565b336000908152600482016020526040902060028201549192509015158061370357506003820154155b8686909161372657604051631984edef60e31b8152600401610958929190615a36565b50506000826002015460001480613744575082600501548360020154145b905060008161377f57836005015484600201546137619190615a10565b600385015461377090886159d7565b61377a91906159ee565b613781565b855b905080158015906137925750848110155b818690916137b557604051635d88e8d160e01b8152600401610958929190615bd3565b50508584600201546137c79190615a23565b600285015560038401546137dc908290615a23565b600385015582546137ee908290615a23565b835560405133906001600160a01b0389811691908b16907f237818af8bb47710142edd8fc301fbc507064fb357cf122fb161ca447e3cb13e90613834908b908790615bd3565b60405180910390a45050505050505050565b6001600160a01b038281166000908152601b60209081526040808320938516835292905290812060018101549054610a7c9190615a10565b6001600160a01b038381166000818152601b60209081526040808320948716808452948252808320600281015460018201548351610100810185528681529485018790529284019690965260608301949094526080820181905260a0820185905260c08201869052600584015460e08301529193849290916138ff816147b3565b875492965094509250613913908590615a10565b855560028501839055600185018290556001600160a01b0389166000908152600e60205260408120600401805486929061394e908490615a10565b92505081905550876001600160a01b0316896001600160a01b03167f9008d731ddfbec70bc364780efd63057c6877bee8027c4708a104b365395885d8660405161399a91815260200190565b60405180910390a35091979650505050505050565b3360008290036139d257604051630a2a4e5b60e11b815260040160405180910390fd5b60006139dd82614362565b9050828180821115613a045760405163ccaf28a960e01b8152600401610958929190615bd3565b50506001600160a01b0382166000908152600e602052604081208054600d549192909163ffffffff1690819003613a9657613a3f8683615a10565b8355613a4e858761160e613565565b846001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8387604051613a8991815260200190565b60405180910390a2610b4d565b600283015415801590613aad575082600301544310155b15613abb57613abb85613d9e565b600283015415613ae557613ae2613ad68460030154436148ad565b846002015483896148c7565b90505b858360020154613af59190615a23565b6002840155613b048143615a23565b6003840181905560028401546040516001600160a01b038816927f91642f23a1196e1424949fafa2a428c3b5d1f699763942ff08a6fbe9d4d7e98092613b4c92909190615bd3565b60405180910390a2505050505050565b6000601e6000866001811115613b7457613b74615a6f565b6001811115613b8557613b85615a6f565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d6000846001811115613be057613be0615a6f565b6001811115613bf157613bf1615a6f565b81526020019081526020016000206000838152602001908152602001600020905092915050565b6000613c24878761412c565b905080600201546000141580613c3c57506003810154155b87879091613c5f57604051631984edef60e31b8152600401610958929190615a36565b5050600681015460058201546040805161010081018252600181526001600160a01b03808c1660208301528a16918101919091523360608201526080810182905260a0810183905260c08101859052600784015460e08201526000929190613cc6816147b3565b600288015492965094509250613cdd908590615a10565b600286015560068501839055600585018290558315613d91576001600160a01b03891615801590613d1657506001600160a01b03881615155b15613d2c57613d278989868a613641565b613d91565b613d39338561160e613565565b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f305f519d8909c676ffd870495d4563032eb0b506891a6dd9827490256cc9914e87604051613d8891815260200190565b60405180910390a45b5050505050505050505050565b6001600160a01b0381166000908152600e6020526040812060028101549091819003613ddd57604051630a2a4e5b60e11b815260040160405180910390fd5b600382015443811115613e0657604051631d222f1b60e31b815260040161095891815260200190565b5060006002830181905560038301558154613e22908290615a10565b8255613e31838261160e613565565b826001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8382604051613e6c91815260200190565b60405180910390a2505050565b6000808211613e9b57604051637318ad9960e01b815260040160405180910390fd5b6000613ea7858561412c565b33600090815260048201602052604090208054919250908480821015613ee25760405163ab99793560e01b8152600401610958929190615bd3565b5050600282015486908690613f0c57604051631984edef60e31b8152600401610958929190615a36565b50506000826003015483600501548460020154613f299190615a10565b613f3390876159d7565b613f3d91906159ee565b905060008360050154600014613f705760058401546006850154613f6190846159d7565b613f6b91906159ee565b613f72565b815b6001600160a01b038981166000908152601b60209081526040808320938c1683529290529081206003015491925090613fbb90600160201b90046001600160401b031642615a23565b9050828560050154613fcd9190615a23565b60058601556006850154613fe2908390615a23565b60068601556003850154613ff7908890615a10565b60038601558354614009908890615a10565b8085551561407557600085600301548660050154876002015461402c9190615a10565b865461403891906159d7565b61404291906159ee565b905080670de0b6b3a7640000808210156140715760405163587ab9ab60e11b8152600401610958929190615bd3565b5050505b600061408b60018b8b3387878c6007015461491b565b9050336001600160a01b0316896001600160a01b03168b6001600160a01b03167f0525d6ad1aa78abc571b5c1984b5e1ea4f1412368c1cc348ca408dbb1085c9a1878c6040516140dc929190615bd3565b60405180910390a49998505050505050505050565b8015610e6f5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016135c6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361418557506001600160a01b0382166000908152601460205260409020610a7f565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610a7f565b806000036141d157604051630a2a4e5b60e11b815260040160405180910390fd5b6141de3382610a2f613565565b610a6c8282614ac1565b8060000361420957604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038381166000908152601b60209081526040808320938616835292905220600381015484908490600160601b90046001600160401b0316614266576040516330acea0d60e11b8152600401610958929190615a36565b5050600061427385614362565b905082818082111561429a5760405163ccaf28a960e01b8152600401610958929190615bd3565b505081546142a9908490615a23565b82556001600160a01b0385166000908152600e60205260409020600401546142d2908490615a23565b6001600160a01b038681166000818152600e602090815260409182902060040194909455518681529187169290917feaf6ea3a42ed2fd1b6d575f818cbda593af9524aa94bd30e65302ac4dc23474591016125ce565b600080614335848461412c565b905080600501548160020154610dd09190615a10565b60008183111561435b5781610a7c565b5090919050565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261439591615a23565b61439f9190615a23565b6001600160a01b0384166000908152600e60205260409020549091508181116143c9576000610dd0565b610dd08282615a10565b6060600080846001600160a01b0316846040516143f09190615bb7565b600060405180830381855af49150503d806000811461442b576040519150601f19603f3d011682016040523d82523d6000602084013e614430565b606091505b5091509150614440858383614b34565b95945050505050565b336001600160a01b0383160361447257604051630123065360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036144df573360009081526015602090815260408083206001600160a01b03861684529091529020805460ff191682151517905561451b565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020805460ff19168215151790555b816001600160a01b0316836001600160a01b0316336001600160a01b03167faa5a59b38e8f68292982382bf635c2f263ca37137bbc52956acd808fd7bf976f8460405161456c911515815260200190565b60405180910390a4505050565b600061458883620f4240101590565b8061459b575061459b82620f4240101590565b838390916145be5760405163768bf0eb60e11b8152600401610958929190615bd3565b50620f424090506145cf83856159d7565b610a7c91906159ee565b8015610a6c57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b158015611f0e57600080fd5b60008160000361464457604051630a2a4e5b60e11b815260040160405180910390fd5b60006146508585613846565b90508083808210156146775760405163587ab9ab60e11b8152600401610958929190615bd3565b50506001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154909190156146ec578160010154600183600101548785600201546146c991906159d7565b6146d39190615a23565b6146dd9190615a10565b6146e791906159ee565b6146ee565b845b600383015490915060009061471390600160201b90046001600160401b031642615a23565b90508183600201546147259190615a23565b6002840155600183015461473a908790615a23565b8360010181905550600061475860008a8a8c87878a6005015461491b565b9050876001600160a01b0316896001600160a01b03167f3b81913739097ced1e7fa748c6058d34e2c00b961fb501094543b397b198fdaa8960405161479f91815260200190565b60405180910390a398975050505050505050565b6000806000806147d58560000151866020015187604001518860600151613b5c565b905060008160030154116147fc576040516307e332c560e31b815260040160405180910390fd5b60006148088683614b87565b905085604001516001600160a01b031686602001516001600160a01b03168760000151600181111561483c5761483c615a6f565b6060808a01518551602080880151604080516001600160a01b039095168552918401929092528201527f86c2f162872d7c46d7ee0caad366da6dc430889b9d8f27e4bed3785548f9954b910160405180910390a4602081015160408201516060909201519097919650945092505050565b60008183116148bd576000610a7c565b610a7c8284615a10565b60006148d38285615a23565b60016148df8487615a23565b6148e99190615a10565b6148f384866159d7565b6148fd87896159d7565b6149079190615a23565b6149119190615a23565b61444091906159ee565b60008360000361493e57604051637318ad9960e01b815260040160405180910390fd5b600061494c89898989613b5c565b90506103e88160030154106149745760405163332b852b60e11b815260040160405180910390fd5b60028101546040516001600160601b031960608b811b821660208401528a811b8216603484015289901b166048820152605c810191909152600090607c0160405160208183030381529060405280519060200120905060006149d68b83613bc8565b8781556001810180546001600160401b0319166001600160401b03891617905560006002820155600380820187905584015490915015614a245781614a1f8c8560010154613bc8565b600201555b614a2e8383614c82565b886001600160a01b03168a6001600160a01b03168c6001811115614a5457614a54615a6f565b604080516001600160a01b038d168152602081018c90526001600160401b038b168183015260608101879052608081018a905290517f036538df4a591a5cc74b68cfc7f8c61e8173dbc81627e1d62600b61e820461789181900360a00190a4509998505050505050505050565b6001600160a01b0382166000908152600e6020526040902054614ae5908290615a23565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906113719084815260200190565b606082614b4957614b4482614d15565b61188b565b8151158015614b6057506001600160a01b0384163b155b15614b805783604051639996b31560e01b8152600401610958919061553e565b508061188b565b614bb26040518060800160405280600081526020016000815260200160008152602001600081525090565b615194614bc28460000151614d3e565b9050615194614bd48560000151614da3565b905060008560000151600087608001518860a001518960e00151604051602001614c02959493929190615bfa565b6040516020818303038152906040529050600080614c3785614dea86868c60c001518c614f5a9095949392919063ffffffff16565b91509150600080600083806020019051810190614c549190615c3d565b60408051608081018252998a5260208a019390935291880152606087015250939a9950505050505050505050565b612710826003015410614ca8576040516303a8c56b60e61b815260040160405180910390fd5b80614cc657604051638f4a893d60e01b815260040160405180910390fd5b6001808301829055600283018054600090614ce2908490615a23565b90915550506003820154600003614cf7578082555b6001826003016000828254614d0c9190615a23565b90915550505050565b805115614d255780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6151946000826001811115614d5557614d55615a6f565b03614d635750615014919050565b6001826001811115614d7757614d77615a6f565b03614d855750615056919050565b604051636bd1fba760e11b815260040160405180910390fd5b919050565b6151946000826001811115614dba57614dba615a6f565b03614dc85750615062919050565b6001826001811115614ddc57614ddc615a6f565b03614d8557506150b9919050565b60006060600080600080600087806020019051810190614e0a9190615c7c565b945094509450945094506000614e20868b613bc8565b6001810154909150426001600160401b039091161115614e5b5760016040518060200160405280600081525097509750505050505050614f53565b600381015460009083148015614eae5782548590614e7a9088906159d7565b614e8491906159ee565b9150614e908287615a10565b8354909650614e9f9086615a10565b9450614eab8288615a23565b96505b8b886001811115614ec157614ec1615a6f565b845460018601546040805187815260208101939093526001600160401b03909116828201528415156060830152517f469e89d0a4e0e5deb2eb1ade5b3fa67fdfbeb4787c3a7c1e8e89aaf28562cab29181900360800190a38787878787604051602001614f32959493929190615bfa565b6040516020818303038152906040529a5060008b9950995050505050505050505b9250929050565b600060608760030154831115614f8357604051634a411b9d60e11b815260040160405180910390fd5b60008315614f915783614f97565b88600301545b89549094505b8015801590614fac5750600085115b1561500557600080614fc283898c63ffffffff16565b915091508115614fd3575050615005565b965086614fe18c8c8b6150c4565b925086614fed81615cc5565b9750508380614ffb90615be1565b9450505050614f9d565b50989397509295505050505050565b6000601d81805b600181111561502c5761502c615a6f565b81526020019081526020016000206000838152602001908152602001600020600201549050919050565b6000601d81600161501b565b601d6000805b600181111561507957615079615a6f565b8152602080820192909252604090810160009081209381529290915281208181556001810180546001600160401b03191690556002810182905560030155565b601d60006001615068565b6000808460030154116150ea5760405163ddaf8f2160e01b815260040160405180910390fd5b60006150fd85600001548563ffffffff16565b905061511085600001548463ffffffff16565b60018560030160008282546151259190615a10565b9091555050808555600385015460000361514157600060018601555b5050915492915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6110d0615cdc565b6001600160a01b0381168114610cd357600080fd5b803563ffffffff81168114614d9e57600080fd5b80356001600160401b0381168114614d9e57600080fd5b600080600080600060a086880312156151f457600080fd5b85356151ff8161519c565b9450602086013561520f8161519c565b935060408601359250615224606087016151b1565b9150615232608087016151c5565b90509295509295909350565b6000806040838503121561525157600080fd5b823561525c8161519c565b946020939093013593505050565b6000806040838503121561527d57600080fd5b82356152888161519c565b915060208301356152988161519c565b809150509250929050565b6000806000606084860312156152b857600080fd5b83356152c38161519c565b925060208401356152d38161519c565b929592945050506040919091013590565b6000602082840312156152f657600080fd5b610a7c826151c5565b6000610140820190508251825260208301516020830152604083015160408301526060830151615337606084018263ffffffff169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538560c084018263ffffffff169052565b5060e08301516153a060e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b6000602082840312156153d157600080fd5b5035919050565b60028110610cd357600080fd5b600080600080608085870312156153fb57600080fd5b8435615406816153d8565b935060208501356154168161519c565b925060408501356154268161519c565b915060608501356154368161519c565b939692955090935050565b60006020828403121561545357600080fd5b813561188b8161519c565b803560038110614d9e57600080fd5b6000806000806080858703121561548357600080fd5b843561548e8161519c565b9350602085013561549e8161519c565b92506154ac6040860161545e565b9396929550929360600135925050565b8015158114610cd357600080fd5b600080604083850312156154dd57600080fd5b82356154e88161519c565b91506020830135615298816154bc565b6000806000806080858703121561550e57600080fd5b84356155198161519c565b935060208501356155298161519c565b93969395505050506040820135916060013590565b6001600160a01b0391909116815260200190565b60008060006060848603121561556757600080fd5b83356155728161519c565b925060208401356155828161519c565b91506155906040850161545e565b90509250925092565b6000806000606084860312156155ae57600080fd5b83356155b98161519c565b925060208401356155c98161519c565b915060408401356155d98161519c565b809150509250925092565b600080600080608085870312156155fa57600080fd5b84356156058161519c565b935060208501356156158161519c565b9250615623604086016151b1565b9150615631606086016151c5565b905092959194509250565b60008060006060848603121561565157600080fd5b833561565c8161519c565b9250602084013561566c8161519c565b9150615590604085016151b1565b60008060006040848603121561568f57600080fd5b833561569a8161519c565b925060208401356001600160401b038111156156b557600080fd5b8401601f810186136156c657600080fd5b80356001600160401b038111156156dc57600080fd5b8660208284010111156156ee57600080fd5b939660209190910195509293505050565b6000806020838503121561571257600080fd5b82356001600160401b0381111561572857600080fd5b8301601f8101851361573957600080fd5b80356001600160401b0381111561574f57600080fd5b8560208260051b840101111561576457600080fd5b6020919091019590945092505050565b60005b8381101561578f578181015183820152602001615777565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561580c57603f19878603018452815180518087526157e9816020890160208501615774565b601f01601f191695909501602090810195509384019391909101906001016157c0565b50929695505050505050565b60008060006060848603121561582d57600080fd5b83356158388161519c565b925060208401356158488161519c565b915060408401356155d9816154bc565b6000806000806080858703121561586e57600080fd5b84356158798161519c565b935060208501356158898161519c565b925060408501356154ac8161519c565b600080604083850312156158ac57600080fd5b823561525c816153d8565b600080600080608085870312156158cd57600080fd5b84356158d88161519c565b9350602085013592506040850135915060608501356154368161519c565b60008060008060008060c0878903121561590f57600080fd5b863561591a8161519c565b9550602087013561592a8161519c565b9450604087013561593a8161519c565b9350606087013561594a8161519c565b9598949750929560808101359460a0909101359350915050565b60006020828403121561597657600080fd5b815161188b816154bc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6000602082840312156159b657600080fd5b815161188b8161519c565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a7f57610a7f6159c1565b600082615a0b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610a7f57610a7f6159c1565b80820180821115610a7f57610a7f6159c1565b6001600160a01b0392831681529116602082015260400190565b63ffffffff9290921682526001600160401b0316602082015260400190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a9757600080fd5b5051919050565b6001600160401b0392831681529116602082015260400190565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112615b6157600080fd5b8301803591506001600160401b03821115615b7b57600080fd5b602001915036819003821315614f5357600080fd5b828482376000838201600081528351615bad818360208801615774565b0195945050505050565b60008251615bc9818460208701615774565b9190910192915050565b918252602082015260400190565b600060018201615bf357615bf36159c1565b5060010190565b60a0810160028710615c1c57634e487b7160e01b600052602160045260246000fd5b95815260208101949094526040840192909252606083015260809091015290565b60008060008060808587031215615c5357600080fd5b8451615c5e816153d8565b60208601516040870151606090970151919890975090945092505050565b600080600080600060a08688031215615c9457600080fd5b8551615c9f816153d8565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600081615cd457615cd46159c1565b506000190190565b634e487b7160e01b600052605160045260246000fdfea2646970667358221220f5046670ab269f9c179f41df4a02cd9c6b2ca3d5d507e2b9fcf15f800f351d8b64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102565760003560e01c8063872d048911610142578063872d0489146106225780638cc01c86146106355780639ce7abe514610663578063a02b942614610676578063a2594d8214610689578063a2a317221461069c578063a694fc3a146106af578063a784d498146106c2578063ac9650d8146106d5578063ad4d35b5146106f5578063ae4fe67a14610708578063ba7fb0b414610734578063bc735d9014610747578063ca94b0e91461075a578063ccebcabb1461076d578063d48de8451461078f578063e473522a146107de578063e56f8a1d146107e6578063e76fede61461082c578063ef58bd671461083f578063f64b359814610847578063f93f1cd01461085a578063fb744cc01461086d578063fc54fb2714610880578063fecc9cc11461088b57610256565b8063010167e51461029f578063026e402b146102b257806308ce5f68146102c557806321195373146102eb578063259bc435146102fe57806325d9897e146103115780632e17de78146104395780632f7cc5011461044c57806339514ad21461045f5780633993d8491461047a5780633a78b7321461048d5780633ccfd60b146104a057806342c51693146104a85780634ca7ac22146104bb5780634d99dd16146104ce57806351a60b02146104e1578063561285e4146104f45780636230001a1461054957806366ee1b281461055c578063746120921461058a5780637573ef4f1461059d5780637a766460146105b05780637c145cc7146105d957806381e21b56146105fc57806382d66cb81461060f575b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e818015610299578184f35b8184fd5b005b61029d6102ad3660046151dc565b61089e565b61029d6102c036600461523e565b61097a565b6102d86102d336600461526a565b610a70565b6040519081526020015b60405180910390f35b61029d6102f93660046152a3565b610a85565b61029d61030c3660046152e4565b610b55565b61042c61031f36600461526a565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516102e291906152ff565b61029d6104473660046153bf565b610c43565b6102d861045a3660046153e5565b610cd6565b601a546040516001600160401b0390911681526020016102e2565b61029d6104883660046152a3565b610dd8565b61029d61049b366004615441565b610e74565b61029d611040565b61029d6104b636600461546d565b6110d2565b61029d6104c93660046154ca565b611283565b61029d6104dc36600461523e565b61137d565b6102d86104ef36600461526a565b61142f565b61050761050236600461526a565b611629565b6040516102e29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b61029d6105573660046154f8565b61167b565b7f00000000000000000000000000000000000000000000000000000000000000006040516102e2919061553e565b61029d6105983660046152a3565b611742565b6102d86105ab366004615552565b61182e565b6102d86105be366004615441565b6001600160a01b03166000908152600e602052604090205490565b6105ec6105e7366004615599565b611892565b60405190151581526020016102e2565b61029d61060a3660046155e4565b61189f565b61029d61061d3660046151dc565b611b18565b6102d861063036600461563c565b611c1e565b610648610643366004615441565b611c73565b604080518251815260209283015192810192909252016102e2565b61029d61067136600461567a565b611caf565b6102d86106843660046152a3565b611daa565b61029d610697366004615441565b611e3e565b61029d6106aa36600461523e565b611f22565b61029d6106bd3660046153bf565b611fb3565b6102d86106d0366004615441565b612044565b6106e86106e33660046156ff565b61204f565b6040516102e29190615798565b61029d610703366004615818565b612136565b6105ec610716366004615441565b6001600160a01b031660009081526022602052604090205460ff1690565b61029d610742366004615858565b612204565b61029d610755366004615818565b612311565b61029d6107683660046152a3565b6123a3565b61078061077b366004615599565b6125dd565b604051905181526020016102e2565b6107a261079d366004615899565b61262f565b6040516102e29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61029d61269c565b6107f96107f43660046153e5565b61276e565b6040516102e291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b61029d61083a3660046158b7565b6127d6565b61029d612d38565b61029d6108553660046158f6565b612e0a565b6102d86108683660046152a3565b612eed565b6102d861087b36600461526a565b612fc1565b60205460ff166105ec565b61029d6108993660046152a3565b612fcd565b6108a6613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109079190615964565b1561092557604051632b37d9d160e21b815260040160405180910390fd5b84846109328282336130b9565b82823390919261096157604051630c76b97b60e41b815260040161095893929190615981565b60405180910390fd5b505050610971878688878761317d565b50505050505050565b610982613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190615964565b15610a0157604051632b37d9d160e21b815260040160405180910390fd5b80600003610a2257604051630a2a4e5b60e11b815260040160405180910390fd5b610a3f3382610a2f613565565b6001600160a01b03169190613589565b610a6c827f0000000000000000000000000000000000000000000000000000000000000000836000613641565b5050565b6000610a7c8383613846565b90505b92915050565b8282610a928282336130b9565b828233909192610ab857604051630c76b97b60e41b815260040161095893929190615981565b505050610ac3613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190615964565b15610b4257604051632b37d9d160e21b815260040160405180910390fd5b610b4d85858561387e565b505050505050565b610b5d613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe91906159a4565b6001600160a01b0316336001600160a01b031614610bef57604051635d9044cd60e01b815260040160405180910390fd5b601a80546001600160401b0319166001600160401b0383169081179091556040519081527fe8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f9060200160405180910390a150565b610c4b613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190615964565b15610cca57604051632b37d9d160e21b815260040160405180910390fd5b610cd3816139af565b50565b600080610ce586868686613b5c565b90508060030154600003610cfd576000915050610dd0565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b8015610dc7576000610d438c83613bc8565b90508460050154816003015403610dbc576001810154426001600160401b0390911611610db657600083858360000154610d7d91906159d7565b610d8791906159ee565b9050610d938186615a10565b8254909550610da29085615a10565b9350610dae8188615a23565b965050610dbc565b50610dc7565b600201549050610d31565b50929450505050505b949350505050565b610de0613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190615964565b15610e5f57604051632b37d9d160e21b815260040160405180910390fd5b610e6f8383600080600086613c18565b505050565b610e7c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd9190615964565b15610efb57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0381166000908152601b60209081526040808320338085529252909120600381015483908390600160601b90046001600160401b0316610f57576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff9081169116141580610f9a57506003810154600160c01b81046001600160401b03908116600160201b9092041614155b15610e6f57600381018054600160201b6001600160401b03600160c01b63ffffffff19841663ffffffff600160a01b8604811691821792909204831684026001600160601b03199095161793909317938490556040516001600160a01b0380881695908916947fa4c005afae9298a5ca51e7710c334ac406fb3d914588ade970850f917cedb1c694611033949183169392041690615a50565b60405180910390a3505050565b611048613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190615964565b156110c757604051632b37d9d160e21b815260040160405180910390fd5b6110d033613d9e565b565b6110da613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190615964565b1561115957604051632b37d9d160e21b815260040160405180910390fd5b83836111668282336130b9565b82823390919261118c57604051630c76b97b60e41b815260040161095893929190615981565b50505061119c83620f4240101590565b83906111be57604051631504950160e21b815260040161095891815260200190565b506001600160a01b038087166000908152601c60209081526040808320938916835292905290812084918660028111156111fa576111fa615a6f565b600281111561120b5761120b615a6f565b815260208101919091526040016000205583600281111561122e5761122e615a6f565b856001600160a01b0316876001600160a01b03167f3474eba30406cacbfbc5a596a7e471662bbcccf206f8d244dbb6f4cc578c52208660405161127391815260200190565b60405180910390a4505050505050565b61128b613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906159a4565b6001600160a01b0316336001600160a01b03161461131d57604051635d9044cd60e01b815260040160405180910390fd5b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4542960abc7f2d26dab244fc440acf511e3dd0f5cefad571ca802283b4751bbb91015b60405180910390a25050565b611385613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190615964565b1561140457604051632b37d9d160e21b815260040160405180910390fd5b610e6f827f000000000000000000000000000000000000000000000000000000000000000083613e79565b6000611439613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190615964565b156114b857604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260146020908152604080832033808552600482019093529083209192909190807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190615a85565b905060008360020154118015611583575082600201548110155b1561159057826001015491505b600082116115b05760405162cf4d4760e51b815260040160405180910390fd5b60006001840181905560028401556040518281526001600160a01b0386811691908a16907f1b2e7737e043c5cf1b587ceb4daeb7ae00148b9bda8f79f1093eead08f1419529060200160405180910390a361161e858361160e613565565b6001600160a01b031691906140f1565b509695505050505050565b61163161514b565b61163961514b565b6000611645858561412c565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b611683613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e49190615964565b1561170257604051632b37d9d160e21b815260040160405180910390fd5b8160000361172357604051630a2a4e5b60e11b815260040160405180910390fd5b6117303383610a2f613565565b61173c84848484613641565b50505050565b61174a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190615964565b156117c957604051632b37d9d160e21b815260040160405180910390fd5b82826117d68282336130b9565b806117e95750336001600160a01b038216145b82823390919261180f57604051630c76b97b60e41b815260040161095893929190615981565b50505061181c85846141b0565b6118278585856141e8565b5050505050565b6001600160a01b038084166000908152601c6020908152604080832093861683529290529081208183600281111561186857611868615a6f565b600281111561187957611879615a6f565b81526020019081526020016000205490505b9392505050565b6000610dd08484846130b9565b6118a7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190615964565b1561192657604051632b37d9d160e21b815260040160405180910390fd5b83836119338282336130b9565b82823390919261195957604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038681166000908152601b60209081526040808320938916835292905220600381015487908790600160601b90046001600160401b03166119b9576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff908116908716141590600160c01b90046001600160401b03908116908616141581806119f55750805b15611b0d578115611a56578663ffffffff8116620f42401015611a34576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b5060038301805463ffffffff60a01b1916600160a01b63ffffffff8a16021790555b8015611ab657601a5486906001600160401b03908116908216811015611a915760405163ee5602e160e01b8152600401610958929190615a9e565b50506003830180546001600160c01b0316600160c01b6001600160401b038916021790555b428360040181905550876001600160a01b0316896001600160a01b03167fe89cbb9d63ba60af555547b12dde6817283e88cbdd45feb2059f2ba71ea346ba8989604051611b04929190615a50565b60405180910390a35b505050505050505050565b611b20613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190615964565b15611b9f57604051632b37d9d160e21b815260040160405180910390fd5b8484611bac8282336130b9565b828233909192611bd257604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038616600090815260226020526040902054869060ff16611c1057604051622920f760e21b8152600401610958919061553e565b50610971878688878761317d565b600080611c2b8585613846565b90506000611c398686614328565b90506000611c4d63ffffffff8616846159d7565b90506000611c5b838361434b565b9050611c678185615a23565b98975050505050505050565b611c7b61517a565b611c8361517a565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906159a4565b6001600160a01b0316336001600160a01b031614611d445760405162461bcd60e51b815260040161095890615ab8565b60405163623faf6160e01b81526001600160a01b0385169063623faf6190611d729086908690600401615aef565b600060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b5050505050505050565b6000611db4613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190615964565b15611e3357604051632b37d9d160e21b815260040160405180910390fd5b610dd0848484613e79565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906159a4565b6001600160a01b0316336001600160a01b031614611ed35760405162461bcd60e51b815260040161095890615ab8565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f0e57600080fd5b505af1158015610b4d573d6000803e3d6000fd5b611f2a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b9190615964565b15611fa957604051632b37d9d160e21b815260040160405180910390fd5b610a6c82826141b0565b611fbb613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190615964565b1561203a57604051632b37d9d160e21b815260040160405180910390fd5b610cd333826141b0565b6000610a7f82614362565b604080516000815260208101909152606090826001600160401b0381111561207957612079615b1e565b6040519080825280602002602001820160405280156120ac57816020015b60608152602001906001900390816120975790505b50915060005b8381101561212e57612109308686848181106120d0576120d0615b34565b90506020028101906120e29190615b4a565b856040516020016120f593929190615b90565b6040516020818303038152906040526143d3565b83828151811061211b5761211b615b34565b60209081029190910101526001016120b2565b505092915050565b61213e613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190615964565b156121bd57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260226020526040902054839060ff166121f857604051622920f760e21b8152600401610958919061553e565b50610e6f838383614449565b61220c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d9190615964565b1561228b57604051632b37d9d160e21b815260040160405180910390fd5b83836122988282336130b9565b8282339091926122be57604051630c76b97b60e41b815260040161095893929190615981565b50505085846122ce8282336130b9565b8282339091926122f457604051630c76b97b60e41b815260040161095893929190615981565b505050600061230489898861387e565b9050611b0d8988836141e8565b612319613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190615964565b1561239857604051632b37d9d160e21b815260040160405180910390fd5b610e6f838383614449565b6123ab613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c9190615964565b1561242a57604051632b37d9d160e21b815260040160405180910390fd5b8060000361244b57604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038084166000908152601b6020908152604080832093861683529281529082902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff80821660608401526001600160401b03600160201b830481166080850152600160601b8304811660a08501819052600160a01b840490921660c0850152600160c01b90920490911660e08301526004830154610100830152600590920154610120820152908490849061252a576040516330acea0d60e11b8152600401610958929190615a36565b50506000612538858561412c565b90506000816003015411858590916125655760405163b6a70b3b60e01b8152600401610958929190615a36565b50508281600201546125779190615a23565b60028201556125893384610a2f613565565b836001600160a01b0316856001600160a01b03167f673007a04e501145e79f59aea5e0413b6e88344fdaf10326254530d6a1511530856040516125ce91815260200190565b60405180910390a35050505050565b6040805160208101909152600081526040805160208101909152600081526000612607868661412c565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b60408051608081018252600080825260208201819052918101829052606081019190915261265d8383613bc8565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b6126a4613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270591906159a4565b6001600160a01b0316336001600160a01b03161461273657604051635d9044cd60e01b815260040160405180910390fd5b600d805463ffffffff191690556040517f93be484d290d119d9cf99cce69d173c732f9403333ad84f69c807b590203d10990600090a1565b60408051608081018252600080825260208201819052918101829052606081019190915261279e85858585613b5c565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b6127de613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190615964565b1561285d57604051632b37d9d160e21b815260040160405180910390fd5b3360009081526012602052604090205460ff1615612966576040516001600160a01b038581166024830152604482018590526064820184905282811660848301526000917f00000000000000000000000000000000000000000000000000000000000000009091169060a40160408051601f198184030181529181526020820180516001600160e01b031663224451c160e11b179052516128fe9190615bb7565b600060405180830381855af49150503d8060008114612939576040519150601f19603f3d011682016040523d82523d6000602084013e61293e565b606091505b50509050806129605760405163ef370f5160e01b815260040160405180910390fd5b5061173c565b6001600160a01b0384166000908152601b6020908152604080832033808552925282209091612995878461412c565b90506000816002015483600001546129ad9190615a23565b9050806000036129d057604051630a8a55c960e31b815260040160405180910390fd5b60006129dc888361434b565b905060006129ee85600001548361434b565b90508015612be8576003850154600090612a1390839063ffffffff9081169061457916565b9050888181811015612a3a57604051632f514d5760e21b8152600401610958929190615bd3565b50508815612aa757612a4f888a61160e613565565b876001600160a01b0316876001600160a01b03168c6001600160a01b03167f95ff4196cd75fa49180ba673948ea43935f59e7c4ba101fa09b9fe0ec266d5828c604051612a9e91815260200190565b60405180910390a45b612acb612ab48a84615a10565b612abc613565565b6001600160a01b0316906145d9565b8554612ad78382615a10565b8760010154612ae691906159d7565b612af091906159ee565b60018701558554612b02908390615a10565b8655600286015415801590612b1957506001860154155b15612b3d5760006002870181905560058701805491612b3783615be1565b91905055505b6001600160a01b038b166000908152600e6020526040902060040154612b64908390615a10565b6001600160a01b038c166000908152600e60205260409020600481019190915554612b90908390615a10565b6001600160a01b038c81166000818152600e60209081526040918290209490945551858152918a169290917fe7b110f13cde981d5079ab7faa4249c5f331f5c292dbc6031969d2ce694188a3910160405180910390a3505b612bf28183615a10565b91508115612d2c5760205460ff1615612cde57612c1182612abc613565565b6002840154612c208382615a10565b8560050154612c2f91906159d7565b612c3991906159ee565b60058501556002840154612c4e908390615a10565b6002850155600684015415801590612c6857506005840154155b15612c8c5760006006850181905560078501805491612c8683615be1565b91905055505b856001600160a01b03168a6001600160a01b03167fc5d16dbb577cf07678b577232717c9a606197a014f61847e623d47fc6bf6b77184604051612cd191815260200190565b60405180910390a3612d2c565b856001600160a01b03168a6001600160a01b03167fdce44f0aeed2089c75db59f5a517b9a19a734bf0213412fa129f0d0434126b2484604051612d2391815260200190565b60405180910390a35b50505050505050505050565b612d40613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da191906159a4565b6001600160a01b0316336001600160a01b031614612dd257604051635d9044cd60e01b815260040160405180910390fd5b6020805460ff191660011790556040517f2192802a8934dbf383338406b279ec7f3eccee31e58d6c0444d6dd6bfff24b3590600090a1565b612e12613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e739190615964565b15612e9157604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038416612eb8576040516322347d6760e21b815260040160405180910390fd5b6001600160a01b038316612edf5760405163a962605960e01b815260040160405180910390fd5b610b4d868686868686613c18565b6000612ef7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f589190615964565b15612f7657604051632b37d9d160e21b815260040160405180910390fd5b8383612f838282336130b9565b828233909192612fa957604051630c76b97b60e41b815260040161095893929190615981565b505050612fb7868686614621565b9695505050505050565b6000610a7c8383614328565b612fd5613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190615964565b1561305457604051632b37d9d160e21b815260040160405180910390fd5b82826130618282336130b9565b82823390919261308757604051630c76b97b60e41b815260040161095893929190615981565b5050506118278585856141e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000836001600160a01b0316826001600160a01b0316036130dc5750600161188b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361314457506001600160a01b0380841660009081526015602090815260408083209385168352929052205460ff1661188b565b506001600160a01b038084166000908152601f60209081526040808320868516845282528083209385168352929052205460ff1661188b565b6000841161319e57604051630a2a4e5b60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614806131e45750600d5463ffffffff16155b83906132045760405163353666ff60e01b8152600401610958919061553e565b508163ffffffff8116620f42401015613239576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b50601a5481906001600160401b0390811690821681101561326f5760405163ee5602e160e01b8152600401610958929190615a9e565b50506001600160a01b038581166000908152601b6020908152604080832093871683529290522060030154600160601b90046001600160401b0316156132c857604051632b542c0d60e11b815260040160405180910390fd5b60006132d386614362565b90508481808211156132fa5760405163ccaf28a960e01b8152600401610958929190615bd3565b505060405180610140016040528086815260200160008152602001600081526020018463ffffffff168152602001836001600160401b03168152602001426001600160401b031681526020018463ffffffff168152602001836001600160401b03168152602001600081526020016000815250601b6000886001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600301600c6101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160030160146101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160030160186101000a8154816001600160401b0302191690836001600160401b03160217905550610100820151816004015561012082015181600501559050506000600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002090508581600401546134fa9190615a23565b60048201556040805187815263ffffffff861660208201526001600160401b0385168183015290516001600160a01b0387811692908a16917f88b4c2d08cea0f01a24841ff5d14814ddb5b14ac44b05e0835fcc0dcd8c7bc259181900360600190a350505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610e6f576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af11580156135e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136099190615964565b610e6f5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610958565b81670de0b6b3a76400008082101561366e5760405163b86d885760e01b8152600401610958929190615bd3565b50506001600160a01b038481166000908152601b602090815260408083209387168352929052206003015484908490600160601b90046001600160401b03166136cc576040516330acea0d60e11b8152600401610958929190615a36565b505060006136da858561412c565b336000908152600482016020526040902060028201549192509015158061370357506003820154155b8686909161372657604051631984edef60e31b8152600401610958929190615a36565b50506000826002015460001480613744575082600501548360020154145b905060008161377f57836005015484600201546137619190615a10565b600385015461377090886159d7565b61377a91906159ee565b613781565b855b905080158015906137925750848110155b818690916137b557604051635d88e8d160e01b8152600401610958929190615bd3565b50508584600201546137c79190615a23565b600285015560038401546137dc908290615a23565b600385015582546137ee908290615a23565b835560405133906001600160a01b0389811691908b16907f237818af8bb47710142edd8fc301fbc507064fb357cf122fb161ca447e3cb13e90613834908b908790615bd3565b60405180910390a45050505050505050565b6001600160a01b038281166000908152601b60209081526040808320938516835292905290812060018101549054610a7c9190615a10565b6001600160a01b038381166000818152601b60209081526040808320948716808452948252808320600281015460018201548351610100810185528681529485018790529284019690965260608301949094526080820181905260a0820185905260c08201869052600584015460e08301529193849290916138ff816147b3565b875492965094509250613913908590615a10565b855560028501839055600185018290556001600160a01b0389166000908152600e60205260408120600401805486929061394e908490615a10565b92505081905550876001600160a01b0316896001600160a01b03167f9008d731ddfbec70bc364780efd63057c6877bee8027c4708a104b365395885d8660405161399a91815260200190565b60405180910390a35091979650505050505050565b3360008290036139d257604051630a2a4e5b60e11b815260040160405180910390fd5b60006139dd82614362565b9050828180821115613a045760405163ccaf28a960e01b8152600401610958929190615bd3565b50506001600160a01b0382166000908152600e602052604081208054600d549192909163ffffffff1690819003613a9657613a3f8683615a10565b8355613a4e858761160e613565565b846001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8387604051613a8991815260200190565b60405180910390a2610b4d565b600283015415801590613aad575082600301544310155b15613abb57613abb85613d9e565b600283015415613ae557613ae2613ad68460030154436148ad565b846002015483896148c7565b90505b858360020154613af59190615a23565b6002840155613b048143615a23565b6003840181905560028401546040516001600160a01b038816927f91642f23a1196e1424949fafa2a428c3b5d1f699763942ff08a6fbe9d4d7e98092613b4c92909190615bd3565b60405180910390a2505050505050565b6000601e6000866001811115613b7457613b74615a6f565b6001811115613b8557613b85615a6f565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d6000846001811115613be057613be0615a6f565b6001811115613bf157613bf1615a6f565b81526020019081526020016000206000838152602001908152602001600020905092915050565b6000613c24878761412c565b905080600201546000141580613c3c57506003810154155b87879091613c5f57604051631984edef60e31b8152600401610958929190615a36565b5050600681015460058201546040805161010081018252600181526001600160a01b03808c1660208301528a16918101919091523360608201526080810182905260a0810183905260c08101859052600784015460e08201526000929190613cc6816147b3565b600288015492965094509250613cdd908590615a10565b600286015560068501839055600585018290558315613d91576001600160a01b03891615801590613d1657506001600160a01b03881615155b15613d2c57613d278989868a613641565b613d91565b613d39338561160e613565565b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f305f519d8909c676ffd870495d4563032eb0b506891a6dd9827490256cc9914e87604051613d8891815260200190565b60405180910390a45b5050505050505050505050565b6001600160a01b0381166000908152600e6020526040812060028101549091819003613ddd57604051630a2a4e5b60e11b815260040160405180910390fd5b600382015443811115613e0657604051631d222f1b60e31b815260040161095891815260200190565b5060006002830181905560038301558154613e22908290615a10565b8255613e31838261160e613565565b826001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8382604051613e6c91815260200190565b60405180910390a2505050565b6000808211613e9b57604051637318ad9960e01b815260040160405180910390fd5b6000613ea7858561412c565b33600090815260048201602052604090208054919250908480821015613ee25760405163ab99793560e01b8152600401610958929190615bd3565b5050600282015486908690613f0c57604051631984edef60e31b8152600401610958929190615a36565b50506000826003015483600501548460020154613f299190615a10565b613f3390876159d7565b613f3d91906159ee565b905060008360050154600014613f705760058401546006850154613f6190846159d7565b613f6b91906159ee565b613f72565b815b6001600160a01b038981166000908152601b60209081526040808320938c1683529290529081206003015491925090613fbb90600160201b90046001600160401b031642615a23565b9050828560050154613fcd9190615a23565b60058601556006850154613fe2908390615a23565b60068601556003850154613ff7908890615a10565b60038601558354614009908890615a10565b8085551561407557600085600301548660050154876002015461402c9190615a10565b865461403891906159d7565b61404291906159ee565b905080670de0b6b3a7640000808210156140715760405163587ab9ab60e11b8152600401610958929190615bd3565b5050505b600061408b60018b8b3387878c6007015461491b565b9050336001600160a01b0316896001600160a01b03168b6001600160a01b03167f0525d6ad1aa78abc571b5c1984b5e1ea4f1412368c1cc348ca408dbb1085c9a1878c6040516140dc929190615bd3565b60405180910390a49998505050505050505050565b8015610e6f5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016135c6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361418557506001600160a01b0382166000908152601460205260409020610a7f565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610a7f565b806000036141d157604051630a2a4e5b60e11b815260040160405180910390fd5b6141de3382610a2f613565565b610a6c8282614ac1565b8060000361420957604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038381166000908152601b60209081526040808320938616835292905220600381015484908490600160601b90046001600160401b0316614266576040516330acea0d60e11b8152600401610958929190615a36565b5050600061427385614362565b905082818082111561429a5760405163ccaf28a960e01b8152600401610958929190615bd3565b505081546142a9908490615a23565b82556001600160a01b0385166000908152600e60205260409020600401546142d2908490615a23565b6001600160a01b038681166000818152600e602090815260409182902060040194909455518681529187169290917feaf6ea3a42ed2fd1b6d575f818cbda593af9524aa94bd30e65302ac4dc23474591016125ce565b600080614335848461412c565b905080600501548160020154610dd09190615a10565b60008183111561435b5781610a7c565b5090919050565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261439591615a23565b61439f9190615a23565b6001600160a01b0384166000908152600e60205260409020549091508181116143c9576000610dd0565b610dd08282615a10565b6060600080846001600160a01b0316846040516143f09190615bb7565b600060405180830381855af49150503d806000811461442b576040519150601f19603f3d011682016040523d82523d6000602084013e614430565b606091505b5091509150614440858383614b34565b95945050505050565b336001600160a01b0383160361447257604051630123065360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036144df573360009081526015602090815260408083206001600160a01b03861684529091529020805460ff191682151517905561451b565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020805460ff19168215151790555b816001600160a01b0316836001600160a01b0316336001600160a01b03167faa5a59b38e8f68292982382bf635c2f263ca37137bbc52956acd808fd7bf976f8460405161456c911515815260200190565b60405180910390a4505050565b600061458883620f4240101590565b8061459b575061459b82620f4240101590565b838390916145be5760405163768bf0eb60e11b8152600401610958929190615bd3565b50620f424090506145cf83856159d7565b610a7c91906159ee565b8015610a6c57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b158015611f0e57600080fd5b60008160000361464457604051630a2a4e5b60e11b815260040160405180910390fd5b60006146508585613846565b90508083808210156146775760405163587ab9ab60e11b8152600401610958929190615bd3565b50506001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154909190156146ec578160010154600183600101548785600201546146c991906159d7565b6146d39190615a23565b6146dd9190615a10565b6146e791906159ee565b6146ee565b845b600383015490915060009061471390600160201b90046001600160401b031642615a23565b90508183600201546147259190615a23565b6002840155600183015461473a908790615a23565b8360010181905550600061475860008a8a8c87878a6005015461491b565b9050876001600160a01b0316896001600160a01b03167f3b81913739097ced1e7fa748c6058d34e2c00b961fb501094543b397b198fdaa8960405161479f91815260200190565b60405180910390a398975050505050505050565b6000806000806147d58560000151866020015187604001518860600151613b5c565b905060008160030154116147fc576040516307e332c560e31b815260040160405180910390fd5b60006148088683614b87565b905085604001516001600160a01b031686602001516001600160a01b03168760000151600181111561483c5761483c615a6f565b6060808a01518551602080880151604080516001600160a01b039095168552918401929092528201527f86c2f162872d7c46d7ee0caad366da6dc430889b9d8f27e4bed3785548f9954b910160405180910390a4602081015160408201516060909201519097919650945092505050565b60008183116148bd576000610a7c565b610a7c8284615a10565b60006148d38285615a23565b60016148df8487615a23565b6148e99190615a10565b6148f384866159d7565b6148fd87896159d7565b6149079190615a23565b6149119190615a23565b61444091906159ee565b60008360000361493e57604051637318ad9960e01b815260040160405180910390fd5b600061494c89898989613b5c565b90506103e88160030154106149745760405163332b852b60e11b815260040160405180910390fd5b60028101546040516001600160601b031960608b811b821660208401528a811b8216603484015289901b166048820152605c810191909152600090607c0160405160208183030381529060405280519060200120905060006149d68b83613bc8565b8781556001810180546001600160401b0319166001600160401b03891617905560006002820155600380820187905584015490915015614a245781614a1f8c8560010154613bc8565b600201555b614a2e8383614c82565b886001600160a01b03168a6001600160a01b03168c6001811115614a5457614a54615a6f565b604080516001600160a01b038d168152602081018c90526001600160401b038b168183015260608101879052608081018a905290517f036538df4a591a5cc74b68cfc7f8c61e8173dbc81627e1d62600b61e820461789181900360a00190a4509998505050505050505050565b6001600160a01b0382166000908152600e6020526040902054614ae5908290615a23565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906113719084815260200190565b606082614b4957614b4482614d15565b61188b565b8151158015614b6057506001600160a01b0384163b155b15614b805783604051639996b31560e01b8152600401610958919061553e565b508061188b565b614bb26040518060800160405280600081526020016000815260200160008152602001600081525090565b615194614bc28460000151614d3e565b9050615194614bd48560000151614da3565b905060008560000151600087608001518860a001518960e00151604051602001614c02959493929190615bfa565b6040516020818303038152906040529050600080614c3785614dea86868c60c001518c614f5a9095949392919063ffffffff16565b91509150600080600083806020019051810190614c549190615c3d565b60408051608081018252998a5260208a019390935291880152606087015250939a9950505050505050505050565b612710826003015410614ca8576040516303a8c56b60e61b815260040160405180910390fd5b80614cc657604051638f4a893d60e01b815260040160405180910390fd5b6001808301829055600283018054600090614ce2908490615a23565b90915550506003820154600003614cf7578082555b6001826003016000828254614d0c9190615a23565b90915550505050565b805115614d255780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6151946000826001811115614d5557614d55615a6f565b03614d635750615014919050565b6001826001811115614d7757614d77615a6f565b03614d855750615056919050565b604051636bd1fba760e11b815260040160405180910390fd5b919050565b6151946000826001811115614dba57614dba615a6f565b03614dc85750615062919050565b6001826001811115614ddc57614ddc615a6f565b03614d8557506150b9919050565b60006060600080600080600087806020019051810190614e0a9190615c7c565b945094509450945094506000614e20868b613bc8565b6001810154909150426001600160401b039091161115614e5b5760016040518060200160405280600081525097509750505050505050614f53565b600381015460009083148015614eae5782548590614e7a9088906159d7565b614e8491906159ee565b9150614e908287615a10565b8354909650614e9f9086615a10565b9450614eab8288615a23565b96505b8b886001811115614ec157614ec1615a6f565b845460018601546040805187815260208101939093526001600160401b03909116828201528415156060830152517f469e89d0a4e0e5deb2eb1ade5b3fa67fdfbeb4787c3a7c1e8e89aaf28562cab29181900360800190a38787878787604051602001614f32959493929190615bfa565b6040516020818303038152906040529a5060008b9950995050505050505050505b9250929050565b600060608760030154831115614f8357604051634a411b9d60e11b815260040160405180910390fd5b60008315614f915783614f97565b88600301545b89549094505b8015801590614fac5750600085115b1561500557600080614fc283898c63ffffffff16565b915091508115614fd3575050615005565b965086614fe18c8c8b6150c4565b925086614fed81615cc5565b9750508380614ffb90615be1565b9450505050614f9d565b50989397509295505050505050565b6000601d81805b600181111561502c5761502c615a6f565b81526020019081526020016000206000838152602001908152602001600020600201549050919050565b6000601d81600161501b565b601d6000805b600181111561507957615079615a6f565b8152602080820192909252604090810160009081209381529290915281208181556001810180546001600160401b03191690556002810182905560030155565b601d60006001615068565b6000808460030154116150ea5760405163ddaf8f2160e01b815260040160405180910390fd5b60006150fd85600001548563ffffffff16565b905061511085600001548463ffffffff16565b60018560030160008282546151259190615a10565b9091555050808555600385015460000361514157600060018601555b5050915492915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6110d0615cdc565b6001600160a01b0381168114610cd357600080fd5b803563ffffffff81168114614d9e57600080fd5b80356001600160401b0381168114614d9e57600080fd5b600080600080600060a086880312156151f457600080fd5b85356151ff8161519c565b9450602086013561520f8161519c565b935060408601359250615224606087016151b1565b9150615232608087016151c5565b90509295509295909350565b6000806040838503121561525157600080fd5b823561525c8161519c565b946020939093013593505050565b6000806040838503121561527d57600080fd5b82356152888161519c565b915060208301356152988161519c565b809150509250929050565b6000806000606084860312156152b857600080fd5b83356152c38161519c565b925060208401356152d38161519c565b929592945050506040919091013590565b6000602082840312156152f657600080fd5b610a7c826151c5565b6000610140820190508251825260208301516020830152604083015160408301526060830151615337606084018263ffffffff169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538560c084018263ffffffff169052565b5060e08301516153a060e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b6000602082840312156153d157600080fd5b5035919050565b60028110610cd357600080fd5b600080600080608085870312156153fb57600080fd5b8435615406816153d8565b935060208501356154168161519c565b925060408501356154268161519c565b915060608501356154368161519c565b939692955090935050565b60006020828403121561545357600080fd5b813561188b8161519c565b803560038110614d9e57600080fd5b6000806000806080858703121561548357600080fd5b843561548e8161519c565b9350602085013561549e8161519c565b92506154ac6040860161545e565b9396929550929360600135925050565b8015158114610cd357600080fd5b600080604083850312156154dd57600080fd5b82356154e88161519c565b91506020830135615298816154bc565b6000806000806080858703121561550e57600080fd5b84356155198161519c565b935060208501356155298161519c565b93969395505050506040820135916060013590565b6001600160a01b0391909116815260200190565b60008060006060848603121561556757600080fd5b83356155728161519c565b925060208401356155828161519c565b91506155906040850161545e565b90509250925092565b6000806000606084860312156155ae57600080fd5b83356155b98161519c565b925060208401356155c98161519c565b915060408401356155d98161519c565b809150509250925092565b600080600080608085870312156155fa57600080fd5b84356156058161519c565b935060208501356156158161519c565b9250615623604086016151b1565b9150615631606086016151c5565b905092959194509250565b60008060006060848603121561565157600080fd5b833561565c8161519c565b9250602084013561566c8161519c565b9150615590604085016151b1565b60008060006040848603121561568f57600080fd5b833561569a8161519c565b925060208401356001600160401b038111156156b557600080fd5b8401601f810186136156c657600080fd5b80356001600160401b038111156156dc57600080fd5b8660208284010111156156ee57600080fd5b939660209190910195509293505050565b6000806020838503121561571257600080fd5b82356001600160401b0381111561572857600080fd5b8301601f8101851361573957600080fd5b80356001600160401b0381111561574f57600080fd5b8560208260051b840101111561576457600080fd5b6020919091019590945092505050565b60005b8381101561578f578181015183820152602001615777565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561580c57603f19878603018452815180518087526157e9816020890160208501615774565b601f01601f191695909501602090810195509384019391909101906001016157c0565b50929695505050505050565b60008060006060848603121561582d57600080fd5b83356158388161519c565b925060208401356158488161519c565b915060408401356155d9816154bc565b6000806000806080858703121561586e57600080fd5b84356158798161519c565b935060208501356158898161519c565b925060408501356154ac8161519c565b600080604083850312156158ac57600080fd5b823561525c816153d8565b600080600080608085870312156158cd57600080fd5b84356158d88161519c565b9350602085013592506040850135915060608501356154368161519c565b60008060008060008060c0878903121561590f57600080fd5b863561591a8161519c565b9550602087013561592a8161519c565b9450604087013561593a8161519c565b9350606087013561594a8161519c565b9598949750929560808101359460a0909101359350915050565b60006020828403121561597657600080fd5b815161188b816154bc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6000602082840312156159b657600080fd5b815161188b8161519c565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a7f57610a7f6159c1565b600082615a0b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610a7f57610a7f6159c1565b80820180821115610a7f57610a7f6159c1565b6001600160a01b0392831681529116602082015260400190565b63ffffffff9290921682526001600160401b0316602082015260400190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a9757600080fd5b5051919050565b6001600160401b0392831681529116602082015260400190565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112615b6157600080fd5b8301803591506001600160401b03821115615b7b57600080fd5b602001915036819003821315614f5357600080fd5b828482376000838201600081528351615bad818360208801615774565b0195945050505050565b60008251615bc9818460208701615774565b9190910192915050565b918252602082015260400190565b600060018201615bf357615bf36159c1565b5060010190565b60a0810160028710615c1c57634e487b7160e01b600052602160045260246000fd5b95815260208101949094526040840192909252606083015260809091015290565b60008060008060808587031215615c5357600080fd5b8451615c5e816153d8565b60208601516040870151606090970151919890975090945092505050565b600080600080600060a08688031215615c9457600080fd5b8551615c9f816153d8565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600081615cd457615cd46159c1565b506000190190565b634e487b7160e01b600052605160045260246000fdfea2646970667358221220f5046670ab269f9c179f41df4a02cd9c6b2ca3d5d507e2b9fcf15f800f351d8b64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStakingExtension.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStakingExtension.json new file mode 100644 index 000000000..2892b1dc2 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStakingExtension.json @@ -0,0 +1,1252 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "HorizonStakingExtension", + "sourceName": "contracts/staking/HorizonStakingExtension.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "address", + "name": "subgraphDataServiceAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidThawRequestType", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedOnlyController", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedOnlyGovernor", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "PPMMathInvalidPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "assetHolder", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolTax", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queryFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queryRebates", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delegationRewards", + "type": "uint256" + } + ], + "name": "RebateCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "StakeSlashed", + "type": "event" + }, + { + "inputs": [], + "name": "__DEPRECATED_getThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "closeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAtEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collectedFees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "__DEPRECATED_effectiveAllocation", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "distributedRebates", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingExtension.Allocation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocationState", + "outputs": [ + { + "internalType": "enum IHorizonStakingExtension.AllocationState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegatedTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "getDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Delegation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "getDelegationFeeCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegationPool", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.DelegationPool", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getIdleStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getIndexerStakedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProviderTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProvision", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "internalType": "uint32", + "name": "maxVerifierCutPending", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriodPending", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastParametersStagedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Provision", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getServiceProvider", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokensStaked", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensProvisioned", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ServiceProvider", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSubgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + } + ], + "name": "getThawRequest", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "nextRequest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ThawRequest", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawRequestList", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "internalType": "struct LinkedList.List", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "getTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "hasStake", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "isAllocation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "isAllowedLockedVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDelegationSlashingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "legacySlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b506040516133a83803806133a883398101604081905261003091610411565b818181806001600160a01b03811661007d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b590610347565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e890610347565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261012190610347565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015b90610347565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019390610347565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101ce90610347565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020c90610347565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024890610347565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027d90610347565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103279790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b03166101c052506104b4915050565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161038291815260200190565b602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c39190610444565b9050826001600160a01b0382166103ee5760405163218f5add60e11b81526004016100749190610466565b5092915050565b80516001600160a01b038116811461040c57600080fd5b919050565b6000806040838503121561042457600080fd5b61042d836103f5565b915061043b602084016103f5565b90509250929050565b60006020828403121561045657600080fd5b61045f826103f5565b9392505050565b602081526000825180602084015260005b818110156104945760208186018101516040868401015201610477565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051612e76610532600039600081816104ec0152611e5901526000611f6c0152600050506000505060006124d70152600061222e01526000611966015260005050600050506000505060006119a10152612e766000f3fe608060405234801561001057600080fd5b50600436106101805760003560e01c806308ce5f68146101855780630e022923146101ab5780631787e69f1461023357806325d9897e1461025c5780632f7cc5011461038457806339514ad2146103975780634488a382146103bc57806344c32a61146103d157806355c85269146103e4578063561285e41461042e5780637573ef4f146104835780637a76646014610233578063872d0489146104965780638cc01c86146104a95780638d3c100a146104d75780639363c522146104ea57806398c657dc146105185780639ce7abe514610538578063a2594d821461054b578063a784d4981461055e578063ac9650d814610571578063ae4fe67a14610591578063b6363cf2146105cd578063c0641994146105e0578063ccebcabb146105ee578063d48de84514610610578063e2e1e8e91461065f578063e56f8a1d1461067f578063e73e14bf146106c5578063f1d60d66146106f0578063fb744cc014610703578063fc54fb2714610716575b600080fd5b610198610193366004612721565b610721565b6040519081526020015b60405180910390f35b6101be6101b936600461275a565b610736565b6040516101a2919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b61019861024136600461275a565b6001600160a01b03166000908152600e602052604090205490565b61037761026a366004612721565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516101a29190612777565b61019861039236600461284b565b610816565b601a546001600160401b03165b6040516001600160401b0390911681526020016101a2565b6103cf6103ca3660046128a5565b610918565b005b6103cf6103df3660046128e4565b610d04565b6103f76103f236600461275a565b610d99565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c0016101a2565b61044161043c366004612721565b610e6f565b6040516101a29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b610198610491366004612910565b610ec1565b6101986104a436600461295f565b610f25565b6104bc6104b736600461275a565b610f7a565b604080518251815260209283015192810192909252016101a2565b6103cf6104e53660046129a8565b610fb6565b7f00000000000000000000000000000000000000000000000000000000000000006040516101a291906129cd565b61052b61052636600461275a565b611405565b6040516101a291906129f7565b6103cf610546366004612a1f565b611410565b6103cf61055936600461275a565b61150b565b61019861056c36600461275a565b6115f7565b61058461057f366004612aa4565b611602565b6040516101a29190612b3d565b6105bd61059f36600461275a565b6001600160a01b031660009081526022602052604090205460ff1690565b60405190151581526020016101a2565b6105bd6105db366004612721565b6116e9565b600d5463ffffffff166103a4565b6106016105fc366004612bbd565b611718565b604051905181526020016101a2565b61062361061e366004612bfd565b61176a565b6040516101a29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61019861066d366004612c19565b60009081526010602052604090205490565b61069261068d36600461284b565b6117d7565b6040516101a291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6105bd6106d336600461275a565b6001600160a01b03166000908152600e6020526040902054151590565b6105bd6106fe36600461275a565b61183f565b610198610711366004612721565b611864565b60205460ff166105bd565b600061072d8383611870565b90505b92915050565b61079160405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506001600160a01b039081166000908152600f6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b600080610825868686866118a8565b9050806003015460000361083d576000915050610910565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b80156109075760006108838c83611914565b905084600501548160030154036108fc576001810154426001600160401b03909116116108f6576000838583600001546108bd9190612c48565b6108c79190612c5f565b90506108d38186612c81565b82549095506108e29085612c81565b93506108ee8188612c94565b9650506108fc565b50610907565b600201549050610871565b50929450505050505b949350505050565b3360009081526012602052604090205460ff166109675760405162461bcd60e51b815260206004820152600860248201526710b9b630b9b432b960c11b60448201526064015b60405180910390fd5b61096f611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612ca7565b156109ee57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0384166000908152600e6020526040902083610a3d5760405162461bcd60e51b815260206004820152600760248201526621746f6b656e7360c81b604482015260640161095e565b82841015610a7d5760405162461bcd60e51b815260206004820152600d60248201526c0e4caeec2e4c8e67ce6d8c2e6d609b1b604482015260640161095e565b8054610ab45760405162461bcd60e51b8152602060048201526006602482015265217374616b6560d01b604482015260640161095e565b8054841115610af35760405162461bcd60e51b815260206004820152600b60248201526a736c6173683e7374616b6560a81b604482015260640161095e565b6001600160a01b038216610b385760405162461bcd60e51b815260206004820152600c60248201526b2162656e656669636961727960a01b604482015260640161095e565b600081600201548260010154610b4e9190612c94565b9050600082600001548211610b6f578254610b6a908390612c81565b610b72565b60005b90508086118015610b87575060008360020154115b15610bd5576000610b988288612c81565b90506000610baa828660020154611988565b9050808560020154610bbc9190612c81565b60028601819055600003610bd257600060038601555b50505b60048301548354600091610be891612c81565b905080600003610c4157876001600160a01b03167ff2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f360008088604051610c3093929190612cc9565b60405180910390a250505050610cfe565b80871115610c645786610c548288612c48565b610c5e9190612c5f565b95508096505b8354610c71908890612c81565b8455610c97610c808789612c81565b610c8861199f565b6001600160a01b0316906119c3565b610cb48587610ca461199f565b6001600160a01b03169190611a0b565b876001600160a01b03167ff2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f3888888604051610cf193929190612cc9565b60405180910390a2505050505b50505050565b610d0c611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6d9190612ca7565b15610d8b57604051632b37d9d160e21b815260040160405180910390fd5b610d958282611ac2565b5050565b6001600160a01b038082166000908152600f6020908152604080832081516101208101835281549095168552600180820154938601939093526002810154918501919091526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152600801546101008401529091829182918291829182918290610e318a611dfc565b6002811115610e4257610e426129e1565b83516020850151604086015160e090960151939092149c909b509099509297509550600094509092505050565b610e776126c3565b610e7f6126c3565b6000610e8b8585611e55565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b6001600160a01b038084166000908152601c60209081526040808320938616835292905290812081836002811115610efb57610efb6129e1565b6002811115610f0c57610f0c6129e1565b81526020019081526020016000205490505b9392505050565b600080610f328585611870565b90506000610f408686611ed9565b90506000610f5463ffffffff861684612c48565b90506000610f628383611988565b9050610f6e8185612c94565b98975050505050505050565b610f826126f2565b610f8a6126f2565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b610fbe611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190612ca7565b1561103d57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b03811661107c5760405162461bcd60e51b815260206004820152600660248201526521616c6c6f6360d01b604482015260640161095e565b600061108782611dfc565b9050600081600281111561109d5761109d6129e1565b036110d55760405162461bcd60e51b81526020600482015260086024820152670858dbdb1b1958dd60c21b604482015260640161095e565b826000036110e257505050565b6001600160a01b0382166000908152600f60205260408120600181015490918590808080611123338661111361199f565b6001600160a01b03169190611efc565b600d5461113e908690600160401b900463ffffffff16611f3d565b935061114a8486612c81565b600d5490955061116a9087908790600160201b900463ffffffff16611f58565b92506111768386612c81565b94508487600501546111889190612c94565b6005880155600287015460009015806111ae5750601954600160a01b900463ffffffff16155b6112795760058801546002890154600d546019546040516349484d8160e01b81526004810194909452602484019290925263ffffffff600160a01b80830482166044860152600160c01b928390048216606486015283048116608485015291041660a482015273__$8eb3cac1482a31d7a7f2cbe7dc8bdcd821$__906349484d819060c401602060405180830381865af4158015611250573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112749190612ce8565b61127c565b60005b905061128c81896008015461212e565b92506112988387611988565b92506112a7610c808488612c81565b821561130f578288600801546112bd9190612c94565b600889015587546112d7906001600160a01b031684612148565b91506112e38284612c81565b88546001600160a01b0390811660008181526017602052604090205492955061130f92869216156121da565b5086546001600160a01b03808b16918891167ff5ded07502b6feba4c13b19a0c6646efd4b4119f439bcbd49076e4f0ed1eec4b3361134b61222c565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190612ce8565b604080516001600160a01b039093168352602083019190915281018f9052606081018990526080810188905260a081018a905260c0810187905260e081018690526101000160405180910390a450505050505050505050565b600061073082611dfc565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190612d01565b6001600160a01b0316336001600160a01b0316146114a55760405162461bcd60e51b815260040161095e90612d1e565b60405163623faf6160e01b81526001600160a01b0385169063623faf61906114d39086908690600401612d55565b600060405180830381600087803b1580156114ed57600080fd5b505af1158015611501573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af115801561154c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115709190612d01565b6001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161095e90612d1e565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b505050505050565b600061073082612250565b604080516000815260208101909152606090826001600160401b0381111561162c5761162c612d84565b60405190808252806020026020018201604052801561165f57816020015b606081526020019060019003908161164a5790505b50915060005b838110156116e1576116bc3086868481811061168357611683612d9a565b90506020028101906116959190612db0565b856040516020016116a893929190612dfd565b6040516020818303038152906040526122c1565b8382815181106116ce576116ce612d9a565b6020908102919091010152600101611665565b505092915050565b6001600160a01b0380821660009081526015602090815260408083209386168352929052205460ff1692915050565b60408051602081019091526000815260408051602081019091526000815260006117428686611e55565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b6040805160808101825260008082526020820181905291810182905260608101919091526117988383611914565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b604080516080810182526000808252602082018190529181018290526060810191909152611807858585856118a8565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b60008061184b83611dfc565b600281111561185c5761185c6129e1565b141592915050565b600061072d8383611ed9565b6001600160a01b038281166000908152601b6020908152604080832093851683529290529081206001810154905461072d9190612c81565b6000601e60008660018111156118c0576118c06129e1565b60018111156118d1576118d16129e1565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d600084600181111561192c5761192c6129e1565b600181111561193d5761193d6129e1565b81526020019081526020016000206000838152602001908152602001600020905092915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081831115611998578161072d565b5090919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610d9557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b1580156115db57600080fd5b8015611abd5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044015b6020604051808303816000875af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a859190612ca7565b611abd5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015260640161095e565b505050565b6000611acd83611dfc565b90506001816002811115611ae357611ae36129e1565b14611b1a5760405162461bcd60e51b81526020600482015260076024820152662161637469766560c81b604482015260640161095e565b6001600160a01b038084166000908152600f6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260080154610100820152611ba361222c565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190612ce8565b608082018190526060820151600091611c1c9161212e565b9050600082600001516001600160a01b0316336001600160a01b03161480611c4d5750611c4d3384600001516116e9565b600d54909150600160801b900463ffffffff1682111580611c7057506040830151155b15611caa5780611caa5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161095e565b604083015115611d6857808015611cc057508415155b15611cd857611cd3868460000151612337565b611ce5565b611ce5836020015161240b565b60408084015184516001600160a01b03166000908152600e6020529190912060010154611d129190612c81565b83516001600160a01b03166000908152600e602090815260408083206001019390935582860151818701518352601090915291902054611d529190612c81565b6020808501516000908152601090915260409020555b608080840180516001600160a01b03808a166000818152600f6020908152604091829020600401949094558389015189519551828b01518351918252958101959095523391850191909152606084018b9052861595840195909552939216907ff6725dd105a6fc88bb79a6e4627f128577186c567a17c94818d201c2a4ce14039060a00160405180910390a4505050505050565b6001600160a01b038082166000908152600f6020526040812080549192909116611e295750600092915050565b600381015415801590611e3e57506004810154155b15611e4c5750600192915050565b50600292915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611eae57506001600160a01b0382166000908152601460205260409020610730565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610730565b600080611ee68484611e55565b9050806005015481600201546109109190612c81565b8015611abd576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401611a42565b600080611f4a8484612483565b905061072d81610c8861199f565b600082600003611f6a57506000610f1e565b7f000000000000000000000000000000000000000000000000000000000000000060008315801590611fa457506001600160a01b03821615155b90508080156120175750604051634c4ea0ed60e01b8152600481018790526001600160a01b03831690634c4ea0ed90602401602060405180830381865afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612ca7565b156121225760006120288686612483565b90508015612118576120386124d5565b6001600160a01b0316631d1c2fec886040518263ffffffff1660e01b815260040161206591815260200190565b6020604051808303816000875af1158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612ce8565b506120b68382610ca461199f565b60405163102ae65160e31b815260048101889052602481018290526001600160a01b03841690638157328890604401600060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050505b9250610f1e915050565b50600095945050505050565b600081831161213e57600061072d565b61072d8284612c81565b6001600160a01b038216600090815260146020526040812060028101548291901580159061218757508054600160401b900463ffffffff16620f424010155b156121d25780546000906121ad9063ffffffff600160401b90910481169087906124f916565b90506121b98186612c81565b92508282600201546121cb9190612c94565b6002830155505b509392505050565b826000036121e757505050565b80156121f757611abd8284612560565b6001600160a01b0380831660009081526017602052604090205416610cfe81156122215781612223565b835b85610ca461199f565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261228391612c94565b61228d9190612c94565b6001600160a01b0384166000908152600e60205260409020549091508181116122b7576000610910565b6109108282612c81565b6060600080846001600160a01b0316846040516122de9190612e24565b600060405180830381855af49150503d8060008114612319576040519150601f19603f3d011682016040523d82523d6000602084013e61231e565b606091505b509150915061232e8583836125df565b95945050505050565b60006123416124d5565b6001600160a01b031663db750926846040518263ffffffff1660e01b815260040161236c91906129cd565b6020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190612ce8565b9050806000036123be57505050565b60006123ca8383612632565b905060006123d88284612c81565b6001600160a01b03808616600090815260176020526040902054919250612404918391879116156121da565b5050505050565b6124136124d5565b6001600160a01b031663eeac3e0e826040518263ffffffff1660e01b815260040161244091815260200190565b6020604051808303816000875af115801561245f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612ce8565b600061249282620f4240101590565b82906124b457604051633dc311df60e01b815260040161095e91815260200190565b506124cb836124c684620f4240612c81565b6124f9565b61072d9084612c81565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061250883620f4240101590565b8061251b575061251b82620f4240101590565b838390916125455760405163768bf0eb60e11b81526004810192909252602482015260440161095e565b50620f424090506125568385612c48565b61072d9190612c5f565b6001600160a01b0382166000908152600e6020526040902054612584908290612c94565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906125d39084815260200190565b60405180910390a25050565b6060826125f4576125ef82612697565b610f1e565b815115801561260b57506001600160a01b0384163b155b1561262b5783604051639996b31560e01b815260040161095e91906129cd565b5080610f1e565b6001600160a01b038216600090815260146020526040812060028101548291901580159061267157508054600160201b900463ffffffff16620f424010155b156121d25780546000906121ad9063ffffffff600160201b90910481169087906124f916565b8051156126a75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6001600160a01b03811681146126c057600080fd5b6000806040838503121561273457600080fd5b823561273f8161270c565b9150602083013561274f8161270c565b809150509250929050565b60006020828403121561276c57600080fd5b813561072d8161270c565b60006101408201905082518252602083015160208301526040830151604083015260608301516127af606084018263ffffffff169052565b5060808301516127ca60808401826001600160401b03169052565b5060a08301516127e560a08401826001600160401b03169052565b5060c08301516127fd60c084018263ffffffff169052565b5060e083015161281860e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b80356002811061284657600080fd5b919050565b6000806000806080858703121561286157600080fd5b61286a85612837565b9350602085013561287a8161270c565b9250604085013561288a8161270c565b9150606085013561289a8161270c565b939692955090935050565b600080600080608085870312156128bb57600080fd5b84356128c68161270c565b93506020850135925060408501359150606085013561289a8161270c565b600080604083850312156128f757600080fd5b82356129028161270c565b946020939093013593505050565b60008060006060848603121561292557600080fd5b83356129308161270c565b925060208401356129408161270c565b915060408401356003811061295457600080fd5b809150509250925092565b60008060006060848603121561297457600080fd5b833561297f8161270c565b9250602084013561298f8161270c565b9150604084013563ffffffff8116811461295457600080fd5b600080604083850312156129bb57600080fd5b82359150602083013561274f8161270c565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612a1957634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060408486031215612a3457600080fd5b8335612a3f8161270c565b925060208401356001600160401b03811115612a5a57600080fd5b8401601f81018613612a6b57600080fd5b80356001600160401b03811115612a8157600080fd5b866020828401011115612a9357600080fd5b939660209190910195509293505050565b60008060208385031215612ab757600080fd5b82356001600160401b03811115612acd57600080fd5b8301601f81018513612ade57600080fd5b80356001600160401b03811115612af457600080fd5b8560208260051b8401011115612b0957600080fd5b6020919091019590945092505050565b60005b83811015612b34578181015183820152602001612b1c565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015612bb157603f1987860301845281518051808752612b8e816020890160208501612b19565b601f01601f19169590950160209081019550938401939190910190600101612b65565b50929695505050505050565b600080600060608486031215612bd257600080fd5b8335612bdd8161270c565b92506020840135612bed8161270c565b915060408401356129548161270c565b60008060408385031215612c1057600080fd5b61290283612837565b600060208284031215612c2b57600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761073057610730612c32565b600082612c7c57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561073057610730612c32565b8082018082111561073057610730612c32565b600060208284031215612cb957600080fd5b8151801515811461072d57600080fd5b92835260208301919091526001600160a01b0316604082015260600190565b600060208284031215612cfa57600080fd5b5051919050565b600060208284031215612d1357600080fd5b815161072d8161270c565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612dc757600080fd5b8301803591506001600160401b03821115612de157600080fd5b602001915036819003821315612df657600080fd5b9250929050565b828482376000838201600081528351612e1a818360208801612b19565b0195945050505050565b60008251612e36818460208701612b19565b919091019291505056fea2646970667358221220eee2ca3f28b971ad70ed8bb53d0d0f8eb32b9f33a12776bc83fb4b7d1b75ddfd64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101805760003560e01c806308ce5f68146101855780630e022923146101ab5780631787e69f1461023357806325d9897e1461025c5780632f7cc5011461038457806339514ad2146103975780634488a382146103bc57806344c32a61146103d157806355c85269146103e4578063561285e41461042e5780637573ef4f146104835780637a76646014610233578063872d0489146104965780638cc01c86146104a95780638d3c100a146104d75780639363c522146104ea57806398c657dc146105185780639ce7abe514610538578063a2594d821461054b578063a784d4981461055e578063ac9650d814610571578063ae4fe67a14610591578063b6363cf2146105cd578063c0641994146105e0578063ccebcabb146105ee578063d48de84514610610578063e2e1e8e91461065f578063e56f8a1d1461067f578063e73e14bf146106c5578063f1d60d66146106f0578063fb744cc014610703578063fc54fb2714610716575b600080fd5b610198610193366004612721565b610721565b6040519081526020015b60405180910390f35b6101be6101b936600461275a565b610736565b6040516101a2919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b61019861024136600461275a565b6001600160a01b03166000908152600e602052604090205490565b61037761026a366004612721565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516101a29190612777565b61019861039236600461284b565b610816565b601a546001600160401b03165b6040516001600160401b0390911681526020016101a2565b6103cf6103ca3660046128a5565b610918565b005b6103cf6103df3660046128e4565b610d04565b6103f76103f236600461275a565b610d99565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c0016101a2565b61044161043c366004612721565b610e6f565b6040516101a29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b610198610491366004612910565b610ec1565b6101986104a436600461295f565b610f25565b6104bc6104b736600461275a565b610f7a565b604080518251815260209283015192810192909252016101a2565b6103cf6104e53660046129a8565b610fb6565b7f00000000000000000000000000000000000000000000000000000000000000006040516101a291906129cd565b61052b61052636600461275a565b611405565b6040516101a291906129f7565b6103cf610546366004612a1f565b611410565b6103cf61055936600461275a565b61150b565b61019861056c36600461275a565b6115f7565b61058461057f366004612aa4565b611602565b6040516101a29190612b3d565b6105bd61059f36600461275a565b6001600160a01b031660009081526022602052604090205460ff1690565b60405190151581526020016101a2565b6105bd6105db366004612721565b6116e9565b600d5463ffffffff166103a4565b6106016105fc366004612bbd565b611718565b604051905181526020016101a2565b61062361061e366004612bfd565b61176a565b6040516101a29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61019861066d366004612c19565b60009081526010602052604090205490565b61069261068d36600461284b565b6117d7565b6040516101a291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6105bd6106d336600461275a565b6001600160a01b03166000908152600e6020526040902054151590565b6105bd6106fe36600461275a565b61183f565b610198610711366004612721565b611864565b60205460ff166105bd565b600061072d8383611870565b90505b92915050565b61079160405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506001600160a01b039081166000908152600f6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b600080610825868686866118a8565b9050806003015460000361083d576000915050610910565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b80156109075760006108838c83611914565b905084600501548160030154036108fc576001810154426001600160401b03909116116108f6576000838583600001546108bd9190612c48565b6108c79190612c5f565b90506108d38186612c81565b82549095506108e29085612c81565b93506108ee8188612c94565b9650506108fc565b50610907565b600201549050610871565b50929450505050505b949350505050565b3360009081526012602052604090205460ff166109675760405162461bcd60e51b815260206004820152600860248201526710b9b630b9b432b960c11b60448201526064015b60405180910390fd5b61096f611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612ca7565b156109ee57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0384166000908152600e6020526040902083610a3d5760405162461bcd60e51b815260206004820152600760248201526621746f6b656e7360c81b604482015260640161095e565b82841015610a7d5760405162461bcd60e51b815260206004820152600d60248201526c0e4caeec2e4c8e67ce6d8c2e6d609b1b604482015260640161095e565b8054610ab45760405162461bcd60e51b8152602060048201526006602482015265217374616b6560d01b604482015260640161095e565b8054841115610af35760405162461bcd60e51b815260206004820152600b60248201526a736c6173683e7374616b6560a81b604482015260640161095e565b6001600160a01b038216610b385760405162461bcd60e51b815260206004820152600c60248201526b2162656e656669636961727960a01b604482015260640161095e565b600081600201548260010154610b4e9190612c94565b9050600082600001548211610b6f578254610b6a908390612c81565b610b72565b60005b90508086118015610b87575060008360020154115b15610bd5576000610b988288612c81565b90506000610baa828660020154611988565b9050808560020154610bbc9190612c81565b60028601819055600003610bd257600060038601555b50505b60048301548354600091610be891612c81565b905080600003610c4157876001600160a01b03167ff2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f360008088604051610c3093929190612cc9565b60405180910390a250505050610cfe565b80871115610c645786610c548288612c48565b610c5e9190612c5f565b95508096505b8354610c71908890612c81565b8455610c97610c808789612c81565b610c8861199f565b6001600160a01b0316906119c3565b610cb48587610ca461199f565b6001600160a01b03169190611a0b565b876001600160a01b03167ff2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f3888888604051610cf193929190612cc9565b60405180910390a2505050505b50505050565b610d0c611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6d9190612ca7565b15610d8b57604051632b37d9d160e21b815260040160405180910390fd5b610d958282611ac2565b5050565b6001600160a01b038082166000908152600f6020908152604080832081516101208101835281549095168552600180820154938601939093526002810154918501919091526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152600801546101008401529091829182918291829182918290610e318a611dfc565b6002811115610e4257610e426129e1565b83516020850151604086015160e090960151939092149c909b509099509297509550600094509092505050565b610e776126c3565b610e7f6126c3565b6000610e8b8585611e55565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b6001600160a01b038084166000908152601c60209081526040808320938616835292905290812081836002811115610efb57610efb6129e1565b6002811115610f0c57610f0c6129e1565b81526020019081526020016000205490505b9392505050565b600080610f328585611870565b90506000610f408686611ed9565b90506000610f5463ffffffff861684612c48565b90506000610f628383611988565b9050610f6e8185612c94565b98975050505050505050565b610f826126f2565b610f8a6126f2565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b610fbe611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190612ca7565b1561103d57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b03811661107c5760405162461bcd60e51b815260206004820152600660248201526521616c6c6f6360d01b604482015260640161095e565b600061108782611dfc565b9050600081600281111561109d5761109d6129e1565b036110d55760405162461bcd60e51b81526020600482015260086024820152670858dbdb1b1958dd60c21b604482015260640161095e565b826000036110e257505050565b6001600160a01b0382166000908152600f60205260408120600181015490918590808080611123338661111361199f565b6001600160a01b03169190611efc565b600d5461113e908690600160401b900463ffffffff16611f3d565b935061114a8486612c81565b600d5490955061116a9087908790600160201b900463ffffffff16611f58565b92506111768386612c81565b94508487600501546111889190612c94565b6005880155600287015460009015806111ae5750601954600160a01b900463ffffffff16155b6112795760058801546002890154600d546019546040516349484d8160e01b81526004810194909452602484019290925263ffffffff600160a01b80830482166044860152600160c01b928390048216606486015283048116608485015291041660a482015273__$8eb3cac1482a31d7a7f2cbe7dc8bdcd821$__906349484d819060c401602060405180830381865af4158015611250573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112749190612ce8565b61127c565b60005b905061128c81896008015461212e565b92506112988387611988565b92506112a7610c808488612c81565b821561130f578288600801546112bd9190612c94565b600889015587546112d7906001600160a01b031684612148565b91506112e38284612c81565b88546001600160a01b0390811660008181526017602052604090205492955061130f92869216156121da565b5086546001600160a01b03808b16918891167ff5ded07502b6feba4c13b19a0c6646efd4b4119f439bcbd49076e4f0ed1eec4b3361134b61222c565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190612ce8565b604080516001600160a01b039093168352602083019190915281018f9052606081018990526080810188905260a081018a905260c0810187905260e081018690526101000160405180910390a450505050505050505050565b600061073082611dfc565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190612d01565b6001600160a01b0316336001600160a01b0316146114a55760405162461bcd60e51b815260040161095e90612d1e565b60405163623faf6160e01b81526001600160a01b0385169063623faf61906114d39086908690600401612d55565b600060405180830381600087803b1580156114ed57600080fd5b505af1158015611501573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af115801561154c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115709190612d01565b6001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161095e90612d1e565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b505050505050565b600061073082612250565b604080516000815260208101909152606090826001600160401b0381111561162c5761162c612d84565b60405190808252806020026020018201604052801561165f57816020015b606081526020019060019003908161164a5790505b50915060005b838110156116e1576116bc3086868481811061168357611683612d9a565b90506020028101906116959190612db0565b856040516020016116a893929190612dfd565b6040516020818303038152906040526122c1565b8382815181106116ce576116ce612d9a565b6020908102919091010152600101611665565b505092915050565b6001600160a01b0380821660009081526015602090815260408083209386168352929052205460ff1692915050565b60408051602081019091526000815260408051602081019091526000815260006117428686611e55565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b6040805160808101825260008082526020820181905291810182905260608101919091526117988383611914565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b604080516080810182526000808252602082018190529181018290526060810191909152611807858585856118a8565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b60008061184b83611dfc565b600281111561185c5761185c6129e1565b141592915050565b600061072d8383611ed9565b6001600160a01b038281166000908152601b6020908152604080832093851683529290529081206001810154905461072d9190612c81565b6000601e60008660018111156118c0576118c06129e1565b60018111156118d1576118d16129e1565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d600084600181111561192c5761192c6129e1565b600181111561193d5761193d6129e1565b81526020019081526020016000206000838152602001908152602001600020905092915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081831115611998578161072d565b5090919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610d9557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b1580156115db57600080fd5b8015611abd5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044015b6020604051808303816000875af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a859190612ca7565b611abd5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015260640161095e565b505050565b6000611acd83611dfc565b90506001816002811115611ae357611ae36129e1565b14611b1a5760405162461bcd60e51b81526020600482015260076024820152662161637469766560c81b604482015260640161095e565b6001600160a01b038084166000908152600f6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260080154610100820152611ba361222c565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190612ce8565b608082018190526060820151600091611c1c9161212e565b9050600082600001516001600160a01b0316336001600160a01b03161480611c4d5750611c4d3384600001516116e9565b600d54909150600160801b900463ffffffff1682111580611c7057506040830151155b15611caa5780611caa5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161095e565b604083015115611d6857808015611cc057508415155b15611cd857611cd3868460000151612337565b611ce5565b611ce5836020015161240b565b60408084015184516001600160a01b03166000908152600e6020529190912060010154611d129190612c81565b83516001600160a01b03166000908152600e602090815260408083206001019390935582860151818701518352601090915291902054611d529190612c81565b6020808501516000908152601090915260409020555b608080840180516001600160a01b03808a166000818152600f6020908152604091829020600401949094558389015189519551828b01518351918252958101959095523391850191909152606084018b9052861595840195909552939216907ff6725dd105a6fc88bb79a6e4627f128577186c567a17c94818d201c2a4ce14039060a00160405180910390a4505050505050565b6001600160a01b038082166000908152600f6020526040812080549192909116611e295750600092915050565b600381015415801590611e3e57506004810154155b15611e4c5750600192915050565b50600292915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611eae57506001600160a01b0382166000908152601460205260409020610730565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610730565b600080611ee68484611e55565b9050806005015481600201546109109190612c81565b8015611abd576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401611a42565b600080611f4a8484612483565b905061072d81610c8861199f565b600082600003611f6a57506000610f1e565b7f000000000000000000000000000000000000000000000000000000000000000060008315801590611fa457506001600160a01b03821615155b90508080156120175750604051634c4ea0ed60e01b8152600481018790526001600160a01b03831690634c4ea0ed90602401602060405180830381865afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612ca7565b156121225760006120288686612483565b90508015612118576120386124d5565b6001600160a01b0316631d1c2fec886040518263ffffffff1660e01b815260040161206591815260200190565b6020604051808303816000875af1158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612ce8565b506120b68382610ca461199f565b60405163102ae65160e31b815260048101889052602481018290526001600160a01b03841690638157328890604401600060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050505b9250610f1e915050565b50600095945050505050565b600081831161213e57600061072d565b61072d8284612c81565b6001600160a01b038216600090815260146020526040812060028101548291901580159061218757508054600160401b900463ffffffff16620f424010155b156121d25780546000906121ad9063ffffffff600160401b90910481169087906124f916565b90506121b98186612c81565b92508282600201546121cb9190612c94565b6002830155505b509392505050565b826000036121e757505050565b80156121f757611abd8284612560565b6001600160a01b0380831660009081526017602052604090205416610cfe81156122215781612223565b835b85610ca461199f565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261228391612c94565b61228d9190612c94565b6001600160a01b0384166000908152600e60205260409020549091508181116122b7576000610910565b6109108282612c81565b6060600080846001600160a01b0316846040516122de9190612e24565b600060405180830381855af49150503d8060008114612319576040519150601f19603f3d011682016040523d82523d6000602084013e61231e565b606091505b509150915061232e8583836125df565b95945050505050565b60006123416124d5565b6001600160a01b031663db750926846040518263ffffffff1660e01b815260040161236c91906129cd565b6020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190612ce8565b9050806000036123be57505050565b60006123ca8383612632565b905060006123d88284612c81565b6001600160a01b03808616600090815260176020526040902054919250612404918391879116156121da565b5050505050565b6124136124d5565b6001600160a01b031663eeac3e0e826040518263ffffffff1660e01b815260040161244091815260200190565b6020604051808303816000875af115801561245f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612ce8565b600061249282620f4240101590565b82906124b457604051633dc311df60e01b815260040161095e91815260200190565b506124cb836124c684620f4240612c81565b6124f9565b61072d9084612c81565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061250883620f4240101590565b8061251b575061251b82620f4240101590565b838390916125455760405163768bf0eb60e11b81526004810192909252602482015260440161095e565b50620f424090506125568385612c48565b61072d9190612c5f565b6001600160a01b0382166000908152600e6020526040902054612584908290612c94565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906125d39084815260200190565b60405180910390a25050565b6060826125f4576125ef82612697565b610f1e565b815115801561260b57506001600160a01b0384163b155b1561262b5783604051639996b31560e01b815260040161095e91906129cd565b5080610f1e565b6001600160a01b038216600090815260146020526040812060028101548291901580159061267157508054600160201b900463ffffffff16620f424010155b156121d25780546000906121ad9063ffffffff600160201b90910481169087906124f916565b8051156126a75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6001600160a01b03811681146126c057600080fd5b6000806040838503121561273457600080fd5b823561273f8161270c565b9150602083013561274f8161270c565b809150509250929050565b60006020828403121561276c57600080fd5b813561072d8161270c565b60006101408201905082518252602083015160208301526040830151604083015260608301516127af606084018263ffffffff169052565b5060808301516127ca60808401826001600160401b03169052565b5060a08301516127e560a08401826001600160401b03169052565b5060c08301516127fd60c084018263ffffffff169052565b5060e083015161281860e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b80356002811061284657600080fd5b919050565b6000806000806080858703121561286157600080fd5b61286a85612837565b9350602085013561287a8161270c565b9250604085013561288a8161270c565b9150606085013561289a8161270c565b939692955090935050565b600080600080608085870312156128bb57600080fd5b84356128c68161270c565b93506020850135925060408501359150606085013561289a8161270c565b600080604083850312156128f757600080fd5b82356129028161270c565b946020939093013593505050565b60008060006060848603121561292557600080fd5b83356129308161270c565b925060208401356129408161270c565b915060408401356003811061295457600080fd5b809150509250925092565b60008060006060848603121561297457600080fd5b833561297f8161270c565b9250602084013561298f8161270c565b9150604084013563ffffffff8116811461295457600080fd5b600080604083850312156129bb57600080fd5b82359150602083013561274f8161270c565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612a1957634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060408486031215612a3457600080fd5b8335612a3f8161270c565b925060208401356001600160401b03811115612a5a57600080fd5b8401601f81018613612a6b57600080fd5b80356001600160401b03811115612a8157600080fd5b866020828401011115612a9357600080fd5b939660209190910195509293505050565b60008060208385031215612ab757600080fd5b82356001600160401b03811115612acd57600080fd5b8301601f81018513612ade57600080fd5b80356001600160401b03811115612af457600080fd5b8560208260051b8401011115612b0957600080fd5b6020919091019590945092505050565b60005b83811015612b34578181015183820152602001612b1c565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015612bb157603f1987860301845281518051808752612b8e816020890160208501612b19565b601f01601f19169590950160209081019550938401939190910190600101612b65565b50929695505050505050565b600080600060608486031215612bd257600080fd5b8335612bdd8161270c565b92506020840135612bed8161270c565b915060408401356129548161270c565b60008060408385031215612c1057600080fd5b61290283612837565b600060208284031215612c2b57600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761073057610730612c32565b600082612c7c57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561073057610730612c32565b8082018082111561073057610730612c32565b600060208284031215612cb957600080fd5b8151801515811461072d57600080fd5b92835260208301919091526001600160a01b0316604082015260600190565b600060208284031215612cfa57600080fd5b5051919050565b600060208284031215612d1357600080fd5b815161072d8161270c565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612dc757600080fd5b8301803591506001600160401b03821115612de157600080fd5b602001915036819003821315612df657600080fd5b9250929050565b828482376000838201600081528351612e1a818360208801612b19565b0195945050505050565b60008251612e36818460208701612b19565b919091019291505056fea2646970667358221220eee2ca3f28b971ad70ed8bb53d0d0f8eb32b9f33a12776bc83fb4b7d1b75ddfd64736f6c634300081b0033", + "linkReferences": { + "contracts/staking/libraries/ExponentialRebates.sol": { + "ExponentialRebates": [ + { + "length": 20, + "start": 5960 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/staking/libraries/ExponentialRebates.sol": { + "ExponentialRebates": [ + { + "length": 20, + "start": 4630 + } + ] + } + } +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking_ProxyWithABI.json new file mode 100644 index 000000000..be304a1f6 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/HorizonStaking#HorizonStaking_ProxyWithABI.json @@ -0,0 +1,2481 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "HorizonStaking", + "sourceName": "contracts/staking/HorizonStaking.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "address", + "name": "stakingExtensionAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "subgraphDataServiceAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingCallerIsServiceProvider", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientDelegationTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientIdleStake", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientShares", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientStakeForLegacyAllocations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minRequired", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "HorizonStakingInvalidDelegationFeeCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPool", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPoolState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + } + ], + "name": "HorizonStakingInvalidMaxVerifierCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidProvision", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidServiceProviderZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidThawRequestType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "HorizonStakingInvalidThawingPeriod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidVerifier", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidVerifierZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroShares", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingLegacySlashFailed", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNoTokensToSlash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "HorizonStakingNotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingToWithdraw", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingProvisionAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingSlippageProtection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakingStillThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingTooManyThawRequests", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingTooManyTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingVerifierNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedOnlyController", + "type": "error" + }, + { + "inputs": [], + "name": "ManagedOnlyGovernor", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "AllowedLockedVerifierSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegatedTokensWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "DelegationFeeCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "DelegationSlashingEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashingSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakeLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "MaxThawingPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "OperatorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersStaged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionThawed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "StakeDelegatedWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "ThawRequestCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bool", + "name": "valid", + "type": "bool" + } + ], + "name": "ThawRequestFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawRequestsFulfilled", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ThawRequestsFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ThawingPeriodCleared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensDelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensDeprovisioned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensToDelegationPoolAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensUndelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "VerifierTokensSent", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "acceptProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToDelegationPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clearThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSharesOut", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "deprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegatedTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "getDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Delegation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "getDelegationFeeCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegationPool", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.DelegationPool", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getIdleStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProviderTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProvision", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "internalType": "uint32", + "name": "maxVerifierCutPending", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriodPending", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastParametersStagedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Provision", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getServiceProvider", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokensStaked", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensProvisioned", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ServiceProvider", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingExtension", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + } + ], + "name": "getThawRequest", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "nextRequest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ThawRequest", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawRequestList", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "internalType": "struct LinkedList.List", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "getTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "isAllowedLockedVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isAuthorized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDelegationSlashingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provisionLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oldServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minSharesForNewProvider", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "redelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "reprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setAllowedLockedVerifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "setDelegationFeeCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "setDelegationSlashingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "setMaxThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperatorLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "newMaxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "newThawingPeriod", + "type": "uint64" + } + ], + "name": "setProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensVerifier", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifierDestination", + "type": "address" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "withdrawDelegated", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "withdrawDelegated", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61020060405234801561001157600080fd5b506040516162a33803806162a38339810160408190526100309161041b565b828181806001600160a01b03811661007d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b590610351565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e890610351565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261012190610351565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015b90610351565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019390610351565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101ce90610351565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020c90610351565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024890610351565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027d90610351565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103279790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b039081166101c052929092166101e052506104ce915050565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161038c91815260200190565b602060405180830381865afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cd919061045e565b9050826001600160a01b0382166103f85760405163218f5add60e11b81526004016100749190610480565b5092915050565b80516001600160a01b038116811461041657600080fd5b919050565b60008060006060848603121561043057600080fd5b610439846103ff565b9250610447602085016103ff565b9150610455604085016103ff565b90509250925092565b60006020828403121561047057600080fd5b610479826103ff565b9392505050565b602081526000825180602084015260005b818110156104ae5760208186018101516040868401015201610491565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615d2861057b6000396000818161025b0152818161055e01526128a3015260008181610a450152818161140a015281816130de015281816131a001528181614130015261447401526000505060005050600050506000505060006114e901526000613097015260005050600050506000505060006135670152615d286000f3fe608060405234801561001057600080fd5b50600436106102565760003560e01c8063872d048911610142578063872d0489146106225780638cc01c86146106355780639ce7abe514610663578063a02b942614610676578063a2594d8214610689578063a2a317221461069c578063a694fc3a146106af578063a784d498146106c2578063ac9650d8146106d5578063ad4d35b5146106f5578063ae4fe67a14610708578063ba7fb0b414610734578063bc735d9014610747578063ca94b0e91461075a578063ccebcabb1461076d578063d48de8451461078f578063e473522a146107de578063e56f8a1d146107e6578063e76fede61461082c578063ef58bd671461083f578063f64b359814610847578063f93f1cd01461085a578063fb744cc01461086d578063fc54fb2714610880578063fecc9cc11461088b57610256565b8063010167e51461029f578063026e402b146102b257806308ce5f68146102c557806321195373146102eb578063259bc435146102fe57806325d9897e146103115780632e17de78146104395780632f7cc5011461044c57806339514ad21461045f5780633993d8491461047a5780633a78b7321461048d5780633ccfd60b146104a057806342c51693146104a85780634ca7ac22146104bb5780634d99dd16146104ce57806351a60b02146104e1578063561285e4146104f45780636230001a1461054957806366ee1b281461055c578063746120921461058a5780637573ef4f1461059d5780637a766460146105b05780637c145cc7146105d957806381e21b56146105fc57806382d66cb81461060f575b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e818015610299578184f35b8184fd5b005b61029d6102ad3660046151dc565b61089e565b61029d6102c036600461523e565b61097a565b6102d86102d336600461526a565b610a70565b6040519081526020015b60405180910390f35b61029d6102f93660046152a3565b610a85565b61029d61030c3660046152e4565b610b55565b61042c61031f36600461526a565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516102e291906152ff565b61029d6104473660046153bf565b610c43565b6102d861045a3660046153e5565b610cd6565b601a546040516001600160401b0390911681526020016102e2565b61029d6104883660046152a3565b610dd8565b61029d61049b366004615441565b610e74565b61029d611040565b61029d6104b636600461546d565b6110d2565b61029d6104c93660046154ca565b611283565b61029d6104dc36600461523e565b61137d565b6102d86104ef36600461526a565b61142f565b61050761050236600461526a565b611629565b6040516102e29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b61029d6105573660046154f8565b61167b565b7f00000000000000000000000000000000000000000000000000000000000000006040516102e2919061553e565b61029d6105983660046152a3565b611742565b6102d86105ab366004615552565b61182e565b6102d86105be366004615441565b6001600160a01b03166000908152600e602052604090205490565b6105ec6105e7366004615599565b611892565b60405190151581526020016102e2565b61029d61060a3660046155e4565b61189f565b61029d61061d3660046151dc565b611b18565b6102d861063036600461563c565b611c1e565b610648610643366004615441565b611c73565b604080518251815260209283015192810192909252016102e2565b61029d61067136600461567a565b611caf565b6102d86106843660046152a3565b611daa565b61029d610697366004615441565b611e3e565b61029d6106aa36600461523e565b611f22565b61029d6106bd3660046153bf565b611fb3565b6102d86106d0366004615441565b612044565b6106e86106e33660046156ff565b61204f565b6040516102e29190615798565b61029d610703366004615818565b612136565b6105ec610716366004615441565b6001600160a01b031660009081526022602052604090205460ff1690565b61029d610742366004615858565b612204565b61029d610755366004615818565b612311565b61029d6107683660046152a3565b6123a3565b61078061077b366004615599565b6125dd565b604051905181526020016102e2565b6107a261079d366004615899565b61262f565b6040516102e29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61029d61269c565b6107f96107f43660046153e5565b61276e565b6040516102e291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b61029d61083a3660046158b7565b6127d6565b61029d612d38565b61029d6108553660046158f6565b612e0a565b6102d86108683660046152a3565b612eed565b6102d861087b36600461526a565b612fc1565b60205460ff166105ec565b61029d6108993660046152a3565b612fcd565b6108a6613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109079190615964565b1561092557604051632b37d9d160e21b815260040160405180910390fd5b84846109328282336130b9565b82823390919261096157604051630c76b97b60e41b815260040161095893929190615981565b60405180910390fd5b505050610971878688878761317d565b50505050505050565b610982613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190615964565b15610a0157604051632b37d9d160e21b815260040160405180910390fd5b80600003610a2257604051630a2a4e5b60e11b815260040160405180910390fd5b610a3f3382610a2f613565565b6001600160a01b03169190613589565b610a6c827f0000000000000000000000000000000000000000000000000000000000000000836000613641565b5050565b6000610a7c8383613846565b90505b92915050565b8282610a928282336130b9565b828233909192610ab857604051630c76b97b60e41b815260040161095893929190615981565b505050610ac3613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190615964565b15610b4257604051632b37d9d160e21b815260040160405180910390fd5b610b4d85858561387e565b505050505050565b610b5d613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe91906159a4565b6001600160a01b0316336001600160a01b031614610bef57604051635d9044cd60e01b815260040160405180910390fd5b601a80546001600160401b0319166001600160401b0383169081179091556040519081527fe8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f9060200160405180910390a150565b610c4b613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190615964565b15610cca57604051632b37d9d160e21b815260040160405180910390fd5b610cd3816139af565b50565b600080610ce586868686613b5c565b90508060030154600003610cfd576000915050610dd0565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b8015610dc7576000610d438c83613bc8565b90508460050154816003015403610dbc576001810154426001600160401b0390911611610db657600083858360000154610d7d91906159d7565b610d8791906159ee565b9050610d938186615a10565b8254909550610da29085615a10565b9350610dae8188615a23565b965050610dbc565b50610dc7565b600201549050610d31565b50929450505050505b949350505050565b610de0613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190615964565b15610e5f57604051632b37d9d160e21b815260040160405180910390fd5b610e6f8383600080600086613c18565b505050565b610e7c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd9190615964565b15610efb57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0381166000908152601b60209081526040808320338085529252909120600381015483908390600160601b90046001600160401b0316610f57576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff9081169116141580610f9a57506003810154600160c01b81046001600160401b03908116600160201b9092041614155b15610e6f57600381018054600160201b6001600160401b03600160c01b63ffffffff19841663ffffffff600160a01b8604811691821792909204831684026001600160601b03199095161793909317938490556040516001600160a01b0380881695908916947fa4c005afae9298a5ca51e7710c334ac406fb3d914588ade970850f917cedb1c694611033949183169392041690615a50565b60405180910390a3505050565b611048613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190615964565b156110c757604051632b37d9d160e21b815260040160405180910390fd5b6110d033613d9e565b565b6110da613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190615964565b1561115957604051632b37d9d160e21b815260040160405180910390fd5b83836111668282336130b9565b82823390919261118c57604051630c76b97b60e41b815260040161095893929190615981565b50505061119c83620f4240101590565b83906111be57604051631504950160e21b815260040161095891815260200190565b506001600160a01b038087166000908152601c60209081526040808320938916835292905290812084918660028111156111fa576111fa615a6f565b600281111561120b5761120b615a6f565b815260208101919091526040016000205583600281111561122e5761122e615a6f565b856001600160a01b0316876001600160a01b03167f3474eba30406cacbfbc5a596a7e471662bbcccf206f8d244dbb6f4cc578c52208660405161127391815260200190565b60405180910390a4505050505050565b61128b613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906159a4565b6001600160a01b0316336001600160a01b03161461131d57604051635d9044cd60e01b815260040160405180910390fd5b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4542960abc7f2d26dab244fc440acf511e3dd0f5cefad571ca802283b4751bbb91015b60405180910390a25050565b611385613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190615964565b1561140457604051632b37d9d160e21b815260040160405180910390fd5b610e6f827f000000000000000000000000000000000000000000000000000000000000000083613e79565b6000611439613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190615964565b156114b857604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260146020908152604080832033808552600482019093529083209192909190807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190615a85565b905060008360020154118015611583575082600201548110155b1561159057826001015491505b600082116115b05760405162cf4d4760e51b815260040160405180910390fd5b60006001840181905560028401556040518281526001600160a01b0386811691908a16907f1b2e7737e043c5cf1b587ceb4daeb7ae00148b9bda8f79f1093eead08f1419529060200160405180910390a361161e858361160e613565565b6001600160a01b031691906140f1565b509695505050505050565b61163161514b565b61163961514b565b6000611645858561412c565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b611683613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e49190615964565b1561170257604051632b37d9d160e21b815260040160405180910390fd5b8160000361172357604051630a2a4e5b60e11b815260040160405180910390fd5b6117303383610a2f613565565b61173c84848484613641565b50505050565b61174a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190615964565b156117c957604051632b37d9d160e21b815260040160405180910390fd5b82826117d68282336130b9565b806117e95750336001600160a01b038216145b82823390919261180f57604051630c76b97b60e41b815260040161095893929190615981565b50505061181c85846141b0565b6118278585856141e8565b5050505050565b6001600160a01b038084166000908152601c6020908152604080832093861683529290529081208183600281111561186857611868615a6f565b600281111561187957611879615a6f565b81526020019081526020016000205490505b9392505050565b6000610dd08484846130b9565b6118a7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190615964565b1561192657604051632b37d9d160e21b815260040160405180910390fd5b83836119338282336130b9565b82823390919261195957604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038681166000908152601b60209081526040808320938916835292905220600381015487908790600160601b90046001600160401b03166119b9576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff908116908716141590600160c01b90046001600160401b03908116908616141581806119f55750805b15611b0d578115611a56578663ffffffff8116620f42401015611a34576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b5060038301805463ffffffff60a01b1916600160a01b63ffffffff8a16021790555b8015611ab657601a5486906001600160401b03908116908216811015611a915760405163ee5602e160e01b8152600401610958929190615a9e565b50506003830180546001600160c01b0316600160c01b6001600160401b038916021790555b428360040181905550876001600160a01b0316896001600160a01b03167fe89cbb9d63ba60af555547b12dde6817283e88cbdd45feb2059f2ba71ea346ba8989604051611b04929190615a50565b60405180910390a35b505050505050505050565b611b20613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190615964565b15611b9f57604051632b37d9d160e21b815260040160405180910390fd5b8484611bac8282336130b9565b828233909192611bd257604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038616600090815260226020526040902054869060ff16611c1057604051622920f760e21b8152600401610958919061553e565b50610971878688878761317d565b600080611c2b8585613846565b90506000611c398686614328565b90506000611c4d63ffffffff8616846159d7565b90506000611c5b838361434b565b9050611c678185615a23565b98975050505050505050565b611c7b61517a565b611c8361517a565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906159a4565b6001600160a01b0316336001600160a01b031614611d445760405162461bcd60e51b815260040161095890615ab8565b60405163623faf6160e01b81526001600160a01b0385169063623faf6190611d729086908690600401615aef565b600060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b5050505050505050565b6000611db4613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190615964565b15611e3357604051632b37d9d160e21b815260040160405180910390fd5b610dd0848484613e79565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906159a4565b6001600160a01b0316336001600160a01b031614611ed35760405162461bcd60e51b815260040161095890615ab8565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f0e57600080fd5b505af1158015610b4d573d6000803e3d6000fd5b611f2a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b9190615964565b15611fa957604051632b37d9d160e21b815260040160405180910390fd5b610a6c82826141b0565b611fbb613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190615964565b1561203a57604051632b37d9d160e21b815260040160405180910390fd5b610cd333826141b0565b6000610a7f82614362565b604080516000815260208101909152606090826001600160401b0381111561207957612079615b1e565b6040519080825280602002602001820160405280156120ac57816020015b60608152602001906001900390816120975790505b50915060005b8381101561212e57612109308686848181106120d0576120d0615b34565b90506020028101906120e29190615b4a565b856040516020016120f593929190615b90565b6040516020818303038152906040526143d3565b83828151811061211b5761211b615b34565b60209081029190910101526001016120b2565b505092915050565b61213e613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190615964565b156121bd57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260226020526040902054839060ff166121f857604051622920f760e21b8152600401610958919061553e565b50610e6f838383614449565b61220c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d9190615964565b1561228b57604051632b37d9d160e21b815260040160405180910390fd5b83836122988282336130b9565b8282339091926122be57604051630c76b97b60e41b815260040161095893929190615981565b50505085846122ce8282336130b9565b8282339091926122f457604051630c76b97b60e41b815260040161095893929190615981565b505050600061230489898861387e565b9050611b0d8988836141e8565b612319613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190615964565b1561239857604051632b37d9d160e21b815260040160405180910390fd5b610e6f838383614449565b6123ab613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c9190615964565b1561242a57604051632b37d9d160e21b815260040160405180910390fd5b8060000361244b57604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038084166000908152601b6020908152604080832093861683529281529082902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff80821660608401526001600160401b03600160201b830481166080850152600160601b8304811660a08501819052600160a01b840490921660c0850152600160c01b90920490911660e08301526004830154610100830152600590920154610120820152908490849061252a576040516330acea0d60e11b8152600401610958929190615a36565b50506000612538858561412c565b90506000816003015411858590916125655760405163b6a70b3b60e01b8152600401610958929190615a36565b50508281600201546125779190615a23565b60028201556125893384610a2f613565565b836001600160a01b0316856001600160a01b03167f673007a04e501145e79f59aea5e0413b6e88344fdaf10326254530d6a1511530856040516125ce91815260200190565b60405180910390a35050505050565b6040805160208101909152600081526040805160208101909152600081526000612607868661412c565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b60408051608081018252600080825260208201819052918101829052606081019190915261265d8383613bc8565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b6126a4613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270591906159a4565b6001600160a01b0316336001600160a01b03161461273657604051635d9044cd60e01b815260040160405180910390fd5b600d805463ffffffff191690556040517f93be484d290d119d9cf99cce69d173c732f9403333ad84f69c807b590203d10990600090a1565b60408051608081018252600080825260208201819052918101829052606081019190915261279e85858585613b5c565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b6127de613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190615964565b1561285d57604051632b37d9d160e21b815260040160405180910390fd5b3360009081526012602052604090205460ff1615612966576040516001600160a01b038581166024830152604482018590526064820184905282811660848301526000917f00000000000000000000000000000000000000000000000000000000000000009091169060a40160408051601f198184030181529181526020820180516001600160e01b031663224451c160e11b179052516128fe9190615bb7565b600060405180830381855af49150503d8060008114612939576040519150601f19603f3d011682016040523d82523d6000602084013e61293e565b606091505b50509050806129605760405163ef370f5160e01b815260040160405180910390fd5b5061173c565b6001600160a01b0384166000908152601b6020908152604080832033808552925282209091612995878461412c565b90506000816002015483600001546129ad9190615a23565b9050806000036129d057604051630a8a55c960e31b815260040160405180910390fd5b60006129dc888361434b565b905060006129ee85600001548361434b565b90508015612be8576003850154600090612a1390839063ffffffff9081169061457916565b9050888181811015612a3a57604051632f514d5760e21b8152600401610958929190615bd3565b50508815612aa757612a4f888a61160e613565565b876001600160a01b0316876001600160a01b03168c6001600160a01b03167f95ff4196cd75fa49180ba673948ea43935f59e7c4ba101fa09b9fe0ec266d5828c604051612a9e91815260200190565b60405180910390a45b612acb612ab48a84615a10565b612abc613565565b6001600160a01b0316906145d9565b8554612ad78382615a10565b8760010154612ae691906159d7565b612af091906159ee565b60018701558554612b02908390615a10565b8655600286015415801590612b1957506001860154155b15612b3d5760006002870181905560058701805491612b3783615be1565b91905055505b6001600160a01b038b166000908152600e6020526040902060040154612b64908390615a10565b6001600160a01b038c166000908152600e60205260409020600481019190915554612b90908390615a10565b6001600160a01b038c81166000818152600e60209081526040918290209490945551858152918a169290917fe7b110f13cde981d5079ab7faa4249c5f331f5c292dbc6031969d2ce694188a3910160405180910390a3505b612bf28183615a10565b91508115612d2c5760205460ff1615612cde57612c1182612abc613565565b6002840154612c208382615a10565b8560050154612c2f91906159d7565b612c3991906159ee565b60058501556002840154612c4e908390615a10565b6002850155600684015415801590612c6857506005840154155b15612c8c5760006006850181905560078501805491612c8683615be1565b91905055505b856001600160a01b03168a6001600160a01b03167fc5d16dbb577cf07678b577232717c9a606197a014f61847e623d47fc6bf6b77184604051612cd191815260200190565b60405180910390a3612d2c565b856001600160a01b03168a6001600160a01b03167fdce44f0aeed2089c75db59f5a517b9a19a734bf0213412fa129f0d0434126b2484604051612d2391815260200190565b60405180910390a35b50505050505050505050565b612d40613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da191906159a4565b6001600160a01b0316336001600160a01b031614612dd257604051635d9044cd60e01b815260040160405180910390fd5b6020805460ff191660011790556040517f2192802a8934dbf383338406b279ec7f3eccee31e58d6c0444d6dd6bfff24b3590600090a1565b612e12613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e739190615964565b15612e9157604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038416612eb8576040516322347d6760e21b815260040160405180910390fd5b6001600160a01b038316612edf5760405163a962605960e01b815260040160405180910390fd5b610b4d868686868686613c18565b6000612ef7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f589190615964565b15612f7657604051632b37d9d160e21b815260040160405180910390fd5b8383612f838282336130b9565b828233909192612fa957604051630c76b97b60e41b815260040161095893929190615981565b505050612fb7868686614621565b9695505050505050565b6000610a7c8383614328565b612fd5613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190615964565b1561305457604051632b37d9d160e21b815260040160405180910390fd5b82826130618282336130b9565b82823390919261308757604051630c76b97b60e41b815260040161095893929190615981565b5050506118278585856141e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000836001600160a01b0316826001600160a01b0316036130dc5750600161188b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361314457506001600160a01b0380841660009081526015602090815260408083209385168352929052205460ff1661188b565b506001600160a01b038084166000908152601f60209081526040808320868516845282528083209385168352929052205460ff1661188b565b6000841161319e57604051630a2a4e5b60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614806131e45750600d5463ffffffff16155b83906132045760405163353666ff60e01b8152600401610958919061553e565b508163ffffffff8116620f42401015613239576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b50601a5481906001600160401b0390811690821681101561326f5760405163ee5602e160e01b8152600401610958929190615a9e565b50506001600160a01b038581166000908152601b6020908152604080832093871683529290522060030154600160601b90046001600160401b0316156132c857604051632b542c0d60e11b815260040160405180910390fd5b60006132d386614362565b90508481808211156132fa5760405163ccaf28a960e01b8152600401610958929190615bd3565b505060405180610140016040528086815260200160008152602001600081526020018463ffffffff168152602001836001600160401b03168152602001426001600160401b031681526020018463ffffffff168152602001836001600160401b03168152602001600081526020016000815250601b6000886001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600301600c6101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160030160146101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160030160186101000a8154816001600160401b0302191690836001600160401b03160217905550610100820151816004015561012082015181600501559050506000600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002090508581600401546134fa9190615a23565b60048201556040805187815263ffffffff861660208201526001600160401b0385168183015290516001600160a01b0387811692908a16917f88b4c2d08cea0f01a24841ff5d14814ddb5b14ac44b05e0835fcc0dcd8c7bc259181900360600190a350505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610e6f576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af11580156135e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136099190615964565b610e6f5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610958565b81670de0b6b3a76400008082101561366e5760405163b86d885760e01b8152600401610958929190615bd3565b50506001600160a01b038481166000908152601b602090815260408083209387168352929052206003015484908490600160601b90046001600160401b03166136cc576040516330acea0d60e11b8152600401610958929190615a36565b505060006136da858561412c565b336000908152600482016020526040902060028201549192509015158061370357506003820154155b8686909161372657604051631984edef60e31b8152600401610958929190615a36565b50506000826002015460001480613744575082600501548360020154145b905060008161377f57836005015484600201546137619190615a10565b600385015461377090886159d7565b61377a91906159ee565b613781565b855b905080158015906137925750848110155b818690916137b557604051635d88e8d160e01b8152600401610958929190615bd3565b50508584600201546137c79190615a23565b600285015560038401546137dc908290615a23565b600385015582546137ee908290615a23565b835560405133906001600160a01b0389811691908b16907f237818af8bb47710142edd8fc301fbc507064fb357cf122fb161ca447e3cb13e90613834908b908790615bd3565b60405180910390a45050505050505050565b6001600160a01b038281166000908152601b60209081526040808320938516835292905290812060018101549054610a7c9190615a10565b6001600160a01b038381166000818152601b60209081526040808320948716808452948252808320600281015460018201548351610100810185528681529485018790529284019690965260608301949094526080820181905260a0820185905260c08201869052600584015460e08301529193849290916138ff816147b3565b875492965094509250613913908590615a10565b855560028501839055600185018290556001600160a01b0389166000908152600e60205260408120600401805486929061394e908490615a10565b92505081905550876001600160a01b0316896001600160a01b03167f9008d731ddfbec70bc364780efd63057c6877bee8027c4708a104b365395885d8660405161399a91815260200190565b60405180910390a35091979650505050505050565b3360008290036139d257604051630a2a4e5b60e11b815260040160405180910390fd5b60006139dd82614362565b9050828180821115613a045760405163ccaf28a960e01b8152600401610958929190615bd3565b50506001600160a01b0382166000908152600e602052604081208054600d549192909163ffffffff1690819003613a9657613a3f8683615a10565b8355613a4e858761160e613565565b846001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8387604051613a8991815260200190565b60405180910390a2610b4d565b600283015415801590613aad575082600301544310155b15613abb57613abb85613d9e565b600283015415613ae557613ae2613ad68460030154436148ad565b846002015483896148c7565b90505b858360020154613af59190615a23565b6002840155613b048143615a23565b6003840181905560028401546040516001600160a01b038816927f91642f23a1196e1424949fafa2a428c3b5d1f699763942ff08a6fbe9d4d7e98092613b4c92909190615bd3565b60405180910390a2505050505050565b6000601e6000866001811115613b7457613b74615a6f565b6001811115613b8557613b85615a6f565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d6000846001811115613be057613be0615a6f565b6001811115613bf157613bf1615a6f565b81526020019081526020016000206000838152602001908152602001600020905092915050565b6000613c24878761412c565b905080600201546000141580613c3c57506003810154155b87879091613c5f57604051631984edef60e31b8152600401610958929190615a36565b5050600681015460058201546040805161010081018252600181526001600160a01b03808c1660208301528a16918101919091523360608201526080810182905260a0810183905260c08101859052600784015460e08201526000929190613cc6816147b3565b600288015492965094509250613cdd908590615a10565b600286015560068501839055600585018290558315613d91576001600160a01b03891615801590613d1657506001600160a01b03881615155b15613d2c57613d278989868a613641565b613d91565b613d39338561160e613565565b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f305f519d8909c676ffd870495d4563032eb0b506891a6dd9827490256cc9914e87604051613d8891815260200190565b60405180910390a45b5050505050505050505050565b6001600160a01b0381166000908152600e6020526040812060028101549091819003613ddd57604051630a2a4e5b60e11b815260040160405180910390fd5b600382015443811115613e0657604051631d222f1b60e31b815260040161095891815260200190565b5060006002830181905560038301558154613e22908290615a10565b8255613e31838261160e613565565b826001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8382604051613e6c91815260200190565b60405180910390a2505050565b6000808211613e9b57604051637318ad9960e01b815260040160405180910390fd5b6000613ea7858561412c565b33600090815260048201602052604090208054919250908480821015613ee25760405163ab99793560e01b8152600401610958929190615bd3565b5050600282015486908690613f0c57604051631984edef60e31b8152600401610958929190615a36565b50506000826003015483600501548460020154613f299190615a10565b613f3390876159d7565b613f3d91906159ee565b905060008360050154600014613f705760058401546006850154613f6190846159d7565b613f6b91906159ee565b613f72565b815b6001600160a01b038981166000908152601b60209081526040808320938c1683529290529081206003015491925090613fbb90600160201b90046001600160401b031642615a23565b9050828560050154613fcd9190615a23565b60058601556006850154613fe2908390615a23565b60068601556003850154613ff7908890615a10565b60038601558354614009908890615a10565b8085551561407557600085600301548660050154876002015461402c9190615a10565b865461403891906159d7565b61404291906159ee565b905080670de0b6b3a7640000808210156140715760405163587ab9ab60e11b8152600401610958929190615bd3565b5050505b600061408b60018b8b3387878c6007015461491b565b9050336001600160a01b0316896001600160a01b03168b6001600160a01b03167f0525d6ad1aa78abc571b5c1984b5e1ea4f1412368c1cc348ca408dbb1085c9a1878c6040516140dc929190615bd3565b60405180910390a49998505050505050505050565b8015610e6f5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016135c6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361418557506001600160a01b0382166000908152601460205260409020610a7f565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610a7f565b806000036141d157604051630a2a4e5b60e11b815260040160405180910390fd5b6141de3382610a2f613565565b610a6c8282614ac1565b8060000361420957604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038381166000908152601b60209081526040808320938616835292905220600381015484908490600160601b90046001600160401b0316614266576040516330acea0d60e11b8152600401610958929190615a36565b5050600061427385614362565b905082818082111561429a5760405163ccaf28a960e01b8152600401610958929190615bd3565b505081546142a9908490615a23565b82556001600160a01b0385166000908152600e60205260409020600401546142d2908490615a23565b6001600160a01b038681166000818152600e602090815260409182902060040194909455518681529187169290917feaf6ea3a42ed2fd1b6d575f818cbda593af9524aa94bd30e65302ac4dc23474591016125ce565b600080614335848461412c565b905080600501548160020154610dd09190615a10565b60008183111561435b5781610a7c565b5090919050565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261439591615a23565b61439f9190615a23565b6001600160a01b0384166000908152600e60205260409020549091508181116143c9576000610dd0565b610dd08282615a10565b6060600080846001600160a01b0316846040516143f09190615bb7565b600060405180830381855af49150503d806000811461442b576040519150601f19603f3d011682016040523d82523d6000602084013e614430565b606091505b5091509150614440858383614b34565b95945050505050565b336001600160a01b0383160361447257604051630123065360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036144df573360009081526015602090815260408083206001600160a01b03861684529091529020805460ff191682151517905561451b565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020805460ff19168215151790555b816001600160a01b0316836001600160a01b0316336001600160a01b03167faa5a59b38e8f68292982382bf635c2f263ca37137bbc52956acd808fd7bf976f8460405161456c911515815260200190565b60405180910390a4505050565b600061458883620f4240101590565b8061459b575061459b82620f4240101590565b838390916145be5760405163768bf0eb60e11b8152600401610958929190615bd3565b50620f424090506145cf83856159d7565b610a7c91906159ee565b8015610a6c57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b158015611f0e57600080fd5b60008160000361464457604051630a2a4e5b60e11b815260040160405180910390fd5b60006146508585613846565b90508083808210156146775760405163587ab9ab60e11b8152600401610958929190615bd3565b50506001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154909190156146ec578160010154600183600101548785600201546146c991906159d7565b6146d39190615a23565b6146dd9190615a10565b6146e791906159ee565b6146ee565b845b600383015490915060009061471390600160201b90046001600160401b031642615a23565b90508183600201546147259190615a23565b6002840155600183015461473a908790615a23565b8360010181905550600061475860008a8a8c87878a6005015461491b565b9050876001600160a01b0316896001600160a01b03167f3b81913739097ced1e7fa748c6058d34e2c00b961fb501094543b397b198fdaa8960405161479f91815260200190565b60405180910390a398975050505050505050565b6000806000806147d58560000151866020015187604001518860600151613b5c565b905060008160030154116147fc576040516307e332c560e31b815260040160405180910390fd5b60006148088683614b87565b905085604001516001600160a01b031686602001516001600160a01b03168760000151600181111561483c5761483c615a6f565b6060808a01518551602080880151604080516001600160a01b039095168552918401929092528201527f86c2f162872d7c46d7ee0caad366da6dc430889b9d8f27e4bed3785548f9954b910160405180910390a4602081015160408201516060909201519097919650945092505050565b60008183116148bd576000610a7c565b610a7c8284615a10565b60006148d38285615a23565b60016148df8487615a23565b6148e99190615a10565b6148f384866159d7565b6148fd87896159d7565b6149079190615a23565b6149119190615a23565b61444091906159ee565b60008360000361493e57604051637318ad9960e01b815260040160405180910390fd5b600061494c89898989613b5c565b90506103e88160030154106149745760405163332b852b60e11b815260040160405180910390fd5b60028101546040516001600160601b031960608b811b821660208401528a811b8216603484015289901b166048820152605c810191909152600090607c0160405160208183030381529060405280519060200120905060006149d68b83613bc8565b8781556001810180546001600160401b0319166001600160401b03891617905560006002820155600380820187905584015490915015614a245781614a1f8c8560010154613bc8565b600201555b614a2e8383614c82565b886001600160a01b03168a6001600160a01b03168c6001811115614a5457614a54615a6f565b604080516001600160a01b038d168152602081018c90526001600160401b038b168183015260608101879052608081018a905290517f036538df4a591a5cc74b68cfc7f8c61e8173dbc81627e1d62600b61e820461789181900360a00190a4509998505050505050505050565b6001600160a01b0382166000908152600e6020526040902054614ae5908290615a23565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906113719084815260200190565b606082614b4957614b4482614d15565b61188b565b8151158015614b6057506001600160a01b0384163b155b15614b805783604051639996b31560e01b8152600401610958919061553e565b508061188b565b614bb26040518060800160405280600081526020016000815260200160008152602001600081525090565b615194614bc28460000151614d3e565b9050615194614bd48560000151614da3565b905060008560000151600087608001518860a001518960e00151604051602001614c02959493929190615bfa565b6040516020818303038152906040529050600080614c3785614dea86868c60c001518c614f5a9095949392919063ffffffff16565b91509150600080600083806020019051810190614c549190615c3d565b60408051608081018252998a5260208a019390935291880152606087015250939a9950505050505050505050565b612710826003015410614ca8576040516303a8c56b60e61b815260040160405180910390fd5b80614cc657604051638f4a893d60e01b815260040160405180910390fd5b6001808301829055600283018054600090614ce2908490615a23565b90915550506003820154600003614cf7578082555b6001826003016000828254614d0c9190615a23565b90915550505050565b805115614d255780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6151946000826001811115614d5557614d55615a6f565b03614d635750615014919050565b6001826001811115614d7757614d77615a6f565b03614d855750615056919050565b604051636bd1fba760e11b815260040160405180910390fd5b919050565b6151946000826001811115614dba57614dba615a6f565b03614dc85750615062919050565b6001826001811115614ddc57614ddc615a6f565b03614d8557506150b9919050565b60006060600080600080600087806020019051810190614e0a9190615c7c565b945094509450945094506000614e20868b613bc8565b6001810154909150426001600160401b039091161115614e5b5760016040518060200160405280600081525097509750505050505050614f53565b600381015460009083148015614eae5782548590614e7a9088906159d7565b614e8491906159ee565b9150614e908287615a10565b8354909650614e9f9086615a10565b9450614eab8288615a23565b96505b8b886001811115614ec157614ec1615a6f565b845460018601546040805187815260208101939093526001600160401b03909116828201528415156060830152517f469e89d0a4e0e5deb2eb1ade5b3fa67fdfbeb4787c3a7c1e8e89aaf28562cab29181900360800190a38787878787604051602001614f32959493929190615bfa565b6040516020818303038152906040529a5060008b9950995050505050505050505b9250929050565b600060608760030154831115614f8357604051634a411b9d60e11b815260040160405180910390fd5b60008315614f915783614f97565b88600301545b89549094505b8015801590614fac5750600085115b1561500557600080614fc283898c63ffffffff16565b915091508115614fd3575050615005565b965086614fe18c8c8b6150c4565b925086614fed81615cc5565b9750508380614ffb90615be1565b9450505050614f9d565b50989397509295505050505050565b6000601d81805b600181111561502c5761502c615a6f565b81526020019081526020016000206000838152602001908152602001600020600201549050919050565b6000601d81600161501b565b601d6000805b600181111561507957615079615a6f565b8152602080820192909252604090810160009081209381529290915281208181556001810180546001600160401b03191690556002810182905560030155565b601d60006001615068565b6000808460030154116150ea5760405163ddaf8f2160e01b815260040160405180910390fd5b60006150fd85600001548563ffffffff16565b905061511085600001548463ffffffff16565b60018560030160008282546151259190615a10565b9091555050808555600385015460000361514157600060018601555b5050915492915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6110d0615cdc565b6001600160a01b0381168114610cd357600080fd5b803563ffffffff81168114614d9e57600080fd5b80356001600160401b0381168114614d9e57600080fd5b600080600080600060a086880312156151f457600080fd5b85356151ff8161519c565b9450602086013561520f8161519c565b935060408601359250615224606087016151b1565b9150615232608087016151c5565b90509295509295909350565b6000806040838503121561525157600080fd5b823561525c8161519c565b946020939093013593505050565b6000806040838503121561527d57600080fd5b82356152888161519c565b915060208301356152988161519c565b809150509250929050565b6000806000606084860312156152b857600080fd5b83356152c38161519c565b925060208401356152d38161519c565b929592945050506040919091013590565b6000602082840312156152f657600080fd5b610a7c826151c5565b6000610140820190508251825260208301516020830152604083015160408301526060830151615337606084018263ffffffff169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538560c084018263ffffffff169052565b5060e08301516153a060e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b6000602082840312156153d157600080fd5b5035919050565b60028110610cd357600080fd5b600080600080608085870312156153fb57600080fd5b8435615406816153d8565b935060208501356154168161519c565b925060408501356154268161519c565b915060608501356154368161519c565b939692955090935050565b60006020828403121561545357600080fd5b813561188b8161519c565b803560038110614d9e57600080fd5b6000806000806080858703121561548357600080fd5b843561548e8161519c565b9350602085013561549e8161519c565b92506154ac6040860161545e565b9396929550929360600135925050565b8015158114610cd357600080fd5b600080604083850312156154dd57600080fd5b82356154e88161519c565b91506020830135615298816154bc565b6000806000806080858703121561550e57600080fd5b84356155198161519c565b935060208501356155298161519c565b93969395505050506040820135916060013590565b6001600160a01b0391909116815260200190565b60008060006060848603121561556757600080fd5b83356155728161519c565b925060208401356155828161519c565b91506155906040850161545e565b90509250925092565b6000806000606084860312156155ae57600080fd5b83356155b98161519c565b925060208401356155c98161519c565b915060408401356155d98161519c565b809150509250925092565b600080600080608085870312156155fa57600080fd5b84356156058161519c565b935060208501356156158161519c565b9250615623604086016151b1565b9150615631606086016151c5565b905092959194509250565b60008060006060848603121561565157600080fd5b833561565c8161519c565b9250602084013561566c8161519c565b9150615590604085016151b1565b60008060006040848603121561568f57600080fd5b833561569a8161519c565b925060208401356001600160401b038111156156b557600080fd5b8401601f810186136156c657600080fd5b80356001600160401b038111156156dc57600080fd5b8660208284010111156156ee57600080fd5b939660209190910195509293505050565b6000806020838503121561571257600080fd5b82356001600160401b0381111561572857600080fd5b8301601f8101851361573957600080fd5b80356001600160401b0381111561574f57600080fd5b8560208260051b840101111561576457600080fd5b6020919091019590945092505050565b60005b8381101561578f578181015183820152602001615777565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561580c57603f19878603018452815180518087526157e9816020890160208501615774565b601f01601f191695909501602090810195509384019391909101906001016157c0565b50929695505050505050565b60008060006060848603121561582d57600080fd5b83356158388161519c565b925060208401356158488161519c565b915060408401356155d9816154bc565b6000806000806080858703121561586e57600080fd5b84356158798161519c565b935060208501356158898161519c565b925060408501356154ac8161519c565b600080604083850312156158ac57600080fd5b823561525c816153d8565b600080600080608085870312156158cd57600080fd5b84356158d88161519c565b9350602085013592506040850135915060608501356154368161519c565b60008060008060008060c0878903121561590f57600080fd5b863561591a8161519c565b9550602087013561592a8161519c565b9450604087013561593a8161519c565b9350606087013561594a8161519c565b9598949750929560808101359460a0909101359350915050565b60006020828403121561597657600080fd5b815161188b816154bc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6000602082840312156159b657600080fd5b815161188b8161519c565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a7f57610a7f6159c1565b600082615a0b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610a7f57610a7f6159c1565b80820180821115610a7f57610a7f6159c1565b6001600160a01b0392831681529116602082015260400190565b63ffffffff9290921682526001600160401b0316602082015260400190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a9757600080fd5b5051919050565b6001600160401b0392831681529116602082015260400190565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112615b6157600080fd5b8301803591506001600160401b03821115615b7b57600080fd5b602001915036819003821315614f5357600080fd5b828482376000838201600081528351615bad818360208801615774565b0195945050505050565b60008251615bc9818460208701615774565b9190910192915050565b918252602082015260400190565b600060018201615bf357615bf36159c1565b5060010190565b60a0810160028710615c1c57634e487b7160e01b600052602160045260246000fd5b95815260208101949094526040840192909252606083015260809091015290565b60008060008060808587031215615c5357600080fd5b8451615c5e816153d8565b60208601516040870151606090970151919890975090945092505050565b600080600080600060a08688031215615c9457600080fd5b8551615c9f816153d8565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600081615cd457615cd46159c1565b506000190190565b634e487b7160e01b600052605160045260246000fdfea2646970667358221220f5046670ab269f9c179f41df4a02cd9c6b2ca3d5d507e2b9fcf15f800f351d8b64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102565760003560e01c8063872d048911610142578063872d0489146106225780638cc01c86146106355780639ce7abe514610663578063a02b942614610676578063a2594d8214610689578063a2a317221461069c578063a694fc3a146106af578063a784d498146106c2578063ac9650d8146106d5578063ad4d35b5146106f5578063ae4fe67a14610708578063ba7fb0b414610734578063bc735d9014610747578063ca94b0e91461075a578063ccebcabb1461076d578063d48de8451461078f578063e473522a146107de578063e56f8a1d146107e6578063e76fede61461082c578063ef58bd671461083f578063f64b359814610847578063f93f1cd01461085a578063fb744cc01461086d578063fc54fb2714610880578063fecc9cc11461088b57610256565b8063010167e51461029f578063026e402b146102b257806308ce5f68146102c557806321195373146102eb578063259bc435146102fe57806325d9897e146103115780632e17de78146104395780632f7cc5011461044c57806339514ad21461045f5780633993d8491461047a5780633a78b7321461048d5780633ccfd60b146104a057806342c51693146104a85780634ca7ac22146104bb5780634d99dd16146104ce57806351a60b02146104e1578063561285e4146104f45780636230001a1461054957806366ee1b281461055c578063746120921461058a5780637573ef4f1461059d5780637a766460146105b05780637c145cc7146105d957806381e21b56146105fc57806382d66cb81461060f575b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e818015610299578184f35b8184fd5b005b61029d6102ad3660046151dc565b61089e565b61029d6102c036600461523e565b61097a565b6102d86102d336600461526a565b610a70565b6040519081526020015b60405180910390f35b61029d6102f93660046152a3565b610a85565b61029d61030c3660046152e4565b610b55565b61042c61031f36600461526a565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516102e291906152ff565b61029d6104473660046153bf565b610c43565b6102d861045a3660046153e5565b610cd6565b601a546040516001600160401b0390911681526020016102e2565b61029d6104883660046152a3565b610dd8565b61029d61049b366004615441565b610e74565b61029d611040565b61029d6104b636600461546d565b6110d2565b61029d6104c93660046154ca565b611283565b61029d6104dc36600461523e565b61137d565b6102d86104ef36600461526a565b61142f565b61050761050236600461526a565b611629565b6040516102e29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b61029d6105573660046154f8565b61167b565b7f00000000000000000000000000000000000000000000000000000000000000006040516102e2919061553e565b61029d6105983660046152a3565b611742565b6102d86105ab366004615552565b61182e565b6102d86105be366004615441565b6001600160a01b03166000908152600e602052604090205490565b6105ec6105e7366004615599565b611892565b60405190151581526020016102e2565b61029d61060a3660046155e4565b61189f565b61029d61061d3660046151dc565b611b18565b6102d861063036600461563c565b611c1e565b610648610643366004615441565b611c73565b604080518251815260209283015192810192909252016102e2565b61029d61067136600461567a565b611caf565b6102d86106843660046152a3565b611daa565b61029d610697366004615441565b611e3e565b61029d6106aa36600461523e565b611f22565b61029d6106bd3660046153bf565b611fb3565b6102d86106d0366004615441565b612044565b6106e86106e33660046156ff565b61204f565b6040516102e29190615798565b61029d610703366004615818565b612136565b6105ec610716366004615441565b6001600160a01b031660009081526022602052604090205460ff1690565b61029d610742366004615858565b612204565b61029d610755366004615818565b612311565b61029d6107683660046152a3565b6123a3565b61078061077b366004615599565b6125dd565b604051905181526020016102e2565b6107a261079d366004615899565b61262f565b6040516102e29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61029d61269c565b6107f96107f43660046153e5565b61276e565b6040516102e291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b61029d61083a3660046158b7565b6127d6565b61029d612d38565b61029d6108553660046158f6565b612e0a565b6102d86108683660046152a3565b612eed565b6102d861087b36600461526a565b612fc1565b60205460ff166105ec565b61029d6108993660046152a3565b612fcd565b6108a6613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109079190615964565b1561092557604051632b37d9d160e21b815260040160405180910390fd5b84846109328282336130b9565b82823390919261096157604051630c76b97b60e41b815260040161095893929190615981565b60405180910390fd5b505050610971878688878761317d565b50505050505050565b610982613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190615964565b15610a0157604051632b37d9d160e21b815260040160405180910390fd5b80600003610a2257604051630a2a4e5b60e11b815260040160405180910390fd5b610a3f3382610a2f613565565b6001600160a01b03169190613589565b610a6c827f0000000000000000000000000000000000000000000000000000000000000000836000613641565b5050565b6000610a7c8383613846565b90505b92915050565b8282610a928282336130b9565b828233909192610ab857604051630c76b97b60e41b815260040161095893929190615981565b505050610ac3613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190615964565b15610b4257604051632b37d9d160e21b815260040160405180910390fd5b610b4d85858561387e565b505050505050565b610b5d613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe91906159a4565b6001600160a01b0316336001600160a01b031614610bef57604051635d9044cd60e01b815260040160405180910390fd5b601a80546001600160401b0319166001600160401b0383169081179091556040519081527fe8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f9060200160405180910390a150565b610c4b613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190615964565b15610cca57604051632b37d9d160e21b815260040160405180910390fd5b610cd3816139af565b50565b600080610ce586868686613b5c565b90508060030154600003610cfd576000915050610dd0565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b8015610dc7576000610d438c83613bc8565b90508460050154816003015403610dbc576001810154426001600160401b0390911611610db657600083858360000154610d7d91906159d7565b610d8791906159ee565b9050610d938186615a10565b8254909550610da29085615a10565b9350610dae8188615a23565b965050610dbc565b50610dc7565b600201549050610d31565b50929450505050505b949350505050565b610de0613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190615964565b15610e5f57604051632b37d9d160e21b815260040160405180910390fd5b610e6f8383600080600086613c18565b505050565b610e7c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd9190615964565b15610efb57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0381166000908152601b60209081526040808320338085529252909120600381015483908390600160601b90046001600160401b0316610f57576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff9081169116141580610f9a57506003810154600160c01b81046001600160401b03908116600160201b9092041614155b15610e6f57600381018054600160201b6001600160401b03600160c01b63ffffffff19841663ffffffff600160a01b8604811691821792909204831684026001600160601b03199095161793909317938490556040516001600160a01b0380881695908916947fa4c005afae9298a5ca51e7710c334ac406fb3d914588ade970850f917cedb1c694611033949183169392041690615a50565b60405180910390a3505050565b611048613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190615964565b156110c757604051632b37d9d160e21b815260040160405180910390fd5b6110d033613d9e565b565b6110da613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190615964565b1561115957604051632b37d9d160e21b815260040160405180910390fd5b83836111668282336130b9565b82823390919261118c57604051630c76b97b60e41b815260040161095893929190615981565b50505061119c83620f4240101590565b83906111be57604051631504950160e21b815260040161095891815260200190565b506001600160a01b038087166000908152601c60209081526040808320938916835292905290812084918660028111156111fa576111fa615a6f565b600281111561120b5761120b615a6f565b815260208101919091526040016000205583600281111561122e5761122e615a6f565b856001600160a01b0316876001600160a01b03167f3474eba30406cacbfbc5a596a7e471662bbcccf206f8d244dbb6f4cc578c52208660405161127391815260200190565b60405180910390a4505050505050565b61128b613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906159a4565b6001600160a01b0316336001600160a01b03161461131d57604051635d9044cd60e01b815260040160405180910390fd5b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4542960abc7f2d26dab244fc440acf511e3dd0f5cefad571ca802283b4751bbb91015b60405180910390a25050565b611385613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190615964565b1561140457604051632b37d9d160e21b815260040160405180910390fd5b610e6f827f000000000000000000000000000000000000000000000000000000000000000083613e79565b6000611439613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190615964565b156114b857604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260146020908152604080832033808552600482019093529083209192909190807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190615a85565b905060008360020154118015611583575082600201548110155b1561159057826001015491505b600082116115b05760405162cf4d4760e51b815260040160405180910390fd5b60006001840181905560028401556040518281526001600160a01b0386811691908a16907f1b2e7737e043c5cf1b587ceb4daeb7ae00148b9bda8f79f1093eead08f1419529060200160405180910390a361161e858361160e613565565b6001600160a01b031691906140f1565b509695505050505050565b61163161514b565b61163961514b565b6000611645858561412c565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b611683613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e49190615964565b1561170257604051632b37d9d160e21b815260040160405180910390fd5b8160000361172357604051630a2a4e5b60e11b815260040160405180910390fd5b6117303383610a2f613565565b61173c84848484613641565b50505050565b61174a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190615964565b156117c957604051632b37d9d160e21b815260040160405180910390fd5b82826117d68282336130b9565b806117e95750336001600160a01b038216145b82823390919261180f57604051630c76b97b60e41b815260040161095893929190615981565b50505061181c85846141b0565b6118278585856141e8565b5050505050565b6001600160a01b038084166000908152601c6020908152604080832093861683529290529081208183600281111561186857611868615a6f565b600281111561187957611879615a6f565b81526020019081526020016000205490505b9392505050565b6000610dd08484846130b9565b6118a7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190615964565b1561192657604051632b37d9d160e21b815260040160405180910390fd5b83836119338282336130b9565b82823390919261195957604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038681166000908152601b60209081526040808320938916835292905220600381015487908790600160601b90046001600160401b03166119b9576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff908116908716141590600160c01b90046001600160401b03908116908616141581806119f55750805b15611b0d578115611a56578663ffffffff8116620f42401015611a34576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b5060038301805463ffffffff60a01b1916600160a01b63ffffffff8a16021790555b8015611ab657601a5486906001600160401b03908116908216811015611a915760405163ee5602e160e01b8152600401610958929190615a9e565b50506003830180546001600160c01b0316600160c01b6001600160401b038916021790555b428360040181905550876001600160a01b0316896001600160a01b03167fe89cbb9d63ba60af555547b12dde6817283e88cbdd45feb2059f2ba71ea346ba8989604051611b04929190615a50565b60405180910390a35b505050505050505050565b611b20613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190615964565b15611b9f57604051632b37d9d160e21b815260040160405180910390fd5b8484611bac8282336130b9565b828233909192611bd257604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038616600090815260226020526040902054869060ff16611c1057604051622920f760e21b8152600401610958919061553e565b50610971878688878761317d565b600080611c2b8585613846565b90506000611c398686614328565b90506000611c4d63ffffffff8616846159d7565b90506000611c5b838361434b565b9050611c678185615a23565b98975050505050505050565b611c7b61517a565b611c8361517a565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906159a4565b6001600160a01b0316336001600160a01b031614611d445760405162461bcd60e51b815260040161095890615ab8565b60405163623faf6160e01b81526001600160a01b0385169063623faf6190611d729086908690600401615aef565b600060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b5050505050505050565b6000611db4613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190615964565b15611e3357604051632b37d9d160e21b815260040160405180910390fd5b610dd0848484613e79565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906159a4565b6001600160a01b0316336001600160a01b031614611ed35760405162461bcd60e51b815260040161095890615ab8565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f0e57600080fd5b505af1158015610b4d573d6000803e3d6000fd5b611f2a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b9190615964565b15611fa957604051632b37d9d160e21b815260040160405180910390fd5b610a6c82826141b0565b611fbb613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190615964565b1561203a57604051632b37d9d160e21b815260040160405180910390fd5b610cd333826141b0565b6000610a7f82614362565b604080516000815260208101909152606090826001600160401b0381111561207957612079615b1e565b6040519080825280602002602001820160405280156120ac57816020015b60608152602001906001900390816120975790505b50915060005b8381101561212e57612109308686848181106120d0576120d0615b34565b90506020028101906120e29190615b4a565b856040516020016120f593929190615b90565b6040516020818303038152906040526143d3565b83828151811061211b5761211b615b34565b60209081029190910101526001016120b2565b505092915050565b61213e613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190615964565b156121bd57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260226020526040902054839060ff166121f857604051622920f760e21b8152600401610958919061553e565b50610e6f838383614449565b61220c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d9190615964565b1561228b57604051632b37d9d160e21b815260040160405180910390fd5b83836122988282336130b9565b8282339091926122be57604051630c76b97b60e41b815260040161095893929190615981565b50505085846122ce8282336130b9565b8282339091926122f457604051630c76b97b60e41b815260040161095893929190615981565b505050600061230489898861387e565b9050611b0d8988836141e8565b612319613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190615964565b1561239857604051632b37d9d160e21b815260040160405180910390fd5b610e6f838383614449565b6123ab613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c9190615964565b1561242a57604051632b37d9d160e21b815260040160405180910390fd5b8060000361244b57604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038084166000908152601b6020908152604080832093861683529281529082902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff80821660608401526001600160401b03600160201b830481166080850152600160601b8304811660a08501819052600160a01b840490921660c0850152600160c01b90920490911660e08301526004830154610100830152600590920154610120820152908490849061252a576040516330acea0d60e11b8152600401610958929190615a36565b50506000612538858561412c565b90506000816003015411858590916125655760405163b6a70b3b60e01b8152600401610958929190615a36565b50508281600201546125779190615a23565b60028201556125893384610a2f613565565b836001600160a01b0316856001600160a01b03167f673007a04e501145e79f59aea5e0413b6e88344fdaf10326254530d6a1511530856040516125ce91815260200190565b60405180910390a35050505050565b6040805160208101909152600081526040805160208101909152600081526000612607868661412c565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b60408051608081018252600080825260208201819052918101829052606081019190915261265d8383613bc8565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b6126a4613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270591906159a4565b6001600160a01b0316336001600160a01b03161461273657604051635d9044cd60e01b815260040160405180910390fd5b600d805463ffffffff191690556040517f93be484d290d119d9cf99cce69d173c732f9403333ad84f69c807b590203d10990600090a1565b60408051608081018252600080825260208201819052918101829052606081019190915261279e85858585613b5c565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b6127de613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190615964565b1561285d57604051632b37d9d160e21b815260040160405180910390fd5b3360009081526012602052604090205460ff1615612966576040516001600160a01b038581166024830152604482018590526064820184905282811660848301526000917f00000000000000000000000000000000000000000000000000000000000000009091169060a40160408051601f198184030181529181526020820180516001600160e01b031663224451c160e11b179052516128fe9190615bb7565b600060405180830381855af49150503d8060008114612939576040519150601f19603f3d011682016040523d82523d6000602084013e61293e565b606091505b50509050806129605760405163ef370f5160e01b815260040160405180910390fd5b5061173c565b6001600160a01b0384166000908152601b6020908152604080832033808552925282209091612995878461412c565b90506000816002015483600001546129ad9190615a23565b9050806000036129d057604051630a8a55c960e31b815260040160405180910390fd5b60006129dc888361434b565b905060006129ee85600001548361434b565b90508015612be8576003850154600090612a1390839063ffffffff9081169061457916565b9050888181811015612a3a57604051632f514d5760e21b8152600401610958929190615bd3565b50508815612aa757612a4f888a61160e613565565b876001600160a01b0316876001600160a01b03168c6001600160a01b03167f95ff4196cd75fa49180ba673948ea43935f59e7c4ba101fa09b9fe0ec266d5828c604051612a9e91815260200190565b60405180910390a45b612acb612ab48a84615a10565b612abc613565565b6001600160a01b0316906145d9565b8554612ad78382615a10565b8760010154612ae691906159d7565b612af091906159ee565b60018701558554612b02908390615a10565b8655600286015415801590612b1957506001860154155b15612b3d5760006002870181905560058701805491612b3783615be1565b91905055505b6001600160a01b038b166000908152600e6020526040902060040154612b64908390615a10565b6001600160a01b038c166000908152600e60205260409020600481019190915554612b90908390615a10565b6001600160a01b038c81166000818152600e60209081526040918290209490945551858152918a169290917fe7b110f13cde981d5079ab7faa4249c5f331f5c292dbc6031969d2ce694188a3910160405180910390a3505b612bf28183615a10565b91508115612d2c5760205460ff1615612cde57612c1182612abc613565565b6002840154612c208382615a10565b8560050154612c2f91906159d7565b612c3991906159ee565b60058501556002840154612c4e908390615a10565b6002850155600684015415801590612c6857506005840154155b15612c8c5760006006850181905560078501805491612c8683615be1565b91905055505b856001600160a01b03168a6001600160a01b03167fc5d16dbb577cf07678b577232717c9a606197a014f61847e623d47fc6bf6b77184604051612cd191815260200190565b60405180910390a3612d2c565b856001600160a01b03168a6001600160a01b03167fdce44f0aeed2089c75db59f5a517b9a19a734bf0213412fa129f0d0434126b2484604051612d2391815260200190565b60405180910390a35b50505050505050505050565b612d40613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da191906159a4565b6001600160a01b0316336001600160a01b031614612dd257604051635d9044cd60e01b815260040160405180910390fd5b6020805460ff191660011790556040517f2192802a8934dbf383338406b279ec7f3eccee31e58d6c0444d6dd6bfff24b3590600090a1565b612e12613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e739190615964565b15612e9157604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038416612eb8576040516322347d6760e21b815260040160405180910390fd5b6001600160a01b038316612edf5760405163a962605960e01b815260040160405180910390fd5b610b4d868686868686613c18565b6000612ef7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f589190615964565b15612f7657604051632b37d9d160e21b815260040160405180910390fd5b8383612f838282336130b9565b828233909192612fa957604051630c76b97b60e41b815260040161095893929190615981565b505050612fb7868686614621565b9695505050505050565b6000610a7c8383614328565b612fd5613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190615964565b1561305457604051632b37d9d160e21b815260040160405180910390fd5b82826130618282336130b9565b82823390919261308757604051630c76b97b60e41b815260040161095893929190615981565b5050506118278585856141e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000836001600160a01b0316826001600160a01b0316036130dc5750600161188b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361314457506001600160a01b0380841660009081526015602090815260408083209385168352929052205460ff1661188b565b506001600160a01b038084166000908152601f60209081526040808320868516845282528083209385168352929052205460ff1661188b565b6000841161319e57604051630a2a4e5b60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614806131e45750600d5463ffffffff16155b83906132045760405163353666ff60e01b8152600401610958919061553e565b508163ffffffff8116620f42401015613239576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b50601a5481906001600160401b0390811690821681101561326f5760405163ee5602e160e01b8152600401610958929190615a9e565b50506001600160a01b038581166000908152601b6020908152604080832093871683529290522060030154600160601b90046001600160401b0316156132c857604051632b542c0d60e11b815260040160405180910390fd5b60006132d386614362565b90508481808211156132fa5760405163ccaf28a960e01b8152600401610958929190615bd3565b505060405180610140016040528086815260200160008152602001600081526020018463ffffffff168152602001836001600160401b03168152602001426001600160401b031681526020018463ffffffff168152602001836001600160401b03168152602001600081526020016000815250601b6000886001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600301600c6101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160030160146101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160030160186101000a8154816001600160401b0302191690836001600160401b03160217905550610100820151816004015561012082015181600501559050506000600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002090508581600401546134fa9190615a23565b60048201556040805187815263ffffffff861660208201526001600160401b0385168183015290516001600160a01b0387811692908a16917f88b4c2d08cea0f01a24841ff5d14814ddb5b14ac44b05e0835fcc0dcd8c7bc259181900360600190a350505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610e6f576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af11580156135e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136099190615964565b610e6f5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610958565b81670de0b6b3a76400008082101561366e5760405163b86d885760e01b8152600401610958929190615bd3565b50506001600160a01b038481166000908152601b602090815260408083209387168352929052206003015484908490600160601b90046001600160401b03166136cc576040516330acea0d60e11b8152600401610958929190615a36565b505060006136da858561412c565b336000908152600482016020526040902060028201549192509015158061370357506003820154155b8686909161372657604051631984edef60e31b8152600401610958929190615a36565b50506000826002015460001480613744575082600501548360020154145b905060008161377f57836005015484600201546137619190615a10565b600385015461377090886159d7565b61377a91906159ee565b613781565b855b905080158015906137925750848110155b818690916137b557604051635d88e8d160e01b8152600401610958929190615bd3565b50508584600201546137c79190615a23565b600285015560038401546137dc908290615a23565b600385015582546137ee908290615a23565b835560405133906001600160a01b0389811691908b16907f237818af8bb47710142edd8fc301fbc507064fb357cf122fb161ca447e3cb13e90613834908b908790615bd3565b60405180910390a45050505050505050565b6001600160a01b038281166000908152601b60209081526040808320938516835292905290812060018101549054610a7c9190615a10565b6001600160a01b038381166000818152601b60209081526040808320948716808452948252808320600281015460018201548351610100810185528681529485018790529284019690965260608301949094526080820181905260a0820185905260c08201869052600584015460e08301529193849290916138ff816147b3565b875492965094509250613913908590615a10565b855560028501839055600185018290556001600160a01b0389166000908152600e60205260408120600401805486929061394e908490615a10565b92505081905550876001600160a01b0316896001600160a01b03167f9008d731ddfbec70bc364780efd63057c6877bee8027c4708a104b365395885d8660405161399a91815260200190565b60405180910390a35091979650505050505050565b3360008290036139d257604051630a2a4e5b60e11b815260040160405180910390fd5b60006139dd82614362565b9050828180821115613a045760405163ccaf28a960e01b8152600401610958929190615bd3565b50506001600160a01b0382166000908152600e602052604081208054600d549192909163ffffffff1690819003613a9657613a3f8683615a10565b8355613a4e858761160e613565565b846001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8387604051613a8991815260200190565b60405180910390a2610b4d565b600283015415801590613aad575082600301544310155b15613abb57613abb85613d9e565b600283015415613ae557613ae2613ad68460030154436148ad565b846002015483896148c7565b90505b858360020154613af59190615a23565b6002840155613b048143615a23565b6003840181905560028401546040516001600160a01b038816927f91642f23a1196e1424949fafa2a428c3b5d1f699763942ff08a6fbe9d4d7e98092613b4c92909190615bd3565b60405180910390a2505050505050565b6000601e6000866001811115613b7457613b74615a6f565b6001811115613b8557613b85615a6f565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d6000846001811115613be057613be0615a6f565b6001811115613bf157613bf1615a6f565b81526020019081526020016000206000838152602001908152602001600020905092915050565b6000613c24878761412c565b905080600201546000141580613c3c57506003810154155b87879091613c5f57604051631984edef60e31b8152600401610958929190615a36565b5050600681015460058201546040805161010081018252600181526001600160a01b03808c1660208301528a16918101919091523360608201526080810182905260a0810183905260c08101859052600784015460e08201526000929190613cc6816147b3565b600288015492965094509250613cdd908590615a10565b600286015560068501839055600585018290558315613d91576001600160a01b03891615801590613d1657506001600160a01b03881615155b15613d2c57613d278989868a613641565b613d91565b613d39338561160e613565565b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f305f519d8909c676ffd870495d4563032eb0b506891a6dd9827490256cc9914e87604051613d8891815260200190565b60405180910390a45b5050505050505050505050565b6001600160a01b0381166000908152600e6020526040812060028101549091819003613ddd57604051630a2a4e5b60e11b815260040160405180910390fd5b600382015443811115613e0657604051631d222f1b60e31b815260040161095891815260200190565b5060006002830181905560038301558154613e22908290615a10565b8255613e31838261160e613565565b826001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8382604051613e6c91815260200190565b60405180910390a2505050565b6000808211613e9b57604051637318ad9960e01b815260040160405180910390fd5b6000613ea7858561412c565b33600090815260048201602052604090208054919250908480821015613ee25760405163ab99793560e01b8152600401610958929190615bd3565b5050600282015486908690613f0c57604051631984edef60e31b8152600401610958929190615a36565b50506000826003015483600501548460020154613f299190615a10565b613f3390876159d7565b613f3d91906159ee565b905060008360050154600014613f705760058401546006850154613f6190846159d7565b613f6b91906159ee565b613f72565b815b6001600160a01b038981166000908152601b60209081526040808320938c1683529290529081206003015491925090613fbb90600160201b90046001600160401b031642615a23565b9050828560050154613fcd9190615a23565b60058601556006850154613fe2908390615a23565b60068601556003850154613ff7908890615a10565b60038601558354614009908890615a10565b8085551561407557600085600301548660050154876002015461402c9190615a10565b865461403891906159d7565b61404291906159ee565b905080670de0b6b3a7640000808210156140715760405163587ab9ab60e11b8152600401610958929190615bd3565b5050505b600061408b60018b8b3387878c6007015461491b565b9050336001600160a01b0316896001600160a01b03168b6001600160a01b03167f0525d6ad1aa78abc571b5c1984b5e1ea4f1412368c1cc348ca408dbb1085c9a1878c6040516140dc929190615bd3565b60405180910390a49998505050505050505050565b8015610e6f5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016135c6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361418557506001600160a01b0382166000908152601460205260409020610a7f565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610a7f565b806000036141d157604051630a2a4e5b60e11b815260040160405180910390fd5b6141de3382610a2f613565565b610a6c8282614ac1565b8060000361420957604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038381166000908152601b60209081526040808320938616835292905220600381015484908490600160601b90046001600160401b0316614266576040516330acea0d60e11b8152600401610958929190615a36565b5050600061427385614362565b905082818082111561429a5760405163ccaf28a960e01b8152600401610958929190615bd3565b505081546142a9908490615a23565b82556001600160a01b0385166000908152600e60205260409020600401546142d2908490615a23565b6001600160a01b038681166000818152600e602090815260409182902060040194909455518681529187169290917feaf6ea3a42ed2fd1b6d575f818cbda593af9524aa94bd30e65302ac4dc23474591016125ce565b600080614335848461412c565b905080600501548160020154610dd09190615a10565b60008183111561435b5781610a7c565b5090919050565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261439591615a23565b61439f9190615a23565b6001600160a01b0384166000908152600e60205260409020549091508181116143c9576000610dd0565b610dd08282615a10565b6060600080846001600160a01b0316846040516143f09190615bb7565b600060405180830381855af49150503d806000811461442b576040519150601f19603f3d011682016040523d82523d6000602084013e614430565b606091505b5091509150614440858383614b34565b95945050505050565b336001600160a01b0383160361447257604051630123065360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036144df573360009081526015602090815260408083206001600160a01b03861684529091529020805460ff191682151517905561451b565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020805460ff19168215151790555b816001600160a01b0316836001600160a01b0316336001600160a01b03167faa5a59b38e8f68292982382bf635c2f263ca37137bbc52956acd808fd7bf976f8460405161456c911515815260200190565b60405180910390a4505050565b600061458883620f4240101590565b8061459b575061459b82620f4240101590565b838390916145be5760405163768bf0eb60e11b8152600401610958929190615bd3565b50620f424090506145cf83856159d7565b610a7c91906159ee565b8015610a6c57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b158015611f0e57600080fd5b60008160000361464457604051630a2a4e5b60e11b815260040160405180910390fd5b60006146508585613846565b90508083808210156146775760405163587ab9ab60e11b8152600401610958929190615bd3565b50506001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154909190156146ec578160010154600183600101548785600201546146c991906159d7565b6146d39190615a23565b6146dd9190615a10565b6146e791906159ee565b6146ee565b845b600383015490915060009061471390600160201b90046001600160401b031642615a23565b90508183600201546147259190615a23565b6002840155600183015461473a908790615a23565b8360010181905550600061475860008a8a8c87878a6005015461491b565b9050876001600160a01b0316896001600160a01b03167f3b81913739097ced1e7fa748c6058d34e2c00b961fb501094543b397b198fdaa8960405161479f91815260200190565b60405180910390a398975050505050505050565b6000806000806147d58560000151866020015187604001518860600151613b5c565b905060008160030154116147fc576040516307e332c560e31b815260040160405180910390fd5b60006148088683614b87565b905085604001516001600160a01b031686602001516001600160a01b03168760000151600181111561483c5761483c615a6f565b6060808a01518551602080880151604080516001600160a01b039095168552918401929092528201527f86c2f162872d7c46d7ee0caad366da6dc430889b9d8f27e4bed3785548f9954b910160405180910390a4602081015160408201516060909201519097919650945092505050565b60008183116148bd576000610a7c565b610a7c8284615a10565b60006148d38285615a23565b60016148df8487615a23565b6148e99190615a10565b6148f384866159d7565b6148fd87896159d7565b6149079190615a23565b6149119190615a23565b61444091906159ee565b60008360000361493e57604051637318ad9960e01b815260040160405180910390fd5b600061494c89898989613b5c565b90506103e88160030154106149745760405163332b852b60e11b815260040160405180910390fd5b60028101546040516001600160601b031960608b811b821660208401528a811b8216603484015289901b166048820152605c810191909152600090607c0160405160208183030381529060405280519060200120905060006149d68b83613bc8565b8781556001810180546001600160401b0319166001600160401b03891617905560006002820155600380820187905584015490915015614a245781614a1f8c8560010154613bc8565b600201555b614a2e8383614c82565b886001600160a01b03168a6001600160a01b03168c6001811115614a5457614a54615a6f565b604080516001600160a01b038d168152602081018c90526001600160401b038b168183015260608101879052608081018a905290517f036538df4a591a5cc74b68cfc7f8c61e8173dbc81627e1d62600b61e820461789181900360a00190a4509998505050505050505050565b6001600160a01b0382166000908152600e6020526040902054614ae5908290615a23565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906113719084815260200190565b606082614b4957614b4482614d15565b61188b565b8151158015614b6057506001600160a01b0384163b155b15614b805783604051639996b31560e01b8152600401610958919061553e565b508061188b565b614bb26040518060800160405280600081526020016000815260200160008152602001600081525090565b615194614bc28460000151614d3e565b9050615194614bd48560000151614da3565b905060008560000151600087608001518860a001518960e00151604051602001614c02959493929190615bfa565b6040516020818303038152906040529050600080614c3785614dea86868c60c001518c614f5a9095949392919063ffffffff16565b91509150600080600083806020019051810190614c549190615c3d565b60408051608081018252998a5260208a019390935291880152606087015250939a9950505050505050505050565b612710826003015410614ca8576040516303a8c56b60e61b815260040160405180910390fd5b80614cc657604051638f4a893d60e01b815260040160405180910390fd5b6001808301829055600283018054600090614ce2908490615a23565b90915550506003820154600003614cf7578082555b6001826003016000828254614d0c9190615a23565b90915550505050565b805115614d255780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6151946000826001811115614d5557614d55615a6f565b03614d635750615014919050565b6001826001811115614d7757614d77615a6f565b03614d855750615056919050565b604051636bd1fba760e11b815260040160405180910390fd5b919050565b6151946000826001811115614dba57614dba615a6f565b03614dc85750615062919050565b6001826001811115614ddc57614ddc615a6f565b03614d8557506150b9919050565b60006060600080600080600087806020019051810190614e0a9190615c7c565b945094509450945094506000614e20868b613bc8565b6001810154909150426001600160401b039091161115614e5b5760016040518060200160405280600081525097509750505050505050614f53565b600381015460009083148015614eae5782548590614e7a9088906159d7565b614e8491906159ee565b9150614e908287615a10565b8354909650614e9f9086615a10565b9450614eab8288615a23565b96505b8b886001811115614ec157614ec1615a6f565b845460018601546040805187815260208101939093526001600160401b03909116828201528415156060830152517f469e89d0a4e0e5deb2eb1ade5b3fa67fdfbeb4787c3a7c1e8e89aaf28562cab29181900360800190a38787878787604051602001614f32959493929190615bfa565b6040516020818303038152906040529a5060008b9950995050505050505050505b9250929050565b600060608760030154831115614f8357604051634a411b9d60e11b815260040160405180910390fd5b60008315614f915783614f97565b88600301545b89549094505b8015801590614fac5750600085115b1561500557600080614fc283898c63ffffffff16565b915091508115614fd3575050615005565b965086614fe18c8c8b6150c4565b925086614fed81615cc5565b9750508380614ffb90615be1565b9450505050614f9d565b50989397509295505050505050565b6000601d81805b600181111561502c5761502c615a6f565b81526020019081526020016000206000838152602001908152602001600020600201549050919050565b6000601d81600161501b565b601d6000805b600181111561507957615079615a6f565b8152602080820192909252604090810160009081209381529290915281208181556001810180546001600160401b03191690556002810182905560030155565b601d60006001615068565b6000808460030154116150ea5760405163ddaf8f2160e01b815260040160405180910390fd5b60006150fd85600001548563ffffffff16565b905061511085600001548463ffffffff16565b60018560030160008282546151259190615a10565b9091555050808555600385015460000361514157600060018601555b5050915492915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6110d0615cdc565b6001600160a01b0381168114610cd357600080fd5b803563ffffffff81168114614d9e57600080fd5b80356001600160401b0381168114614d9e57600080fd5b600080600080600060a086880312156151f457600080fd5b85356151ff8161519c565b9450602086013561520f8161519c565b935060408601359250615224606087016151b1565b9150615232608087016151c5565b90509295509295909350565b6000806040838503121561525157600080fd5b823561525c8161519c565b946020939093013593505050565b6000806040838503121561527d57600080fd5b82356152888161519c565b915060208301356152988161519c565b809150509250929050565b6000806000606084860312156152b857600080fd5b83356152c38161519c565b925060208401356152d38161519c565b929592945050506040919091013590565b6000602082840312156152f657600080fd5b610a7c826151c5565b6000610140820190508251825260208301516020830152604083015160408301526060830151615337606084018263ffffffff169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538560c084018263ffffffff169052565b5060e08301516153a060e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b6000602082840312156153d157600080fd5b5035919050565b60028110610cd357600080fd5b600080600080608085870312156153fb57600080fd5b8435615406816153d8565b935060208501356154168161519c565b925060408501356154268161519c565b915060608501356154368161519c565b939692955090935050565b60006020828403121561545357600080fd5b813561188b8161519c565b803560038110614d9e57600080fd5b6000806000806080858703121561548357600080fd5b843561548e8161519c565b9350602085013561549e8161519c565b92506154ac6040860161545e565b9396929550929360600135925050565b8015158114610cd357600080fd5b600080604083850312156154dd57600080fd5b82356154e88161519c565b91506020830135615298816154bc565b6000806000806080858703121561550e57600080fd5b84356155198161519c565b935060208501356155298161519c565b93969395505050506040820135916060013590565b6001600160a01b0391909116815260200190565b60008060006060848603121561556757600080fd5b83356155728161519c565b925060208401356155828161519c565b91506155906040850161545e565b90509250925092565b6000806000606084860312156155ae57600080fd5b83356155b98161519c565b925060208401356155c98161519c565b915060408401356155d98161519c565b809150509250925092565b600080600080608085870312156155fa57600080fd5b84356156058161519c565b935060208501356156158161519c565b9250615623604086016151b1565b9150615631606086016151c5565b905092959194509250565b60008060006060848603121561565157600080fd5b833561565c8161519c565b9250602084013561566c8161519c565b9150615590604085016151b1565b60008060006040848603121561568f57600080fd5b833561569a8161519c565b925060208401356001600160401b038111156156b557600080fd5b8401601f810186136156c657600080fd5b80356001600160401b038111156156dc57600080fd5b8660208284010111156156ee57600080fd5b939660209190910195509293505050565b6000806020838503121561571257600080fd5b82356001600160401b0381111561572857600080fd5b8301601f8101851361573957600080fd5b80356001600160401b0381111561574f57600080fd5b8560208260051b840101111561576457600080fd5b6020919091019590945092505050565b60005b8381101561578f578181015183820152602001615777565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561580c57603f19878603018452815180518087526157e9816020890160208501615774565b601f01601f191695909501602090810195509384019391909101906001016157c0565b50929695505050505050565b60008060006060848603121561582d57600080fd5b83356158388161519c565b925060208401356158488161519c565b915060408401356155d9816154bc565b6000806000806080858703121561586e57600080fd5b84356158798161519c565b935060208501356158898161519c565b925060408501356154ac8161519c565b600080604083850312156158ac57600080fd5b823561525c816153d8565b600080600080608085870312156158cd57600080fd5b84356158d88161519c565b9350602085013592506040850135915060608501356154368161519c565b60008060008060008060c0878903121561590f57600080fd5b863561591a8161519c565b9550602087013561592a8161519c565b9450604087013561593a8161519c565b9350606087013561594a8161519c565b9598949750929560808101359460a0909101359350915050565b60006020828403121561597657600080fd5b815161188b816154bc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6000602082840312156159b657600080fd5b815161188b8161519c565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a7f57610a7f6159c1565b600082615a0b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610a7f57610a7f6159c1565b80820180821115610a7f57610a7f6159c1565b6001600160a01b0392831681529116602082015260400190565b63ffffffff9290921682526001600160401b0316602082015260400190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a9757600080fd5b5051919050565b6001600160401b0392831681529116602082015260400190565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112615b6157600080fd5b8301803591506001600160401b03821115615b7b57600080fd5b602001915036819003821315614f5357600080fd5b828482376000838201600081528351615bad818360208801615774565b0195945050505050565b60008251615bc9818460208701615774565b9190910192915050565b918252602082015260400190565b600060018201615bf357615bf36159c1565b5060010190565b60a0810160028710615c1c57634e487b7160e01b600052602160045260246000fd5b95815260208101949094526040840192909252606083015260809091015290565b60008060008060808587031215615c5357600080fd5b8451615c5e816153d8565b60208601516040870151606090970151919890975090945092505050565b600080600080600060a08688031215615c9457600080fd5b8551615c9f816153d8565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600081615cd457615cd46159c1565b506000190190565b634e487b7160e01b600052605160045260246000fdfea2646970667358221220f5046670ab269f9c179f41df4a02cd9c6b2ca3d5d507e2b9fcf15f800f351d8b64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphCurationToken.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphCurationToken.json new file mode 100644 index 000000000..342cb9f6a --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphCurationToken.json @@ -0,0 +1,414 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphCurationToken", + "sourceName": "contracts/curation/GraphCurationToken.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewPendingOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506114ec806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806379ba5097116100a2578063a9059cbb11610071578063a9059cbb14610352578063c4d66de81461037e578063dd62ed3e146103a4578063e3056a34146103d2578063f2fde38b146103da57610116565b806379ba5097146102ea57806379cc6790146102f257806395d89b411461031e578063a457c2d71461032657610116565b806323b872dd116100e957806323b872dd14610216578063313ce5671461024c578063395093511461026a57806340c10f191461029657806370a08231146102c457610116565b806306fdde031461011b578063095ea7b3146101985780630c340a24146101d857806318160ddd146101fc575b600080fd5b610123610400565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015d578181015183820152602001610145565b50505050905090810190601f16801561018a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c4600480360360408110156101ae57600080fd5b506001600160a01b038135169060200135610496565b604080519115158252519081900360200190f35b6101e06104b3565b604080516001600160a01b039092168252519081900360200190f35b6102046104c2565b60408051918252519081900360200190f35b6101c46004803603606081101561022c57600080fd5b506001600160a01b038135811691602081013590911690604001356104c8565b61025461054f565b6040805160ff9092168252519081900360200190f35b6101c46004803603604081101561028057600080fd5b506001600160a01b038135169060200135610558565b6102c2600480360360408110156102ac57600080fd5b506001600160a01b0381351690602001356105a6565b005b610204600480360360208110156102da57600080fd5b50356001600160a01b031661060c565b6102c2610627565b6102c26004803603604081101561030857600080fd5b506001600160a01b038135169060200135610737565b610123610799565b6101c46004803603604081101561033c57600080fd5b506001600160a01b0381351690602001356107fa565b6101c46004803603604081101561036857600080fd5b506001600160a01b038135169060200135610862565b6102c26004803603602081101561039457600080fd5b50356001600160a01b0316610876565b610204600480360360408110156103ba57600080fd5b506001600160a01b0381358116916020013516610972565b6101e061099d565b6102c2600480360360208110156103f057600080fd5b50356001600160a01b03166109ac565b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561048c5780601f106104615761010080835404028352916020019161048c565b820191906000526020600020905b81548152906001019060200180831161046f57829003601f168201915b5050505050905090565b60006104aa6104a3610aaa565b8484610aae565b50600192915050565b6065546001600160a01b031681565b60355490565b60006104d5848484610b9a565b610545846104e1610aaa565b61054085604051806060016040528060288152602001611400602891396001600160a01b038a1660009081526034602052604081209061051f610aaa565b6001600160a01b031681526020810191909152604001600020549190610cf7565b610aae565b5060019392505050565b60385460ff1690565b60006104aa610565610aaa565b846105408560346000610576610aaa565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610d8e565b6065546001600160a01b031633146105fe576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106088282610def565b5050565b6001600160a01b031660009081526033602052604090205490565b6066546001600160a01b0316801580159061064a5750336001600160a01b038216145b61069b576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b606580546001600160a01b038381166001600160a01b0319808416919091179384905560668054909116905560405191811692169082907f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f90600090a36066546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6065546001600160a01b0316331461078f576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106088282610ee1565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561048c5780601f106104615761010080835404028352916020019161048c565b60006104aa610807610aaa565b84610540856040518060600160405280602581526020016114926025913960346000610831610aaa565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610cf7565b60006104aa61086f610aaa565b8484610b9a565b600054610100900460ff168061088f575061088f610fdd565b8061089d575060005460ff16155b6108d85760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff16158015610903576000805460ff1961ff0019909116610100171660011790555b61090c82610fee565b61095d604051806040016040528060148152602001734772617068204375726174696f6e20536861726560601b8152506040518060400160405280600381526020016247435360e81b815250611010565b8015610608576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6066546001600160a01b031681565b6065546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610a56576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b606680546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b038316610af35760405162461bcd60e51b815260040180806020018281038252602481526020018061146e6024913960400191505060405180910390fd5b6001600160a01b038216610b385760405162461bcd60e51b815260040180806020018281038252602281526020018061138a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610bdf5760405162461bcd60e51b81526004018080602001828103825260258152602001806114496025913960400191505060405180910390fd5b6001600160a01b038216610c245760405162461bcd60e51b81526004018080602001828103825260238152602001806113456023913960400191505060405180910390fd5b610c2f8383836110c1565b610c6c816040518060600160405280602681526020016113ac602691396001600160a01b0386166000908152603360205260409020549190610cf7565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610c9b9082610d8e565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610d865760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d4b578181015183820152602001610d33565b50505050905090810190601f168015610d785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610de8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610e4a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610e56600083836110c1565b603554610e639082610d8e565b6035556001600160a01b038216600090815260336020526040902054610e899082610d8e565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610f265760405162461bcd60e51b81526004018080602001828103825260218152602001806114286021913960400191505060405180910390fd5b610f32826000836110c1565b610f6f81604051806060016040528060228152602001611368602291396001600160a01b0385166000908152603360205260409020549190610cf7565b6001600160a01b038316600090815260336020526040902055603554610f9590826110c6565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000610fe830611123565b15905090565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806110295750611029610fdd565b80611037575060005460ff16155b6110725760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff1615801561109d576000805460ff1961ff0019909116610100171660011790555b6110a5611129565b6110af83836111cb565b80156110c1576000805461ff00191690555b505050565b60008282111561111d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff16806111425750611142610fdd565b80611150575060005460ff16155b61118b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff161580156111b6576000805460ff1961ff0019909116610100171660011790555b80156111c8576000805461ff00191690555b50565b600054610100900460ff16806111e457506111e4610fdd565b806111f2575060005460ff16155b61122d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff16158015611258576000805460ff1961ff0019909116610100171660011790555b825161126b9060369060208601906112a3565b50815161127f9060379060208501906112a3565b506038805460ff1916601217905580156110c1576000805461ff0019169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826112d9576000855561131f565b82601f106112f257805160ff191683800117855561131f565b8280016001018555821561131f579182015b8281111561131f578251825591602001919060010190611304565b5061132b92915061132f565b5090565b5b8082111561132b576000815560010161133056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200b687fddcd01dbad6e1d5fbd49cb041f69ed61684a12a4c26c6e37e0f5ad7c2a64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c806379ba5097116100a2578063a9059cbb11610071578063a9059cbb14610352578063c4d66de81461037e578063dd62ed3e146103a4578063e3056a34146103d2578063f2fde38b146103da57610116565b806379ba5097146102ea57806379cc6790146102f257806395d89b411461031e578063a457c2d71461032657610116565b806323b872dd116100e957806323b872dd14610216578063313ce5671461024c578063395093511461026a57806340c10f191461029657806370a08231146102c457610116565b806306fdde031461011b578063095ea7b3146101985780630c340a24146101d857806318160ddd146101fc575b600080fd5b610123610400565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015d578181015183820152602001610145565b50505050905090810190601f16801561018a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c4600480360360408110156101ae57600080fd5b506001600160a01b038135169060200135610496565b604080519115158252519081900360200190f35b6101e06104b3565b604080516001600160a01b039092168252519081900360200190f35b6102046104c2565b60408051918252519081900360200190f35b6101c46004803603606081101561022c57600080fd5b506001600160a01b038135811691602081013590911690604001356104c8565b61025461054f565b6040805160ff9092168252519081900360200190f35b6101c46004803603604081101561028057600080fd5b506001600160a01b038135169060200135610558565b6102c2600480360360408110156102ac57600080fd5b506001600160a01b0381351690602001356105a6565b005b610204600480360360208110156102da57600080fd5b50356001600160a01b031661060c565b6102c2610627565b6102c26004803603604081101561030857600080fd5b506001600160a01b038135169060200135610737565b610123610799565b6101c46004803603604081101561033c57600080fd5b506001600160a01b0381351690602001356107fa565b6101c46004803603604081101561036857600080fd5b506001600160a01b038135169060200135610862565b6102c26004803603602081101561039457600080fd5b50356001600160a01b0316610876565b610204600480360360408110156103ba57600080fd5b506001600160a01b0381358116916020013516610972565b6101e061099d565b6102c2600480360360208110156103f057600080fd5b50356001600160a01b03166109ac565b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561048c5780601f106104615761010080835404028352916020019161048c565b820191906000526020600020905b81548152906001019060200180831161046f57829003601f168201915b5050505050905090565b60006104aa6104a3610aaa565b8484610aae565b50600192915050565b6065546001600160a01b031681565b60355490565b60006104d5848484610b9a565b610545846104e1610aaa565b61054085604051806060016040528060288152602001611400602891396001600160a01b038a1660009081526034602052604081209061051f610aaa565b6001600160a01b031681526020810191909152604001600020549190610cf7565b610aae565b5060019392505050565b60385460ff1690565b60006104aa610565610aaa565b846105408560346000610576610aaa565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610d8e565b6065546001600160a01b031633146105fe576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106088282610def565b5050565b6001600160a01b031660009081526033602052604090205490565b6066546001600160a01b0316801580159061064a5750336001600160a01b038216145b61069b576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b606580546001600160a01b038381166001600160a01b0319808416919091179384905560668054909116905560405191811692169082907f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f90600090a36066546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6065546001600160a01b0316331461078f576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106088282610ee1565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561048c5780601f106104615761010080835404028352916020019161048c565b60006104aa610807610aaa565b84610540856040518060600160405280602581526020016114926025913960346000610831610aaa565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610cf7565b60006104aa61086f610aaa565b8484610b9a565b600054610100900460ff168061088f575061088f610fdd565b8061089d575060005460ff16155b6108d85760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff16158015610903576000805460ff1961ff0019909116610100171660011790555b61090c82610fee565b61095d604051806040016040528060148152602001734772617068204375726174696f6e20536861726560601b8152506040518060400160405280600381526020016247435360e81b815250611010565b8015610608576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6066546001600160a01b031681565b6065546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610a56576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b606680546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b038316610af35760405162461bcd60e51b815260040180806020018281038252602481526020018061146e6024913960400191505060405180910390fd5b6001600160a01b038216610b385760405162461bcd60e51b815260040180806020018281038252602281526020018061138a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610bdf5760405162461bcd60e51b81526004018080602001828103825260258152602001806114496025913960400191505060405180910390fd5b6001600160a01b038216610c245760405162461bcd60e51b81526004018080602001828103825260238152602001806113456023913960400191505060405180910390fd5b610c2f8383836110c1565b610c6c816040518060600160405280602681526020016113ac602691396001600160a01b0386166000908152603360205260409020549190610cf7565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610c9b9082610d8e565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610d865760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d4b578181015183820152602001610d33565b50505050905090810190601f168015610d785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610de8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610e4a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610e56600083836110c1565b603554610e639082610d8e565b6035556001600160a01b038216600090815260336020526040902054610e899082610d8e565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610f265760405162461bcd60e51b81526004018080602001828103825260218152602001806114286021913960400191505060405180910390fd5b610f32826000836110c1565b610f6f81604051806060016040528060228152602001611368602291396001600160a01b0385166000908152603360205260409020549190610cf7565b6001600160a01b038316600090815260336020526040902055603554610f9590826110c6565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000610fe830611123565b15905090565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806110295750611029610fdd565b80611037575060005460ff16155b6110725760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff1615801561109d576000805460ff1961ff0019909116610100171660011790555b6110a5611129565b6110af83836111cb565b80156110c1576000805461ff00191690555b505050565b60008282111561111d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff16806111425750611142610fdd565b80611150575060005460ff16155b61118b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff161580156111b6576000805460ff1961ff0019909116610100171660011790555b80156111c8576000805461ff00191690555b50565b600054610100900460ff16806111e457506111e4610fdd565b806111f2575060005460ff16155b61122d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff16158015611258576000805460ff1961ff0019909116610100171660011790555b825161126b9060369060208601906112a3565b50815161127f9060379060208501906112a3565b506038805460ff1916601217905580156110c1576000805461ff0019169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826112d9576000855561131f565b82601f106112f257805160ff191683800117855561131f565b8280016001018555821561131f579182015b8281111561131f578251825591602001919060010190611304565b5061132b92915061132f565b5090565b5b8082111561132b576000815560010161133056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200b687fddcd01dbad6e1d5fbd49cb041f69ed61684a12a4c26c6e37e0f5ad7c2a64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphProxy.json new file mode 100644 index 000000000..97963021c --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#GraphProxy.json @@ -0,0 +1,177 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxy", + "sourceName": "contracts/upgrades/GraphProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_impl", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldAdmin", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPendingImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newPendingImplementation", + "type": "address" + } + ], + "name": "PendingImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "acceptUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptUpgradeAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation.json new file mode 100644 index 000000000..6792faf3f --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation.json @@ -0,0 +1,707 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2Curation", + "sourceName": "contracts/l2/curation/L2Curation.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + } + ], + "name": "Burned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Collected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationTax", + "type": "uint256" + } + ], + "name": "Signalled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newSubgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "bondingCurve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_tokensOutMin", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTaxPercentage", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTokenMaster", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultReserveRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCuratorSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_curationTaxPercentage", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isCurated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumCurationDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_signalOutMin", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "mintTaxFree", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "pools", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "reserveRatio", + "type": "uint32" + }, + { + "internalType": "contract IGraphCurationToken", + "name": "gcs", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_percentage", + "type": "uint32" + } + ], + "name": "setCurationTaxPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + } + ], + "name": "setCurationTokenMaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "setDefaultReserveRatio", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "setMinimumCurationDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + } + ], + "name": "signalToTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalToTokensNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea361014052613d0960e61b6101605234801561011a57600080fd5b5060805160a05160c05160e0516101005161012051610140516101605160e01c6128cc61018f60003980610c2f52508061141b52806119025250806113f25250806113c9528061180c5250806113a05280611dbf5250806113775280611ff252508061134e52508061132552506128cc6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationAddressBook.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationAddressBook.json new file mode 100644 index 000000000..6792faf3f --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationAddressBook.json @@ -0,0 +1,707 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2Curation", + "sourceName": "contracts/l2/curation/L2Curation.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + } + ], + "name": "Burned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Collected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationTax", + "type": "uint256" + } + ], + "name": "Signalled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newSubgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "bondingCurve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_tokensOutMin", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTaxPercentage", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTokenMaster", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultReserveRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCuratorSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_curationTaxPercentage", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isCurated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumCurationDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_signalOutMin", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "mintTaxFree", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "pools", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "reserveRatio", + "type": "uint32" + }, + { + "internalType": "contract IGraphCurationToken", + "name": "gcs", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_percentage", + "type": "uint32" + } + ], + "name": "setCurationTaxPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + } + ], + "name": "setCurationTokenMaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "setDefaultReserveRatio", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "setMinimumCurationDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + } + ], + "name": "signalToTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalToTokensNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea361014052613d0960e61b6101605234801561011a57600080fd5b5060805160a05160c05160e0516101005161012051610140516101605160e01c6128cc61018f60003980610c2f52508061141b52806119025250806113f25250806113c9528061180c5250806113a05280611dbf5250806113775280611ff252508061134e52508061132552506128cc6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationImplementationAddressBook.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationImplementationAddressBook.json new file mode 100644 index 000000000..6792faf3f --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2CurationImplementationAddressBook.json @@ -0,0 +1,707 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2Curation", + "sourceName": "contracts/l2/curation/L2Curation.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + } + ], + "name": "Burned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Collected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationTax", + "type": "uint256" + } + ], + "name": "Signalled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newSubgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "bondingCurve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_tokensOutMin", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTaxPercentage", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTokenMaster", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultReserveRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCuratorSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_curationTaxPercentage", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isCurated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumCurationDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_signalOutMin", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "mintTaxFree", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "pools", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "reserveRatio", + "type": "uint32" + }, + { + "internalType": "contract IGraphCurationToken", + "name": "gcs", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_percentage", + "type": "uint32" + } + ], + "name": "setCurationTaxPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + } + ], + "name": "setCurationTokenMaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "setDefaultReserveRatio", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "setMinimumCurationDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + } + ], + "name": "signalToTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalToTokensNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea361014052613d0960e61b6101605234801561011a57600080fd5b5060805160a05160c05160e0516101005161012051610140516101605160e01c6128cc61018f60003980610c2f52508061141b52806119025250806113f25250806113c9528061180c5250806113a05280611dbf5250806113775280611ff252508061134e52508061132552506128cc6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation_ProxyWithABI.json new file mode 100644 index 000000000..6792faf3f --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2Curation#L2Curation_ProxyWithABI.json @@ -0,0 +1,707 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2Curation", + "sourceName": "contracts/l2/curation/L2Curation.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + } + ], + "name": "Burned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Collected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "curator", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "signal", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationTax", + "type": "uint256" + } + ], + "name": "Signalled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newSubgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "bondingCurve", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_tokensOutMin", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTaxPercentage", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "curationTokenMaster", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "defaultReserveRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCuratorSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + }, + { + "internalType": "uint32", + "name": "_curationTaxPercentage", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isCurated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumCurationDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_signalOutMin", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "mintTaxFree", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "pools", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "reserveRatio", + "type": "uint32" + }, + { + "internalType": "contract IGraphCurationToken", + "name": "gcs", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_percentage", + "type": "uint32" + } + ], + "name": "setCurationTaxPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + } + ], + "name": "setCurationTokenMaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "setDefaultReserveRatio", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "setMinimumCurationDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + } + ], + "name": "signalToTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalToTokensNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea361014052613d0960e61b6101605234801561011a57600080fd5b5060805160a05160c05160e0516101005161012051610140516101605160e01c6128cc61018f60003980610c2f52508061141b52806119025250806113f25250806113c9528061180c5250806113a05280611dbf5250806113775280611ff252508061134e52508061132552506128cc6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#GraphProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#GraphProxy.json new file mode 100644 index 000000000..97963021c --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#GraphProxy.json @@ -0,0 +1,177 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxy", + "sourceName": "contracts/upgrades/GraphProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_impl", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldAdmin", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPendingImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newPendingImplementation", + "type": "address" + } + ], + "name": "PendingImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "acceptUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptUpgradeAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken.json new file mode 100644 index 000000000..4550767a3 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken.json @@ -0,0 +1,750 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2GraphToken", + "sourceName": "contracts/l2/token/L2GraphToken.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BridgeBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BridgeMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "gateway", + "type": "address" + } + ], + "name": "GatewaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1Address", + "type": "address" + } + ], + "name": "L1AddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "MinterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewPendingOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "bridgeBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "bridgeMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "gateway", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l1Address", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_gw", + "type": "address" + } + ], + "name": "setGateway", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "setL1Address", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101206040527fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac564726080527fefcec85968da792893fa503eb21730083fc6c50ed5461e56163b28335b2a5f9660a0527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60c0527fe33842a7acd1d5a1d28f25a931703e5605152dc48d64dc4716efdae1f565959160e0527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610100523480156100c657600080fd5b5060805160a05160c05160e0516101005161261e61010660003980611547525080611eae525080611e5e525080611e3d525080611e1c525061261e6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638c2a993e1161011a578063a9059cbb116100ad578063ca52d7d71161007c578063ca52d7d71461067a578063d505accf146106a0578063dd62ed3e146106f1578063e3056a341461071f578063f2fde38b14610727576101fb565b8063a9059cbb146105fa578063aa271e1a14610626578063c2eeeebd1461064c578063c4d66de814610654576101fb565b806398650275116100e957806398650275146105205780639ce7abe514610528578063a2594d82146105a8578063a457c2d7146105ce576101fb565b80638c2a993e146104a057806390646b4a146104cc57806395d89b41146104f2578063983b2d56146104fa576101fb565b8063395093511161019257806374f4f5471161016157806374f4f5471461041a57806379ba50971461044657806379cc67901461044e5780637ecebe001461047a576101fb565b8063395093511461037f57806340c10f19146103ab57806342966c68146103d757806370a08231146103f4576101fb565b806318160ddd116101ce57806318160ddd146102e957806323b872dd146103035780633092afd514610339578063313ce56714610361576101fb565b806306fdde0314610200578063095ea7b31461027d5780630c340a24146102bd578063116191b6146102e1575b600080fd5b61020861074d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024257818101518382015260200161022a565b50505050905090810190601f16801561026f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a96004803603604081101561029357600080fd5b506001600160a01b0381351690602001356107e3565b604080519115158252519081900360200190f35b6102c5610800565b604080516001600160a01b039092168252519081900360200190f35b6102c561080f565b6102f161081e565b60408051918252519081900360200190f35b6102a96004803603606081101561031957600080fd5b506001600160a01b03813581169160208101359091169060400135610824565b61035f6004803603602081101561034f57600080fd5b50356001600160a01b03166108ab565b005b610369610958565b6040805160ff9092168252519081900360200190f35b6102a96004803603604081101561039557600080fd5b506001600160a01b038135169060200135610961565b61035f600480360360408110156103c157600080fd5b506001600160a01b0381351690602001356109af565b61035f600480360360208110156103ed57600080fd5b5035610a0e565b6102f16004803603602081101561040a57600080fd5b50356001600160a01b0316610a1f565b61035f6004803603604081101561043057600080fd5b506001600160a01b038135169060200135610a3a565b61035f610ad4565b61035f6004803603604081101561046457600080fd5b506001600160a01b038135169060200135610be2565b6102f16004803603602081101561049057600080fd5b50356001600160a01b0316610c3c565b61035f600480360360408110156104b657600080fd5b506001600160a01b038135169060200135610c4e565b61035f600480360360208110156104e257600080fd5b50356001600160a01b0316610ce8565b610208610de1565b61035f6004803603602081101561051057600080fd5b50356001600160a01b0316610e42565b61035f610eef565b61035f6004803603604081101561053e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561056957600080fd5b82018360208201111561057b57600080fd5b8035906020019184600183028401116401000000008311171561059d57600080fd5b509092509050610f43565b61035f600480360360208110156105be57600080fd5b50356001600160a01b0316611099565b6102a9600480360360408110156105e457600080fd5b506001600160a01b0381351690602001356111b4565b6102a96004803603604081101561061057600080fd5b506001600160a01b03813516906020013561121c565b6102a96004803603602081101561063c57600080fd5b50356001600160a01b0316611230565b6102c561124e565b61035f6004803603602081101561066a57600080fd5b50356001600160a01b031661125d565b61035f6004803603602081101561069057600080fd5b50356001600160a01b03166113d3565b61035f600480360360e08110156106b657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356114cf565b6102f16004803603604081101561070757600080fd5b506001600160a01b0381358116916020013516611680565b6102c56116ab565b61035f6004803603602081101561073d57600080fd5b50356001600160a01b03166116ba565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f76107f06117b8565b84846117bc565b50600192915050565b6000546001600160a01b031681565b60ca546001600160a01b031681565b60365490565b60006108318484846118a8565b6108a18461083d6117b8565b61089c8560405180606001604052806028815260200161250e602891396001600160a01b038a1660009081526035602052604081209061087b6117b8565b6001600160a01b031681526020810191909152604001600020549190611a05565b6117bc565b5060019392505050565b6000546001600160a01b03163314610903576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b61090c81611230565b61094c576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b61095581611a9c565b50565b60395460ff1690565b60006107f761096e6117b8565b8461089c856035600061097f6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611ae5565b6109b833611230565b610a00576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b610a0a8282611b46565b5050565b610955610a196117b8565b82611c38565b6001600160a01b031660009081526034602052604090205490565b60ca546001600160a01b03163314610a87576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610a918282610be2565b6040805182815290516001600160a01b038416917fe87aeeb22c5753db7f543198a4c3089d2233040ea9d1cab0eaa3b96d94d4fc6e919081900360200190a25050565b6001546001600160a01b03168015801590610af75750336001600160a01b038216145b610b48576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610c198260405180606001604052806024815260200161253660249139610c1286610c0d6117b8565b611680565b9190611a05565b9050610c2d83610c276117b8565b836117bc565b610c378383611c38565b505050565b609a6020526000908152604090205481565b60ca546001600160a01b03163314610c9b576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610ca58282611b46565b6040805182815290516001600160a01b038416917fae4b6e741e38054ad6705655cc56c91c184f6768f76b41e10803e2766d89e19f919081900360200190a25050565b6000546001600160a01b03163314610d40576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d8d576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4741544557415960881b604482015290519081900360640190fd5b60ca80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5317fa585931182194fed99f2ea5f2efd38af9cff9724273704c8501c521e34b9181900360200190a150565b60388054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b6000546001600160a01b03163314610e9a576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610ee6576040805162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa6a4a72a22a960911b604482015290519081900360640190fd5b61095581611d34565b610ef833611230565b610f38576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b610f4133611a9c565b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516001600160a01b03163314611007576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b0316331461115d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b505af11580156111ac573d6000803e3d6000fd5b505050505050565b60006107f76111c16117b8565b8461089c856040518060600160405280602581526020016125c460259139603560006111eb6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611a05565b60006107f76112296117b8565b84846118a8565b6001600160a01b031660009081526099602052604090205460ff1690565b60cb546001600160a01b031681565b611265611d80565b6001600160a01b0316336001600160a01b0316146112c0576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b600154600160a81b900460ff16806112db57506112db611da5565b806112f05750600154600160a01b900460ff16155b61132b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015611362576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001600160a01b0382166113b1576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6113bc826000611db6565b8015610a0a576001805460ff60a81b191690555050565b6000546001600160a01b0316331461142b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661147b576040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f4c315f4144445245535360701b604482015290519081900360640190fd5b60cb80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f603c0b2e4494ac82839a70be8b6c660d7d042ccfe71c3ce0e5157f59090e74459181900360200190a150565b8315806114dc5750834211155b611523576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b6098546001600160a01b038089166000818152609a602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948c166060850152608084018b905260a084019490945260c08084018a90528451808503909101815260e08401855280519082012061190160f01b61010085015261010284019590955261012280840195909552835180840390950185526101429092019092528251920191909120906115ed82868686611ef3565b9050806001600160a01b0316896001600160a01b03161461164b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b6001600160a01b0389166000908152609a60205260409020805460010190556116758989896117bc565b505050505050505050565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314611712576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116611764576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b0383166118015760405162461bcd60e51b81526004018080602001828103825260248152602001806125a06024913960400191505060405180910390fd5b6001600160a01b0382166118465760405162461bcd60e51b81526004018080602001828103825260228152602001806124546022913960400191505060405180910390fd5b6001600160a01b03808416600081815260356020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118ed5760405162461bcd60e51b815260040180806020018281038252602581526020018061257b6025913960400191505060405180910390fd5b6001600160a01b0382166119325760405162461bcd60e51b815260040180806020018281038252602381526020018061240f6023913960400191505060405180910390fd5b61193d838383610c37565b61197a81604051806060016040528060268152602001612476602691396001600160a01b0386166000908152603460205260409020549190611a05565b6001600160a01b0380851660009081526034602052604080822093909355908416815220546119a99082611ae5565b6001600160a01b0380841660008181526034602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a945760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a59578181015183820152602001611a41565b50505050905090810190601f168015611a865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260996020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b600082820183811015611b3f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611ba1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bad60008383610c37565b603654611bba9082611ae5565b6036556001600160a01b038216600090815260346020526040902054611be09082611ae5565b6001600160a01b03831660008181526034602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611c7d5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b611c8982600083610c37565b611cc681604051806060016040528060228152602001612432602291396001600160a01b0385166000908152603460205260409020549190611a05565b6001600160a01b038316600090815260346020526040902055603654611cec9082612071565b6036556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611db0306120ce565b15905090565b611dfe6040518060400160405280600b81526020016a23b930b834102a37b5b2b760a91b8152506040518060400160405280600381526020016211d49560ea1b8152506120d4565b611e07826121a0565b611e118282611b46565b611e1a82611d34565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e856121c2565b6040805160208082019690965280820194909452606084019290925260808301523060a08301527f000000000000000000000000000000000000000000000000000000000000000060c0808401919091528151808403909101815260e0909201905280519101206098555050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611f545760405162461bcd60e51b815260040180806020018281038252602281526020018061249c6022913960400191505060405180910390fd5b8360ff16601b1480611f6957508360ff16601c145b611fa45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ec6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612000573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612068576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6000828211156120c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600154600160a81b900460ff16806120ef57506120ef611da5565b806121045750600154600160a01b900460ff16155b61213f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612176576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b61217e6121c6565b612188838361227e565b8015610c37576001805460ff60a81b19169055505050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b4690565b600154600160a81b900460ff16806121e157506121e1611da5565b806121f65750600154600160a01b900460ff16155b6122315760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612268576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610955576001805460ff60a81b1916905550565b600154600160a81b900460ff16806122995750612299611da5565b806122ae5750600154600160a01b900460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612320576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b825161233390603790602086019061236d565b50815161234790603890602085019061236d565b506039805460ff191660121790558015610c37576001805460ff60a81b19169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826123a357600085556123e9565b82601f106123bc57805160ff19168380011785556123e9565b828001600101855582156123e9579182015b828111156123e95782518255916020019190600101906123ce565b506123f59291506123f9565b5090565b5b808211156123f557600081556001016123fa56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ff9ed43c1b257716d58111b6358b62039b7d7359bc9f0f142332535a4370cafe64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638c2a993e1161011a578063a9059cbb116100ad578063ca52d7d71161007c578063ca52d7d71461067a578063d505accf146106a0578063dd62ed3e146106f1578063e3056a341461071f578063f2fde38b14610727576101fb565b8063a9059cbb146105fa578063aa271e1a14610626578063c2eeeebd1461064c578063c4d66de814610654576101fb565b806398650275116100e957806398650275146105205780639ce7abe514610528578063a2594d82146105a8578063a457c2d7146105ce576101fb565b80638c2a993e146104a057806390646b4a146104cc57806395d89b41146104f2578063983b2d56146104fa576101fb565b8063395093511161019257806374f4f5471161016157806374f4f5471461041a57806379ba50971461044657806379cc67901461044e5780637ecebe001461047a576101fb565b8063395093511461037f57806340c10f19146103ab57806342966c68146103d757806370a08231146103f4576101fb565b806318160ddd116101ce57806318160ddd146102e957806323b872dd146103035780633092afd514610339578063313ce56714610361576101fb565b806306fdde0314610200578063095ea7b31461027d5780630c340a24146102bd578063116191b6146102e1575b600080fd5b61020861074d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024257818101518382015260200161022a565b50505050905090810190601f16801561026f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a96004803603604081101561029357600080fd5b506001600160a01b0381351690602001356107e3565b604080519115158252519081900360200190f35b6102c5610800565b604080516001600160a01b039092168252519081900360200190f35b6102c561080f565b6102f161081e565b60408051918252519081900360200190f35b6102a96004803603606081101561031957600080fd5b506001600160a01b03813581169160208101359091169060400135610824565b61035f6004803603602081101561034f57600080fd5b50356001600160a01b03166108ab565b005b610369610958565b6040805160ff9092168252519081900360200190f35b6102a96004803603604081101561039557600080fd5b506001600160a01b038135169060200135610961565b61035f600480360360408110156103c157600080fd5b506001600160a01b0381351690602001356109af565b61035f600480360360208110156103ed57600080fd5b5035610a0e565b6102f16004803603602081101561040a57600080fd5b50356001600160a01b0316610a1f565b61035f6004803603604081101561043057600080fd5b506001600160a01b038135169060200135610a3a565b61035f610ad4565b61035f6004803603604081101561046457600080fd5b506001600160a01b038135169060200135610be2565b6102f16004803603602081101561049057600080fd5b50356001600160a01b0316610c3c565b61035f600480360360408110156104b657600080fd5b506001600160a01b038135169060200135610c4e565b61035f600480360360208110156104e257600080fd5b50356001600160a01b0316610ce8565b610208610de1565b61035f6004803603602081101561051057600080fd5b50356001600160a01b0316610e42565b61035f610eef565b61035f6004803603604081101561053e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561056957600080fd5b82018360208201111561057b57600080fd5b8035906020019184600183028401116401000000008311171561059d57600080fd5b509092509050610f43565b61035f600480360360208110156105be57600080fd5b50356001600160a01b0316611099565b6102a9600480360360408110156105e457600080fd5b506001600160a01b0381351690602001356111b4565b6102a96004803603604081101561061057600080fd5b506001600160a01b03813516906020013561121c565b6102a96004803603602081101561063c57600080fd5b50356001600160a01b0316611230565b6102c561124e565b61035f6004803603602081101561066a57600080fd5b50356001600160a01b031661125d565b61035f6004803603602081101561069057600080fd5b50356001600160a01b03166113d3565b61035f600480360360e08110156106b657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356114cf565b6102f16004803603604081101561070757600080fd5b506001600160a01b0381358116916020013516611680565b6102c56116ab565b61035f6004803603602081101561073d57600080fd5b50356001600160a01b03166116ba565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f76107f06117b8565b84846117bc565b50600192915050565b6000546001600160a01b031681565b60ca546001600160a01b031681565b60365490565b60006108318484846118a8565b6108a18461083d6117b8565b61089c8560405180606001604052806028815260200161250e602891396001600160a01b038a1660009081526035602052604081209061087b6117b8565b6001600160a01b031681526020810191909152604001600020549190611a05565b6117bc565b5060019392505050565b6000546001600160a01b03163314610903576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b61090c81611230565b61094c576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b61095581611a9c565b50565b60395460ff1690565b60006107f761096e6117b8565b8461089c856035600061097f6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611ae5565b6109b833611230565b610a00576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b610a0a8282611b46565b5050565b610955610a196117b8565b82611c38565b6001600160a01b031660009081526034602052604090205490565b60ca546001600160a01b03163314610a87576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610a918282610be2565b6040805182815290516001600160a01b038416917fe87aeeb22c5753db7f543198a4c3089d2233040ea9d1cab0eaa3b96d94d4fc6e919081900360200190a25050565b6001546001600160a01b03168015801590610af75750336001600160a01b038216145b610b48576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610c198260405180606001604052806024815260200161253660249139610c1286610c0d6117b8565b611680565b9190611a05565b9050610c2d83610c276117b8565b836117bc565b610c378383611c38565b505050565b609a6020526000908152604090205481565b60ca546001600160a01b03163314610c9b576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610ca58282611b46565b6040805182815290516001600160a01b038416917fae4b6e741e38054ad6705655cc56c91c184f6768f76b41e10803e2766d89e19f919081900360200190a25050565b6000546001600160a01b03163314610d40576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d8d576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4741544557415960881b604482015290519081900360640190fd5b60ca80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5317fa585931182194fed99f2ea5f2efd38af9cff9724273704c8501c521e34b9181900360200190a150565b60388054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b6000546001600160a01b03163314610e9a576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610ee6576040805162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa6a4a72a22a960911b604482015290519081900360640190fd5b61095581611d34565b610ef833611230565b610f38576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b610f4133611a9c565b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516001600160a01b03163314611007576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b0316331461115d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b505af11580156111ac573d6000803e3d6000fd5b505050505050565b60006107f76111c16117b8565b8461089c856040518060600160405280602581526020016125c460259139603560006111eb6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611a05565b60006107f76112296117b8565b84846118a8565b6001600160a01b031660009081526099602052604090205460ff1690565b60cb546001600160a01b031681565b611265611d80565b6001600160a01b0316336001600160a01b0316146112c0576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b600154600160a81b900460ff16806112db57506112db611da5565b806112f05750600154600160a01b900460ff16155b61132b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015611362576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001600160a01b0382166113b1576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6113bc826000611db6565b8015610a0a576001805460ff60a81b191690555050565b6000546001600160a01b0316331461142b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661147b576040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f4c315f4144445245535360701b604482015290519081900360640190fd5b60cb80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f603c0b2e4494ac82839a70be8b6c660d7d042ccfe71c3ce0e5157f59090e74459181900360200190a150565b8315806114dc5750834211155b611523576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b6098546001600160a01b038089166000818152609a602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948c166060850152608084018b905260a084019490945260c08084018a90528451808503909101815260e08401855280519082012061190160f01b61010085015261010284019590955261012280840195909552835180840390950185526101429092019092528251920191909120906115ed82868686611ef3565b9050806001600160a01b0316896001600160a01b03161461164b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b6001600160a01b0389166000908152609a60205260409020805460010190556116758989896117bc565b505050505050505050565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314611712576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116611764576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b0383166118015760405162461bcd60e51b81526004018080602001828103825260248152602001806125a06024913960400191505060405180910390fd5b6001600160a01b0382166118465760405162461bcd60e51b81526004018080602001828103825260228152602001806124546022913960400191505060405180910390fd5b6001600160a01b03808416600081815260356020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118ed5760405162461bcd60e51b815260040180806020018281038252602581526020018061257b6025913960400191505060405180910390fd5b6001600160a01b0382166119325760405162461bcd60e51b815260040180806020018281038252602381526020018061240f6023913960400191505060405180910390fd5b61193d838383610c37565b61197a81604051806060016040528060268152602001612476602691396001600160a01b0386166000908152603460205260409020549190611a05565b6001600160a01b0380851660009081526034602052604080822093909355908416815220546119a99082611ae5565b6001600160a01b0380841660008181526034602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a945760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a59578181015183820152602001611a41565b50505050905090810190601f168015611a865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260996020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b600082820183811015611b3f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611ba1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bad60008383610c37565b603654611bba9082611ae5565b6036556001600160a01b038216600090815260346020526040902054611be09082611ae5565b6001600160a01b03831660008181526034602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611c7d5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b611c8982600083610c37565b611cc681604051806060016040528060228152602001612432602291396001600160a01b0385166000908152603460205260409020549190611a05565b6001600160a01b038316600090815260346020526040902055603654611cec9082612071565b6036556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611db0306120ce565b15905090565b611dfe6040518060400160405280600b81526020016a23b930b834102a37b5b2b760a91b8152506040518060400160405280600381526020016211d49560ea1b8152506120d4565b611e07826121a0565b611e118282611b46565b611e1a82611d34565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e856121c2565b6040805160208082019690965280820194909452606084019290925260808301523060a08301527f000000000000000000000000000000000000000000000000000000000000000060c0808401919091528151808403909101815260e0909201905280519101206098555050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611f545760405162461bcd60e51b815260040180806020018281038252602281526020018061249c6022913960400191505060405180910390fd5b8360ff16601b1480611f6957508360ff16601c145b611fa45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ec6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612000573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612068576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6000828211156120c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600154600160a81b900460ff16806120ef57506120ef611da5565b806121045750600154600160a01b900460ff16155b61213f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612176576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b61217e6121c6565b612188838361227e565b8015610c37576001805460ff60a81b19169055505050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b4690565b600154600160a81b900460ff16806121e157506121e1611da5565b806121f65750600154600160a01b900460ff16155b6122315760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612268576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610955576001805460ff60a81b1916905550565b600154600160a81b900460ff16806122995750612299611da5565b806122ae5750600154600160a01b900460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612320576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b825161233390603790602086019061236d565b50815161234790603890602085019061236d565b506039805460ff191660121790558015610c37576001805460ff60a81b19169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826123a357600085556123e9565b82601f106123bc57805160ff19168380011785556123e9565b828001600101855582156123e9579182015b828111156123e95782518255916020019190600101906123ce565b506123f59291506123f9565b5090565b5b808211156123f557600081556001016123fa56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ff9ed43c1b257716d58111b6358b62039b7d7359bc9f0f142332535a4370cafe64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken_ProxyWithABI.json new file mode 100644 index 000000000..4550767a3 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphToken#L2GraphToken_ProxyWithABI.json @@ -0,0 +1,750 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2GraphToken", + "sourceName": "contracts/l2/token/L2GraphToken.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BridgeBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BridgeMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "gateway", + "type": "address" + } + ], + "name": "GatewaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1Address", + "type": "address" + } + ], + "name": "L1AddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "MinterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "NewPendingOwnership", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "bridgeBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "bridgeMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "gateway", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "governor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l1Address", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_gw", + "type": "address" + } + ], + "name": "setGateway", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "setL1Address", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGovernor", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101206040527fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac564726080527fefcec85968da792893fa503eb21730083fc6c50ed5461e56163b28335b2a5f9660a0527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60c0527fe33842a7acd1d5a1d28f25a931703e5605152dc48d64dc4716efdae1f565959160e0527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610100523480156100c657600080fd5b5060805160a05160c05160e0516101005161261e61010660003980611547525080611eae525080611e5e525080611e3d525080611e1c525061261e6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638c2a993e1161011a578063a9059cbb116100ad578063ca52d7d71161007c578063ca52d7d71461067a578063d505accf146106a0578063dd62ed3e146106f1578063e3056a341461071f578063f2fde38b14610727576101fb565b8063a9059cbb146105fa578063aa271e1a14610626578063c2eeeebd1461064c578063c4d66de814610654576101fb565b806398650275116100e957806398650275146105205780639ce7abe514610528578063a2594d82146105a8578063a457c2d7146105ce576101fb565b80638c2a993e146104a057806390646b4a146104cc57806395d89b41146104f2578063983b2d56146104fa576101fb565b8063395093511161019257806374f4f5471161016157806374f4f5471461041a57806379ba50971461044657806379cc67901461044e5780637ecebe001461047a576101fb565b8063395093511461037f57806340c10f19146103ab57806342966c68146103d757806370a08231146103f4576101fb565b806318160ddd116101ce57806318160ddd146102e957806323b872dd146103035780633092afd514610339578063313ce56714610361576101fb565b806306fdde0314610200578063095ea7b31461027d5780630c340a24146102bd578063116191b6146102e1575b600080fd5b61020861074d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024257818101518382015260200161022a565b50505050905090810190601f16801561026f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a96004803603604081101561029357600080fd5b506001600160a01b0381351690602001356107e3565b604080519115158252519081900360200190f35b6102c5610800565b604080516001600160a01b039092168252519081900360200190f35b6102c561080f565b6102f161081e565b60408051918252519081900360200190f35b6102a96004803603606081101561031957600080fd5b506001600160a01b03813581169160208101359091169060400135610824565b61035f6004803603602081101561034f57600080fd5b50356001600160a01b03166108ab565b005b610369610958565b6040805160ff9092168252519081900360200190f35b6102a96004803603604081101561039557600080fd5b506001600160a01b038135169060200135610961565b61035f600480360360408110156103c157600080fd5b506001600160a01b0381351690602001356109af565b61035f600480360360208110156103ed57600080fd5b5035610a0e565b6102f16004803603602081101561040a57600080fd5b50356001600160a01b0316610a1f565b61035f6004803603604081101561043057600080fd5b506001600160a01b038135169060200135610a3a565b61035f610ad4565b61035f6004803603604081101561046457600080fd5b506001600160a01b038135169060200135610be2565b6102f16004803603602081101561049057600080fd5b50356001600160a01b0316610c3c565b61035f600480360360408110156104b657600080fd5b506001600160a01b038135169060200135610c4e565b61035f600480360360208110156104e257600080fd5b50356001600160a01b0316610ce8565b610208610de1565b61035f6004803603602081101561051057600080fd5b50356001600160a01b0316610e42565b61035f610eef565b61035f6004803603604081101561053e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561056957600080fd5b82018360208201111561057b57600080fd5b8035906020019184600183028401116401000000008311171561059d57600080fd5b509092509050610f43565b61035f600480360360208110156105be57600080fd5b50356001600160a01b0316611099565b6102a9600480360360408110156105e457600080fd5b506001600160a01b0381351690602001356111b4565b6102a96004803603604081101561061057600080fd5b506001600160a01b03813516906020013561121c565b6102a96004803603602081101561063c57600080fd5b50356001600160a01b0316611230565b6102c561124e565b61035f6004803603602081101561066a57600080fd5b50356001600160a01b031661125d565b61035f6004803603602081101561069057600080fd5b50356001600160a01b03166113d3565b61035f600480360360e08110156106b657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356114cf565b6102f16004803603604081101561070757600080fd5b506001600160a01b0381358116916020013516611680565b6102c56116ab565b61035f6004803603602081101561073d57600080fd5b50356001600160a01b03166116ba565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f76107f06117b8565b84846117bc565b50600192915050565b6000546001600160a01b031681565b60ca546001600160a01b031681565b60365490565b60006108318484846118a8565b6108a18461083d6117b8565b61089c8560405180606001604052806028815260200161250e602891396001600160a01b038a1660009081526035602052604081209061087b6117b8565b6001600160a01b031681526020810191909152604001600020549190611a05565b6117bc565b5060019392505050565b6000546001600160a01b03163314610903576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b61090c81611230565b61094c576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b61095581611a9c565b50565b60395460ff1690565b60006107f761096e6117b8565b8461089c856035600061097f6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611ae5565b6109b833611230565b610a00576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b610a0a8282611b46565b5050565b610955610a196117b8565b82611c38565b6001600160a01b031660009081526034602052604090205490565b60ca546001600160a01b03163314610a87576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610a918282610be2565b6040805182815290516001600160a01b038416917fe87aeeb22c5753db7f543198a4c3089d2233040ea9d1cab0eaa3b96d94d4fc6e919081900360200190a25050565b6001546001600160a01b03168015801590610af75750336001600160a01b038216145b610b48576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610c198260405180606001604052806024815260200161253660249139610c1286610c0d6117b8565b611680565b9190611a05565b9050610c2d83610c276117b8565b836117bc565b610c378383611c38565b505050565b609a6020526000908152604090205481565b60ca546001600160a01b03163314610c9b576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610ca58282611b46565b6040805182815290516001600160a01b038416917fae4b6e741e38054ad6705655cc56c91c184f6768f76b41e10803e2766d89e19f919081900360200190a25050565b6000546001600160a01b03163314610d40576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d8d576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4741544557415960881b604482015290519081900360640190fd5b60ca80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5317fa585931182194fed99f2ea5f2efd38af9cff9724273704c8501c521e34b9181900360200190a150565b60388054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b6000546001600160a01b03163314610e9a576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610ee6576040805162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa6a4a72a22a960911b604482015290519081900360640190fd5b61095581611d34565b610ef833611230565b610f38576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b610f4133611a9c565b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516001600160a01b03163314611007576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b0316331461115d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b505af11580156111ac573d6000803e3d6000fd5b505050505050565b60006107f76111c16117b8565b8461089c856040518060600160405280602581526020016125c460259139603560006111eb6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611a05565b60006107f76112296117b8565b84846118a8565b6001600160a01b031660009081526099602052604090205460ff1690565b60cb546001600160a01b031681565b611265611d80565b6001600160a01b0316336001600160a01b0316146112c0576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b600154600160a81b900460ff16806112db57506112db611da5565b806112f05750600154600160a01b900460ff16155b61132b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015611362576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001600160a01b0382166113b1576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6113bc826000611db6565b8015610a0a576001805460ff60a81b191690555050565b6000546001600160a01b0316331461142b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661147b576040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f4c315f4144445245535360701b604482015290519081900360640190fd5b60cb80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f603c0b2e4494ac82839a70be8b6c660d7d042ccfe71c3ce0e5157f59090e74459181900360200190a150565b8315806114dc5750834211155b611523576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b6098546001600160a01b038089166000818152609a602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948c166060850152608084018b905260a084019490945260c08084018a90528451808503909101815260e08401855280519082012061190160f01b61010085015261010284019590955261012280840195909552835180840390950185526101429092019092528251920191909120906115ed82868686611ef3565b9050806001600160a01b0316896001600160a01b03161461164b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b6001600160a01b0389166000908152609a60205260409020805460010190556116758989896117bc565b505050505050505050565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314611712576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116611764576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b0383166118015760405162461bcd60e51b81526004018080602001828103825260248152602001806125a06024913960400191505060405180910390fd5b6001600160a01b0382166118465760405162461bcd60e51b81526004018080602001828103825260228152602001806124546022913960400191505060405180910390fd5b6001600160a01b03808416600081815260356020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118ed5760405162461bcd60e51b815260040180806020018281038252602581526020018061257b6025913960400191505060405180910390fd5b6001600160a01b0382166119325760405162461bcd60e51b815260040180806020018281038252602381526020018061240f6023913960400191505060405180910390fd5b61193d838383610c37565b61197a81604051806060016040528060268152602001612476602691396001600160a01b0386166000908152603460205260409020549190611a05565b6001600160a01b0380851660009081526034602052604080822093909355908416815220546119a99082611ae5565b6001600160a01b0380841660008181526034602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a945760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a59578181015183820152602001611a41565b50505050905090810190601f168015611a865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260996020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b600082820183811015611b3f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611ba1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bad60008383610c37565b603654611bba9082611ae5565b6036556001600160a01b038216600090815260346020526040902054611be09082611ae5565b6001600160a01b03831660008181526034602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611c7d5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b611c8982600083610c37565b611cc681604051806060016040528060228152602001612432602291396001600160a01b0385166000908152603460205260409020549190611a05565b6001600160a01b038316600090815260346020526040902055603654611cec9082612071565b6036556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611db0306120ce565b15905090565b611dfe6040518060400160405280600b81526020016a23b930b834102a37b5b2b760a91b8152506040518060400160405280600381526020016211d49560ea1b8152506120d4565b611e07826121a0565b611e118282611b46565b611e1a82611d34565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e856121c2565b6040805160208082019690965280820194909452606084019290925260808301523060a08301527f000000000000000000000000000000000000000000000000000000000000000060c0808401919091528151808403909101815260e0909201905280519101206098555050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611f545760405162461bcd60e51b815260040180806020018281038252602281526020018061249c6022913960400191505060405180910390fd5b8360ff16601b1480611f6957508360ff16601c145b611fa45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ec6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612000573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612068576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6000828211156120c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600154600160a81b900460ff16806120ef57506120ef611da5565b806121045750600154600160a01b900460ff16155b61213f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612176576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b61217e6121c6565b612188838361227e565b8015610c37576001805460ff60a81b19169055505050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b4690565b600154600160a81b900460ff16806121e157506121e1611da5565b806121f65750600154600160a01b900460ff16155b6122315760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612268576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610955576001805460ff60a81b1916905550565b600154600160a81b900460ff16806122995750612299611da5565b806122ae5750600154600160a01b900460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612320576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b825161233390603790602086019061236d565b50815161234790603890602085019061236d565b506039805460ff191660121790558015610c37576001805460ff60a81b19169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826123a357600085556123e9565b82601f106123bc57805160ff19168380011785556123e9565b828001600101855582156123e9579182015b828111156123e95782518255916020019190600101906123ce565b506123f59291506123f9565b5090565b5b808211156123f557600081556001016123fa56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ff9ed43c1b257716d58111b6358b62039b7d7359bc9f0f142332535a4370cafe64736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638c2a993e1161011a578063a9059cbb116100ad578063ca52d7d71161007c578063ca52d7d71461067a578063d505accf146106a0578063dd62ed3e146106f1578063e3056a341461071f578063f2fde38b14610727576101fb565b8063a9059cbb146105fa578063aa271e1a14610626578063c2eeeebd1461064c578063c4d66de814610654576101fb565b806398650275116100e957806398650275146105205780639ce7abe514610528578063a2594d82146105a8578063a457c2d7146105ce576101fb565b80638c2a993e146104a057806390646b4a146104cc57806395d89b41146104f2578063983b2d56146104fa576101fb565b8063395093511161019257806374f4f5471161016157806374f4f5471461041a57806379ba50971461044657806379cc67901461044e5780637ecebe001461047a576101fb565b8063395093511461037f57806340c10f19146103ab57806342966c68146103d757806370a08231146103f4576101fb565b806318160ddd116101ce57806318160ddd146102e957806323b872dd146103035780633092afd514610339578063313ce56714610361576101fb565b806306fdde0314610200578063095ea7b31461027d5780630c340a24146102bd578063116191b6146102e1575b600080fd5b61020861074d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024257818101518382015260200161022a565b50505050905090810190601f16801561026f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a96004803603604081101561029357600080fd5b506001600160a01b0381351690602001356107e3565b604080519115158252519081900360200190f35b6102c5610800565b604080516001600160a01b039092168252519081900360200190f35b6102c561080f565b6102f161081e565b60408051918252519081900360200190f35b6102a96004803603606081101561031957600080fd5b506001600160a01b03813581169160208101359091169060400135610824565b61035f6004803603602081101561034f57600080fd5b50356001600160a01b03166108ab565b005b610369610958565b6040805160ff9092168252519081900360200190f35b6102a96004803603604081101561039557600080fd5b506001600160a01b038135169060200135610961565b61035f600480360360408110156103c157600080fd5b506001600160a01b0381351690602001356109af565b61035f600480360360208110156103ed57600080fd5b5035610a0e565b6102f16004803603602081101561040a57600080fd5b50356001600160a01b0316610a1f565b61035f6004803603604081101561043057600080fd5b506001600160a01b038135169060200135610a3a565b61035f610ad4565b61035f6004803603604081101561046457600080fd5b506001600160a01b038135169060200135610be2565b6102f16004803603602081101561049057600080fd5b50356001600160a01b0316610c3c565b61035f600480360360408110156104b657600080fd5b506001600160a01b038135169060200135610c4e565b61035f600480360360208110156104e257600080fd5b50356001600160a01b0316610ce8565b610208610de1565b61035f6004803603602081101561051057600080fd5b50356001600160a01b0316610e42565b61035f610eef565b61035f6004803603604081101561053e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561056957600080fd5b82018360208201111561057b57600080fd5b8035906020019184600183028401116401000000008311171561059d57600080fd5b509092509050610f43565b61035f600480360360208110156105be57600080fd5b50356001600160a01b0316611099565b6102a9600480360360408110156105e457600080fd5b506001600160a01b0381351690602001356111b4565b6102a96004803603604081101561061057600080fd5b506001600160a01b03813516906020013561121c565b6102a96004803603602081101561063c57600080fd5b50356001600160a01b0316611230565b6102c561124e565b61035f6004803603602081101561066a57600080fd5b50356001600160a01b031661125d565b61035f6004803603602081101561069057600080fd5b50356001600160a01b03166113d3565b61035f600480360360e08110156106b657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356114cf565b6102f16004803603604081101561070757600080fd5b506001600160a01b0381358116916020013516611680565b6102c56116ab565b61035f6004803603602081101561073d57600080fd5b50356001600160a01b03166116ba565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f76107f06117b8565b84846117bc565b50600192915050565b6000546001600160a01b031681565b60ca546001600160a01b031681565b60365490565b60006108318484846118a8565b6108a18461083d6117b8565b61089c8560405180606001604052806028815260200161250e602891396001600160a01b038a1660009081526035602052604081209061087b6117b8565b6001600160a01b031681526020810191909152604001600020549190611a05565b6117bc565b5060019392505050565b6000546001600160a01b03163314610903576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b61090c81611230565b61094c576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b61095581611a9c565b50565b60395460ff1690565b60006107f761096e6117b8565b8461089c856035600061097f6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611ae5565b6109b833611230565b610a00576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b610a0a8282611b46565b5050565b610955610a196117b8565b82611c38565b6001600160a01b031660009081526034602052604090205490565b60ca546001600160a01b03163314610a87576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610a918282610be2565b6040805182815290516001600160a01b038416917fe87aeeb22c5753db7f543198a4c3089d2233040ea9d1cab0eaa3b96d94d4fc6e919081900360200190a25050565b6001546001600160a01b03168015801590610af75750336001600160a01b038216145b610b48576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610c198260405180606001604052806024815260200161253660249139610c1286610c0d6117b8565b611680565b9190611a05565b9050610c2d83610c276117b8565b836117bc565b610c378383611c38565b505050565b609a6020526000908152604090205481565b60ca546001600160a01b03163314610c9b576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610ca58282611b46565b6040805182815290516001600160a01b038416917fae4b6e741e38054ad6705655cc56c91c184f6768f76b41e10803e2766d89e19f919081900360200190a25050565b6000546001600160a01b03163314610d40576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d8d576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4741544557415960881b604482015290519081900360640190fd5b60ca80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5317fa585931182194fed99f2ea5f2efd38af9cff9724273704c8501c521e34b9181900360200190a150565b60388054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b6000546001600160a01b03163314610e9a576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610ee6576040805162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa6a4a72a22a960911b604482015290519081900360640190fd5b61095581611d34565b610ef833611230565b610f38576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b610f4133611a9c565b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516001600160a01b03163314611007576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b0316331461115d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b505af11580156111ac573d6000803e3d6000fd5b505050505050565b60006107f76111c16117b8565b8461089c856040518060600160405280602581526020016125c460259139603560006111eb6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611a05565b60006107f76112296117b8565b84846118a8565b6001600160a01b031660009081526099602052604090205460ff1690565b60cb546001600160a01b031681565b611265611d80565b6001600160a01b0316336001600160a01b0316146112c0576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b600154600160a81b900460ff16806112db57506112db611da5565b806112f05750600154600160a01b900460ff16155b61132b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015611362576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001600160a01b0382166113b1576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6113bc826000611db6565b8015610a0a576001805460ff60a81b191690555050565b6000546001600160a01b0316331461142b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661147b576040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f4c315f4144445245535360701b604482015290519081900360640190fd5b60cb80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f603c0b2e4494ac82839a70be8b6c660d7d042ccfe71c3ce0e5157f59090e74459181900360200190a150565b8315806114dc5750834211155b611523576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b6098546001600160a01b038089166000818152609a602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948c166060850152608084018b905260a084019490945260c08084018a90528451808503909101815260e08401855280519082012061190160f01b61010085015261010284019590955261012280840195909552835180840390950185526101429092019092528251920191909120906115ed82868686611ef3565b9050806001600160a01b0316896001600160a01b03161461164b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b6001600160a01b0389166000908152609a60205260409020805460010190556116758989896117bc565b505050505050505050565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314611712576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116611764576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b0383166118015760405162461bcd60e51b81526004018080602001828103825260248152602001806125a06024913960400191505060405180910390fd5b6001600160a01b0382166118465760405162461bcd60e51b81526004018080602001828103825260228152602001806124546022913960400191505060405180910390fd5b6001600160a01b03808416600081815260356020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118ed5760405162461bcd60e51b815260040180806020018281038252602581526020018061257b6025913960400191505060405180910390fd5b6001600160a01b0382166119325760405162461bcd60e51b815260040180806020018281038252602381526020018061240f6023913960400191505060405180910390fd5b61193d838383610c37565b61197a81604051806060016040528060268152602001612476602691396001600160a01b0386166000908152603460205260409020549190611a05565b6001600160a01b0380851660009081526034602052604080822093909355908416815220546119a99082611ae5565b6001600160a01b0380841660008181526034602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a945760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a59578181015183820152602001611a41565b50505050905090810190601f168015611a865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260996020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b600082820183811015611b3f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611ba1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bad60008383610c37565b603654611bba9082611ae5565b6036556001600160a01b038216600090815260346020526040902054611be09082611ae5565b6001600160a01b03831660008181526034602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611c7d5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b611c8982600083610c37565b611cc681604051806060016040528060228152602001612432602291396001600160a01b0385166000908152603460205260409020549190611a05565b6001600160a01b038316600090815260346020526040902055603654611cec9082612071565b6036556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611db0306120ce565b15905090565b611dfe6040518060400160405280600b81526020016a23b930b834102a37b5b2b760a91b8152506040518060400160405280600381526020016211d49560ea1b8152506120d4565b611e07826121a0565b611e118282611b46565b611e1a82611d34565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e856121c2565b6040805160208082019690965280820194909452606084019290925260808301523060a08301527f000000000000000000000000000000000000000000000000000000000000000060c0808401919091528151808403909101815260e0909201905280519101206098555050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611f545760405162461bcd60e51b815260040180806020018281038252602281526020018061249c6022913960400191505060405180910390fd5b8360ff16601b1480611f6957508360ff16601c145b611fa45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ec6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612000573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612068576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6000828211156120c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600154600160a81b900460ff16806120ef57506120ef611da5565b806121045750600154600160a01b900460ff16155b61213f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612176576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b61217e6121c6565b612188838361227e565b8015610c37576001805460ff60a81b19169055505050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b4690565b600154600160a81b900460ff16806121e157506121e1611da5565b806121f65750600154600160a01b900460ff16155b6122315760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612268576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610955576001805460ff60a81b1916905550565b600154600160a81b900460ff16806122995750612299611da5565b806122ae5750600154600160a01b900460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612320576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b825161233390603790602086019061236d565b50815161234790603890602085019061236d565b506039805460ff191660121790558015610c37576001805460ff60a81b19169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826123a357600085556123e9565b82601f106123bc57805160ff19168380011785556123e9565b828001600101855582156123e9579182015b828111156123e95782518255916020019190600101906123ce565b506123f59291506123f9565b5090565b5b808211156123f557600081556001016123fa56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ff9ed43c1b257716d58111b6358b62039b7d7359bc9f0f142332535a4370cafe64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#GraphProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#GraphProxy.json new file mode 100644 index 000000000..97963021c --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#GraphProxy.json @@ -0,0 +1,177 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxy", + "sourceName": "contracts/upgrades/GraphProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_impl", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldAdmin", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPendingImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newPendingImplementation", + "type": "address" + } + ], + "name": "PendingImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "acceptUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptUpgradeAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway.json new file mode 100644 index 000000000..c1ca3083b --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway.json @@ -0,0 +1,647 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2GraphTokenGateway", + "sourceName": "contracts/l2/gateway/L2GraphTokenGateway.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "l1Token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1Counterpart", + "type": "address" + } + ], + "name": "L1CounterpartAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1GRT", + "type": "address" + } + ], + "name": "L1TokenAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l2Router", + "type": "address" + } + ], + "name": "L2RouterSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPauseGuardian", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "NewPauseGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "isPaused", + "type": "bool" + } + ], + "name": "PartialPauseChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "isPaused", + "type": "bool" + } + ], + "name": "PauseChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "TxToL1", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1Token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "l2ToL1Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "exitNum", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawalInitiated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "l1ERC20", + "type": "address" + } + ], + "name": "calculateL2TokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Token", + "type": "address" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "finalizeInboundTransfer", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "getOutboundCalldata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "l1Counterpart", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l1GRT", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l2Router", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPartialPauseTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPauseTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Token", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "outboundTransfer", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Token", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "outboundTransfer", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "pauseGuardian", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Counterpart", + "type": "address" + } + ], + "name": "setL1CounterpartAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1GRT", + "type": "address" + } + ], + "name": "setL1TokenAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l2Router", + "type": "address" + } + ], + "name": "setL2Router", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauseGuardian", + "type": "address" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_newPaused", + "type": "bool" + } + ], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e05161010051610120516101405161222b6101696000398061112f5250806111065250806110dd528061150a5250806110b452508061108b525080611062525080611039525061222b6000f3fe6080604052600436106101405760003560e01c806392eefe9b116100b6578063c4d66de81161006f578063c4d66de814610355578063d2ce7d6514610375578063d685c0b214610388578063d6866ea5146103a8578063f14a4bd5146103bd578063f77c4791146103d257610140565b806392eefe9b146102a05780639ce7abe5146102c0578063a0c76a96146102e0578063a2594d8214610300578063a7e28d4814610320578063c4c0087c1461034057610140565b806348bde20c1161010857806348bde20c146101e75780634adc698a146102075780635c975abb1461021c57806369bc8cd41461023e5780637b3a3c8b1461025e57806391b4ded91461028b57610140565b80630252fec114610145578063147ddef51461016757806316c38b3c1461019257806324a3d622146101b25780632e567b36146101d4575b600080fd5b34801561015157600080fd5b50610165610160366004611b43565b6103e7565b005b34801561017357600080fd5b5061017c610474565b60405161018991906121a9565b60405180910390f35b34801561019e57600080fd5b506101656101ad366004611da9565b61047a565b3480156101be57600080fd5b506101c7610572565b6040516101899190611e67565b6101656101e2366004611bb4565b610581565b3480156101f357600080fd5b50610165610202366004611b43565b6107b9565b34801561021357600080fd5b506101c7610825565b34801561022857600080fd5b50610231610834565b6040516101899190611f43565b34801561024a57600080fd5b50610165610259366004611b43565b610842565b34801561026a57600080fd5b5061027e610279366004611cb4565b6108bb565b6040516101899190611f4e565b34801561029757600080fd5b5061017c6108d7565b3480156102ac57600080fd5b506101656102bb366004611b43565b6108dd565b3480156102cc57600080fd5b506101656102db366004611dc9565b6108ee565b3480156102ec57600080fd5b5061027e6102fb366004611c37565b610a44565b34801561030c57600080fd5b5061016561031b366004611b43565b610ac4565b34801561032c57600080fd5b506101c761033b366004611b43565b610bdf565b34801561034c57600080fd5b506101c7610c0f565b34801561036157600080fd5b50610165610370366004611b43565b610c1e565b61027e610383366004611d25565b610d44565b34801561039457600080fd5b506101656103a3366004611b43565b610fbb565b3480156103b457600080fd5b50610165611034565b3480156103c957600080fd5b506101c7611155565b3480156103de57600080fd5b506101c7611164565b6103ef611173565b6001600160a01b03811661041e5760405162461bcd60e51b815260040161041590612034565b60405180910390fd5b607780546001600160a01b0319166001600160a01b0383161790556040517f43a303848c82a28f94def3043839eaebd654c19fdada874a74fb94d8bf7d343890610469908390611e67565b60405180910390a150565b60015481565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d60208110156104e657600080fd5b50516001600160a01b031633148061050857506003546001600160a01b031633145b610559576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920476f7665726e6f72206f7220477561726469616e00000000000000604482015290519081900360640190fd5b806105665761056661123d565b61056f816112b5565b50565b6003546001600160a01b031681565b600260435414156105d9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026043556105e6611340565b6076546105fb906001600160a01b0316611391565b6001600160a01b0316336001600160a01b03161461062b5760405162461bcd60e51b815260040161041590612172565b6075546001600160a01b038781169116146106585760405162461bcd60e51b81526004016104159061214b565b34156106765760405162461bcd60e51b815260040161041590611fdd565b60755461068b906001600160a01b0316610bdf565b6001600160a01b0316638c2a993e85856040518363ffffffff1660e01b81526004016106b8929190611ee2565b600060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505082159150610757905057604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610724908890879087908790600401611efb565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050505b836001600160a01b0316856001600160a01b0316876001600160a01b03167fc7f2e9c55c40a50fbc217dfc70cd39a222940dfa62145aa0ca49eb9535d4fcb2866040516107a491906121a9565b60405180910390a45050600160435550505050565b6107c1611173565b6001600160a01b03811661081c576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61056f816113aa565b6077546001600160a01b031681565b600054610100900460ff1690565b61084a611173565b6001600160a01b0381166108705760405162461bcd60e51b81526004016104159061200c565b607580546001600160a01b0319166001600160a01b0383161790556040517f0b7cf729ac6c387cab57a28d257c6ecac863c24b086353121057083c7bfc79f990610469908390611e67565b60606108cd8686866000808888610d44565b9695505050505050565b60025481565b6108e56113fc565b61056f8161145b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561092a57600080fd5b505af115801561093e573d6000803e3d6000fd5b505050506040513d602081101561095457600080fd5b50516001600160a01b031633146109b2576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b5050505050505050565b6060632e567b3660e01b86868686600087604051602001610a66929190611f61565b60408051601f1981840301815290829052610a879594939291602401611e7b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905095945050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b50516001600160a01b03163314610b88576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bc357600080fd5b505af1158015610bd7573d6000803e3d6000fd5b505050505050565b6075546000906001600160a01b03838116911614610bff57506000610c0a565b610c07611503565b90505b919050565b6076546001600160a01b031681565b610c26611533565b6001600160a01b0316336001600160a01b031614610c81576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b604254610100900460ff1680610c9a5750610c9a611558565b80610ca8575060425460ff16155b610ce35760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015610d0e576042805460ff1961ff0019909116610100171660011790555b610d17826108e5565b6000805461ff001916610100179055610d2e611569565b8015610d40576042805461ff00191690555b5050565b606060026043541415610d9e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002604355610dab611340565b6075546001600160a01b03898116911614610dd85760405162461bcd60e51b81526004016104159061214b565b85610df55760405162461bcd60e51b815260040161041590611fb0565b3415610e135760405162461bcd60e51b815260040161041590611fdd565b6001600160a01b038716610e395760405162461bcd60e51b81526004016104159061205f565b610e41611a76565b610e4b8484611612565b602083018190526001600160a01b0390911682525115610e7d5760405162461bcd60e51b8152600401610415906120bc565b607554610e92906001600160a01b0316610bdf565b81516040516374f4f54760e01b81526001600160a01b0392909216916374f4f54791610ec2918b90600401611ee2565b600060405180830381600087803b158015610edc57600080fd5b505af1158015610ef0573d6000803e3d6000fd5b505050506000610f3060008360000151607660009054906101000a90046001600160a01b0316610f2b8e87600001518f8f8a60200151610a44565b61168f565b905080896001600160a01b031683600001516001600160a01b03167f3073a74ecb728d10be779fe19a74a1428e20468f5b4d167bf9c73d9067847d738d60008d604051610f7f93929190611ec1565b60405180910390a480604051602001610f9891906121a9565b604051602081830303815290604052925050506001604355979650505050505050565b610fc3611173565b6001600160a01b038116610fe95760405162461bcd60e51b81526004016104159061208c565b607680546001600160a01b0319166001600160a01b0383161790556040517f60d5265d09ed32300af9a69188333d24b405b6f4196f623f3e2b78321181a61590610469908390611e67565b61105d7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110867f000000000000000000000000000000000000000000000000000000000000000061182f565b6110af7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110d87f000000000000000000000000000000000000000000000000000000000000000061182f565b6111017f000000000000000000000000000000000000000000000000000000000000000061182f565b61112a7f000000000000000000000000000000000000000000000000000000000000000061182f565b6111537f000000000000000000000000000000000000000000000000000000000000000061182f565b565b6075546001600160a01b031681565b6004546001600160a01b031681565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d60208110156111df57600080fd5b50516001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b6077546001600160a01b03166112655760405162461bcd60e51b815260040161041590611f85565b6076546001600160a01b031661128d5760405162461bcd60e51b8152600401610415906120f3565b6075546001600160a01b03166111535760405162461bcd60e51b815260040161041590612123565b600060019054906101000a900460ff16151581151514156112d55761056f565b6000805461ff0019166101008315158102919091179182905560ff910416156112fd57426002555b6000546040805161010090920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600054610100900460ff1615611153576040805162461bcd60e51b81526020600482015260116024820152705061757365642028636f6e74726163742960781b604482015290519081900360640190fd5b7311110000000000000000000000000000000011110190565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b6004546001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b0381166114af576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600061152e7f0000000000000000000000000000000000000000000000000000000000000000611930565b905090565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611563306119ca565b15905090565b604254610100900460ff16806115825750611582611558565b80611590575060425460ff16155b6115cb5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff161580156115f6576042805460ff1961ff0019909116610100171660011790555b6115fe6119d0565b801561056f576042805461ff001916905550565b607754600090606090829082906001600160a01b03163314156116455761163b85870187611b66565b9092509050611682565b33915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b90925090505b9250929050565b60008060646001600160a01b031663928c169a8786866040518463ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117005781810151838201526020016116e8565b50505050905090810190601f16801561172d5780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050506040513d602081101561177757600080fd5b5051604080516020808252865182820152865193945084936001600160a01b03808a1694908b16937f2b986d32a0536b7e19baa48ab949fec7b903b7fad7730820b20632d100cc3a68938a93919283929083019185019080838360005b838110156117ec5781810151838201526020016117d4565b50505050905090810190601f1680156118195780820380516001836020036101000a031916815260200191505b509250505060405180910390a495945050505050565b6004805460408051637bb20d2f60e11b8152928301849052516000926001600160a01b039092169163f7641a5e916024808301926020929190829003018186803b15801561187c57600080fd5b505afa158015611890573d6000803e3d6000fd5b505050506040513d60208110156118a657600080fd5b50516000838152600560205260409020549091506001600160a01b03808316911614610d405760008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000818152600560205260408120546001600160a01b031680610c07576004805460408051637bb20d2f60e11b8152928301869052516001600160a01b039091169163f7641a5e916024808301926020929190829003018186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60208110156119c157600080fd5b50519392505050565b3b151590565b604254610100900460ff16806119e957506119e9611558565b806119f7575060425460ff16155b611a325760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015611a5d576042805460ff1961ff0019909116610100171660011790555b6001604355801561056f576042805461ff001916905550565b60408051808201909152600081526060602082015290565b60008083601f840112611a9f578182fd5b50813567ffffffffffffffff811115611ab6578182fd5b60208301915083602082850101111561168857600080fd5b600082601f830112611ade578081fd5b813567ffffffffffffffff80821115611af357fe5b604051601f8301601f191681016020018281118282101715611b1157fe5b604052828152848301602001861015611b28578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215611b54578081fd5b8135611b5f816121b2565b9392505050565b60008060408385031215611b78578081fd5b8235611b83816121b2565b9150602083013567ffffffffffffffff811115611b9e578182fd5b611baa85828601611ace565b9150509250929050565b60008060008060008060a08789031215611bcc578182fd5b8635611bd7816121b2565b95506020870135611be7816121b2565b94506040870135611bf7816121b2565b935060608701359250608087013567ffffffffffffffff811115611c19578283fd5b611c2589828a01611a8e565b979a9699509497509295939492505050565b600080600080600060a08688031215611c4e578081fd5b8535611c59816121b2565b94506020860135611c69816121b2565b93506040860135611c79816121b2565b925060608601359150608086013567ffffffffffffffff811115611c9b578182fd5b611ca788828901611ace565b9150509295509295909350565b600080600080600060808688031215611ccb578081fd5b8535611cd6816121b2565b94506020860135611ce6816121b2565b935060408601359250606086013567ffffffffffffffff811115611d08578182fd5b611d1488828901611a8e565b969995985093965092949392505050565b600080600080600080600060c0888a031215611d3f578081fd5b8735611d4a816121b2565b96506020880135611d5a816121b2565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115611d8a578182fd5b611d968a828b01611a8e565b989b979a50959850939692959293505050565b600060208284031215611dba578081fd5b81358015158114611b5f578182fd5b600080600060408486031215611ddd578283fd5b8335611de8816121b2565b9250602084013567ffffffffffffffff811115611e03578283fd5b611e0f86828701611a8e565b9497909650939450505050565b60008151808452815b81811015611e4157602081850181015186830182015201611e25565b81811115611e525782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611eb690830184611e1c565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b901515815260200190565b600060208252611b5f6020830184611e1c565b600060ff8416825260406020830152611f7d6040830184611e1c565b949350505050565b602080825260119082015270130c97d493d555115497d393d517d4d155607a1b604082015260600190565b6020808252601390820152721253959053125117d6915493d7d05353d55395606a1b604082015260600190565b602080825260159082015274494e56414c49445f4e4f4e5a45524f5f56414c554560581b604082015260600190565b6020808252600e908201526d1253959053125117d30c57d1d49560921b604082015260600190565b60208082526011908201527024a72b20a624a22fa6192fa927aaaa22a960791b604082015260600190565b60208082526013908201527224a72b20a624a22fa222a9aa24a720aa24a7a760691b604082015260600190565b6020808252601690820152751253959053125117d30c57d0d3d5539511549410549560521b604082015260600190565b6020808252601a908201527f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000604082015260600190565b602080825260169082015275130c57d0d3d5539511549410549517d393d517d4d15560521b604082015260600190565b6020808252600e908201526d130c57d1d49517d393d517d4d15560921b604082015260600190565b6020808252600d908201526c1513d2d15397d393d517d1d495609a1b604082015260600190565b60208082526018908201527f4f4e4c595f434f554e544552504152545f474154455741590000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461056f57600080fdfe496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564a264697066735822122065fad7a9fc021b14dda68574a33568d80fcb7311e53fb115c48b61e211858c8364736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106101405760003560e01c806392eefe9b116100b6578063c4d66de81161006f578063c4d66de814610355578063d2ce7d6514610375578063d685c0b214610388578063d6866ea5146103a8578063f14a4bd5146103bd578063f77c4791146103d257610140565b806392eefe9b146102a05780639ce7abe5146102c0578063a0c76a96146102e0578063a2594d8214610300578063a7e28d4814610320578063c4c0087c1461034057610140565b806348bde20c1161010857806348bde20c146101e75780634adc698a146102075780635c975abb1461021c57806369bc8cd41461023e5780637b3a3c8b1461025e57806391b4ded91461028b57610140565b80630252fec114610145578063147ddef51461016757806316c38b3c1461019257806324a3d622146101b25780632e567b36146101d4575b600080fd5b34801561015157600080fd5b50610165610160366004611b43565b6103e7565b005b34801561017357600080fd5b5061017c610474565b60405161018991906121a9565b60405180910390f35b34801561019e57600080fd5b506101656101ad366004611da9565b61047a565b3480156101be57600080fd5b506101c7610572565b6040516101899190611e67565b6101656101e2366004611bb4565b610581565b3480156101f357600080fd5b50610165610202366004611b43565b6107b9565b34801561021357600080fd5b506101c7610825565b34801561022857600080fd5b50610231610834565b6040516101899190611f43565b34801561024a57600080fd5b50610165610259366004611b43565b610842565b34801561026a57600080fd5b5061027e610279366004611cb4565b6108bb565b6040516101899190611f4e565b34801561029757600080fd5b5061017c6108d7565b3480156102ac57600080fd5b506101656102bb366004611b43565b6108dd565b3480156102cc57600080fd5b506101656102db366004611dc9565b6108ee565b3480156102ec57600080fd5b5061027e6102fb366004611c37565b610a44565b34801561030c57600080fd5b5061016561031b366004611b43565b610ac4565b34801561032c57600080fd5b506101c761033b366004611b43565b610bdf565b34801561034c57600080fd5b506101c7610c0f565b34801561036157600080fd5b50610165610370366004611b43565b610c1e565b61027e610383366004611d25565b610d44565b34801561039457600080fd5b506101656103a3366004611b43565b610fbb565b3480156103b457600080fd5b50610165611034565b3480156103c957600080fd5b506101c7611155565b3480156103de57600080fd5b506101c7611164565b6103ef611173565b6001600160a01b03811661041e5760405162461bcd60e51b815260040161041590612034565b60405180910390fd5b607780546001600160a01b0319166001600160a01b0383161790556040517f43a303848c82a28f94def3043839eaebd654c19fdada874a74fb94d8bf7d343890610469908390611e67565b60405180910390a150565b60015481565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d60208110156104e657600080fd5b50516001600160a01b031633148061050857506003546001600160a01b031633145b610559576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920476f7665726e6f72206f7220477561726469616e00000000000000604482015290519081900360640190fd5b806105665761056661123d565b61056f816112b5565b50565b6003546001600160a01b031681565b600260435414156105d9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026043556105e6611340565b6076546105fb906001600160a01b0316611391565b6001600160a01b0316336001600160a01b03161461062b5760405162461bcd60e51b815260040161041590612172565b6075546001600160a01b038781169116146106585760405162461bcd60e51b81526004016104159061214b565b34156106765760405162461bcd60e51b815260040161041590611fdd565b60755461068b906001600160a01b0316610bdf565b6001600160a01b0316638c2a993e85856040518363ffffffff1660e01b81526004016106b8929190611ee2565b600060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505082159150610757905057604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610724908890879087908790600401611efb565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050505b836001600160a01b0316856001600160a01b0316876001600160a01b03167fc7f2e9c55c40a50fbc217dfc70cd39a222940dfa62145aa0ca49eb9535d4fcb2866040516107a491906121a9565b60405180910390a45050600160435550505050565b6107c1611173565b6001600160a01b03811661081c576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61056f816113aa565b6077546001600160a01b031681565b600054610100900460ff1690565b61084a611173565b6001600160a01b0381166108705760405162461bcd60e51b81526004016104159061200c565b607580546001600160a01b0319166001600160a01b0383161790556040517f0b7cf729ac6c387cab57a28d257c6ecac863c24b086353121057083c7bfc79f990610469908390611e67565b60606108cd8686866000808888610d44565b9695505050505050565b60025481565b6108e56113fc565b61056f8161145b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561092a57600080fd5b505af115801561093e573d6000803e3d6000fd5b505050506040513d602081101561095457600080fd5b50516001600160a01b031633146109b2576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b5050505050505050565b6060632e567b3660e01b86868686600087604051602001610a66929190611f61565b60408051601f1981840301815290829052610a879594939291602401611e7b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905095945050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b50516001600160a01b03163314610b88576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bc357600080fd5b505af1158015610bd7573d6000803e3d6000fd5b505050505050565b6075546000906001600160a01b03838116911614610bff57506000610c0a565b610c07611503565b90505b919050565b6076546001600160a01b031681565b610c26611533565b6001600160a01b0316336001600160a01b031614610c81576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b604254610100900460ff1680610c9a5750610c9a611558565b80610ca8575060425460ff16155b610ce35760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015610d0e576042805460ff1961ff0019909116610100171660011790555b610d17826108e5565b6000805461ff001916610100179055610d2e611569565b8015610d40576042805461ff00191690555b5050565b606060026043541415610d9e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002604355610dab611340565b6075546001600160a01b03898116911614610dd85760405162461bcd60e51b81526004016104159061214b565b85610df55760405162461bcd60e51b815260040161041590611fb0565b3415610e135760405162461bcd60e51b815260040161041590611fdd565b6001600160a01b038716610e395760405162461bcd60e51b81526004016104159061205f565b610e41611a76565b610e4b8484611612565b602083018190526001600160a01b0390911682525115610e7d5760405162461bcd60e51b8152600401610415906120bc565b607554610e92906001600160a01b0316610bdf565b81516040516374f4f54760e01b81526001600160a01b0392909216916374f4f54791610ec2918b90600401611ee2565b600060405180830381600087803b158015610edc57600080fd5b505af1158015610ef0573d6000803e3d6000fd5b505050506000610f3060008360000151607660009054906101000a90046001600160a01b0316610f2b8e87600001518f8f8a60200151610a44565b61168f565b905080896001600160a01b031683600001516001600160a01b03167f3073a74ecb728d10be779fe19a74a1428e20468f5b4d167bf9c73d9067847d738d60008d604051610f7f93929190611ec1565b60405180910390a480604051602001610f9891906121a9565b604051602081830303815290604052925050506001604355979650505050505050565b610fc3611173565b6001600160a01b038116610fe95760405162461bcd60e51b81526004016104159061208c565b607680546001600160a01b0319166001600160a01b0383161790556040517f60d5265d09ed32300af9a69188333d24b405b6f4196f623f3e2b78321181a61590610469908390611e67565b61105d7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110867f000000000000000000000000000000000000000000000000000000000000000061182f565b6110af7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110d87f000000000000000000000000000000000000000000000000000000000000000061182f565b6111017f000000000000000000000000000000000000000000000000000000000000000061182f565b61112a7f000000000000000000000000000000000000000000000000000000000000000061182f565b6111537f000000000000000000000000000000000000000000000000000000000000000061182f565b565b6075546001600160a01b031681565b6004546001600160a01b031681565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d60208110156111df57600080fd5b50516001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b6077546001600160a01b03166112655760405162461bcd60e51b815260040161041590611f85565b6076546001600160a01b031661128d5760405162461bcd60e51b8152600401610415906120f3565b6075546001600160a01b03166111535760405162461bcd60e51b815260040161041590612123565b600060019054906101000a900460ff16151581151514156112d55761056f565b6000805461ff0019166101008315158102919091179182905560ff910416156112fd57426002555b6000546040805161010090920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600054610100900460ff1615611153576040805162461bcd60e51b81526020600482015260116024820152705061757365642028636f6e74726163742960781b604482015290519081900360640190fd5b7311110000000000000000000000000000000011110190565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b6004546001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b0381166114af576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600061152e7f0000000000000000000000000000000000000000000000000000000000000000611930565b905090565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611563306119ca565b15905090565b604254610100900460ff16806115825750611582611558565b80611590575060425460ff16155b6115cb5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff161580156115f6576042805460ff1961ff0019909116610100171660011790555b6115fe6119d0565b801561056f576042805461ff001916905550565b607754600090606090829082906001600160a01b03163314156116455761163b85870187611b66565b9092509050611682565b33915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b90925090505b9250929050565b60008060646001600160a01b031663928c169a8786866040518463ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117005781810151838201526020016116e8565b50505050905090810190601f16801561172d5780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050506040513d602081101561177757600080fd5b5051604080516020808252865182820152865193945084936001600160a01b03808a1694908b16937f2b986d32a0536b7e19baa48ab949fec7b903b7fad7730820b20632d100cc3a68938a93919283929083019185019080838360005b838110156117ec5781810151838201526020016117d4565b50505050905090810190601f1680156118195780820380516001836020036101000a031916815260200191505b509250505060405180910390a495945050505050565b6004805460408051637bb20d2f60e11b8152928301849052516000926001600160a01b039092169163f7641a5e916024808301926020929190829003018186803b15801561187c57600080fd5b505afa158015611890573d6000803e3d6000fd5b505050506040513d60208110156118a657600080fd5b50516000838152600560205260409020549091506001600160a01b03808316911614610d405760008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000818152600560205260408120546001600160a01b031680610c07576004805460408051637bb20d2f60e11b8152928301869052516001600160a01b039091169163f7641a5e916024808301926020929190829003018186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60208110156119c157600080fd5b50519392505050565b3b151590565b604254610100900460ff16806119e957506119e9611558565b806119f7575060425460ff16155b611a325760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015611a5d576042805460ff1961ff0019909116610100171660011790555b6001604355801561056f576042805461ff001916905550565b60408051808201909152600081526060602082015290565b60008083601f840112611a9f578182fd5b50813567ffffffffffffffff811115611ab6578182fd5b60208301915083602082850101111561168857600080fd5b600082601f830112611ade578081fd5b813567ffffffffffffffff80821115611af357fe5b604051601f8301601f191681016020018281118282101715611b1157fe5b604052828152848301602001861015611b28578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215611b54578081fd5b8135611b5f816121b2565b9392505050565b60008060408385031215611b78578081fd5b8235611b83816121b2565b9150602083013567ffffffffffffffff811115611b9e578182fd5b611baa85828601611ace565b9150509250929050565b60008060008060008060a08789031215611bcc578182fd5b8635611bd7816121b2565b95506020870135611be7816121b2565b94506040870135611bf7816121b2565b935060608701359250608087013567ffffffffffffffff811115611c19578283fd5b611c2589828a01611a8e565b979a9699509497509295939492505050565b600080600080600060a08688031215611c4e578081fd5b8535611c59816121b2565b94506020860135611c69816121b2565b93506040860135611c79816121b2565b925060608601359150608086013567ffffffffffffffff811115611c9b578182fd5b611ca788828901611ace565b9150509295509295909350565b600080600080600060808688031215611ccb578081fd5b8535611cd6816121b2565b94506020860135611ce6816121b2565b935060408601359250606086013567ffffffffffffffff811115611d08578182fd5b611d1488828901611a8e565b969995985093965092949392505050565b600080600080600080600060c0888a031215611d3f578081fd5b8735611d4a816121b2565b96506020880135611d5a816121b2565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115611d8a578182fd5b611d968a828b01611a8e565b989b979a50959850939692959293505050565b600060208284031215611dba578081fd5b81358015158114611b5f578182fd5b600080600060408486031215611ddd578283fd5b8335611de8816121b2565b9250602084013567ffffffffffffffff811115611e03578283fd5b611e0f86828701611a8e565b9497909650939450505050565b60008151808452815b81811015611e4157602081850181015186830182015201611e25565b81811115611e525782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611eb690830184611e1c565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b901515815260200190565b600060208252611b5f6020830184611e1c565b600060ff8416825260406020830152611f7d6040830184611e1c565b949350505050565b602080825260119082015270130c97d493d555115497d393d517d4d155607a1b604082015260600190565b6020808252601390820152721253959053125117d6915493d7d05353d55395606a1b604082015260600190565b602080825260159082015274494e56414c49445f4e4f4e5a45524f5f56414c554560581b604082015260600190565b6020808252600e908201526d1253959053125117d30c57d1d49560921b604082015260600190565b60208082526011908201527024a72b20a624a22fa6192fa927aaaa22a960791b604082015260600190565b60208082526013908201527224a72b20a624a22fa222a9aa24a720aa24a7a760691b604082015260600190565b6020808252601690820152751253959053125117d30c57d0d3d5539511549410549560521b604082015260600190565b6020808252601a908201527f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000604082015260600190565b602080825260169082015275130c57d0d3d5539511549410549517d393d517d4d15560521b604082015260600190565b6020808252600e908201526d130c57d1d49517d393d517d4d15560921b604082015260600190565b6020808252600d908201526c1513d2d15397d393d517d1d495609a1b604082015260600190565b60208082526018908201527f4f4e4c595f434f554e544552504152545f474154455741590000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461056f57600080fdfe496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564a264697066735822122065fad7a9fc021b14dda68574a33568d80fcb7311e53fb115c48b61e211858c8364736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.json new file mode 100644 index 000000000..c1ca3083b --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.json @@ -0,0 +1,647 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2GraphTokenGateway", + "sourceName": "contracts/l2/gateway/L2GraphTokenGateway.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "l1Token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1Counterpart", + "type": "address" + } + ], + "name": "L1CounterpartAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1GRT", + "type": "address" + } + ], + "name": "L1TokenAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l2Router", + "type": "address" + } + ], + "name": "L2RouterSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPauseGuardian", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "NewPauseGuardian", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "isPaused", + "type": "bool" + } + ], + "name": "PartialPauseChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "isPaused", + "type": "bool" + } + ], + "name": "PauseChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "TxToL1", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "l1Token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "l2ToL1Id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "exitNum", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawalInitiated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "l1ERC20", + "type": "address" + } + ], + "name": "calculateL2TokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Token", + "type": "address" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "finalizeInboundTransfer", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "getOutboundCalldata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "l1Counterpart", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l1GRT", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l2Router", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPartialPauseTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPauseTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Token", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "outboundTransfer", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Token", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "outboundTransfer", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "pauseGuardian", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Counterpart", + "type": "address" + } + ], + "name": "setL1CounterpartAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1GRT", + "type": "address" + } + ], + "name": "setL1TokenAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l2Router", + "type": "address" + } + ], + "name": "setL2Router", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauseGuardian", + "type": "address" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_newPaused", + "type": "bool" + } + ], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e05161010051610120516101405161222b6101696000398061112f5250806111065250806110dd528061150a5250806110b452508061108b525080611062525080611039525061222b6000f3fe6080604052600436106101405760003560e01c806392eefe9b116100b6578063c4d66de81161006f578063c4d66de814610355578063d2ce7d6514610375578063d685c0b214610388578063d6866ea5146103a8578063f14a4bd5146103bd578063f77c4791146103d257610140565b806392eefe9b146102a05780639ce7abe5146102c0578063a0c76a96146102e0578063a2594d8214610300578063a7e28d4814610320578063c4c0087c1461034057610140565b806348bde20c1161010857806348bde20c146101e75780634adc698a146102075780635c975abb1461021c57806369bc8cd41461023e5780637b3a3c8b1461025e57806391b4ded91461028b57610140565b80630252fec114610145578063147ddef51461016757806316c38b3c1461019257806324a3d622146101b25780632e567b36146101d4575b600080fd5b34801561015157600080fd5b50610165610160366004611b43565b6103e7565b005b34801561017357600080fd5b5061017c610474565b60405161018991906121a9565b60405180910390f35b34801561019e57600080fd5b506101656101ad366004611da9565b61047a565b3480156101be57600080fd5b506101c7610572565b6040516101899190611e67565b6101656101e2366004611bb4565b610581565b3480156101f357600080fd5b50610165610202366004611b43565b6107b9565b34801561021357600080fd5b506101c7610825565b34801561022857600080fd5b50610231610834565b6040516101899190611f43565b34801561024a57600080fd5b50610165610259366004611b43565b610842565b34801561026a57600080fd5b5061027e610279366004611cb4565b6108bb565b6040516101899190611f4e565b34801561029757600080fd5b5061017c6108d7565b3480156102ac57600080fd5b506101656102bb366004611b43565b6108dd565b3480156102cc57600080fd5b506101656102db366004611dc9565b6108ee565b3480156102ec57600080fd5b5061027e6102fb366004611c37565b610a44565b34801561030c57600080fd5b5061016561031b366004611b43565b610ac4565b34801561032c57600080fd5b506101c761033b366004611b43565b610bdf565b34801561034c57600080fd5b506101c7610c0f565b34801561036157600080fd5b50610165610370366004611b43565b610c1e565b61027e610383366004611d25565b610d44565b34801561039457600080fd5b506101656103a3366004611b43565b610fbb565b3480156103b457600080fd5b50610165611034565b3480156103c957600080fd5b506101c7611155565b3480156103de57600080fd5b506101c7611164565b6103ef611173565b6001600160a01b03811661041e5760405162461bcd60e51b815260040161041590612034565b60405180910390fd5b607780546001600160a01b0319166001600160a01b0383161790556040517f43a303848c82a28f94def3043839eaebd654c19fdada874a74fb94d8bf7d343890610469908390611e67565b60405180910390a150565b60015481565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d60208110156104e657600080fd5b50516001600160a01b031633148061050857506003546001600160a01b031633145b610559576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920476f7665726e6f72206f7220477561726469616e00000000000000604482015290519081900360640190fd5b806105665761056661123d565b61056f816112b5565b50565b6003546001600160a01b031681565b600260435414156105d9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026043556105e6611340565b6076546105fb906001600160a01b0316611391565b6001600160a01b0316336001600160a01b03161461062b5760405162461bcd60e51b815260040161041590612172565b6075546001600160a01b038781169116146106585760405162461bcd60e51b81526004016104159061214b565b34156106765760405162461bcd60e51b815260040161041590611fdd565b60755461068b906001600160a01b0316610bdf565b6001600160a01b0316638c2a993e85856040518363ffffffff1660e01b81526004016106b8929190611ee2565b600060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505082159150610757905057604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610724908890879087908790600401611efb565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050505b836001600160a01b0316856001600160a01b0316876001600160a01b03167fc7f2e9c55c40a50fbc217dfc70cd39a222940dfa62145aa0ca49eb9535d4fcb2866040516107a491906121a9565b60405180910390a45050600160435550505050565b6107c1611173565b6001600160a01b03811661081c576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61056f816113aa565b6077546001600160a01b031681565b600054610100900460ff1690565b61084a611173565b6001600160a01b0381166108705760405162461bcd60e51b81526004016104159061200c565b607580546001600160a01b0319166001600160a01b0383161790556040517f0b7cf729ac6c387cab57a28d257c6ecac863c24b086353121057083c7bfc79f990610469908390611e67565b60606108cd8686866000808888610d44565b9695505050505050565b60025481565b6108e56113fc565b61056f8161145b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561092a57600080fd5b505af115801561093e573d6000803e3d6000fd5b505050506040513d602081101561095457600080fd5b50516001600160a01b031633146109b2576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b5050505050505050565b6060632e567b3660e01b86868686600087604051602001610a66929190611f61565b60408051601f1981840301815290829052610a879594939291602401611e7b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905095945050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b50516001600160a01b03163314610b88576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bc357600080fd5b505af1158015610bd7573d6000803e3d6000fd5b505050505050565b6075546000906001600160a01b03838116911614610bff57506000610c0a565b610c07611503565b90505b919050565b6076546001600160a01b031681565b610c26611533565b6001600160a01b0316336001600160a01b031614610c81576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b604254610100900460ff1680610c9a5750610c9a611558565b80610ca8575060425460ff16155b610ce35760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015610d0e576042805460ff1961ff0019909116610100171660011790555b610d17826108e5565b6000805461ff001916610100179055610d2e611569565b8015610d40576042805461ff00191690555b5050565b606060026043541415610d9e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002604355610dab611340565b6075546001600160a01b03898116911614610dd85760405162461bcd60e51b81526004016104159061214b565b85610df55760405162461bcd60e51b815260040161041590611fb0565b3415610e135760405162461bcd60e51b815260040161041590611fdd565b6001600160a01b038716610e395760405162461bcd60e51b81526004016104159061205f565b610e41611a76565b610e4b8484611612565b602083018190526001600160a01b0390911682525115610e7d5760405162461bcd60e51b8152600401610415906120bc565b607554610e92906001600160a01b0316610bdf565b81516040516374f4f54760e01b81526001600160a01b0392909216916374f4f54791610ec2918b90600401611ee2565b600060405180830381600087803b158015610edc57600080fd5b505af1158015610ef0573d6000803e3d6000fd5b505050506000610f3060008360000151607660009054906101000a90046001600160a01b0316610f2b8e87600001518f8f8a60200151610a44565b61168f565b905080896001600160a01b031683600001516001600160a01b03167f3073a74ecb728d10be779fe19a74a1428e20468f5b4d167bf9c73d9067847d738d60008d604051610f7f93929190611ec1565b60405180910390a480604051602001610f9891906121a9565b604051602081830303815290604052925050506001604355979650505050505050565b610fc3611173565b6001600160a01b038116610fe95760405162461bcd60e51b81526004016104159061208c565b607680546001600160a01b0319166001600160a01b0383161790556040517f60d5265d09ed32300af9a69188333d24b405b6f4196f623f3e2b78321181a61590610469908390611e67565b61105d7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110867f000000000000000000000000000000000000000000000000000000000000000061182f565b6110af7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110d87f000000000000000000000000000000000000000000000000000000000000000061182f565b6111017f000000000000000000000000000000000000000000000000000000000000000061182f565b61112a7f000000000000000000000000000000000000000000000000000000000000000061182f565b6111537f000000000000000000000000000000000000000000000000000000000000000061182f565b565b6075546001600160a01b031681565b6004546001600160a01b031681565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d60208110156111df57600080fd5b50516001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b6077546001600160a01b03166112655760405162461bcd60e51b815260040161041590611f85565b6076546001600160a01b031661128d5760405162461bcd60e51b8152600401610415906120f3565b6075546001600160a01b03166111535760405162461bcd60e51b815260040161041590612123565b600060019054906101000a900460ff16151581151514156112d55761056f565b6000805461ff0019166101008315158102919091179182905560ff910416156112fd57426002555b6000546040805161010090920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600054610100900460ff1615611153576040805162461bcd60e51b81526020600482015260116024820152705061757365642028636f6e74726163742960781b604482015290519081900360640190fd5b7311110000000000000000000000000000000011110190565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b6004546001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b0381166114af576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600061152e7f0000000000000000000000000000000000000000000000000000000000000000611930565b905090565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611563306119ca565b15905090565b604254610100900460ff16806115825750611582611558565b80611590575060425460ff16155b6115cb5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff161580156115f6576042805460ff1961ff0019909116610100171660011790555b6115fe6119d0565b801561056f576042805461ff001916905550565b607754600090606090829082906001600160a01b03163314156116455761163b85870187611b66565b9092509050611682565b33915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b90925090505b9250929050565b60008060646001600160a01b031663928c169a8786866040518463ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117005781810151838201526020016116e8565b50505050905090810190601f16801561172d5780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050506040513d602081101561177757600080fd5b5051604080516020808252865182820152865193945084936001600160a01b03808a1694908b16937f2b986d32a0536b7e19baa48ab949fec7b903b7fad7730820b20632d100cc3a68938a93919283929083019185019080838360005b838110156117ec5781810151838201526020016117d4565b50505050905090810190601f1680156118195780820380516001836020036101000a031916815260200191505b509250505060405180910390a495945050505050565b6004805460408051637bb20d2f60e11b8152928301849052516000926001600160a01b039092169163f7641a5e916024808301926020929190829003018186803b15801561187c57600080fd5b505afa158015611890573d6000803e3d6000fd5b505050506040513d60208110156118a657600080fd5b50516000838152600560205260409020549091506001600160a01b03808316911614610d405760008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000818152600560205260408120546001600160a01b031680610c07576004805460408051637bb20d2f60e11b8152928301869052516001600160a01b039091169163f7641a5e916024808301926020929190829003018186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60208110156119c157600080fd5b50519392505050565b3b151590565b604254610100900460ff16806119e957506119e9611558565b806119f7575060425460ff16155b611a325760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015611a5d576042805460ff1961ff0019909116610100171660011790555b6001604355801561056f576042805461ff001916905550565b60408051808201909152600081526060602082015290565b60008083601f840112611a9f578182fd5b50813567ffffffffffffffff811115611ab6578182fd5b60208301915083602082850101111561168857600080fd5b600082601f830112611ade578081fd5b813567ffffffffffffffff80821115611af357fe5b604051601f8301601f191681016020018281118282101715611b1157fe5b604052828152848301602001861015611b28578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215611b54578081fd5b8135611b5f816121b2565b9392505050565b60008060408385031215611b78578081fd5b8235611b83816121b2565b9150602083013567ffffffffffffffff811115611b9e578182fd5b611baa85828601611ace565b9150509250929050565b60008060008060008060a08789031215611bcc578182fd5b8635611bd7816121b2565b95506020870135611be7816121b2565b94506040870135611bf7816121b2565b935060608701359250608087013567ffffffffffffffff811115611c19578283fd5b611c2589828a01611a8e565b979a9699509497509295939492505050565b600080600080600060a08688031215611c4e578081fd5b8535611c59816121b2565b94506020860135611c69816121b2565b93506040860135611c79816121b2565b925060608601359150608086013567ffffffffffffffff811115611c9b578182fd5b611ca788828901611ace565b9150509295509295909350565b600080600080600060808688031215611ccb578081fd5b8535611cd6816121b2565b94506020860135611ce6816121b2565b935060408601359250606086013567ffffffffffffffff811115611d08578182fd5b611d1488828901611a8e565b969995985093965092949392505050565b600080600080600080600060c0888a031215611d3f578081fd5b8735611d4a816121b2565b96506020880135611d5a816121b2565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115611d8a578182fd5b611d968a828b01611a8e565b989b979a50959850939692959293505050565b600060208284031215611dba578081fd5b81358015158114611b5f578182fd5b600080600060408486031215611ddd578283fd5b8335611de8816121b2565b9250602084013567ffffffffffffffff811115611e03578283fd5b611e0f86828701611a8e565b9497909650939450505050565b60008151808452815b81811015611e4157602081850181015186830182015201611e25565b81811115611e525782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611eb690830184611e1c565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b901515815260200190565b600060208252611b5f6020830184611e1c565b600060ff8416825260406020830152611f7d6040830184611e1c565b949350505050565b602080825260119082015270130c97d493d555115497d393d517d4d155607a1b604082015260600190565b6020808252601390820152721253959053125117d6915493d7d05353d55395606a1b604082015260600190565b602080825260159082015274494e56414c49445f4e4f4e5a45524f5f56414c554560581b604082015260600190565b6020808252600e908201526d1253959053125117d30c57d1d49560921b604082015260600190565b60208082526011908201527024a72b20a624a22fa6192fa927aaaa22a960791b604082015260600190565b60208082526013908201527224a72b20a624a22fa222a9aa24a720aa24a7a760691b604082015260600190565b6020808252601690820152751253959053125117d30c57d0d3d5539511549410549560521b604082015260600190565b6020808252601a908201527f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000604082015260600190565b602080825260169082015275130c57d0d3d5539511549410549517d393d517d4d15560521b604082015260600190565b6020808252600e908201526d130c57d1d49517d393d517d4d15560921b604082015260600190565b6020808252600d908201526c1513d2d15397d393d517d1d495609a1b604082015260600190565b60208082526018908201527f4f4e4c595f434f554e544552504152545f474154455741590000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461056f57600080fdfe496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564a264697066735822122065fad7a9fc021b14dda68574a33568d80fcb7311e53fb115c48b61e211858c8364736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106101405760003560e01c806392eefe9b116100b6578063c4d66de81161006f578063c4d66de814610355578063d2ce7d6514610375578063d685c0b214610388578063d6866ea5146103a8578063f14a4bd5146103bd578063f77c4791146103d257610140565b806392eefe9b146102a05780639ce7abe5146102c0578063a0c76a96146102e0578063a2594d8214610300578063a7e28d4814610320578063c4c0087c1461034057610140565b806348bde20c1161010857806348bde20c146101e75780634adc698a146102075780635c975abb1461021c57806369bc8cd41461023e5780637b3a3c8b1461025e57806391b4ded91461028b57610140565b80630252fec114610145578063147ddef51461016757806316c38b3c1461019257806324a3d622146101b25780632e567b36146101d4575b600080fd5b34801561015157600080fd5b50610165610160366004611b43565b6103e7565b005b34801561017357600080fd5b5061017c610474565b60405161018991906121a9565b60405180910390f35b34801561019e57600080fd5b506101656101ad366004611da9565b61047a565b3480156101be57600080fd5b506101c7610572565b6040516101899190611e67565b6101656101e2366004611bb4565b610581565b3480156101f357600080fd5b50610165610202366004611b43565b6107b9565b34801561021357600080fd5b506101c7610825565b34801561022857600080fd5b50610231610834565b6040516101899190611f43565b34801561024a57600080fd5b50610165610259366004611b43565b610842565b34801561026a57600080fd5b5061027e610279366004611cb4565b6108bb565b6040516101899190611f4e565b34801561029757600080fd5b5061017c6108d7565b3480156102ac57600080fd5b506101656102bb366004611b43565b6108dd565b3480156102cc57600080fd5b506101656102db366004611dc9565b6108ee565b3480156102ec57600080fd5b5061027e6102fb366004611c37565b610a44565b34801561030c57600080fd5b5061016561031b366004611b43565b610ac4565b34801561032c57600080fd5b506101c761033b366004611b43565b610bdf565b34801561034c57600080fd5b506101c7610c0f565b34801561036157600080fd5b50610165610370366004611b43565b610c1e565b61027e610383366004611d25565b610d44565b34801561039457600080fd5b506101656103a3366004611b43565b610fbb565b3480156103b457600080fd5b50610165611034565b3480156103c957600080fd5b506101c7611155565b3480156103de57600080fd5b506101c7611164565b6103ef611173565b6001600160a01b03811661041e5760405162461bcd60e51b815260040161041590612034565b60405180910390fd5b607780546001600160a01b0319166001600160a01b0383161790556040517f43a303848c82a28f94def3043839eaebd654c19fdada874a74fb94d8bf7d343890610469908390611e67565b60405180910390a150565b60015481565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d60208110156104e657600080fd5b50516001600160a01b031633148061050857506003546001600160a01b031633145b610559576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920476f7665726e6f72206f7220477561726469616e00000000000000604482015290519081900360640190fd5b806105665761056661123d565b61056f816112b5565b50565b6003546001600160a01b031681565b600260435414156105d9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026043556105e6611340565b6076546105fb906001600160a01b0316611391565b6001600160a01b0316336001600160a01b03161461062b5760405162461bcd60e51b815260040161041590612172565b6075546001600160a01b038781169116146106585760405162461bcd60e51b81526004016104159061214b565b34156106765760405162461bcd60e51b815260040161041590611fdd565b60755461068b906001600160a01b0316610bdf565b6001600160a01b0316638c2a993e85856040518363ffffffff1660e01b81526004016106b8929190611ee2565b600060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505082159150610757905057604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610724908890879087908790600401611efb565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050505b836001600160a01b0316856001600160a01b0316876001600160a01b03167fc7f2e9c55c40a50fbc217dfc70cd39a222940dfa62145aa0ca49eb9535d4fcb2866040516107a491906121a9565b60405180910390a45050600160435550505050565b6107c1611173565b6001600160a01b03811661081c576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61056f816113aa565b6077546001600160a01b031681565b600054610100900460ff1690565b61084a611173565b6001600160a01b0381166108705760405162461bcd60e51b81526004016104159061200c565b607580546001600160a01b0319166001600160a01b0383161790556040517f0b7cf729ac6c387cab57a28d257c6ecac863c24b086353121057083c7bfc79f990610469908390611e67565b60606108cd8686866000808888610d44565b9695505050505050565b60025481565b6108e56113fc565b61056f8161145b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561092a57600080fd5b505af115801561093e573d6000803e3d6000fd5b505050506040513d602081101561095457600080fd5b50516001600160a01b031633146109b2576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b5050505050505050565b6060632e567b3660e01b86868686600087604051602001610a66929190611f61565b60408051601f1981840301815290829052610a879594939291602401611e7b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905095945050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b50516001600160a01b03163314610b88576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bc357600080fd5b505af1158015610bd7573d6000803e3d6000fd5b505050505050565b6075546000906001600160a01b03838116911614610bff57506000610c0a565b610c07611503565b90505b919050565b6076546001600160a01b031681565b610c26611533565b6001600160a01b0316336001600160a01b031614610c81576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b604254610100900460ff1680610c9a5750610c9a611558565b80610ca8575060425460ff16155b610ce35760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015610d0e576042805460ff1961ff0019909116610100171660011790555b610d17826108e5565b6000805461ff001916610100179055610d2e611569565b8015610d40576042805461ff00191690555b5050565b606060026043541415610d9e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002604355610dab611340565b6075546001600160a01b03898116911614610dd85760405162461bcd60e51b81526004016104159061214b565b85610df55760405162461bcd60e51b815260040161041590611fb0565b3415610e135760405162461bcd60e51b815260040161041590611fdd565b6001600160a01b038716610e395760405162461bcd60e51b81526004016104159061205f565b610e41611a76565b610e4b8484611612565b602083018190526001600160a01b0390911682525115610e7d5760405162461bcd60e51b8152600401610415906120bc565b607554610e92906001600160a01b0316610bdf565b81516040516374f4f54760e01b81526001600160a01b0392909216916374f4f54791610ec2918b90600401611ee2565b600060405180830381600087803b158015610edc57600080fd5b505af1158015610ef0573d6000803e3d6000fd5b505050506000610f3060008360000151607660009054906101000a90046001600160a01b0316610f2b8e87600001518f8f8a60200151610a44565b61168f565b905080896001600160a01b031683600001516001600160a01b03167f3073a74ecb728d10be779fe19a74a1428e20468f5b4d167bf9c73d9067847d738d60008d604051610f7f93929190611ec1565b60405180910390a480604051602001610f9891906121a9565b604051602081830303815290604052925050506001604355979650505050505050565b610fc3611173565b6001600160a01b038116610fe95760405162461bcd60e51b81526004016104159061208c565b607680546001600160a01b0319166001600160a01b0383161790556040517f60d5265d09ed32300af9a69188333d24b405b6f4196f623f3e2b78321181a61590610469908390611e67565b61105d7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110867f000000000000000000000000000000000000000000000000000000000000000061182f565b6110af7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110d87f000000000000000000000000000000000000000000000000000000000000000061182f565b6111017f000000000000000000000000000000000000000000000000000000000000000061182f565b61112a7f000000000000000000000000000000000000000000000000000000000000000061182f565b6111537f000000000000000000000000000000000000000000000000000000000000000061182f565b565b6075546001600160a01b031681565b6004546001600160a01b031681565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d60208110156111df57600080fd5b50516001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b6077546001600160a01b03166112655760405162461bcd60e51b815260040161041590611f85565b6076546001600160a01b031661128d5760405162461bcd60e51b8152600401610415906120f3565b6075546001600160a01b03166111535760405162461bcd60e51b815260040161041590612123565b600060019054906101000a900460ff16151581151514156112d55761056f565b6000805461ff0019166101008315158102919091179182905560ff910416156112fd57426002555b6000546040805161010090920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600054610100900460ff1615611153576040805162461bcd60e51b81526020600482015260116024820152705061757365642028636f6e74726163742960781b604482015290519081900360640190fd5b7311110000000000000000000000000000000011110190565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b6004546001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b0381166114af576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600061152e7f0000000000000000000000000000000000000000000000000000000000000000611930565b905090565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611563306119ca565b15905090565b604254610100900460ff16806115825750611582611558565b80611590575060425460ff16155b6115cb5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff161580156115f6576042805460ff1961ff0019909116610100171660011790555b6115fe6119d0565b801561056f576042805461ff001916905550565b607754600090606090829082906001600160a01b03163314156116455761163b85870187611b66565b9092509050611682565b33915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b90925090505b9250929050565b60008060646001600160a01b031663928c169a8786866040518463ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117005781810151838201526020016116e8565b50505050905090810190601f16801561172d5780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050506040513d602081101561177757600080fd5b5051604080516020808252865182820152865193945084936001600160a01b03808a1694908b16937f2b986d32a0536b7e19baa48ab949fec7b903b7fad7730820b20632d100cc3a68938a93919283929083019185019080838360005b838110156117ec5781810151838201526020016117d4565b50505050905090810190601f1680156118195780820380516001836020036101000a031916815260200191505b509250505060405180910390a495945050505050565b6004805460408051637bb20d2f60e11b8152928301849052516000926001600160a01b039092169163f7641a5e916024808301926020929190829003018186803b15801561187c57600080fd5b505afa158015611890573d6000803e3d6000fd5b505050506040513d60208110156118a657600080fd5b50516000838152600560205260409020549091506001600160a01b03808316911614610d405760008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000818152600560205260408120546001600160a01b031680610c07576004805460408051637bb20d2f60e11b8152928301869052516001600160a01b039091169163f7641a5e916024808301926020929190829003018186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60208110156119c157600080fd5b50519392505050565b3b151590565b604254610100900460ff16806119e957506119e9611558565b806119f7575060425460ff16155b611a325760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015611a5d576042805460ff1961ff0019909116610100171660011790555b6001604355801561056f576042805461ff001916905550565b60408051808201909152600081526060602082015290565b60008083601f840112611a9f578182fd5b50813567ffffffffffffffff811115611ab6578182fd5b60208301915083602082850101111561168857600080fd5b600082601f830112611ade578081fd5b813567ffffffffffffffff80821115611af357fe5b604051601f8301601f191681016020018281118282101715611b1157fe5b604052828152848301602001861015611b28578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215611b54578081fd5b8135611b5f816121b2565b9392505050565b60008060408385031215611b78578081fd5b8235611b83816121b2565b9150602083013567ffffffffffffffff811115611b9e578182fd5b611baa85828601611ace565b9150509250929050565b60008060008060008060a08789031215611bcc578182fd5b8635611bd7816121b2565b95506020870135611be7816121b2565b94506040870135611bf7816121b2565b935060608701359250608087013567ffffffffffffffff811115611c19578283fd5b611c2589828a01611a8e565b979a9699509497509295939492505050565b600080600080600060a08688031215611c4e578081fd5b8535611c59816121b2565b94506020860135611c69816121b2565b93506040860135611c79816121b2565b925060608601359150608086013567ffffffffffffffff811115611c9b578182fd5b611ca788828901611ace565b9150509295509295909350565b600080600080600060808688031215611ccb578081fd5b8535611cd6816121b2565b94506020860135611ce6816121b2565b935060408601359250606086013567ffffffffffffffff811115611d08578182fd5b611d1488828901611a8e565b969995985093965092949392505050565b600080600080600080600060c0888a031215611d3f578081fd5b8735611d4a816121b2565b96506020880135611d5a816121b2565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115611d8a578182fd5b611d968a828b01611a8e565b989b979a50959850939692959293505050565b600060208284031215611dba578081fd5b81358015158114611b5f578182fd5b600080600060408486031215611ddd578283fd5b8335611de8816121b2565b9250602084013567ffffffffffffffff811115611e03578283fd5b611e0f86828701611a8e565b9497909650939450505050565b60008151808452815b81811015611e4157602081850181015186830182015201611e25565b81811115611e525782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611eb690830184611e1c565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b901515815260200190565b600060208252611b5f6020830184611e1c565b600060ff8416825260406020830152611f7d6040830184611e1c565b949350505050565b602080825260119082015270130c97d493d555115497d393d517d4d155607a1b604082015260600190565b6020808252601390820152721253959053125117d6915493d7d05353d55395606a1b604082015260600190565b602080825260159082015274494e56414c49445f4e4f4e5a45524f5f56414c554560581b604082015260600190565b6020808252600e908201526d1253959053125117d30c57d1d49560921b604082015260600190565b60208082526011908201527024a72b20a624a22fa6192fa927aaaa22a960791b604082015260600190565b60208082526013908201527224a72b20a624a22fa222a9aa24a720aa24a7a760691b604082015260600190565b6020808252601690820152751253959053125117d30c57d0d3d5539511549410549560521b604082015260600190565b6020808252601a908201527f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000604082015260600190565b602080825260169082015275130c57d0d3d5539511549410549517d393d517d4d15560521b604082015260600190565b6020808252600e908201526d130c57d1d49517d393d517d4d15560921b604082015260600190565b6020808252600d908201526c1513d2d15397d393d517d1d495609a1b604082015260600190565b60208082526018908201527f4f4e4c595f434f554e544552504152545f474154455741590000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461056f57600080fdfe496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564a264697066735822122065fad7a9fc021b14dda68574a33568d80fcb7311e53fb115c48b61e211858c8364736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow.json new file mode 100644 index 000000000..e4e9beada --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow.json @@ -0,0 +1,680 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PaymentsEscrow", + "sourceName": "contracts/payments/PaymentsEscrow.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "withdrawEscrowThawingPeriod", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInconsistentCollection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBalance", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowNotThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "PaymentsEscrowStillThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "thawingPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxWaitPeriod", + "type": "uint256" + } + ], + "name": "PaymentsEscrowThawingPeriodTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "CancelThaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "EscrowCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "Thaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_WAIT_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WITHDRAW_ESCROW_THAWING_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "cancelThaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "escrowAccounts", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "getBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b50604051611bb6380380611bb6833981016040819052610030916104ef565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610373565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610373565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610373565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610373565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610373565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610373565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610373565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610373565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610373565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450806276a7008082111561035c57604051635c0f65a160e01b815260048101929092526024820152604401610071565b50506101c081905261036c610421565b505061058b565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ae91815260200190565b602060405180830381865afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef919061051b565b9050826001600160a01b03821661041a5760405163218f5add60e11b8152600401610071919061053d565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104ea57600080fd5b919050565b6000806040838503121561050257600080fd5b61050b836104d3565b9150602083015190509250929050565b60006020828403121561052d57600080fd5b610536826104d3565b9392505050565b602081526000825180602084015260005b8181101561056b576020818601810151604086840101520161054e565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516115b3610603600039600081816101350152610b4e015260005050600050506000505060005050600050506000610d910152600050506000610dd90152600050506000610db501526115b36000f3fe608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow_ProxyWithABI.json new file mode 100644 index 000000000..e4e9beada --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/PaymentsEscrow#PaymentsEscrow_ProxyWithABI.json @@ -0,0 +1,680 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PaymentsEscrow", + "sourceName": "contracts/payments/PaymentsEscrow.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "withdrawEscrowThawingPeriod", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInconsistentCollection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBalance", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowNotThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "PaymentsEscrowStillThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "thawingPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxWaitPeriod", + "type": "uint256" + } + ], + "name": "PaymentsEscrowThawingPeriodTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "CancelThaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "EscrowCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "Thaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_WAIT_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WITHDRAW_ESCROW_THAWING_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "cancelThaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "escrowAccounts", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "getBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e060405234801561001157600080fd5b50604051611bb6380380611bb6833981016040819052610030916104ef565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610373565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610373565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610373565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610373565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610373565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610373565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610373565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610373565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610373565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450806276a7008082111561035c57604051635c0f65a160e01b815260048101929092526024820152604401610071565b50506101c081905261036c610421565b505061058b565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ae91815260200190565b602060405180830381865afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef919061051b565b9050826001600160a01b03821661041a5760405163218f5add60e11b8152600401610071919061053d565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104ea57600080fd5b919050565b6000806040838503121561050257600080fd5b61050b836104d3565b9150602083015190509250929050565b60006020828403121561052d57600080fd5b610536826104d3565b9392505050565b602081526000825180602084015260005b8181101561056b576020818601810151604086840101520161054e565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516115b3610603600039600081816101350152610b4e015260005050600050506000505060005050600050506000610d910152600050506000610dd90152600050506000610db501526115b36000f3fe608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#GraphProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#GraphProxy.json new file mode 100644 index 000000000..97963021c --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#GraphProxy.json @@ -0,0 +1,177 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GraphProxy", + "sourceName": "contracts/upgrades/GraphProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_impl", + "type": "address" + }, + { + "internalType": "address", + "name": "_admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldAdmin", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldPendingImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newPendingImplementation", + "type": "address" + } + ], + "name": "PendingImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "acceptUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptUpgradeAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pendingImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager.json new file mode 100644 index 000000000..3d76a8992 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager.json @@ -0,0 +1,622 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RewardsManager", + "sourceName": "contracts/rewards/RewardsManager.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "HorizonRewardsAssigned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "RewardsDenied", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "sinceBlock", + "type": "uint256" + } + ], + "name": "RewardsDenylistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldSubgraphService", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newSubgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [], + "name": "accRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accRewardsPerSignalLastBlockUpdated", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_accRewardsPerAllocatedToken", + "type": "uint256" + } + ], + "name": "calcRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "denylist", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getAccRewardsForSubgraph", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getAccRewardsPerAllocatedToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAccRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNewRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsIssuer", + "type": "address" + }, + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + } + ], + "name": "getRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isDenied", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "issuancePerBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumSubgraphSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "onSubgraphAllocationUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "onSubgraphSignalUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "_deny", + "type": "bool" + } + ], + "name": "setDenied", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_issuancePerBlock", + "type": "uint256" + } + ], + "name": "setIssuancePerBlock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumSubgraphSignal", + "type": "uint256" + } + ], + "name": "setMinimumSubgraphSignal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphAvailabilityOracle", + "type": "address" + } + ], + "name": "setSubgraphAvailabilityOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphAvailabilityOracle", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract IRewardsIssuer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "subgraphs", + "outputs": [ + { + "internalType": "uint256", + "name": "accRewardsForSubgraph", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsForSubgraphSnapshot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerSignalSnapshot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + } + ], + "name": "takeRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateAccRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e051610100516101205161014051611ca761017360003980610e60525080610e37525080610e0e52806117d9525080610de5528061155c525080610dbc525080610d93525080610d6a52806113a05250611ca76000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806393a90a1e11610104578063c8a5f81e116100a2578063e284f84811610071578063e284f848146103ad578063e820e284146103b5578063eeac3e0e146103d5578063f77c4791146103e8576101da565b8063c8a5f81e14610377578063d6866ea51461038a578063db75092614610392578063e242cf1e146103a5576101da565b8063a8cc0ee2116100de578063a8cc0ee21461034c578063b951acd714610354578063c4d66de81461035c578063c7d1117d1461036f576101da565b806393a90a1e146103135780639ce7abe514610326578063a2594d8214610339576101da565b80634986594f1161017c578063702a280e1161014b578063702a280e146102c4578063779bcb9b146102e55780639006ce8b146102f857806392eefe9b14610300576101da565b80634986594f146102735780634bbfc1c5146102965780635c6cbd59146102a95780636c080f18146102bc576101da565b80631324a506116101b85780631324a5061461022557806316a84ab2146102385780631d1c2fec14610258578063260582491461026b576101da565b806305bb8c6b146101df5780630903c094146101fd5780631156bdc114610212575b600080fd5b6101e76103f0565b6040516101f49190611a57565b60405180910390f35b61021061020b366004611895565b6103ff565b005b610210610220366004611962565b61045b565b61021061023336600461197a565b61046f565b61024b610246366004611962565b6104b0565b6040516101f49190611a8f565b61024b610266366004611962565b6104c2565b6101e76104fb565b610286610281366004611962565b61050a565b6040516101f49493929190611c12565b6102106102a4366004611962565b610531565b61024b6102b7366004611962565b61062d565b61024b61071e565b6102d76102d2366004611962565b610724565b6040516101f4929190611c04565b61024b6102f33660046118cd565b610898565b61024b6109be565b61021061030e366004611895565b6109c4565b610210610321366004611895565b6109d5565b61021061033436600461199e565b610a2f565b610210610347366004611895565b610b85565b61024b610ca0565b61024b610cbc565b61021061036a366004611895565b610cc2565b61024b610d2e565b61024b610385366004611a36565b610d46565b610210610d65565b61024b6103a0366004611895565b610e86565b61024b6110bc565b61024b6110c2565b6103c86103c3366004611962565b6111d1565b6040516101f49190611a84565b61024b6103e3366004611962565b6111e5565b6101e7611217565b600f546001600160a01b031681565b610407611226565b600f80546001600160a01b0319166001600160a01b0383161790556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611a98565b60405180910390a150565b610463611226565b61046c816112fa565b50565b600f546001600160a01b031633146104a25760405162461bcd60e51b815260040161049990611acf565b60405180910390fd5b6104ac8282611336565b5050565b60116020526000908152604090205481565b60006104cc610d2e565b5060008281526010602052604090206104e48361062d565b808255600d5460029092019190915590505b919050565b6015546001600160a01b031681565b60106020526000908152604090208054600182015460028301546003909301549192909184565b600f546001600160a01b03163314806105de575060008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c991906118b1565b6001600160a01b0316336001600160a01b0316145b6105fa5760405162461bcd60e51b815260040161049990611bdc565b60128190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b1e565b600081815260106020526040812081610644611399565b6001600160a01b03166346e855da856040518263ffffffff1660e01b815260040161066f9190611a8f565b60206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190611a1e565b905060006012548210156106d4576000610706565b610706670de0b6b3a7640000610700846106fa87600201546106f4610ca0565b906113c4565b90611421565b9061147a565b835490915061071590826114e1565b95945050505050565b60145481565b600081815260106020526040812081908161073e8561062d565b9050600061075082846001015461153b565b90506000806040518060400160405280610768611555565b6001600160a01b03908116825260155416602090910152905060005b600281101561084757600082826002811061079b57fe5b60200201516001600160a01b03161461083f578181600281106107ba57fe5b60200201516001600160a01b031663e2e1e8e98a6040518263ffffffff1660e01b81526004016107ea9190611a8f565b60206040518083038186803b15801561080257600080fd5b505afa158015610816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083a9190611a1e565b830192505b600101610784565b508161085e57600084965096505050505050610893565b60006108768361070086670de0b6b3a7640000611421565b600387015490915061088890826114e1565b975093955050505050505b915091565b60006108a2611555565b6001600160a01b0316836001600160a01b031614806108ce57506015546001600160a01b038481169116145b6108ea5760405162461bcd60e51b815260040161049990611b77565b6000806000806000876001600160a01b03166355c85269886040518263ffffffff1660e01b815260040161091e9190611a57565b60c06040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611905565b95509550955095505094508461098c576000955050505050506109b8565b600061099785610724565b5090506109af6109a8858584611580565b83906114e1565b96505050505050505b92915050565b600e5481565b6109cc6115a5565b61046c81611604565b6109dd611226565b601580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f97befc0afcf2bace352f077aea9873c9552fc2e5ab26874f356006fdf9da4ede90600090a35050565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b505050506040513d6020811015610a9557600080fd5b50516001600160a01b03163314610af3576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bc157600080fd5b505af1158015610bd5573d6000803e3d6000fd5b505050506040513d6020811015610beb57600080fd5b50516001600160a01b03163314610c49576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050505050565b6000610cb6610cad6110c2565b600d54906114e1565b90505b90565b60125481565b610cca6116ac565b6001600160a01b0316336001600160a01b031614610d25576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b61046c816109cc565b6000610d38610ca0565b600d81905543600e55905090565b6000610d5e670de0b6b3a76400006107008486611421565b9392505050565b610d8e7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610db77f00000000000000000000000000000000000000000000000000000000000000006116d1565b610de07f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e097f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e327f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e5b7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e847f00000000000000000000000000000000000000000000000000000000000000006116d1565b565b600033610e91611555565b6001600160a01b0316816001600160a01b03161480610ebd57506015546001600160a01b038281169116145b610ed95760405162461bcd60e51b815260040161049990611ba5565b600080600080600080866001600160a01b03166355c852698a6040518263ffffffff1660e01b8152600401610f0e9190611a57565b60c06040518083038186803b158015610f2657600080fd5b505afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190611905565b9550955095509550955095506000610f75856111e5565b9050610f80856111d1565b15610fd657896001600160a01b0316866001600160a01b03167f9b1323a10f3955b1c9c054ffbda78edfdf49998aaf37f61d9f84776b59ac804360405160405180910390a36000985050505050505050506104f6565b6000871561106357610ff3610fec868685611580565b84906114e1565b90508015611063576110036117d2565b6001600160a01b03166340c10f198a836040518363ffffffff1660e01b8152600401611030929190611a6b565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050505b8a6001600160a01b0316876001600160a01b03167fa111914d7f2ea8beca61d12f1a1f38c5533de5f1823c3936422df4404ac2ec68836040516110a69190611a8f565b60405180910390a39a9950505050505050505050565b600d5481565b6000806110da600e54436113c490919063ffffffff16565b9050806110eb576000915050610cb9565b6014546110fc576000915050610cb9565b60006111066117d2565b90506000816001600160a01b03166370a08231611121611399565b6040518263ffffffff1660e01b815260040161113d9190611a57565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190611a1e565b9050806111a05760009350505050610cb9565b6014546000906111b09085611421565b90506111c88261070083670de0b6b3a7640000611421565b94505050505090565b600090815260116020526040902054151590565b600081815260106020526040812081806111fe85610724565b6003850182905560019094019390935550909392505050565b6000546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b50516001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b611302610d2e565b5060148190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b4d565b600081611344576000611346565b435b600084815260116020526040908190208290555190915083907fe016102b339c3889f4967b491f3381f2c352c8fe3d4f880007807d45b124065a9061138c908490611a8f565b60405180910390a2505050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008282111561141b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611430575060006109b8565b8282028284828161143d57fe5b0414610d5e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611c516021913960400191505060405180910390fd5b60008082116114d0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d957fe5b049392505050565b600082820183811015610d5e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081831161154b576000610d5e565b610d5e83836113c4565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008061158d83856113c4565b9050610715670de0b6b3a76400006107008388611421565b6000546001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611658576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146104ac5760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806109b85760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50519392505050565b6000602082840312156118a6578081fd5b8135610d5e81611c2d565b6000602082840312156118c2578081fd5b8151610d5e81611c2d565b600080604083850312156118df578081fd5b82356118ea81611c2d565b915060208301356118fa81611c2d565b809150509250929050565b60008060008060008060c0878903121561191d578182fd5b865161192881611c42565b602088015190965061193981611c2d565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b600060208284031215611973578081fd5b5035919050565b6000806040838503121561198c578182fd5b8235915060208301356118fa81611c42565b6000806000604084860312156119b2578283fd5b83356119bd81611c2d565b9250602084013567ffffffffffffffff808211156119d9578384fd5b818601915086601f8301126119ec578384fd5b8135818111156119fa578485fd5b876020828501011115611a0b578485fd5b6020830194508093505050509250925092565b600060208284031215611a2f578081fd5b5051919050565b60008060408385031215611a48578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6020808252601a908201527f7375626772617068417661696c6162696c6974794f7261636c65000000000000604082015260600190565b6020808252602f908201527f43616c6c6572206d75737420626520746865207375626772617068206176616960408201526e6c6162696c697479206f7261636c6560881b606082015260800190565b6020808252601590820152741b5a5b9a5b5d5b54dd5899dc985c1a14da59db985b605a1b604082015260600190565b60208082526010908201526f69737375616e6365506572426c6f636b60801b604082015260600190565b6020808252601490820152732737ba1030903932bbb0b932399034b9b9bab2b960611b604082015260600190565b6020808252601f908201527f43616c6c6572206d757374206265206120726577617264732069737375657200604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6001600160a01b038116811461046c57600080fd5b801515811461046c57600080fdfe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220b536df78ac5675cc1b134b52c2a049a6938eb11d81ca397ce9b07214c71d8af264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806393a90a1e11610104578063c8a5f81e116100a2578063e284f84811610071578063e284f848146103ad578063e820e284146103b5578063eeac3e0e146103d5578063f77c4791146103e8576101da565b8063c8a5f81e14610377578063d6866ea51461038a578063db75092614610392578063e242cf1e146103a5576101da565b8063a8cc0ee2116100de578063a8cc0ee21461034c578063b951acd714610354578063c4d66de81461035c578063c7d1117d1461036f576101da565b806393a90a1e146103135780639ce7abe514610326578063a2594d8214610339576101da565b80634986594f1161017c578063702a280e1161014b578063702a280e146102c4578063779bcb9b146102e55780639006ce8b146102f857806392eefe9b14610300576101da565b80634986594f146102735780634bbfc1c5146102965780635c6cbd59146102a95780636c080f18146102bc576101da565b80631324a506116101b85780631324a5061461022557806316a84ab2146102385780631d1c2fec14610258578063260582491461026b576101da565b806305bb8c6b146101df5780630903c094146101fd5780631156bdc114610212575b600080fd5b6101e76103f0565b6040516101f49190611a57565b60405180910390f35b61021061020b366004611895565b6103ff565b005b610210610220366004611962565b61045b565b61021061023336600461197a565b61046f565b61024b610246366004611962565b6104b0565b6040516101f49190611a8f565b61024b610266366004611962565b6104c2565b6101e76104fb565b610286610281366004611962565b61050a565b6040516101f49493929190611c12565b6102106102a4366004611962565b610531565b61024b6102b7366004611962565b61062d565b61024b61071e565b6102d76102d2366004611962565b610724565b6040516101f4929190611c04565b61024b6102f33660046118cd565b610898565b61024b6109be565b61021061030e366004611895565b6109c4565b610210610321366004611895565b6109d5565b61021061033436600461199e565b610a2f565b610210610347366004611895565b610b85565b61024b610ca0565b61024b610cbc565b61021061036a366004611895565b610cc2565b61024b610d2e565b61024b610385366004611a36565b610d46565b610210610d65565b61024b6103a0366004611895565b610e86565b61024b6110bc565b61024b6110c2565b6103c86103c3366004611962565b6111d1565b6040516101f49190611a84565b61024b6103e3366004611962565b6111e5565b6101e7611217565b600f546001600160a01b031681565b610407611226565b600f80546001600160a01b0319166001600160a01b0383161790556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611a98565b60405180910390a150565b610463611226565b61046c816112fa565b50565b600f546001600160a01b031633146104a25760405162461bcd60e51b815260040161049990611acf565b60405180910390fd5b6104ac8282611336565b5050565b60116020526000908152604090205481565b60006104cc610d2e565b5060008281526010602052604090206104e48361062d565b808255600d5460029092019190915590505b919050565b6015546001600160a01b031681565b60106020526000908152604090208054600182015460028301546003909301549192909184565b600f546001600160a01b03163314806105de575060008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c991906118b1565b6001600160a01b0316336001600160a01b0316145b6105fa5760405162461bcd60e51b815260040161049990611bdc565b60128190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b1e565b600081815260106020526040812081610644611399565b6001600160a01b03166346e855da856040518263ffffffff1660e01b815260040161066f9190611a8f565b60206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190611a1e565b905060006012548210156106d4576000610706565b610706670de0b6b3a7640000610700846106fa87600201546106f4610ca0565b906113c4565b90611421565b9061147a565b835490915061071590826114e1565b95945050505050565b60145481565b600081815260106020526040812081908161073e8561062d565b9050600061075082846001015461153b565b90506000806040518060400160405280610768611555565b6001600160a01b03908116825260155416602090910152905060005b600281101561084757600082826002811061079b57fe5b60200201516001600160a01b03161461083f578181600281106107ba57fe5b60200201516001600160a01b031663e2e1e8e98a6040518263ffffffff1660e01b81526004016107ea9190611a8f565b60206040518083038186803b15801561080257600080fd5b505afa158015610816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083a9190611a1e565b830192505b600101610784565b508161085e57600084965096505050505050610893565b60006108768361070086670de0b6b3a7640000611421565b600387015490915061088890826114e1565b975093955050505050505b915091565b60006108a2611555565b6001600160a01b0316836001600160a01b031614806108ce57506015546001600160a01b038481169116145b6108ea5760405162461bcd60e51b815260040161049990611b77565b6000806000806000876001600160a01b03166355c85269886040518263ffffffff1660e01b815260040161091e9190611a57565b60c06040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611905565b95509550955095505094508461098c576000955050505050506109b8565b600061099785610724565b5090506109af6109a8858584611580565b83906114e1565b96505050505050505b92915050565b600e5481565b6109cc6115a5565b61046c81611604565b6109dd611226565b601580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f97befc0afcf2bace352f077aea9873c9552fc2e5ab26874f356006fdf9da4ede90600090a35050565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b505050506040513d6020811015610a9557600080fd5b50516001600160a01b03163314610af3576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bc157600080fd5b505af1158015610bd5573d6000803e3d6000fd5b505050506040513d6020811015610beb57600080fd5b50516001600160a01b03163314610c49576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050505050565b6000610cb6610cad6110c2565b600d54906114e1565b90505b90565b60125481565b610cca6116ac565b6001600160a01b0316336001600160a01b031614610d25576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b61046c816109cc565b6000610d38610ca0565b600d81905543600e55905090565b6000610d5e670de0b6b3a76400006107008486611421565b9392505050565b610d8e7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610db77f00000000000000000000000000000000000000000000000000000000000000006116d1565b610de07f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e097f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e327f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e5b7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e847f00000000000000000000000000000000000000000000000000000000000000006116d1565b565b600033610e91611555565b6001600160a01b0316816001600160a01b03161480610ebd57506015546001600160a01b038281169116145b610ed95760405162461bcd60e51b815260040161049990611ba5565b600080600080600080866001600160a01b03166355c852698a6040518263ffffffff1660e01b8152600401610f0e9190611a57565b60c06040518083038186803b158015610f2657600080fd5b505afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190611905565b9550955095509550955095506000610f75856111e5565b9050610f80856111d1565b15610fd657896001600160a01b0316866001600160a01b03167f9b1323a10f3955b1c9c054ffbda78edfdf49998aaf37f61d9f84776b59ac804360405160405180910390a36000985050505050505050506104f6565b6000871561106357610ff3610fec868685611580565b84906114e1565b90508015611063576110036117d2565b6001600160a01b03166340c10f198a836040518363ffffffff1660e01b8152600401611030929190611a6b565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050505b8a6001600160a01b0316876001600160a01b03167fa111914d7f2ea8beca61d12f1a1f38c5533de5f1823c3936422df4404ac2ec68836040516110a69190611a8f565b60405180910390a39a9950505050505050505050565b600d5481565b6000806110da600e54436113c490919063ffffffff16565b9050806110eb576000915050610cb9565b6014546110fc576000915050610cb9565b60006111066117d2565b90506000816001600160a01b03166370a08231611121611399565b6040518263ffffffff1660e01b815260040161113d9190611a57565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190611a1e565b9050806111a05760009350505050610cb9565b6014546000906111b09085611421565b90506111c88261070083670de0b6b3a7640000611421565b94505050505090565b600090815260116020526040902054151590565b600081815260106020526040812081806111fe85610724565b6003850182905560019094019390935550909392505050565b6000546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b50516001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b611302610d2e565b5060148190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b4d565b600081611344576000611346565b435b600084815260116020526040908190208290555190915083907fe016102b339c3889f4967b491f3381f2c352c8fe3d4f880007807d45b124065a9061138c908490611a8f565b60405180910390a2505050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008282111561141b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611430575060006109b8565b8282028284828161143d57fe5b0414610d5e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611c516021913960400191505060405180910390fd5b60008082116114d0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d957fe5b049392505050565b600082820183811015610d5e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081831161154b576000610d5e565b610d5e83836113c4565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008061158d83856113c4565b9050610715670de0b6b3a76400006107008388611421565b6000546001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611658576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146104ac5760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806109b85760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50519392505050565b6000602082840312156118a6578081fd5b8135610d5e81611c2d565b6000602082840312156118c2578081fd5b8151610d5e81611c2d565b600080604083850312156118df578081fd5b82356118ea81611c2d565b915060208301356118fa81611c2d565b809150509250929050565b60008060008060008060c0878903121561191d578182fd5b865161192881611c42565b602088015190965061193981611c2d565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b600060208284031215611973578081fd5b5035919050565b6000806040838503121561198c578182fd5b8235915060208301356118fa81611c42565b6000806000604084860312156119b2578283fd5b83356119bd81611c2d565b9250602084013567ffffffffffffffff808211156119d9578384fd5b818601915086601f8301126119ec578384fd5b8135818111156119fa578485fd5b876020828501011115611a0b578485fd5b6020830194508093505050509250925092565b600060208284031215611a2f578081fd5b5051919050565b60008060408385031215611a48578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6020808252601a908201527f7375626772617068417661696c6162696c6974794f7261636c65000000000000604082015260600190565b6020808252602f908201527f43616c6c6572206d75737420626520746865207375626772617068206176616960408201526e6c6162696c697479206f7261636c6560881b606082015260800190565b6020808252601590820152741b5a5b9a5b5d5b54dd5899dc985c1a14da59db985b605a1b604082015260600190565b60208082526010908201526f69737375616e6365506572426c6f636b60801b604082015260600190565b6020808252601490820152732737ba1030903932bbb0b932399034b9b9bab2b960611b604082015260600190565b6020808252601f908201527f43616c6c6572206d757374206265206120726577617264732069737375657200604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6001600160a01b038116811461046c57600080fd5b801515811461046c57600080fdfe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220b536df78ac5675cc1b134b52c2a049a6938eb11d81ca397ce9b07214c71d8af264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager_ProxyWithABI.json new file mode 100644 index 000000000..3d76a8992 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/RewardsManager#RewardsManager_ProxyWithABI.json @@ -0,0 +1,622 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RewardsManager", + "sourceName": "contracts/rewards/RewardsManager.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "nameHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractSynced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "HorizonRewardsAssigned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "param", + "type": "string" + } + ], + "name": "ParameterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "RewardsDenied", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "sinceBlock", + "type": "uint256" + } + ], + "name": "RewardsDenylistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "name": "SetController", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldSubgraphService", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newSubgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [], + "name": "accRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accRewardsPerSignalLastBlockUpdated", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + } + ], + "name": "acceptProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGraphProxy", + "name": "_proxy", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "acceptProxyAndCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_accRewardsPerAllocatedToken", + "type": "uint256" + } + ], + "name": "calcRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "controller", + "outputs": [ + { + "internalType": "contract IController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "denylist", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getAccRewardsForSubgraph", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getAccRewardsPerAllocatedToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAccRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNewRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsIssuer", + "type": "address" + }, + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + } + ], + "name": "getRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isDenied", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "issuancePerBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumSubgraphSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "onSubgraphAllocationUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "onSubgraphSignalUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "setController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "_deny", + "type": "bool" + } + ], + "name": "setDenied", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_issuancePerBlock", + "type": "uint256" + } + ], + "name": "setIssuancePerBlock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumSubgraphSignal", + "type": "uint256" + } + ], + "name": "setMinimumSubgraphSignal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphAvailabilityOracle", + "type": "address" + } + ], + "name": "setSubgraphAvailabilityOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphAvailabilityOracle", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract IRewardsIssuer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "subgraphs", + "outputs": [ + { + "internalType": "uint256", + "name": "accRewardsForSubgraph", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsForSubgraphSnapshot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerSignalSnapshot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "syncAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + } + ], + "name": "takeRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateAccRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e051610100516101205161014051611ca761017360003980610e60525080610e37525080610e0e52806117d9525080610de5528061155c525080610dbc525080610d93525080610d6a52806113a05250611ca76000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806393a90a1e11610104578063c8a5f81e116100a2578063e284f84811610071578063e284f848146103ad578063e820e284146103b5578063eeac3e0e146103d5578063f77c4791146103e8576101da565b8063c8a5f81e14610377578063d6866ea51461038a578063db75092614610392578063e242cf1e146103a5576101da565b8063a8cc0ee2116100de578063a8cc0ee21461034c578063b951acd714610354578063c4d66de81461035c578063c7d1117d1461036f576101da565b806393a90a1e146103135780639ce7abe514610326578063a2594d8214610339576101da565b80634986594f1161017c578063702a280e1161014b578063702a280e146102c4578063779bcb9b146102e55780639006ce8b146102f857806392eefe9b14610300576101da565b80634986594f146102735780634bbfc1c5146102965780635c6cbd59146102a95780636c080f18146102bc576101da565b80631324a506116101b85780631324a5061461022557806316a84ab2146102385780631d1c2fec14610258578063260582491461026b576101da565b806305bb8c6b146101df5780630903c094146101fd5780631156bdc114610212575b600080fd5b6101e76103f0565b6040516101f49190611a57565b60405180910390f35b61021061020b366004611895565b6103ff565b005b610210610220366004611962565b61045b565b61021061023336600461197a565b61046f565b61024b610246366004611962565b6104b0565b6040516101f49190611a8f565b61024b610266366004611962565b6104c2565b6101e76104fb565b610286610281366004611962565b61050a565b6040516101f49493929190611c12565b6102106102a4366004611962565b610531565b61024b6102b7366004611962565b61062d565b61024b61071e565b6102d76102d2366004611962565b610724565b6040516101f4929190611c04565b61024b6102f33660046118cd565b610898565b61024b6109be565b61021061030e366004611895565b6109c4565b610210610321366004611895565b6109d5565b61021061033436600461199e565b610a2f565b610210610347366004611895565b610b85565b61024b610ca0565b61024b610cbc565b61021061036a366004611895565b610cc2565b61024b610d2e565b61024b610385366004611a36565b610d46565b610210610d65565b61024b6103a0366004611895565b610e86565b61024b6110bc565b61024b6110c2565b6103c86103c3366004611962565b6111d1565b6040516101f49190611a84565b61024b6103e3366004611962565b6111e5565b6101e7611217565b600f546001600160a01b031681565b610407611226565b600f80546001600160a01b0319166001600160a01b0383161790556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611a98565b60405180910390a150565b610463611226565b61046c816112fa565b50565b600f546001600160a01b031633146104a25760405162461bcd60e51b815260040161049990611acf565b60405180910390fd5b6104ac8282611336565b5050565b60116020526000908152604090205481565b60006104cc610d2e565b5060008281526010602052604090206104e48361062d565b808255600d5460029092019190915590505b919050565b6015546001600160a01b031681565b60106020526000908152604090208054600182015460028301546003909301549192909184565b600f546001600160a01b03163314806105de575060008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c991906118b1565b6001600160a01b0316336001600160a01b0316145b6105fa5760405162461bcd60e51b815260040161049990611bdc565b60128190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b1e565b600081815260106020526040812081610644611399565b6001600160a01b03166346e855da856040518263ffffffff1660e01b815260040161066f9190611a8f565b60206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190611a1e565b905060006012548210156106d4576000610706565b610706670de0b6b3a7640000610700846106fa87600201546106f4610ca0565b906113c4565b90611421565b9061147a565b835490915061071590826114e1565b95945050505050565b60145481565b600081815260106020526040812081908161073e8561062d565b9050600061075082846001015461153b565b90506000806040518060400160405280610768611555565b6001600160a01b03908116825260155416602090910152905060005b600281101561084757600082826002811061079b57fe5b60200201516001600160a01b03161461083f578181600281106107ba57fe5b60200201516001600160a01b031663e2e1e8e98a6040518263ffffffff1660e01b81526004016107ea9190611a8f565b60206040518083038186803b15801561080257600080fd5b505afa158015610816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083a9190611a1e565b830192505b600101610784565b508161085e57600084965096505050505050610893565b60006108768361070086670de0b6b3a7640000611421565b600387015490915061088890826114e1565b975093955050505050505b915091565b60006108a2611555565b6001600160a01b0316836001600160a01b031614806108ce57506015546001600160a01b038481169116145b6108ea5760405162461bcd60e51b815260040161049990611b77565b6000806000806000876001600160a01b03166355c85269886040518263ffffffff1660e01b815260040161091e9190611a57565b60c06040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611905565b95509550955095505094508461098c576000955050505050506109b8565b600061099785610724565b5090506109af6109a8858584611580565b83906114e1565b96505050505050505b92915050565b600e5481565b6109cc6115a5565b61046c81611604565b6109dd611226565b601580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f97befc0afcf2bace352f077aea9873c9552fc2e5ab26874f356006fdf9da4ede90600090a35050565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b505050506040513d6020811015610a9557600080fd5b50516001600160a01b03163314610af3576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bc157600080fd5b505af1158015610bd5573d6000803e3d6000fd5b505050506040513d6020811015610beb57600080fd5b50516001600160a01b03163314610c49576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050505050565b6000610cb6610cad6110c2565b600d54906114e1565b90505b90565b60125481565b610cca6116ac565b6001600160a01b0316336001600160a01b031614610d25576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b61046c816109cc565b6000610d38610ca0565b600d81905543600e55905090565b6000610d5e670de0b6b3a76400006107008486611421565b9392505050565b610d8e7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610db77f00000000000000000000000000000000000000000000000000000000000000006116d1565b610de07f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e097f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e327f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e5b7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e847f00000000000000000000000000000000000000000000000000000000000000006116d1565b565b600033610e91611555565b6001600160a01b0316816001600160a01b03161480610ebd57506015546001600160a01b038281169116145b610ed95760405162461bcd60e51b815260040161049990611ba5565b600080600080600080866001600160a01b03166355c852698a6040518263ffffffff1660e01b8152600401610f0e9190611a57565b60c06040518083038186803b158015610f2657600080fd5b505afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190611905565b9550955095509550955095506000610f75856111e5565b9050610f80856111d1565b15610fd657896001600160a01b0316866001600160a01b03167f9b1323a10f3955b1c9c054ffbda78edfdf49998aaf37f61d9f84776b59ac804360405160405180910390a36000985050505050505050506104f6565b6000871561106357610ff3610fec868685611580565b84906114e1565b90508015611063576110036117d2565b6001600160a01b03166340c10f198a836040518363ffffffff1660e01b8152600401611030929190611a6b565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050505b8a6001600160a01b0316876001600160a01b03167fa111914d7f2ea8beca61d12f1a1f38c5533de5f1823c3936422df4404ac2ec68836040516110a69190611a8f565b60405180910390a39a9950505050505050505050565b600d5481565b6000806110da600e54436113c490919063ffffffff16565b9050806110eb576000915050610cb9565b6014546110fc576000915050610cb9565b60006111066117d2565b90506000816001600160a01b03166370a08231611121611399565b6040518263ffffffff1660e01b815260040161113d9190611a57565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190611a1e565b9050806111a05760009350505050610cb9565b6014546000906111b09085611421565b90506111c88261070083670de0b6b3a7640000611421565b94505050505090565b600090815260116020526040902054151590565b600081815260106020526040812081806111fe85610724565b6003850182905560019094019390935550909392505050565b6000546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b50516001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b611302610d2e565b5060148190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b4d565b600081611344576000611346565b435b600084815260116020526040908190208290555190915083907fe016102b339c3889f4967b491f3381f2c352c8fe3d4f880007807d45b124065a9061138c908490611a8f565b60405180910390a2505050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008282111561141b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611430575060006109b8565b8282028284828161143d57fe5b0414610d5e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611c516021913960400191505060405180910390fd5b60008082116114d0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d957fe5b049392505050565b600082820183811015610d5e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081831161154b576000610d5e565b610d5e83836113c4565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008061158d83856113c4565b9050610715670de0b6b3a76400006107008388611421565b6000546001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611658576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146104ac5760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806109b85760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50519392505050565b6000602082840312156118a6578081fd5b8135610d5e81611c2d565b6000602082840312156118c2578081fd5b8151610d5e81611c2d565b600080604083850312156118df578081fd5b82356118ea81611c2d565b915060208301356118fa81611c2d565b809150509250929050565b60008060008060008060c0878903121561191d578182fd5b865161192881611c42565b602088015190965061193981611c2d565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b600060208284031215611973578081fd5b5035919050565b6000806040838503121561198c578182fd5b8235915060208301356118fa81611c42565b6000806000604084860312156119b2578283fd5b83356119bd81611c2d565b9250602084013567ffffffffffffffff808211156119d9578384fd5b818601915086601f8301126119ec578384fd5b8135818111156119fa578485fd5b876020828501011115611a0b578485fd5b6020830194508093505050509250925092565b600060208284031215611a2f578081fd5b5051919050565b60008060408385031215611a48578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6020808252601a908201527f7375626772617068417661696c6162696c6974794f7261636c65000000000000604082015260600190565b6020808252602f908201527f43616c6c6572206d75737420626520746865207375626772617068206176616960408201526e6c6162696c697479206f7261636c6560881b606082015260800190565b6020808252601590820152741b5a5b9a5b5d5b54dd5899dc985c1a14da59db985b605a1b604082015260600190565b60208082526010908201526f69737375616e6365506572426c6f636b60801b604082015260600190565b6020808252601490820152732737ba1030903932bbb0b932399034b9b9bab2b960611b604082015260600190565b6020808252601f908201527f43616c6c6572206d757374206265206120726577617264732069737375657200604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6001600160a01b038116811461046c57600080fd5b801515811461046c57600080fdfe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220b536df78ac5675cc1b134b52c2a049a6938eb11d81ca397ce9b07214c71d8af264736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806393a90a1e11610104578063c8a5f81e116100a2578063e284f84811610071578063e284f848146103ad578063e820e284146103b5578063eeac3e0e146103d5578063f77c4791146103e8576101da565b8063c8a5f81e14610377578063d6866ea51461038a578063db75092614610392578063e242cf1e146103a5576101da565b8063a8cc0ee2116100de578063a8cc0ee21461034c578063b951acd714610354578063c4d66de81461035c578063c7d1117d1461036f576101da565b806393a90a1e146103135780639ce7abe514610326578063a2594d8214610339576101da565b80634986594f1161017c578063702a280e1161014b578063702a280e146102c4578063779bcb9b146102e55780639006ce8b146102f857806392eefe9b14610300576101da565b80634986594f146102735780634bbfc1c5146102965780635c6cbd59146102a95780636c080f18146102bc576101da565b80631324a506116101b85780631324a5061461022557806316a84ab2146102385780631d1c2fec14610258578063260582491461026b576101da565b806305bb8c6b146101df5780630903c094146101fd5780631156bdc114610212575b600080fd5b6101e76103f0565b6040516101f49190611a57565b60405180910390f35b61021061020b366004611895565b6103ff565b005b610210610220366004611962565b61045b565b61021061023336600461197a565b61046f565b61024b610246366004611962565b6104b0565b6040516101f49190611a8f565b61024b610266366004611962565b6104c2565b6101e76104fb565b610286610281366004611962565b61050a565b6040516101f49493929190611c12565b6102106102a4366004611962565b610531565b61024b6102b7366004611962565b61062d565b61024b61071e565b6102d76102d2366004611962565b610724565b6040516101f4929190611c04565b61024b6102f33660046118cd565b610898565b61024b6109be565b61021061030e366004611895565b6109c4565b610210610321366004611895565b6109d5565b61021061033436600461199e565b610a2f565b610210610347366004611895565b610b85565b61024b610ca0565b61024b610cbc565b61021061036a366004611895565b610cc2565b61024b610d2e565b61024b610385366004611a36565b610d46565b610210610d65565b61024b6103a0366004611895565b610e86565b61024b6110bc565b61024b6110c2565b6103c86103c3366004611962565b6111d1565b6040516101f49190611a84565b61024b6103e3366004611962565b6111e5565b6101e7611217565b600f546001600160a01b031681565b610407611226565b600f80546001600160a01b0319166001600160a01b0383161790556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611a98565b60405180910390a150565b610463611226565b61046c816112fa565b50565b600f546001600160a01b031633146104a25760405162461bcd60e51b815260040161049990611acf565b60405180910390fd5b6104ac8282611336565b5050565b60116020526000908152604090205481565b60006104cc610d2e565b5060008281526010602052604090206104e48361062d565b808255600d5460029092019190915590505b919050565b6015546001600160a01b031681565b60106020526000908152604090208054600182015460028301546003909301549192909184565b600f546001600160a01b03163314806105de575060008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c991906118b1565b6001600160a01b0316336001600160a01b0316145b6105fa5760405162461bcd60e51b815260040161049990611bdc565b60128190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b1e565b600081815260106020526040812081610644611399565b6001600160a01b03166346e855da856040518263ffffffff1660e01b815260040161066f9190611a8f565b60206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190611a1e565b905060006012548210156106d4576000610706565b610706670de0b6b3a7640000610700846106fa87600201546106f4610ca0565b906113c4565b90611421565b9061147a565b835490915061071590826114e1565b95945050505050565b60145481565b600081815260106020526040812081908161073e8561062d565b9050600061075082846001015461153b565b90506000806040518060400160405280610768611555565b6001600160a01b03908116825260155416602090910152905060005b600281101561084757600082826002811061079b57fe5b60200201516001600160a01b03161461083f578181600281106107ba57fe5b60200201516001600160a01b031663e2e1e8e98a6040518263ffffffff1660e01b81526004016107ea9190611a8f565b60206040518083038186803b15801561080257600080fd5b505afa158015610816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083a9190611a1e565b830192505b600101610784565b508161085e57600084965096505050505050610893565b60006108768361070086670de0b6b3a7640000611421565b600387015490915061088890826114e1565b975093955050505050505b915091565b60006108a2611555565b6001600160a01b0316836001600160a01b031614806108ce57506015546001600160a01b038481169116145b6108ea5760405162461bcd60e51b815260040161049990611b77565b6000806000806000876001600160a01b03166355c85269886040518263ffffffff1660e01b815260040161091e9190611a57565b60c06040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611905565b95509550955095505094508461098c576000955050505050506109b8565b600061099785610724565b5090506109af6109a8858584611580565b83906114e1565b96505050505050505b92915050565b600e5481565b6109cc6115a5565b61046c81611604565b6109dd611226565b601580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f97befc0afcf2bace352f077aea9873c9552fc2e5ab26874f356006fdf9da4ede90600090a35050565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b505050506040513d6020811015610a9557600080fd5b50516001600160a01b03163314610af3576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bc157600080fd5b505af1158015610bd5573d6000803e3d6000fd5b505050506040513d6020811015610beb57600080fd5b50516001600160a01b03163314610c49576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050505050565b6000610cb6610cad6110c2565b600d54906114e1565b90505b90565b60125481565b610cca6116ac565b6001600160a01b0316336001600160a01b031614610d25576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b61046c816109cc565b6000610d38610ca0565b600d81905543600e55905090565b6000610d5e670de0b6b3a76400006107008486611421565b9392505050565b610d8e7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610db77f00000000000000000000000000000000000000000000000000000000000000006116d1565b610de07f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e097f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e327f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e5b7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e847f00000000000000000000000000000000000000000000000000000000000000006116d1565b565b600033610e91611555565b6001600160a01b0316816001600160a01b03161480610ebd57506015546001600160a01b038281169116145b610ed95760405162461bcd60e51b815260040161049990611ba5565b600080600080600080866001600160a01b03166355c852698a6040518263ffffffff1660e01b8152600401610f0e9190611a57565b60c06040518083038186803b158015610f2657600080fd5b505afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190611905565b9550955095509550955095506000610f75856111e5565b9050610f80856111d1565b15610fd657896001600160a01b0316866001600160a01b03167f9b1323a10f3955b1c9c054ffbda78edfdf49998aaf37f61d9f84776b59ac804360405160405180910390a36000985050505050505050506104f6565b6000871561106357610ff3610fec868685611580565b84906114e1565b90508015611063576110036117d2565b6001600160a01b03166340c10f198a836040518363ffffffff1660e01b8152600401611030929190611a6b565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050505b8a6001600160a01b0316876001600160a01b03167fa111914d7f2ea8beca61d12f1a1f38c5533de5f1823c3936422df4404ac2ec68836040516110a69190611a8f565b60405180910390a39a9950505050505050505050565b600d5481565b6000806110da600e54436113c490919063ffffffff16565b9050806110eb576000915050610cb9565b6014546110fc576000915050610cb9565b60006111066117d2565b90506000816001600160a01b03166370a08231611121611399565b6040518263ffffffff1660e01b815260040161113d9190611a57565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190611a1e565b9050806111a05760009350505050610cb9565b6014546000906111b09085611421565b90506111c88261070083670de0b6b3a7640000611421565b94505050505090565b600090815260116020526040902054151590565b600081815260106020526040812081806111fe85610724565b6003850182905560019094019390935550909392505050565b6000546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b50516001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b611302610d2e565b5060148190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b4d565b600081611344576000611346565b435b600084815260116020526040908190208290555190915083907fe016102b339c3889f4967b491f3381f2c352c8fe3d4f880007807d45b124065a9061138c908490611a8f565b60405180910390a2505050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008282111561141b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611430575060006109b8565b8282028284828161143d57fe5b0414610d5e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611c516021913960400191505060405180910390fd5b60008082116114d0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d957fe5b049392505050565b600082820183811015610d5e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081831161154b576000610d5e565b610d5e83836113c4565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008061158d83856113c4565b9050610715670de0b6b3a76400006107008388611421565b6000546001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611658576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146104ac5760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806109b85760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50519392505050565b6000602082840312156118a6578081fd5b8135610d5e81611c2d565b6000602082840312156118c2578081fd5b8151610d5e81611c2d565b600080604083850312156118df578081fd5b82356118ea81611c2d565b915060208301356118fa81611c2d565b809150509250929050565b60008060008060008060c0878903121561191d578182fd5b865161192881611c42565b602088015190965061193981611c2d565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b600060208284031215611973578081fd5b5035919050565b6000806040838503121561198c578182fd5b8235915060208301356118fa81611c42565b6000806000604084860312156119b2578283fd5b83356119bd81611c2d565b9250602084013567ffffffffffffffff808211156119d9578384fd5b818601915086601f8301126119ec578384fd5b8135818111156119fa578485fd5b876020828501011115611a0b578485fd5b6020830194508093505050509250925092565b600060208284031215611a2f578081fd5b5051919050565b60008060408385031215611a48578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6020808252601a908201527f7375626772617068417661696c6162696c6974794f7261636c65000000000000604082015260600190565b6020808252602f908201527f43616c6c6572206d75737420626520746865207375626772617068206176616960408201526e6c6162696c697479206f7261636c6560881b606082015260800190565b6020808252601590820152741b5a5b9a5b5d5b54dd5899dc985c1a14da59db985b605a1b604082015260600190565b60208082526010908201526f69737375616e6365506572426c6f636b60801b604082015260600190565b6020808252601490820152732737ba1030903932bbb0b932399034b9b9bab2b960611b604082015260600190565b6020808252601f908201527f43616c6c6572206d757374206265206120726577617264732069737375657200604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6001600160a01b038116811461046c57600080fd5b801515811461046c57600080fdfe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220b536df78ac5675cc1b134b52c2a049a6938eb11d81ca397ce9b07214c71d8af264736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#ProxyAdmin.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#ProxyAdmin.json new file mode 100644 index 000000000..a6fc103d5 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#ProxyAdmin.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220098134bf3dcb274377e55b14b69b89c7eefde1171c4c5b1eb6233b5158fa785b64736f6c63430008180033", + "deployedBytecode": "0x608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220098134bf3dcb274377e55b14b69b89c7eefde1171c4c5b1eb6233b5158fa785b64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.dbg.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.dbg.json new file mode 100644 index 000000000..d34dc828e --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/81754efc7e2eec76b7d493cc60c0f970.json" +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.json new file mode 100644 index 000000000..ad479761b --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService.json @@ -0,0 +1,2268 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SubgraphService", + "sourceName": "contracts/SubgraphService.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + } + ], + "name": "AllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationDoesNotExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerAllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "AllocationManagerAllocationSameSize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerInvalidAllocationProof", + "type": "error" + }, + { + "inputs": [], + "name": "AllocationManagerInvalidZeroAllocationId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "DataServicePausableNotPauseGuardian", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "DataServicePausablePauseGuardianNoChange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + } + ], + "name": "DirectoryNotDisputeManager", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "LegacyAllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAvailable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRequired", + "type": "uint256" + } + ], + "name": "ProvisionTrackerInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationIsAltruistic", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceCannotForceCloseAllocation", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyGeohash", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyUrl", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + } + ], + "name": "SubgraphServiceInconsistentCollection", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceIndexerAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "providedIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerMismatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerNotRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + } + ], + "name": "SubgraphServiceInvalidCollectionId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "SubgraphServiceInvalidCurationCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "SubgraphServiceInvalidPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ravIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceInvalidRAV", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "forceClosed", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "AllocationCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldTokens", + "type": "uint256" + } + ], + "name": "AllocationResized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "CurationCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensIndexerRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "poiMetadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "IndexingRewardsCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "LegacyAllocationMigrated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxPOIStaleness", + "type": "uint256" + } + ], + "name": "MaxPOIStalenessSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "PauseGuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "paymentsDestination", + "type": "address" + } + ], + "name": "PaymentsDestinationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCurators", + "type": "uint256" + } + ], + "name": "QueryFeesCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "StakeToFeesRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "subgraphService", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "name": "SubgraphServiceDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "allocationProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nextClaim", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "claimsLists", + "outputs": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "closeStaleAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "curationFeesCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "encodeAllocationProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "feesProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastPOIPresentedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + } + ], + "internalType": "struct Allocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCuration", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputeManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGraphTallyCollector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getLegacyAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct LegacyAllocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "indexers", + "outputs": [ + { + "internalType": "uint256", + "name": "registeredAt", + "type": "uint256" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "string", + "name": "geoHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maximumDelegationRatio", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "isOverAllocated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxPOIStaleness", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "migrateLegacyAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "pauseGuardians", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "paymentsDestination", + "outputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "resizeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "setCurationCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "setDelegationRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxPOIStaleness_", + "type": "uint256" + } + ], + "name": "setMaxPOIStaleness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + } + ], + "name": "setMinimumProvisionTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "paymentsDestination_", + "type": "address" + } + ], + "name": "setPaymentsDestination", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "setStakeToFeesRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeToFeesRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61024060405234801561001157600080fd5b5060405161667738038061667783398101604081905261003091610541565b3083838387806001600160a01b03811661007f5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b7906103c5565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100ea906103c5565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b6020820152610123906103c5565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015d906103c5565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b6020820152610195906103c5565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101d0906103c5565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020e906103c5565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024a906103c5565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027f906103c5565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103299790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b038481166101c08190528482166101e08190528483166102008190529284166102208190526040805193845260208401929092529082019290925260608101919091527f4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda79060800160405180910390a1505050506103bc61047360201b60201c565b50505050610605565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161040091815260200190565b602060405180830381865afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104419190610595565b9050826001600160a01b03821661046c5760405163218f5add60e11b815260040161007691906105b7565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104c35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146105225780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b038116811461053c57600080fd5b919050565b6000806000806080858703121561055757600080fd5b61056085610525565b935061056e60208601610525565b925061057c60408601610525565b915061058a60608601610525565b905092959194509250565b6000602082840312156105a757600080fd5b6105b082610525565b9392505050565b602081526000825180602084015260005b818110156105e557602081860181015160408684010152016105c8565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051615fd961069e6000396000612ee2015260006132de01526000818161163b0152612fe101526000505060005050600050506000505060006137080152600061457c01526000505060005050600050506000611b6b01526000613a640152615fd96000f3fe608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphServiceProxy.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphServiceProxy.json new file mode 100644 index 000000000..bd6209923 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphServiceProxy.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "ERC1967InvalidAdmin", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyDeniedAdminAccess", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x60a060405260405162000e5038038062000e508339810160408190526200002691620003bc565b828162000034828262000099565b50508160405162000045906200035a565b6001600160a01b039091168152602001604051809103905ff0801580156200006f573d5f803e3d5ffd5b506001600160a01b0316608052620000906200008a60805190565b620000fe565b505050620004b3565b620000a4826200016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000f057620000eb8282620001ee565b505050565b620000fa62000267565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200013f5f8051602062000e30833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16200016c8162000289565b50565b806001600160a01b03163b5f03620001aa57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516200020c919062000496565b5f60405180830381855af49150503d805f811462000246576040519150601f19603f3d011682016040523d82523d5f602084013e6200024b565b606091505b5090925090506200025e858383620002ca565b95945050505050565b3415620002875760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002b457604051633173bdd160e11b81525f6004820152602401620001a1565b805f8051602062000e30833981519152620001cd565b606082620002e357620002dd8262000330565b62000329565b8151158015620002fb57506001600160a01b0384163b155b156200032657604051639996b31560e01b81526001600160a01b0385166004820152602401620001a1565b50805b9392505050565b805115620003415780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6104fc806200093483390190565b80516001600160a01b03811681146200037f575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620003b45781810151838201526020016200039a565b50505f910152565b5f805f60608486031215620003cf575f80fd5b620003da8462000368565b9250620003ea6020850162000368565b60408501519092506001600160401b038082111562000407575f80fd5b818601915086601f8301126200041b575f80fd5b81518181111562000430576200043062000384565b604051601f8201601f19908116603f011681019083821181831017156200045b576200045b62000384565b8160405282815289602084870101111562000474575f80fd5b6200048783602083016020880162000398565b80955050505050509250925092565b5f8251620004a981846020870162000398565b9190910192915050565b608051610469620004cb5f395f601001526104695ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212201a31c3db442064e980907a5ca999ca52c132d057688e882222814e029a3aad9064736f6c63430008180033608060405234801561000f575f80fd5b506040516104fc3803806104fc83398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b610407806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea2646970667358221220098134bf3dcb274377e55b14b69b89c7eefde1171c4c5b1eb6233b5158fa785b64736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea26469706673582212201a31c3db442064e980907a5ca999ca52c132d057688e882222814e029a3aad9064736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService_ProxyWithABI.json new file mode 100644 index 000000000..ad479761b --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphService#SubgraphService_ProxyWithABI.json @@ -0,0 +1,2268 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SubgraphService", + "sourceName": "contracts/SubgraphService.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + } + ], + "name": "AllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationDoesNotExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerAllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "AllocationManagerAllocationSameSize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerInvalidAllocationProof", + "type": "error" + }, + { + "inputs": [], + "name": "AllocationManagerInvalidZeroAllocationId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "DataServicePausableNotPauseGuardian", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "DataServicePausablePauseGuardianNoChange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + } + ], + "name": "DirectoryNotDisputeManager", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "LegacyAllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAvailable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRequired", + "type": "uint256" + } + ], + "name": "ProvisionTrackerInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationIsAltruistic", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceCannotForceCloseAllocation", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyGeohash", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyUrl", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + } + ], + "name": "SubgraphServiceInconsistentCollection", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceIndexerAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "providedIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerMismatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerNotRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + } + ], + "name": "SubgraphServiceInvalidCollectionId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "SubgraphServiceInvalidCurationCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "SubgraphServiceInvalidPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ravIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceInvalidRAV", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "forceClosed", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "AllocationCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldTokens", + "type": "uint256" + } + ], + "name": "AllocationResized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "CurationCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensIndexerRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "poiMetadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "IndexingRewardsCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "LegacyAllocationMigrated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxPOIStaleness", + "type": "uint256" + } + ], + "name": "MaxPOIStalenessSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "PauseGuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "paymentsDestination", + "type": "address" + } + ], + "name": "PaymentsDestinationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCurators", + "type": "uint256" + } + ], + "name": "QueryFeesCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "StakeToFeesRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "subgraphService", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "name": "SubgraphServiceDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "allocationProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nextClaim", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "claimsLists", + "outputs": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "closeStaleAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "curationFeesCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "encodeAllocationProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "feesProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastPOIPresentedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + } + ], + "internalType": "struct Allocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCuration", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputeManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGraphTallyCollector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getLegacyAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct LegacyAllocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "indexers", + "outputs": [ + { + "internalType": "uint256", + "name": "registeredAt", + "type": "uint256" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "string", + "name": "geoHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maximumDelegationRatio", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "isOverAllocated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxPOIStaleness", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "migrateLegacyAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "pauseGuardians", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "paymentsDestination", + "outputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "resizeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "setCurationCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "setDelegationRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxPOIStaleness_", + "type": "uint256" + } + ], + "name": "setMaxPOIStaleness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + } + ], + "name": "setMinimumProvisionTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "paymentsDestination_", + "type": "address" + } + ], + "name": "setPaymentsDestination", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "setStakeToFeesRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeToFeesRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61024060405234801561001157600080fd5b5060405161667738038061667783398101604081905261003091610541565b3083838387806001600160a01b03811661007f5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b7906103c5565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100ea906103c5565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b6020820152610123906103c5565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015d906103c5565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b6020820152610195906103c5565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101d0906103c5565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020e906103c5565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024a906103c5565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027f906103c5565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103299790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b038481166101c08190528482166101e08190528483166102008190529284166102208190526040805193845260208401929092529082019290925260608101919091527f4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda79060800160405180910390a1505050506103bc61047360201b60201c565b50505050610605565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161040091815260200190565b602060405180830381865afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104419190610595565b9050826001600160a01b03821661046c5760405163218f5add60e11b815260040161007691906105b7565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104c35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146105225780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b038116811461053c57600080fd5b919050565b6000806000806080858703121561055757600080fd5b61056085610525565b935061056e60208601610525565b925061057c60408601610525565b915061058a60608601610525565b905092959194509250565b6000602082840312156105a757600080fd5b6105b082610525565b9392505050565b602081526000825180602084015260005b818110156105e557602081860181015160408684010152016105c8565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051615fd961069e6000396000612ee2015260006132de01526000818161163b0152612fe101526000505060005050600050506000505060006137080152600061457c01526000505060005050600050506000611b6b01526000613a640152615fd96000f3fe608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#DisputeManager_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#DisputeManager_ProxyWithABI.json new file mode 100644 index 000000000..45c7dd257 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#DisputeManager_ProxyWithABI.json @@ -0,0 +1,1557 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "DisputeManager", + "sourceName": "contracts/DisputeManager.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedLength", + "type": "uint256" + } + ], + "name": "AttestationInvalidBytesLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeAlreadyCreated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeNotInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + } + ], + "name": "DisputeManagerDisputeNotPending", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodNotFinished", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "DisputeManagerIndexerNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerInvalidDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidDisputeDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "cut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidFishermanReward", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidMaxSlashingCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensSlash", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidTokensSlash", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerMustAcceptRelatedDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "requestCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonConflictingAttestations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotArbitrator", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotFisherman", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerSubgraphServiceNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "ArbitratorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeDepositSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeDrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId1", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId2", + "type": "bytes32" + } + ], + "name": "DisputeLinked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "DisputePeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "fishermanRewardCut", + "type": "uint32" + } + ], + "name": "FishermanRewardCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "IndexingDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "LegacyDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "MaxSlashingCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "attestation", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "QueryDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "subgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FISHERMAN_REWARD_CUT", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_DISPUTE_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + } + ], + "name": "acceptDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "acceptDisputeInConflict", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "tokensSlashRelated", + "type": "uint256" + } + ], + "name": "acceptDisputeConflict", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "arbitrator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation2", + "type": "tuple" + } + ], + "name": "areConflictingAttestations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "cancelDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "createAndAcceptLegacyDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "createIndexingDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData", + "type": "bytes" + } + ], + "name": "createQueryDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "attestationData2", + "type": "bytes" + } + ], + "name": "createQueryDisputeConflict", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disputeDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "disputes", + "outputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + }, + { + "internalType": "enum IDisputeManager.DisputeType", + "name": "disputeType", + "type": "uint8" + }, + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "drawDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct Attestation.Receipt", + "name": "receipt", + "type": "tuple" + } + ], + "name": "encodeReceipt", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation", + "type": "tuple" + } + ], + "name": "getAttestationIndexer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getStakeSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "arbitrator_", + "type": "address" + }, + { + "internalType": "uint64", + "name": "disputePeriod_", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "disputeDeposit_", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "isDisputeCreated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxSlashingCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "rejectDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "setArbitrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "setDisputeDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "setDisputePeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + } + ], + "name": "setFishermanRewardCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "setMaxSlashingCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "subgraphService_", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract ISubgraphService", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101c060405234801561001157600080fd5b50604051613b6e380380613b6e8339810160408190526100309161049b565b806001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b29061033b565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e59061033b565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e9061033b565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b60208201526101589061033b565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b60208201526101909061033b565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb9061033b565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102099061033b565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102459061033b565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a9061033b565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a4506103356103e9565b50610519565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161037691815260200190565b602060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b7919061049b565b9050826001600160a01b0382166103e25760405163218f5add60e11b815260040161007191906104cb565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104395760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104985780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156104ad57600080fd5b81516001600160a01b03811681146104c457600080fd5b9392505050565b602081526000825180602084015260005b818110156104f957602081860181015160408684010152016104dc565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516135f261057c60003960005050600050506000505060005050600050506000505060005050600050506000611f23015260006119cc01526135f26000f3fe608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_DisputeManager.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_DisputeManager.json new file mode 100644 index 000000000..bbe4fe0cb --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_DisputeManager.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Dummy", + "sourceName": "contracts/mocks/Dummy.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "deployedBytecode": "0x6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_SubgraphService.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_SubgraphService.json new file mode 100644 index 000000000..bbe4fe0cb --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#OZProxyDummy_SubgraphService.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Dummy", + "sourceName": "contracts/mocks/Dummy.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "deployedBytecode": "0x6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_DisputeManager.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_DisputeManager.json new file mode 100644 index 000000000..d09104f29 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_DisputeManager.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "deployedBytecode": "0x60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_SubgraphService.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_SubgraphService.json new file mode 100644 index 000000000..d09104f29 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#ProxyAdmin_SubgraphService.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "deployedBytecode": "0x60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#SubgraphService_ProxyWithABI.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#SubgraphService_ProxyWithABI.json new file mode 100644 index 000000000..ad479761b --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#SubgraphService_ProxyWithABI.json @@ -0,0 +1,2268 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SubgraphService", + "sourceName": "contracts/SubgraphService.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + } + ], + "name": "AllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationDoesNotExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerAllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "AllocationManagerAllocationSameSize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerInvalidAllocationProof", + "type": "error" + }, + { + "inputs": [], + "name": "AllocationManagerInvalidZeroAllocationId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "DataServicePausableNotPauseGuardian", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "DataServicePausablePauseGuardianNoChange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + } + ], + "name": "DirectoryNotDisputeManager", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "LegacyAllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAvailable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRequired", + "type": "uint256" + } + ], + "name": "ProvisionTrackerInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationIsAltruistic", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceCannotForceCloseAllocation", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyGeohash", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyUrl", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + } + ], + "name": "SubgraphServiceInconsistentCollection", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceIndexerAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "providedIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerMismatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerNotRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + } + ], + "name": "SubgraphServiceInvalidCollectionId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "SubgraphServiceInvalidCurationCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "SubgraphServiceInvalidPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ravIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceInvalidRAV", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "forceClosed", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "AllocationCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldTokens", + "type": "uint256" + } + ], + "name": "AllocationResized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "CurationCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensIndexerRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "poiMetadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "IndexingRewardsCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "LegacyAllocationMigrated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxPOIStaleness", + "type": "uint256" + } + ], + "name": "MaxPOIStalenessSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "PauseGuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "paymentsDestination", + "type": "address" + } + ], + "name": "PaymentsDestinationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCurators", + "type": "uint256" + } + ], + "name": "QueryFeesCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "StakeToFeesRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "subgraphService", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "name": "SubgraphServiceDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "allocationProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nextClaim", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "claimsLists", + "outputs": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "closeStaleAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "curationFeesCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "encodeAllocationProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "feesProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastPOIPresentedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + } + ], + "internalType": "struct Allocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCuration", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputeManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGraphTallyCollector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getLegacyAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct LegacyAllocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "indexers", + "outputs": [ + { + "internalType": "uint256", + "name": "registeredAt", + "type": "uint256" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "string", + "name": "geoHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maximumDelegationRatio", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "isOverAllocated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxPOIStaleness", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "migrateLegacyAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "pauseGuardians", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "paymentsDestination", + "outputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "resizeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "setCurationCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "setDelegationRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxPOIStaleness_", + "type": "uint256" + } + ], + "name": "setMaxPOIStaleness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + } + ], + "name": "setMinimumProvisionTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "paymentsDestination_", + "type": "address" + } + ], + "name": "setPaymentsDestination", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "setStakeToFeesRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeToFeesRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61024060405234801561001157600080fd5b5060405161667738038061667783398101604081905261003091610541565b3083838387806001600160a01b03811661007f5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b7906103c5565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100ea906103c5565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b6020820152610123906103c5565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015d906103c5565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b6020820152610195906103c5565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101d0906103c5565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020e906103c5565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024a906103c5565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027f906103c5565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103299790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b038481166101c08190528482166101e08190528483166102008190529284166102208190526040805193845260208401929092529082019290925260608101919091527f4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda79060800160405180910390a1505050506103bc61047360201b60201c565b50505050610605565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161040091815260200190565b602060405180830381865afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104419190610595565b9050826001600160a01b03821661046c5760405163218f5add60e11b815260040161007691906105b7565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104c35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146105225780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b038116811461053c57600080fd5b919050565b6000806000806080858703121561055757600080fd5b61056085610525565b935061056e60208601610525565b925061057c60408601610525565b915061058a60608601610525565b905092959194509250565b6000602082840312156105a757600080fd5b6105b082610525565b9392505050565b602081526000825180602084015260005b818110156105e557602081860181015160408684010152016105c8565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051615fd961069e6000396000612ee2015260006132de01526000818161163b0152612fe101526000505060005050600050506000505060006137080152600061457c01526000505060005050600050506000611b6b01526000613a640152615fd96000f3fe608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager.json new file mode 100644 index 000000000..ac5363776 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "ERC1967InvalidAdmin", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyDeniedAdminAccess", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService.json b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService.json new file mode 100644 index 000000000..ac5363776 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/artifacts/SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "name": "ERC1967InvalidAdmin", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyDeniedAdminAccess", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/build-info/81754efc7e2eec76b7d493cc60c0f970.json b/packages/subgraph-service/ignition/deployments/chain-421614/build-info/81754efc7e2eec76b7d493cc60c0f970.json new file mode 100644 index 000000000..f62122864 --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/build-info/81754efc7e2eec76b7d493cc60c0f970.json @@ -0,0 +1,311681 @@ +{ + "id": "81754efc7e2eec76b7d493cc60c0f970", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.27", + "solcLongVersion": "0.8.27+commit.40a35a09", + "input": { + "language": "Solidity", + "sources": { + "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\n\n/*\n * Copyright 2020, Offchain Labs, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Originally copied from:\n * https://github.com/OffchainLabs/arbitrum/tree/e3a6307ad8a2dc2cad35728a2a9908cfd8dd8ef9/packages/arb-bridge-peripherals\n *\n * MODIFIED from Offchain Labs' implementation:\n * - Changed solidity version to 0.7.6 (pablo@edgeandnode.com)\n *\n */\n\npragma solidity ^0.7.6 || 0.8.27;\n\ninterface ITokenGateway {\n /// @notice event deprecated in favor of DepositInitiated and WithdrawalInitiated\n // event OutboundTransferInitiated(\n // address token,\n // address indexed _from,\n // address indexed _to,\n // uint256 indexed _transferId,\n // uint256 _amount,\n // bytes _data\n // );\n\n /// @notice event deprecated in favor of DepositFinalized and WithdrawalFinalized\n // event InboundTransferFinalized(\n // address token,\n // address indexed _from,\n // address indexed _to,\n // uint256 indexed _transferId,\n // uint256 _amount,\n // bytes _data\n // );\n\n function outboundTransfer(\n address token,\n address to,\n uint256 amunt,\n uint256 maxas,\n uint256 gasPiceBid,\n bytes calldata data\n ) external payable returns (bytes memory);\n\n function finalizeInboundTransfer(\n address token,\n address from,\n address to,\n uint256 amount,\n bytes calldata data\n ) external payable;\n\n /**\n * @notice Calculate the address used when bridging an ERC20 token\n * @dev the L1 and L2 address oracles may not always be in sync.\n * For example, a custom token may have been registered but not deployed or the contract self destructed.\n * @param l1ERC20 address of L1 token\n * @return L2 address of a bridged ERC20 token\n */\n function calculateL2TokenAddress(address l1ERC20) external view returns (address);\n}\n" + }, + "@graphprotocol/contracts/contracts/curation/ICuration.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\n/**\n * @title Curation Interface\n * @dev Interface for the Curation contract (and L2Curation too)\n */\ninterface ICuration {\n // -- Configuration --\n\n /**\n * @notice Update the default reserve ratio to `_defaultReserveRatio`\n * @param _defaultReserveRatio Reserve ratio (in PPM)\n */\n function setDefaultReserveRatio(uint32 _defaultReserveRatio) external;\n\n /**\n * @notice Update the minimum deposit amount needed to intialize a new subgraph\n * @param _minimumCurationDeposit Minimum amount of tokens required deposit\n */\n function setMinimumCurationDeposit(uint256 _minimumCurationDeposit) external;\n\n /**\n * @notice Set the curation tax percentage to charge when a curator deposits GRT tokens.\n * @param _percentage Curation tax percentage charged when depositing GRT tokens\n */\n function setCurationTaxPercentage(uint32 _percentage) external;\n\n /**\n * @notice Set the master copy to use as clones for the curation token.\n * @param _curationTokenMaster Address of implementation contract to use for curation tokens\n */\n function setCurationTokenMaster(address _curationTokenMaster) external;\n\n // -- Curation --\n\n /**\n * @notice Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool.\n * @param _subgraphDeploymentID Subgraph deployment pool from where to mint signal\n * @param _tokensIn Amount of Graph Tokens to deposit\n * @param _signalOutMin Expected minimum amount of signal to receive\n * @return Amount of signal minted\n * @return Amount of curation tax burned\n */\n function mint(\n bytes32 _subgraphDeploymentID,\n uint256 _tokensIn,\n uint256 _signalOutMin\n ) external returns (uint256, uint256);\n\n /**\n * @notice Burn _signal from the SubgraphDeployment curation pool\n * @param _subgraphDeploymentID SubgraphDeployment the curator is returning signal\n * @param _signalIn Amount of signal to return\n * @param _tokensOutMin Expected minimum amount of tokens to receive\n * @return Tokens returned\n */\n function burn(bytes32 _subgraphDeploymentID, uint256 _signalIn, uint256 _tokensOutMin) external returns (uint256);\n\n /**\n * @notice Assign Graph Tokens collected as curation fees to the curation pool reserve.\n * @param _subgraphDeploymentID SubgraphDeployment where funds should be allocated as reserves\n * @param _tokens Amount of Graph Tokens to add to reserves\n */\n function collect(bytes32 _subgraphDeploymentID, uint256 _tokens) external;\n\n // -- Getters --\n\n /**\n * @notice Check if any GRT tokens are deposited for a SubgraphDeployment.\n * @param _subgraphDeploymentID SubgraphDeployment to check if curated\n * @return True if curated, false otherwise\n */\n function isCurated(bytes32 _subgraphDeploymentID) external view returns (bool);\n\n /**\n * @notice Get the amount of signal a curator has in a curation pool.\n * @param _curator Curator owning the signal tokens\n * @param _subgraphDeploymentID Subgraph deployment curation pool\n * @return Amount of signal owned by a curator for the subgraph deployment\n */\n function getCuratorSignal(address _curator, bytes32 _subgraphDeploymentID) external view returns (uint256);\n\n /**\n * @notice Get the amount of signal in a curation pool.\n * @param _subgraphDeploymentID Subgraph deployment curation pool\n * @return Amount of signal minted for the subgraph deployment\n */\n function getCurationPoolSignal(bytes32 _subgraphDeploymentID) external view returns (uint256);\n\n /**\n * @notice Get the amount of token reserves in a curation pool.\n * @param _subgraphDeploymentID Subgraph deployment curation pool\n * @return Amount of token reserves in the curation pool\n */\n function getCurationPoolTokens(bytes32 _subgraphDeploymentID) external view returns (uint256);\n\n /**\n * @notice Calculate amount of signal that can be bought with tokens in a curation pool.\n * This function considers and excludes the deposit tax.\n * @param _subgraphDeploymentID Subgraph deployment to mint signal\n * @param _tokensIn Amount of tokens used to mint signal\n * @return Amount of signal that can be bought\n * @return Amount of tokens that will be burned as curation tax\n */\n function tokensToSignal(bytes32 _subgraphDeploymentID, uint256 _tokensIn) external view returns (uint256, uint256);\n\n /**\n * @notice Calculate number of tokens to get when burning signal from a curation pool.\n * @param _subgraphDeploymentID Subgraph deployment to burn signal\n * @param _signalIn Amount of signal to burn\n * @return Amount of tokens to get for the specified amount of signal\n */\n function signalToTokens(bytes32 _subgraphDeploymentID, uint256 _signalIn) external view returns (uint256);\n\n /**\n * @notice Tax charged when curators deposit funds.\n * Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%)\n * @return Curation tax percentage expressed in PPM\n */\n function curationTaxPercentage() external view returns (uint32);\n}\n" + }, + "@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity >=0.6.12 <0.8.0 || 0.8.27;\npragma abicoder v2;\n\ninterface IDisputeManager {\n // -- Dispute --\n\n enum DisputeType {\n Null,\n IndexingDispute,\n QueryDispute\n }\n\n enum DisputeStatus {\n Null,\n Accepted,\n Rejected,\n Drawn,\n Pending\n }\n\n // Disputes contain info necessary for the Arbitrator to verify and resolve\n struct Dispute {\n address indexer;\n address fisherman;\n uint256 deposit;\n bytes32 relatedDisputeID;\n DisputeType disputeType;\n DisputeStatus status;\n }\n\n // -- Attestation --\n\n // Receipt content sent from indexer in response to request\n struct Receipt {\n bytes32 requestCID;\n bytes32 responseCID;\n bytes32 subgraphDeploymentID;\n }\n\n // Attestation sent from indexer in response to a request\n struct Attestation {\n bytes32 requestCID;\n bytes32 responseCID;\n bytes32 subgraphDeploymentID;\n bytes32 r;\n bytes32 s;\n uint8 v;\n }\n\n // -- Configuration --\n\n function setArbitrator(address _arbitrator) external;\n\n function setMinimumDeposit(uint256 _minimumDeposit) external;\n\n function setFishermanRewardPercentage(uint32 _percentage) external;\n\n function setSlashingPercentage(uint32 _qryPercentage, uint32 _idxPercentage) external;\n\n // -- Getters --\n\n function isDisputeCreated(bytes32 _disputeID) external view returns (bool);\n\n function encodeHashReceipt(Receipt memory _receipt) external view returns (bytes32);\n\n function areConflictingAttestations(\n Attestation memory _attestation1,\n Attestation memory _attestation2\n ) external pure returns (bool);\n\n function getAttestationIndexer(Attestation memory _attestation) external view returns (address);\n\n // -- Dispute --\n\n function createQueryDispute(bytes calldata _attestationData, uint256 _deposit) external returns (bytes32);\n\n function createQueryDisputeConflict(\n bytes calldata _attestationData1,\n bytes calldata _attestationData2\n ) external returns (bytes32, bytes32);\n\n function createIndexingDispute(address _allocationID, uint256 _deposit) external returns (bytes32);\n\n function acceptDispute(bytes32 _disputeID) external;\n\n function rejectDispute(bytes32 _disputeID) external;\n\n function drawDispute(bytes32 _disputeID) external;\n}\n" + }, + "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\ninterface IEpochManager {\n // -- Configuration --\n\n function setEpochLength(uint256 _epochLength) external;\n\n // -- Epochs\n\n function runEpoch() external;\n\n // -- Getters --\n\n function isCurrentEpochRun() external view returns (bool);\n\n function blockNum() external view returns (uint256);\n\n function blockHash(uint256 _block) external view returns (bytes32);\n\n function currentEpoch() external view returns (uint256);\n\n function currentEpochBlock() external view returns (uint256);\n\n function currentEpochBlockSinceStart() external view returns (uint256);\n\n function epochsSince(uint256 _epoch) external view returns (uint256);\n\n function epochsSinceUpdate() external view returns (uint256);\n}\n" + }, + "@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\n/**\n * @title Interface for contracts that can receive callhooks through the Arbitrum GRT bridge\n * @dev Any contract that can receive a callhook on L2, sent through the bridge from L1, must\n * be allowlisted by the governor, but also implement this interface that contains\n * the function that will actually be called by the L2GraphTokenGateway.\n */\npragma solidity ^0.7.6 || 0.8.27;\n\ninterface ICallhookReceiver {\n /**\n * @notice Receive tokens with a callhook from the bridge\n * @param _from Token sender in L1\n * @param _amount Amount of tokens that were transferred\n * @param _data ABI-encoded callhook data\n */\n function onTokenTransfer(address _from, uint256 _amount, bytes calldata _data) external;\n}\n" + }, + "@graphprotocol/contracts/contracts/governance/IController.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\ninterface IController {\n function getGovernor() external view returns (address);\n\n // -- Registry --\n\n function setContractProxy(bytes32 _id, address _contractAddress) external;\n\n function unsetContractProxy(bytes32 _id) external;\n\n function updateController(bytes32 _id, address _controller) external;\n\n function getContractProxy(bytes32 _id) external view returns (address);\n\n // -- Pausing --\n\n function setPartialPaused(bool _partialPaused) external;\n\n function setPaused(bool _paused) external;\n\n function setPauseGuardian(address _newPauseGuardian) external;\n\n function paused() external view returns (bool);\n\n function partialPaused() external view returns (bool);\n}\n" + }, + "@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\n/**\n * @title Interface of the L2 Curation contract.\n */\ninterface IL2Curation {\n /**\n * @notice Set the subgraph service address.\n * @param _subgraphService Address of the SubgraphService contract\n */\n function setSubgraphService(address _subgraphService) external;\n\n /**\n * @notice Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool.\n * @dev This function charges no tax and can only be called by GNS in specific scenarios (for now\n * only during an L1-L2 transfer).\n * @param _subgraphDeploymentID Subgraph deployment pool from where to mint signal\n * @param _tokensIn Amount of Graph Tokens to deposit\n * @return Signal minted\n */\n function mintTaxFree(bytes32 _subgraphDeploymentID, uint256 _tokensIn) external returns (uint256);\n\n /**\n * @notice Calculate amount of signal that can be bought with tokens in a curation pool,\n * without accounting for curation tax.\n * @param _subgraphDeploymentID Subgraph deployment for which to mint signal\n * @param _tokensIn Amount of tokens used to mint signal\n * @return Amount of signal that can be bought\n */\n function tokensToSignalNoTax(bytes32 _subgraphDeploymentID, uint256 _tokensIn) external view returns (uint256);\n\n /**\n * @notice Calculate the amount of tokens that would be recovered if minting signal with\n * the input tokens and then burning it. This can be used to compute rounding error.\n * This function does not account for curation tax.\n * @param _subgraphDeploymentID Subgraph deployment for which to mint signal\n * @param _tokensIn Amount of tokens used to mint signal\n * @return Amount of tokens that would be recovered after minting and burning signal\n */\n function tokensToSignalToTokensNoTax(\n bytes32 _subgraphDeploymentID,\n uint256 _tokensIn\n ) external view returns (uint256);\n}\n" + }, + "@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\nimport { ICallhookReceiver } from \"../../gateway/ICallhookReceiver.sol\";\n\n/**\n * @title Interface for the L2GNS contract.\n */\ninterface IL2GNS is ICallhookReceiver {\n enum L1MessageCodes {\n RECEIVE_SUBGRAPH_CODE,\n RECEIVE_CURATOR_BALANCE_CODE\n }\n\n /**\n * @dev The SubgraphL2TransferData struct holds information\n * about a subgraph related to its transfer from L1 to L2.\n */\n struct SubgraphL2TransferData {\n uint256 tokens; // GRT that will be sent to L2 to mint signal\n mapping(address => bool) curatorBalanceClaimed; // True for curators whose balance has been claimed in L2\n bool l2Done; // Transfer finished on L2 side\n uint256 subgraphReceivedOnL2BlockNumber; // Block number when the subgraph was received on L2\n }\n\n /**\n * @notice Finish a subgraph transfer from L1.\n * The subgraph must have been previously sent through the bridge\n * using the sendSubgraphToL2 function on L1GNS.\n * @param _l2SubgraphID Subgraph ID in L2 (aliased from the L1 subgraph ID)\n * @param _subgraphDeploymentID Latest subgraph deployment to assign to the subgraph\n * @param _subgraphMetadata IPFS hash of the subgraph metadata\n * @param _versionMetadata IPFS hash of the version metadata\n */\n function finishSubgraphTransferFromL1(\n uint256 _l2SubgraphID,\n bytes32 _subgraphDeploymentID,\n bytes32 _subgraphMetadata,\n bytes32 _versionMetadata\n ) external;\n\n /**\n * @notice Return the aliased L2 subgraph ID from a transferred L1 subgraph ID\n * @param _l1SubgraphID L1 subgraph ID\n * @return L2 subgraph ID\n */\n function getAliasedL2SubgraphID(uint256 _l1SubgraphID) external pure returns (uint256);\n\n /**\n * @notice Return the unaliased L1 subgraph ID from a transferred L2 subgraph ID\n * @param _l2SubgraphID L2 subgraph ID\n * @return L1subgraph ID\n */\n function getUnaliasedL1SubgraphID(uint256 _l2SubgraphID) external pure returns (uint256);\n}\n" + }, + "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\ninterface IRewardsIssuer {\n /**\n * @dev Get allocation data to calculate rewards issuance\n * \n * @param allocationId The allocation Id\n * @return isActive Whether the allocation is active or not\n * @return indexer The indexer address\n * @return subgraphDeploymentId Subgraph deployment id for the allocation\n * @return tokens Amount of allocated tokens\n * @return accRewardsPerAllocatedToken Rewards snapshot\n * @return accRewardsPending Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed\n */\n function getAllocationData(\n address allocationId\n )\n external\n view\n returns (\n bool isActive,\n address indexer,\n bytes32 subgraphDeploymentId,\n uint256 tokens,\n uint256 accRewardsPerAllocatedToken,\n uint256 accRewardsPending\n );\n\n /**\n * @notice Return the total amount of tokens allocated to subgraph.\n * @param _subgraphDeploymentId Deployment Id for the subgraph\n * @return Total tokens allocated to subgraph\n */\n function getSubgraphAllocatedTokens(bytes32 _subgraphDeploymentId) external view returns (uint256);\n}\n" + }, + "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\ninterface IRewardsManager {\n /**\n * @dev Stores accumulated rewards and snapshots related to a particular SubgraphDeployment.\n */\n struct Subgraph {\n uint256 accRewardsForSubgraph;\n uint256 accRewardsForSubgraphSnapshot;\n uint256 accRewardsPerSignalSnapshot;\n uint256 accRewardsPerAllocatedToken;\n }\n\n // -- Config --\n\n function setIssuancePerBlock(uint256 _issuancePerBlock) external;\n\n function setMinimumSubgraphSignal(uint256 _minimumSubgraphSignal) external;\n\n function setSubgraphService(address _subgraphService) external;\n\n // -- Denylist --\n\n function setSubgraphAvailabilityOracle(address _subgraphAvailabilityOracle) external;\n\n function setDenied(bytes32 _subgraphDeploymentID, bool _deny) external;\n\n function isDenied(bytes32 _subgraphDeploymentID) external view returns (bool);\n\n // -- Getters --\n\n function getNewRewardsPerSignal() external view returns (uint256);\n\n function getAccRewardsPerSignal() external view returns (uint256);\n\n function getAccRewardsForSubgraph(bytes32 _subgraphDeploymentID) external view returns (uint256);\n\n function getAccRewardsPerAllocatedToken(bytes32 _subgraphDeploymentID) external view returns (uint256, uint256);\n\n function getRewards(address _rewardsIssuer, address _allocationID) external view returns (uint256);\n\n function calcRewards(uint256 _tokens, uint256 _accRewardsPerAllocatedToken) external pure returns (uint256);\n\n // -- Updates --\n\n function updateAccRewardsPerSignal() external returns (uint256);\n\n function takeRewards(address _allocationID) external returns (uint256);\n\n // -- Hooks --\n\n function onSubgraphSignalUpdate(bytes32 _subgraphDeploymentID) external returns (uint256);\n\n function onSubgraphAllocationUpdate(bytes32 _subgraphDeploymentID) external returns (uint256);\n}\n" + }, + "@graphprotocol/contracts/contracts/token/IGraphToken.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface IGraphToken is IERC20 {\n // -- Mint and Burn --\n\n function burn(uint256 amount) external;\n\n function burnFrom(address _from, uint256 amount) external;\n\n function mint(address _to, uint256 _amount) external;\n\n // -- Mint Admin --\n\n function addMinter(address _account) external;\n\n function removeMinter(address _account) external;\n\n function renounceMinter() external;\n\n function isMinter(address _account) external view returns (bool);\n\n // -- Permit --\n\n function permit(\n address _owner,\n address _spender,\n uint256 _value,\n uint256 _deadline,\n uint8 _v,\n bytes32 _r,\n bytes32 _s\n ) external;\n\n // -- Allowance --\n\n function increaseAllowance(address spender, uint256 addedValue) external returns (bool);\n\n function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);\n}\n" + }, + "@graphprotocol/contracts/contracts/utils/TokenUtils.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity ^0.7.6 || 0.8.27;\n\nimport \"../token/IGraphToken.sol\";\n\n/**\n * @title TokenUtils library\n * @notice This library contains utility functions for handling tokens (transfers and burns).\n * It is specifically adapted for the GraphToken, so does not need to handle edge cases\n * for other tokens.\n */\nlibrary TokenUtils {\n /**\n * @dev Pull tokens from an address to this contract.\n * @param _graphToken Token to transfer\n * @param _from Address sending the tokens\n * @param _amount Amount of tokens to transfer\n */\n function pullTokens(IGraphToken _graphToken, address _from, uint256 _amount) internal {\n if (_amount > 0) {\n require(_graphToken.transferFrom(_from, address(this), _amount), \"!transfer\");\n }\n }\n\n /**\n * @dev Push tokens from this contract to a receiving address.\n * @param _graphToken Token to transfer\n * @param _to Address receiving the tokens\n * @param _amount Amount of tokens to transfer\n */\n function pushTokens(IGraphToken _graphToken, address _to, uint256 _amount) internal {\n if (_amount > 0) {\n require(_graphToken.transfer(_to, _amount), \"!transfer\");\n }\n }\n\n /**\n * @dev Burn tokens held by this contract.\n * @param _graphToken Token to burn\n * @param _amount Amount of tokens to burn\n */\n function burnTokens(IGraphToken _graphToken, uint256 _amount) internal {\n if (_amount > 0) {\n _graphToken.burn(_amount);\n }\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/DataService.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataService } from \"./interfaces/IDataService.sol\";\n\nimport { DataServiceV1Storage } from \"./DataServiceStorage.sol\";\nimport { GraphDirectory } from \"../utilities/GraphDirectory.sol\";\nimport { ProvisionManager } from \"./utilities/ProvisionManager.sol\";\n\n/**\n * @title DataService contract\n * @dev Implementation of the {IDataService} interface.\n * @notice This implementation provides base functionality for a data service:\n * - GraphDirectory, allows the data service to interact with Graph Horizon contracts\n * - ProvisionManager, provides functionality to manage provisions\n *\n * The derived contract MUST implement all the interfaces described in {IDataService} and in\n * accordance with the Data Service framework.\n * @dev A note on upgradeability: this base contract can be inherited by upgradeable or non upgradeable\n * contracts.\n * - If the data service implementation is upgradeable, it must initialize the contract via an external\n * initializer function with the `initializer` modifier that calls {__DataService_init} or\n * {__DataService_init_unchained}. It's recommended the implementation constructor to also call\n * {_disableInitializers} to prevent the implementation from being initialized.\n * - If the data service implementation is NOT upgradeable, it must initialize the contract by calling\n * {__DataService_init} or {__DataService_init_unchained} in the constructor. Note that the `initializer`\n * will be required in the constructor.\n * - Note that in both cases if using {__DataService_init_unchained} variant the corresponding parent\n * initializers must be called in the implementation.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract DataService is GraphDirectory, ProvisionManager, DataServiceV1Storage, IDataService {\n /**\n * @dev Addresses in GraphDirectory are immutables, they can only be set in this constructor.\n * @param controller The address of the Graph Horizon controller contract.\n */\n constructor(address controller) GraphDirectory(controller) {}\n\n /// @inheritdoc IDataService\n function getThawingPeriodRange() external view returns (uint64, uint64) {\n return _getThawingPeriodRange();\n }\n\n /// @inheritdoc IDataService\n function getVerifierCutRange() external view returns (uint32, uint32) {\n return _getVerifierCutRange();\n }\n\n /// @inheritdoc IDataService\n function getProvisionTokensRange() external view returns (uint256, uint256) {\n return _getProvisionTokensRange();\n }\n\n /// @inheritdoc IDataService\n function getDelegationRatio() external view returns (uint32) {\n return _getDelegationRatio();\n }\n\n /**\n * @notice Initializes the contract and any parent contracts.\n */\n function __DataService_init() internal onlyInitializing {\n __ProvisionManager_init_unchained();\n __DataService_init_unchained();\n }\n\n /**\n * @notice Initializes the contract.\n */\n function __DataService_init_unchained() internal onlyInitializing {}\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title DataServiceStorage\n * @dev This contract holds the storage variables for the DataService contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract DataServiceV1Storage {\n /// @dev Gap to allow adding variables in future upgrades\n /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract\n uint256[50] private __gap;\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataServiceFees } from \"../interfaces/IDataServiceFees.sol\";\n\nimport { ProvisionTracker } from \"../libraries/ProvisionTracker.sol\";\nimport { LinkedList } from \"../../libraries/LinkedList.sol\";\n\nimport { DataService } from \"../DataService.sol\";\nimport { DataServiceFeesV1Storage } from \"./DataServiceFeesStorage.sol\";\n\n/**\n * @title DataServiceFees contract\n * @dev Implementation of the {IDataServiceFees} interface.\n * @notice Extension for the {IDataService} contract to handle payment collateralization\n * using a Horizon provision. See {IDataServiceFees} for more details.\n * @dev This contract inherits from {DataService} which needs to be initialized, please see\n * {DataService} for detailed instructions.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract DataServiceFees is DataService, DataServiceFeesV1Storage, IDataServiceFees {\n using ProvisionTracker for mapping(address => uint256);\n using LinkedList for LinkedList.List;\n\n /// @inheritdoc IDataServiceFees\n function releaseStake(uint256 numClaimsToRelease) external virtual override {\n _releaseStake(msg.sender, numClaimsToRelease);\n }\n\n /**\n * @notice Locks stake for a service provider to back a payment.\n * Creates a stake claim, which is stored in a linked list by service provider.\n * @dev Requirements:\n * - The associated provision must have enough available tokens to lock the stake.\n *\n * Emits a {StakeClaimLocked} event.\n *\n * @param _serviceProvider The address of the service provider\n * @param _tokens The amount of tokens to lock in the claim\n * @param _unlockTimestamp The timestamp when the tokens can be released\n */\n function _lockStake(address _serviceProvider, uint256 _tokens, uint256 _unlockTimestamp) internal {\n require(_tokens != 0, DataServiceFeesZeroTokens());\n feesProvisionTracker.lock(_graphStaking(), _serviceProvider, _tokens, _delegationRatio);\n\n LinkedList.List storage claimsList = claimsLists[_serviceProvider];\n\n // Save item and add to list\n bytes32 claimId = _buildStakeClaimId(_serviceProvider, claimsList.nonce);\n claims[claimId] = StakeClaim({\n tokens: _tokens,\n createdAt: block.timestamp,\n releasableAt: _unlockTimestamp,\n nextClaim: bytes32(0)\n });\n if (claimsList.count != 0) claims[claimsList.tail].nextClaim = claimId;\n claimsList.addTail(claimId);\n\n emit StakeClaimLocked(_serviceProvider, claimId, _tokens, _unlockTimestamp);\n }\n\n /**\n * @notice Releases expired stake claims for a service provider.\n * @dev This function can be overriden and/or disabled.\n * @dev Note that the list is traversed by creation date not by releasableAt date. Traversing will stop\n * when the first stake claim that is not yet expired is found even if later stake claims have expired. This\n * could happen if stake claims are genereted with different unlock periods.\n * @dev Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\n * @param _serviceProvider The address of the service provider\n * @param _numClaimsToRelease Amount of stake claims to process. If 0, all stake claims are processed.\n */\n function _releaseStake(address _serviceProvider, uint256 _numClaimsToRelease) internal {\n LinkedList.List storage claimsList = claimsLists[_serviceProvider];\n (uint256 claimsReleased, bytes memory data) = claimsList.traverse(\n _getNextStakeClaim,\n _processStakeClaim,\n _deleteStakeClaim,\n abi.encode(0, _serviceProvider),\n _numClaimsToRelease\n );\n\n emit StakeClaimsReleased(_serviceProvider, claimsReleased, abi.decode(data, (uint256)));\n }\n\n /**\n * @notice Processes a stake claim, releasing the tokens if the claim has expired.\n * @dev This function is used as a callback in the stake claims linked list traversal.\n * @param _claimId The id of the stake claim\n * @param _acc The accumulator for the stake claims being processed\n * @return Whether the stake claim is still locked, indicating that the traversal should continue or stop.\n * @return The updated accumulator data\n */\n function _processStakeClaim(bytes32 _claimId, bytes memory _acc) private returns (bool, bytes memory) {\n StakeClaim memory claim = _getStakeClaim(_claimId);\n\n // early exit\n if (claim.releasableAt > block.timestamp) {\n return (true, LinkedList.NULL_BYTES);\n }\n\n // decode\n (uint256 tokensClaimed, address serviceProvider) = abi.decode(_acc, (uint256, address));\n\n // process\n feesProvisionTracker.release(serviceProvider, claim.tokens);\n emit StakeClaimReleased(serviceProvider, _claimId, claim.tokens, claim.releasableAt);\n\n // encode\n _acc = abi.encode(tokensClaimed + claim.tokens, serviceProvider);\n return (false, _acc);\n }\n\n /**\n * @notice Deletes a stake claim.\n * @dev This function is used as a callback in the stake claims linked list traversal.\n * @param _claimId The ID of the stake claim to delete\n */\n function _deleteStakeClaim(bytes32 _claimId) private {\n delete claims[_claimId];\n }\n\n /**\n * @notice Gets the details of a stake claim\n * @param _claimId The ID of the stake claim\n * @return The stake claim details\n */\n function _getStakeClaim(bytes32 _claimId) private view returns (StakeClaim memory) {\n StakeClaim memory claim = claims[_claimId];\n require(claim.createdAt != 0, DataServiceFeesClaimNotFound(_claimId));\n return claim;\n }\n\n /**\n * @notice Gets the next stake claim in the linked list\n * @dev This function is used as a callback in the stake claims linked list traversal.\n * @param _claimId The ID of the stake claim\n * @return The next stake claim ID\n */\n function _getNextStakeClaim(bytes32 _claimId) private view returns (bytes32) {\n return claims[_claimId].nextClaim;\n }\n\n /**\n * @notice Builds a stake claim ID\n * @param _serviceProvider The address of the service provider\n * @param _nonce A nonce of the stake claim\n * @return The stake claim ID\n */\n function _buildStakeClaimId(address _serviceProvider, uint256 _nonce) private view returns (bytes32) {\n return keccak256(abi.encodePacked(address(this), _serviceProvider, _nonce));\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataServiceFees } from \"../interfaces/IDataServiceFees.sol\";\n\nimport { LinkedList } from \"../../libraries/LinkedList.sol\";\n\n/**\n * @title Storage layout for the {DataServiceFees} extension contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract DataServiceFeesV1Storage {\n /// @notice The amount of tokens locked in stake claims for each service provider\n mapping(address serviceProvider => uint256 tokens) public feesProvisionTracker;\n\n /// @notice List of all locked stake claims to be released to service providers\n mapping(bytes32 claimId => IDataServiceFees.StakeClaim claim) public claims;\n\n /// @notice Service providers registered in the data service\n mapping(address serviceProvider => LinkedList.List list) public claimsLists;\n\n /// @dev Gap to allow adding variables in future upgrades\n /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract\n uint256[50] private __gap;\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataServicePausable } from \"../interfaces/IDataServicePausable.sol\";\n\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\";\nimport { DataService } from \"../DataService.sol\";\n\n/**\n * @title DataServicePausableUpgradeable contract\n * @dev Implementation of the {IDataServicePausable} interface.\n * @dev Upgradeable version of the {DataServicePausable} contract.\n * @dev This contract inherits from {DataService} which needs to be initialized, please see\n * {DataService} for detailed instructions.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract DataServicePausableUpgradeable is PausableUpgradeable, DataService, IDataServicePausable {\n /// @notice List of pause guardians and their allowed status\n mapping(address pauseGuardian => bool allowed) public pauseGuardians;\n\n /// @dev Gap to allow adding variables in future upgrades\n uint256[50] private __gap;\n\n /**\n * @notice Checks if the caller is a pause guardian.\n */\n modifier onlyPauseGuardian() {\n require(pauseGuardians[msg.sender], DataServicePausableNotPauseGuardian(msg.sender));\n _;\n }\n\n /// @inheritdoc IDataServicePausable\n function pause() external override onlyPauseGuardian {\n _pause();\n }\n\n /// @inheritdoc IDataServicePausable\n function unpause() external override onlyPauseGuardian {\n _unpause();\n }\n\n /**\n * @notice Initializes the contract and parent contracts\n */\n function __DataServicePausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n __DataServicePausable_init_unchained();\n }\n\n /**\n * @notice Initializes the contract\n */\n function __DataServicePausable_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Sets a pause guardian.\n * @dev Internal function to be used by the derived contract to set pause guardians.\n *\n * Emits a {PauseGuardianSet} event.\n *\n * @param _pauseGuardian The address of the pause guardian\n * @param _allowed The allowed status of the pause guardian\n */\n function _setPauseGuardian(address _pauseGuardian, bool _allowed) internal {\n require(\n pauseGuardians[_pauseGuardian] == !_allowed,\n DataServicePausablePauseGuardianNoChange(_pauseGuardian, _allowed)\n );\n pauseGuardians[_pauseGuardian] = _allowed;\n emit PauseGuardianSet(_pauseGuardian, _allowed);\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IGraphPayments } from \"../../interfaces/IGraphPayments.sol\";\n\n/**\n * @title Interface of the base {DataService} contract as defined by the Graph Horizon specification.\n * @notice This interface provides a guardrail for contracts that use the Data Service framework\n * to implement a data service on Graph Horizon. Much of the specification is intentionally loose\n * to allow for greater flexibility when designing a data service. It's not possible to guarantee that\n * an implementation will honor the Data Service framework guidelines so it's advised to always review\n * the implementation code and the documentation.\n * @dev This interface is expected to be inherited and extended by a data service interface. It can be\n * used to interact with it however it's advised to use the more specific parent interface.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IDataService {\n /**\n * @notice Emitted when a service provider is registered with the data service.\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n event ServiceProviderRegistered(address indexed serviceProvider, bytes data);\n\n /**\n * @notice Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\n * @param serviceProvider The address of the service provider.\n */\n event ProvisionPendingParametersAccepted(address indexed serviceProvider);\n\n /**\n * @notice Emitted when a service provider starts providing the service.\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n event ServiceStarted(address indexed serviceProvider, bytes data);\n\n /**\n * @notice Emitted when a service provider stops providing the service.\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n event ServiceStopped(address indexed serviceProvider, bytes data);\n\n /**\n * @notice Emitted when a service provider collects payment.\n * @param serviceProvider The address of the service provider.\n * @param feeType The type of fee to collect as defined in {GraphPayments}.\n * @param tokens The amount of tokens collected.\n */\n event ServicePaymentCollected(\n address indexed serviceProvider,\n IGraphPayments.PaymentTypes indexed feeType,\n uint256 tokens\n );\n\n /**\n * @notice Emitted when a service provider is slashed.\n * @param serviceProvider The address of the service provider.\n * @param tokens The amount of tokens slashed.\n */\n event ServiceProviderSlashed(address indexed serviceProvider, uint256 tokens);\n\n /**\n * @notice Registers a service provider with the data service. The service provider can now\n * start providing the service.\n * @dev Before registering, the service provider must have created a provision in the\n * Graph Horizon staking contract with parameters that are compatible with the data service.\n *\n * Verifies provision parameters and rejects registration in the event they are not valid.\n *\n * Emits a {ServiceProviderRegistered} event.\n *\n * NOTE: Failing to accept the provision will result in the service provider operating\n * on an unverified provision. Depending on of the data service this can be a security\n * risk as the protocol won't be able to guarantee economic security for the consumer.\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n function register(address serviceProvider, bytes calldata data) external;\n\n /**\n * @notice Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking\n * contract}.\n * @dev Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}.\n *\n * Emits a {ProvisionPendingParametersAccepted} event.\n *\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n function acceptProvisionPendingParameters(address serviceProvider, bytes calldata data) external;\n\n /**\n * @notice Service provider starts providing the service.\n * @dev Emits a {ServiceStarted} event.\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n function startService(address serviceProvider, bytes calldata data) external;\n\n /**\n * @notice Service provider stops providing the service.\n * @dev Emits a {ServiceStopped} event.\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n function stopService(address serviceProvider, bytes calldata data) external;\n\n /**\n * @notice Collects payment earnt by the service provider.\n * @dev The implementation of this function is expected to interact with {GraphPayments}\n * to collect payment from the service payer, which is done via {IGraphPayments-collect}.\n *\n * Emits a {ServicePaymentCollected} event.\n *\n * NOTE: Data services that are vetted by the Graph Council might qualify for a portion of\n * protocol issuance to cover for these payments. In this case, the funds are taken by\n * interacting with the rewards manager contract instead of the {GraphPayments} contract.\n * @param serviceProvider The address of the service provider.\n * @param feeType The type of fee to collect as defined in {GraphPayments}.\n * @param data Custom data, usage defined by the data service.\n * @return The amount of tokens collected.\n */\n function collect(\n address serviceProvider,\n IGraphPayments.PaymentTypes feeType,\n bytes calldata data\n ) external returns (uint256);\n\n /**\n * @notice Slash a service provider for misbehaviour.\n * @dev To slash the service provider's provision the function should call\n * {Staking-slash}.\n *\n * Emits a {ServiceProviderSlashed} event.\n *\n * @param serviceProvider The address of the service provider.\n * @param data Custom data, usage defined by the data service.\n */\n function slash(address serviceProvider, bytes calldata data) external;\n\n /**\n * @notice External getter for the thawing period range\n * @return Minimum thawing period allowed\n * @return Maximum thawing period allowed\n */\n function getThawingPeriodRange() external view returns (uint64, uint64);\n\n /**\n * @notice External getter for the verifier cut range\n * @return Minimum verifier cut allowed\n * @return Maximum verifier cut allowed\n */\n function getVerifierCutRange() external view returns (uint32, uint32);\n\n /**\n * @notice External getter for the provision tokens range\n * @return Minimum provision tokens allowed\n * @return Maximum provision tokens allowed\n */\n function getProvisionTokensRange() external view returns (uint256, uint256);\n\n /**\n * @notice External getter for the delegation ratio\n * @return The delegation ratio\n */\n function getDelegationRatio() external view returns (uint32);\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataService } from \"./IDataService.sol\";\n\n/**\n * @title Interface for the {DataServiceFees} contract.\n * @notice Extension for the {IDataService} contract to handle payment collateralization\n * using a Horizon provision.\n *\n * It's designed to be used with the Data Service framework:\n * - When a service provider collects payment with {IDataService.collect} the data service should lock\n * stake to back the payment using {_lockStake}.\n * - Every time there is a payment collection with {IDataService.collect}, the data service should\n * attempt to release any expired stake claims by calling {_releaseStake}.\n * - Stake claims can also be manually released by calling {releaseStake} directly.\n *\n * @dev Note that this implementation uses the entire provisioned stake as collateral for the payment.\n * It can be used to provide economic security for the payments collected as long as the provisioned\n * stake is not being used for other purposes.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IDataServiceFees is IDataService {\n /**\n * @notice A stake claim, representing provisioned stake that gets locked\n * to be released to a service provider.\n * @dev StakeClaims are stored in linked lists by service provider, ordered by\n * creation timestamp.\n * @param tokens The amount of tokens to be locked in the claim\n * @param createdAt The timestamp when the claim was created\n * @param releasableAt The timestamp when the tokens can be released\n * @param nextClaim The next claim in the linked list\n */\n struct StakeClaim {\n uint256 tokens;\n uint256 createdAt;\n uint256 releasableAt;\n bytes32 nextClaim;\n }\n\n /**\n * @notice Emitted when a stake claim is created and stake is locked.\n * @param serviceProvider The address of the service provider\n * @param claimId The id of the stake claim\n * @param tokens The amount of tokens to lock in the claim\n * @param unlockTimestamp The timestamp when the tokens can be released\n */\n event StakeClaimLocked(\n address indexed serviceProvider,\n bytes32 indexed claimId,\n uint256 tokens,\n uint256 unlockTimestamp\n );\n\n /**\n * @notice Emitted when a stake claim is released and stake is unlocked.\n * @param serviceProvider The address of the service provider\n * @param claimId The id of the stake claim\n * @param tokens The amount of tokens released\n * @param releasableAt The timestamp when the tokens were released\n */\n event StakeClaimReleased(\n address indexed serviceProvider,\n bytes32 indexed claimId,\n uint256 tokens,\n uint256 releasableAt\n );\n\n /**\n * @notice Emitted when a series of stake claims are released.\n * @param serviceProvider The address of the service provider\n * @param claimsCount The number of stake claims being released\n * @param tokensReleased The total amount of tokens being released\n */\n event StakeClaimsReleased(address indexed serviceProvider, uint256 claimsCount, uint256 tokensReleased);\n\n /**\n * @notice Thrown when attempting to get a stake claim that does not exist.\n * @param claimId The id of the stake claim\n */\n error DataServiceFeesClaimNotFound(bytes32 claimId);\n\n /**\n * @notice Emitted when trying to lock zero tokens in a stake claim\n */\n error DataServiceFeesZeroTokens();\n\n /**\n * @notice Releases expired stake claims for the caller.\n * @dev This function is only meant to be called if the service provider has enough\n * stake claims that releasing them all at once would exceed the block gas limit.\n * @dev This function can be overriden and/or disabled.\n * @dev Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\n * @param numClaimsToRelease Amount of stake claims to process. If 0, all stake claims are processed.\n */\n function releaseStake(uint256 numClaimsToRelease) external;\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataService } from \"./IDataService.sol\";\n\n/**\n * @title Interface for the {DataServicePausable} contract.\n * @notice Extension for the {IDataService} contract, adds pausing functionality\n * to the data service. Pausing is controlled by privileged accounts called\n * pause guardians.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IDataServicePausable is IDataService {\n /**\n * @notice Emitted when a pause guardian is set.\n * @param account The address of the pause guardian\n * @param allowed The allowed status of the pause guardian\n */\n event PauseGuardianSet(address indexed account, bool allowed);\n\n /**\n * @notice Emitted when a the caller is not a pause guardian\n * @param account The address of the pause guardian\n */\n error DataServicePausableNotPauseGuardian(address account);\n\n /**\n * @notice Emitted when a pause guardian is set to the same allowed status\n * @param account The address of the pause guardian\n * @param allowed The allowed status of the pause guardian\n */\n error DataServicePausablePauseGuardianNoChange(address account, bool allowed);\n\n /**\n * @notice Pauses the data service.\n * @dev Note that only functions using the modifiers `whenNotPaused`\n * and `whenPaused` will be affected by the pause.\n *\n * Requirements:\n * - The contract must not be already paused\n */\n function pause() external;\n\n /**\n * @notice Unpauses the data service.\n * @dev Note that only functions using the modifiers `whenNotPaused`\n * and `whenPaused` will be affected by the pause.\n *\n * Requirements:\n * - The contract must be paused\n */\n function unpause() external;\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IHorizonStaking } from \"../../interfaces/IHorizonStaking.sol\";\n\n/**\n * @title ProvisionTracker library\n * @notice A library to facilitate tracking of \"used tokens\" on Graph Horizon provisions. This can be used to\n * ensure data services have enough economic security (provisioned stake) to back the payments they collect for\n * their services.\n * The library provides two primitives, lock and release to signal token usage and free up tokens respectively. It\n * does not make any assumptions about the conditions under which tokens are locked or released.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary ProvisionTracker {\n /**\n * @notice Thrown when trying to lock more tokens than available\n * @param tokensAvailable The amount of tokens available\n * @param tokensRequired The amount of tokens required\n */\n error ProvisionTrackerInsufficientTokens(uint256 tokensAvailable, uint256 tokensRequired);\n\n /**\n * @notice Locks tokens for a service provider\n * @dev Requirements:\n * - `tokens` must be less than or equal to the amount of tokens available, as reported by the HorizonStaking contract\n * @param self The provision tracker mapping\n * @param graphStaking The HorizonStaking contract\n * @param serviceProvider The service provider address\n * @param tokens The amount of tokens to lock\n * @param delegationRatio A delegation ratio to limit the amount of delegation that's usable\n */\n function lock(\n mapping(address => uint256) storage self,\n IHorizonStaking graphStaking,\n address serviceProvider,\n uint256 tokens,\n uint32 delegationRatio\n ) internal {\n if (tokens == 0) return;\n\n uint256 tokensRequired = self[serviceProvider] + tokens;\n uint256 tokensAvailable = graphStaking.getTokensAvailable(serviceProvider, address(this), delegationRatio);\n require(tokensRequired <= tokensAvailable, ProvisionTrackerInsufficientTokens(tokensAvailable, tokensRequired));\n self[serviceProvider] += tokens;\n }\n\n /**\n * @notice Releases tokens for a service provider\n * @dev Requirements:\n * - `tokens` must be less than or equal to the amount of tokens locked for the service provider\n * @param self The provision tracker mapping\n * @param serviceProvider The service provider address\n * @param tokens The amount of tokens to release\n */\n function release(mapping(address => uint256) storage self, address serviceProvider, uint256 tokens) internal {\n if (tokens == 0) return;\n require(self[serviceProvider] >= tokens, ProvisionTrackerInsufficientTokens(self[serviceProvider], tokens));\n self[serviceProvider] -= tokens;\n }\n\n /**\n * @notice Checks if a service provider has enough tokens available to lock\n * @param self The provision tracker mapping\n * @param graphStaking The HorizonStaking contract\n * @param serviceProvider The service provider address\n * @param delegationRatio A delegation ratio to limit the amount of delegation that's usable\n * @return true if the service provider has enough tokens available to lock, false otherwise\n */\n function check(\n mapping(address => uint256) storage self,\n IHorizonStaking graphStaking,\n address serviceProvider,\n uint32 delegationRatio\n ) internal view returns (bool) {\n uint256 tokensAvailable = graphStaking.getTokensAvailable(serviceProvider, address(this), delegationRatio);\n return self[serviceProvider] <= tokensAvailable;\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IHorizonStaking } from \"../../interfaces/IHorizonStaking.sol\";\n\nimport { UintRange } from \"../../libraries/UintRange.sol\";\nimport { PPMMath } from \"../../libraries/PPMMath.sol\";\n\nimport { Initializable } from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport { GraphDirectory } from \"../../utilities/GraphDirectory.sol\";\nimport { ProvisionManagerV1Storage } from \"./ProvisionManagerStorage.sol\";\n\n/**\n * @title ProvisionManager contract\n * @notice A helper contract that implements several provision management functions.\n * @dev Provides utilities to verify provision parameters are within an acceptable range. Each\n * parameter has an overridable setter and getter for the validity range, and a checker that reverts\n * if the parameter is out of range.\n * The parameters are:\n * - Provision parameters (thawing period and verifier cut)\n * - Provision tokens\n *\n * Note that default values for all provision parameters provide the most permissive configuration, it's\n * highly recommended to override them at the data service level.\n *\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract ProvisionManager is Initializable, GraphDirectory, ProvisionManagerV1Storage {\n using UintRange for uint256;\n\n /// @notice The default minimum verifier cut.\n uint32 internal constant DEFAULT_MIN_VERIFIER_CUT = type(uint32).min;\n\n /// @notice The default maximum verifier cut.\n uint32 internal constant DEFAULT_MAX_VERIFIER_CUT = uint32(PPMMath.MAX_PPM);\n\n /// @notice The default minimum thawing period.\n uint64 internal constant DEFAULT_MIN_THAWING_PERIOD = type(uint64).min;\n\n /// @notice The default maximum thawing period.\n uint64 internal constant DEFAULT_MAX_THAWING_PERIOD = type(uint64).max;\n\n /// @notice The default minimum provision tokens.\n uint256 internal constant DEFAULT_MIN_PROVISION_TOKENS = type(uint256).min;\n\n /// @notice The default maximum provision tokens.\n uint256 internal constant DEFAULT_MAX_PROVISION_TOKENS = type(uint256).max;\n\n /// @notice The default delegation ratio.\n uint32 internal constant DEFAULT_DELEGATION_RATIO = type(uint32).max;\n\n /**\n * @notice Emitted when the provision tokens range is set.\n * @param min The minimum allowed value for the provision tokens.\n * @param max The maximum allowed value for the provision tokens.\n */\n event ProvisionTokensRangeSet(uint256 min, uint256 max);\n\n /**\n * @notice Emitted when the delegation ratio is set.\n * @param ratio The delegation ratio\n */\n event DelegationRatioSet(uint32 ratio);\n\n /**\n * @notice Emitted when the verifier cut range is set.\n * @param min The minimum allowed value for the max verifier cut.\n * @param max The maximum allowed value for the max verifier cut.\n */\n event VerifierCutRangeSet(uint32 min, uint32 max);\n\n /**\n * @notice Emitted when the thawing period range is set.\n * @param min The minimum allowed value for the thawing period.\n * @param max The maximum allowed value for the thawing period.\n */\n event ThawingPeriodRangeSet(uint64 min, uint64 max);\n\n /**\n * @notice Thrown when a provision parameter is out of range.\n * @param message The error message.\n * @param value The value that is out of range.\n * @param min The minimum allowed value.\n * @param max The maximum allowed value.\n */\n error ProvisionManagerInvalidValue(bytes message, uint256 value, uint256 min, uint256 max);\n\n /**\n * @notice Thrown when attempting to set a range where min is greater than max.\n * @param min The minimum value.\n * @param max The maximum value.\n */\n error ProvisionManagerInvalidRange(uint256 min, uint256 max);\n\n /**\n * @notice Thrown when the caller is not authorized to manage the provision of a service provider.\n * @param serviceProvider The address of the serviceProvider.\n * @param caller The address of the caller.\n */\n error ProvisionManagerNotAuthorized(address serviceProvider, address caller);\n\n /**\n * @notice Thrown when a provision is not found.\n * @param serviceProvider The address of the service provider.\n */\n error ProvisionManagerProvisionNotFound(address serviceProvider);\n\n /**\n * @notice Checks if the caller is authorized to manage the provision of a service provider.\n * @param serviceProvider The address of the service provider.\n */\n modifier onlyAuthorizedForProvision(address serviceProvider) {\n require(\n _graphStaking().isAuthorized(serviceProvider, address(this), msg.sender),\n ProvisionManagerNotAuthorized(serviceProvider, msg.sender)\n );\n _;\n }\n\n /**\n * @notice Checks if a provision of a service provider is valid according\n * to the parameter ranges established.\n * @param serviceProvider The address of the service provider.\n */\n modifier onlyValidProvision(address serviceProvider) virtual {\n IHorizonStaking.Provision memory provision = _getProvision(serviceProvider);\n _checkProvisionTokens(provision);\n _checkProvisionParameters(provision, false);\n _;\n }\n\n /**\n * @notice Initializes the contract and any parent contracts.\n */\n function __ProvisionManager_init() internal onlyInitializing {\n __ProvisionManager_init_unchained();\n }\n\n /**\n * @notice Initializes the contract.\n * @dev All parameters set to their entire range as valid.\n */\n function __ProvisionManager_init_unchained() internal onlyInitializing {\n _setProvisionTokensRange(DEFAULT_MIN_PROVISION_TOKENS, DEFAULT_MAX_PROVISION_TOKENS);\n _setVerifierCutRange(DEFAULT_MIN_VERIFIER_CUT, DEFAULT_MAX_VERIFIER_CUT);\n _setThawingPeriodRange(DEFAULT_MIN_THAWING_PERIOD, DEFAULT_MAX_THAWING_PERIOD);\n _setDelegationRatio(DEFAULT_DELEGATION_RATIO);\n }\n\n /**\n * @notice Verifies and accepts the provision parameters of a service provider in\n * the {HorizonStaking} contract.\n * @dev Checks the pending provision parameters, not the current ones.\n *\n * @param _serviceProvider The address of the service provider.\n */\n function _acceptProvisionParameters(address _serviceProvider) internal {\n _checkProvisionParameters(_serviceProvider, true);\n _graphStaking().acceptProvisionParameters(_serviceProvider);\n }\n\n // -- setters --\n /**\n * @notice Sets the delegation ratio.\n * @param _ratio The delegation ratio to be set\n */\n function _setDelegationRatio(uint32 _ratio) internal {\n _delegationRatio = _ratio;\n emit DelegationRatioSet(_ratio);\n }\n\n /**\n * @notice Sets the range for the provision tokens.\n * @param _min The minimum allowed value for the provision tokens.\n * @param _max The maximum allowed value for the provision tokens.\n */\n function _setProvisionTokensRange(uint256 _min, uint256 _max) internal {\n require(_min <= _max, ProvisionManagerInvalidRange(_min, _max));\n _minimumProvisionTokens = _min;\n _maximumProvisionTokens = _max;\n emit ProvisionTokensRangeSet(_min, _max);\n }\n\n /**\n * @notice Sets the range for the verifier cut.\n * @param _min The minimum allowed value for the max verifier cut.\n * @param _max The maximum allowed value for the max verifier cut.\n */\n function _setVerifierCutRange(uint32 _min, uint32 _max) internal {\n require(_min <= _max, ProvisionManagerInvalidRange(_min, _max));\n require(PPMMath.isValidPPM(_max), ProvisionManagerInvalidRange(_min, _max));\n _minimumVerifierCut = _min;\n _maximumVerifierCut = _max;\n emit VerifierCutRangeSet(_min, _max);\n }\n\n /**\n * @notice Sets the range for the thawing period.\n * @param _min The minimum allowed value for the thawing period.\n * @param _max The maximum allowed value for the thawing period.\n */\n function _setThawingPeriodRange(uint64 _min, uint64 _max) internal {\n require(_min <= _max, ProvisionManagerInvalidRange(_min, _max));\n _minimumThawingPeriod = _min;\n _maximumThawingPeriod = _max;\n emit ThawingPeriodRangeSet(_min, _max);\n }\n\n // -- checks --\n\n /**\n * @notice Checks if the provision tokens of a service provider are within the valid range.\n * @param _serviceProvider The address of the service provider.\n */\n function _checkProvisionTokens(address _serviceProvider) internal view virtual {\n IHorizonStaking.Provision memory provision = _getProvision(_serviceProvider);\n _checkProvisionTokens(provision);\n }\n\n /**\n * @notice Checks if the provision tokens of a service provider are within the valid range.\n * Note that thawing tokens are not considered in this check.\n * @param _provision The provision to check.\n */\n function _checkProvisionTokens(IHorizonStaking.Provision memory _provision) internal view virtual {\n _checkValueInRange(\n _provision.tokens - _provision.tokensThawing,\n _minimumProvisionTokens,\n _maximumProvisionTokens,\n \"tokens\"\n );\n }\n\n /**\n * @notice Checks if the provision parameters of a service provider are within the valid range.\n * @param _serviceProvider The address of the service provider.\n * @param _checkPending If true, checks the pending provision parameters.\n */\n function _checkProvisionParameters(address _serviceProvider, bool _checkPending) internal view virtual {\n IHorizonStaking.Provision memory provision = _getProvision(_serviceProvider);\n _checkProvisionParameters(provision, _checkPending);\n }\n\n /**\n * @notice Checks if the provision parameters of a service provider are within the valid range.\n * @param _provision The provision to check.\n * @param _checkPending If true, checks the pending provision parameters instead of the current ones.\n */\n function _checkProvisionParameters(\n IHorizonStaking.Provision memory _provision,\n bool _checkPending\n ) internal view virtual {\n (uint64 thawingPeriodMin, uint64 thawingPeriodMax) = _getThawingPeriodRange();\n uint64 thawingPeriodToCheck = _checkPending ? _provision.thawingPeriodPending : _provision.thawingPeriod;\n _checkValueInRange(thawingPeriodToCheck, thawingPeriodMin, thawingPeriodMax, \"thawingPeriod\");\n\n (uint32 verifierCutMin, uint32 verifierCutMax) = _getVerifierCutRange();\n uint32 maxVerifierCutToCheck = _checkPending ? _provision.maxVerifierCutPending : _provision.maxVerifierCut;\n _checkValueInRange(maxVerifierCutToCheck, verifierCutMin, verifierCutMax, \"maxVerifierCut\");\n }\n\n // -- getters --\n\n /**\n * @notice Gets the delegation ratio.\n * @return The delegation ratio\n */\n function _getDelegationRatio() internal view returns (uint32) {\n return _delegationRatio;\n }\n\n /**\n * @notice Gets the range for the provision tokens.\n * @return The minimum allowed value for the provision tokens.\n * @return The maximum allowed value for the provision tokens.\n */\n function _getProvisionTokensRange() internal view virtual returns (uint256, uint256) {\n return (_minimumProvisionTokens, _maximumProvisionTokens);\n }\n\n /**\n * @notice Gets the range for the thawing period.\n * @return The minimum allowed value for the thawing period.\n * @return The maximum allowed value for the thawing period.\n */\n function _getThawingPeriodRange() internal view virtual returns (uint64, uint64) {\n return (_minimumThawingPeriod, _maximumThawingPeriod);\n }\n\n /**\n * @notice Gets the range for the verifier cut.\n * @return The minimum allowed value for the max verifier cut.\n * @return The maximum allowed value for the max verifier cut.\n */\n function _getVerifierCutRange() internal view virtual returns (uint32, uint32) {\n return (_minimumVerifierCut, _maximumVerifierCut);\n }\n\n /**\n * @notice Gets a provision from the {HorizonStaking} contract.\n * @dev Requirements:\n * - The provision must exist.\n * @param _serviceProvider The address of the service provider.\n * @return The provision.\n */\n function _getProvision(address _serviceProvider) internal view returns (IHorizonStaking.Provision memory) {\n IHorizonStaking.Provision memory provision = _graphStaking().getProvision(_serviceProvider, address(this));\n require(provision.createdAt != 0, ProvisionManagerProvisionNotFound(_serviceProvider));\n return provision;\n }\n\n /**\n * @notice Checks if a value is within a valid range.\n * @param _value The value to check.\n * @param _min The minimum allowed value.\n * @param _max The maximum allowed value.\n * @param _revertMessage The revert message to display if the value is out of range.\n */\n function _checkValueInRange(uint256 _value, uint256 _min, uint256 _max, bytes memory _revertMessage) private pure {\n require(_value.isInRange(_min, _max), ProvisionManagerInvalidValue(_revertMessage, _value, _min, _max));\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title Storage layout for the {ProvisionManager} helper contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract ProvisionManagerV1Storage {\n /// @notice The minimum amount of tokens required to register a provision in the data service\n uint256 internal _minimumProvisionTokens;\n\n /// @notice The maximum amount of tokens allowed to register a provision in the data service\n uint256 internal _maximumProvisionTokens;\n\n /// @notice The minimum thawing period required to register a provision in the data service\n uint64 internal _minimumThawingPeriod;\n\n /// @notice The maximum thawing period allowed to register a provision in the data service\n uint64 internal _maximumThawingPeriod;\n\n /// @notice The minimum verifier cut required to register a provision in the data service (in PPM)\n uint32 internal _minimumVerifierCut;\n\n /// @notice The maximum verifier cut allowed to register a provision in the data service (in PPM)\n uint32 internal _maximumVerifierCut;\n\n /// @notice How much delegation the service provider can effectively use\n /// @dev Max calculated as service provider's stake * delegationRatio\n uint32 internal _delegationRatio;\n\n /// @dev Gap to allow adding variables in future upgrades\n /// Note that this contract is not upgradeable but might be inherited by an upgradeable contract\n uint256[50] private __gap;\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title Interface for the {GraphPayments} contract\n * @notice This contract is part of the Graph Horizon payments protocol. It's designed\n * to pull funds (GRT) from the {PaymentsEscrow} and distribute them according to a\n * set of pre established rules.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IGraphPayments {\n /**\n * @notice Types of payments that are supported by the payments protocol\n * @dev\n */\n enum PaymentTypes {\n QueryFee,\n IndexingFee,\n IndexingRewards\n }\n\n /**\n * @notice Emitted when a payment is collected\n * @param paymentType The type of payment as defined in {IGraphPayments}\n * @param payer The address of the payer\n * @param receiver The address of the receiver\n * @param dataService The address of the data service\n * @param tokens The total amount of tokens being collected\n * @param tokensProtocol Amount of tokens charged as protocol tax\n * @param tokensDataService Amount of tokens for the data service\n * @param tokensDelegationPool Amount of tokens for delegators\n * @param tokensReceiver Amount of tokens for the receiver\n * @param receiverDestination The address where the receiver's payment cut is sent.\n */\n event GraphPaymentCollected(\n PaymentTypes indexed paymentType,\n address indexed payer,\n address receiver,\n address indexed dataService,\n uint256 tokens,\n uint256 tokensProtocol,\n uint256 tokensDataService,\n uint256 tokensDelegationPool,\n uint256 tokensReceiver,\n address receiverDestination\n );\n\n /**\n * @notice Thrown when the protocol payment cut is invalid\n * @param protocolPaymentCut The protocol payment cut\n */\n error GraphPaymentsInvalidProtocolPaymentCut(uint256 protocolPaymentCut);\n\n /**\n * @notice Thrown when trying to use a cut that is not expressed in PPM\n * @param cut The cut\n */\n error GraphPaymentsInvalidCut(uint256 cut);\n\n /**\n * @notice Initialize the contract\n */\n function initialize() external;\n\n /**\n * @notice Collects funds from a payer.\n * It will pay cuts to all relevant parties and forward the rest to the receiver destination address. If the\n * destination address is zero the funds are automatically staked to the receiver. Note that the receiver \n * destination address can be set to the receiver address to collect funds on the receiver without re-staking.\n *\n * Note that the collected amount can be zero.\n *\n * @param paymentType The type of payment as defined in {IGraphPayments}\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens being collected.\n * @param dataService The address of the data service\n * @param dataServiceCut The data service cut in PPM\n * @param receiverDestination The address where the receiver's payment cut is sent.\n */\n function collect(\n PaymentTypes paymentType,\n address receiver,\n uint256 tokens,\n address dataService,\n uint256 dataServiceCut,\n address receiverDestination\n ) external;\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\n/**\n * @title IGraphProxyAdmin\n * @dev Empty interface to allow the GraphProxyAdmin contract to be used\n * in the GraphDirectory contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IGraphProxyAdmin {}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IPaymentsCollector } from \"./IPaymentsCollector.sol\";\nimport { IGraphPayments } from \"./IGraphPayments.sol\";\n\n/**\n * @title Interface for the {GraphTallyCollector} contract\n * @dev Implements the {IPaymentCollector} interface as defined by the Graph\n * Horizon payments protocol.\n * @notice Implements a payments collector contract that can be used to collect\n * payments using a GraphTally RAV (Receipt Aggregate Voucher).\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IGraphTallyCollector is IPaymentsCollector {\n /**\n * @notice The Receipt Aggregate Voucher (RAV) struct\n * @param collectionId The ID of the collection \"bucket\" the RAV belongs to. Note that multiple RAVs can be collected for the same collection id.\n * @param payer The address of the payer the RAV was issued by\n * @param serviceProvider The address of the service provider the RAV was issued to\n * @param dataService The address of the data service the RAV was issued to\n * @param timestampNs The RAV timestamp, indicating the latest GraphTally Receipt in the RAV\n * @param valueAggregate The total amount owed to the service provider since the beginning of the payer-service provider relationship, including all debt that is already paid for.\n * @param metadata Arbitrary metadata to extend functionality if a data service requires it\n */\n struct ReceiptAggregateVoucher {\n bytes32 collectionId;\n address payer;\n address serviceProvider;\n address dataService;\n uint64 timestampNs;\n uint128 valueAggregate;\n bytes metadata;\n }\n\n /**\n * @notice A struct representing a signed RAV\n * @param rav The RAV\n * @param signature The signature of the RAV - 65 bytes: r (32 Bytes) || s (32 Bytes) || v (1 Byte)\n */\n struct SignedRAV {\n ReceiptAggregateVoucher rav;\n bytes signature;\n }\n\n /**\n * @notice Emitted when a RAV is collected\n * @param collectionId The ID of the collection \"bucket\" the RAV belongs to.\n * @param payer The address of the payer\n * @param dataService The address of the data service\n * @param serviceProvider The address of the service provider\n * @param timestampNs The timestamp of the RAV\n * @param valueAggregate The total amount owed to the service provider\n * @param metadata Arbitrary metadata\n * @param signature The signature of the RAV\n */\n event RAVCollected(\n bytes32 indexed collectionId,\n address indexed payer,\n address serviceProvider,\n address indexed dataService,\n uint64 timestampNs,\n uint128 valueAggregate,\n bytes metadata,\n bytes signature\n );\n\n /**\n * @notice Thrown when the RAV signer is invalid\n */\n error GraphTallyCollectorInvalidRAVSigner();\n\n /**\n * @notice Thrown when the RAV is for a data service the service provider has no provision for\n * @param dataService The address of the data service\n */\n error GraphTallyCollectorUnauthorizedDataService(address dataService);\n\n /**\n * @notice Thrown when the caller is not the data service the RAV was issued to\n * @param caller The address of the caller\n * @param dataService The address of the data service\n */\n error GraphTallyCollectorCallerNotDataService(address caller, address dataService);\n\n /**\n * @notice Thrown when the tokens collected are inconsistent with the collection history\n * Each RAV should have a value greater than the previous one\n * @param tokens The amount of tokens in the RAV\n * @param tokensCollected The amount of tokens already collected\n */\n error GraphTallyCollectorInconsistentRAVTokens(uint256 tokens, uint256 tokensCollected);\n\n /**\n * @notice Thrown when the attempting to collect more tokens than what it's owed\n * @param tokensToCollect The amount of tokens to collect\n * @param maxTokensToCollect The maximum amount of tokens to collect\n */\n error GraphTallyCollectorInvalidTokensToCollectAmount(uint256 tokensToCollect, uint256 maxTokensToCollect);\n\n /**\n * @notice See {IPaymentsCollector.collect}\n * This variant adds the ability to partially collect a RAV by specifying the amount of tokens to collect.\n *\n * Requirements:\n * - The amount of tokens to collect must be less than or equal to the total amount of tokens in the RAV minus\n * the tokens already collected.\n * @param paymentType The payment type to collect\n * @param data Additional data required for the payment collection. Encoded as follows:\n * - SignedRAV `signedRAV`: The signed RAV\n * - uint256 `dataServiceCut`: The data service cut in PPM\n * - address `receiverDestination`: The address where the receiver's payment should be sent.\n * @param tokensToCollect The amount of tokens to collect\n * @return The amount of tokens collected\n */\n function collect(\n IGraphPayments.PaymentTypes paymentType,\n bytes calldata data,\n uint256 tokensToCollect\n ) external returns (uint256);\n\n /**\n * @dev Recovers the signer address of a signed ReceiptAggregateVoucher (RAV).\n * @param signedRAV The SignedRAV containing the RAV and its signature.\n * @return The address of the signer.\n */\n function recoverRAVSigner(SignedRAV calldata signedRAV) external view returns (address);\n\n /**\n * @dev Computes the hash of a ReceiptAggregateVoucher (RAV).\n * @param rav The RAV for which to compute the hash.\n * @return The hash of the RAV.\n */\n function encodeRAV(ReceiptAggregateVoucher calldata rav) external view returns (bytes32);\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IHorizonStakingTypes } from \"./internal/IHorizonStakingTypes.sol\";\nimport { IHorizonStakingMain } from \"./internal/IHorizonStakingMain.sol\";\nimport { IHorizonStakingBase } from \"./internal/IHorizonStakingBase.sol\";\nimport { IHorizonStakingExtension } from \"./internal/IHorizonStakingExtension.sol\";\n\n/**\n * @title Complete interface for the Horizon Staking contract\n * @notice This interface exposes all functions implemented by the {HorizonStaking} contract and its extension\n * {HorizonStakingExtension} as well as the custom data types used by the contract.\n * @dev Use this interface to interact with the Horizon Staking contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IHorizonStaking is IHorizonStakingTypes, IHorizonStakingBase, IHorizonStakingMain, IHorizonStakingExtension {}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IHorizonStakingTypes } from \"./IHorizonStakingTypes.sol\";\nimport { IGraphPayments } from \"../IGraphPayments.sol\";\n\nimport { LinkedList } from \"../../libraries/LinkedList.sol\";\n\n/**\n * @title Interface for the {HorizonStakingBase} contract.\n * @notice Provides getters for {HorizonStaking} and {HorizonStakingExtension} storage variables.\n * @dev Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision\n * functions take `serviceProvider` and `verifier` addresses.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IHorizonStakingBase {\n /**\n * @notice Emitted when a service provider stakes tokens.\n * @dev TRANSITION PERIOD: After transition period move to IHorizonStakingMain. Temporarily it\n * needs to be here since it's emitted by {_stake} which is used by both {HorizonStaking}\n * and {HorizonStakingExtension}.\n * @param serviceProvider The address of the service provider.\n * @param tokens The amount of tokens staked.\n */\n event HorizonStakeDeposited(address indexed serviceProvider, uint256 tokens);\n\n /**\n * @notice Thrown when using an invalid thaw request type.\n */\n error HorizonStakingInvalidThawRequestType();\n\n /**\n * @notice Gets the details of a service provider.\n * @param serviceProvider The address of the service provider.\n * @return The service provider details.\n */\n function getServiceProvider(\n address serviceProvider\n ) external view returns (IHorizonStakingTypes.ServiceProvider memory);\n\n /**\n * @notice Gets the stake of a service provider.\n * @param serviceProvider The address of the service provider.\n * @return The amount of tokens staked.\n */\n function getStake(address serviceProvider) external view returns (uint256);\n\n /**\n * @notice Gets the service provider's idle stake which is the stake that is not being\n * used for any provision. Note that this only includes service provider's self stake.\n * @param serviceProvider The address of the service provider.\n * @return The amount of tokens that are idle.\n */\n function getIdleStake(address serviceProvider) external view returns (uint256);\n\n /**\n * @notice Gets the details of delegation pool.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @return The delegation pool details.\n */\n function getDelegationPool(\n address serviceProvider,\n address verifier\n ) external view returns (IHorizonStakingTypes.DelegationPool memory);\n\n /**\n * @notice Gets the details of a delegation.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @param delegator The address of the delegator.\n * @return The delegation details.\n */\n function getDelegation(\n address serviceProvider,\n address verifier,\n address delegator\n ) external view returns (IHorizonStakingTypes.Delegation memory);\n\n /**\n * @notice Gets the delegation fee cut for a payment type.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @param paymentType The payment type as defined by {IGraphPayments.PaymentTypes}.\n * @return The delegation fee cut in PPM.\n */\n function getDelegationFeeCut(\n address serviceProvider,\n address verifier,\n IGraphPayments.PaymentTypes paymentType\n ) external view returns (uint256);\n\n /**\n * @notice Gets the details of a provision.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @return The provision details.\n */\n function getProvision(\n address serviceProvider,\n address verifier\n ) external view returns (IHorizonStakingTypes.Provision memory);\n\n /**\n * @notice Gets the tokens available in a provision.\n * Tokens available are the tokens in a provision that are not thawing. Includes service\n * provider's and delegator's stake.\n *\n * Allows specifying a `delegationRatio` which caps the amount of delegated tokens that are\n * considered available.\n *\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @param delegationRatio The delegation ratio.\n * @return The amount of tokens available.\n */\n function getTokensAvailable(\n address serviceProvider,\n address verifier,\n uint32 delegationRatio\n ) external view returns (uint256);\n\n /**\n * @notice Gets the service provider's tokens available in a provision.\n * @dev Calculated as the tokens available minus the tokens thawing.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @return The amount of tokens available.\n */\n function getProviderTokensAvailable(address serviceProvider, address verifier) external view returns (uint256);\n\n /**\n * @notice Gets the delegator's tokens available in a provision.\n * @dev Calculated as the tokens available minus the tokens thawing.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @return The amount of tokens available.\n */\n function getDelegatedTokensAvailable(address serviceProvider, address verifier) external view returns (uint256);\n\n /**\n * @notice Gets a thaw request.\n * @param thawRequestType The type of thaw request.\n * @param thawRequestId The id of the thaw request.\n * @return The thaw request details.\n */\n function getThawRequest(\n IHorizonStakingTypes.ThawRequestType thawRequestType,\n bytes32 thawRequestId\n ) external view returns (IHorizonStakingTypes.ThawRequest memory);\n\n /**\n * @notice Gets the metadata of a thaw request list.\n * Service provider and delegators each have their own thaw request list per provision.\n * Metadata includes the head and tail of the list, plus the total number of thaw requests.\n * @param thawRequestType The type of thaw request.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @param owner The owner of the thaw requests. Use either the service provider or delegator address.\n * @return The thaw requests list metadata.\n */\n function getThawRequestList(\n IHorizonStakingTypes.ThawRequestType thawRequestType,\n address serviceProvider,\n address verifier,\n address owner\n ) external view returns (LinkedList.List memory);\n\n /**\n * @notice Gets the amount of thawed tokens that can be releasedfor a given provision.\n * @dev Note that the value returned by this function does not return the total amount of thawed tokens\n * but only those that can be released. If thaw requests are created with different thawing periods it's\n * possible that an unexpired thaw request temporarily blocks the release of other ones that have already\n * expired. This function will stop counting when it encounters the first thaw request that is not yet expired.\n * @param thawRequestType The type of thaw request.\n * @param serviceProvider The address of the service provider.\n * @param verifier The address of the verifier.\n * @param owner The owner of the thaw requests. Use either the service provider or delegator address.\n * @return The amount of thawed tokens.\n */\n function getThawedTokens(\n IHorizonStakingTypes.ThawRequestType thawRequestType,\n address serviceProvider,\n address verifier,\n address owner\n ) external view returns (uint256);\n\n /**\n * @notice Gets the maximum allowed thawing period for a provision.\n * @return The maximum allowed thawing period in seconds.\n */\n function getMaxThawingPeriod() external view returns (uint64);\n\n /**\n * @notice Return true if the verifier is an allowed locked verifier.\n * @param verifier Address of the verifier\n * @return True if verifier is allowed locked verifier, false otherwise\n */\n function isAllowedLockedVerifier(address verifier) external view returns (bool);\n\n /**\n * @notice Return true if delegation slashing is enabled, false otherwise.\n * @return True if delegation slashing is enabled, false otherwise\n */\n function isDelegationSlashingEnabled() external view returns (bool);\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IRewardsIssuer } from \"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\";\n\n/**\n * @title Interface for {HorizonStakingExtension} contract.\n * @notice Provides functions for managing legacy allocations.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IHorizonStakingExtension is IRewardsIssuer {\n /**\n * @dev Allocate GRT tokens for the purpose of serving queries of a subgraph deployment\n * An allocation is created in the allocate() function and closed in closeAllocation()\n * @param indexer The indexer address\n * @param subgraphDeploymentID The subgraph deployment ID\n * @param tokens The amount of tokens allocated to the subgraph deployment\n * @param createdAtEpoch The epoch when the allocation was created\n * @param closedAtEpoch The epoch when the allocation was closed\n * @param collectedFees The amount of collected fees for the allocation\n * @param __DEPRECATED_effectiveAllocation Deprecated field.\n * @param accRewardsPerAllocatedToken Snapshot used for reward calculation\n * @param distributedRebates The amount of collected rebates that have been rebated\n */\n struct Allocation {\n address indexer;\n bytes32 subgraphDeploymentID;\n uint256 tokens;\n uint256 createdAtEpoch;\n uint256 closedAtEpoch;\n uint256 collectedFees;\n uint256 __DEPRECATED_effectiveAllocation;\n uint256 accRewardsPerAllocatedToken;\n uint256 distributedRebates;\n }\n\n /**\n * @dev Possible states an allocation can be.\n * States:\n * - Null = indexer == address(0)\n * - Active = not Null && tokens > 0\n * - Closed = Active && closedAtEpoch != 0\n */\n enum AllocationState {\n Null,\n Active,\n Closed\n }\n\n /**\n * @dev Emitted when `indexer` close an allocation in `epoch` for `allocationID`.\n * An amount of `tokens` get unallocated from `subgraphDeploymentID`.\n * This event also emits the POI (proof of indexing) submitted by the indexer.\n * `isPublic` is true if the sender was someone other than the indexer.\n * @param indexer The indexer address\n * @param subgraphDeploymentID The subgraph deployment ID\n * @param epoch The protocol epoch the allocation was closed on\n * @param tokens The amount of tokens unallocated from the allocation\n * @param allocationID The allocation identifier\n * @param sender The address closing the allocation\n * @param poi The proof of indexing submitted by the sender\n * @param isPublic True if the allocation was force closed by someone other than the indexer/operator\n */\n event AllocationClosed(\n address indexed indexer,\n bytes32 indexed subgraphDeploymentID,\n uint256 epoch,\n uint256 tokens,\n address indexed allocationID,\n address sender,\n bytes32 poi,\n bool isPublic\n );\n\n /**\n * @dev Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`.\n * `epoch` is the protocol epoch the rebate was collected on\n * The rebate is for `tokens` amount which are being provided by `assetHolder`; `queryFees`\n * is the amount up for rebate after `curationFees` are distributed and `protocolTax` is burnt.\n * `queryRebates` is the amount distributed to the `indexer` with `delegationFees` collected\n * and sent to the delegation pool.\n * @param assetHolder The address of the asset holder, the entity paying the query fees\n * @param indexer The indexer address\n * @param subgraphDeploymentID The subgraph deployment ID\n * @param allocationID The allocation identifier\n * @param epoch The protocol epoch the rebate was collected on\n * @param tokens The amount of tokens collected\n * @param protocolTax The amount of tokens burnt as protocol tax\n * @param curationFees The amount of tokens distributed to the curation pool\n * @param queryFees The amount of tokens collected as query fees\n * @param queryRebates The amount of tokens distributed to the indexer\n * @param delegationRewards The amount of tokens collected from the delegation pool\n */\n event RebateCollected(\n address assetHolder,\n address indexed indexer,\n bytes32 indexed subgraphDeploymentID,\n address indexed allocationID,\n uint256 epoch,\n uint256 tokens,\n uint256 protocolTax,\n uint256 curationFees,\n uint256 queryFees,\n uint256 queryRebates,\n uint256 delegationRewards\n );\n\n /**\n * @dev Emitted when `indexer` was slashed for a total of `tokens` amount.\n * Tracks `reward` amount of tokens given to `beneficiary`.\n * @param indexer The indexer address\n * @param tokens The amount of tokens slashed\n * @param reward The amount of reward tokens to send to a beneficiary\n * @param beneficiary The address of a beneficiary to receive a reward for the slashing\n */\n event StakeSlashed(address indexed indexer, uint256 tokens, uint256 reward, address beneficiary);\n\n /**\n * @notice Close an allocation and free the staked tokens.\n * To be eligible for rewards a proof of indexing must be presented.\n * Presenting a bad proof is subject to slashable condition.\n * To opt out of rewards set _poi to 0x0\n * @param allocationID The allocation identifier\n * @param poi Proof of indexing submitted for the allocated period\n */\n function closeAllocation(address allocationID, bytes32 poi) external;\n\n /**\n * @dev Collect and rebate query fees to the indexer\n * This function will accept calls with zero tokens.\n * We use an exponential rebate formula to calculate the amount of tokens to rebate to the indexer.\n * This implementation allows collecting multiple times on the same allocation, keeping track of the\n * total amount rebated, the total amount collected and compensating the indexer for the difference.\n * @param tokens Amount of tokens to collect\n * @param allocationID Allocation where the tokens will be assigned\n */\n function collect(uint256 tokens, address allocationID) external;\n\n /**\n * @notice Slash the indexer stake. Delegated tokens are not subject to slashing.\n * Note that depending on the state of the indexer's stake, the slashed amount might be smaller than the\n * requested slash amount. This can happen if the indexer has moved a significant part of their stake to\n * a provision. Any outstanding slashing amount should be settled using Horizon's slash function\n * {IHorizonStaking.slash}.\n * @dev Can only be called by the slasher role.\n * @param indexer Address of indexer to slash\n * @param tokens Amount of tokens to slash from the indexer stake\n * @param reward Amount of reward tokens to send to a beneficiary\n * @param beneficiary Address of a beneficiary to receive a reward for the slashing\n */\n function legacySlash(address indexer, uint256 tokens, uint256 reward, address beneficiary) external;\n\n /**\n * @notice (Legacy) Return true if operator is allowed for the service provider on the subgraph data service.\n * @param operator Address of the operator\n * @param indexer Address of the service provider\n * @return True if operator is allowed for indexer, false otherwise\n */\n function isOperator(address operator, address indexer) external view returns (bool);\n\n /**\n * @notice Getter that returns if an indexer has any stake.\n * @param indexer Address of the indexer\n * @return True if indexer has staked tokens\n */\n function hasStake(address indexer) external view returns (bool);\n\n /**\n * @notice Get the total amount of tokens staked by the indexer.\n * @param indexer Address of the indexer\n * @return Amount of tokens staked by the indexer\n */\n function getIndexerStakedTokens(address indexer) external view returns (uint256);\n\n /**\n * @notice Return the allocation by ID.\n * @param allocationID Address used as allocation identifier\n * @return Allocation data\n */\n function getAllocation(address allocationID) external view returns (Allocation memory);\n\n /**\n * @notice Return the current state of an allocation\n * @param allocationID Allocation identifier\n * @return AllocationState enum with the state of the allocation\n */\n function getAllocationState(address allocationID) external view returns (AllocationState);\n\n /**\n * @notice Return if allocationID is used.\n * @param allocationID Address used as signer by the indexer for an allocation\n * @return True if allocationID already used\n */\n function isAllocation(address allocationID) external view returns (bool);\n\n /**\n * @notice Return the time in blocks to unstake\n * Deprecated, now enforced by each data service (verifier)\n * @return Thawing period in blocks\n */\n function __DEPRECATED_getThawingPeriod() external view returns (uint64);\n\n /**\n * @notice Return the address of the subgraph data service.\n * @dev TRANSITION PERIOD: After transition period move to main HorizonStaking contract\n * @return Address of the subgraph data service\n */\n function getSubgraphService() external view returns (address);\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IGraphPayments } from \"../../interfaces/IGraphPayments.sol\";\nimport { IHorizonStakingTypes } from \"./IHorizonStakingTypes.sol\";\n\n/**\n * @title Inferface for the {HorizonStaking} contract.\n * @notice Provides functions for managing stake, provisions, delegations, and slashing.\n * @dev Note that this interface only includes the functions implemented by {HorizonStaking} contract,\n * and not those implemented by {HorizonStakingExtension}.\n * Do not use this interface to interface with the {HorizonStaking} contract, use {IHorizonStaking} for\n * the complete interface.\n * @dev Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision\n * functions take `serviceProvider` and `verifier` addresses.\n * @dev TRANSITION PERIOD: After transition period rename to IHorizonStaking.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IHorizonStakingMain {\n // -- Events: stake --\n\n /**\n * @notice Emitted when a service provider unstakes tokens during the transition period.\n * @param serviceProvider The address of the service provider\n * @param tokens The amount of tokens now locked (including previously locked tokens)\n * @param until The block number until the stake is locked\n */\n event HorizonStakeLocked(address indexed serviceProvider, uint256 tokens, uint256 until);\n\n /**\n * @notice Emitted when a service provider withdraws tokens during the transition period.\n * @param serviceProvider The address of the service provider\n * @param tokens The amount of tokens withdrawn\n */\n event HorizonStakeWithdrawn(address indexed serviceProvider, uint256 tokens);\n\n // -- Events: provision --\n\n /**\n * @notice Emitted when a service provider provisions staked tokens to a verifier.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens provisioned\n * @param maxVerifierCut The maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\n * @param thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision\n */\n event ProvisionCreated(\n address indexed serviceProvider,\n address indexed verifier,\n uint256 tokens,\n uint32 maxVerifierCut,\n uint64 thawingPeriod\n );\n\n /**\n * @notice Emitted whenever staked tokens are added to an existing provision\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens added to the provision\n */\n event ProvisionIncreased(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when a service provider thaws tokens from a provision.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens thawed\n */\n event ProvisionThawed(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when a service provider removes tokens from a provision.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens removed\n */\n event TokensDeprovisioned(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when a service provider stages a provision parameter update.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param maxVerifierCut The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for\n * themselves when slashing\n * @param thawingPeriod The proposed period in seconds that the tokens will be thawing before they can be removed from\n * the provision\n */\n event ProvisionParametersStaged(\n address indexed serviceProvider,\n address indexed verifier,\n uint32 maxVerifierCut,\n uint64 thawingPeriod\n );\n\n /**\n * @notice Emitted when a service provider accepts a staged provision parameter update.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param maxVerifierCut The new maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves\n * when slashing\n * @param thawingPeriod The new period in seconds that the tokens will be thawing before they can be removed from the provision\n */\n event ProvisionParametersSet(\n address indexed serviceProvider,\n address indexed verifier,\n uint32 maxVerifierCut,\n uint64 thawingPeriod\n );\n\n /**\n * @dev Emitted when an operator is allowed or denied by a service provider for a particular verifier\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param operator The address of the operator\n * @param allowed Whether the operator is allowed or denied\n */\n event OperatorSet(\n address indexed serviceProvider,\n address indexed verifier,\n address indexed operator,\n bool allowed\n );\n\n // -- Events: slashing --\n\n /**\n * @notice Emitted when a provision is slashed by a verifier.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens slashed (note this only represents service provider's slashed stake)\n */\n event ProvisionSlashed(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when a delegation pool is slashed by a verifier.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens slashed (note this only represents delegation pool's slashed stake)\n */\n event DelegationSlashed(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when a delegation pool would have been slashed by a verifier, but the slashing was skipped\n * because delegation slashing global parameter is not enabled.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens that would have been slashed (note this only represents delegation pool's slashed stake)\n */\n event DelegationSlashingSkipped(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when the verifier cut is sent to the verifier after slashing a provision.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param destination The address where the verifier cut is sent\n * @param tokens The amount of tokens sent to the verifier\n */\n event VerifierTokensSent(\n address indexed serviceProvider,\n address indexed verifier,\n address indexed destination,\n uint256 tokens\n );\n\n // -- Events: delegation --\n\n /**\n * @notice Emitted when tokens are delegated to a provision.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param delegator The address of the delegator\n * @param tokens The amount of tokens delegated\n * @param shares The amount of shares delegated\n */\n event TokensDelegated(\n address indexed serviceProvider,\n address indexed verifier,\n address indexed delegator,\n uint256 tokens,\n uint256 shares\n );\n\n /**\n * @notice Emitted when a delegator undelegates tokens from a provision and starts\n * thawing them.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param delegator The address of the delegator\n * @param tokens The amount of tokens undelegated\n * @param shares The amount of shares undelegated\n */\n event TokensUndelegated(\n address indexed serviceProvider,\n address indexed verifier,\n address indexed delegator,\n uint256 tokens,\n uint256 shares\n );\n\n /**\n * @notice Emitted when a delegator withdraws tokens from a provision after thawing.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param delegator The address of the delegator\n * @param tokens The amount of tokens withdrawn\n */\n event DelegatedTokensWithdrawn(\n address indexed serviceProvider,\n address indexed verifier,\n address indexed delegator,\n uint256 tokens\n );\n\n /**\n * @notice Emitted when `delegator` withdrew delegated `tokens` from `indexer` using `withdrawDelegated`.\n * @dev This event is for the legacy `withdrawDelegated` function.\n * @param indexer The address of the indexer\n * @param delegator The address of the delegator\n * @param tokens The amount of tokens withdrawn\n */\n event StakeDelegatedWithdrawn(address indexed indexer, address indexed delegator, uint256 tokens);\n\n /**\n * @notice Emitted when tokens are added to a delegation pool's reserve.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param tokens The amount of tokens withdrawn\n */\n event TokensToDelegationPoolAdded(address indexed serviceProvider, address indexed verifier, uint256 tokens);\n\n /**\n * @notice Emitted when a service provider sets delegation fee cuts for a verifier.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param paymentType The payment type for which the fee cut is set, as defined in {IGraphPayments}\n * @param feeCut The fee cut set, in PPM\n */\n event DelegationFeeCutSet(\n address indexed serviceProvider,\n address indexed verifier,\n IGraphPayments.PaymentTypes indexed paymentType,\n uint256 feeCut\n );\n\n // -- Events: thawing --\n\n /**\n * @notice Emitted when a thaw request is created.\n * @dev Can be emitted by the service provider when thawing stake or by the delegator when undelegating.\n * @param requestType The type of thaw request\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param owner The address of the owner of the thaw request.\n * @param shares The amount of shares being thawed\n * @param thawingUntil The timestamp until the stake is thawed\n * @param thawRequestId The ID of the thaw request\n * @param nonce The nonce of the thaw request\n */\n event ThawRequestCreated(\n IHorizonStakingTypes.ThawRequestType indexed requestType,\n address indexed serviceProvider,\n address indexed verifier,\n address owner,\n uint256 shares,\n uint64 thawingUntil,\n bytes32 thawRequestId,\n uint256 nonce\n );\n\n /**\n * @notice Emitted when a thaw request is fulfilled, meaning the stake is released.\n * @param requestType The type of thaw request\n * @param thawRequestId The ID of the thaw request\n * @param tokens The amount of tokens being released\n * @param shares The amount of shares being released\n * @param thawingUntil The timestamp until the stake has thawed\n * @param valid Whether the thaw request was valid at the time of fulfillment\n */\n event ThawRequestFulfilled(\n IHorizonStakingTypes.ThawRequestType indexed requestType,\n bytes32 indexed thawRequestId,\n uint256 tokens,\n uint256 shares,\n uint64 thawingUntil,\n bool valid\n );\n\n /**\n * @notice Emitted when a series of thaw requests are fulfilled.\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param owner The address of the owner of the thaw requests\n * @param thawRequestsFulfilled The number of thaw requests fulfilled\n * @param tokens The total amount of tokens being released\n * @param requestType The type of thaw request\n */\n event ThawRequestsFulfilled(\n IHorizonStakingTypes.ThawRequestType indexed requestType,\n address indexed serviceProvider,\n address indexed verifier,\n address owner,\n uint256 thawRequestsFulfilled,\n uint256 tokens\n );\n\n // -- Events: governance --\n\n /**\n * @notice Emitted when the global maximum thawing period allowed for provisions is set.\n * @param maxThawingPeriod The new maximum thawing period\n */\n event MaxThawingPeriodSet(uint64 maxThawingPeriod);\n\n /**\n * @notice Emitted when a verifier is allowed or disallowed to be used for locked provisions.\n * @param verifier The address of the verifier\n * @param allowed Whether the verifier is allowed or disallowed\n */\n event AllowedLockedVerifierSet(address indexed verifier, bool allowed);\n\n /**\n * @notice Emitted when the legacy global thawing period is set to zero.\n * @dev This marks the end of the transition period.\n */\n event ThawingPeriodCleared();\n\n /**\n * @notice Emitted when the delegation slashing global flag is set.\n */\n event DelegationSlashingEnabled();\n\n // -- Errors: tokens\n\n /**\n * @notice Thrown when operating a zero token amount is not allowed.\n */\n error HorizonStakingInvalidZeroTokens();\n\n /**\n * @notice Thrown when a minimum token amount is required to operate but it's not met.\n * @param tokens The actual token amount\n * @param minRequired The minimum required token amount\n */\n error HorizonStakingInsufficientTokens(uint256 tokens, uint256 minRequired);\n\n /**\n * @notice Thrown when the amount of tokens exceeds the maximum allowed to operate.\n * @param tokens The actual token amount\n * @param maxTokens The maximum allowed token amount\n */\n error HorizonStakingTooManyTokens(uint256 tokens, uint256 maxTokens);\n\n // -- Errors: provision --\n\n /**\n * @notice Thrown when attempting to operate with a provision that does not exist.\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n */\n error HorizonStakingInvalidProvision(address serviceProvider, address verifier);\n\n /**\n * @notice Thrown when the caller is not authorized to operate on a provision.\n * @param caller The caller address\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n */\n error HorizonStakingNotAuthorized(address serviceProvider, address verifier, address caller);\n\n /**\n * @notice Thrown when attempting to create a provision with a verifier other than the\n * subgraph data service. This restriction only applies during the transition period.\n * @param verifier The verifier address\n */\n error HorizonStakingInvalidVerifier(address verifier);\n\n /**\n * @notice Thrown when attempting to create a provision with an invalid maximum verifier cut.\n * @param maxVerifierCut The maximum verifier cut\n */\n error HorizonStakingInvalidMaxVerifierCut(uint32 maxVerifierCut);\n\n /**\n * @notice Thrown when attempting to create a provision with an invalid thawing period.\n * @param thawingPeriod The thawing period\n * @param maxThawingPeriod The maximum `thawingPeriod` allowed\n */\n error HorizonStakingInvalidThawingPeriod(uint64 thawingPeriod, uint64 maxThawingPeriod);\n\n /**\n * @notice Thrown when attempting to create a provision for a data service that already has a provision.\n */\n error HorizonStakingProvisionAlreadyExists();\n\n // -- Errors: stake --\n\n /**\n * @notice Thrown when the service provider has insufficient idle stake to operate.\n * @param tokens The actual token amount\n * @param minTokens The minimum required token amount\n */\n error HorizonStakingInsufficientIdleStake(uint256 tokens, uint256 minTokens);\n\n /**\n * @notice Thrown during the transition period when the service provider has insufficient stake to\n * cover their existing legacy allocations.\n * @param tokens The actual token amount\n * @param minTokens The minimum required token amount\n */\n error HorizonStakingInsufficientStakeForLegacyAllocations(uint256 tokens, uint256 minTokens);\n\n // -- Errors: delegation --\n\n /**\n * @notice Thrown when delegation shares obtained are below the expected amount.\n * @param shares The actual share amount\n * @param minShares The minimum required share amount\n */\n error HorizonStakingSlippageProtection(uint256 shares, uint256 minShares);\n\n /**\n * @notice Thrown when operating a zero share amount is not allowed.\n */\n error HorizonStakingInvalidZeroShares();\n\n /**\n * @notice Thrown when a minimum share amount is required to operate but it's not met.\n * @param shares The actual share amount\n * @param minShares The minimum required share amount\n */\n error HorizonStakingInsufficientShares(uint256 shares, uint256 minShares);\n\n /**\n * @notice Thrown when as a result of slashing delegation pool has no tokens but has shares.\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n */\n error HorizonStakingInvalidDelegationPoolState(address serviceProvider, address verifier);\n\n /**\n * @notice Thrown when attempting to operate with a delegation pool that does not exist.\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n */\n error HorizonStakingInvalidDelegationPool(address serviceProvider, address verifier);\n\n /**\n * @notice Thrown when the minimum token amount required for delegation is not met.\n * @param tokens The actual token amount\n * @param minTokens The minimum required token amount\n */\n error HorizonStakingInsufficientDelegationTokens(uint256 tokens, uint256 minTokens);\n\n /**\n * @notice Thrown when attempting to redelegate with a serivce provider that is the zero address.\n */\n error HorizonStakingInvalidServiceProviderZeroAddress();\n\n /**\n * @notice Thrown when attempting to redelegate with a verifier that is the zero address.\n */\n error HorizonStakingInvalidVerifierZeroAddress();\n\n // -- Errors: thaw requests --\n\n /**\n * @notice Thrown when attempting to fulfill a thaw request but there is nothing thawing.\n */\n error HorizonStakingNothingThawing();\n\n /**\n * @notice Thrown when a service provider has too many thaw requests.\n */\n error HorizonStakingTooManyThawRequests();\n\n /**\n * @notice Thrown when attempting to withdraw tokens that have not thawed (legacy undelegate).\n */\n error HorizonStakingNothingToWithdraw();\n\n // -- Errors: misc --\n /**\n * @notice Thrown during the transition period when attempting to withdraw tokens that are still thawing.\n * @dev Note this thawing refers to the global thawing period applied to legacy allocated tokens,\n * it does not refer to thaw requests.\n * @param until The block number until the stake is locked\n */\n error HorizonStakingStillThawing(uint256 until);\n\n /**\n * @notice Thrown when a service provider attempts to operate on verifiers that are not allowed.\n * @dev Only applies to stake from locked wallets.\n * @param verifier The verifier address\n */\n error HorizonStakingVerifierNotAllowed(address verifier);\n\n /**\n * @notice Thrown when a service provider attempts to change their own operator access.\n */\n error HorizonStakingCallerIsServiceProvider();\n\n /**\n * @notice Thrown when trying to set a delegation fee cut that is not valid.\n * @param feeCut The fee cut\n */\n error HorizonStakingInvalidDelegationFeeCut(uint256 feeCut);\n\n /**\n * @notice Thrown when a legacy slash fails.\n */\n error HorizonStakingLegacySlashFailed();\n\n /**\n * @notice Thrown when there attempting to slash a provision with no tokens to slash.\n */\n error HorizonStakingNoTokensToSlash();\n\n // -- Functions --\n\n /**\n * @notice Deposit tokens on the staking contract.\n * @dev Pulls tokens from the caller.\n *\n * Requirements:\n * - `_tokens` cannot be zero.\n * - Caller must have previously approved this contract to pull tokens from their balance.\n *\n * Emits a {HorizonStakeDeposited} event.\n *\n * @param tokens Amount of tokens to stake\n */\n function stake(uint256 tokens) external;\n\n /**\n * @notice Deposit tokens on the service provider stake, on behalf of the service provider.\n * @dev Pulls tokens from the caller.\n *\n * Requirements:\n * - `_tokens` cannot be zero.\n * - Caller must have previously approved this contract to pull tokens from their balance.\n *\n * Emits a {HorizonStakeDeposited} event.\n *\n * @param serviceProvider Address of the service provider\n * @param tokens Amount of tokens to stake\n */\n function stakeTo(address serviceProvider, uint256 tokens) external;\n\n /**\n * @notice Deposit tokens on the service provider stake, on behalf of the service provider,\n * provisioned to a specific verifier.\n * @dev This function can be called by the service provider, by an authorized operator or by the verifier itself.\n * @dev Requirements:\n * - The `serviceProvider` must have previously provisioned stake to `verifier`.\n * - `_tokens` cannot be zero.\n * - Caller must have previously approved this contract to pull tokens from their balance.\n *\n * Emits {HorizonStakeDeposited} and {ProvisionIncreased} events.\n *\n * @param serviceProvider Address of the service provider\n * @param verifier Address of the verifier\n * @param tokens Amount of tokens to stake\n */\n function stakeToProvision(address serviceProvider, address verifier, uint256 tokens) external;\n\n /**\n * @notice Move idle stake back to the owner's account.\n * Stake is removed from the protocol:\n * - During the transition period it's locked for a period of time before it can be withdrawn\n * by calling {withdraw}.\n * - After the transition period it's immediately withdrawn.\n * Note that after the transition period if there are tokens still locked they will have to be\n * withdrawn by calling {withdraw}.\n * @dev Requirements:\n * - `_tokens` cannot be zero.\n * - `_serviceProvider` must have enough idle stake to cover the staking amount and any\n * legacy allocation.\n *\n * Emits a {HorizonStakeLocked} event during the transition period.\n * Emits a {HorizonStakeWithdrawn} event after the transition period.\n *\n * @param tokens Amount of tokens to unstake\n */\n function unstake(uint256 tokens) external;\n\n /**\n * @notice Withdraw service provider tokens once the thawing period (initiated by {unstake}) has passed.\n * All thawed tokens are withdrawn.\n * @dev This is only needed during the transition period while we still have\n * a global lock. After that, unstake() will automatically withdraw.\n */\n function withdraw() external;\n\n /**\n * @notice Provision stake to a verifier. The tokens will be locked with a thawing period\n * and will be slashable by the verifier. This is the main mechanism to provision stake to a data\n * service, where the data service is the verifier.\n * This function can be called by the service provider or by an operator authorized by the provider\n * for this specific verifier.\n * @dev During the transition period, only the subgraph data service can be used as a verifier. This\n * prevents an escape hatch for legacy allocation stake.\n * @dev Requirements:\n * - `tokens` cannot be zero.\n * - The `serviceProvider` must have enough idle stake to cover the tokens to provision.\n * - `maxVerifierCut` must be a valid PPM.\n * - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`.\n *\n * Emits a {ProvisionCreated} event.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\n * @param tokens The amount of tokens that will be locked and slashable\n * @param maxVerifierCut The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\n * @param thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision\n */\n function provision(\n address serviceProvider,\n address verifier,\n uint256 tokens,\n uint32 maxVerifierCut,\n uint64 thawingPeriod\n ) external;\n\n /**\n * @notice Adds tokens from the service provider's idle stake to a provision\n * @dev\n *\n * Requirements:\n * - The `serviceProvider` must have previously provisioned stake to `verifier`.\n * - `tokens` cannot be zero.\n * - The `serviceProvider` must have enough idle stake to cover the tokens to add.\n *\n * Emits a {ProvisionIncreased} event.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param tokens The amount of tokens to add to the provision\n */\n function addToProvision(address serviceProvider, address verifier, uint256 tokens) external;\n\n /**\n * @notice Start thawing tokens to remove them from a provision.\n * This function can be called by the service provider or by an operator authorized by the provider\n * for this specific verifier.\n *\n * Note that removing tokens from a provision is a two step process:\n * - First the tokens are thawed using this function.\n * - Then after the thawing period, the tokens are removed from the provision using {deprovision}\n * or {reprovision}.\n *\n * @dev Requirements:\n * - The provision must have enough tokens available to thaw.\n * - `tokens` cannot be zero.\n *\n * Emits {ProvisionThawed} and {ThawRequestCreated} events.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address for which the tokens are provisioned\n * @param tokens The amount of tokens to thaw\n * @return The ID of the thaw request\n */\n function thaw(address serviceProvider, address verifier, uint256 tokens) external returns (bytes32);\n\n /**\n * @notice Remove tokens from a provision and move them back to the service provider's idle stake.\n * @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw\n * requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function\n * will attempt to fulfill all thaw requests until the first one that is not yet expired is found.\n *\n * Requirements:\n * - Must have previously initiated a thaw request using {thaw}.\n *\n * Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {TokensDeprovisioned} events.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\n */\n function deprovision(address serviceProvider, address verifier, uint256 nThawRequests) external;\n\n /**\n * @notice Move already thawed stake from one provision into another provision\n * This function can be called by the service provider or by an operator authorized by the provider\n * for the two corresponding verifiers.\n * @dev Requirements:\n * - Must have previously initiated a thaw request using {thaw}.\n * - `tokens` cannot be zero.\n * - The `serviceProvider` must have previously provisioned stake to `newVerifier`.\n * - The `serviceProvider` must have enough idle stake to cover the tokens to add.\n *\n * Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled}, {TokensDeprovisioned} and {ProvisionIncreased}\n * events.\n *\n * @param serviceProvider The service provider address\n * @param oldVerifier The verifier address for which the tokens are currently provisioned\n * @param newVerifier The verifier address for which the tokens will be provisioned\n * @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\n */\n function reprovision(\n address serviceProvider,\n address oldVerifier,\n address newVerifier,\n uint256 nThawRequests\n ) external;\n\n /**\n * @notice Stages a provision parameter update. Note that the change is not effective until the verifier calls\n * {acceptProvisionParameters}. Calling this function is a no-op if the new parameters are the same as the current\n * ones.\n * @dev This two step update process prevents the service provider from changing the parameters\n * without the verifier's consent.\n *\n * Requirements:\n * - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`. Note that if `_maxThawingPeriod` changes the\n * function will not revert if called with the same thawing period as the current one.\n *\n * Emits a {ProvisionParametersStaged} event if at least one of the parameters changed.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param maxVerifierCut The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for\n * themselves when slashing\n * @param thawingPeriod The proposed period in seconds that the tokens will be thawing before they can be removed from\n * the provision\n */\n function setProvisionParameters(\n address serviceProvider,\n address verifier,\n uint32 maxVerifierCut,\n uint64 thawingPeriod\n ) external;\n\n /**\n * @notice Accepts a staged provision parameter update.\n * @dev Only the provision's verifier can call this function.\n *\n * Emits a {ProvisionParametersSet} event.\n *\n * @param serviceProvider The service provider address\n */\n function acceptProvisionParameters(address serviceProvider) external;\n\n /**\n * @notice Delegate tokens to a provision.\n * @dev Requirements:\n * - `tokens` cannot be zero.\n * - Caller must have previously approved this contract to pull tokens from their balance.\n * - The provision must exist.\n *\n * Emits a {TokensDelegated} event.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param tokens The amount of tokens to delegate\n * @param minSharesOut The minimum amount of shares to accept, slippage protection.\n */\n function delegate(address serviceProvider, address verifier, uint256 tokens, uint256 minSharesOut) external;\n\n /**\n * @notice Add tokens to a delegation pool without issuing shares.\n * Used by data services to pay delegation fees/rewards.\n * Delegators SHOULD NOT call this function.\n *\n * @dev Requirements:\n * - `tokens` cannot be zero.\n * - Caller must have previously approved this contract to pull tokens from their balance.\n *\n * Emits a {TokensToDelegationPoolAdded} event.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address for which the tokens are provisioned\n * @param tokens The amount of tokens to add to the delegation pool\n */\n function addToDelegationPool(address serviceProvider, address verifier, uint256 tokens) external;\n\n /**\n * @notice Undelegate tokens from a provision and start thawing them.\n * Note that undelegating tokens from a provision is a two step process:\n * - First the tokens are thawed using this function.\n * - Then after the thawing period, the tokens are removed from the provision using {withdrawDelegated}.\n *\n * Requirements:\n * - `shares` cannot be zero.\n *\n * Emits a {TokensUndelegated} and {ThawRequestCreated} event.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param shares The amount of shares to undelegate\n * @return The ID of the thaw request\n */\n function undelegate(address serviceProvider, address verifier, uint256 shares) external returns (bytes32);\n\n /**\n * @notice Withdraw undelegated tokens from a provision after thawing.\n * @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw\n * requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function\n * will attempt to fulfill all thaw requests until the first one that is not yet expired is found.\n * @dev If the delegation pool was completely slashed before withdrawing, calling this function will fulfill\n * the thaw requests with an amount equal to zero.\n *\n * Requirements:\n * - Must have previously initiated a thaw request using {undelegate}.\n *\n * Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\n */\n function withdrawDelegated(address serviceProvider, address verifier, uint256 nThawRequests) external;\n\n /**\n * @notice Re-delegate undelegated tokens from a provision after thawing to a `newServiceProvider` and `newVerifier`.\n * @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw\n * requests in the event that fulfilling all of them results in a gas limit error.\n *\n * Requirements:\n * - Must have previously initiated a thaw request using {undelegate}.\n * - `newServiceProvider` and `newVerifier` must not be the zero address.\n * - `newServiceProvider` must have previously provisioned stake to `newVerifier`.\n *\n * Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\n *\n * @param oldServiceProvider The old service provider address\n * @param oldVerifier The old verifier address\n * @param newServiceProvider The address of a new service provider\n * @param newVerifier The address of a new verifier\n * @param minSharesForNewProvider The minimum amount of shares to accept for the new service provider\n * @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\n */\n function redelegate(\n address oldServiceProvider,\n address oldVerifier,\n address newServiceProvider,\n address newVerifier,\n uint256 minSharesForNewProvider,\n uint256 nThawRequests\n ) external;\n\n /**\n * @notice Set the fee cut for a verifier on a specific payment type.\n * @dev Emits a {DelegationFeeCutSet} event.\n * @param serviceProvider The service provider address\n * @param verifier The verifier address\n * @param paymentType The payment type for which the fee cut is set, as defined in {IGraphPayments}\n * @param feeCut The fee cut to set, in PPM\n */\n function setDelegationFeeCut(\n address serviceProvider,\n address verifier,\n IGraphPayments.PaymentTypes paymentType,\n uint256 feeCut\n ) external;\n\n /**\n * @notice Delegate tokens to the subgraph data service provision.\n * This function is for backwards compatibility with the legacy staking contract.\n * It only allows delegating to the subgraph data service and DOES NOT have slippage protection.\n * @dev See {delegate}.\n * @param serviceProvider The service provider address\n * @param tokens The amount of tokens to delegate\n */\n function delegate(address serviceProvider, uint256 tokens) external;\n\n /**\n * @notice Undelegate tokens from the subgraph data service provision and start thawing them.\n * This function is for backwards compatibility with the legacy staking contract.\n * It only allows undelegating from the subgraph data service.\n * @dev See {undelegate}.\n * @param serviceProvider The service provider address\n * @param shares The amount of shares to undelegate\n */\n function undelegate(address serviceProvider, uint256 shares) external;\n\n /**\n * @notice Withdraw undelegated tokens from the subgraph data service provision after thawing.\n * This function is for backwards compatibility with the legacy staking contract.\n * It only allows withdrawing tokens undelegated before horizon upgrade.\n * @dev See {delegate}.\n * @param serviceProvider The service provider address\n * @param deprecated Deprecated parameter kept for backwards compatibility\n * @return The amount of tokens withdrawn\n */\n function withdrawDelegated(\n address serviceProvider,\n address deprecated // kept for backwards compatibility\n ) external returns (uint256);\n\n /**\n * @notice Slash a service provider. This can only be called by a verifier to which\n * the provider has provisioned stake, and up to the amount of tokens they have provisioned.\n * If the service provider's stake is not enough, the associated delegation pool might be slashed\n * depending on the value of the global delegation slashing flag.\n *\n * Part of the slashed tokens are sent to the `verifierDestination` as a reward.\n *\n * @dev Requirements:\n * - `tokens` must be less than or equal to the amount of tokens provisioned by the service provider.\n * - `tokensVerifier` must be less than the provision's tokens times the provision's maximum verifier cut.\n *\n * Emits a {ProvisionSlashed} and {VerifierTokensSent} events.\n * Emits a {DelegationSlashed} or {DelegationSlashingSkipped} event depending on the global delegation slashing\n * flag.\n *\n * @param serviceProvider The service provider to slash\n * @param tokens The amount of tokens to slash\n * @param tokensVerifier The amount of tokens to transfer instead of burning\n * @param verifierDestination The address to transfer the verifier cut to\n */\n function slash(\n address serviceProvider,\n uint256 tokens,\n uint256 tokensVerifier,\n address verifierDestination\n ) external;\n\n /**\n * @notice Provision stake to a verifier using locked tokens (i.e. from GraphTokenLockWallets).\n * @dev See {provision}.\n *\n * Additional requirements:\n * - The `verifier` must be allowed to be used for locked provisions.\n *\n * @param serviceProvider The service provider address\n * @param verifier The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\n * @param tokens The amount of tokens that will be locked and slashable\n * @param maxVerifierCut The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\n * @param thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision\n */\n function provisionLocked(\n address serviceProvider,\n address verifier,\n uint256 tokens,\n uint32 maxVerifierCut,\n uint64 thawingPeriod\n ) external;\n\n /**\n * @notice Authorize or unauthorize an address to be an operator for the caller on a verifier.\n *\n * @dev See {setOperator}.\n * Additional requirements:\n * - The `verifier` must be allowed to be used for locked provisions.\n *\n * @param verifier The verifier / data service on which they'll be allowed to operate\n * @param operator Address to authorize or unauthorize\n * @param allowed Whether the operator is authorized or not\n */\n function setOperatorLocked(address verifier, address operator, bool allowed) external;\n\n /**\n * @notice Sets a verifier as a globally allowed verifier for locked provisions.\n * @dev This function can only be called by the contract governor, it's used to maintain\n * a whitelist of verifiers that do not allow the stake from a locked wallet to escape the lock.\n * @dev Emits a {AllowedLockedVerifierSet} event.\n * @param verifier The verifier address\n * @param allowed Whether the verifier is allowed or not\n */\n function setAllowedLockedVerifier(address verifier, bool allowed) external;\n\n /**\n * @notice Set the global delegation slashing flag to true.\n * @dev This function can only be called by the contract governor.\n */\n function setDelegationSlashingEnabled() external;\n\n /**\n * @notice Clear the legacy global thawing period.\n * This signifies the end of the transition period, after which no legacy allocations should be left.\n * @dev This function can only be called by the contract governor.\n * @dev Emits a {ThawingPeriodCleared} event.\n */\n function clearThawingPeriod() external;\n\n /**\n * @notice Sets the global maximum thawing period allowed for provisions.\n * @param maxThawingPeriod The new maximum thawing period, in seconds\n */\n function setMaxThawingPeriod(uint64 maxThawingPeriod) external;\n\n /**\n * @notice Authorize or unauthorize an address to be an operator for the caller on a data service.\n * @dev Emits a {OperatorSet} event.\n * @param verifier The verifier / data service on which they'll be allowed to operate\n * @param operator Address to authorize or unauthorize\n * @param allowed Whether the operator is authorized or not\n */\n function setOperator(address verifier, address operator, bool allowed) external;\n\n /**\n * @notice Check if an operator is authorized for the caller on a specific verifier / data service.\n * @param serviceProvider The service provider on behalf of whom they're claiming to act\n * @param verifier The verifier / data service on which they're claiming to act\n * @param operator The address to check for auth\n * @return Whether the operator is authorized or not\n */\n function isAuthorized(address serviceProvider, address verifier, address operator) external view returns (bool);\n\n /**\n * @notice Get the address of the staking extension.\n * @return The address of the staking extension\n */\n function getStakingExtension() external view returns (address);\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\n/**\n * @title Defines the data types used in the Horizon staking contract\n * @dev In order to preserve storage compatibility some data structures keep deprecated fields.\n * These structures have then two representations, an internal one used by the contract storage and a public one.\n * Getter functions should retrieve internal representations, remove deprecated fields and return the public representation.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IHorizonStakingTypes {\n /**\n * @notice Represents stake assigned to a specific verifier/data service.\n * Provisioned stake is locked and can be used as economic security by a data service.\n * @param tokens Service provider tokens in the provision (does not include delegated tokens)\n * @param tokensThawing Service provider tokens that are being thawed (and will stop being slashable soon)\n * @param sharesThawing Shares representing the thawing tokens\n * @param maxVerifierCut Max amount that can be taken by the verifier when slashing, expressed in parts-per-million of the amount slashed\n * @param thawingPeriod Time, in seconds, tokens must thaw before being withdrawn\n * @param createdAt Timestamp when the provision was created\n * @param maxVerifierCutPending Pending value for `maxVerifierCut`. Verifier needs to accept it before it becomes active.\n * @param thawingPeriodPending Pending value for `thawingPeriod`. Verifier needs to accept it before it becomes active.\n * @param lastParametersStagedAt Timestamp when the provision parameters were last staged. Can be used by data service implementation to\n * implement arbitrary parameter update logic.\n * @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid.\n */\n struct Provision {\n uint256 tokens;\n uint256 tokensThawing;\n uint256 sharesThawing;\n uint32 maxVerifierCut;\n uint64 thawingPeriod;\n uint64 createdAt;\n uint32 maxVerifierCutPending;\n uint64 thawingPeriodPending;\n uint256 lastParametersStagedAt;\n uint256 thawingNonce;\n }\n\n /**\n * @notice Public representation of a service provider.\n * @dev See {ServiceProviderInternal} for the actual storage representation\n * @param tokensStaked Total amount of tokens on the provider stake (only staked by the provider, includes all provisions)\n * @param tokensProvisioned Total amount of tokens locked in provisions (only staked by the provider)\n */\n struct ServiceProvider {\n uint256 tokensStaked;\n uint256 tokensProvisioned;\n }\n\n /**\n * @notice Internal representation of a service provider.\n * @dev It contains deprecated fields from the `Indexer` struct to maintain storage compatibility.\n * @param tokensStaked Total amount of tokens on the provider stake (only staked by the provider, includes all provisions)\n * @param __DEPRECATED_tokensAllocated (Deprecated) Tokens used in allocations\n * @param __DEPRECATED_tokensLocked (Deprecated) Tokens locked for withdrawal subject to thawing period\n * @param __DEPRECATED_tokensLockedUntil (Deprecated) Block when locked tokens can be withdrawn\n * @param tokensProvisioned Total amount of tokens locked in provisions (only staked by the provider)\n */\n struct ServiceProviderInternal {\n uint256 tokensStaked;\n uint256 __DEPRECATED_tokensAllocated;\n uint256 __DEPRECATED_tokensLocked;\n uint256 __DEPRECATED_tokensLockedUntil;\n uint256 tokensProvisioned;\n }\n\n /**\n * @notice Public representation of a delegation pool.\n * @dev See {DelegationPoolInternal} for the actual storage representation\n * @param tokens Total tokens as pool reserves\n * @param shares Total shares minted in the pool\n * @param tokensThawing Tokens thawing in the pool\n * @param sharesThawing Shares representing the thawing tokens\n * @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid.\n */\n struct DelegationPool {\n uint256 tokens;\n uint256 shares;\n uint256 tokensThawing;\n uint256 sharesThawing;\n uint256 thawingNonce;\n }\n\n /**\n * @notice Internal representation of a delegation pool.\n * @dev It contains deprecated fields from the previous version of the `DelegationPool` struct\n * to maintain storage compatibility.\n * @param __DEPRECATED_cooldownBlocks (Deprecated) Time, in blocks, an indexer must wait before updating delegation parameters\n * @param __DEPRECATED_indexingRewardCut (Deprecated) Percentage of indexing rewards for the service provider, in PPM\n * @param __DEPRECATED_queryFeeCut (Deprecated) Percentage of query fees for the service provider, in PPM\n * @param __DEPRECATED_updatedAtBlock (Deprecated) Block when the delegation parameters were last updated\n * @param tokens Total tokens as pool reserves\n * @param shares Total shares minted in the pool\n * @param delegators Delegation details by delegator\n * @param tokensThawing Tokens thawing in the pool\n * @param sharesThawing Shares representing the thawing tokens\n * @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid.\n */\n struct DelegationPoolInternal {\n uint32 __DEPRECATED_cooldownBlocks;\n uint32 __DEPRECATED_indexingRewardCut;\n uint32 __DEPRECATED_queryFeeCut;\n uint256 __DEPRECATED_updatedAtBlock;\n uint256 tokens;\n uint256 shares;\n mapping(address delegator => DelegationInternal delegation) delegators;\n uint256 tokensThawing;\n uint256 sharesThawing;\n uint256 thawingNonce;\n }\n\n /**\n * @notice Public representation of delegation details.\n * @dev See {DelegationInternal} for the actual storage representation\n * @param shares Shares owned by a delegator in the pool\n */\n struct Delegation {\n uint256 shares;\n }\n\n /**\n * @notice Internal representation of delegation details.\n * @dev It contains deprecated fields from the previous version of the `Delegation` struct\n * to maintain storage compatibility.\n * @param shares Shares owned by the delegator in the pool\n * @param __DEPRECATED_tokensLocked Tokens locked for undelegation\n * @param __DEPRECATED_tokensLockedUntil Epoch when locked tokens can be withdrawn\n */\n struct DelegationInternal {\n uint256 shares;\n uint256 __DEPRECATED_tokensLocked;\n uint256 __DEPRECATED_tokensLockedUntil;\n }\n\n /**\n * @dev Enum to specify the type of thaw request.\n * @param Provision Represents a thaw request for a provision.\n * @param Delegation Represents a thaw request for a delegation.\n */\n enum ThawRequestType {\n Provision,\n Delegation\n }\n\n /**\n * @notice Details of a stake thawing operation.\n * @dev ThawRequests are stored in linked lists by service provider/delegator,\n * ordered by creation timestamp.\n * @param shares Shares that represent the tokens being thawed\n * @param thawingUntil The timestamp when the thawed funds can be removed from the provision\n * @param nextRequest Id of the next thaw request in the linked list\n * @param thawingNonce Used to invalidate unfulfilled thaw requests\n */\n struct ThawRequest {\n uint256 shares;\n uint64 thawingUntil;\n bytes32 nextRequest;\n uint256 thawingNonce;\n }\n\n /**\n * @notice Parameters to fulfill thaw requests.\n * @dev This struct is used to avoid stack too deep error in the `fulfillThawRequests` function.\n * @param requestType The type of thaw request (Provision or Delegation)\n * @param serviceProvider The address of the service provider\n * @param verifier The address of the verifier\n * @param owner The address of the owner of the thaw request\n * @param tokensThawing The current amount of tokens already thawing\n * @param sharesThawing The current amount of shares already thawing\n * @param nThawRequests The number of thaw requests to fulfill. If set to 0, all thaw requests are fulfilled.\n * @param thawingNonce The current valid thawing nonce. Any thaw request with a different nonce is invalid and should be ignored.\n */\n struct FulfillThawRequestsParams {\n ThawRequestType requestType;\n address serviceProvider;\n address verifier;\n address owner;\n uint256 tokensThawing;\n uint256 sharesThawing;\n uint256 nThawRequests;\n uint256 thawingNonce;\n }\n\n /**\n * @notice Results of the traversal of thaw requests.\n * @dev This struct is used to avoid stack too deep error in the `fulfillThawRequests` function.\n * @param requestsFulfilled The number of thaw requests fulfilled\n * @param tokensThawed The total amount of tokens thawed\n * @param tokensThawing The total amount of tokens thawing\n * @param sharesThawing The total amount of shares thawing\n */\n struct TraverseThawRequestsResults {\n uint256 requestsFulfilled;\n uint256 tokensThawed;\n uint256 tokensThawing;\n uint256 sharesThawing;\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IGraphPayments } from \"./IGraphPayments.sol\";\n\n/**\n * @title Interface for a payments collector contract as defined by Graph Horizon payments protocol\n * @notice Contracts implementing this interface can be used with the payments protocol. First, a payer must\n * approve the collector to collect payments on their behalf. Only then can payment collection be initiated\n * using the collector contract.\n *\n * @dev It's important to note that it's the collector contract's responsibility to validate the payment\n * request is legitimate.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IPaymentsCollector {\n /**\n * @notice Emitted when a payment is collected\n * @param paymentType The payment type collected as defined by {IGraphPayments}\n * @param collectionId The id for the collection. Can be used at the discretion of the collector to group multiple payments.\n * @param payer The address of the payer\n * @param receiver The address of the receiver\n * @param dataService The address of the data service\n * @param tokens The amount of tokens being collected\n */\n event PaymentCollected(\n IGraphPayments.PaymentTypes paymentType,\n bytes32 indexed collectionId,\n address indexed payer,\n address receiver,\n address indexed dataService,\n uint256 tokens\n );\n\n /**\n * @notice Initiate a payment collection through the payments protocol\n * @dev This function should require the caller to present some form of evidence of the payer's debt to\n * the receiver. The collector should validate this evidence and, if valid, collect the payment.\n *\n * Emits a {PaymentCollected} event\n *\n * @param paymentType The payment type to collect, as defined by {IGraphPayments}\n * @param data Additional data required for the payment collection. Will vary depending on the collector\n * implementation.\n * @return The amount of tokens collected\n */\n function collect(IGraphPayments.PaymentTypes paymentType, bytes memory data) external returns (uint256);\n}\n" + }, + "@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IGraphPayments } from \"./IGraphPayments.sol\";\n\n/**\n * @title Interface for the {PaymentsEscrow} contract\n * @notice This contract is part of the Graph Horizon payments protocol. It holds the funds (GRT)\n * for payments made through the payments protocol for services provided\n * via a Graph Horizon data service.\n *\n * Payers deposit funds on the escrow, signalling their ability to pay for a service, and only\n * being able to retrieve them after a thawing period. Receivers collect funds from the escrow,\n * provided the payer has authorized them. The payer authorization is delegated to a payment\n * collector contract which implements the {IPaymentsCollector} interface.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IPaymentsEscrow {\n /**\n * @notice Escrow account for a payer-collector-receiver tuple\n * @param balance The total token balance for the payer-collector-receiver tuple\n * @param tokensThawing The amount of tokens currently being thawed\n * @param thawEndTimestamp The timestamp at which thawing period ends (zero if not thawing)\n */\n struct EscrowAccount {\n uint256 balance;\n uint256 tokensThawing;\n uint256 thawEndTimestamp;\n }\n\n /**\n * @notice Emitted when a payer deposits funds into the escrow for a payer-collector-receiver tuple\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens deposited\n */\n event Deposit(address indexed payer, address indexed collector, address indexed receiver, uint256 tokens);\n\n /**\n * @notice Emitted when a payer cancels an escrow thawing\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokensThawing The amount of tokens that were being thawed\n * @param thawEndTimestamp The timestamp at which the thawing period was ending\n */\n event CancelThaw(\n address indexed payer,\n address indexed collector,\n address indexed receiver,\n uint256 tokensThawing,\n uint256 thawEndTimestamp\n );\n\n /**\n * @notice Emitted when a payer thaws funds from the escrow for a payer-collector-receiver tuple\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens being thawed\n * @param thawEndTimestamp The timestamp at which the thawing period ends\n */\n event Thaw(\n address indexed payer,\n address indexed collector,\n address indexed receiver,\n uint256 tokens,\n uint256 thawEndTimestamp\n );\n\n /**\n * @notice Emitted when a payer withdraws funds from the escrow for a payer-collector-receiver tuple\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens withdrawn\n */\n event Withdraw(address indexed payer, address indexed collector, address indexed receiver, uint256 tokens);\n\n /**\n * @notice Emitted when a collector collects funds from the escrow for a payer-collector-receiver tuple\n * @param paymentType The type of payment being collected as defined in the {IGraphPayments} interface\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens collected\n * @param receiverDestination The address where the receiver's payment should be sent.\n */\n event EscrowCollected(\n IGraphPayments.PaymentTypes indexed paymentType,\n address indexed payer,\n address indexed collector,\n address receiver,\n uint256 tokens,\n address receiverDestination\n );\n\n // -- Errors --\n\n /**\n * @notice Thrown when a protected function is called and the contract is paused.\n */\n error PaymentsEscrowIsPaused();\n\n /**\n * @notice Thrown when the available balance is insufficient to perform an operation\n * @param balance The current balance\n * @param minBalance The minimum required balance\n */\n error PaymentsEscrowInsufficientBalance(uint256 balance, uint256 minBalance);\n\n /**\n * @notice Thrown when a thawing is expected to be in progress but it is not\n */\n error PaymentsEscrowNotThawing();\n\n /**\n * @notice Thrown when a thawing is still in progress\n * @param currentTimestamp The current timestamp\n * @param thawEndTimestamp The timestamp at which the thawing period ends\n */\n error PaymentsEscrowStillThawing(uint256 currentTimestamp, uint256 thawEndTimestamp);\n\n /**\n * @notice Thrown when setting the thawing period to a value greater than the maximum\n * @param thawingPeriod The thawing period\n * @param maxWaitPeriod The maximum wait period\n */\n error PaymentsEscrowThawingPeriodTooLong(uint256 thawingPeriod, uint256 maxWaitPeriod);\n\n /**\n * @notice Thrown when the contract balance is not consistent with the collection amount\n * @param balanceBefore The balance before the collection\n * @param balanceAfter The balance after the collection\n * @param tokens The amount of tokens collected\n */\n error PaymentsEscrowInconsistentCollection(uint256 balanceBefore, uint256 balanceAfter, uint256 tokens);\n\n /**\n * @notice Thrown when operating a zero token amount is not allowed.\n */\n error PaymentsEscrowInvalidZeroTokens();\n\n /**\n * @notice Initialize the contract\n */\n function initialize() external;\n\n /**\n * @notice Deposits funds into the escrow for a payer-collector-receiver tuple, where\n * the payer is the transaction caller.\n * @dev Emits a {Deposit} event\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens to deposit\n */\n function deposit(address collector, address receiver, uint256 tokens) external;\n\n /**\n * @notice Deposits funds into the escrow for a payer-collector-receiver tuple, where\n * the payer can be specified.\n * @dev Emits a {Deposit} event\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens to deposit\n */\n function depositTo(address payer, address collector, address receiver, uint256 tokens) external;\n\n /**\n * @notice Thaw a specific amount of escrow from a payer-collector-receiver's escrow account.\n * The payer is the transaction caller.\n * Note that repeated calls to this function will overwrite the previous thawing amount\n * and reset the thawing period.\n * @dev Requirements:\n * - `tokens` must be less than or equal to the available balance\n *\n * Emits a {Thaw} event.\n *\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens to thaw\n */\n function thaw(address collector, address receiver, uint256 tokens) external;\n\n /**\n * @notice Cancels the thawing of escrow from a payer-collector-receiver's escrow account.\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @dev Requirements:\n * - The payer must be thawing funds\n * Emits a {CancelThaw} event.\n */\n function cancelThaw(address collector, address receiver) external;\n\n /**\n * @notice Withdraws all thawed escrow from a payer-collector-receiver's escrow account.\n * The payer is the transaction caller.\n * Note that the withdrawn funds might be less than the thawed amount if there were\n * payment collections in the meantime.\n * @dev Requirements:\n * - Funds must be thawed\n *\n * Emits a {Withdraw} event\n *\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n */\n function withdraw(address collector, address receiver) external;\n\n /**\n * @notice Collects funds from the payer-collector-receiver's escrow and sends them to {GraphPayments} for\n * distribution using the Graph Horizon Payments protocol.\n * The function will revert if there are not enough funds in the escrow.\n *\n * Emits an {EscrowCollected} event\n *\n * @param paymentType The type of payment being collected as defined in the {IGraphPayments} interface\n * @param payer The address of the payer\n * @param receiver The address of the receiver\n * @param tokens The amount of tokens to collect\n * @param dataService The address of the data service\n * @param dataServiceCut The data service cut in PPM that {GraphPayments} should send\n * @param receiverDestination The address where the receiver's payment should be sent.\n */\n function collect(\n IGraphPayments.PaymentTypes paymentType,\n address payer,\n address receiver,\n uint256 tokens,\n address dataService,\n uint256 dataServiceCut,\n address receiverDestination\n ) external;\n\n /**\n * @notice Get the balance of a payer-collector-receiver tuple\n * This function will return 0 if the current balance is less than the amount of funds being thawed.\n * @param payer The address of the payer\n * @param collector The address of the collector\n * @param receiver The address of the receiver\n * @return The balance of the payer-collector-receiver tuple\n */\n function getBalance(address payer, address collector, address receiver) external view returns (uint256);\n}\n" + }, + "@graphprotocol/horizon/contracts/libraries/LinkedList.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\n/**\n * @title LinkedList library\n * @notice A library to manage singly linked lists.\n *\n * The library makes no assumptions about the contents of the items, the only\n * requirements on the items are:\n * - they must be represented by a unique bytes32 id\n * - the id of the item must not be bytes32(0)\n * - each item must have a reference to the next item in the list\n * - the list cannot have more than `MAX_ITEMS` items\n *\n * A contract using this library must store:\n * - a LinkedList.List to keep track of the list metadata\n * - a mapping from bytes32 to the item data\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary LinkedList {\n using LinkedList for List;\n\n /**\n * @notice Represents a linked list\n * @param head The head of the list\n * @param tail The tail of the list\n * @param nonce A nonce, which can optionally be used to generate unique ids\n * @param count The number of items in the list\n */\n struct List {\n bytes32 head;\n bytes32 tail;\n uint256 nonce;\n uint256 count;\n }\n\n /// @notice Empty bytes constant\n bytes internal constant NULL_BYTES = bytes(\"\");\n\n /// @notice Maximum amount of items allowed in the list\n uint256 internal constant MAX_ITEMS = 10_000;\n\n /**\n * @notice Thrown when trying to remove an item from an empty list\n */\n error LinkedListEmptyList();\n\n /**\n * @notice Thrown when trying to add an item to a list that has reached the maximum number of elements\n */\n error LinkedListMaxElementsExceeded();\n\n /**\n * @notice Thrown when trying to traverse a list with more iterations than elements\n */\n error LinkedListInvalidIterations();\n\n /**\n * @notice Thrown when trying to add an item with id equal to bytes32(0)\n */\n error LinkedListInvalidZeroId();\n\n /**\n * @notice Adds an item to the list.\n * The item is added to the end of the list.\n * @dev Note that this function will not take care of linking the\n * old tail to the new item. The caller should take care of this.\n * It will also not ensure id uniqueness.\n * @dev There is a maximum number of elements that can be added to the list.\n * @param self The list metadata\n * @param id The id of the item to add\n */\n function addTail(List storage self, bytes32 id) internal {\n require(self.count < MAX_ITEMS, LinkedListMaxElementsExceeded());\n require(id != bytes32(0), LinkedListInvalidZeroId());\n self.tail = id;\n self.nonce += 1;\n if (self.count == 0) self.head = id;\n self.count += 1;\n }\n\n /**\n * @notice Removes an item from the list.\n * The item is removed from the beginning of the list.\n * @param self The list metadata\n * @param getNextItem A function to get the next item in the list. It should take\n * the id of the current item and return the id of the next item.\n * @param deleteItem A function to delete an item. This should delete the item from\n * the contract storage. It takes the id of the item to delete.\n * @return The id of the head of the list.\n */\n function removeHead(\n List storage self,\n function(bytes32) view returns (bytes32) getNextItem,\n function(bytes32) deleteItem\n ) internal returns (bytes32) {\n require(self.count > 0, LinkedListEmptyList());\n bytes32 nextItem = getNextItem(self.head);\n deleteItem(self.head);\n self.count -= 1;\n self.head = nextItem;\n if (self.count == 0) self.tail = bytes32(0);\n return self.head;\n }\n\n /**\n * @notice Traverses the list and processes each item.\n * It deletes the processed items from both the list and the storage mapping.\n * @param self The list metadata\n * @param getNextItem A function to get the next item in the list. It should take\n * the id of the current item and return the id of the next item.\n * @param processItem A function to process an item. The function should take the id of the item\n * and an accumulator, and return:\n * - a boolean indicating whether the traversal should stop\n * - an accumulator to pass data between iterations\n * @param deleteItem A function to delete an item. This should delete the item from\n * the contract storage. It takes the id of the item to delete.\n * @param processInitAcc The initial accumulator data\n * @param iterations The maximum number of iterations to perform. If 0, the traversal will continue\n * until the end of the list.\n * @return The number of items processed\n * @return The final accumulator data.\n */\n function traverse(\n List storage self,\n function(bytes32) view returns (bytes32) getNextItem,\n function(bytes32, bytes memory) returns (bool, bytes memory) processItem,\n function(bytes32) deleteItem,\n bytes memory processInitAcc,\n uint256 iterations\n ) internal returns (uint256, bytes memory) {\n require(iterations <= self.count, LinkedListInvalidIterations());\n\n uint256 itemCount = 0;\n iterations = (iterations == 0) ? self.count : iterations;\n\n bytes32 cursor = self.head;\n\n while (cursor != bytes32(0) && iterations > 0) {\n (bool shouldBreak, bytes memory acc_) = processItem(cursor, processInitAcc);\n\n if (shouldBreak) break;\n\n processInitAcc = acc_;\n cursor = self.removeHead(getNextItem, deleteItem);\n\n iterations--;\n itemCount++;\n }\n\n return (itemCount, processInitAcc);\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/libraries/MathUtils.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\n/**\n * @title MathUtils Library\n * @notice A collection of functions to perform math operations\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary MathUtils {\n /**\n * @dev Calculates the weighted average of two values pondering each of these\n * values based on configured weights. The contribution of each value N is\n * weightN/(weightA + weightB). The calculation rounds up to ensure the result\n * is always equal or greater than the smallest of the two values.\n * @param valueA The amount for value A\n * @param weightA The weight to use for value A\n * @param valueB The amount for value B\n * @param weightB The weight to use for value B\n */\n function weightedAverageRoundingUp(\n uint256 valueA,\n uint256 weightA,\n uint256 valueB,\n uint256 weightB\n ) internal pure returns (uint256) {\n return ((valueA * weightA) + (valueB * weightB) + (weightA + weightB - 1)) / (weightA + weightB);\n }\n\n /**\n * @dev Returns the minimum of two numbers.\n * @param x The first number\n * @param y The second number\n * @return The minimum of the two numbers\n */\n function min(uint256 x, uint256 y) internal pure returns (uint256) {\n return x <= y ? x : y;\n }\n\n /**\n * @dev Returns the difference between two numbers or zero if negative.\n * @param x The first number\n * @param y The second number\n * @return The difference between the two numbers or zero if negative\n */\n function diffOrZero(uint256 x, uint256 y) internal pure returns (uint256) {\n return (x > y) ? x - y : 0;\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/libraries/PPMMath.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title PPMMath library\n * @notice A library for handling calculations with parts per million (PPM) amounts.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary PPMMath {\n /// @notice Maximum value (100%) in parts per million (PPM).\n uint256 internal constant MAX_PPM = 1_000_000;\n\n /**\n * @notice Thrown when a value is expected to be in PPM but is not.\n * @param value The value that is not in PPM.\n */\n error PPMMathInvalidPPM(uint256 value);\n\n /**\n * @notice Thrown when no value in a multiplication is in PPM.\n * @param a The first value in the multiplication.\n * @param b The second value in the multiplication.\n */\n error PPMMathInvalidMulPPM(uint256 a, uint256 b);\n\n /**\n * @notice Multiplies two values, one of which must be in PPM.\n * @param a The first value.\n * @param b The second value.\n * @return The result of the multiplication.\n */\n function mulPPM(uint256 a, uint256 b) internal pure returns (uint256) {\n require(isValidPPM(a) || isValidPPM(b), PPMMathInvalidMulPPM(a, b));\n return (a * b) / MAX_PPM;\n }\n\n /**\n * @notice Multiplies two values, the second one must be in PPM, and rounds up the result.\n * @dev requirements:\n * - The second value must be in PPM.\n * @param a The first value.\n * @param b The second value.\n * @return The result of the multiplication.\n */\n function mulPPMRoundUp(uint256 a, uint256 b) internal pure returns (uint256) {\n require(isValidPPM(b), PPMMathInvalidPPM(b));\n return a - mulPPM(a, MAX_PPM - b);\n }\n\n /**\n * @notice Checks if a value is in PPM.\n * @dev A valid PPM value is between 0 and MAX_PPM.\n * @param value The value to check.\n * @return true if the value is in PPM, false otherwise.\n */\n function isValidPPM(uint256 value) internal pure returns (bool) {\n return value <= MAX_PPM;\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/libraries/UintRange.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title UintRange library\n * @notice A library for handling range checks on uint256 values.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary UintRange {\n /**\n * @notice Checks if a value is in the range [`min`, `max`].\n * @param value The value to check.\n * @param min The minimum value of the range.\n * @param max The maximum value of the range.\n * @return true if the value is in the range, false otherwise.\n */\n function isInRange(uint256 value, uint256 min, uint256 max) internal pure returns (bool) {\n return value >= min && value <= max;\n }\n}\n" + }, + "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IGraphToken } from \"@graphprotocol/contracts/contracts/token/IGraphToken.sol\";\nimport { IHorizonStaking } from \"../interfaces/IHorizonStaking.sol\";\nimport { IGraphPayments } from \"../interfaces/IGraphPayments.sol\";\nimport { IPaymentsEscrow } from \"../interfaces/IPaymentsEscrow.sol\";\n\nimport { IController } from \"@graphprotocol/contracts/contracts/governance/IController.sol\";\nimport { IEpochManager } from \"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\";\nimport { IRewardsManager } from \"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\";\nimport { ITokenGateway } from \"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\";\nimport { IGraphProxyAdmin } from \"../interfaces/IGraphProxyAdmin.sol\";\n\nimport { ICuration } from \"@graphprotocol/contracts/contracts/curation/ICuration.sol\";\n\n/**\n * @title GraphDirectory contract\n * @notice This contract is meant to be inherited by other contracts that\n * need to keep track of the addresses in Graph Horizon contracts.\n * It fetches the addresses from the Controller supplied during construction,\n * and uses immutable variables to minimize gas costs.\n */\nabstract contract GraphDirectory {\n // -- Graph Horizon contracts --\n\n /// @notice The Graph Token contract address\n IGraphToken private immutable GRAPH_TOKEN;\n\n /// @notice The Horizon Staking contract address\n IHorizonStaking private immutable GRAPH_STAKING;\n\n /// @notice The Graph Payments contract address\n IGraphPayments private immutable GRAPH_PAYMENTS;\n\n /// @notice The Payments Escrow contract address\n IPaymentsEscrow private immutable GRAPH_PAYMENTS_ESCROW;\n\n // -- Graph periphery contracts --\n\n /// @notice The Graph Controller contract address\n IController private immutable GRAPH_CONTROLLER;\n\n /// @notice The Epoch Manager contract address\n IEpochManager private immutable GRAPH_EPOCH_MANAGER;\n\n /// @notice The Rewards Manager contract address\n IRewardsManager private immutable GRAPH_REWARDS_MANAGER;\n\n /// @notice The Token Gateway contract address\n ITokenGateway private immutable GRAPH_TOKEN_GATEWAY;\n\n /// @notice The Graph Proxy Admin contract address\n IGraphProxyAdmin private immutable GRAPH_PROXY_ADMIN;\n\n // -- Legacy Graph contracts --\n // These are required for backwards compatibility on HorizonStakingExtension\n // TRANSITION PERIOD: remove these once HorizonStakingExtension is removed\n\n /// @notice The Curation contract address\n ICuration private immutable GRAPH_CURATION;\n\n /**\n * @notice Emitted when the GraphDirectory is initialized\n * @param graphToken The Graph Token contract address\n * @param graphStaking The Horizon Staking contract address\n * @param graphPayments The Graph Payments contract address\n * @param graphEscrow The Payments Escrow contract address\n * @param graphController The Graph Controller contract address\n * @param graphEpochManager The Epoch Manager contract address\n * @param graphRewardsManager The Rewards Manager contract address\n * @param graphTokenGateway The Token Gateway contract address\n * @param graphProxyAdmin The Graph Proxy Admin contract address\n * @param graphCuration The Curation contract address\n */\n event GraphDirectoryInitialized(\n address indexed graphToken,\n address indexed graphStaking,\n address graphPayments,\n address graphEscrow,\n address indexed graphController,\n address graphEpochManager,\n address graphRewardsManager,\n address graphTokenGateway,\n address graphProxyAdmin,\n address graphCuration\n );\n\n /**\n * @notice Thrown when either the controller is the zero address or a contract address is not found\n * on the controller\n * @param contractName The name of the contract that was not found, or the controller\n */\n error GraphDirectoryInvalidZeroAddress(bytes contractName);\n\n /**\n * @notice Constructor for the GraphDirectory contract\n * @dev Requirements:\n * - `controller` cannot be zero address\n *\n * Emits a {GraphDirectoryInitialized} event\n *\n * @param controller The address of the Graph Controller contract.\n */\n constructor(address controller) {\n require(controller != address(0), GraphDirectoryInvalidZeroAddress(\"Controller\"));\n\n GRAPH_CONTROLLER = IController(controller);\n GRAPH_TOKEN = IGraphToken(_getContractFromController(\"GraphToken\"));\n GRAPH_STAKING = IHorizonStaking(_getContractFromController(\"Staking\"));\n GRAPH_PAYMENTS = IGraphPayments(_getContractFromController(\"GraphPayments\"));\n GRAPH_PAYMENTS_ESCROW = IPaymentsEscrow(_getContractFromController(\"PaymentsEscrow\"));\n GRAPH_EPOCH_MANAGER = IEpochManager(_getContractFromController(\"EpochManager\"));\n GRAPH_REWARDS_MANAGER = IRewardsManager(_getContractFromController(\"RewardsManager\"));\n GRAPH_TOKEN_GATEWAY = ITokenGateway(_getContractFromController(\"GraphTokenGateway\"));\n GRAPH_PROXY_ADMIN = IGraphProxyAdmin(_getContractFromController(\"GraphProxyAdmin\"));\n GRAPH_CURATION = ICuration(_getContractFromController(\"Curation\"));\n\n emit GraphDirectoryInitialized(\n address(GRAPH_TOKEN),\n address(GRAPH_STAKING),\n address(GRAPH_PAYMENTS),\n address(GRAPH_PAYMENTS_ESCROW),\n address(GRAPH_CONTROLLER),\n address(GRAPH_EPOCH_MANAGER),\n address(GRAPH_REWARDS_MANAGER),\n address(GRAPH_TOKEN_GATEWAY),\n address(GRAPH_PROXY_ADMIN),\n address(GRAPH_CURATION)\n );\n }\n\n /**\n * @notice Get the Graph Token contract\n * @return The Graph Token contract\n */\n function _graphToken() internal view returns (IGraphToken) {\n return GRAPH_TOKEN;\n }\n\n /**\n * @notice Get the Horizon Staking contract\n * @return The Horizon Staking contract\n */\n function _graphStaking() internal view returns (IHorizonStaking) {\n return GRAPH_STAKING;\n }\n\n /**\n * @notice Get the Graph Payments contract\n * @return The Graph Payments contract\n */\n function _graphPayments() internal view returns (IGraphPayments) {\n return GRAPH_PAYMENTS;\n }\n\n /**\n * @notice Get the Payments Escrow contract\n * @return The Payments Escrow contract\n */\n function _graphPaymentsEscrow() internal view returns (IPaymentsEscrow) {\n return GRAPH_PAYMENTS_ESCROW;\n }\n\n /**\n * @notice Get the Graph Controller contract\n * @return The Graph Controller contract\n */\n function _graphController() internal view returns (IController) {\n return GRAPH_CONTROLLER;\n }\n\n /**\n * @notice Get the Epoch Manager contract\n * @return The Epoch Manager contract\n */\n function _graphEpochManager() internal view returns (IEpochManager) {\n return GRAPH_EPOCH_MANAGER;\n }\n\n /**\n * @notice Get the Rewards Manager contract\n * @return The Rewards Manager contract address\n */\n function _graphRewardsManager() internal view returns (IRewardsManager) {\n return GRAPH_REWARDS_MANAGER;\n }\n\n /**\n * @notice Get the Graph Token Gateway contract\n * @return The Graph Token Gateway contract\n */\n function _graphTokenGateway() internal view returns (ITokenGateway) {\n return GRAPH_TOKEN_GATEWAY;\n }\n\n /**\n * @notice Get the Graph Proxy Admin contract\n * @return The Graph Proxy Admin contract\n */\n function _graphProxyAdmin() internal view returns (IGraphProxyAdmin) {\n return GRAPH_PROXY_ADMIN;\n }\n\n /**\n * @notice Get the Curation contract\n * @return The Curation contract\n */\n function _graphCuration() internal view returns (ICuration) {\n return GRAPH_CURATION;\n }\n\n /**\n * @notice Get a contract address from the controller\n * @dev Requirements:\n * - The `_contractName` must be registered in the controller\n * @param _contractName The name of the contract to fetch from the controller\n * @return The address of the contract\n */\n function _getContractFromController(bytes memory _contractName) private view returns (address) {\n address contractAddress = GRAPH_CONTROLLER.getContractProxy(keccak256(_contractName));\n require(contractAddress != address(0), GraphDirectoryInvalidZeroAddress(_contractName));\n return contractAddress;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n struct OwnableStorage {\n address _owner;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n assembly {\n $.slot := OwnableStorageLocation\n }\n }\n\n /**\n * @dev The caller account is not authorized to perform an operation.\n */\n error OwnableUnauthorizedAccount(address account);\n\n /**\n * @dev The owner is not a valid owner account. (eg. `address(0)`)\n */\n error OwnableInvalidOwner(address owner);\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n */\n function __Ownable_init(address initialOwner) internal onlyInitializing {\n __Ownable_init_unchained(initialOwner);\n }\n\n function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n if (initialOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(initialOwner);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n OwnableStorage storage $ = _getOwnableStorage();\n return $._owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n if (owner() != _msgSender()) {\n revert OwnableUnauthorizedAccount(_msgSender());\n }\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n if (newOwner == address(0)) {\n revert OwnableInvalidOwner(address(0));\n }\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n OwnableStorage storage $ = _getOwnableStorage();\n address oldOwner = $._owner;\n $._owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reinitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n *\n * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n */\n function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n return INITIALIZABLE_STORAGE;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n bytes32 slot = _initializableStorageSlot();\n assembly {\n $.slot := slot\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.20;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {IERC5267} from \"@openzeppelin/contracts/interfaces/IERC5267.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n */\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\n bytes32 private constant TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\n struct EIP712Storage {\n /// @custom:oz-renamed-from _HASHED_NAME\n bytes32 _hashedName;\n /// @custom:oz-renamed-from _HASHED_VERSION\n bytes32 _hashedVersion;\n\n string _name;\n string _version;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.EIP712\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\n\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\n assembly {\n $.slot := EIP712StorageLocation\n }\n }\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\n __EIP712_init_unchained(name, version);\n }\n\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\n EIP712Storage storage $ = _getEIP712Storage();\n $._name = name;\n $._version = version;\n\n // Reset prior values in storage if upgrading\n $._hashedName = 0;\n $._hashedVersion = 0;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n return _buildDomainSeparator();\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @inheritdoc IERC5267\n */\n function eip712Domain()\n public\n view\n virtual\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n EIP712Storage storage $ = _getEIP712Storage();\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\n // and the EIP712 domain is not reliable, as it will be missing name and version.\n require($._hashedName == 0 && $._hashedVersion == 0, \"EIP712: Uninitialized\");\n\n return (\n hex\"0f\", // 01111\n _EIP712Name(),\n _EIP712Version(),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n\n /**\n * @dev The name parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Name() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._name;\n }\n\n /**\n * @dev The version parameter for the EIP712 domain.\n *\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n * are a concern.\n */\n function _EIP712Version() internal view virtual returns (string memory) {\n EIP712Storage storage $ = _getEIP712Storage();\n return $._version;\n }\n\n /**\n * @dev The hash of the name parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\n */\n function _EIP712NameHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory name = _EIP712Name();\n if (bytes(name).length > 0) {\n return keccak256(bytes(name));\n } else {\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\n bytes32 hashedName = $._hashedName;\n if (hashedName != 0) {\n return hashedName;\n } else {\n return keccak256(\"\");\n }\n }\n }\n\n /**\n * @dev The hash of the version parameter for the EIP712 domain.\n *\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\n */\n function _EIP712VersionHash() internal view returns (bytes32) {\n EIP712Storage storage $ = _getEIP712Storage();\n string memory version = _EIP712Version();\n if (bytes(version).length > 0) {\n return keccak256(bytes(version));\n } else {\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\n bytes32 hashedVersion = $._hashedVersion;\n if (hashedVersion != 0) {\n return hashedVersion;\n } else {\n return keccak256(\"\");\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Multicall.sol)\n\npragma solidity ^0.8.20;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {ContextUpgradeable} from \"./ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides a function to batch together multiple calls in a single external call.\n *\n * Consider any assumption about calldata validation performed by the sender may be violated if it's not especially\n * careful about sending transactions invoking {multicall}. For example, a relay address that filters function\n * selectors won't filter calls nested within a {multicall} operation.\n *\n * NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {Context-_msgSender}).\n * If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data`\n * to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of\n * {Context-_msgSender} are not propagated to subcalls.\n */\nabstract contract MulticallUpgradeable is Initializable, ContextUpgradeable {\n function __Multicall_init() internal onlyInitializing {\n }\n\n function __Multicall_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Receives and executes a batch of function calls on this contract.\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n */\n function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {\n bytes memory context = msg.sender == _msgSender()\n ? new bytes(0)\n : msg.data[msg.data.length - _contextSuffixLength():];\n\n results = new bytes[](data.length);\n for (uint256 i = 0; i < data.length; i++) {\n results[i] = Address.functionDelegateCall(address(this), bytes.concat(data[i], context));\n }\n return results;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /// @custom:storage-location erc7201:openzeppelin.storage.Pausable\n struct PausableStorage {\n bool _paused;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Pausable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;\n\n function _getPausableStorage() private pure returns (PausableStorage storage $) {\n assembly {\n $.slot := PausableStorageLocation\n }\n }\n\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n /**\n * @dev The operation failed because the contract is paused.\n */\n error EnforcedPause();\n\n /**\n * @dev The operation failed because the contract is not paused.\n */\n error ExpectedPause();\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n function __Pausable_init() internal onlyInitializing {\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n PausableStorage storage $ = _getPausableStorage();\n return $._paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n if (paused()) {\n revert EnforcedPause();\n }\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n if (!paused()) {\n revert ExpectedPause();\n }\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n PausableStorage storage $ = _getPausableStorage();\n $._paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n PausableStorage storage $ = _getPausableStorage();\n $._paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" + }, + "@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.20;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert Errors.InsufficientBalance(address(this).balance, amount);\n }\n\n (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n if (!success) {\n _revert(returndata);\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {Errors.FailedCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert Errors.InsufficientBalance(address(this).balance, value);\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n * of an unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {Errors.FailedCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n assembly (\"memory-safe\") {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert Errors.FailedCall();\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(\n bytes32 hash,\n bytes memory signature\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n assembly (\"memory-safe\") {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]\n */\n function tryRecover(\n bytes32 hash,\n bytes32 r,\n bytes32 vs\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an ERC-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32.\n */\n function toDataWithIntendedValidatorHash(\n address validator,\n bytes32 messageHash\n ) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n mstore(0x00, hex\"19_00\")\n mstore(0x02, shl(96, validator))\n mstore(0x16, messageHash)\n digest := keccak256(0x00, 0x36)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Errors.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error InsufficientBalance(uint256 balance, uint256 needed);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedCall();\n\n /**\n * @dev The deployment failed.\n */\n error FailedDeployment();\n\n /**\n * @dev A necessary precompile is missing.\n */\n error MissingPrecompile(address);\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Return the 512-bit addition of two uint256.\n *\n * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low.\n */\n function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n assembly (\"memory-safe\") {\n low := add(a, b)\n high := lt(low, a)\n }\n }\n\n /**\n * @dev Return the 512-bit multiplication of two uint256.\n *\n * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low.\n */\n function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) {\n // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = high * 2²⁵⁶ + low.\n assembly (\"memory-safe\") {\n let mm := mulmod(a, b, not(0))\n low := mul(a, b)\n high := sub(sub(mm, low), lt(mm, low))\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with a success flag (no overflow).\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a + b;\n success = c >= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow).\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a - b;\n success = c <= a;\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow).\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n uint256 c = a * b;\n assembly (\"memory-safe\") {\n // Only true when the multiplication doesn't overflow\n // (c / a == b) || (a == 0)\n success := or(eq(div(c, a), b), iszero(a))\n }\n // equivalent to: success ? c : 0\n result = c * SafeCast.toUint(success);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `DIV` opcode returns zero when the denominator is 0.\n result := div(a, b)\n }\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n unchecked {\n success = b > 0;\n assembly (\"memory-safe\") {\n // The `MOD` opcode returns zero when the denominator is 0.\n result := mod(a, b)\n }\n }\n }\n\n /**\n * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryAdd(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing.\n */\n function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) {\n (, uint256 result) = trySub(a, b);\n return result;\n }\n\n /**\n * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing.\n */\n function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) {\n (bool success, uint256 result) = tryMul(a, b);\n return ternary(success, result, type(uint256).max);\n }\n\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * SafeCast.toUint(condition));\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n\n // The following calculation ensures accurate ceiling division without overflow.\n // Since a is non-zero, (a - 1) / b will not overflow.\n // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n // but the largest value we can obtain is type(uint256).max - 1, which happens\n // when a = type(uint256).max and b = 1.\n unchecked {\n return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n }\n }\n\n /**\n * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n *\n * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n\n // Handle non-overflow cases, 256 by 256 division.\n if (high == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return low / denominator;\n }\n\n // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n if (denominator <= high) {\n Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [high low].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n high := sub(high, gt(remainder, low))\n low := sub(low, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly (\"memory-safe\") {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [high low] by twos.\n low := div(low, twos)\n\n // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from high into low.\n low |= high * twos;\n\n // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n inverse *= 2 - denominator * inverse; // inverse mod 2³²\n inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high\n // is no longer required.\n result = low * inverse;\n return result;\n }\n }\n\n /**\n * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n }\n\n /**\n * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256.\n */\n function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) {\n unchecked {\n (uint256 high, uint256 low) = mul512(x, y);\n if (high >= 1 << n) {\n Panic.panic(Panic.UNDER_OVERFLOW);\n }\n return (high << (256 - n)) | (low >> n);\n }\n }\n\n /**\n * @dev Calculates x * y >> n with full precision, following the selected rounding direction.\n */\n function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) {\n return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0);\n }\n\n /**\n * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n *\n * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n *\n * If the input value is not inversible, 0 is returned.\n *\n * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n */\n function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n unchecked {\n if (n == 0) return 0;\n\n // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n // ax + ny = 1\n // ax = 1 + (-y)n\n // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n // If the remainder is 0 the gcd is n right away.\n uint256 remainder = a % n;\n uint256 gcd = n;\n\n // Therefore the initial coefficients are:\n // ax + ny = gcd(a, n) = n\n // 0a + 1n = n\n int256 x = 0;\n int256 y = 1;\n\n while (remainder != 0) {\n uint256 quotient = gcd / remainder;\n\n (gcd, remainder) = (\n // The old remainder is the next gcd to try.\n remainder,\n // Compute the next remainder.\n // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n // where gcd is at most n (capped to type(uint256).max)\n gcd - remainder * quotient\n );\n\n (x, y) = (\n // Increment the coefficient of a.\n y,\n // Decrement the coefficient of n.\n // Can overflow, but the result is casted to uint256 so that the\n // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n x - y * int256(quotient)\n );\n }\n\n if (gcd != 1) return 0; // No inverse exists.\n return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n }\n }\n\n /**\n * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n *\n * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n *\n * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n */\n function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n unchecked {\n return Math.modExp(a, p - 2, p);\n }\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n *\n * Requirements:\n * - modulus can't be zero\n * - underlying staticcall to precompile must succeed\n *\n * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n * interpreted as 0.\n */\n function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n (bool success, uint256 result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n * to operate modulo 0 or if the underlying precompile reverted.\n *\n * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n * of a revert, but the result may be incorrectly interpreted as 0.\n */\n function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n if (m == 0) return (false, 0);\n assembly (\"memory-safe\") {\n let ptr := mload(0x40)\n // | Offset | Content | Content (Hex) |\n // |-----------|------------|--------------------------------------------------------------------|\n // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n mstore(ptr, 0x20)\n mstore(add(ptr, 0x20), 0x20)\n mstore(add(ptr, 0x40), 0x20)\n mstore(add(ptr, 0x60), b)\n mstore(add(ptr, 0x80), e)\n mstore(add(ptr, 0xa0), m)\n\n // Given the result < m, it's guaranteed to fit in 32 bytes,\n // so we can use the memory scratch space located at offset 0.\n success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n result := mload(0x00)\n }\n }\n\n /**\n * @dev Variant of {modExp} that supports inputs of arbitrary length.\n */\n function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n (bool success, bytes memory result) = tryModExp(b, e, m);\n if (!success) {\n Panic.panic(Panic.DIVISION_BY_ZERO);\n }\n return result;\n }\n\n /**\n * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n */\n function tryModExp(\n bytes memory b,\n bytes memory e,\n bytes memory m\n ) internal view returns (bool success, bytes memory result) {\n if (_zeroBytes(m)) return (false, new bytes(0));\n\n uint256 mLen = m.length;\n\n // Encode call args in result and move the free memory pointer\n result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n assembly (\"memory-safe\") {\n let dataPtr := add(result, 0x20)\n // Write result on top of args to avoid allocating extra memory.\n success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n // Overwrite the length.\n // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n mstore(result, mLen)\n // Set the memory pointer after the returned data.\n mstore(0x40, add(dataPtr, mLen))\n }\n }\n\n /**\n * @dev Returns whether the provided byte array is zero.\n */\n function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n for (uint256 i = 0; i < byteArray.length; ++i) {\n if (byteArray[i] != 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n * using integer operations.\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n unchecked {\n // Take care of easy edge cases when a == 0 or a == 1\n if (a <= 1) {\n return a;\n }\n\n // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n // the current value as `ε_n = | x_n - sqrt(a) |`.\n //\n // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n // bigger than any uint256.\n //\n // By noticing that\n // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n // to the msb function.\n uint256 aa = a;\n uint256 xn = 1;\n\n if (aa >= (1 << 128)) {\n aa >>= 128;\n xn <<= 64;\n }\n if (aa >= (1 << 64)) {\n aa >>= 64;\n xn <<= 32;\n }\n if (aa >= (1 << 32)) {\n aa >>= 32;\n xn <<= 16;\n }\n if (aa >= (1 << 16)) {\n aa >>= 16;\n xn <<= 8;\n }\n if (aa >= (1 << 8)) {\n aa >>= 8;\n xn <<= 4;\n }\n if (aa >= (1 << 4)) {\n aa >>= 4;\n xn <<= 2;\n }\n if (aa >= (1 << 2)) {\n xn <<= 1;\n }\n\n // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n //\n // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n // This is going to be our x_0 (and ε_0)\n xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n // From here, Newton's method give us:\n // x_{n+1} = (x_n + a / x_n) / 2\n //\n // One should note that:\n // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n // = ((x_n² + a) / (2 * x_n))² - a\n // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n // = (x_n² - a)² / (2 * x_n)²\n // = ((x_n² - a) / (2 * x_n))²\n // ≥ 0\n // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n //\n // This gives us the proof of quadratic convergence of the sequence:\n // ε_{n+1} = | x_{n+1} - sqrt(a) |\n // = | (x_n + a / x_n) / 2 - sqrt(a) |\n // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n // = | (x_n - sqrt(a))² / (2 * x_n) |\n // = | ε_n² / (2 * x_n) |\n // = ε_n² / | (2 * x_n) |\n //\n // For the first iteration, we have a special case where x_0 is known:\n // ε_1 = ε_0² / | (2 * x_0) |\n // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n // ≤ 2**(2*e-4) / (3 * 2**(e-1))\n // ≤ 2**(e-3) / 3\n // ≤ 2**(e-3-log2(3))\n // ≤ 2**(e-4.5)\n //\n // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n // ε_{n+1} = ε_n² / | (2 * x_n) |\n // ≤ (2**(e-k))² / (2 * 2**(e-1))\n // ≤ 2**(2*e-2*k) / 2**e\n // ≤ 2**(e-2*k)\n xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above\n xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5\n xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9\n xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18\n xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36\n xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72\n\n // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n // sqrt(a) or sqrt(a) + 1.\n return xn - SafeCast.toUint(xn > a / xn);\n }\n }\n\n /**\n * @dev Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // If upper 8 bits of 16-bit half set, add 8 to result\n r |= SafeCast.toUint((x >> r) > 0xff) << 3;\n // If upper 4 bits of 8-bit half set, add 4 to result\n r |= SafeCast.toUint((x >> r) > 0xf) << 2;\n\n // Shifts value right by the current result and use it as an index into this lookup table:\n //\n // | x (4 bits) | index | table[index] = MSB position |\n // |------------|---------|-----------------------------|\n // | 0000 | 0 | table[0] = 0 |\n // | 0001 | 1 | table[1] = 0 |\n // | 0010 | 2 | table[2] = 1 |\n // | 0011 | 3 | table[3] = 1 |\n // | 0100 | 4 | table[4] = 2 |\n // | 0101 | 5 | table[5] = 2 |\n // | 0110 | 6 | table[6] = 2 |\n // | 0111 | 7 | table[7] = 2 |\n // | 1000 | 8 | table[8] = 3 |\n // | 1001 | 9 | table[9] = 3 |\n // | 1010 | 10 | table[10] = 3 |\n // | 1011 | 11 | table[11] = 3 |\n // | 1100 | 12 | table[12] = 3 |\n // | 1101 | 13 | table[13] = 3 |\n // | 1110 | 14 | table[14] = 3 |\n // | 1111 | 15 | table[15] = 3 |\n //\n // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes.\n assembly (\"memory-safe\") {\n r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000))\n }\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 x) internal pure returns (uint256 r) {\n // If value has upper 128 bits set, log2 result is at least 128\n r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7;\n // If upper 64 bits of 128-bit half set, add 64 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6;\n // If upper 32 bits of 64-bit half set, add 32 to result\n r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5;\n // If upper 16 bits of 32-bit half set, add 16 to result\n r |= SafeCast.toUint((x >> r) > 0xffff) << 4;\n // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8\n return (r >> 3) | SafeCast.toUint((x >> r) > 0xff);\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n /**\n * @dev Value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n /**\n * @dev An int value doesn't fit in an uint of `bits` size.\n */\n error SafeCastOverflowedIntToUint(int256 value);\n\n /**\n * @dev Value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n /**\n * @dev An uint value doesn't fit in an int of `bits` size.\n */\n error SafeCastOverflowedUintToInt(uint256 value);\n\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n if (value > type(uint248).max) {\n revert SafeCastOverflowedUintDowncast(248, value);\n }\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n if (value > type(uint240).max) {\n revert SafeCastOverflowedUintDowncast(240, value);\n }\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n if (value > type(uint232).max) {\n revert SafeCastOverflowedUintDowncast(232, value);\n }\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n if (value > type(uint224).max) {\n revert SafeCastOverflowedUintDowncast(224, value);\n }\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n if (value > type(uint216).max) {\n revert SafeCastOverflowedUintDowncast(216, value);\n }\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n if (value > type(uint208).max) {\n revert SafeCastOverflowedUintDowncast(208, value);\n }\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n if (value > type(uint200).max) {\n revert SafeCastOverflowedUintDowncast(200, value);\n }\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n if (value > type(uint192).max) {\n revert SafeCastOverflowedUintDowncast(192, value);\n }\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n if (value > type(uint184).max) {\n revert SafeCastOverflowedUintDowncast(184, value);\n }\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n if (value > type(uint176).max) {\n revert SafeCastOverflowedUintDowncast(176, value);\n }\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n if (value > type(uint168).max) {\n revert SafeCastOverflowedUintDowncast(168, value);\n }\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n if (value > type(uint160).max) {\n revert SafeCastOverflowedUintDowncast(160, value);\n }\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n if (value > type(uint152).max) {\n revert SafeCastOverflowedUintDowncast(152, value);\n }\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n if (value > type(uint144).max) {\n revert SafeCastOverflowedUintDowncast(144, value);\n }\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n if (value > type(uint136).max) {\n revert SafeCastOverflowedUintDowncast(136, value);\n }\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) {\n revert SafeCastOverflowedUintDowncast(128, value);\n }\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n if (value > type(uint120).max) {\n revert SafeCastOverflowedUintDowncast(120, value);\n }\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n if (value > type(uint112).max) {\n revert SafeCastOverflowedUintDowncast(112, value);\n }\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n if (value > type(uint104).max) {\n revert SafeCastOverflowedUintDowncast(104, value);\n }\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n if (value > type(uint96).max) {\n revert SafeCastOverflowedUintDowncast(96, value);\n }\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n if (value > type(uint88).max) {\n revert SafeCastOverflowedUintDowncast(88, value);\n }\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n if (value > type(uint80).max) {\n revert SafeCastOverflowedUintDowncast(80, value);\n }\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n if (value > type(uint72).max) {\n revert SafeCastOverflowedUintDowncast(72, value);\n }\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n if (value > type(uint64).max) {\n revert SafeCastOverflowedUintDowncast(64, value);\n }\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n if (value > type(uint56).max) {\n revert SafeCastOverflowedUintDowncast(56, value);\n }\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n if (value > type(uint48).max) {\n revert SafeCastOverflowedUintDowncast(48, value);\n }\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n if (value > type(uint40).max) {\n revert SafeCastOverflowedUintDowncast(40, value);\n }\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n if (value > type(uint32).max) {\n revert SafeCastOverflowedUintDowncast(32, value);\n }\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n if (value > type(uint24).max) {\n revert SafeCastOverflowedUintDowncast(24, value);\n }\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n if (value > type(uint16).max) {\n revert SafeCastOverflowedUintDowncast(16, value);\n }\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n if (value > type(uint8).max) {\n revert SafeCastOverflowedUintDowncast(8, value);\n }\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n if (value < 0) {\n revert SafeCastOverflowedIntToUint(value);\n }\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(248, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(240, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(232, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(224, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(216, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(208, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(200, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(192, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(184, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(176, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(168, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(160, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(152, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(144, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(136, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(128, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(120, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(112, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(104, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(96, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(88, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(80, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(72, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(64, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(56, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(48, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(40, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(32, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(24, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(16, value);\n }\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n if (downcasted != value) {\n revert SafeCastOverflowedIntDowncast(8, value);\n }\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n if (value > uint256(type(int256).max)) {\n revert SafeCastOverflowedUintToInt(value);\n }\n return int256(value);\n }\n\n /**\n * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n */\n function toUint(bool b) internal pure returns (uint256 u) {\n assembly (\"memory-safe\") {\n u := iszero(iszero(b))\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n *\n * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n * one branch when needed, making this function more expensive.\n */\n function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n unchecked {\n // branchless ternary works because:\n // b ^ (a ^ b) == a\n // b ^ 0 == b\n return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n }\n }\n\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a > b, a, b);\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return ternary(a < b, a, b);\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n int256 mask = n >> 255;\n\n // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n return uint256((n + mask) ^ mask);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Panic.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n * using Panic for uint256;\n *\n * // Use any of the declared internal constants\n * function foo() { Panic.GENERIC.panic(); }\n *\n * // Alternatively\n * function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n /// @dev generic / unspecified error\n uint256 internal constant GENERIC = 0x00;\n /// @dev used by the assert() builtin\n uint256 internal constant ASSERT = 0x01;\n /// @dev arithmetic underflow or overflow\n uint256 internal constant UNDER_OVERFLOW = 0x11;\n /// @dev division or modulo by zero\n uint256 internal constant DIVISION_BY_ZERO = 0x12;\n /// @dev enum conversion error\n uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n /// @dev invalid encoding in storage\n uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n /// @dev empty array pop\n uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n /// @dev array out of bounds access\n uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n /// @dev resource error (too large allocation or too large array)\n uint256 internal constant RESOURCE_ERROR = 0x41;\n /// @dev calling invalid internal function\n uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n /// @dev Reverts with a panic code. Recommended to use with\n /// the internal constants with predefined codes.\n function panic(uint256 code) internal pure {\n assembly (\"memory-safe\") {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, code)\n revert(0x1c, 0x24)\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SafeCast} from \"./math/SafeCast.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n using SafeCast for *;\n\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n uint256 private constant SPECIAL_CHARS_LOOKUP =\n (1 << 0x08) | // backspace\n (1 << 0x09) | // tab\n (1 << 0x0a) | // newline\n (1 << 0x0c) | // form feed\n (1 << 0x0d) | // carriage return\n (1 << 0x22) | // double quote\n (1 << 0x5c); // backslash\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev The string being parsed contains characters that are not in scope of the given base.\n */\n error StringsInvalidChar();\n\n /**\n * @dev The string being parsed is not a properly formatted address.\n */\n error StringsInvalidAddressFormat();\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n assembly (\"memory-safe\") {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n assembly (\"memory-safe\") {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n * representation, according to EIP-55.\n */\n function toChecksumHexString(address addr) internal pure returns (string memory) {\n bytes memory buffer = bytes(toHexString(addr));\n\n // hash the hex part of buffer (skip length + 2 bytes, length 40)\n uint256 hashValue;\n assembly (\"memory-safe\") {\n hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n }\n\n for (uint256 i = 41; i > 1; --i) {\n // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n // case shift by xoring with 0x20\n buffer[i] ^= 0x20;\n }\n hashValue >>= 4;\n }\n return string(buffer);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input) internal pure returns (uint256) {\n return parseUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[0-9]*`\n * - The result must fit into an `uint256` type\n */\n function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n uint256 result = 0;\n for (uint256 i = begin; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 9) return (false, 0);\n result *= 10;\n result += chr;\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a decimal string and returns the value as a `int256`.\n *\n * Requirements:\n * - The string must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input) internal pure returns (int256) {\n return parseInt(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `[-+]?[0-9]*`\n * - The result must fit in an `int256` type.\n */\n function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {\n (bool success, int256 value) = tryParseInt(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n * the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {\n return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);\n }\n\n uint256 private constant ABS_MIN_INT256 = 2 ** 255;\n\n /**\n * @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n * character or if the result does not fit in a `int256`.\n *\n * NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.\n */\n function tryParseInt(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, int256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseIntUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseIntUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, int256 value) {\n bytes memory buffer = bytes(input);\n\n // Check presence of a negative sign.\n bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n bool positiveSign = sign == bytes1(\"+\");\n bool negativeSign = sign == bytes1(\"-\");\n uint256 offset = (positiveSign || negativeSign).toUint();\n\n (bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);\n\n if (absSuccess && absValue < ABS_MIN_INT256) {\n return (true, negativeSign ? -int256(absValue) : int256(absValue));\n } else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {\n return (true, type(int256).min);\n } else return (false, 0);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input) internal pure returns (uint256) {\n return parseHexUint(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n * - The result must fit in an `uint256` type.\n */\n function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {\n (bool success, uint256 value) = tryParseHexUint(input, begin, end);\n if (!success) revert StringsInvalidChar();\n return value;\n }\n\n /**\n * @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {\n return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n * invalid character.\n *\n * NOTE: This function will revert if the result does not fit in a `uint256`.\n */\n function tryParseHexUint(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, uint256 value) {\n if (end > bytes(input).length || begin > end) return (false, 0);\n return _tryParseHexUintUncheckedBounds(input, begin, end);\n }\n\n /**\n * @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n * `begin <= end <= input.length`. Other inputs would result in undefined behavior.\n */\n function _tryParseHexUintUncheckedBounds(\n string memory input,\n uint256 begin,\n uint256 end\n ) private pure returns (bool success, uint256 value) {\n bytes memory buffer = bytes(input);\n\n // skip 0x prefix if present\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 offset = hasPrefix.toUint() * 2;\n\n uint256 result = 0;\n for (uint256 i = begin + offset; i < end; ++i) {\n uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));\n if (chr > 15) return (false, 0);\n result *= 16;\n unchecked {\n // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).\n // This guarantees that adding a value < 16 will not cause an overflow, hence the unchecked.\n result += chr;\n }\n }\n return (true, result);\n }\n\n /**\n * @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n *\n * Requirements:\n * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input) internal pure returns (address) {\n return parseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n * `end` (excluded).\n *\n * Requirements:\n * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`\n */\n function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {\n (bool success, address value) = tryParseAddress(input, begin, end);\n if (!success) revert StringsInvalidAddressFormat();\n return value;\n }\n\n /**\n * @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n * formatted address. See {parseAddress-string} requirements.\n */\n function tryParseAddress(string memory input) internal pure returns (bool success, address value) {\n return tryParseAddress(input, 0, bytes(input).length);\n }\n\n /**\n * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n * formatted address. See {parseAddress-string-uint256-uint256} requirements.\n */\n function tryParseAddress(\n string memory input,\n uint256 begin,\n uint256 end\n ) internal pure returns (bool success, address value) {\n if (end > bytes(input).length || begin > end) return (false, address(0));\n\n bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2(\"0x\"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty\n uint256 expectedLength = 40 + hasPrefix.toUint() * 2;\n\n // check that input is the correct length\n if (end - begin == expectedLength) {\n // length guarantees that this does not overflow, and value is at most type(uint160).max\n (bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);\n return (s, address(uint160(v)));\n } else {\n return (false, address(0));\n }\n }\n\n function _tryParseChr(bytes1 chr) private pure returns (uint8) {\n uint8 value = uint8(chr);\n\n // Try to parse `chr`:\n // - Case 1: [0-9]\n // - Case 2: [a-f]\n // - Case 3: [A-F]\n // - otherwise not supported\n unchecked {\n if (value > 47 && value < 58) value -= 48;\n else if (value > 96 && value < 103) value -= 87;\n else if (value > 64 && value < 71) value -= 55;\n else return type(uint8).max;\n }\n\n return value;\n }\n\n /**\n * @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n *\n * WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n *\n * NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n * RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n * characters that are not in this range, but other tooling may provide different results.\n */\n function escapeJSON(string memory input) internal pure returns (string memory) {\n bytes memory buffer = bytes(input);\n bytes memory output = new bytes(2 * buffer.length); // worst case scenario\n uint256 outputLength = 0;\n\n for (uint256 i; i < buffer.length; ++i) {\n bytes1 char = bytes1(_unsafeReadBytesOffset(buffer, i));\n if (((SPECIAL_CHARS_LOOKUP & (1 << uint8(char))) != 0)) {\n output[outputLength++] = \"\\\\\";\n if (char == 0x08) output[outputLength++] = \"b\";\n else if (char == 0x09) output[outputLength++] = \"t\";\n else if (char == 0x0a) output[outputLength++] = \"n\";\n else if (char == 0x0c) output[outputLength++] = \"f\";\n else if (char == 0x0d) output[outputLength++] = \"r\";\n else if (char == 0x5c) output[outputLength++] = \"\\\\\";\n else if (char == 0x22) {\n // solhint-disable-next-line quotes\n output[outputLength++] = '\"';\n }\n } else {\n output[outputLength++] = char;\n }\n }\n // write the actual length and deallocate unused memory\n assembly (\"memory-safe\") {\n mstore(output, outputLength)\n mstore(0x40, add(output, shl(5, shr(5, add(outputLength, 63)))))\n }\n\n return string(output);\n }\n\n /**\n * @dev Reads a bytes32 from a bytes array without bounds checking.\n *\n * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n * assembly block as such would prevent some optimizations.\n */\n function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {\n // This is not memory safe in the general case, but all calls to this private function are within bounds.\n assembly (\"memory-safe\") {\n value := mload(add(buffer, add(0x20, offset)))\n }\n }\n}\n" + }, + "contracts/DisputeManager.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity 0.8.27;\n\nimport { IGraphToken } from \"@graphprotocol/contracts/contracts/token/IGraphToken.sol\";\nimport { IHorizonStaking } from \"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\";\nimport { IDisputeManager } from \"./interfaces/IDisputeManager.sol\";\nimport { ISubgraphService } from \"./interfaces/ISubgraphService.sol\";\n\nimport { TokenUtils } from \"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\";\nimport { PPMMath } from \"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\";\nimport { MathUtils } from \"@graphprotocol/horizon/contracts/libraries/MathUtils.sol\";\nimport { Allocation } from \"./libraries/Allocation.sol\";\nimport { Attestation } from \"./libraries/Attestation.sol\";\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { Initializable } from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport { GraphDirectory } from \"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\";\nimport { DisputeManagerV1Storage } from \"./DisputeManagerStorage.sol\";\nimport { AttestationManager } from \"./utilities/AttestationManager.sol\";\n\n/**\n * @title DisputeManager\n * @notice Provides a way to permissionlessly create disputes for incorrect behavior in the Subgraph Service.\n *\n * There are two types of disputes that can be created: Query disputes and Indexing disputes.\n *\n * Query Disputes:\n * Graph nodes receive queries and return responses with signed receipts called attestations.\n * An attestation can be disputed if the consumer thinks the query response was invalid.\n * Indexers use the derived private key for an allocation to sign attestations.\n *\n * Indexing Disputes:\n * Indexers periodically present a Proof of Indexing (POI) to prove they are indexing a subgraph.\n * The Subgraph Service contract emits that proof which includes the POI. Any fisherman can dispute the\n * validity of a POI by submitting a dispute to this contract along with a deposit.\n *\n * Arbitration:\n * Disputes can only be accepted, rejected or drawn by the arbitrator role that can be delegated\n * to a EOA or DAO.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ncontract DisputeManager is\n Initializable,\n OwnableUpgradeable,\n GraphDirectory,\n AttestationManager,\n DisputeManagerV1Storage,\n IDisputeManager\n{\n using TokenUtils for IGraphToken;\n using PPMMath for uint256;\n\n // -- Constants --\n\n /// @notice Maximum value for fisherman reward cut in PPM\n uint32 public constant MAX_FISHERMAN_REWARD_CUT = 500000; // 50%\n\n /// @notice Minimum value for dispute deposit\n uint256 public constant MIN_DISPUTE_DEPOSIT = 1e18; // 1 GRT\n\n // -- Modifiers --\n\n /**\n * @notice Check if the caller is the arbitrator.\n */\n modifier onlyArbitrator() {\n require(msg.sender == arbitrator, DisputeManagerNotArbitrator());\n _;\n }\n\n /**\n * @notice Check if the dispute exists and is pending.\n * @param disputeId The dispute Id\n */\n modifier onlyPendingDispute(bytes32 disputeId) {\n require(isDisputeCreated(disputeId), DisputeManagerInvalidDispute(disputeId));\n require(\n disputes[disputeId].status == IDisputeManager.DisputeStatus.Pending,\n DisputeManagerDisputeNotPending(disputes[disputeId].status)\n );\n _;\n }\n\n /**\n * @notice Check if the caller is the fisherman of the dispute.\n * @param disputeId The dispute Id\n */\n modifier onlyFisherman(bytes32 disputeId) {\n require(isDisputeCreated(disputeId), DisputeManagerInvalidDispute(disputeId));\n require(msg.sender == disputes[disputeId].fisherman, DisputeManagerNotFisherman());\n _;\n }\n\n /**\n * @notice Contract constructor\n * @param controller Address of the controller\n */\n constructor(address controller) GraphDirectory(controller) {\n _disableInitializers();\n }\n\n /// @inheritdoc IDisputeManager\n function initialize(\n address owner,\n address arbitrator_,\n uint64 disputePeriod_,\n uint256 disputeDeposit_,\n uint32 fishermanRewardCut_,\n uint32 maxSlashingCut_\n ) external override initializer {\n __Ownable_init(owner);\n __AttestationManager_init();\n\n _setArbitrator(arbitrator_);\n _setDisputePeriod(disputePeriod_);\n _setDisputeDeposit(disputeDeposit_);\n _setFishermanRewardCut(fishermanRewardCut_);\n _setMaxSlashingCut(maxSlashingCut_);\n }\n\n /// @inheritdoc IDisputeManager\n function createIndexingDispute(address allocationId, bytes32 poi) external override returns (bytes32) {\n // Get funds from fisherman\n _graphToken().pullTokens(msg.sender, disputeDeposit);\n\n // Create a dispute\n return _createIndexingDisputeWithAllocation(msg.sender, disputeDeposit, allocationId, poi);\n }\n\n /// @inheritdoc IDisputeManager\n function createQueryDispute(bytes calldata attestationData) external override returns (bytes32) {\n // Get funds from fisherman\n _graphToken().pullTokens(msg.sender, disputeDeposit);\n\n // Create a dispute\n return\n _createQueryDisputeWithAttestation(\n msg.sender,\n disputeDeposit,\n Attestation.parse(attestationData),\n attestationData\n );\n }\n\n /// @inheritdoc IDisputeManager\n function createQueryDisputeConflict(\n bytes calldata attestationData1,\n bytes calldata attestationData2\n ) external override returns (bytes32, bytes32) {\n address fisherman = msg.sender;\n\n // Parse each attestation\n Attestation.State memory attestation1 = Attestation.parse(attestationData1);\n Attestation.State memory attestation2 = Attestation.parse(attestationData2);\n\n // Test that attestations are conflicting\n require(\n Attestation.areConflicting(attestation1, attestation2),\n DisputeManagerNonConflictingAttestations(\n attestation1.requestCID,\n attestation1.responseCID,\n attestation1.subgraphDeploymentId,\n attestation2.requestCID,\n attestation2.responseCID,\n attestation2.subgraphDeploymentId\n )\n );\n\n // Get funds from fisherman\n _graphToken().pullTokens(msg.sender, disputeDeposit);\n\n // Create the disputes\n // The deposit is zero for conflicting attestations\n bytes32 dId1 = _createQueryDisputeWithAttestation(\n fisherman,\n disputeDeposit / 2,\n attestation1,\n attestationData1\n );\n bytes32 dId2 = _createQueryDisputeWithAttestation(\n fisherman,\n disputeDeposit / 2,\n attestation2,\n attestationData2\n );\n\n // Store the linked disputes to be resolved\n disputes[dId1].relatedDisputeId = dId2;\n disputes[dId2].relatedDisputeId = dId1;\n\n // Emit event that links the two created disputes\n emit DisputeLinked(dId1, dId2);\n\n return (dId1, dId2);\n }\n\n /// @inheritdoc IDisputeManager\n function createAndAcceptLegacyDispute(\n address allocationId,\n address fisherman,\n uint256 tokensSlash,\n uint256 tokensRewards\n ) external override onlyArbitrator returns (bytes32) {\n // Create a disputeId\n bytes32 disputeId = keccak256(abi.encodePacked(allocationId, \"legacy\"));\n\n // Get the indexer for the legacy allocation\n address indexer = _graphStaking().getAllocation(allocationId).indexer;\n require(indexer != address(0), DisputeManagerIndexerNotFound(allocationId));\n\n // Store dispute\n disputes[disputeId] = Dispute(\n indexer,\n fisherman,\n 0,\n 0,\n DisputeType.LegacyDispute,\n IDisputeManager.DisputeStatus.Accepted,\n block.timestamp,\n block.timestamp + disputePeriod,\n 0\n );\n\n // Slash the indexer\n ISubgraphService subgraphService_ = _getSubgraphService();\n subgraphService_.slash(indexer, abi.encode(tokensSlash, tokensRewards));\n\n // Reward the fisherman\n _graphToken().pushTokens(fisherman, tokensRewards);\n\n emit LegacyDisputeCreated(disputeId, indexer, fisherman, allocationId, tokensSlash, tokensRewards);\n emit DisputeAccepted(disputeId, indexer, fisherman, tokensRewards);\n\n return disputeId;\n }\n\n /// @inheritdoc IDisputeManager\n function acceptDispute(\n bytes32 disputeId,\n uint256 tokensSlash\n ) external override onlyArbitrator onlyPendingDispute(disputeId) {\n require(!_isDisputeInConflict(disputes[disputeId]), DisputeManagerDisputeInConflict(disputeId));\n Dispute storage dispute = disputes[disputeId];\n _acceptDispute(disputeId, dispute, tokensSlash);\n }\n\n /// @inheritdoc IDisputeManager\n function acceptDisputeConflict(\n bytes32 disputeId,\n uint256 tokensSlash,\n bool acceptDisputeInConflict,\n uint256 tokensSlashRelated\n ) external override onlyArbitrator onlyPendingDispute(disputeId) {\n require(_isDisputeInConflict(disputes[disputeId]), DisputeManagerDisputeNotInConflict(disputeId));\n Dispute storage dispute = disputes[disputeId];\n _acceptDispute(disputeId, dispute, tokensSlash);\n\n if (acceptDisputeInConflict) {\n _acceptDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId], tokensSlashRelated);\n } else {\n _drawDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId]);\n }\n }\n\n /// @inheritdoc IDisputeManager\n function rejectDispute(bytes32 disputeId) external override onlyArbitrator onlyPendingDispute(disputeId) {\n Dispute storage dispute = disputes[disputeId];\n require(!_isDisputeInConflict(dispute), DisputeManagerDisputeInConflict(disputeId));\n _rejectDispute(disputeId, dispute);\n }\n\n /// @inheritdoc IDisputeManager\n function drawDispute(bytes32 disputeId) external override onlyArbitrator onlyPendingDispute(disputeId) {\n Dispute storage dispute = disputes[disputeId];\n _drawDispute(disputeId, dispute);\n\n if (_isDisputeInConflict(dispute)) {\n _drawDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId]);\n }\n }\n\n /// @inheritdoc IDisputeManager\n function cancelDispute(bytes32 disputeId) external override onlyFisherman(disputeId) onlyPendingDispute(disputeId) {\n Dispute storage dispute = disputes[disputeId];\n\n // Check if dispute period has finished\n require(dispute.cancellableAt <= block.timestamp, DisputeManagerDisputePeriodNotFinished());\n _cancelDispute(disputeId, dispute);\n\n if (_isDisputeInConflict(dispute)) {\n _cancelDispute(dispute.relatedDisputeId, disputes[dispute.relatedDisputeId]);\n }\n }\n\n /// @inheritdoc IDisputeManager\n function setArbitrator(address arbitrator) external override onlyOwner {\n _setArbitrator(arbitrator);\n }\n\n /// @inheritdoc IDisputeManager\n function setDisputePeriod(uint64 disputePeriod) external override onlyOwner {\n _setDisputePeriod(disputePeriod);\n }\n\n /// @inheritdoc IDisputeManager\n function setDisputeDeposit(uint256 disputeDeposit) external override onlyOwner {\n _setDisputeDeposit(disputeDeposit);\n }\n\n /// @inheritdoc IDisputeManager\n function setFishermanRewardCut(uint32 fishermanRewardCut_) external override onlyOwner {\n _setFishermanRewardCut(fishermanRewardCut_);\n }\n\n /// @inheritdoc IDisputeManager\n function setMaxSlashingCut(uint32 maxSlashingCut_) external override onlyOwner {\n _setMaxSlashingCut(maxSlashingCut_);\n }\n\n /// @inheritdoc IDisputeManager\n function setSubgraphService(address subgraphService_) external override onlyOwner {\n _setSubgraphService(subgraphService_);\n }\n\n /// @inheritdoc IDisputeManager\n function encodeReceipt(Attestation.Receipt calldata receipt) external view override returns (bytes32) {\n return _encodeReceipt(receipt);\n }\n\n /// @inheritdoc IDisputeManager\n function getFishermanRewardCut() external view override returns (uint32) {\n return fishermanRewardCut;\n }\n\n /// @inheritdoc IDisputeManager\n function getDisputePeriod() external view override returns (uint64) {\n return disputePeriod;\n }\n\n /// @inheritdoc IDisputeManager\n function getStakeSnapshot(address indexer) external view override returns (uint256) {\n IHorizonStaking.Provision memory provision = _graphStaking().getProvision(\n indexer,\n address(_getSubgraphService())\n );\n return _getStakeSnapshot(indexer, provision.tokens);\n }\n\n /// @inheritdoc IDisputeManager\n function areConflictingAttestations(\n Attestation.State calldata attestation1,\n Attestation.State calldata attestation2\n ) external pure override returns (bool) {\n return Attestation.areConflicting(attestation1, attestation2);\n }\n\n /// @inheritdoc IDisputeManager\n function getAttestationIndexer(Attestation.State memory attestation) public view returns (address) {\n // Get attestation signer. Indexers signs with the allocationId\n address allocationId = _recoverSigner(attestation);\n\n Allocation.State memory alloc = _getSubgraphService().getAllocation(allocationId);\n require(alloc.indexer != address(0), DisputeManagerIndexerNotFound(allocationId));\n require(\n alloc.subgraphDeploymentId == attestation.subgraphDeploymentId,\n DisputeManagerNonMatchingSubgraphDeployment(alloc.subgraphDeploymentId, attestation.subgraphDeploymentId)\n );\n return alloc.indexer;\n }\n\n /// @inheritdoc IDisputeManager\n function isDisputeCreated(bytes32 disputeId) public view override returns (bool) {\n return disputes[disputeId].status != DisputeStatus.Null;\n }\n\n /**\n * @notice Create a query dispute passing the parsed attestation.\n * To be used in createQueryDispute() and createQueryDisputeConflict()\n * to avoid calling parseAttestation() multiple times\n * `attestationData` is only passed to be emitted\n * @param _fisherman Creator of dispute\n * @param _deposit Amount of tokens staked as deposit\n * @param _attestation Attestation struct parsed from bytes\n * @param _attestationData Attestation bytes submitted by the fisherman\n * @return DisputeId\n */\n function _createQueryDisputeWithAttestation(\n address _fisherman,\n uint256 _deposit,\n Attestation.State memory _attestation,\n bytes memory _attestationData\n ) private returns (bytes32) {\n // Get the indexer that signed the attestation\n address indexer = getAttestationIndexer(_attestation);\n\n // The indexer is disputable\n IHorizonStaking.Provision memory provision = _graphStaking().getProvision(\n indexer,\n address(_getSubgraphService())\n );\n require(provision.tokens != 0, DisputeManagerZeroTokens());\n\n // Create a disputeId\n bytes32 disputeId = keccak256(\n abi.encodePacked(\n _attestation.requestCID,\n _attestation.responseCID,\n _attestation.subgraphDeploymentId,\n indexer,\n _fisherman\n )\n );\n\n // Only one dispute at a time\n require(!isDisputeCreated(disputeId), DisputeManagerDisputeAlreadyCreated(disputeId));\n\n // Store dispute\n uint256 stakeSnapshot = _getStakeSnapshot(indexer, provision.tokens);\n uint256 cancellableAt = block.timestamp + disputePeriod;\n disputes[disputeId] = Dispute(\n indexer,\n _fisherman,\n _deposit,\n 0, // no related dispute,\n DisputeType.QueryDispute,\n IDisputeManager.DisputeStatus.Pending,\n block.timestamp,\n cancellableAt,\n stakeSnapshot\n );\n\n emit QueryDisputeCreated(\n disputeId,\n indexer,\n _fisherman,\n _deposit,\n _attestation.subgraphDeploymentId,\n _attestationData,\n cancellableAt,\n stakeSnapshot\n );\n\n return disputeId;\n }\n\n /**\n * @notice Create indexing dispute internal function.\n * @param _fisherman The fisherman creating the dispute\n * @param _deposit Amount of tokens staked as deposit\n * @param _allocationId Allocation disputed\n * @param _poi The POI being disputed\n * @return The dispute id\n */\n function _createIndexingDisputeWithAllocation(\n address _fisherman,\n uint256 _deposit,\n address _allocationId,\n bytes32 _poi\n ) private returns (bytes32) {\n // Create a disputeId\n bytes32 disputeId = keccak256(abi.encodePacked(_allocationId, _poi));\n\n // Only one dispute for an allocationId at a time\n require(!isDisputeCreated(disputeId), DisputeManagerDisputeAlreadyCreated(disputeId));\n\n // Allocation must exist\n ISubgraphService subgraphService_ = _getSubgraphService();\n Allocation.State memory alloc = subgraphService_.getAllocation(_allocationId);\n address indexer = alloc.indexer;\n require(indexer != address(0), DisputeManagerIndexerNotFound(_allocationId));\n\n // The indexer must be disputable\n IHorizonStaking.Provision memory provision = _graphStaking().getProvision(indexer, address(subgraphService_));\n require(provision.tokens != 0, DisputeManagerZeroTokens());\n\n // Store dispute\n uint256 stakeSnapshot = _getStakeSnapshot(indexer, provision.tokens);\n uint256 cancellableAt = block.timestamp + disputePeriod;\n disputes[disputeId] = Dispute(\n alloc.indexer,\n _fisherman,\n _deposit,\n 0,\n DisputeType.IndexingDispute,\n IDisputeManager.DisputeStatus.Pending,\n block.timestamp,\n cancellableAt,\n stakeSnapshot\n );\n\n emit IndexingDisputeCreated(\n disputeId,\n alloc.indexer,\n _fisherman,\n _deposit,\n _allocationId,\n _poi,\n stakeSnapshot,\n cancellableAt\n );\n\n return disputeId;\n }\n\n /**\n * @notice Accept a dispute\n * @param _disputeId The id of the dispute\n * @param _dispute The dispute\n * @param _tokensSlashed The amount of tokens to slash\n */\n function _acceptDispute(bytes32 _disputeId, Dispute storage _dispute, uint256 _tokensSlashed) private {\n uint256 tokensToReward = _slashIndexer(_dispute.indexer, _tokensSlashed, _dispute.stakeSnapshot);\n _dispute.status = IDisputeManager.DisputeStatus.Accepted;\n _graphToken().pushTokens(_dispute.fisherman, tokensToReward + _dispute.deposit);\n\n emit DisputeAccepted(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit + tokensToReward);\n }\n\n /**\n * @notice Reject a dispute\n * @param _disputeId The id of the dispute\n * @param _dispute The dispute\n */\n function _rejectDispute(bytes32 _disputeId, Dispute storage _dispute) private {\n _dispute.status = IDisputeManager.DisputeStatus.Rejected;\n _graphToken().burnTokens(_dispute.deposit);\n\n emit DisputeRejected(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit);\n }\n\n /**\n * @notice Draw a dispute\n * @param _disputeId The id of the dispute\n * @param _dispute The dispute\n */\n function _drawDispute(bytes32 _disputeId, Dispute storage _dispute) private {\n _dispute.status = IDisputeManager.DisputeStatus.Drawn;\n _graphToken().pushTokens(_dispute.fisherman, _dispute.deposit);\n\n emit DisputeDrawn(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit);\n }\n\n /**\n * @notice Cancel a dispute\n * @param _disputeId The id of the dispute\n * @param _dispute The dispute\n */\n function _cancelDispute(bytes32 _disputeId, Dispute storage _dispute) private {\n _dispute.status = IDisputeManager.DisputeStatus.Cancelled;\n _graphToken().pushTokens(_dispute.fisherman, _dispute.deposit);\n\n emit DisputeCancelled(_disputeId, _dispute.indexer, _dispute.fisherman, _dispute.deposit);\n }\n\n /**\n * @notice Make the subgraph service contract slash the indexer and reward the fisherman.\n * Give the fisherman a reward equal to the fishermanRewardCut of slashed amount\n * @param _indexer Address of the indexer\n * @param _tokensSlash Amount of tokens to slash from the indexer\n * @param _tokensStakeSnapshot Snapshot of the indexer's stake at the time of the dispute creation\n * @return The amount of tokens rewarded to the fisherman\n */\n function _slashIndexer(\n address _indexer,\n uint256 _tokensSlash,\n uint256 _tokensStakeSnapshot\n ) private returns (uint256) {\n ISubgraphService subgraphService_ = _getSubgraphService();\n\n // Get slashable amount for indexer\n IHorizonStaking.Provision memory provision = _graphStaking().getProvision(_indexer, address(subgraphService_));\n\n // Ensure slash amount is within the cap\n uint256 maxTokensSlash = _tokensStakeSnapshot.mulPPM(maxSlashingCut);\n require(\n _tokensSlash != 0 && _tokensSlash <= maxTokensSlash,\n DisputeManagerInvalidTokensSlash(_tokensSlash, maxTokensSlash)\n );\n\n // Rewards calculation:\n // - Rewards can only be extracted from service provider tokens so we grab the minimum between the slash\n // amount and indexer's tokens\n // - The applied cut is the minimum between the provision's maxVerifierCut and the current fishermanRewardCut. This\n // protects the indexer from sudden changes to the fishermanRewardCut while ensuring the slashing does not revert due\n // to excessive rewards being requested.\n uint256 maxRewardableTokens = MathUtils.min(_tokensSlash, provision.tokens);\n uint256 effectiveCut = MathUtils.min(provision.maxVerifierCut, fishermanRewardCut);\n uint256 tokensRewards = effectiveCut.mulPPM(maxRewardableTokens);\n\n subgraphService_.slash(_indexer, abi.encode(_tokensSlash, tokensRewards));\n return tokensRewards;\n }\n\n /**\n * @notice Set the arbitrator address.\n * @dev Update the arbitrator to `_arbitrator`\n * @param _arbitrator The address of the arbitration contract or party\n */\n function _setArbitrator(address _arbitrator) private {\n require(_arbitrator != address(0), DisputeManagerInvalidZeroAddress());\n arbitrator = _arbitrator;\n emit ArbitratorSet(_arbitrator);\n }\n\n /**\n * @notice Set the dispute period.\n * @dev Update the dispute period to `_disputePeriod` in seconds\n * @param _disputePeriod Dispute period in seconds\n */\n function _setDisputePeriod(uint64 _disputePeriod) private {\n require(_disputePeriod != 0, DisputeManagerDisputePeriodZero());\n disputePeriod = _disputePeriod;\n emit DisputePeriodSet(_disputePeriod);\n }\n\n /**\n * @notice Set the dispute deposit required to create a dispute.\n * @dev Update the dispute deposit to `_disputeDeposit` Graph Tokens\n * @param _disputeDeposit The dispute deposit in Graph Tokens\n */\n function _setDisputeDeposit(uint256 _disputeDeposit) private {\n require(_disputeDeposit >= MIN_DISPUTE_DEPOSIT, DisputeManagerInvalidDisputeDeposit(_disputeDeposit));\n disputeDeposit = _disputeDeposit;\n emit DisputeDepositSet(_disputeDeposit);\n }\n\n /**\n * @notice Set the reward cut that the fisherman gets when slashing occurs.\n * @dev Update the reward cut to `_fishermanRewardCut`\n * @param _fishermanRewardCut The fisherman reward cut, in PPM\n */\n function _setFishermanRewardCut(uint32 _fishermanRewardCut) private {\n require(\n _fishermanRewardCut <= MAX_FISHERMAN_REWARD_CUT,\n DisputeManagerInvalidFishermanReward(_fishermanRewardCut)\n );\n fishermanRewardCut = _fishermanRewardCut;\n emit FishermanRewardCutSet(_fishermanRewardCut);\n }\n\n /**\n * @notice Set the maximum cut that can be used for slashing indexers.\n * @param _maxSlashingCut Max slashing cut, in PPM\n */\n function _setMaxSlashingCut(uint32 _maxSlashingCut) private {\n require(PPMMath.isValidPPM(_maxSlashingCut), DisputeManagerInvalidMaxSlashingCut(_maxSlashingCut));\n maxSlashingCut = _maxSlashingCut;\n emit MaxSlashingCutSet(maxSlashingCut);\n }\n\n /**\n * @notice Set the subgraph service address.\n * @dev Update the subgraph service to `_subgraphService`\n * @param _subgraphService The address of the subgraph service contract\n */\n function _setSubgraphService(address _subgraphService) private {\n require(_subgraphService != address(0), DisputeManagerInvalidZeroAddress());\n subgraphService = ISubgraphService(_subgraphService);\n emit SubgraphServiceSet(_subgraphService);\n }\n\n /**\n * @notice Get the address of the subgraph service\n * @dev Will revert if the subgraph service is not set\n * @return The subgraph service address\n */\n function _getSubgraphService() private view returns (ISubgraphService) {\n require(address(subgraphService) != address(0), DisputeManagerSubgraphServiceNotSet());\n return subgraphService;\n }\n\n /**\n * @notice Returns whether the dispute is for a conflicting attestation or not.\n * @param _dispute Dispute\n * @return True conflicting attestation dispute\n */\n function _isDisputeInConflict(Dispute storage _dispute) private view returns (bool) {\n return _dispute.relatedDisputeId != bytes32(0);\n }\n\n /**\n * @notice Get the total stake snapshot for and indexer.\n * @dev A few considerations:\n * - We include both indexer and delegators stake.\n * - Thawing stake is not excluded from the snapshot.\n * - Delegators stake is capped at the delegation ratio to prevent delegators from inflating the snapshot\n * to increase the indexer slash amount.\n *\n * Note that the snapshot can be inflated by delegators front-running the dispute creation with a delegation\n * to the indexer. Given the snapshot is a cap, the dispute outcome is uncertain and considering the cost of capital\n * and slashing risk, this is not a concern.\n * @param _indexer Indexer address\n * @param _indexerStake Indexer's stake\n * @return Total stake snapshot\n */\n function _getStakeSnapshot(address _indexer, uint256 _indexerStake) private view returns (uint256) {\n uint256 delegatorsStake = _graphStaking().getDelegationPool(_indexer, address(_getSubgraphService())).tokens;\n return _indexerStake + delegatorsStake;\n }\n}\n" + }, + "contracts/DisputeManagerStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { IDisputeManager } from \"./interfaces/IDisputeManager.sol\";\nimport { ISubgraphService } from \"./interfaces/ISubgraphService.sol\";\n\n/**\n * @title DisputeManagerStorage\n * @notice This contract holds all the storage variables for the Dispute Manager contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract DisputeManagerV1Storage {\n /// @notice The Subgraph Service contract address\n ISubgraphService public subgraphService;\n\n /// @notice The arbitrator is solely in control of arbitrating disputes\n address public arbitrator;\n\n /// @notice dispute period in seconds\n uint64 public disputePeriod;\n\n /// @notice Deposit required to create a Dispute\n uint256 public disputeDeposit;\n\n /// @notice Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute. In PPM.\n uint32 public fishermanRewardCut;\n\n /// @notice Maximum percentage of indexer stake that can be slashed on a dispute. In PPM.\n uint32 public maxSlashingCut;\n\n /// @notice List of disputes created\n mapping(bytes32 disputeId => IDisputeManager.Dispute dispute) public disputes;\n}\n" + }, + "contracts/interfaces/IDisputeManager.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\n\npragma solidity 0.8.27;\n\nimport { Attestation } from \"../libraries/Attestation.sol\";\n\n/**\n * @title IDisputeManager\n * @notice Interface for the {Dispute Manager} contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface IDisputeManager {\n /// @notice Types of disputes that can be created\n enum DisputeType {\n Null,\n IndexingDispute,\n QueryDispute,\n LegacyDispute\n }\n\n /// @notice Status of a dispute\n enum DisputeStatus {\n Null,\n Accepted,\n Rejected,\n Drawn,\n Pending,\n Cancelled\n }\n\n /**\n * @notice Dispute details\n * @param indexer The indexer that is being disputed\n * @param fisherman The fisherman that created the dispute\n * @param deposit The amount of tokens deposited by the fisherman\n * @param relatedDisputeId The link to a related dispute, used when creating dispute via conflicting attestations\n * @param disputeType The type of dispute\n * @param status The status of the dispute\n * @param createdAt The timestamp when the dispute was created\n * @param cancellableAt The timestamp when the dispute can be cancelled\n * @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute (includes delegation up to the delegation ratio)\n */\n struct Dispute {\n address indexer;\n address fisherman;\n uint256 deposit;\n bytes32 relatedDisputeId;\n DisputeType disputeType;\n DisputeStatus status;\n uint256 createdAt;\n uint256 cancellableAt;\n uint256 stakeSnapshot;\n }\n\n /**\n * @notice Emitted when arbitrator is set.\n * @param arbitrator The address of the arbitrator.\n */\n event ArbitratorSet(address indexed arbitrator);\n\n /**\n * @notice Emitted when dispute period is set.\n * @param disputePeriod The dispute period in seconds.\n */\n event DisputePeriodSet(uint64 disputePeriod);\n\n /**\n * @notice Emitted when dispute deposit is set.\n * @param disputeDeposit The dispute deposit required to create a dispute.\n */\n event DisputeDepositSet(uint256 disputeDeposit);\n\n /**\n * @notice Emitted when max slashing cut is set.\n * @param maxSlashingCut The maximum slashing cut that can be set.\n */\n event MaxSlashingCutSet(uint32 maxSlashingCut);\n\n /**\n * @notice Emitted when fisherman reward cut is set.\n * @param fishermanRewardCut The fisherman reward cut.\n */\n event FishermanRewardCutSet(uint32 fishermanRewardCut);\n\n /**\n * @notice Emitted when subgraph service is set.\n * @param subgraphService The address of the subgraph service.\n */\n event SubgraphServiceSet(address indexed subgraphService);\n\n /**\n * @dev Emitted when a query dispute is created for `subgraphDeploymentId` and `indexer`\n * by `fisherman`.\n * The event emits the amount of `tokens` deposited by the fisherman and `attestation` submitted.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address\n * @param tokens The amount of tokens deposited by the fisherman\n * @param subgraphDeploymentId The subgraph deployment id\n * @param attestation The attestation\n * @param cancellableAt The timestamp when the dispute can be cancelled\n * @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute\n */\n event QueryDisputeCreated(\n bytes32 indexed disputeId,\n address indexed indexer,\n address indexed fisherman,\n uint256 tokens,\n bytes32 subgraphDeploymentId,\n bytes attestation,\n uint256 stakeSnapshot,\n uint256 cancellableAt\n );\n\n /**\n * @dev Emitted when an indexing dispute is created for `allocationId` and `indexer`\n * by `fisherman`.\n * The event emits the amount of `tokens` deposited by the fisherman.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address\n * @param tokens The amount of tokens deposited by the fisherman\n * @param allocationId The allocation id\n * @param poi The POI\n * @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute\n * @param cancellableAt The timestamp when the dispute can be cancelled\n */\n event IndexingDisputeCreated(\n bytes32 indexed disputeId,\n address indexed indexer,\n address indexed fisherman,\n uint256 tokens,\n address allocationId,\n bytes32 poi,\n uint256 stakeSnapshot,\n uint256 cancellableAt\n );\n\n /**\n * @dev Emitted when a legacy dispute is created for `allocationId` and `fisherman`.\n * The event emits the amount of `tokensSlash` to slash and `tokensRewards` to reward the fisherman.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address to be credited with the rewards\n * @param allocationId The allocation id\n * @param tokensSlash The amount of tokens to slash\n * @param tokensRewards The amount of tokens to reward the fisherman\n */\n event LegacyDisputeCreated(\n bytes32 indexed disputeId,\n address indexed indexer,\n address indexed fisherman,\n address allocationId,\n uint256 tokensSlash,\n uint256 tokensRewards\n );\n\n /**\n * @dev Emitted when arbitrator accepts a `disputeId` to `indexer` created by `fisherman`.\n * The event emits the amount `tokens` transferred to the fisherman, the deposit plus reward.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address\n * @param tokens The amount of tokens transferred to the fisherman, the deposit plus reward\n */\n event DisputeAccepted(\n bytes32 indexed disputeId,\n address indexed indexer,\n address indexed fisherman,\n uint256 tokens\n );\n\n /**\n * @dev Emitted when arbitrator rejects a `disputeId` for `indexer` created by `fisherman`.\n * The event emits the amount `tokens` burned from the fisherman deposit.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address\n * @param tokens The amount of tokens burned from the fisherman deposit\n */\n event DisputeRejected(\n bytes32 indexed disputeId,\n address indexed indexer,\n address indexed fisherman,\n uint256 tokens\n );\n\n /**\n * @dev Emitted when arbitrator draw a `disputeId` for `indexer` created by `fisherman`.\n * The event emits the amount `tokens` used as deposit and returned to the fisherman.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address\n * @param tokens The amount of tokens returned to the fisherman - the deposit\n */\n event DisputeDrawn(bytes32 indexed disputeId, address indexed indexer, address indexed fisherman, uint256 tokens);\n\n /**\n * @dev Emitted when two disputes are in conflict to link them.\n * This event will be emitted after each DisputeCreated event is emitted\n * for each of the individual disputes.\n * @param disputeId1 The first dispute id\n * @param disputeId2 The second dispute id\n */\n event DisputeLinked(bytes32 indexed disputeId1, bytes32 indexed disputeId2);\n\n /**\n * @dev Emitted when a dispute is cancelled by the fisherman.\n * The event emits the amount `tokens` returned to the fisherman.\n * @param disputeId The dispute id\n * @param indexer The indexer address\n * @param fisherman The fisherman address\n * @param tokens The amount of tokens returned to the fisherman - the deposit\n */\n event DisputeCancelled(\n bytes32 indexed disputeId,\n address indexed indexer,\n address indexed fisherman,\n uint256 tokens\n );\n\n // -- Errors --\n\n /**\n * @notice Thrown when the caller is not the arbitrator\n */\n error DisputeManagerNotArbitrator();\n\n /**\n * @notice Thrown when the caller is not the fisherman\n */\n error DisputeManagerNotFisherman();\n\n /**\n * @notice Thrown when the address is the zero address\n */\n error DisputeManagerInvalidZeroAddress();\n\n /**\n * @notice Thrown when the dispute period is zero\n */\n error DisputeManagerDisputePeriodZero();\n\n /**\n * @notice Thrown when the indexer being disputed has no provisioned tokens\n */\n error DisputeManagerZeroTokens();\n\n /**\n * @notice Thrown when the dispute id is invalid\n * @param disputeId The dispute id\n */\n error DisputeManagerInvalidDispute(bytes32 disputeId);\n\n /**\n * @notice Thrown when the dispute deposit is invalid - less than the minimum dispute deposit\n * @param disputeDeposit The dispute deposit\n */\n error DisputeManagerInvalidDisputeDeposit(uint256 disputeDeposit);\n\n /**\n * @notice Thrown when the fisherman reward cut is invalid\n * @param cut The fisherman reward cut\n */\n error DisputeManagerInvalidFishermanReward(uint32 cut);\n\n /**\n * @notice Thrown when the max slashing cut is invalid\n * @param maxSlashingCut The max slashing cut\n */\n error DisputeManagerInvalidMaxSlashingCut(uint32 maxSlashingCut);\n\n /**\n * @notice Thrown when the tokens slash is invalid\n * @param tokensSlash The tokens slash\n * @param maxTokensSlash The max tokens slash\n */\n error DisputeManagerInvalidTokensSlash(uint256 tokensSlash, uint256 maxTokensSlash);\n\n /**\n * @notice Thrown when the dispute is not pending\n * @param status The status of the dispute\n */\n error DisputeManagerDisputeNotPending(IDisputeManager.DisputeStatus status);\n\n /**\n * @notice Thrown when the dispute is already created\n * @param disputeId The dispute id\n */\n error DisputeManagerDisputeAlreadyCreated(bytes32 disputeId);\n\n /**\n * @notice Thrown when the dispute period is not finished\n */\n error DisputeManagerDisputePeriodNotFinished();\n\n /**\n * @notice Thrown when the dispute is in conflict\n * @param disputeId The dispute id\n */\n error DisputeManagerDisputeInConflict(bytes32 disputeId);\n\n /**\n * @notice Thrown when the dispute is not in conflict\n * @param disputeId The dispute id\n */\n error DisputeManagerDisputeNotInConflict(bytes32 disputeId);\n\n /**\n * @notice Thrown when the dispute must be accepted\n * @param disputeId The dispute id\n * @param relatedDisputeId The related dispute id\n */\n error DisputeManagerMustAcceptRelatedDispute(bytes32 disputeId, bytes32 relatedDisputeId);\n\n /**\n * @notice Thrown when the indexer is not found\n * @param allocationId The allocation id\n */\n error DisputeManagerIndexerNotFound(address allocationId);\n\n /**\n * @notice Thrown when the subgraph deployment is not matching\n * @param subgraphDeploymentId1 The subgraph deployment id of the first attestation\n * @param subgraphDeploymentId2 The subgraph deployment id of the second attestation\n */\n error DisputeManagerNonMatchingSubgraphDeployment(bytes32 subgraphDeploymentId1, bytes32 subgraphDeploymentId2);\n\n /**\n * @notice Thrown when the attestations are not conflicting\n * @param requestCID1 The request CID of the first attestation\n * @param responseCID1 The response CID of the first attestation\n * @param subgraphDeploymentId1 The subgraph deployment id of the first attestation\n * @param requestCID2 The request CID of the second attestation\n * @param responseCID2 The response CID of the second attestation\n * @param subgraphDeploymentId2 The subgraph deployment id of the second attestation\n */\n error DisputeManagerNonConflictingAttestations(\n bytes32 requestCID1,\n bytes32 responseCID1,\n bytes32 subgraphDeploymentId1,\n bytes32 requestCID2,\n bytes32 responseCID2,\n bytes32 subgraphDeploymentId2\n );\n\n /**\n * @notice Thrown when attempting to get the subgraph service before it is set\n */\n error DisputeManagerSubgraphServiceNotSet();\n\n /**\n * @notice Initialize this contract.\n * @param owner The owner of the contract\n * @param arbitrator Arbitrator role\n * @param disputePeriod Dispute period in seconds\n * @param disputeDeposit Deposit required to create a Dispute\n * @param fishermanRewardCut_ Percent of slashed funds for fisherman (ppm)\n * @param maxSlashingCut_ Maximum percentage of indexer stake that can be slashed (ppm)\n */\n function initialize(\n address owner,\n address arbitrator,\n uint64 disputePeriod,\n uint256 disputeDeposit,\n uint32 fishermanRewardCut_,\n uint32 maxSlashingCut_\n ) external;\n\n /**\n * @notice Set the dispute period.\n * @dev Update the dispute period to `_disputePeriod` in seconds\n * @param disputePeriod Dispute period in seconds\n */\n function setDisputePeriod(uint64 disputePeriod) external;\n\n /**\n * @notice Set the arbitrator address.\n * @dev Update the arbitrator to `_arbitrator`\n * @param arbitrator The address of the arbitration contract or party\n */\n function setArbitrator(address arbitrator) external;\n\n /**\n * @notice Set the dispute deposit required to create a dispute.\n * @dev Update the dispute deposit to `_disputeDeposit` Graph Tokens\n * @param disputeDeposit The dispute deposit in Graph Tokens\n */\n function setDisputeDeposit(uint256 disputeDeposit) external;\n\n /**\n * @notice Set the percent reward that the fisherman gets when slashing occurs.\n * @dev Update the reward percentage to `_percentage`\n * @param fishermanRewardCut_ Reward as a percentage of indexer stake\n */\n function setFishermanRewardCut(uint32 fishermanRewardCut_) external;\n\n /**\n * @notice Set the maximum percentage that can be used for slashing indexers.\n * @param maxSlashingCut_ Max percentage slashing for disputes\n */\n function setMaxSlashingCut(uint32 maxSlashingCut_) external;\n\n /**\n * @notice Set the subgraph service address.\n * @dev Update the subgraph service to `_subgraphService`\n * @param subgraphService The address of the subgraph service contract\n */\n function setSubgraphService(address subgraphService) external;\n\n // -- Dispute --\n\n /**\n * @notice Create a query dispute for the arbitrator to resolve.\n * This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens.\n *\n * * Requirements:\n * - fisherman must have previously approved this contract to pull `disputeDeposit` amount\n * of tokens from their balance.\n *\n * @param attestationData Attestation bytes submitted by the fisherman\n * @return The dispute id\n */\n function createQueryDispute(bytes calldata attestationData) external returns (bytes32);\n\n /**\n * @notice Create query disputes for two conflicting attestations.\n * A conflicting attestation is a proof presented by two different indexers\n * where for the same request on a subgraph the response is different.\n * Two linked disputes will be created and if the arbitrator resolve one, the other\n * one will be automatically resolved. Note that:\n * - it's not possible to reject a conflicting query dispute as by definition at least one\n * of the attestations is incorrect.\n * - if both attestations are proven to be incorrect, the arbitrator can slash the indexer twice.\n * Requirements:\n * - fisherman must have previously approved this contract to pull `disputeDeposit` amount\n * of tokens from their balance.\n * @param attestationData1 First attestation data submitted\n * @param attestationData2 Second attestation data submitted\n * @return The first dispute id\n * @return The second dispute id\n */\n function createQueryDisputeConflict(\n bytes calldata attestationData1,\n bytes calldata attestationData2\n ) external returns (bytes32, bytes32);\n\n /**\n * @notice Create an indexing dispute for the arbitrator to resolve.\n * The disputes are created in reference to an allocationId and specifically\n * a POI for that allocation.\n * This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens.\n *\n * Requirements:\n * - fisherman must have previously approved this contract to pull `disputeDeposit` amount\n * of tokens from their balance.\n *\n * @param allocationId The allocation to dispute\n * @param poi The Proof of Indexing (POI) being disputed\n * @return The dispute id\n */\n function createIndexingDispute(address allocationId, bytes32 poi) external returns (bytes32);\n\n /**\n * @notice Creates and auto-accepts a legacy dispute.\n * This disputes can be created to settle outstanding slashing amounts with an indexer that has been\n * \"legacy slashed\" during or shortly after the transition period. See {HorizonStakingExtension.legacySlash}\n * for more details.\n *\n * Note that this type of dispute:\n * - can only be created by the arbitrator\n * - does not require a bond\n * - is automatically accepted when created\n *\n * Additionally, note that this type of disputes allow the arbitrator to directly set the slash and rewards\n * amounts, bypassing the usual mechanisms that impose restrictions on those. This is done to give arbitrators\n * maximum flexibility to ensure outstanding slashing amounts are settled fairly. This function needs to be removed\n * after the transition period.\n *\n * Requirements:\n * - Indexer must have been legacy slashed during or shortly after the transition period\n * - Indexer must have provisioned funds to the Subgraph Service\n *\n * @param allocationId The allocation to dispute\n * @param fisherman The fisherman address to be credited with the rewards\n * @param tokensSlash The amount of tokens to slash\n * @param tokensRewards The amount of tokens to reward the fisherman\n * @return The dispute id\n */\n function createAndAcceptLegacyDispute(\n address allocationId,\n address fisherman,\n uint256 tokensSlash,\n uint256 tokensRewards\n ) external returns (bytes32);\n\n // -- Arbitrator --\n\n /**\n * @notice The arbitrator accepts a dispute as being valid.\n * This function will revert if the indexer is not slashable, whether because it does not have\n * any stake available or the slashing percentage is configured to be zero. In those cases\n * a dispute must be resolved using drawDispute or rejectDispute.\n * This function will also revert if the dispute is in conflict, to accept a conflicting dispute\n * use acceptDisputeConflict.\n * @dev Accept a dispute with Id `disputeId`\n * @param disputeId Id of the dispute to be accepted\n * @param tokensSlash Amount of tokens to slash from the indexer\n */\n function acceptDispute(bytes32 disputeId, uint256 tokensSlash) external;\n\n /**\n * @notice The arbitrator accepts a conflicting dispute as being valid.\n * This function will revert if the indexer is not slashable, whether because it does not have\n * any stake available or the slashing percentage is configured to be zero. In those cases\n * a dispute must be resolved using drawDispute.\n * @param disputeId Id of the dispute to be accepted\n * @param tokensSlash Amount of tokens to slash from the indexer for the first dispute\n * @param acceptDisputeInConflict Accept the conflicting dispute. Otherwise it will be drawn automatically\n * @param tokensSlashRelated Amount of tokens to slash from the indexer for the related dispute in case\n * acceptDisputeInConflict is true, otherwise it will be ignored\n */\n function acceptDisputeConflict(\n bytes32 disputeId,\n uint256 tokensSlash,\n bool acceptDisputeInConflict,\n uint256 tokensSlashRelated\n ) external;\n\n /**\n * @notice The arbitrator rejects a dispute as being invalid.\n * Note that conflicting query disputes cannot be rejected.\n * @dev Reject a dispute with Id `disputeId`\n * @param disputeId Id of the dispute to be rejected\n */\n function rejectDispute(bytes32 disputeId) external;\n\n /**\n * @notice The arbitrator draws dispute.\n * Note that drawing a conflicting query dispute should not be possible however it is allowed\n * to give arbitrators greater flexibility when resolving disputes.\n * @dev Ignore a dispute with Id `disputeId`\n * @param disputeId Id of the dispute to be disregarded\n */\n function drawDispute(bytes32 disputeId) external;\n\n /**\n * @notice Once the dispute period ends, if the dispute status remains Pending,\n * the fisherman can cancel the dispute and get back their initial deposit.\n * Note that cancelling a conflicting query dispute will also cancel the related dispute.\n * @dev Cancel a dispute with Id `disputeId`\n * @param disputeId Id of the dispute to be cancelled\n */\n function cancelDispute(bytes32 disputeId) external;\n\n // -- Getters --\n\n /**\n * @notice Get the fisherman reward cut.\n * @return Fisherman reward cut in percentage (ppm)\n */\n function getFishermanRewardCut() external view returns (uint32);\n\n /**\n * @notice Get the dispute period.\n * @return Dispute period in seconds\n */\n function getDisputePeriod() external view returns (uint64);\n\n /**\n * @notice Return whether a dispute exists or not.\n * @dev Return if dispute with Id `disputeId` exists\n * @param disputeId True if dispute already exists\n * @return True if dispute already exists\n */\n function isDisputeCreated(bytes32 disputeId) external view returns (bool);\n\n /**\n * @notice Get the message hash that a indexer used to sign the receipt.\n * Encodes a receipt using a domain separator, as described on\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification.\n * @dev Return the message hash used to sign the receipt\n * @param receipt Receipt returned by indexer and submitted by fisherman\n * @return Message hash used to sign the receipt\n */\n function encodeReceipt(Attestation.Receipt memory receipt) external view returns (bytes32);\n\n /**\n * @notice Returns the indexer that signed an attestation.\n * @param attestation Attestation\n * @return indexer address\n */\n function getAttestationIndexer(Attestation.State memory attestation) external view returns (address);\n\n /**\n * @notice Get the stake snapshot for an indexer.\n * @param indexer The indexer address\n * @return The stake snapshot\n */\n function getStakeSnapshot(address indexer) external view returns (uint256);\n\n /**\n * @notice Checks if two attestations are conflicting\n * @param attestation1 The first attestation\n * @param attestation2 The second attestation\n * @return Whether the attestations are conflicting\n */\n function areConflictingAttestations(\n Attestation.State memory attestation1,\n Attestation.State memory attestation2\n ) external pure returns (bool);\n}\n" + }, + "contracts/interfaces/ISubgraphService.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDataServiceFees } from \"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\";\nimport { IGraphPayments } from \"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\";\n\nimport { Allocation } from \"../libraries/Allocation.sol\";\nimport { LegacyAllocation } from \"../libraries/LegacyAllocation.sol\";\n\n/**\n * @title Interface for the {SubgraphService} contract\n * @dev This interface extends {IDataServiceFees} and {IDataService}.\n * @notice The Subgraph Service is a data service built on top of Graph Horizon that supports the use case of\n * subgraph indexing and querying. The {SubgraphService} contract implements the flows described in the Data\n * Service framework to allow indexers to register as subgraph service providers, create allocations to signal\n * their commitment to index a subgraph, and collect fees for indexing and querying services.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ninterface ISubgraphService is IDataServiceFees {\n /**\n * @notice Indexer details\n * @param registeredAt The timestamp when the indexer registered\n * @param url The URL where the indexer can be reached at for queries\n * @param geoHash The indexer's geo location, expressed as a geo hash\n */\n struct Indexer {\n uint256 registeredAt;\n string url;\n string geoHash;\n }\n\n /**\n * @notice Emitted when a subgraph service collects query fees from Graph Payments\n * @param serviceProvider The address of the service provider\n * @param payer The address paying for the query fees\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n * @param tokensCollected The amount of tokens collected\n * @param tokensCurators The amount of tokens curators receive\n */\n event QueryFeesCollected(\n address indexed serviceProvider,\n address indexed payer,\n address indexed allocationId,\n bytes32 subgraphDeploymentId,\n uint256 tokensCollected,\n uint256 tokensCurators\n );\n\n /**\n * @notice Emitted when an indexer sets a new payments destination\n * @param indexer The address of the indexer\n * @param paymentsDestination The address where payments should be sent\n */\n event PaymentsDestinationSet(address indexed indexer, address indexed paymentsDestination);\n\n /**\n * @notice Emitted when the stake to fees ratio is set.\n * @param ratio The stake to fees ratio\n */\n event StakeToFeesRatioSet(uint256 ratio);\n\n /**\n * @notice Emitted when curator cuts are set\n * @param curationCut The curation cut\n */\n event CurationCutSet(uint256 curationCut);\n\n /**\n * @notice Thrown when trying to set a curation cut that is not a valid PPM value\n * @param curationCut The curation cut value\n */\n error SubgraphServiceInvalidCurationCut(uint256 curationCut);\n\n /**\n * @notice Thrown when an indexer tries to register with an empty URL\n */\n error SubgraphServiceEmptyUrl();\n\n /**\n * @notice Thrown when an indexer tries to register with an empty geohash\n */\n error SubgraphServiceEmptyGeohash();\n\n /**\n * @notice Thrown when an indexer tries to register but they are already registered\n */\n error SubgraphServiceIndexerAlreadyRegistered();\n\n /**\n * @notice Thrown when an indexer tries to perform an operation but they are not registered\n * @param indexer The address of the indexer that is not registered\n */\n error SubgraphServiceIndexerNotRegistered(address indexer);\n\n /**\n * @notice Thrown when an indexer tries to collect fees for an unsupported payment type\n * @param paymentType The payment type that is not supported\n */\n error SubgraphServiceInvalidPaymentType(IGraphPayments.PaymentTypes paymentType);\n\n /**\n * @notice Thrown when the contract GRT balance is inconsistent after collecting from Graph Payments\n * @param balanceBefore The contract GRT balance before the collection\n * @param balanceAfter The contract GRT balance after the collection\n */\n error SubgraphServiceInconsistentCollection(uint256 balanceBefore, uint256 balanceAfter);\n\n /**\n * @notice @notice Thrown when the service provider in the RAV does not match the expected indexer.\n * @param providedIndexer The address of the provided indexer.\n * @param expectedIndexer The address of the expected indexer.\n */\n error SubgraphServiceIndexerMismatch(address providedIndexer, address expectedIndexer);\n\n /**\n * @notice Thrown when the indexer in the allocation state does not match the expected indexer.\n * @param indexer The address of the expected indexer.\n * @param allocationId The id of the allocation.\n */\n error SubgraphServiceAllocationNotAuthorized(address indexer, address allocationId);\n\n /**\n * @notice Thrown when collecting a RAV where the RAV indexer is not the same as the allocation indexer\n * @param ravIndexer The address of the RAV indexer\n * @param allocationIndexer The address of the allocation indexer\n */\n error SubgraphServiceInvalidRAV(address ravIndexer, address allocationIndexer);\n\n /**\n * @notice Thrown when trying to force close an allocation that is not stale and the indexer is not over-allocated\n * @param allocationId The id of the allocation\n */\n error SubgraphServiceCannotForceCloseAllocation(address allocationId);\n\n /**\n * @notice Thrown when trying to force close an altruistic allocation\n * @param allocationId The id of the allocation\n */\n error SubgraphServiceAllocationIsAltruistic(address allocationId);\n\n /**\n * @notice Thrown when trying to set stake to fees ratio to zero\n */\n error SubgraphServiceInvalidZeroStakeToFeesRatio();\n\n /**\n * @notice Thrown when collectionId is not a valid address\n * @param collectionId The collectionId\n */\n error SubgraphServiceInvalidCollectionId(bytes32 collectionId);\n\n /**\n * @notice Initialize the contract\n * @dev The thawingPeriod and verifierCut ranges are not set here because they are variables\n * on the DisputeManager. We use the {ProvisionManager} overrideable getters to get the ranges.\n * @param owner The owner of the contract\n * @param minimumProvisionTokens The minimum amount of provisioned tokens required to create an allocation\n * @param maximumDelegationRatio The maximum delegation ratio allowed for an allocation\n * @param stakeToFeesRatio The ratio of stake to fees to lock when collecting query fees\n */\n function initialize(\n address owner,\n uint256 minimumProvisionTokens,\n uint32 maximumDelegationRatio,\n uint256 stakeToFeesRatio\n ) external;\n\n /**\n * @notice Force close a stale allocation\n * @dev This function can be permissionlessly called when the allocation is stale. This\n * ensures that rewards for other allocations are not diluted by an inactive allocation.\n *\n * Requirements:\n * - Allocation must exist and be open\n * - Allocation must be stale\n * - Allocation cannot be altruistic\n *\n * Emits a {AllocationClosed} event.\n *\n * @param allocationId The id of the allocation\n */\n function closeStaleAllocation(address allocationId) external;\n\n /**\n * @notice Change the amount of tokens in an allocation\n * @dev Requirements:\n * - The indexer must be registered\n * - The provision must be valid according to the subgraph service rules\n * - `tokens` must be different from the current allocation size\n * - The indexer must have enough available tokens to allocate if they are upsizing the allocation\n *\n * Emits a {AllocationResized} event.\n *\n * See {AllocationManager-_resizeAllocation} for more details.\n *\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param tokens The new amount of tokens in the allocation\n */\n function resizeAllocation(address indexer, address allocationId, uint256 tokens) external;\n\n /**\n * @notice Imports a legacy allocation id into the subgraph service\n * This is a governor only action that is required to prevent indexers from re-using allocation ids from the\n * legacy staking contract.\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n */\n function migrateLegacyAllocation(address indexer, address allocationId, bytes32 subgraphDeploymentId) external;\n\n /**\n * @notice Sets a pause guardian\n * @param pauseGuardian The address of the pause guardian\n * @param allowed True if the pause guardian is allowed to pause the contract, false otherwise\n */\n function setPauseGuardian(address pauseGuardian, bool allowed) external;\n\n /**\n * @notice Sets the minimum amount of provisioned tokens required to create an allocation\n * @param minimumProvisionTokens The minimum amount of provisioned tokens required to create an allocation\n */\n function setMinimumProvisionTokens(uint256 minimumProvisionTokens) external;\n\n /**\n * @notice Sets the delegation ratio\n * @param delegationRatio The delegation ratio\n */\n function setDelegationRatio(uint32 delegationRatio) external;\n\n /**\n * @notice Sets the stake to fees ratio\n * @param stakeToFeesRatio The stake to fees ratio\n */\n function setStakeToFeesRatio(uint256 stakeToFeesRatio) external;\n\n /**\n * @notice Sets the max POI staleness\n * See {AllocationManagerV1Storage-maxPOIStaleness} for more details.\n * @param maxPOIStaleness The max POI staleness in seconds\n */\n function setMaxPOIStaleness(uint256 maxPOIStaleness) external;\n\n /**\n * @notice Sets the curators payment cut for query fees\n * @dev Emits a {CuratorCutSet} event\n * @param curationCut The curation cut for the payment type\n */\n function setCurationCut(uint256 curationCut) external;\n\n /**\n * @notice Sets the payments destination for an indexer to receive payments\n * @dev Emits a {PaymentsDestinationSet} event\n * @param paymentsDestination The address where payments should be sent\n */\n function setPaymentsDestination(address paymentsDestination) external;\n\n /**\n * @notice Gets the details of an allocation\n * For legacy allocations use {getLegacyAllocation}\n * @param allocationId The id of the allocation\n * @return The allocation details\n */\n function getAllocation(address allocationId) external view returns (Allocation.State memory);\n\n /**\n * @notice Gets the details of a legacy allocation\n * For non-legacy allocations use {getAllocation}\n * @param allocationId The id of the allocation\n * @return The legacy allocation details\n */\n function getLegacyAllocation(address allocationId) external view returns (LegacyAllocation.State memory);\n\n /**\n * @notice Encodes the allocation proof for EIP712 signing\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @return The encoded allocation proof\n */\n function encodeAllocationProof(address indexer, address allocationId) external view returns (bytes32);\n\n /**\n * @notice Checks if an indexer is over-allocated\n * @param allocationId The id of the allocation\n * @return True if the indexer is over-allocated, false otherwise\n */\n function isOverAllocated(address allocationId) external view returns (bool);\n\n /**\n * @notice Gets the address of the dispute manager\n * @return The address of the dispute manager\n */\n function getDisputeManager() external view returns (address);\n\n /**\n * @notice Gets the address of the graph tally collector\n * @return The address of the graph tally collector\n */\n function getGraphTallyCollector() external view returns (address);\n\n /**\n * @notice Gets the address of the curation contract\n * @return The address of the curation contract\n */\n function getCuration() external view returns (address);\n}\n" + }, + "contracts/libraries/Allocation.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { Math } from \"@openzeppelin/contracts/utils/math/Math.sol\";\n\n/**\n * @title Allocation library\n * @notice A library to handle Allocations.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary Allocation {\n using Allocation for State;\n\n /**\n * @notice Allocation details\n * @param indexer The indexer that owns the allocation\n * @param subgraphDeploymentId The subgraph deployment id the allocation is for\n * @param tokens The number of tokens allocated\n * @param createdAt The timestamp when the allocation was created\n * @param closedAt The timestamp when the allocation was closed\n * @param lastPOIPresentedAt The timestamp when the last POI was presented\n * @param accRewardsPerAllocatedToken The accumulated rewards per allocated token\n * @param accRewardsPending The accumulated rewards that are pending to be claimed due allocation resize\n * @param createdAtEpoch The epoch when the allocation was created\n */\n struct State {\n address indexer;\n bytes32 subgraphDeploymentId;\n uint256 tokens;\n uint256 createdAt;\n uint256 closedAt;\n uint256 lastPOIPresentedAt;\n uint256 accRewardsPerAllocatedToken;\n uint256 accRewardsPending;\n uint256 createdAtEpoch;\n }\n\n /**\n * @notice Thrown when attempting to create an allocation with an existing id\n * @param allocationId The allocation id\n */\n error AllocationAlreadyExists(address allocationId);\n\n /**\n * @notice Thrown when trying to perform an operation on a non-existent allocation\n * @param allocationId The allocation id\n */\n error AllocationDoesNotExist(address allocationId);\n\n /**\n * @notice Thrown when trying to perform an operation on a closed allocation\n * @param allocationId The allocation id\n * @param closedAt The timestamp when the allocation was closed\n */\n error AllocationClosed(address allocationId, uint256 closedAt);\n\n /**\n * @notice Create a new allocation\n * @dev Requirements:\n * - The allocation must not exist\n * @param self The allocation list mapping\n * @param indexer The indexer that owns the allocation\n * @param allocationId The allocation id\n * @param subgraphDeploymentId The subgraph deployment id the allocation is for\n * @param tokens The number of tokens allocated\n * @param accRewardsPerAllocatedToken The initial accumulated rewards per allocated token\n * @param createdAtEpoch The epoch when the allocation was created\n * @return The allocation\n */\n function create(\n mapping(address => State) storage self,\n address indexer,\n address allocationId,\n bytes32 subgraphDeploymentId,\n uint256 tokens,\n uint256 accRewardsPerAllocatedToken,\n uint256 createdAtEpoch\n ) internal returns (State memory) {\n require(!self[allocationId].exists(), AllocationAlreadyExists(allocationId));\n\n State memory allocation = State({\n indexer: indexer,\n subgraphDeploymentId: subgraphDeploymentId,\n tokens: tokens,\n createdAt: block.timestamp,\n closedAt: 0,\n lastPOIPresentedAt: 0,\n accRewardsPerAllocatedToken: accRewardsPerAllocatedToken,\n accRewardsPending: 0,\n createdAtEpoch: createdAtEpoch\n });\n\n self[allocationId] = allocation;\n\n return allocation;\n }\n\n /**\n * @notice Present a POI for an allocation\n * @dev It only updates the last POI presented timestamp.\n * Requirements:\n * - The allocation must be open\n * @param self The allocation list mapping\n * @param allocationId The allocation id\n */\n function presentPOI(mapping(address => State) storage self, address allocationId) internal {\n State storage allocation = _get(self, allocationId);\n require(allocation.isOpen(), AllocationClosed(allocationId, allocation.closedAt));\n allocation.lastPOIPresentedAt = block.timestamp;\n }\n\n /**\n * @notice Update the accumulated rewards per allocated token for an allocation\n * @dev Requirements:\n * - The allocation must be open\n * @param self The allocation list mapping\n * @param allocationId The allocation id\n * @param accRewardsPerAllocatedToken The new accumulated rewards per allocated token\n */\n function snapshotRewards(\n mapping(address => State) storage self,\n address allocationId,\n uint256 accRewardsPerAllocatedToken\n ) internal {\n State storage allocation = _get(self, allocationId);\n require(allocation.isOpen(), AllocationClosed(allocationId, allocation.closedAt));\n allocation.accRewardsPerAllocatedToken = accRewardsPerAllocatedToken;\n }\n\n /**\n * @notice Update the accumulated rewards pending to be claimed for an allocation\n * @dev Requirements:\n * - The allocation must be open\n * @param self The allocation list mapping\n * @param allocationId The allocation id\n */\n function clearPendingRewards(mapping(address => State) storage self, address allocationId) internal {\n State storage allocation = _get(self, allocationId);\n require(allocation.isOpen(), AllocationClosed(allocationId, allocation.closedAt));\n allocation.accRewardsPending = 0;\n }\n\n /**\n * @notice Close an allocation\n * @dev Requirements:\n * - The allocation must be open\n * @param self The allocation list mapping\n * @param allocationId The allocation id\n */\n function close(mapping(address => State) storage self, address allocationId) internal {\n State storage allocation = _get(self, allocationId);\n require(allocation.isOpen(), AllocationClosed(allocationId, allocation.closedAt));\n allocation.closedAt = block.timestamp;\n }\n\n /**\n * @notice Get an allocation\n * @param self The allocation list mapping\n * @param allocationId The allocation id\n * @return The allocation\n */\n function get(mapping(address => State) storage self, address allocationId) internal view returns (State memory) {\n return _get(self, allocationId);\n }\n\n /**\n * @notice Checks if an allocation is stale\n * @param self The allocation\n * @param staleThreshold The time in blocks to consider an allocation stale\n * @return True if the allocation is stale\n */\n function isStale(State memory self, uint256 staleThreshold) internal view returns (bool) {\n uint256 timeSinceLastPOI = block.timestamp - Math.max(self.createdAt, self.lastPOIPresentedAt);\n return self.isOpen() && timeSinceLastPOI > staleThreshold;\n }\n\n /**\n * @notice Checks if an allocation exists\n * @param self The allocation\n * @return True if the allocation exists\n */\n function exists(State memory self) internal pure returns (bool) {\n return self.createdAt != 0;\n }\n\n /**\n * @notice Checks if an allocation is open\n * @param self The allocation\n * @return True if the allocation is open\n */\n function isOpen(State memory self) internal pure returns (bool) {\n return self.exists() && self.closedAt == 0;\n }\n\n /**\n * @notice Checks if an allocation is alturistic\n * @param self The allocation\n * @return True if the allocation is alturistic\n */\n function isAltruistic(State memory self) internal pure returns (bool) {\n return self.exists() && self.tokens == 0;\n }\n\n /**\n * @notice Get the allocation for an allocation id\n * @dev Reverts if the allocation does not exist\n * @param self The allocation list mapping\n * @param allocationId The allocation id\n * @return The allocation\n */\n function _get(mapping(address => State) storage self, address allocationId) private view returns (State storage) {\n State storage allocation = self[allocationId];\n require(allocation.exists(), AllocationDoesNotExist(allocationId));\n return allocation;\n }\n}\n" + }, + "contracts/libraries/Attestation.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title Attestation library\n * @notice A library to handle Attestation.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary Attestation {\n /**\n * @notice Receipt content sent from the service provider in response to request\n * @param requestCID The request CID\n * @param responseCID The response CID\n * @param subgraphDeploymentId The subgraph deployment id\n */\n struct Receipt {\n bytes32 requestCID;\n bytes32 responseCID;\n bytes32 subgraphDeploymentId;\n }\n\n /**\n * @notice Attestation sent from the service provider in response to a request\n * @param requestCID The request CID\n * @param responseCID The response CID\n * @param subgraphDeploymentId The subgraph deployment id\n * @param r The r value of the signature\n * @param s The s value of the signature\n * @param v The v value of the signature\n */\n struct State {\n bytes32 requestCID;\n bytes32 responseCID;\n bytes32 subgraphDeploymentId;\n bytes32 r;\n bytes32 s;\n uint8 v;\n }\n\n /// @notice Attestation size is the sum of the receipt (96) + signature (65)\n uint256 private constant RECEIPT_SIZE_BYTES = 96;\n\n /// @notice The length of the r value of the signature\n uint256 private constant SIG_R_LENGTH = 32;\n\n /// @notice The length of the s value of the signature\n uint256 private constant SIG_S_LENGTH = 32;\n\n /// @notice The length of the v value of the signature\n uint256 private constant SIG_V_LENGTH = 1;\n\n /// @notice The offset of the r value of the signature\n uint256 private constant SIG_R_OFFSET = RECEIPT_SIZE_BYTES;\n\n /// @notice The offset of the s value of the signature\n uint256 private constant SIG_S_OFFSET = RECEIPT_SIZE_BYTES + SIG_R_LENGTH;\n\n /// @notice The offset of the v value of the signature\n uint256 private constant SIG_V_OFFSET = RECEIPT_SIZE_BYTES + SIG_R_LENGTH + SIG_S_LENGTH;\n\n /// @notice The size of the signature\n uint256 private constant SIG_SIZE_BYTES = SIG_R_LENGTH + SIG_S_LENGTH + SIG_V_LENGTH;\n\n /// @notice The size of the attestation\n uint256 private constant ATTESTATION_SIZE_BYTES = RECEIPT_SIZE_BYTES + SIG_SIZE_BYTES;\n\n /// @notice The length of the uint8 value\n uint256 private constant UINT8_BYTE_LENGTH = 1;\n\n /// @notice The length of the bytes32 value\n uint256 private constant BYTES32_BYTE_LENGTH = 32;\n\n /**\n * @notice The error thrown when the attestation data length is invalid\n * @param length The length of the attestation data\n * @param expectedLength The expected length of the attestation data\n */\n error AttestationInvalidBytesLength(uint256 length, uint256 expectedLength);\n\n /**\n * @dev Returns if two attestations are conflicting.\n * Everything must match except for the responseId.\n * @param _attestation1 Attestation\n * @param _attestation2 Attestation\n * @return True if the two attestations are conflicting\n */\n function areConflicting(\n Attestation.State memory _attestation1,\n Attestation.State memory _attestation2\n ) internal pure returns (bool) {\n return (_attestation1.requestCID == _attestation2.requestCID &&\n _attestation1.subgraphDeploymentId == _attestation2.subgraphDeploymentId &&\n _attestation1.responseCID != _attestation2.responseCID);\n }\n\n /**\n * @dev Parse the bytes attestation into a struct from `_data`.\n * @param _data The bytes to parse\n * @return Attestation struct\n */\n function parse(bytes memory _data) internal pure returns (State memory) {\n // Check attestation data length\n require(\n _data.length == ATTESTATION_SIZE_BYTES,\n AttestationInvalidBytesLength(_data.length, ATTESTATION_SIZE_BYTES)\n );\n\n // Decode receipt\n (bytes32 requestCID, bytes32 responseCID, bytes32 subgraphDeploymentId) = abi.decode(\n _data,\n (bytes32, bytes32, bytes32)\n );\n\n // Decode signature\n // Signature is expected to be in the order defined in the Attestation struct\n bytes32 r = _toBytes32(_data, SIG_R_OFFSET);\n bytes32 s = _toBytes32(_data, SIG_S_OFFSET);\n uint8 v = _toUint8(_data, SIG_V_OFFSET);\n\n return State(requestCID, responseCID, subgraphDeploymentId, r, s, v);\n }\n\n /**\n * @dev Parse a uint8 from `_bytes` starting at offset `_start`.\n * @param _bytes The bytes to parse\n * @param _start The start offset\n * @return uint8 value\n */\n function _toUint8(bytes memory _bytes, uint256 _start) private pure returns (uint8) {\n require(\n _bytes.length >= _start + UINT8_BYTE_LENGTH,\n AttestationInvalidBytesLength(_bytes.length, _start + UINT8_BYTE_LENGTH)\n );\n uint8 tempUint;\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // Load the 32-byte word from memory starting at `_bytes + _start + 1`\n // The `0x1` accounts for the fact that we want only the first byte (uint8)\n // of the loaded 32 bytes.\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n /**\n * @dev Parse a bytes32 from `_bytes` starting at offset `_start`.\n * @param _bytes The bytes to parse\n * @param _start The start offset\n * @return bytes32 value\n */\n function _toBytes32(bytes memory _bytes, uint256 _start) private pure returns (bytes32) {\n require(\n _bytes.length >= _start + BYTES32_BYTE_LENGTH,\n AttestationInvalidBytesLength(_bytes.length, _start + BYTES32_BYTE_LENGTH)\n );\n bytes32 tempBytes32;\n\n // solhint-disable-next-line no-inline-assembly\n assembly {\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\n }\n\n return tempBytes32;\n }\n}\n" + }, + "contracts/libraries/LegacyAllocation.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IHorizonStaking } from \"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\";\n\n/**\n * @title LegacyAllocation library\n * @notice A library to handle legacy Allocations.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nlibrary LegacyAllocation {\n using LegacyAllocation for State;\n\n /**\n * @notice Legacy allocation details\n * @dev Note that we are only storing the indexer and subgraphDeploymentId. The main point of tracking legacy allocations\n * is to prevent them from being re used on the Subgraph Service. We don't need to store the rest of the allocation details.\n * @param indexer The indexer that owns the allocation\n * @param subgraphDeploymentId The subgraph deployment id the allocation is for\n */\n struct State {\n address indexer;\n bytes32 subgraphDeploymentId;\n }\n\n /**\n * @notice Thrown when attempting to migrate an allocation with an existing id\n * @param allocationId The allocation id\n */\n error LegacyAllocationAlreadyExists(address allocationId);\n\n /**\n * @notice Thrown when trying to get a non-existent allocation\n * @param allocationId The allocation id\n */\n error LegacyAllocationDoesNotExist(address allocationId);\n\n /**\n * @notice Migrate a legacy allocation\n * @dev Requirements:\n * - The allocation must not have been previously migrated\n * @param self The legacy allocation list mapping\n * @param indexer The indexer that owns the allocation\n * @param allocationId The allocation id\n * @param subgraphDeploymentId The subgraph deployment id the allocation is for\n * @custom:error LegacyAllocationAlreadyMigrated if the allocation has already been migrated\n */\n function migrate(\n mapping(address => State) storage self,\n address indexer,\n address allocationId,\n bytes32 subgraphDeploymentId\n ) internal {\n require(!self[allocationId].exists(), LegacyAllocationAlreadyExists(allocationId));\n\n self[allocationId] = State({ indexer: indexer, subgraphDeploymentId: subgraphDeploymentId });\n }\n\n /**\n * @notice Get a legacy allocation\n * @param self The legacy allocation list mapping\n * @param allocationId The allocation id\n * @return The legacy allocation details\n */\n function get(mapping(address => State) storage self, address allocationId) internal view returns (State memory) {\n return _get(self, allocationId);\n }\n\n /**\n * @notice Revert if a legacy allocation exists\n * @dev We first check the migrated mapping then the old staking contract.\n * @dev TRANSITION PERIOD: after the transition period when all the allocations are migrated we can\n * remove the call to the staking contract.\n * @param self The legacy allocation list mapping\n * @param graphStaking The Horizon Staking contract\n * @param allocationId The allocation id\n */\n function revertIfExists(\n mapping(address => State) storage self,\n IHorizonStaking graphStaking,\n address allocationId\n ) internal view {\n require(!self[allocationId].exists(), LegacyAllocationAlreadyExists(allocationId));\n require(!graphStaking.isAllocation(allocationId), LegacyAllocationAlreadyExists(allocationId));\n }\n\n /**\n * @notice Check if a legacy allocation exists\n * @param self The legacy allocation\n * @return True if the allocation exists\n */\n function exists(State memory self) internal pure returns (bool) {\n return self.indexer != address(0);\n }\n\n /**\n * @notice Get a legacy allocation\n * @param self The legacy allocation list mapping\n * @param allocationId The allocation id\n * @return The legacy allocation details\n */\n function _get(mapping(address => State) storage self, address allocationId) private view returns (State storage) {\n State storage allocation = self[allocationId];\n require(allocation.exists(), LegacyAllocationDoesNotExist(allocationId));\n return allocation;\n }\n}\n" + }, + "contracts/mocks/imports.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity ^0.7.6 || 0.8.27;\n\n// These are needed to get artifacts for toolshed\nimport \"@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol\";\nimport \"@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol\";\nimport \"@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol\";\n" + }, + "contracts/SubgraphService.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IGraphPayments } from \"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\";\nimport { IGraphToken } from \"@graphprotocol/contracts/contracts/token/IGraphToken.sol\";\nimport { IGraphTallyCollector } from \"@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol\";\nimport { IRewardsIssuer } from \"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\";\nimport { IDataService } from \"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\";\nimport { ISubgraphService } from \"./interfaces/ISubgraphService.sol\";\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { MulticallUpgradeable } from \"@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol\";\nimport { Initializable } from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport { DataServicePausableUpgradeable } from \"@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol\";\nimport { DataService } from \"@graphprotocol/horizon/contracts/data-service/DataService.sol\";\nimport { DataServiceFees } from \"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol\";\nimport { Directory } from \"./utilities/Directory.sol\";\nimport { AllocationManager } from \"./utilities/AllocationManager.sol\";\nimport { SubgraphServiceV1Storage } from \"./SubgraphServiceStorage.sol\";\n\nimport { TokenUtils } from \"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\";\nimport { PPMMath } from \"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\";\nimport { Allocation } from \"./libraries/Allocation.sol\";\nimport { LegacyAllocation } from \"./libraries/LegacyAllocation.sol\";\n\n/**\n * @title SubgraphService contract\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\ncontract SubgraphService is\n Initializable,\n OwnableUpgradeable,\n MulticallUpgradeable,\n DataService,\n DataServicePausableUpgradeable,\n DataServiceFees,\n Directory,\n AllocationManager,\n SubgraphServiceV1Storage,\n IRewardsIssuer,\n ISubgraphService\n{\n using PPMMath for uint256;\n using Allocation for mapping(address => Allocation.State);\n using Allocation for Allocation.State;\n using TokenUtils for IGraphToken;\n\n /**\n * @notice Checks that an indexer is registered\n * @param indexer The address of the indexer\n */\n modifier onlyRegisteredIndexer(address indexer) {\n require(indexers[indexer].registeredAt != 0, SubgraphServiceIndexerNotRegistered(indexer));\n _;\n }\n\n /**\n * @notice Constructor for the SubgraphService contract\n * @dev DataService and Directory constructors set a bunch of immutable variables\n * @param graphController The address of the Graph Controller contract\n * @param disputeManager The address of the DisputeManager contract\n * @param graphTallyCollector The address of the GraphTallyCollector contract\n * @param curation The address of the Curation contract\n */\n constructor(\n address graphController,\n address disputeManager,\n address graphTallyCollector,\n address curation\n ) DataService(graphController) Directory(address(this), disputeManager, graphTallyCollector, curation) {\n _disableInitializers();\n }\n\n /// @inheritdoc ISubgraphService\n function initialize(\n address owner,\n uint256 minimumProvisionTokens,\n uint32 maximumDelegationRatio,\n uint256 stakeToFeesRatio_\n ) external initializer {\n __Ownable_init(owner);\n __Multicall_init();\n __DataService_init();\n __DataServicePausable_init();\n __AllocationManager_init(\"SubgraphService\", \"1.0\");\n\n _setProvisionTokensRange(minimumProvisionTokens, type(uint256).max);\n _setDelegationRatio(maximumDelegationRatio);\n _setStakeToFeesRatio(stakeToFeesRatio_);\n }\n\n /**\n * @notice\n * @dev Implements {IDataService.register}\n *\n * Requirements:\n * - The indexer must not be already registered\n * - The URL must not be empty\n * - The provision must be valid according to the subgraph service rules\n *\n * Emits a {ServiceProviderRegistered} event\n *\n * @param indexer The address of the indexer to register\n * @param data Encoded registration data:\n * - string `url`: The URL of the indexer\n * - string `geohash`: The geohash of the indexer\n * - address `paymentsDestination`: The address where the indexer wants to receive payments.\n * Use zero address for automatically restaking payments.\n */\n /// @inheritdoc IDataService\n function register(\n address indexer,\n bytes calldata data\n ) external override onlyAuthorizedForProvision(indexer) onlyValidProvision(indexer) whenNotPaused {\n (string memory url, string memory geohash, address paymentsDestination_) = abi.decode(\n data,\n (string, string, address)\n );\n\n require(bytes(url).length > 0, SubgraphServiceEmptyUrl());\n require(bytes(geohash).length > 0, SubgraphServiceEmptyGeohash());\n require(indexers[indexer].registeredAt == 0, SubgraphServiceIndexerAlreadyRegistered());\n\n // Register the indexer\n indexers[indexer] = Indexer({ registeredAt: block.timestamp, url: url, geoHash: geohash });\n if (paymentsDestination_ != address(0)) {\n _setPaymentsDestination(indexer, paymentsDestination_);\n }\n\n emit ServiceProviderRegistered(indexer, data);\n }\n\n /**\n * @notice Accept staged parameters in the provision of a service provider\n * @dev Implements {IDataService-acceptProvisionPendingParameters}\n *\n * Requirements:\n * - The indexer must be registered\n * - Must have previously staged provision parameters, using {IHorizonStaking-setProvisionParameters}\n * - The new provision parameters must be valid according to the subgraph service rules\n *\n * Emits a {ProvisionPendingParametersAccepted} event\n *\n * @param indexer The address of the indexer to accept the provision for\n */\n /// @inheritdoc IDataService\n function acceptProvisionPendingParameters(\n address indexer,\n bytes calldata\n ) external override onlyAuthorizedForProvision(indexer) whenNotPaused {\n _acceptProvisionParameters(indexer);\n emit ProvisionPendingParametersAccepted(indexer);\n }\n\n /**\n * @notice Allocates tokens to subgraph deployment, manifesting the indexer's commitment to index it\n * @dev This is the equivalent of the `allocate` function in the legacy Staking contract.\n *\n * Requirements:\n * - The indexer must be registered\n * - The provision must be valid according to the subgraph service rules\n * - Allocation id cannot be zero\n * - Allocation id cannot be reused from the legacy staking contract\n * - The indexer must have enough available tokens to allocate\n *\n * The `allocationProof` is a 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationId)`.\n *\n * See {AllocationManager-allocate} for more details.\n *\n * Emits {ServiceStarted} and {AllocationCreated} events\n *\n * @param indexer The address of the indexer\n * @param data Encoded data:\n * - bytes32 `subgraphDeploymentId`: The id of the subgraph deployment\n * - uint256 `tokens`: The amount of tokens to allocate\n * - address `allocationId`: The id of the allocation\n * - bytes `allocationProof`: Signed proof of the allocation id address ownership\n */\n /// @inheritdoc IDataService\n function startService(\n address indexer,\n bytes calldata data\n )\n external\n override\n onlyAuthorizedForProvision(indexer)\n onlyValidProvision(indexer)\n onlyRegisteredIndexer(indexer)\n whenNotPaused\n {\n (bytes32 subgraphDeploymentId, uint256 tokens, address allocationId, bytes memory allocationProof) = abi.decode(\n data,\n (bytes32, uint256, address, bytes)\n );\n _allocate(indexer, allocationId, subgraphDeploymentId, tokens, allocationProof, _delegationRatio);\n emit ServiceStarted(indexer, data);\n }\n\n /**\n * @notice Close an allocation, indicating that the indexer has stopped indexing the subgraph deployment\n * @dev This is the equivalent of the `closeAllocation` function in the legacy Staking contract.\n * There are a few notable differences with the legacy function:\n * - allocations are nowlong lived. All service payments, including indexing rewards, should be collected periodically\n * without the need of closing the allocation. Allocations should only be closed when indexers want to reclaim the allocated\n * tokens for other purposes.\n * - No POI is required to close an allocation. Indexers should present POIs to collect indexing rewards using {collect}.\n *\n * Requirements:\n * - The indexer must be registered\n * - Allocation must exist and be open\n *\n * Emits {ServiceStopped} and {AllocationClosed} events\n *\n * @param indexer The address of the indexer\n * @param data Encoded data:\n * - address `allocationId`: The id of the allocation\n */\n /// @inheritdoc IDataService\n function stopService(\n address indexer,\n bytes calldata data\n ) external override onlyAuthorizedForProvision(indexer) onlyRegisteredIndexer(indexer) whenNotPaused {\n address allocationId = abi.decode(data, (address));\n require(\n _allocations.get(allocationId).indexer == indexer,\n SubgraphServiceAllocationNotAuthorized(indexer, allocationId)\n );\n _closeAllocation(allocationId, false);\n emit ServiceStopped(indexer, data);\n }\n\n /**\n * @notice Collects payment for the service provided by the indexer\n * Allows collecting different types of payments such as query fees and indexing rewards.\n * It uses Graph Horizon payments protocol to process payments.\n * Reverts if the payment type is not supported.\n * @dev This function is the equivalent of the `collect` function for query fees and the `closeAllocation` function\n * for indexing rewards in the legacy Staking contract.\n *\n * Requirements:\n * - The indexer must be registered\n * - The provision must be valid according to the subgraph service rules\n *\n * Emits a {ServicePaymentCollected} event. Emits payment type specific events.\n *\n * For query fees, see {SubgraphService-_collectQueryFees} for more details.\n * For indexing rewards, see {AllocationManager-_collectIndexingRewards} for more details.\n *\n * @param indexer The address of the indexer\n * @param paymentType The type of payment to collect as defined in {IGraphPayments}\n * @param data Encoded data:\n * - For query fees:\n * - IGraphTallyCollector.SignedRAV `signedRav`: The signed RAV\n * - For indexing rewards:\n * - address `allocationId`: The id of the allocation\n * - bytes32 `poi`: The POI being presented\n * - bytes `poiMetadata`: The metadata associated with the POI. See {AllocationManager-_collectIndexingRewards} for more details.\n */\n /// @inheritdoc IDataService\n function collect(\n address indexer,\n IGraphPayments.PaymentTypes paymentType,\n bytes calldata data\n )\n external\n override\n onlyAuthorizedForProvision(indexer)\n onlyValidProvision(indexer)\n onlyRegisteredIndexer(indexer)\n whenNotPaused\n returns (uint256)\n {\n uint256 paymentCollected = 0;\n\n if (paymentType == IGraphPayments.PaymentTypes.QueryFee) {\n paymentCollected = _collectQueryFees(indexer, data);\n } else if (paymentType == IGraphPayments.PaymentTypes.IndexingRewards) {\n paymentCollected = _collectIndexingRewards(indexer, data);\n } else {\n revert SubgraphServiceInvalidPaymentType(paymentType);\n }\n\n emit ServicePaymentCollected(indexer, paymentType, paymentCollected);\n return paymentCollected;\n }\n\n /**\n * @notice See {IHorizonStaking-slash} for more details.\n * @dev Slashing is delegated to the {DisputeManager} contract which is the only one that can call this\n * function.\n */\n /// @inheritdoc IDataService\n function slash(address indexer, bytes calldata data) external override onlyDisputeManager {\n (uint256 tokens, uint256 reward) = abi.decode(data, (uint256, uint256));\n _graphStaking().slash(indexer, tokens, reward, address(_disputeManager()));\n emit ServiceProviderSlashed(indexer, tokens);\n }\n\n /// @inheritdoc ISubgraphService\n function closeStaleAllocation(address allocationId) external override whenNotPaused {\n Allocation.State memory allocation = _allocations.get(allocationId);\n require(allocation.isStale(maxPOIStaleness), SubgraphServiceCannotForceCloseAllocation(allocationId));\n require(!allocation.isAltruistic(), SubgraphServiceAllocationIsAltruistic(allocationId));\n _closeAllocation(allocationId, true);\n }\n\n /// @inheritdoc ISubgraphService\n function resizeAllocation(\n address indexer,\n address allocationId,\n uint256 tokens\n )\n external\n onlyAuthorizedForProvision(indexer)\n onlyValidProvision(indexer)\n onlyRegisteredIndexer(indexer)\n whenNotPaused\n {\n require(\n _allocations.get(allocationId).indexer == indexer,\n SubgraphServiceAllocationNotAuthorized(indexer, allocationId)\n );\n _resizeAllocation(allocationId, tokens, _delegationRatio);\n }\n\n /// @inheritdoc ISubgraphService\n function migrateLegacyAllocation(\n address indexer,\n address allocationId,\n bytes32 subgraphDeploymentID\n ) external override onlyOwner {\n _migrateLegacyAllocation(indexer, allocationId, subgraphDeploymentID);\n }\n\n /// @inheritdoc ISubgraphService\n function setPauseGuardian(address pauseGuardian, bool allowed) external override onlyOwner {\n _setPauseGuardian(pauseGuardian, allowed);\n }\n\n /// @inheritdoc ISubgraphService\n function setPaymentsDestination(address paymentsDestination_) external override {\n _setPaymentsDestination(msg.sender, paymentsDestination_);\n }\n\n /// @inheritdoc ISubgraphService\n function setMinimumProvisionTokens(uint256 minimumProvisionTokens) external override onlyOwner {\n _setProvisionTokensRange(minimumProvisionTokens, DEFAULT_MAX_PROVISION_TOKENS);\n }\n\n /// @inheritdoc ISubgraphService\n function setDelegationRatio(uint32 delegationRatio) external override onlyOwner {\n _setDelegationRatio(delegationRatio);\n }\n\n /// @inheritdoc ISubgraphService\n function setStakeToFeesRatio(uint256 stakeToFeesRatio_) external override onlyOwner {\n _setStakeToFeesRatio(stakeToFeesRatio_);\n }\n\n /// @inheritdoc ISubgraphService\n function setMaxPOIStaleness(uint256 maxPOIStaleness_) external override onlyOwner {\n _setMaxPOIStaleness(maxPOIStaleness_);\n }\n\n /// @inheritdoc ISubgraphService\n function setCurationCut(uint256 curationCut) external override onlyOwner {\n require(PPMMath.isValidPPM(curationCut), SubgraphServiceInvalidCurationCut(curationCut));\n curationFeesCut = curationCut;\n emit CurationCutSet(curationCut);\n }\n\n /// @inheritdoc ISubgraphService\n function getAllocation(address allocationId) external view override returns (Allocation.State memory) {\n return _allocations[allocationId];\n }\n\n /// @inheritdoc IRewardsIssuer\n function getAllocationData(\n address allocationId\n ) external view override returns (bool, address, bytes32, uint256, uint256, uint256) {\n Allocation.State memory allo = _allocations[allocationId];\n return (\n allo.isOpen(),\n allo.indexer,\n allo.subgraphDeploymentId,\n allo.tokens,\n allo.accRewardsPerAllocatedToken,\n allo.accRewardsPending\n );\n }\n\n /// @inheritdoc IRewardsIssuer\n function getSubgraphAllocatedTokens(bytes32 subgraphDeploymentId) external view override returns (uint256) {\n return _subgraphAllocatedTokens[subgraphDeploymentId];\n }\n\n /// @inheritdoc ISubgraphService\n function getLegacyAllocation(address allocationId) external view override returns (LegacyAllocation.State memory) {\n return _legacyAllocations[allocationId];\n }\n\n /// @inheritdoc ISubgraphService\n function getDisputeManager() external view override returns (address) {\n return address(_disputeManager());\n }\n\n /// @inheritdoc ISubgraphService\n function getGraphTallyCollector() external view override returns (address) {\n return address(_graphTallyCollector());\n }\n\n /// @inheritdoc ISubgraphService\n function getCuration() external view override returns (address) {\n return address(_curation());\n }\n\n /// @inheritdoc ISubgraphService\n function encodeAllocationProof(address indexer, address allocationId) external view override returns (bytes32) {\n return _encodeAllocationProof(indexer, allocationId);\n }\n\n /// @inheritdoc ISubgraphService\n function isOverAllocated(address indexer) external view override returns (bool) {\n return _isOverAllocated(indexer, _delegationRatio);\n }\n\n // -- Data service parameter getters --\n /**\n * @notice Getter for the accepted thawing period range for provisions\n * The accepted range is just the dispute period defined by {DisputeManager-getDisputePeriod}\n * @dev This override ensures {ProvisionManager} uses the thawing period from the {DisputeManager}\n * @return The minimum thawing period - the dispute period\n * @return The maximum thawing period - the dispute period\n */\n function _getThawingPeriodRange() internal view override returns (uint64, uint64) {\n uint64 disputePeriod = _disputeManager().getDisputePeriod();\n return (disputePeriod, disputePeriod);\n }\n\n /**\n * @notice Getter for the accepted verifier cut range for provisions\n * @return The minimum verifier cut which is defined by the fisherman reward cut {DisputeManager-getFishermanRewardCut}\n * @return The maximum is 100% in PPM\n */\n function _getVerifierCutRange() internal view override returns (uint32, uint32) {\n return (_disputeManager().getFishermanRewardCut(), DEFAULT_MAX_VERIFIER_CUT);\n }\n\n /**\n * @notice Collect query fees\n * Stake equal to the amount being collected times the `stakeToFeesRatio` is locked into a stake claim.\n * This claim can be released at a later stage once expired.\n *\n * It's important to note that before collecting this function will attempt to release any expired stake claims.\n * This could lead to an out of gas error if there are too many expired claims. In that case, the indexer will need to\n * manually release the claims, see {IDataServiceFees-releaseStake}, before attempting to collect again.\n *\n * @dev This function is the equivalent of the legacy `collect` function for query fees.\n * @dev Uses the {GraphTallyCollector} to collect payment from Graph Horizon payments protocol.\n * Fees are distributed to service provider and delegators by {GraphPayments}, though curators\n * share is distributed by this function.\n *\n * Query fees can be collected on closed allocations.\n *\n * Requirements:\n * - Indexer must have enough available tokens to lock as economic security for fees\n *\n * Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\n * Emits a {StakeClaimLocked} event.\n * Emits a {QueryFeesCollected} event.\n *\n * @param indexer The address of the indexer\n * @param data Encoded data:\n * - IGraphTallyCollector.SignedRAV `signedRav`: The signed RAV\n * - uint256 `tokensToCollect`: The amount of tokens to collect. Allows partially collecting a RAV. If 0, the entire RAV will\n * be collected.\n * @return The amount of fees collected\n */\n function _collectQueryFees(address indexer, bytes calldata data) private returns (uint256) {\n (IGraphTallyCollector.SignedRAV memory signedRav, uint256 tokensToCollect) = abi.decode(\n data,\n (IGraphTallyCollector.SignedRAV, uint256)\n );\n require(\n signedRav.rav.serviceProvider == indexer,\n SubgraphServiceIndexerMismatch(signedRav.rav.serviceProvider, indexer)\n );\n\n // Check that collectionId (256 bits) is a valid address (160 bits)\n // collectionId is expected to be a zero padded address so it's safe to cast to uint160\n require(\n uint256(signedRav.rav.collectionId) <= type(uint160).max,\n SubgraphServiceInvalidCollectionId(signedRav.rav.collectionId)\n );\n address allocationId = address(uint160(uint256(signedRav.rav.collectionId)));\n Allocation.State memory allocation = _allocations.get(allocationId);\n\n // Check RAV is consistent - RAV indexer must match the allocation's indexer\n require(allocation.indexer == indexer, SubgraphServiceInvalidRAV(indexer, allocation.indexer));\n bytes32 subgraphDeploymentId = allocation.subgraphDeploymentId;\n\n // release expired stake claims\n _releaseStake(indexer, 0);\n\n // Collect from GraphPayments - only curators cut is sent back to the subgraph service\n uint256 tokensCollected;\n uint256 tokensCurators;\n {\n uint256 balanceBefore = _graphToken().balanceOf(address(this));\n\n tokensCollected = _graphTallyCollector().collect(\n IGraphPayments.PaymentTypes.QueryFee,\n _encodeGraphTallyData(signedRav, _curation().isCurated(subgraphDeploymentId) ? curationFeesCut : 0),\n tokensToCollect\n );\n\n uint256 balanceAfter = _graphToken().balanceOf(address(this));\n require(balanceAfter >= balanceBefore, SubgraphServiceInconsistentCollection(balanceBefore, balanceAfter));\n tokensCurators = balanceAfter - balanceBefore;\n }\n\n if (tokensCollected > 0) {\n // lock stake as economic security for fees\n _lockStake(\n indexer,\n tokensCollected * stakeToFeesRatio,\n block.timestamp + _disputeManager().getDisputePeriod()\n );\n\n if (tokensCurators > 0) {\n // curation collection changes subgraph signal so we take rewards snapshot\n _graphRewardsManager().onSubgraphSignalUpdate(subgraphDeploymentId);\n\n // Send GRT and bookkeep by calling collect()\n _graphToken().pushTokens(address(_curation()), tokensCurators);\n _curation().collect(subgraphDeploymentId, tokensCurators);\n }\n }\n\n emit QueryFeesCollected(\n indexer,\n signedRav.rav.payer,\n allocationId,\n subgraphDeploymentId,\n tokensCollected,\n tokensCurators\n );\n return tokensCollected;\n }\n\n /**\n * @notice Collect indexing rewards\n * @param indexer The address of the indexer\n * @param data Encoded data:\n * - address `allocationId`: The id of the allocation\n * - bytes32 `poi`: The POI being presented\n * - bytes `poiMetadata`: The metadata associated with the POI. See {AllocationManager-_presentPOI} for more details.\n * @return The amount of indexing rewards collected\n */\n function _collectIndexingRewards(address indexer, bytes calldata data) private returns (uint256) {\n (address allocationId, bytes32 poi_, bytes memory poiMetadata_) = abi.decode(data, (address, bytes32, bytes));\n require(\n _allocations.get(allocationId).indexer == indexer,\n SubgraphServiceAllocationNotAuthorized(indexer, allocationId)\n );\n return _presentPOI(allocationId, poi_, poiMetadata_, _delegationRatio, paymentsDestination[indexer]);\n }\n\n /**\n * @notice Sets the payments destination for an indexer to receive payments\n * @dev Emits a {PaymentsDestinationSet} event\n * @param _indexer The address of the indexer\n * @param _paymentsDestination The address where payments should be sent\n */\n function _setPaymentsDestination(address _indexer, address _paymentsDestination) internal {\n paymentsDestination[_indexer] = _paymentsDestination;\n emit PaymentsDestinationSet(_indexer, _paymentsDestination);\n }\n\n /**\n * @notice Set the stake to fees ratio.\n * @param _stakeToFeesRatio The stake to fees ratio\n */\n function _setStakeToFeesRatio(uint256 _stakeToFeesRatio) private {\n require(_stakeToFeesRatio != 0, SubgraphServiceInvalidZeroStakeToFeesRatio());\n stakeToFeesRatio = _stakeToFeesRatio;\n emit StakeToFeesRatioSet(_stakeToFeesRatio);\n }\n\n /**\n * @notice Encodes the data for the GraphTallyCollector\n * @dev The purpose of this function is just to avoid stack too deep errors\n * @param signedRav The signed RAV\n * @param curationCut The curation cut\n * @return The encoded data\n */\n function _encodeGraphTallyData(\n IGraphTallyCollector.SignedRAV memory signedRav,\n uint256 curationCut\n ) private view returns (bytes memory) {\n return abi.encode(signedRav, curationCut, paymentsDestination[signedRav.rav.serviceProvider]);\n }\n}\n" + }, + "contracts/SubgraphServiceStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { ISubgraphService } from \"./interfaces/ISubgraphService.sol\";\n\n/**\n * @title SubgraphServiceStorage\n * @notice This contract holds all the storage variables for the Subgraph Service contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract SubgraphServiceV1Storage {\n /// @notice Service providers registered in the data service\n mapping(address indexer => ISubgraphService.Indexer details) public indexers;\n\n ///@notice Multiplier for how many tokens back collected query fees\n uint256 public stakeToFeesRatio;\n\n /// @notice The cut curators take from query fee payments. In PPM.\n uint256 public curationFeesCut;\n\n /// @notice Destination of indexer payments\n mapping(address indexer => address destination) public paymentsDestination;\n}\n" + }, + "contracts/utilities/AllocationManager.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IGraphPayments } from \"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\";\nimport { IGraphToken } from \"@graphprotocol/contracts/contracts/token/IGraphToken.sol\";\nimport { IHorizonStakingTypes } from \"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\";\n\nimport { GraphDirectory } from \"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\";\nimport { AllocationManagerV1Storage } from \"./AllocationManagerStorage.sol\";\n\nimport { TokenUtils } from \"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\";\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { EIP712Upgradeable } from \"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\";\nimport { Allocation } from \"../libraries/Allocation.sol\";\nimport { LegacyAllocation } from \"../libraries/LegacyAllocation.sol\";\nimport { PPMMath } from \"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\";\nimport { ProvisionTracker } from \"@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol\";\n\n/**\n * @title AllocationManager contract\n * @notice A helper contract implementing allocation lifecycle management.\n * Allows opening, resizing, and closing allocations, as well as collecting indexing rewards by presenting a Proof\n * of Indexing (POI).\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract AllocationManager is EIP712Upgradeable, GraphDirectory, AllocationManagerV1Storage {\n using ProvisionTracker for mapping(address => uint256);\n using Allocation for mapping(address => Allocation.State);\n using Allocation for Allocation.State;\n using LegacyAllocation for mapping(address => LegacyAllocation.State);\n using PPMMath for uint256;\n using TokenUtils for IGraphToken;\n\n ///@dev EIP712 typehash for allocation id proof\n bytes32 private constant EIP712_ALLOCATION_ID_PROOF_TYPEHASH =\n keccak256(\"AllocationIdProof(address indexer,address allocationId)\");\n\n /**\n * @notice Emitted when an indexer creates an allocation\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n * @param tokens The amount of tokens allocated\n * @param currentEpoch The current epoch\n */\n event AllocationCreated(\n address indexed indexer,\n address indexed allocationId,\n bytes32 indexed subgraphDeploymentId,\n uint256 tokens,\n uint256 currentEpoch\n );\n\n /**\n * @notice Emitted when an indexer collects indexing rewards for an allocation\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n * @param tokensRewards The amount of tokens collected\n * @param tokensIndexerRewards The amount of tokens collected for the indexer\n * @param tokensDelegationRewards The amount of tokens collected for delegators\n * @param poi The POI presented\n * @param currentEpoch The current epoch\n * @param poiMetadata The metadata associated with the POI\n */\n event IndexingRewardsCollected(\n address indexed indexer,\n address indexed allocationId,\n bytes32 indexed subgraphDeploymentId,\n uint256 tokensRewards,\n uint256 tokensIndexerRewards,\n uint256 tokensDelegationRewards,\n bytes32 poi,\n bytes poiMetadata,\n uint256 currentEpoch\n );\n\n /**\n * @notice Emitted when an indexer resizes an allocation\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n * @param newTokens The new amount of tokens allocated\n * @param oldTokens The old amount of tokens allocated\n */\n event AllocationResized(\n address indexed indexer,\n address indexed allocationId,\n bytes32 indexed subgraphDeploymentId,\n uint256 newTokens,\n uint256 oldTokens\n );\n\n /**\n * @dev Emitted when an indexer closes an allocation\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n * @param tokens The amount of tokens allocated\n * @param forceClosed Whether the allocation was force closed\n */\n event AllocationClosed(\n address indexed indexer,\n address indexed allocationId,\n bytes32 indexed subgraphDeploymentId,\n uint256 tokens,\n bool forceClosed\n );\n\n /**\n * @notice Emitted when a legacy allocation is migrated into the subgraph service\n * @param indexer The address of the indexer\n * @param allocationId The id of the allocation\n * @param subgraphDeploymentId The id of the subgraph deployment\n */\n event LegacyAllocationMigrated(\n address indexed indexer,\n address indexed allocationId,\n bytes32 indexed subgraphDeploymentId\n );\n\n /**\n * @notice Emitted when the maximum POI staleness is updated\n * @param maxPOIStaleness The max POI staleness in seconds\n */\n event MaxPOIStalenessSet(uint256 maxPOIStaleness);\n\n /**\n * @notice Thrown when an allocation proof is invalid\n * Both `signer` and `allocationId` should match for a valid proof.\n * @param signer The address that signed the proof\n * @param allocationId The id of the allocation\n */\n error AllocationManagerInvalidAllocationProof(address signer, address allocationId);\n\n /**\n * @notice Thrown when attempting to create an allocation with a zero allocation id\n */\n error AllocationManagerInvalidZeroAllocationId();\n\n /**\n * @notice Thrown when attempting to collect indexing rewards on a closed allocationl\n * @param allocationId The id of the allocation\n */\n error AllocationManagerAllocationClosed(address allocationId);\n\n /**\n * @notice Thrown when attempting to resize an allocation with the same size\n * @param allocationId The id of the allocation\n * @param tokens The amount of tokens\n */\n error AllocationManagerAllocationSameSize(address allocationId, uint256 tokens);\n\n /**\n * @notice Initializes the contract and parent contracts\n * @param _name The name to use for EIP712 domain separation\n * @param _version The version to use for EIP712 domain separation\n */\n function __AllocationManager_init(string memory _name, string memory _version) internal onlyInitializing {\n __EIP712_init(_name, _version);\n __AllocationManager_init_unchained();\n }\n\n /**\n * @notice Initializes the contract\n */\n function __AllocationManager_init_unchained() internal onlyInitializing {}\n\n /**\n * @notice Imports a legacy allocation id into the subgraph service\n * This is a governor only action that is required to prevent indexers from re-using allocation ids from the\n * legacy staking contract. It will revert with LegacyAllocationAlreadyMigrated if the allocation has already been migrated.\n * @param _indexer The address of the indexer\n * @param _allocationId The id of the allocation\n * @param _subgraphDeploymentId The id of the subgraph deployment\n */\n function _migrateLegacyAllocation(address _indexer, address _allocationId, bytes32 _subgraphDeploymentId) internal {\n _legacyAllocations.migrate(_indexer, _allocationId, _subgraphDeploymentId);\n emit LegacyAllocationMigrated(_indexer, _allocationId, _subgraphDeploymentId);\n }\n\n /**\n * @notice Create an allocation\n * @dev The `_allocationProof` is a 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationId)`\n *\n * Requirements:\n * - `_allocationId` must not be the zero address\n *\n * Emits a {AllocationCreated} event\n *\n * @param _indexer The address of the indexer\n * @param _allocationId The id of the allocation to be created\n * @param _subgraphDeploymentId The subgraph deployment Id\n * @param _tokens The amount of tokens to allocate\n * @param _allocationProof Signed proof of allocation id address ownership\n * @param _delegationRatio The delegation ratio to consider when locking tokens\n */\n function _allocate(\n address _indexer,\n address _allocationId,\n bytes32 _subgraphDeploymentId,\n uint256 _tokens,\n bytes memory _allocationProof,\n uint32 _delegationRatio\n ) internal {\n require(_allocationId != address(0), AllocationManagerInvalidZeroAllocationId());\n\n _verifyAllocationProof(_indexer, _allocationId, _allocationProof);\n\n // Ensure allocation id is not reused\n // need to check both subgraph service (on allocations.create()) and legacy allocations\n _legacyAllocations.revertIfExists(_graphStaking(), _allocationId);\n\n uint256 currentEpoch = _graphEpochManager().currentEpoch();\n Allocation.State memory allocation = _allocations.create(\n _indexer,\n _allocationId,\n _subgraphDeploymentId,\n _tokens,\n _graphRewardsManager().onSubgraphAllocationUpdate(_subgraphDeploymentId),\n currentEpoch\n );\n\n // Check that the indexer has enough tokens available\n // Note that the delegation ratio ensures overdelegation cannot be used\n allocationProvisionTracker.lock(_graphStaking(), _indexer, _tokens, _delegationRatio);\n\n // Update total allocated tokens for the subgraph deployment\n _subgraphAllocatedTokens[allocation.subgraphDeploymentId] =\n _subgraphAllocatedTokens[allocation.subgraphDeploymentId] +\n allocation.tokens;\n\n emit AllocationCreated(_indexer, _allocationId, _subgraphDeploymentId, allocation.tokens, currentEpoch);\n }\n\n /**\n * @notice Present a POI to collect indexing rewards for an allocation\n * This function will mint indexing rewards using the {RewardsManager} and distribute them to the indexer and delegators.\n *\n * Conditions to qualify for indexing rewards:\n * - POI must be non-zero\n * - POI must not be stale, i.e: older than `maxPOIStaleness`\n * - allocation must not be altruistic (allocated tokens = 0)\n * - allocation must be open for at least one epoch\n *\n * Note that indexers are required to periodically (at most every `maxPOIStaleness`) present POIs to collect rewards.\n * Rewards will not be issued to stale POIs, which means that indexers are advised to present a zero POI if they are\n * unable to present a valid one to prevent being locked out of future rewards.\n *\n * Note on allocation duration restriction: this is required to ensure that non protocol chains have a valid block number for\n * which to calculate POIs. EBO posts once per epoch typically at each epoch change, so we restrict rewards to allocations\n * that have gone through at least one epoch change.\n *\n * Emits a {IndexingRewardsCollected} event.\n *\n * @param _allocationId The id of the allocation to collect rewards for\n * @param _poi The POI being presented\n * @param _poiMetadata The metadata associated with the POI. The data and encoding format is for off-chain components to define, this function will only emit the value in an event as-is.\n * @param _delegationRatio The delegation ratio to consider when locking tokens\n * @param _paymentsDestination The address where indexing rewards should be sent\n * @return The amount of tokens collected\n */\n function _presentPOI(\n address _allocationId,\n bytes32 _poi,\n bytes memory _poiMetadata,\n uint32 _delegationRatio,\n address _paymentsDestination\n ) internal returns (uint256) {\n Allocation.State memory allocation = _allocations.get(_allocationId);\n require(allocation.isOpen(), AllocationManagerAllocationClosed(_allocationId));\n\n // Mint indexing rewards if all conditions are met\n uint256 tokensRewards = (!allocation.isStale(maxPOIStaleness) &&\n !allocation.isAltruistic() &&\n _poi != bytes32(0)) && _graphEpochManager().currentEpoch() > allocation.createdAtEpoch\n ? _graphRewardsManager().takeRewards(_allocationId)\n : 0;\n\n // ... but we still take a snapshot to ensure the rewards are not accumulated for the next valid POI\n _allocations.snapshotRewards(\n _allocationId,\n _graphRewardsManager().onSubgraphAllocationUpdate(allocation.subgraphDeploymentId)\n );\n _allocations.presentPOI(_allocationId);\n\n // Any pending rewards should have been collected now\n _allocations.clearPendingRewards(_allocationId);\n\n uint256 tokensIndexerRewards = 0;\n uint256 tokensDelegationRewards = 0;\n if (tokensRewards != 0) {\n // Distribute rewards to delegators\n uint256 delegatorCut = _graphStaking().getDelegationFeeCut(\n allocation.indexer,\n address(this),\n IGraphPayments.PaymentTypes.IndexingRewards\n );\n IHorizonStakingTypes.DelegationPool memory delegationPool = _graphStaking().getDelegationPool(\n allocation.indexer,\n address(this)\n );\n // If delegation pool has no shares then we don't need to distribute rewards to delegators\n tokensDelegationRewards = delegationPool.shares > 0 ? tokensRewards.mulPPM(delegatorCut) : 0;\n if (tokensDelegationRewards > 0) {\n _graphToken().approve(address(_graphStaking()), tokensDelegationRewards);\n _graphStaking().addToDelegationPool(allocation.indexer, address(this), tokensDelegationRewards);\n }\n\n // Distribute rewards to indexer\n tokensIndexerRewards = tokensRewards - tokensDelegationRewards;\n if (tokensIndexerRewards > 0) {\n if (_paymentsDestination == address(0)) {\n _graphToken().approve(address(_graphStaking()), tokensIndexerRewards);\n _graphStaking().stakeToProvision(allocation.indexer, address(this), tokensIndexerRewards);\n } else {\n _graphToken().pushTokens(_paymentsDestination, tokensIndexerRewards);\n }\n }\n }\n\n emit IndexingRewardsCollected(\n allocation.indexer,\n _allocationId,\n allocation.subgraphDeploymentId,\n tokensRewards,\n tokensIndexerRewards,\n tokensDelegationRewards,\n _poi,\n _poiMetadata,\n _graphEpochManager().currentEpoch()\n );\n\n // Check if the indexer is over-allocated and force close the allocation if necessary\n if (_isOverAllocated(allocation.indexer, _delegationRatio)) {\n _closeAllocation(_allocationId, true);\n }\n\n return tokensRewards;\n }\n\n /**\n * @notice Resize an allocation\n * @dev Will lock or release tokens in the provision tracker depending on the new allocation size.\n * Rewards accrued but not issued before the resize will be accounted for as pending rewards.\n * These will be paid out when the indexer presents a POI.\n *\n * Requirements:\n * - `_indexer` must be the owner of the allocation\n * - Allocation must be open\n * - `_tokens` must be different from the current allocation size\n *\n * Emits a {AllocationResized} event.\n *\n * @param _allocationId The id of the allocation to be resized\n * @param _tokens The new amount of tokens to allocate\n * @param _delegationRatio The delegation ratio to consider when locking tokens\n */\n function _resizeAllocation(address _allocationId, uint256 _tokens, uint32 _delegationRatio) internal {\n Allocation.State memory allocation = _allocations.get(_allocationId);\n require(allocation.isOpen(), AllocationManagerAllocationClosed(_allocationId));\n require(_tokens != allocation.tokens, AllocationManagerAllocationSameSize(_allocationId, _tokens));\n\n // Update provision tracker\n uint256 oldTokens = allocation.tokens;\n if (_tokens > oldTokens) {\n allocationProvisionTracker.lock(_graphStaking(), allocation.indexer, _tokens - oldTokens, _delegationRatio);\n } else {\n allocationProvisionTracker.release(allocation.indexer, oldTokens - _tokens);\n }\n\n // Calculate rewards that have been accrued since the last snapshot but not yet issued\n uint256 accRewardsPerAllocatedToken = _graphRewardsManager().onSubgraphAllocationUpdate(\n allocation.subgraphDeploymentId\n );\n uint256 accRewardsPerAllocatedTokenPending = !allocation.isAltruistic()\n ? accRewardsPerAllocatedToken - allocation.accRewardsPerAllocatedToken\n : 0;\n\n // Update the allocation\n _allocations[_allocationId].tokens = _tokens;\n _allocations[_allocationId].accRewardsPerAllocatedToken = accRewardsPerAllocatedToken;\n _allocations[_allocationId].accRewardsPending += _graphRewardsManager().calcRewards(\n oldTokens,\n accRewardsPerAllocatedTokenPending\n );\n\n // Update total allocated tokens for the subgraph deployment\n if (_tokens > oldTokens) {\n _subgraphAllocatedTokens[allocation.subgraphDeploymentId] += (_tokens - oldTokens);\n } else {\n _subgraphAllocatedTokens[allocation.subgraphDeploymentId] -= (oldTokens - _tokens);\n }\n\n emit AllocationResized(allocation.indexer, _allocationId, allocation.subgraphDeploymentId, _tokens, oldTokens);\n }\n\n /**\n * @notice Close an allocation\n * Does not require presenting a POI, use {_collectIndexingRewards} to present a POI and collect rewards\n * @dev Note that allocations are nowlong lived. All service payments, including indexing rewards, should be collected periodically\n * without the need of closing the allocation. Allocations should only be closed when indexers want to reclaim the allocated\n * tokens for other purposes.\n *\n * Emits a {AllocationClosed} event\n *\n * @param _allocationId The id of the allocation to be closed\n * @param _forceClosed Whether the allocation was force closed\n */\n function _closeAllocation(address _allocationId, bool _forceClosed) internal {\n Allocation.State memory allocation = _allocations.get(_allocationId);\n\n // Take rewards snapshot to prevent other allos from counting tokens from this allo\n _allocations.snapshotRewards(\n _allocationId,\n _graphRewardsManager().onSubgraphAllocationUpdate(allocation.subgraphDeploymentId)\n );\n\n _allocations.close(_allocationId);\n allocationProvisionTracker.release(allocation.indexer, allocation.tokens);\n\n // Update total allocated tokens for the subgraph deployment\n _subgraphAllocatedTokens[allocation.subgraphDeploymentId] =\n _subgraphAllocatedTokens[allocation.subgraphDeploymentId] -\n allocation.tokens;\n\n emit AllocationClosed(\n allocation.indexer,\n _allocationId,\n allocation.subgraphDeploymentId,\n allocation.tokens,\n _forceClosed\n );\n }\n\n /**\n * @notice Sets the maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards\n * @dev Emits a {MaxPOIStalenessSet} event\n * @param _maxPOIStaleness The max POI staleness in seconds\n */\n function _setMaxPOIStaleness(uint256 _maxPOIStaleness) internal {\n maxPOIStaleness = _maxPOIStaleness;\n emit MaxPOIStalenessSet(_maxPOIStaleness);\n }\n\n /**\n * @notice Encodes the allocation proof for EIP712 signing\n * @param _indexer The address of the indexer\n * @param _allocationId The id of the allocation\n * @return The encoded allocation proof\n */\n function _encodeAllocationProof(address _indexer, address _allocationId) internal view returns (bytes32) {\n return _hashTypedDataV4(keccak256(abi.encode(EIP712_ALLOCATION_ID_PROOF_TYPEHASH, _indexer, _allocationId)));\n }\n\n /**\n * @notice Checks if an allocation is over-allocated\n * @param _indexer The address of the indexer\n * @param _delegationRatio The delegation ratio to consider when locking tokens\n * @return True if the allocation is over-allocated, false otherwise\n */\n function _isOverAllocated(address _indexer, uint32 _delegationRatio) internal view returns (bool) {\n return !allocationProvisionTracker.check(_graphStaking(), _indexer, _delegationRatio);\n }\n\n /**\n * @notice Verifies ownership of an allocation id by verifying an EIP712 allocation proof\n * @dev Requirements:\n * - Signer must be the allocation id address\n * @param _indexer The address of the indexer\n * @param _allocationId The id of the allocation\n * @param _proof The EIP712 proof, an EIP712 signed message of (indexer,allocationId)\n */\n function _verifyAllocationProof(address _indexer, address _allocationId, bytes memory _proof) private view {\n address signer = ECDSA.recover(_encodeAllocationProof(_indexer, _allocationId), _proof);\n require(signer == _allocationId, AllocationManagerInvalidAllocationProof(signer, _allocationId));\n }\n}\n" + }, + "contracts/utilities/AllocationManagerStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { Allocation } from \"../libraries/Allocation.sol\";\nimport { LegacyAllocation } from \"../libraries/LegacyAllocation.sol\";\n\n/**\n * @title AllocationManagerStorage\n * @notice This contract holds all the storage variables for the Allocation Manager contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract AllocationManagerV1Storage {\n /// @notice Allocation details\n mapping(address allocationId => Allocation.State allocation) internal _allocations;\n\n /// @notice Legacy allocation details\n mapping(address allocationId => LegacyAllocation.State allocation) internal _legacyAllocations;\n\n /// @notice Tracks allocated tokens per indexer\n mapping(address indexer => uint256 tokens) public allocationProvisionTracker;\n\n /// @notice Maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards\n uint256 public maxPOIStaleness;\n\n /// @notice Track total tokens allocated per subgraph deployment\n /// @dev Used to calculate indexing rewards\n mapping(bytes32 subgraphDeploymentId => uint256 tokens) internal _subgraphAllocatedTokens;\n\n /// @dev Gap to allow adding variables in future upgrades\n uint256[50] private __gap;\n}\n" + }, + "contracts/utilities/AttestationManager.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { AttestationManagerV1Storage } from \"./AttestationManagerStorage.sol\";\n\nimport { ECDSA } from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport { Initializable } from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport { Attestation } from \"../libraries/Attestation.sol\";\n\n/**\n * @title AttestationManager contract\n * @notice A helper contract implementing attestation verification.\n * Uses a custom implementation of EIP712 for backwards compatibility with attestations.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract AttestationManager is Initializable, AttestationManagerV1Storage {\n /// @notice EIP712 type hash for Receipt struct\n bytes32 private constant RECEIPT_TYPE_HASH =\n keccak256(\"Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)\");\n\n /// @notice EIP712 domain type hash\n bytes32 private constant DOMAIN_TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\");\n\n /// @notice EIP712 domain name\n bytes32 private constant DOMAIN_NAME_HASH = keccak256(\"Graph Protocol\");\n\n /// @notice EIP712 domain version\n bytes32 private constant DOMAIN_VERSION_HASH = keccak256(\"0\");\n\n /// @notice EIP712 domain salt\n bytes32 private constant DOMAIN_SALT = 0xa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c2;\n\n /**\n * @dev Initialize the AttestationManager contract and parent contracts\n */\n // solhint-disable-next-line func-name-mixedcase\n function __AttestationManager_init() internal onlyInitializing {\n __AttestationManager_init_unchained();\n }\n\n /**\n * @dev Initialize the AttestationManager contract\n */\n // solhint-disable-next-line func-name-mixedcase\n function __AttestationManager_init_unchained() internal onlyInitializing {\n _domainSeparator = keccak256(\n abi.encode(\n DOMAIN_TYPE_HASH,\n DOMAIN_NAME_HASH,\n DOMAIN_VERSION_HASH,\n block.chainid,\n address(this),\n DOMAIN_SALT\n )\n );\n }\n\n /**\n * @dev Recover the signer address of the `_attestation`.\n * @param _attestation The attestation struct\n * @return Signer address\n */\n function _recoverSigner(Attestation.State memory _attestation) internal view returns (address) {\n // Obtain the hash of the fully-encoded message, per EIP-712 encoding\n Attestation.Receipt memory receipt = Attestation.Receipt(\n _attestation.requestCID,\n _attestation.responseCID,\n _attestation.subgraphDeploymentId\n );\n bytes32 messageHash = _encodeReceipt(receipt);\n\n // Obtain the signer of the fully-encoded EIP-712 message hash\n // NOTE: The signer of the attestation is the indexer that served the request\n return ECDSA.recover(messageHash, abi.encodePacked(_attestation.r, _attestation.s, _attestation.v));\n }\n\n /**\n * @dev Get the message hash that a indexer used to sign the receipt.\n * Encodes a receipt using a domain separator, as described on\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification.\n * @notice Return the message hash used to sign the receipt\n * @param _receipt Receipt returned by indexer and submitted by fisherman\n * @return Message hash used to sign the receipt\n */\n function _encodeReceipt(Attestation.Receipt memory _receipt) internal view returns (bytes32) {\n return\n keccak256(\n abi.encodePacked(\n \"\\x19\\x01\", // EIP-191 encoding pad, EIP-712 version 1\n _domainSeparator,\n keccak256(\n abi.encode(\n RECEIPT_TYPE_HASH,\n _receipt.requestCID,\n _receipt.responseCID,\n _receipt.subgraphDeploymentId\n ) // EIP 712-encoded message hash\n )\n )\n );\n }\n}\n" + }, + "contracts/utilities/AttestationManagerStorage.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\n/**\n * @title AttestationManagerStorage\n * @notice This contract holds all the storage variables for the Attestation Manager contract.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract AttestationManagerV1Storage {\n /// @dev EIP712 domain separator\n bytes32 internal _domainSeparator;\n\n /// @dev Gap to allow adding variables in future upgrades\n uint256[50] private __gap;\n}\n" + }, + "contracts/utilities/Directory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity 0.8.27;\n\nimport { IDisputeManager } from \"../interfaces/IDisputeManager.sol\";\nimport { ISubgraphService } from \"../interfaces/ISubgraphService.sol\";\nimport { IGraphTallyCollector } from \"@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol\";\nimport { ICuration } from \"@graphprotocol/contracts/contracts/curation/ICuration.sol\";\n\n/**\n * @title Directory contract\n * @notice This contract is meant to be inherited by {SubgraphService} contract.\n * It contains the addresses of the contracts that the contract interacts with.\n * Uses immutable variables to minimize gas costs.\n * @custom:security-contact Please email security+contracts@thegraph.com if you find any\n * bugs. We may have an active bug bounty program.\n */\nabstract contract Directory {\n /// @notice The Subgraph Service contract address\n ISubgraphService private immutable SUBGRAPH_SERVICE;\n\n /// @notice The Dispute Manager contract address\n IDisputeManager private immutable DISPUTE_MANAGER;\n\n /// @notice The Graph Tally Collector contract address\n /// @dev Required to collect payments via Graph Horizon payments protocol\n IGraphTallyCollector private immutable GRAPH_TALLY_COLLECTOR;\n\n /// @notice The Curation contract address\n /// @dev Required for curation fees distribution\n ICuration private immutable CURATION;\n\n /**\n * @notice Emitted when the Directory is initialized\n * @param subgraphService The Subgraph Service contract address\n * @param disputeManager The Dispute Manager contract address\n * @param graphTallyCollector The Graph Tally Collector contract address\n * @param curation The Curation contract address\n */\n event SubgraphServiceDirectoryInitialized(\n address subgraphService,\n address disputeManager,\n address graphTallyCollector,\n address curation\n );\n\n /**\n * @notice Thrown when the caller is not the Dispute Manager\n * @param caller The caller address\n * @param disputeManager The Dispute Manager address\n */\n error DirectoryNotDisputeManager(address caller, address disputeManager);\n\n /**\n * @notice Checks that the caller is the Dispute Manager\n */\n modifier onlyDisputeManager() {\n require(\n msg.sender == address(DISPUTE_MANAGER),\n DirectoryNotDisputeManager(msg.sender, address(DISPUTE_MANAGER))\n );\n _;\n }\n\n /**\n * @notice Constructor for the Directory contract\n * @param subgraphService The Subgraph Service contract address\n * @param disputeManager The Dispute Manager contract address\n * @param graphTallyCollector The Graph Tally Collector contract address\n * @param curation The Curation contract address\n */\n constructor(address subgraphService, address disputeManager, address graphTallyCollector, address curation) {\n SUBGRAPH_SERVICE = ISubgraphService(subgraphService);\n DISPUTE_MANAGER = IDisputeManager(disputeManager);\n GRAPH_TALLY_COLLECTOR = IGraphTallyCollector(graphTallyCollector);\n CURATION = ICuration(curation);\n\n emit SubgraphServiceDirectoryInitialized(subgraphService, disputeManager, graphTallyCollector, curation);\n }\n\n /**\n * @notice Returns the Subgraph Service contract address\n * @return The Subgraph Service contract\n */\n function _subgraphService() internal view returns (ISubgraphService) {\n return SUBGRAPH_SERVICE;\n }\n\n /**\n * @notice Returns the Dispute Manager contract address\n * @return The Dispute Manager contract\n */\n function _disputeManager() internal view returns (IDisputeManager) {\n return DISPUTE_MANAGER;\n }\n\n /**\n * @notice Returns the Graph Tally Collector contract address\n * @return The Graph Tally Collector contract\n */\n function _graphTallyCollector() internal view returns (IGraphTallyCollector) {\n return GRAPH_TALLY_COLLECTOR;\n }\n\n /**\n * @notice Returns the Curation contract address\n * @return The Curation contract\n */\n function _curation() internal view returns (ICuration) {\n return CURATION;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 10 + }, + "evmVersion": "paris", + "outputSelection": { + "*": { + "*": ["abi", "evm.bytecode", "evm.deployedBytecode", "evm.methodIdentifiers", "metadata"], + "": ["ast"] + } + } + } + }, + "output": { + "sources": { + "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol", + "exportedSymbols": { + "ITokenGateway": [41] + }, + "id": 42, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "913:33:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ITokenGateway", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 41, + "linearizedBaseContracts": [41], + "name": "ITokenGateway", + "nameLocation": "958:13:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 2, + "nodeType": "StructuredDocumentation", + "src": "1298:81:0", + "text": "@notice event deprecated in favor of DepositFinalized and WithdrawalFinalized" + }, + "functionSelector": "d2ce7d65", + "id": 19, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "outboundTransfer", + "nameLocation": "1626:16:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4, + "mutability": "mutable", + "name": "token", + "nameLocation": "1660:5:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1652:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1652:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6, + "mutability": "mutable", + "name": "to", + "nameLocation": "1683:2:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1675:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1675:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8, + "mutability": "mutable", + "name": "amunt", + "nameLocation": "1703:5:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1695:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1695:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 10, + "mutability": "mutable", + "name": "maxas", + "nameLocation": "1726:5:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1718:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1718:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12, + "mutability": "mutable", + "name": "gasPiceBid", + "nameLocation": "1749:10:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1741:18:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 11, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1741:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14, + "mutability": "mutable", + "name": "data", + "nameLocation": "1784:4:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1769:19:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1769:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1642:152:0" + }, + "returnParameters": { + "id": 18, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "1821:12:0", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1821:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1820:14:0" + }, + "scope": 41, + "src": "1617:218:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "2e567b36", + "id": 32, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "finalizeInboundTransfer", + "nameLocation": "1850:23:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 30, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 21, + "mutability": "mutable", + "name": "token", + "nameLocation": "1891:5:0", + "nodeType": "VariableDeclaration", + "scope": 32, + "src": "1883:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 20, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1883:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 23, + "mutability": "mutable", + "name": "from", + "nameLocation": "1914:4:0", + "nodeType": "VariableDeclaration", + "scope": 32, + "src": "1906:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 22, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1906:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 25, + "mutability": "mutable", + "name": "to", + "nameLocation": "1936:2:0", + "nodeType": "VariableDeclaration", + "scope": 32, + "src": "1928:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 24, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1928:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 27, + "mutability": "mutable", + "name": "amount", + "nameLocation": "1956:6:0", + "nodeType": "VariableDeclaration", + "scope": 32, + "src": "1948:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 26, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1948:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 29, + "mutability": "mutable", + "name": "data", + "nameLocation": "1987:4:0", + "nodeType": "VariableDeclaration", + "scope": 32, + "src": "1972:19:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 28, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1972:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1873:124:0" + }, + "returnParameters": { + "id": 31, + "nodeType": "ParameterList", + "parameters": [], + "src": "2014:0:0" + }, + "scope": 41, + "src": "1841:174:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 33, + "nodeType": "StructuredDocumentation", + "src": "2021:354:0", + "text": " @notice Calculate the address used when bridging an ERC20 token\n @dev the L1 and L2 address oracles may not always be in sync.\n For example, a custom token may have been registered but not deployed or the contract self destructed.\n @param l1ERC20 address of L1 token\n @return L2 address of a bridged ERC20 token" + }, + "functionSelector": "a7e28d48", + "id": 40, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "calculateL2TokenAddress", + "nameLocation": "2389:23:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 36, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 35, + "mutability": "mutable", + "name": "l1ERC20", + "nameLocation": "2421:7:0", + "nodeType": "VariableDeclaration", + "scope": 40, + "src": "2413:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 34, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2413:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2412:17:0" + }, + "returnParameters": { + "id": 39, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 38, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 40, + "src": "2453:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 37, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2453:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2452:9:0" + }, + "scope": 41, + "src": "2380:82:0", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 42, + "src": "948:1516:0", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "913:1552:0" + }, + "id": 0 + }, + "@graphprotocol/contracts/contracts/curation/ICuration.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/curation/ICuration.sol", + "exportedSymbols": { + "ICuration": [165] + }, + "id": 166, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 43, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:1" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ICuration", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 44, + "nodeType": "StructuredDocumentation", + "src": "81:101:1", + "text": " @title Curation Interface\n @dev Interface for the Curation contract (and L2Curation too)" + }, + "fullyImplemented": false, + "id": 165, + "linearizedBaseContracts": [165], + "name": "ICuration", + "nameLocation": "193:9:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 45, + "nodeType": "StructuredDocumentation", + "src": "237:143:1", + "text": " @notice Update the default reserve ratio to `_defaultReserveRatio`\n @param _defaultReserveRatio Reserve ratio (in PPM)" + }, + "functionSelector": "cd0ad4a2", + "id": 50, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDefaultReserveRatio", + "nameLocation": "394:22:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 48, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 47, + "mutability": "mutable", + "name": "_defaultReserveRatio", + "nameLocation": "424:20:1", + "nodeType": "VariableDeclaration", + "scope": 50, + "src": "417:27:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 46, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "417:6:1", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "416:29:1" + }, + "returnParameters": { + "id": 49, + "nodeType": "ParameterList", + "parameters": [], + "src": "454:0:1" + }, + "scope": 165, + "src": "385:70:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 51, + "nodeType": "StructuredDocumentation", + "src": "461:175:1", + "text": " @notice Update the minimum deposit amount needed to intialize a new subgraph\n @param _minimumCurationDeposit Minimum amount of tokens required deposit" + }, + "functionSelector": "6536fe32", + "id": 56, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMinimumCurationDeposit", + "nameLocation": "650:25:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 54, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 53, + "mutability": "mutable", + "name": "_minimumCurationDeposit", + "nameLocation": "684:23:1", + "nodeType": "VariableDeclaration", + "scope": 56, + "src": "676:31:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 52, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "676:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "675:33:1" + }, + "returnParameters": { + "id": 55, + "nodeType": "ParameterList", + "parameters": [], + "src": "717:0:1" + }, + "scope": 165, + "src": "641:77:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 57, + "nodeType": "StructuredDocumentation", + "src": "724:189:1", + "text": " @notice Set the curation tax percentage to charge when a curator deposits GRT tokens.\n @param _percentage Curation tax percentage charged when depositing GRT tokens" + }, + "functionSelector": "cd18119e", + "id": 62, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setCurationTaxPercentage", + "nameLocation": "927:24:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 60, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 59, + "mutability": "mutable", + "name": "_percentage", + "nameLocation": "959:11:1", + "nodeType": "VariableDeclaration", + "scope": 62, + "src": "952:18:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 58, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "952:6:1", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "951:20:1" + }, + "returnParameters": { + "id": 61, + "nodeType": "ParameterList", + "parameters": [], + "src": "980:0:1" + }, + "scope": 165, + "src": "918:63:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 63, + "nodeType": "StructuredDocumentation", + "src": "987:184:1", + "text": " @notice Set the master copy to use as clones for the curation token.\n @param _curationTokenMaster Address of implementation contract to use for curation tokens" + }, + "functionSelector": "9b4d9f33", + "id": 68, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setCurationTokenMaster", + "nameLocation": "1185:22:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 66, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 65, + "mutability": "mutable", + "name": "_curationTokenMaster", + "nameLocation": "1216:20:1", + "nodeType": "VariableDeclaration", + "scope": 68, + "src": "1208:28:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 64, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1208:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1207:30:1" + }, + "returnParameters": { + "id": 67, + "nodeType": "ParameterList", + "parameters": [], + "src": "1246:0:1" + }, + "scope": 165, + "src": "1176:71:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 69, + "nodeType": "StructuredDocumentation", + "src": "1276:411:1", + "text": " @notice Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool.\n @param _subgraphDeploymentID Subgraph deployment pool from where to mint signal\n @param _tokensIn Amount of Graph Tokens to deposit\n @param _signalOutMin Expected minimum amount of signal to receive\n @return Amount of signal minted\n @return Amount of curation tax burned" + }, + "functionSelector": "375a54ab", + "id": 82, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "mint", + "nameLocation": "1701:4:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 76, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 71, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1723:21:1", + "nodeType": "VariableDeclaration", + "scope": 82, + "src": "1715:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 70, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1715:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 73, + "mutability": "mutable", + "name": "_tokensIn", + "nameLocation": "1762:9:1", + "nodeType": "VariableDeclaration", + "scope": 82, + "src": "1754:17:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 72, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1754:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 75, + "mutability": "mutable", + "name": "_signalOutMin", + "nameLocation": "1789:13:1", + "nodeType": "VariableDeclaration", + "scope": 82, + "src": "1781:21:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 74, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1781:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1705:103:1" + }, + "returnParameters": { + "id": 81, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 78, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 82, + "src": "1827:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 77, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1827:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 80, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 82, + "src": "1836:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 79, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1836:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1826:18:1" + }, + "scope": 165, + "src": "1692:153:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 83, + "nodeType": "StructuredDocumentation", + "src": "1851:323:1", + "text": " @notice Burn _signal from the SubgraphDeployment curation pool\n @param _subgraphDeploymentID SubgraphDeployment the curator is returning signal\n @param _signalIn Amount of signal to return\n @param _tokensOutMin Expected minimum amount of tokens to receive\n @return Tokens returned" + }, + "functionSelector": "24bdeec7", + "id": 94, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "burn", + "nameLocation": "2188:4:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 90, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 85, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "2201:21:1", + "nodeType": "VariableDeclaration", + "scope": 94, + "src": "2193:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 84, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2193:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 87, + "mutability": "mutable", + "name": "_signalIn", + "nameLocation": "2232:9:1", + "nodeType": "VariableDeclaration", + "scope": 94, + "src": "2224:17:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 86, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2224:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 89, + "mutability": "mutable", + "name": "_tokensOutMin", + "nameLocation": "2251:13:1", + "nodeType": "VariableDeclaration", + "scope": 94, + "src": "2243:21:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 88, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2243:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2192:73:1" + }, + "returnParameters": { + "id": 93, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 92, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 94, + "src": "2284:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 91, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2284:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2283:9:1" + }, + "scope": 165, + "src": "2179:114:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 95, + "nodeType": "StructuredDocumentation", + "src": "2299:266:1", + "text": " @notice Assign Graph Tokens collected as curation fees to the curation pool reserve.\n @param _subgraphDeploymentID SubgraphDeployment where funds should be allocated as reserves\n @param _tokens Amount of Graph Tokens to add to reserves" + }, + "functionSelector": "81573288", + "id": 102, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "2579:7:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 100, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 97, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "2595:21:1", + "nodeType": "VariableDeclaration", + "scope": 102, + "src": "2587:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 96, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2587:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 99, + "mutability": "mutable", + "name": "_tokens", + "nameLocation": "2626:7:1", + "nodeType": "VariableDeclaration", + "scope": 102, + "src": "2618:15:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 98, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2618:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2586:48:1" + }, + "returnParameters": { + "id": 101, + "nodeType": "ParameterList", + "parameters": [], + "src": "2643:0:1" + }, + "scope": 165, + "src": "2570:74:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 103, + "nodeType": "StructuredDocumentation", + "src": "2672:213:1", + "text": " @notice Check if any GRT tokens are deposited for a SubgraphDeployment.\n @param _subgraphDeploymentID SubgraphDeployment to check if curated\n @return True if curated, false otherwise" + }, + "functionSelector": "4c4ea0ed", + "id": 110, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isCurated", + "nameLocation": "2899:9:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 106, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 105, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "2917:21:1", + "nodeType": "VariableDeclaration", + "scope": 110, + "src": "2909:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 104, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2909:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2908:31:1" + }, + "returnParameters": { + "id": 109, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 108, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 110, + "src": "2963:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 107, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2963:4:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2962:6:1" + }, + "scope": 165, + "src": "2890:79:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 111, + "nodeType": "StructuredDocumentation", + "src": "2975:290:1", + "text": " @notice Get the amount of signal a curator has in a curation pool.\n @param _curator Curator owning the signal tokens\n @param _subgraphDeploymentID Subgraph deployment curation pool\n @return Amount of signal owned by a curator for the subgraph deployment" + }, + "functionSelector": "9f94c667", + "id": 120, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getCuratorSignal", + "nameLocation": "3279:16:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 116, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 113, + "mutability": "mutable", + "name": "_curator", + "nameLocation": "3304:8:1", + "nodeType": "VariableDeclaration", + "scope": 120, + "src": "3296:16:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 112, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3296:7:1", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 115, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "3322:21:1", + "nodeType": "VariableDeclaration", + "scope": 120, + "src": "3314:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 114, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3314:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3295:49:1" + }, + "returnParameters": { + "id": 119, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 118, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 120, + "src": "3368:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 117, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3368:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3367:9:1" + }, + "scope": 165, + "src": "3270:107:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 121, + "nodeType": "StructuredDocumentation", + "src": "3383:208:1", + "text": " @notice Get the amount of signal in a curation pool.\n @param _subgraphDeploymentID Subgraph deployment curation pool\n @return Amount of signal minted for the subgraph deployment" + }, + "functionSelector": "99439fee", + "id": 128, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getCurationPoolSignal", + "nameLocation": "3605:21:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 124, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 123, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "3635:21:1", + "nodeType": "VariableDeclaration", + "scope": 128, + "src": "3627:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 122, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3627:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3626:31:1" + }, + "returnParameters": { + "id": 127, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 126, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 128, + "src": "3681:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 125, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3681:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3680:9:1" + }, + "scope": 165, + "src": "3596:94:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 129, + "nodeType": "StructuredDocumentation", + "src": "3696:210:1", + "text": " @notice Get the amount of token reserves in a curation pool.\n @param _subgraphDeploymentID Subgraph deployment curation pool\n @return Amount of token reserves in the curation pool" + }, + "functionSelector": "46e855da", + "id": 136, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getCurationPoolTokens", + "nameLocation": "3920:21:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 132, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 131, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "3950:21:1", + "nodeType": "VariableDeclaration", + "scope": 136, + "src": "3942:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 130, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3942:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3941:31:1" + }, + "returnParameters": { + "id": 135, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 134, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 136, + "src": "3996:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 133, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3996:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3995:9:1" + }, + "scope": 165, + "src": "3911:94:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 137, + "nodeType": "StructuredDocumentation", + "src": "4011:416:1", + "text": " @notice Calculate amount of signal that can be bought with tokens in a curation pool.\n This function considers and excludes the deposit tax.\n @param _subgraphDeploymentID Subgraph deployment to mint signal\n @param _tokensIn Amount of tokens used to mint signal\n @return Amount of signal that can be bought\n @return Amount of tokens that will be burned as curation tax" + }, + "functionSelector": "f049b900", + "id": 148, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "tokensToSignal", + "nameLocation": "4441:14:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 142, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 139, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "4464:21:1", + "nodeType": "VariableDeclaration", + "scope": 148, + "src": "4456:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 138, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4456:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 141, + "mutability": "mutable", + "name": "_tokensIn", + "nameLocation": "4495:9:1", + "nodeType": "VariableDeclaration", + "scope": 148, + "src": "4487:17:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 140, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4487:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4455:50:1" + }, + "returnParameters": { + "id": 147, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 144, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 148, + "src": "4529:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 143, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4529:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 146, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 148, + "src": "4538:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 145, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4538:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4528:18:1" + }, + "scope": 165, + "src": "4432:115:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 149, + "nodeType": "StructuredDocumentation", + "src": "4553:296:1", + "text": " @notice Calculate number of tokens to get when burning signal from a curation pool.\n @param _subgraphDeploymentID Subgraph deployment to burn signal\n @param _signalIn Amount of signal to burn\n @return Amount of tokens to get for the specified amount of signal" + }, + "functionSelector": "0faaf87f", + "id": 158, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "signalToTokens", + "nameLocation": "4863:14:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 154, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 151, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "4886:21:1", + "nodeType": "VariableDeclaration", + "scope": 158, + "src": "4878:29:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 150, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4878:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 153, + "mutability": "mutable", + "name": "_signalIn", + "nameLocation": "4917:9:1", + "nodeType": "VariableDeclaration", + "scope": 158, + "src": "4909:17:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 152, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4909:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4877:50:1" + }, + "returnParameters": { + "id": 157, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 156, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 158, + "src": "4951:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 155, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4951:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4950:9:1" + }, + "scope": 165, + "src": "4854:106:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 159, + "nodeType": "StructuredDocumentation", + "src": "4966:199:1", + "text": " @notice Tax charged when curators deposit funds.\n Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%)\n @return Curation tax percentage expressed in PPM" + }, + "functionSelector": "f115c427", + "id": 164, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "curationTaxPercentage", + "nameLocation": "5179:21:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 160, + "nodeType": "ParameterList", + "parameters": [], + "src": "5200:2:1" + }, + "returnParameters": { + "id": 163, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 162, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 164, + "src": "5226:6:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 161, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "5226:6:1", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "5225:8:1" + }, + "scope": 165, + "src": "5170:64:1", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 166, + "src": "183:5053:1", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:5191:1" + }, + "id": 1 + }, + "@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol", + "exportedSymbols": { + "IDisputeManager": [314] + }, + "id": 315, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 167, + "literals": ["solidity", ">=", "0.6", ".12", "<", "0.8", ".0", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:42:2" + }, + { + "id": 168, + "literals": ["abicoder", "v2"], + "nodeType": "PragmaDirective", + "src": "89:19:2" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IDisputeManager", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 314, + "linearizedBaseContracts": [314], + "name": "IDisputeManager", + "nameLocation": "120:15:2", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IDisputeManager.DisputeType", + "id": 172, + "members": [ + { + "id": 169, + "name": "Null", + "nameLocation": "191:4:2", + "nodeType": "EnumValue", + "src": "191:4:2" + }, + { + "id": 170, + "name": "IndexingDispute", + "nameLocation": "205:15:2", + "nodeType": "EnumValue", + "src": "205:15:2" + }, + { + "id": 171, + "name": "QueryDispute", + "nameLocation": "230:12:2", + "nodeType": "EnumValue", + "src": "230:12:2" + } + ], + "name": "DisputeType", + "nameLocation": "169:11:2", + "nodeType": "EnumDefinition", + "src": "164:84:2" + }, + { + "canonicalName": "IDisputeManager.DisputeStatus", + "id": 178, + "members": [ + { + "id": 173, + "name": "Null", + "nameLocation": "283:4:2", + "nodeType": "EnumValue", + "src": "283:4:2" + }, + { + "id": 174, + "name": "Accepted", + "nameLocation": "297:8:2", + "nodeType": "EnumValue", + "src": "297:8:2" + }, + { + "id": 175, + "name": "Rejected", + "nameLocation": "315:8:2", + "nodeType": "EnumValue", + "src": "315:8:2" + }, + { + "id": 176, + "name": "Drawn", + "nameLocation": "333:5:2", + "nodeType": "EnumValue", + "src": "333:5:2" + }, + { + "id": 177, + "name": "Pending", + "nameLocation": "348:7:2", + "nodeType": "EnumValue", + "src": "348:7:2" + } + ], + "name": "DisputeStatus", + "nameLocation": "259:13:2", + "nodeType": "EnumDefinition", + "src": "254:107:2" + }, + { + "canonicalName": "IDisputeManager.Dispute", + "id": 193, + "members": [ + { + "constant": false, + "id": 180, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "480:7:2", + "nodeType": "VariableDeclaration", + "scope": 193, + "src": "472:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 179, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "472:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 182, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "505:9:2", + "nodeType": "VariableDeclaration", + "scope": 193, + "src": "497:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 181, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "497:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 184, + "mutability": "mutable", + "name": "deposit", + "nameLocation": "532:7:2", + "nodeType": "VariableDeclaration", + "scope": 193, + "src": "524:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 183, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "524:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 186, + "mutability": "mutable", + "name": "relatedDisputeID", + "nameLocation": "557:16:2", + "nodeType": "VariableDeclaration", + "scope": 193, + "src": "549:24:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 185, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "549:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 189, + "mutability": "mutable", + "name": "disputeType", + "nameLocation": "595:11:2", + "nodeType": "VariableDeclaration", + "scope": 193, + "src": "583:23:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$172", + "typeString": "enum IDisputeManager.DisputeType" + }, + "typeName": { + "id": 188, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 187, + "name": "DisputeType", + "nameLocations": ["583:11:2"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 172, + "src": "583:11:2" + }, + "referencedDeclaration": 172, + "src": "583:11:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$172", + "typeString": "enum IDisputeManager.DisputeType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 192, + "mutability": "mutable", + "name": "status", + "nameLocation": "630:6:2", + "nodeType": "VariableDeclaration", + "scope": 193, + "src": "616:20:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$178", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + "typeName": { + "id": 191, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 190, + "name": "DisputeStatus", + "nameLocations": ["616:13:2"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 178, + "src": "616:13:2" + }, + "referencedDeclaration": 178, + "src": "616:13:2", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$178", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "visibility": "internal" + } + ], + "name": "Dispute", + "nameLocation": "454:7:2", + "nodeType": "StructDefinition", + "scope": 314, + "src": "447:196:2", + "visibility": "public" + }, + { + "canonicalName": "IDisputeManager.Receipt", + "id": 200, + "members": [ + { + "constant": false, + "id": 195, + "mutability": "mutable", + "name": "requestCID", + "nameLocation": "772:10:2", + "nodeType": "VariableDeclaration", + "scope": 200, + "src": "764:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 194, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "764:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 197, + "mutability": "mutable", + "name": "responseCID", + "nameLocation": "800:11:2", + "nodeType": "VariableDeclaration", + "scope": 200, + "src": "792:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 196, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "792:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 199, + "mutability": "mutable", + "name": "subgraphDeploymentID", + "nameLocation": "829:20:2", + "nodeType": "VariableDeclaration", + "scope": 200, + "src": "821:28:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 198, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "821:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "name": "Receipt", + "nameLocation": "746:7:2", + "nodeType": "StructDefinition", + "scope": 314, + "src": "739:117:2", + "visibility": "public" + }, + { + "canonicalName": "IDisputeManager.Attestation", + "id": 213, + "members": [ + { + "constant": false, + "id": 202, + "mutability": "mutable", + "name": "requestCID", + "nameLocation": "961:10:2", + "nodeType": "VariableDeclaration", + "scope": 213, + "src": "953:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 201, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "953:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 204, + "mutability": "mutable", + "name": "responseCID", + "nameLocation": "989:11:2", + "nodeType": "VariableDeclaration", + "scope": 213, + "src": "981:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 203, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "981:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 206, + "mutability": "mutable", + "name": "subgraphDeploymentID", + "nameLocation": "1018:20:2", + "nodeType": "VariableDeclaration", + "scope": 213, + "src": "1010:28:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 205, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1010:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 208, + "mutability": "mutable", + "name": "r", + "nameLocation": "1056:1:2", + "nodeType": "VariableDeclaration", + "scope": 213, + "src": "1048:9:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 207, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1048:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 210, + "mutability": "mutable", + "name": "s", + "nameLocation": "1075:1:2", + "nodeType": "VariableDeclaration", + "scope": 213, + "src": "1067:9:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 209, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1067:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 212, + "mutability": "mutable", + "name": "v", + "nameLocation": "1092:1:2", + "nodeType": "VariableDeclaration", + "scope": 213, + "src": "1086:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 211, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "1086:5:2", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "name": "Attestation", + "nameLocation": "931:11:2", + "nodeType": "StructDefinition", + "scope": 314, + "src": "924:176:2", + "visibility": "public" + }, + { + "functionSelector": "b0eefabe", + "id": 218, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setArbitrator", + "nameLocation": "1143:13:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 216, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 215, + "mutability": "mutable", + "name": "_arbitrator", + "nameLocation": "1165:11:2", + "nodeType": "VariableDeclaration", + "scope": 218, + "src": "1157:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 214, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1157:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1156:21:2" + }, + "returnParameters": { + "id": 217, + "nodeType": "ParameterList", + "parameters": [], + "src": "1186:0:2" + }, + "scope": 314, + "src": "1134:53:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "e78ec42e", + "id": 223, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMinimumDeposit", + "nameLocation": "1202:17:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 221, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 220, + "mutability": "mutable", + "name": "_minimumDeposit", + "nameLocation": "1228:15:2", + "nodeType": "VariableDeclaration", + "scope": 223, + "src": "1220:23:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 219, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1220:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1219:25:2" + }, + "returnParameters": { + "id": 222, + "nodeType": "ParameterList", + "parameters": [], + "src": "1253:0:2" + }, + "scope": 314, + "src": "1193:61:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "991a8355", + "id": 228, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setFishermanRewardPercentage", + "nameLocation": "1269:28:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 226, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 225, + "mutability": "mutable", + "name": "_percentage", + "nameLocation": "1305:11:2", + "nodeType": "VariableDeclaration", + "scope": 228, + "src": "1298:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 224, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1298:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "1297:20:2" + }, + "returnParameters": { + "id": 227, + "nodeType": "ParameterList", + "parameters": [], + "src": "1326:0:2" + }, + "scope": 314, + "src": "1260:67:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "8bbb33b4", + "id": 235, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setSlashingPercentage", + "nameLocation": "1342:21:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 233, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 230, + "mutability": "mutable", + "name": "_qryPercentage", + "nameLocation": "1371:14:2", + "nodeType": "VariableDeclaration", + "scope": 235, + "src": "1364:21:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 229, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1364:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 232, + "mutability": "mutable", + "name": "_idxPercentage", + "nameLocation": "1394:14:2", + "nodeType": "VariableDeclaration", + "scope": 235, + "src": "1387:21:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 231, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1387:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "1363:46:2" + }, + "returnParameters": { + "id": 234, + "nodeType": "ParameterList", + "parameters": [], + "src": "1418:0:2" + }, + "scope": 314, + "src": "1333:86:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "be41f384", + "id": 242, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isDisputeCreated", + "nameLocation": "1456:16:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 238, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 237, + "mutability": "mutable", + "name": "_disputeID", + "nameLocation": "1481:10:2", + "nodeType": "VariableDeclaration", + "scope": 242, + "src": "1473:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 236, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1473:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1472:20:2" + }, + "returnParameters": { + "id": 241, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 240, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 242, + "src": "1516:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 239, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1516:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1515:6:2" + }, + "scope": 314, + "src": "1447:75:2", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "460967df", + "id": 250, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "encodeHashReceipt", + "nameLocation": "1537:17:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 246, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 245, + "mutability": "mutable", + "name": "_receipt", + "nameLocation": "1570:8:2", + "nodeType": "VariableDeclaration", + "scope": 250, + "src": "1555:23:2", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$200_memory_ptr", + "typeString": "struct IDisputeManager.Receipt" + }, + "typeName": { + "id": 244, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 243, + "name": "Receipt", + "nameLocations": ["1555:7:2"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 200, + "src": "1555:7:2" + }, + "referencedDeclaration": 200, + "src": "1555:7:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$200_storage_ptr", + "typeString": "struct IDisputeManager.Receipt" + } + }, + "visibility": "internal" + } + ], + "src": "1554:25:2" + }, + "returnParameters": { + "id": 249, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 248, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 250, + "src": "1603:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 247, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1603:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1602:9:2" + }, + "scope": 314, + "src": "1528:84:2", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "d36fc9d4", + "id": 261, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "areConflictingAttestations", + "nameLocation": "1627:26:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 257, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 253, + "mutability": "mutable", + "name": "_attestation1", + "nameLocation": "1682:13:2", + "nodeType": "VariableDeclaration", + "scope": 261, + "src": "1663:32:2", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Attestation_$213_memory_ptr", + "typeString": "struct IDisputeManager.Attestation" + }, + "typeName": { + "id": 252, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 251, + "name": "Attestation", + "nameLocations": ["1663:11:2"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 213, + "src": "1663:11:2" + }, + "referencedDeclaration": 213, + "src": "1663:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Attestation_$213_storage_ptr", + "typeString": "struct IDisputeManager.Attestation" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 256, + "mutability": "mutable", + "name": "_attestation2", + "nameLocation": "1724:13:2", + "nodeType": "VariableDeclaration", + "scope": 261, + "src": "1705:32:2", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Attestation_$213_memory_ptr", + "typeString": "struct IDisputeManager.Attestation" + }, + "typeName": { + "id": 255, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 254, + "name": "Attestation", + "nameLocations": ["1705:11:2"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 213, + "src": "1705:11:2" + }, + "referencedDeclaration": 213, + "src": "1705:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Attestation_$213_storage_ptr", + "typeString": "struct IDisputeManager.Attestation" + } + }, + "visibility": "internal" + } + ], + "src": "1653:90:2" + }, + "returnParameters": { + "id": 260, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 259, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 261, + "src": "1767:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 258, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1767:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1766:6:2" + }, + "scope": 314, + "src": "1618:155:2", + "stateMutability": "pure", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "c9747f51", + "id": 269, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAttestationIndexer", + "nameLocation": "1788:21:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 265, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 264, + "mutability": "mutable", + "name": "_attestation", + "nameLocation": "1829:12:2", + "nodeType": "VariableDeclaration", + "scope": 269, + "src": "1810:31:2", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Attestation_$213_memory_ptr", + "typeString": "struct IDisputeManager.Attestation" + }, + "typeName": { + "id": 263, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 262, + "name": "Attestation", + "nameLocations": ["1810:11:2"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 213, + "src": "1810:11:2" + }, + "referencedDeclaration": 213, + "src": "1810:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Attestation_$213_storage_ptr", + "typeString": "struct IDisputeManager.Attestation" + } + }, + "visibility": "internal" + } + ], + "src": "1809:33:2" + }, + "returnParameters": { + "id": 268, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 267, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 269, + "src": "1866:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 266, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1866:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1865:9:2" + }, + "scope": 314, + "src": "1779:96:2", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "131610b1", + "id": 278, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createQueryDispute", + "nameLocation": "1912:18:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 274, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 271, + "mutability": "mutable", + "name": "_attestationData", + "nameLocation": "1946:16:2", + "nodeType": "VariableDeclaration", + "scope": 278, + "src": "1931:31:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 270, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1931:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 273, + "mutability": "mutable", + "name": "_deposit", + "nameLocation": "1972:8:2", + "nodeType": "VariableDeclaration", + "scope": 278, + "src": "1964:16:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 272, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1964:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1930:51:2" + }, + "returnParameters": { + "id": 277, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 276, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 278, + "src": "2000:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 275, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2000:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1999:9:2" + }, + "scope": 314, + "src": "1903:106:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "c894222e", + "id": 289, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createQueryDisputeConflict", + "nameLocation": "2024:26:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 283, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 280, + "mutability": "mutable", + "name": "_attestationData1", + "nameLocation": "2075:17:2", + "nodeType": "VariableDeclaration", + "scope": 289, + "src": "2060:32:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 279, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2060:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 282, + "mutability": "mutable", + "name": "_attestationData2", + "nameLocation": "2117:17:2", + "nodeType": "VariableDeclaration", + "scope": 289, + "src": "2102:32:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 281, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2102:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2050:90:2" + }, + "returnParameters": { + "id": 288, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 285, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 289, + "src": "2159:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 284, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2159:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 287, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 289, + "src": "2168:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 286, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2168:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2158:18:2" + }, + "scope": 314, + "src": "2015:162:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "c8792217", + "id": 298, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createIndexingDispute", + "nameLocation": "2192:21:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 294, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 291, + "mutability": "mutable", + "name": "_allocationID", + "nameLocation": "2222:13:2", + "nodeType": "VariableDeclaration", + "scope": 298, + "src": "2214:21:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 290, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2214:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 293, + "mutability": "mutable", + "name": "_deposit", + "nameLocation": "2245:8:2", + "nodeType": "VariableDeclaration", + "scope": 298, + "src": "2237:16:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 292, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2237:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2213:41:2" + }, + "returnParameters": { + "id": 297, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 296, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 298, + "src": "2273:7:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 295, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2273:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2272:9:2" + }, + "scope": 314, + "src": "2183:99:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "11b42611", + "id": 303, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "acceptDispute", + "nameLocation": "2297:13:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 301, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 300, + "mutability": "mutable", + "name": "_disputeID", + "nameLocation": "2319:10:2", + "nodeType": "VariableDeclaration", + "scope": 303, + "src": "2311:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 299, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2311:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2310:20:2" + }, + "returnParameters": { + "id": 302, + "nodeType": "ParameterList", + "parameters": [], + "src": "2339:0:2" + }, + "scope": 314, + "src": "2288:52:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "36167e03", + "id": 308, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "rejectDispute", + "nameLocation": "2355:13:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 306, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 305, + "mutability": "mutable", + "name": "_disputeID", + "nameLocation": "2377:10:2", + "nodeType": "VariableDeclaration", + "scope": 308, + "src": "2369:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 304, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2369:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2368:20:2" + }, + "returnParameters": { + "id": 307, + "nodeType": "ParameterList", + "parameters": [], + "src": "2397:0:2" + }, + "scope": 314, + "src": "2346:52:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "9334ea52", + "id": 313, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "drawDispute", + "nameLocation": "2413:11:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 311, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 310, + "mutability": "mutable", + "name": "_disputeID", + "nameLocation": "2433:10:2", + "nodeType": "VariableDeclaration", + "scope": 313, + "src": "2425:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 309, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2425:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2424:20:2" + }, + "returnParameters": { + "id": 312, + "nodeType": "ParameterList", + "parameters": [], + "src": "2453:0:2" + }, + "scope": 314, + "src": "2404:50:2", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 315, + "src": "110:2346:2", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:2411:2" + }, + "id": 2 + }, + "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol", + "exportedSymbols": { + "IEpochManager": [369] + }, + "id": 370, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 316, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:3" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IEpochManager", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 369, + "linearizedBaseContracts": [369], + "name": "IEpochManager", + "nameLocation": "91:13:3", + "nodeType": "ContractDefinition", + "nodes": [ + { + "functionSelector": "54eea796", + "id": 321, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setEpochLength", + "nameLocation": "148:14:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 319, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 318, + "mutability": "mutable", + "name": "_epochLength", + "nameLocation": "171:12:3", + "nodeType": "VariableDeclaration", + "scope": 321, + "src": "163:20:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 317, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "163:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "162:22:3" + }, + "returnParameters": { + "id": 320, + "nodeType": "ParameterList", + "parameters": [], + "src": "193:0:3" + }, + "scope": 369, + "src": "139:55:3", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "c46e58eb", + "id": 324, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "runEpoch", + "nameLocation": "227:8:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 322, + "nodeType": "ParameterList", + "parameters": [], + "src": "235:2:3" + }, + "returnParameters": { + "id": 323, + "nodeType": "ParameterList", + "parameters": [], + "src": "246:0:3" + }, + "scope": 369, + "src": "218:29:3", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "1ce05d38", + "id": 329, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isCurrentEpochRun", + "nameLocation": "284:17:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 325, + "nodeType": "ParameterList", + "parameters": [], + "src": "301:2:3" + }, + "returnParameters": { + "id": 328, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 327, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 329, + "src": "327:4:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 326, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "327:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "326:6:3" + }, + "scope": 369, + "src": "275:58:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "8ae63d6d", + "id": 334, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "blockNum", + "nameLocation": "348:8:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 330, + "nodeType": "ParameterList", + "parameters": [], + "src": "356:2:3" + }, + "returnParameters": { + "id": 333, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 332, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 334, + "src": "382:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 331, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "382:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "381:9:3" + }, + "scope": 369, + "src": "339:52:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "85df51fd", + "id": 341, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "blockHash", + "nameLocation": "406:9:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 337, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 336, + "mutability": "mutable", + "name": "_block", + "nameLocation": "424:6:3", + "nodeType": "VariableDeclaration", + "scope": 341, + "src": "416:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 335, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "416:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "415:16:3" + }, + "returnParameters": { + "id": 340, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 339, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 341, + "src": "455:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 338, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "455:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "454:9:3" + }, + "scope": 369, + "src": "397:67:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "76671808", + "id": 346, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "currentEpoch", + "nameLocation": "479:12:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 342, + "nodeType": "ParameterList", + "parameters": [], + "src": "491:2:3" + }, + "returnParameters": { + "id": 345, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 344, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 346, + "src": "517:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 343, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "517:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "516:9:3" + }, + "scope": 369, + "src": "470:56:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "ab93122c", + "id": 351, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "currentEpochBlock", + "nameLocation": "541:17:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 347, + "nodeType": "ParameterList", + "parameters": [], + "src": "558:2:3" + }, + "returnParameters": { + "id": 350, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 349, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 351, + "src": "584:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 348, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "584:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "583:9:3" + }, + "scope": 369, + "src": "532:61:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "d0cfa46e", + "id": 356, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "currentEpochBlockSinceStart", + "nameLocation": "608:27:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 352, + "nodeType": "ParameterList", + "parameters": [], + "src": "635:2:3" + }, + "returnParameters": { + "id": 355, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 354, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 356, + "src": "661:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 353, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "661:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "660:9:3" + }, + "scope": 369, + "src": "599:71:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "1b28126d", + "id": 363, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "epochsSince", + "nameLocation": "685:11:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 359, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 358, + "mutability": "mutable", + "name": "_epoch", + "nameLocation": "705:6:3", + "nodeType": "VariableDeclaration", + "scope": 363, + "src": "697:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 357, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "697:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "696:16:3" + }, + "returnParameters": { + "id": 362, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 361, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 363, + "src": "736:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 360, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "736:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "735:9:3" + }, + "scope": 369, + "src": "676:69:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "19c3b82d", + "id": 368, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "epochsSinceUpdate", + "nameLocation": "760:17:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 364, + "nodeType": "ParameterList", + "parameters": [], + "src": "777:2:3" + }, + "returnParameters": { + "id": 367, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 366, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 368, + "src": "803:7:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 365, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "803:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "802:9:3" + }, + "scope": 369, + "src": "751:61:3", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 370, + "src": "81:733:3", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:769:3" + }, + "id": 3 + }, + "@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol", + "exportedSymbols": { + "ICallhookReceiver": [382] + }, + "id": 383, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 371, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "397:33:4" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ICallhookReceiver", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 382, + "linearizedBaseContracts": [382], + "name": "ICallhookReceiver", + "nameLocation": "442:17:4", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 372, + "nodeType": "StructuredDocumentation", + "src": "466:219:4", + "text": " @notice Receive tokens with a callhook from the bridge\n @param _from Token sender in L1\n @param _amount Amount of tokens that were transferred\n @param _data ABI-encoded callhook data" + }, + "functionSelector": "a4c0ed36", + "id": 381, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "onTokenTransfer", + "nameLocation": "699:15:4", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 379, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 374, + "mutability": "mutable", + "name": "_from", + "nameLocation": "723:5:4", + "nodeType": "VariableDeclaration", + "scope": 381, + "src": "715:13:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 373, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "715:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 376, + "mutability": "mutable", + "name": "_amount", + "nameLocation": "738:7:4", + "nodeType": "VariableDeclaration", + "scope": 381, + "src": "730:15:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 375, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "730:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 378, + "mutability": "mutable", + "name": "_data", + "nameLocation": "762:5:4", + "nodeType": "VariableDeclaration", + "scope": 381, + "src": "747:20:4", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 377, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "747:5:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "714:54:4" + }, + "returnParameters": { + "id": 380, + "nodeType": "ParameterList", + "parameters": [], + "src": "777:0:4" + }, + "scope": 382, + "src": "690:88:4", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 383, + "src": "432:348:4", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "397:384:4" + }, + "id": 4 + }, + "@graphprotocol/contracts/contracts/governance/IController.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/governance/IController.sol", + "exportedSymbols": { + "IController": [441] + }, + "id": 442, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 384, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:5" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IController", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 441, + "linearizedBaseContracts": [441], + "name": "IController", + "nameLocation": "91:11:5", + "nodeType": "ContractDefinition", + "nodes": [ + { + "functionSelector": "4fc07d75", + "id": 389, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getGovernor", + "nameLocation": "118:11:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 385, + "nodeType": "ParameterList", + "parameters": [], + "src": "129:2:5" + }, + "returnParameters": { + "id": 388, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 387, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 389, + "src": "155:7:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 386, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "155:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "154:9:5" + }, + "scope": 441, + "src": "109:55:5", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "e0e99292", + "id": 396, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setContractProxy", + "nameLocation": "202:16:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 394, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 391, + "mutability": "mutable", + "name": "_id", + "nameLocation": "227:3:5", + "nodeType": "VariableDeclaration", + "scope": 396, + "src": "219:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 390, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "219:7:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 393, + "mutability": "mutable", + "name": "_contractAddress", + "nameLocation": "240:16:5", + "nodeType": "VariableDeclaration", + "scope": 396, + "src": "232:24:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 392, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "232:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "218:39:5" + }, + "returnParameters": { + "id": 395, + "nodeType": "ParameterList", + "parameters": [], + "src": "266:0:5" + }, + "scope": 441, + "src": "193:74:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "9181df9c", + "id": 401, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "unsetContractProxy", + "nameLocation": "282:18:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 399, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 398, + "mutability": "mutable", + "name": "_id", + "nameLocation": "309:3:5", + "nodeType": "VariableDeclaration", + "scope": 401, + "src": "301:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 397, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "301:7:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "300:13:5" + }, + "returnParameters": { + "id": 400, + "nodeType": "ParameterList", + "parameters": [], + "src": "322:0:5" + }, + "scope": 441, + "src": "273:50:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "eb5dd94f", + "id": 408, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "updateController", + "nameLocation": "338:16:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 406, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 403, + "mutability": "mutable", + "name": "_id", + "nameLocation": "363:3:5", + "nodeType": "VariableDeclaration", + "scope": 408, + "src": "355:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 402, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "355:7:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 405, + "mutability": "mutable", + "name": "_controller", + "nameLocation": "376:11:5", + "nodeType": "VariableDeclaration", + "scope": 408, + "src": "368:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 404, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "368:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "354:34:5" + }, + "returnParameters": { + "id": 407, + "nodeType": "ParameterList", + "parameters": [], + "src": "397:0:5" + }, + "scope": 441, + "src": "329:69:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "f7641a5e", + "id": 415, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getContractProxy", + "nameLocation": "413:16:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 411, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 410, + "mutability": "mutable", + "name": "_id", + "nameLocation": "438:3:5", + "nodeType": "VariableDeclaration", + "scope": 415, + "src": "430:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 409, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "430:7:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "429:13:5" + }, + "returnParameters": { + "id": 414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 413, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 415, + "src": "466:7:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 412, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "466:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "465:9:5" + }, + "scope": 441, + "src": "404:71:5", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "56371bd8", + "id": 420, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setPartialPaused", + "nameLocation": "512:16:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 418, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 417, + "mutability": "mutable", + "name": "_partialPaused", + "nameLocation": "534:14:5", + "nodeType": "VariableDeclaration", + "scope": 420, + "src": "529:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 416, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "529:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "528:21:5" + }, + "returnParameters": { + "id": 419, + "nodeType": "ParameterList", + "parameters": [], + "src": "558:0:5" + }, + "scope": 441, + "src": "503:56:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "16c38b3c", + "id": 425, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setPaused", + "nameLocation": "574:9:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 423, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 422, + "mutability": "mutable", + "name": "_paused", + "nameLocation": "589:7:5", + "nodeType": "VariableDeclaration", + "scope": 425, + "src": "584:12:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 421, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "584:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "583:14:5" + }, + "returnParameters": { + "id": 424, + "nodeType": "ParameterList", + "parameters": [], + "src": "606:0:5" + }, + "scope": 441, + "src": "565:42:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "48bde20c", + "id": 430, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setPauseGuardian", + "nameLocation": "622:16:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 428, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 427, + "mutability": "mutable", + "name": "_newPauseGuardian", + "nameLocation": "647:17:5", + "nodeType": "VariableDeclaration", + "scope": 430, + "src": "639:25:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 426, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "639:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "638:27:5" + }, + "returnParameters": { + "id": 429, + "nodeType": "ParameterList", + "parameters": [], + "src": "674:0:5" + }, + "scope": 441, + "src": "613:62:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "5c975abb", + "id": 435, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "paused", + "nameLocation": "690:6:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 431, + "nodeType": "ParameterList", + "parameters": [], + "src": "696:2:5" + }, + "returnParameters": { + "id": 434, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 433, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 435, + "src": "722:4:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 432, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "722:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "721:6:5" + }, + "scope": 441, + "src": "681:47:5", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "2e292fc7", + "id": 440, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "partialPaused", + "nameLocation": "743:13:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 436, + "nodeType": "ParameterList", + "parameters": [], + "src": "756:2:5" + }, + "returnParameters": { + "id": 439, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 438, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 440, + "src": "782:4:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 437, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "782:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "781:6:5" + }, + "scope": 441, + "src": "734:54:5", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 442, + "src": "81:709:5", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:745:5" + }, + "id": 5 + }, + "@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol", + "exportedSymbols": { + "IL2Curation": [481] + }, + "id": 482, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 443, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:6" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IL2Curation", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 444, + "nodeType": "StructuredDocumentation", + "src": "81:56:6", + "text": " @title Interface of the L2 Curation contract." + }, + "fullyImplemented": false, + "id": 481, + "linearizedBaseContracts": [481], + "name": "IL2Curation", + "nameLocation": "148:11:6", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 445, + "nodeType": "StructuredDocumentation", + "src": "166:131:6", + "text": " @notice Set the subgraph service address.\n @param _subgraphService Address of the SubgraphService contract" + }, + "functionSelector": "93a90a1e", + "id": 450, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setSubgraphService", + "nameLocation": "311:18:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 447, + "mutability": "mutable", + "name": "_subgraphService", + "nameLocation": "338:16:6", + "nodeType": "VariableDeclaration", + "scope": 450, + "src": "330:24:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 446, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "330:7:6", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "329:26:6" + }, + "returnParameters": { + "id": 449, + "nodeType": "ParameterList", + "parameters": [], + "src": "364:0:6" + }, + "scope": 481, + "src": "302:63:6", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 451, + "nodeType": "StructuredDocumentation", + "src": "371:424:6", + "text": " @notice Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool.\n @dev This function charges no tax and can only be called by GNS in specific scenarios (for now\n only during an L1-L2 transfer).\n @param _subgraphDeploymentID Subgraph deployment pool from where to mint signal\n @param _tokensIn Amount of Graph Tokens to deposit\n @return Signal minted" + }, + "functionSelector": "3718896d", + "id": 460, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "mintTaxFree", + "nameLocation": "809:11:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 456, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 453, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "829:21:6", + "nodeType": "VariableDeclaration", + "scope": 460, + "src": "821:29:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 452, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "821:7:6", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 455, + "mutability": "mutable", + "name": "_tokensIn", + "nameLocation": "860:9:6", + "nodeType": "VariableDeclaration", + "scope": 460, + "src": "852:17:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 454, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "852:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "820:50:6" + }, + "returnParameters": { + "id": 459, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 458, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 460, + "src": "889:7:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 457, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "889:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "888:9:6" + }, + "scope": 481, + "src": "800:98:6", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 461, + "nodeType": "StructuredDocumentation", + "src": "904:341:6", + "text": " @notice Calculate amount of signal that can be bought with tokens in a curation pool,\n without accounting for curation tax.\n @param _subgraphDeploymentID Subgraph deployment for which to mint signal\n @param _tokensIn Amount of tokens used to mint signal\n @return Amount of signal that can be bought" + }, + "functionSelector": "7a2a45b8", + "id": 470, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "tokensToSignalNoTax", + "nameLocation": "1259:19:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 466, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 463, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1287:21:6", + "nodeType": "VariableDeclaration", + "scope": 470, + "src": "1279:29:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 462, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1279:7:6", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 465, + "mutability": "mutable", + "name": "_tokensIn", + "nameLocation": "1318:9:6", + "nodeType": "VariableDeclaration", + "scope": 470, + "src": "1310:17:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 464, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1310:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1278:50:6" + }, + "returnParameters": { + "id": 469, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 468, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 470, + "src": "1352:7:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 467, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1352:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1351:9:6" + }, + "scope": 481, + "src": "1250:111:6", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 471, + "nodeType": "StructuredDocumentation", + "src": "1367:480:6", + "text": " @notice Calculate the amount of tokens that would be recovered if minting signal with\n the input tokens and then burning it. This can be used to compute rounding error.\n This function does not account for curation tax.\n @param _subgraphDeploymentID Subgraph deployment for which to mint signal\n @param _tokensIn Amount of tokens used to mint signal\n @return Amount of tokens that would be recovered after minting and burning signal" + }, + "functionSelector": "69db11a1", + "id": 480, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "tokensToSignalToTokensNoTax", + "nameLocation": "1861:27:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 476, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 473, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1906:21:6", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "1898:29:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 472, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1898:7:6", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 475, + "mutability": "mutable", + "name": "_tokensIn", + "nameLocation": "1945:9:6", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "1937:17:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 474, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1937:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1888:72:6" + }, + "returnParameters": { + "id": 479, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 478, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 480, + "src": "1984:7:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 477, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1984:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1983:9:6" + }, + "scope": 481, + "src": "1852:141:6", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 482, + "src": "138:1857:6", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:1950:6" + }, + "id": 6 + }, + "@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol", + "exportedSymbols": { + "ICallhookReceiver": [382], + "IL2GNS": [532] + }, + "id": 533, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 483, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:7" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol", + "file": "../../gateway/ICallhookReceiver.sol", + "id": 485, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 533, + "sourceUnit": 383, + "src": "81:72:7", + "symbolAliases": [ + { + "foreign": { + "id": 484, + "name": "ICallhookReceiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 382, + "src": "90:17:7", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 487, + "name": "ICallhookReceiver", + "nameLocations": ["227:17:7"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 382, + "src": "227:17:7" + }, + "id": 488, + "nodeType": "InheritanceSpecifier", + "src": "227:17:7" + } + ], + "canonicalName": "IL2GNS", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 486, + "nodeType": "StructuredDocumentation", + "src": "155:51:7", + "text": " @title Interface for the L2GNS contract." + }, + "fullyImplemented": false, + "id": 532, + "linearizedBaseContracts": [532, 382], + "name": "IL2GNS", + "nameLocation": "217:6:7", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IL2GNS.L1MessageCodes", + "id": 491, + "members": [ + { + "id": 489, + "name": "RECEIVE_SUBGRAPH_CODE", + "nameLocation": "281:21:7", + "nodeType": "EnumValue", + "src": "281:21:7" + }, + { + "id": 490, + "name": "RECEIVE_CURATOR_BALANCE_CODE", + "nameLocation": "312:28:7", + "nodeType": "EnumValue", + "src": "312:28:7" + } + ], + "name": "L1MessageCodes", + "nameLocation": "256:14:7", + "nodeType": "EnumDefinition", + "src": "251:95:7" + }, + { + "canonicalName": "IL2GNS.SubgraphL2TransferData", + "documentation": { + "id": 492, + "nodeType": "StructuredDocumentation", + "src": "352:138:7", + "text": " @dev The SubgraphL2TransferData struct holds information\n about a subgraph related to its transfer from L1 to L2." + }, + "id": 503, + "members": [ + { + "constant": false, + "id": 494, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "543:6:7", + "nodeType": "VariableDeclaration", + "scope": 503, + "src": "535:14:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 493, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "535:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 498, + "mutability": "mutable", + "name": "curatorBalanceClaimed", + "nameLocation": "630:21:7", + "nodeType": "VariableDeclaration", + "scope": 503, + "src": "605:46:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "typeName": { + "id": 497, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 495, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "613:7:7", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "605:24:7", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 496, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "624:4:7", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 500, + "mutability": "mutable", + "name": "l2Done", + "nameLocation": "724:6:7", + "nodeType": "VariableDeclaration", + "scope": 503, + "src": "719:11:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 499, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "719:4:7", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 502, + "mutability": "mutable", + "name": "subgraphReceivedOnL2BlockNumber", + "nameLocation": "780:31:7", + "nodeType": "VariableDeclaration", + "scope": 503, + "src": "772:39:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 501, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "772:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "SubgraphL2TransferData", + "nameLocation": "502:22:7", + "nodeType": "StructDefinition", + "scope": 532, + "src": "495:376:7", + "visibility": "public" + }, + { + "documentation": { + "id": 504, + "nodeType": "StructuredDocumentation", + "src": "877:486:7", + "text": " @notice Finish a subgraph transfer from L1.\n The subgraph must have been previously sent through the bridge\n using the sendSubgraphToL2 function on L1GNS.\n @param _l2SubgraphID Subgraph ID in L2 (aliased from the L1 subgraph ID)\n @param _subgraphDeploymentID Latest subgraph deployment to assign to the subgraph\n @param _subgraphMetadata IPFS hash of the subgraph metadata\n @param _versionMetadata IPFS hash of the version metadata" + }, + "functionSelector": "d1a80612", + "id": 515, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "finishSubgraphTransferFromL1", + "nameLocation": "1377:28:7", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 513, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 506, + "mutability": "mutable", + "name": "_l2SubgraphID", + "nameLocation": "1423:13:7", + "nodeType": "VariableDeclaration", + "scope": 515, + "src": "1415:21:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 505, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1415:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 508, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1454:21:7", + "nodeType": "VariableDeclaration", + "scope": 515, + "src": "1446:29:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 507, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1446:7:7", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 510, + "mutability": "mutable", + "name": "_subgraphMetadata", + "nameLocation": "1493:17:7", + "nodeType": "VariableDeclaration", + "scope": 515, + "src": "1485:25:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 509, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1485:7:7", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 512, + "mutability": "mutable", + "name": "_versionMetadata", + "nameLocation": "1528:16:7", + "nodeType": "VariableDeclaration", + "scope": 515, + "src": "1520:24:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 511, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1520:7:7", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1405:145:7" + }, + "returnParameters": { + "id": 514, + "nodeType": "ParameterList", + "parameters": [], + "src": "1559:0:7" + }, + "scope": 532, + "src": "1368:192:7", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 516, + "nodeType": "StructuredDocumentation", + "src": "1566:167:7", + "text": " @notice Return the aliased L2 subgraph ID from a transferred L1 subgraph ID\n @param _l1SubgraphID L1 subgraph ID\n @return L2 subgraph ID" + }, + "functionSelector": "ea0f2eba", + "id": 523, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAliasedL2SubgraphID", + "nameLocation": "1747:22:7", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 519, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 518, + "mutability": "mutable", + "name": "_l1SubgraphID", + "nameLocation": "1778:13:7", + "nodeType": "VariableDeclaration", + "scope": 523, + "src": "1770:21:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 517, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1770:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1769:23:7" + }, + "returnParameters": { + "id": 522, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 521, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 523, + "src": "1816:7:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 520, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1816:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1815:9:7" + }, + "scope": 532, + "src": "1738:87:7", + "stateMutability": "pure", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 524, + "nodeType": "StructuredDocumentation", + "src": "1831:168:7", + "text": " @notice Return the unaliased L1 subgraph ID from a transferred L2 subgraph ID\n @param _l2SubgraphID L2 subgraph ID\n @return L1subgraph ID" + }, + "functionSelector": "9c6c022b", + "id": 531, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getUnaliasedL1SubgraphID", + "nameLocation": "2013:24:7", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 527, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 526, + "mutability": "mutable", + "name": "_l2SubgraphID", + "nameLocation": "2046:13:7", + "nodeType": "VariableDeclaration", + "scope": 531, + "src": "2038:21:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 525, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2038:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2037:23:7" + }, + "returnParameters": { + "id": 530, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 529, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 531, + "src": "2084:7:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 528, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2084:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2083:9:7" + }, + "scope": 532, + "src": "2004:89:7", + "stateMutability": "pure", + "virtual": false, + "visibility": "external" + } + ], + "scope": 533, + "src": "207:1888:7", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:2050:7" + }, + "id": 7 + }, + "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol", + "exportedSymbols": { + "IRewardsIssuer": [561] + }, + "id": 562, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 534, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:8" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IRewardsIssuer", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 561, + "linearizedBaseContracts": [561], + "name": "IRewardsIssuer", + "nameLocation": "91:14:8", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 535, + "nodeType": "StructuredDocumentation", + "src": "112:542:8", + "text": " @dev Get allocation data to calculate rewards issuance\n \n @param allocationId The allocation Id\n @return isActive Whether the allocation is active or not\n @return indexer The indexer address\n @return subgraphDeploymentId Subgraph deployment id for the allocation\n @return tokens Amount of allocated tokens\n @return accRewardsPerAllocatedToken Rewards snapshot\n @return accRewardsPending Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed" + }, + "functionSelector": "55c85269", + "id": 552, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAllocationData", + "nameLocation": "668:17:8", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 538, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 537, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "703:12:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "695:20:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 536, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "695:7:8", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "685:36:8" + }, + "returnParameters": { + "id": 551, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 540, + "mutability": "mutable", + "name": "isActive", + "nameLocation": "787:8:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "782:13:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 539, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "782:4:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 542, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "817:7:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "809:15:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 541, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "809:7:8", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 544, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "846:20:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "838:28:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 543, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "838:7:8", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 546, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "888:6:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "880:14:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 545, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "880:7:8", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 548, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "916:27:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "908:35:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 547, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "908:7:8", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 550, + "mutability": "mutable", + "name": "accRewardsPending", + "nameLocation": "965:17:8", + "nodeType": "VariableDeclaration", + "scope": 552, + "src": "957:25:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 549, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "957:7:8", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "768:224:8" + }, + "scope": 561, + "src": "659:334:8", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 553, + "nodeType": "StructuredDocumentation", + "src": "999:200:8", + "text": " @notice Return the total amount of tokens allocated to subgraph.\n @param _subgraphDeploymentId Deployment Id for the subgraph\n @return Total tokens allocated to subgraph" + }, + "functionSelector": "e2e1e8e9", + "id": 560, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getSubgraphAllocatedTokens", + "nameLocation": "1213:26:8", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 556, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 555, + "mutability": "mutable", + "name": "_subgraphDeploymentId", + "nameLocation": "1248:21:8", + "nodeType": "VariableDeclaration", + "scope": 560, + "src": "1240:29:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 554, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1240:7:8", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1239:31:8" + }, + "returnParameters": { + "id": 559, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 558, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 560, + "src": "1294:7:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 557, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1294:7:8", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1293:9:8" + }, + "scope": 561, + "src": "1204:99:8", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 562, + "src": "81:1224:8", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:1260:8" + }, + "id": 8 + }, + "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol", + "exportedSymbols": { + "IRewardsManager": [678] + }, + "id": 679, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 563, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:9" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IRewardsManager", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 678, + "linearizedBaseContracts": [678], + "name": "IRewardsManager", + "nameLocation": "91:15:9", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IRewardsManager.Subgraph", + "documentation": { + "id": 564, + "nodeType": "StructuredDocumentation", + "src": "113:108:9", + "text": " @dev Stores accumulated rewards and snapshots related to a particular SubgraphDeployment." + }, + "id": 573, + "members": [ + { + "constant": false, + "id": 566, + "mutability": "mutable", + "name": "accRewardsForSubgraph", + "nameLocation": "260:21:9", + "nodeType": "VariableDeclaration", + "scope": 573, + "src": "252:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 565, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "252:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 568, + "mutability": "mutable", + "name": "accRewardsForSubgraphSnapshot", + "nameLocation": "299:29:9", + "nodeType": "VariableDeclaration", + "scope": 573, + "src": "291:37:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 567, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "291:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 570, + "mutability": "mutable", + "name": "accRewardsPerSignalSnapshot", + "nameLocation": "346:27:9", + "nodeType": "VariableDeclaration", + "scope": 573, + "src": "338:35:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 569, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "338:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 572, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "391:27:9", + "nodeType": "VariableDeclaration", + "scope": 573, + "src": "383:35:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 571, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "383:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "Subgraph", + "nameLocation": "233:8:9", + "nodeType": "StructDefinition", + "scope": 678, + "src": "226:199:9", + "visibility": "public" + }, + { + "functionSelector": "1156bdc1", + "id": 578, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setIssuancePerBlock", + "nameLocation": "461:19:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 576, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 575, + "mutability": "mutable", + "name": "_issuancePerBlock", + "nameLocation": "489:17:9", + "nodeType": "VariableDeclaration", + "scope": 578, + "src": "481:25:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 574, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "481:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "480:27:9" + }, + "returnParameters": { + "id": 577, + "nodeType": "ParameterList", + "parameters": [], + "src": "516:0:9" + }, + "scope": 678, + "src": "452:65:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "4bbfc1c5", + "id": 583, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMinimumSubgraphSignal", + "nameLocation": "532:24:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 581, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 580, + "mutability": "mutable", + "name": "_minimumSubgraphSignal", + "nameLocation": "565:22:9", + "nodeType": "VariableDeclaration", + "scope": 583, + "src": "557:30:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 579, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "557:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "556:32:9" + }, + "returnParameters": { + "id": 582, + "nodeType": "ParameterList", + "parameters": [], + "src": "597:0:9" + }, + "scope": 678, + "src": "523:75:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "93a90a1e", + "id": 588, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setSubgraphService", + "nameLocation": "613:18:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 586, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 585, + "mutability": "mutable", + "name": "_subgraphService", + "nameLocation": "640:16:9", + "nodeType": "VariableDeclaration", + "scope": 588, + "src": "632:24:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 584, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "632:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "631:26:9" + }, + "returnParameters": { + "id": 587, + "nodeType": "ParameterList", + "parameters": [], + "src": "666:0:9" + }, + "scope": 678, + "src": "604:63:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "0903c094", + "id": 593, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setSubgraphAvailabilityOracle", + "nameLocation": "705:29:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 591, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 590, + "mutability": "mutable", + "name": "_subgraphAvailabilityOracle", + "nameLocation": "743:27:9", + "nodeType": "VariableDeclaration", + "scope": 593, + "src": "735:35:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 589, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "735:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "734:37:9" + }, + "returnParameters": { + "id": 592, + "nodeType": "ParameterList", + "parameters": [], + "src": "780:0:9" + }, + "scope": 678, + "src": "696:85:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "1324a506", + "id": 600, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDenied", + "nameLocation": "796:9:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 598, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 595, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "814:21:9", + "nodeType": "VariableDeclaration", + "scope": 600, + "src": "806:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 594, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "806:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 597, + "mutability": "mutable", + "name": "_deny", + "nameLocation": "842:5:9", + "nodeType": "VariableDeclaration", + "scope": 600, + "src": "837:10:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 596, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "837:4:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "805:43:9" + }, + "returnParameters": { + "id": 599, + "nodeType": "ParameterList", + "parameters": [], + "src": "857:0:9" + }, + "scope": 678, + "src": "787:71:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "e820e284", + "id": 607, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isDenied", + "nameLocation": "873:8:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 603, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 602, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "890:21:9", + "nodeType": "VariableDeclaration", + "scope": 607, + "src": "882:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 601, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "882:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "881:31:9" + }, + "returnParameters": { + "id": 606, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 605, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 607, + "src": "936:4:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 604, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "936:4:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "935:6:9" + }, + "scope": 678, + "src": "864:78:9", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "e284f848", + "id": 612, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getNewRewardsPerSignal", + "nameLocation": "979:22:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 608, + "nodeType": "ParameterList", + "parameters": [], + "src": "1001:2:9" + }, + "returnParameters": { + "id": 611, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 610, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 612, + "src": "1027:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 609, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1027:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1026:9:9" + }, + "scope": 678, + "src": "970:66:9", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "a8cc0ee2", + "id": 617, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAccRewardsPerSignal", + "nameLocation": "1051:22:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 613, + "nodeType": "ParameterList", + "parameters": [], + "src": "1073:2:9" + }, + "returnParameters": { + "id": 616, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 615, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 617, + "src": "1099:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 614, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1099:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1098:9:9" + }, + "scope": 678, + "src": "1042:66:9", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "5c6cbd59", + "id": 624, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAccRewardsForSubgraph", + "nameLocation": "1123:24:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 620, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 619, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1156:21:9", + "nodeType": "VariableDeclaration", + "scope": 624, + "src": "1148:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 618, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1148:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1147:31:9" + }, + "returnParameters": { + "id": 623, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 622, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 624, + "src": "1202:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 621, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1202:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1201:9:9" + }, + "scope": 678, + "src": "1114:97:9", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "702a280e", + "id": 633, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAccRewardsPerAllocatedToken", + "nameLocation": "1226:30:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 627, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 626, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1265:21:9", + "nodeType": "VariableDeclaration", + "scope": 633, + "src": "1257:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 625, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1257:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1256:31:9" + }, + "returnParameters": { + "id": 632, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 629, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 633, + "src": "1311:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 628, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1311:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 631, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 633, + "src": "1320:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 630, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1320:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1310:18:9" + }, + "scope": 678, + "src": "1217:112:9", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "779bcb9b", + "id": 642, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getRewards", + "nameLocation": "1344:10:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 638, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 635, + "mutability": "mutable", + "name": "_rewardsIssuer", + "nameLocation": "1363:14:9", + "nodeType": "VariableDeclaration", + "scope": 642, + "src": "1355:22:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 634, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1355:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 637, + "mutability": "mutable", + "name": "_allocationID", + "nameLocation": "1387:13:9", + "nodeType": "VariableDeclaration", + "scope": 642, + "src": "1379:21:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 636, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1379:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1354:47:9" + }, + "returnParameters": { + "id": 641, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 640, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 642, + "src": "1425:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 639, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1425:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1424:9:9" + }, + "scope": 678, + "src": "1335:99:9", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "c8a5f81e", + "id": 651, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "calcRewards", + "nameLocation": "1449:11:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 647, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 644, + "mutability": "mutable", + "name": "_tokens", + "nameLocation": "1469:7:9", + "nodeType": "VariableDeclaration", + "scope": 651, + "src": "1461:15:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 643, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1461:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 646, + "mutability": "mutable", + "name": "_accRewardsPerAllocatedToken", + "nameLocation": "1486:28:9", + "nodeType": "VariableDeclaration", + "scope": 651, + "src": "1478:36:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 645, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1478:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1460:55:9" + }, + "returnParameters": { + "id": 650, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 649, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 651, + "src": "1539:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 648, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1539:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1538:9:9" + }, + "scope": 678, + "src": "1440:108:9", + "stateMutability": "pure", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "c7d1117d", + "id": 656, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "updateAccRewardsPerSignal", + "nameLocation": "1585:25:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 652, + "nodeType": "ParameterList", + "parameters": [], + "src": "1610:2:9" + }, + "returnParameters": { + "id": 655, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 654, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 656, + "src": "1631:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 653, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1631:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1630:9:9" + }, + "scope": 678, + "src": "1576:64:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "db750926", + "id": 663, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "takeRewards", + "nameLocation": "1655:11:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 659, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 658, + "mutability": "mutable", + "name": "_allocationID", + "nameLocation": "1675:13:9", + "nodeType": "VariableDeclaration", + "scope": 663, + "src": "1667:21:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 657, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1667:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1666:23:9" + }, + "returnParameters": { + "id": 662, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 661, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 663, + "src": "1708:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 660, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1708:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1707:9:9" + }, + "scope": 678, + "src": "1646:71:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "1d1c2fec", + "id": 670, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "onSubgraphSignalUpdate", + "nameLocation": "1752:22:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 666, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 665, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1783:21:9", + "nodeType": "VariableDeclaration", + "scope": 670, + "src": "1775:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 664, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1775:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1774:31:9" + }, + "returnParameters": { + "id": 669, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 668, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 670, + "src": "1824:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 667, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1824:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1823:9:9" + }, + "scope": 678, + "src": "1743:90:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "eeac3e0e", + "id": 677, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "onSubgraphAllocationUpdate", + "nameLocation": "1848:26:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 673, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 672, + "mutability": "mutable", + "name": "_subgraphDeploymentID", + "nameLocation": "1883:21:9", + "nodeType": "VariableDeclaration", + "scope": 677, + "src": "1875:29:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 671, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1875:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1874:31:9" + }, + "returnParameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 675, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 677, + "src": "1924:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 674, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1924:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1923:9:9" + }, + "scope": 678, + "src": "1839:94:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 679, + "src": "81:1854:9", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:1890:9" + }, + "id": 9 + }, + "@graphprotocol/contracts/contracts/token/IGraphToken.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "exportedSymbols": { + "IERC20": [6147], + "IGraphToken": [758] + }, + "id": 759, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 680, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:10" + }, + { + "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol", + "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol", + "id": 681, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 759, + "sourceUnit": 6148, + "src": "81:56:10", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 682, + "name": "IERC20", + "nameLocations": ["164:6:10"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 6147, + "src": "164:6:10" + }, + "id": 683, + "nodeType": "InheritanceSpecifier", + "src": "164:6:10" + } + ], + "canonicalName": "IGraphToken", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 758, + "linearizedBaseContracts": [758, 6147], + "name": "IGraphToken", + "nameLocation": "149:11:10", + "nodeType": "ContractDefinition", + "nodes": [ + { + "functionSelector": "42966c68", + "id": 688, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "burn", + "nameLocation": "214:4:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 686, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 685, + "mutability": "mutable", + "name": "amount", + "nameLocation": "227:6:10", + "nodeType": "VariableDeclaration", + "scope": 688, + "src": "219:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 684, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "219:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "218:16:10" + }, + "returnParameters": { + "id": 687, + "nodeType": "ParameterList", + "parameters": [], + "src": "243:0:10" + }, + "scope": 758, + "src": "205:39:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "79cc6790", + "id": 695, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "burnFrom", + "nameLocation": "259:8:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 693, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 690, + "mutability": "mutable", + "name": "_from", + "nameLocation": "276:5:10", + "nodeType": "VariableDeclaration", + "scope": 695, + "src": "268:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 689, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "268:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 692, + "mutability": "mutable", + "name": "amount", + "nameLocation": "291:6:10", + "nodeType": "VariableDeclaration", + "scope": 695, + "src": "283:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 691, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "283:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "267:31:10" + }, + "returnParameters": { + "id": 694, + "nodeType": "ParameterList", + "parameters": [], + "src": "307:0:10" + }, + "scope": 758, + "src": "250:58:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "40c10f19", + "id": 702, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "mint", + "nameLocation": "323:4:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 700, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 697, + "mutability": "mutable", + "name": "_to", + "nameLocation": "336:3:10", + "nodeType": "VariableDeclaration", + "scope": 702, + "src": "328:11:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 696, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "328:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 699, + "mutability": "mutable", + "name": "_amount", + "nameLocation": "349:7:10", + "nodeType": "VariableDeclaration", + "scope": 702, + "src": "341:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 698, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "341:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "327:30:10" + }, + "returnParameters": { + "id": 701, + "nodeType": "ParameterList", + "parameters": [], + "src": "366:0:10" + }, + "scope": 758, + "src": "314:53:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "983b2d56", + "id": 707, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "addMinter", + "nameLocation": "407:9:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 705, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 704, + "mutability": "mutable", + "name": "_account", + "nameLocation": "425:8:10", + "nodeType": "VariableDeclaration", + "scope": 707, + "src": "417:16:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 703, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "417:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "416:18:10" + }, + "returnParameters": { + "id": 706, + "nodeType": "ParameterList", + "parameters": [], + "src": "443:0:10" + }, + "scope": 758, + "src": "398:46:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "3092afd5", + "id": 712, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "removeMinter", + "nameLocation": "459:12:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 710, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 709, + "mutability": "mutable", + "name": "_account", + "nameLocation": "480:8:10", + "nodeType": "VariableDeclaration", + "scope": 712, + "src": "472:16:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 708, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "472:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "471:18:10" + }, + "returnParameters": { + "id": 711, + "nodeType": "ParameterList", + "parameters": [], + "src": "498:0:10" + }, + "scope": 758, + "src": "450:49:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "98650275", + "id": 715, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "renounceMinter", + "nameLocation": "514:14:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 713, + "nodeType": "ParameterList", + "parameters": [], + "src": "528:2:10" + }, + "returnParameters": { + "id": 714, + "nodeType": "ParameterList", + "parameters": [], + "src": "539:0:10" + }, + "scope": 758, + "src": "505:35:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "aa271e1a", + "id": 722, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isMinter", + "nameLocation": "555:8:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 718, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 717, + "mutability": "mutable", + "name": "_account", + "nameLocation": "572:8:10", + "nodeType": "VariableDeclaration", + "scope": 722, + "src": "564:16:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 716, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "564:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "563:18:10" + }, + "returnParameters": { + "id": 721, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 720, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 722, + "src": "605:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 719, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "605:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "604:6:10" + }, + "scope": 758, + "src": "546:65:10", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "d505accf", + "id": 739, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "permit", + "nameLocation": "647:6:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 737, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 724, + "mutability": "mutable", + "name": "_owner", + "nameLocation": "671:6:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "663:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 723, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "663:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 726, + "mutability": "mutable", + "name": "_spender", + "nameLocation": "695:8:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "687:16:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 725, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "687:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 728, + "mutability": "mutable", + "name": "_value", + "nameLocation": "721:6:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "713:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 727, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "713:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 730, + "mutability": "mutable", + "name": "_deadline", + "nameLocation": "745:9:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "737:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 729, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "737:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 732, + "mutability": "mutable", + "name": "_v", + "nameLocation": "770:2:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "764:8:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 731, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "764:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 734, + "mutability": "mutable", + "name": "_r", + "nameLocation": "790:2:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "782:10:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 733, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "782:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 736, + "mutability": "mutable", + "name": "_s", + "nameLocation": "810:2:10", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "802:10:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 735, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "802:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "653:165:10" + }, + "returnParameters": { + "id": 738, + "nodeType": "ParameterList", + "parameters": [], + "src": "827:0:10" + }, + "scope": 758, + "src": "638:190:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "39509351", + "id": 748, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "increaseAllowance", + "nameLocation": "867:17:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 744, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 741, + "mutability": "mutable", + "name": "spender", + "nameLocation": "893:7:10", + "nodeType": "VariableDeclaration", + "scope": 748, + "src": "885:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 740, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "885:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 743, + "mutability": "mutable", + "name": "addedValue", + "nameLocation": "910:10:10", + "nodeType": "VariableDeclaration", + "scope": 748, + "src": "902:18:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 742, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "902:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "884:37:10" + }, + "returnParameters": { + "id": 747, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 746, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 748, + "src": "940:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 745, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "940:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "939:6:10" + }, + "scope": 758, + "src": "858:88:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "functionSelector": "a457c2d7", + "id": 757, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "decreaseAllowance", + "nameLocation": "961:17:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 753, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 750, + "mutability": "mutable", + "name": "spender", + "nameLocation": "987:7:10", + "nodeType": "VariableDeclaration", + "scope": 757, + "src": "979:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 749, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "979:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 752, + "mutability": "mutable", + "name": "subtractedValue", + "nameLocation": "1004:15:10", + "nodeType": "VariableDeclaration", + "scope": 757, + "src": "996:23:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 751, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "996:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "978:42:10" + }, + "returnParameters": { + "id": 756, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 755, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 757, + "src": "1039:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 754, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1039:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1038:6:10" + }, + "scope": 758, + "src": "952:93:10", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 759, + "src": "139:908:10", + "usedErrors": [], + "usedEvents": [6081, 6090] + } + ], + "src": "46:1002:10" + }, + "id": 10 + }, + "@graphprotocol/contracts/contracts/utils/TokenUtils.sol": { + "ast": { + "absolutePath": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "exportedSymbols": { + "IERC20": [6147], + "IGraphToken": [758], + "TokenUtils": [840] + }, + "id": 841, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 760, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:33:11" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "file": "../token/IGraphToken.sol", + "id": 761, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 841, + "sourceUnit": 759, + "src": "81:34:11", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "TokenUtils", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 762, + "nodeType": "StructuredDocumentation", + "src": "117:239:11", + "text": " @title TokenUtils library\n @notice This library contains utility functions for handling tokens (transfers and burns).\n It is specifically adapted for the GraphToken, so does not need to handle edge cases\n for other tokens." + }, + "fullyImplemented": true, + "id": 840, + "linearizedBaseContracts": [840], + "name": "TokenUtils", + "nameLocation": "365:10:11", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 791, + "nodeType": "Block", + "src": "684:135:11", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 773, + "name": "_amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 770, + "src": "698:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 774, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "708:1:11", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "698:11:11", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 790, + "nodeType": "IfStatement", + "src": "694:119:11", + "trueBody": { + "id": 789, + "nodeType": "Block", + "src": "711:102:11", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 779, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 768, + "src": "758:5:11", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 782, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "773:4:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_TokenUtils_$840", + "typeString": "library TokenUtils" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_TokenUtils_$840", + "typeString": "library TokenUtils" + } + ], + "id": 781, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "765:7:11", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 780, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "765:7:11", + "typeDescriptions": {} + } + }, + "id": 783, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "765:13:11", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 784, + "name": "_amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 770, + "src": "780:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 777, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 766, + "src": "733:11:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "745:12:11", + "memberName": "transferFrom", + "nodeType": "MemberAccess", + "referencedDeclaration": 6146, + "src": "733:24:11", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$", + "typeString": "function (address,address,uint256) external returns (bool)" + } + }, + "id": 785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "733:55:11", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "217472616e73666572", + "id": 786, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "790:11:11", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50", + "typeString": "literal_string \"!transfer\"" + }, + "value": "!transfer" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50", + "typeString": "literal_string \"!transfer\"" + } + ], + "id": 776, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "725:7:11", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 787, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "725:77:11", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 788, + "nodeType": "ExpressionStatement", + "src": "725:77:11" + } + ] + } + } + ] + }, + "documentation": { + "id": 763, + "nodeType": "StructuredDocumentation", + "src": "382:211:11", + "text": " @dev Pull tokens from an address to this contract.\n @param _graphToken Token to transfer\n @param _from Address sending the tokens\n @param _amount Amount of tokens to transfer" + }, + "id": 792, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "pullTokens", + "nameLocation": "607:10:11", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 771, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 766, + "mutability": "mutable", + "name": "_graphToken", + "nameLocation": "630:11:11", + "nodeType": "VariableDeclaration", + "scope": 792, + "src": "618:23:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + }, + "typeName": { + "id": 765, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 764, + "name": "IGraphToken", + "nameLocations": ["618:11:11"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "618:11:11" + }, + "referencedDeclaration": 758, + "src": "618:11:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 768, + "mutability": "mutable", + "name": "_from", + "nameLocation": "651:5:11", + "nodeType": "VariableDeclaration", + "scope": 792, + "src": "643:13:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 767, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "643:7:11", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 770, + "mutability": "mutable", + "name": "_amount", + "nameLocation": "666:7:11", + "nodeType": "VariableDeclaration", + "scope": 792, + "src": "658:15:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 769, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "658:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "617:57:11" + }, + "returnParameters": { + "id": 772, + "nodeType": "ParameterList", + "parameters": [], + "src": "684:0:11" + }, + "scope": 840, + "src": "598:221:11", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 817, + "nodeType": "Block", + "src": "1134:114:11", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 805, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 803, + "name": "_amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 800, + "src": "1148:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 804, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1158:1:11", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1148:11:11", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 816, + "nodeType": "IfStatement", + "src": "1144:98:11", + "trueBody": { + "id": 815, + "nodeType": "Block", + "src": "1161:81:11", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 809, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 798, + "src": "1204:3:11", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 810, + "name": "_amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 800, + "src": "1209:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 807, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 796, + "src": "1183:11:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 808, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1195:8:11", + "memberName": "transfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 6114, + "src": "1183:20:11", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", + "typeString": "function (address,uint256) external returns (bool)" + } + }, + "id": 811, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1183:34:11", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "217472616e73666572", + "id": 812, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1219:11:11", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50", + "typeString": "literal_string \"!transfer\"" + }, + "value": "!transfer" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50", + "typeString": "literal_string \"!transfer\"" + } + ], + "id": 806, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "1175:7:11", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 813, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1175:56:11", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 814, + "nodeType": "ExpressionStatement", + "src": "1175:56:11" + } + ] + } + } + ] + }, + "documentation": { + "id": 793, + "nodeType": "StructuredDocumentation", + "src": "825:220:11", + "text": " @dev Push tokens from this contract to a receiving address.\n @param _graphToken Token to transfer\n @param _to Address receiving the tokens\n @param _amount Amount of tokens to transfer" + }, + "id": 818, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "pushTokens", + "nameLocation": "1059:10:11", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 801, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 796, + "mutability": "mutable", + "name": "_graphToken", + "nameLocation": "1082:11:11", + "nodeType": "VariableDeclaration", + "scope": 818, + "src": "1070:23:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + }, + "typeName": { + "id": 795, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 794, + "name": "IGraphToken", + "nameLocations": ["1070:11:11"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "1070:11:11" + }, + "referencedDeclaration": 758, + "src": "1070:11:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 798, + "mutability": "mutable", + "name": "_to", + "nameLocation": "1103:3:11", + "nodeType": "VariableDeclaration", + "scope": 818, + "src": "1095:11:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 797, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1095:7:11", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 800, + "mutability": "mutable", + "name": "_amount", + "nameLocation": "1116:7:11", + "nodeType": "VariableDeclaration", + "scope": 818, + "src": "1108:15:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 799, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1108:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1069:55:11" + }, + "returnParameters": { + "id": 802, + "nodeType": "ParameterList", + "parameters": [], + "src": "1134:0:11" + }, + "scope": 840, + "src": "1050:198:11", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 838, + "nodeType": "Block", + "src": "1475:83:11", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 827, + "name": "_amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 824, + "src": "1489:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 828, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1499:1:11", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1489:11:11", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 837, + "nodeType": "IfStatement", + "src": "1485:67:11", + "trueBody": { + "id": 836, + "nodeType": "Block", + "src": "1502:50:11", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 833, + "name": "_amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 824, + "src": "1533:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 830, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 822, + "src": "1516:11:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 832, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1528:4:11", + "memberName": "burn", + "nodeType": "MemberAccess", + "referencedDeclaration": 688, + "src": "1516:16:11", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256) external" + } + }, + "id": 834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1516:25:11", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 835, + "nodeType": "ExpressionStatement", + "src": "1516:25:11" + } + ] + } + } + ] + }, + "documentation": { + "id": 819, + "nodeType": "StructuredDocumentation", + "src": "1254:145:11", + "text": " @dev Burn tokens held by this contract.\n @param _graphToken Token to burn\n @param _amount Amount of tokens to burn" + }, + "id": 839, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "burnTokens", + "nameLocation": "1413:10:11", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 825, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 822, + "mutability": "mutable", + "name": "_graphToken", + "nameLocation": "1436:11:11", + "nodeType": "VariableDeclaration", + "scope": 839, + "src": "1424:23:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + }, + "typeName": { + "id": 821, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 820, + "name": "IGraphToken", + "nameLocations": ["1424:11:11"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "1424:11:11" + }, + "referencedDeclaration": 758, + "src": "1424:11:11", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 824, + "mutability": "mutable", + "name": "_amount", + "nameLocation": "1457:7:11", + "nodeType": "VariableDeclaration", + "scope": 839, + "src": "1449:15:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 823, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1449:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1423:42:11" + }, + "returnParameters": { + "id": 826, + "nodeType": "ParameterList", + "parameters": [], + "src": "1475:0:11" + }, + "scope": 840, + "src": "1404:154:11", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 841, + "src": "357:1203:11", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:1515:11" + }, + "id": 11 + }, + "@graphprotocol/horizon/contracts/data-service/DataService.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/DataService.sol", + "exportedSymbols": { + "DataService": [936], + "DataServiceV1Storage": [945], + "GraphDirectory": [4928], + "IDataService": [1557], + "ProvisionManager": [2395] + }, + "id": 937, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 842, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:12" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol", + "file": "./interfaces/IDataService.sol", + "id": 844, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 937, + "sourceUnit": 1558, + "src": "70:61:12", + "symbolAliases": [ + { + "foreign": { + "id": 843, + "name": "IDataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "79:12:12", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol", + "file": "./DataServiceStorage.sol", + "id": 846, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 937, + "sourceUnit": 946, + "src": "133:64:12", + "symbolAliases": [ + { + "foreign": { + "id": 845, + "name": "DataServiceV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 945, + "src": "142:20:12", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "file": "../utilities/GraphDirectory.sol", + "id": 848, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 937, + "sourceUnit": 4929, + "src": "198:65:12", + "symbolAliases": [ + { + "foreign": { + "id": 847, + "name": "GraphDirectory", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4928, + "src": "207:14:12", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol", + "file": "./utilities/ProvisionManager.sol", + "id": 850, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 937, + "sourceUnit": 2396, + "src": "264:68:12", + "symbolAliases": [ + { + "foreign": { + "id": 849, + "name": "ProvisionManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2395, + "src": "273:16:12", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 852, + "name": "GraphDirectory", + "nameLocations": ["1871:14:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4928, + "src": "1871:14:12" + }, + "id": 853, + "nodeType": "InheritanceSpecifier", + "src": "1871:14:12" + }, + { + "baseName": { + "id": 854, + "name": "ProvisionManager", + "nameLocations": ["1887:16:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2395, + "src": "1887:16:12" + }, + "id": 855, + "nodeType": "InheritanceSpecifier", + "src": "1887:16:12" + }, + { + "baseName": { + "id": 856, + "name": "DataServiceV1Storage", + "nameLocations": ["1905:20:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 945, + "src": "1905:20:12" + }, + "id": 857, + "nodeType": "InheritanceSpecifier", + "src": "1905:20:12" + }, + { + "baseName": { + "id": 858, + "name": "IDataService", + "nameLocations": ["1927:12:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1557, + "src": "1927:12:12" + }, + "id": 859, + "nodeType": "InheritanceSpecifier", + "src": "1927:12:12" + } + ], + "canonicalName": "DataService", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 851, + "nodeType": "StructuredDocumentation", + "src": "334:1503:12", + "text": " @title DataService contract\n @dev Implementation of the {IDataService} interface.\n @notice This implementation provides base functionality for a data service:\n - GraphDirectory, allows the data service to interact with Graph Horizon contracts\n - ProvisionManager, provides functionality to manage provisions\n The derived contract MUST implement all the interfaces described in {IDataService} and in\n accordance with the Data Service framework.\n @dev A note on upgradeability: this base contract can be inherited by upgradeable or non upgradeable\n contracts.\n - If the data service implementation is upgradeable, it must initialize the contract via an external\n initializer function with the `initializer` modifier that calls {__DataService_init} or\n {__DataService_init_unchained}. It's recommended the implementation constructor to also call\n {_disableInitializers} to prevent the implementation from being initialized.\n - If the data service implementation is NOT upgradeable, it must initialize the contract by calling\n {__DataService_init} or {__DataService_init_unchained} in the constructor. Note that the `initializer`\n will be required in the constructor.\n - Note that in both cases if using {__DataService_init_unchained} variant the corresponding parent\n initializers must be called in the implementation.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 936, + "linearizedBaseContracts": [936, 1557, 945, 2395, 2425, 4928, 5391], + "name": "DataService", + "nameLocation": "1856:11:12", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 868, + "nodeType": "Block", + "src": "2198:2:12", + "statements": [] + }, + "documentation": { + "id": 860, + "nodeType": "StructuredDocumentation", + "src": "1946:188:12", + "text": " @dev Addresses in GraphDirectory are immutables, they can only be set in this constructor.\n @param controller The address of the Graph Horizon controller contract." + }, + "id": 869, + "implemented": true, + "kind": "constructor", + "modifiers": [ + { + "arguments": [ + { + "id": 865, + "name": "controller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 862, + "src": "2186:10:12", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 866, + "kind": "baseConstructorSpecifier", + "modifierName": { + "id": 864, + "name": "GraphDirectory", + "nameLocations": ["2171:14:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4928, + "src": "2171:14:12" + }, + "nodeType": "ModifierInvocation", + "src": "2171:26:12" + } + ], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 863, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 862, + "mutability": "mutable", + "name": "controller", + "nameLocation": "2159:10:12", + "nodeType": "VariableDeclaration", + "scope": 869, + "src": "2151:18:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 861, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2151:7:12", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2150:20:12" + }, + "returnParameters": { + "id": 867, + "nodeType": "ParameterList", + "parameters": [], + "src": "2198:0:12" + }, + "scope": 936, + "src": "2139:61:12", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "baseFunctions": [1534], + "body": { + "id": 880, + "nodeType": "Block", + "src": "2311:48:12", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 877, + "name": "_getThawingPeriodRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2317, + "src": "2328:22:12", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint64_$_t_uint64_$", + "typeString": "function () view returns (uint64,uint64)" + } + }, + "id": 878, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2328:24:12", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint64_$_t_uint64_$", + "typeString": "tuple(uint64,uint64)" + } + }, + "functionReturnParameters": 876, + "id": 879, + "nodeType": "Return", + "src": "2321:31:12" + } + ] + }, + "documentation": { + "id": 870, + "nodeType": "StructuredDocumentation", + "src": "2206:28:12", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "71ce020a", + "id": 881, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getThawingPeriodRange", + "nameLocation": "2248:21:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 871, + "nodeType": "ParameterList", + "parameters": [], + "src": "2269:2:12" + }, + "returnParameters": { + "id": 876, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 873, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 881, + "src": "2295:6:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 872, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2295:6:12", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 875, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 881, + "src": "2303:6:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 874, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2303:6:12", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "2294:16:12" + }, + "scope": 936, + "src": "2239:120:12", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1542], + "body": { + "id": 892, + "nodeType": "Block", + "src": "2468:46:12", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 889, + "name": "_getVerifierCutRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2330, + "src": "2485:20:12", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$_t_uint32_$", + "typeString": "function () view returns (uint32,uint32)" + } + }, + "id": 890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2485:22:12", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint32_$_t_uint32_$", + "typeString": "tuple(uint32,uint32)" + } + }, + "functionReturnParameters": 888, + "id": 891, + "nodeType": "Return", + "src": "2478:29:12" + } + ] + }, + "documentation": { + "id": 882, + "nodeType": "StructuredDocumentation", + "src": "2365:28:12", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "482468b7", + "id": 893, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getVerifierCutRange", + "nameLocation": "2407:19:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 883, + "nodeType": "ParameterList", + "parameters": [], + "src": "2426:2:12" + }, + "returnParameters": { + "id": 888, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 885, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 893, + "src": "2452:6:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 884, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2452:6:12", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 887, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 893, + "src": "2460:6:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 886, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2460:6:12", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "2451:16:12" + }, + "scope": 936, + "src": "2398:116:12", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1550], + "body": { + "id": 904, + "nodeType": "Block", + "src": "2629:50:12", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 901, + "name": "_getProvisionTokensRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2304, + "src": "2646:24:12", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$_t_uint256_$", + "typeString": "function () view returns (uint256,uint256)" + } + }, + "id": 902, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2646:26:12", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "functionReturnParameters": 900, + "id": 903, + "nodeType": "Return", + "src": "2639:33:12" + } + ] + }, + "documentation": { + "id": 894, + "nodeType": "StructuredDocumentation", + "src": "2520:28:12", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "819ba366", + "id": 905, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getProvisionTokensRange", + "nameLocation": "2562:23:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 895, + "nodeType": "ParameterList", + "parameters": [], + "src": "2585:2:12" + }, + "returnParameters": { + "id": 900, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 897, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 905, + "src": "2611:7:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 896, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2611:7:12", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 899, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 905, + "src": "2620:7:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 898, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2620:7:12", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2610:18:12" + }, + "scope": 936, + "src": "2553:126:12", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1556], + "body": { + "id": 914, + "nodeType": "Block", + "src": "2779:45:12", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 911, + "name": "_getDelegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2291, + "src": "2796:19:12", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$", + "typeString": "function () view returns (uint32)" + } + }, + "id": 912, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2796:21:12", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "functionReturnParameters": 910, + "id": 913, + "nodeType": "Return", + "src": "2789:28:12" + } + ] + }, + "documentation": { + "id": 906, + "nodeType": "StructuredDocumentation", + "src": "2685:28:12", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "1ebb7c30", + "id": 915, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getDelegationRatio", + "nameLocation": "2727:18:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 907, + "nodeType": "ParameterList", + "parameters": [], + "src": "2745:2:12" + }, + "returnParameters": { + "id": 910, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 909, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 915, + "src": "2771:6:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 908, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2771:6:12", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "2770:8:12" + }, + "scope": 936, + "src": "2718:106:12", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 927, + "nodeType": "Block", + "src": "2968:92:12", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 921, + "name": "__ProvisionManager_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2024, + "src": "2978:33:12", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2978:35:12", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 923, + "nodeType": "ExpressionStatement", + "src": "2978:35:12" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 924, + "name": "__DataService_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 935, + "src": "3023:28:12", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 925, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3023:30:12", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 926, + "nodeType": "ExpressionStatement", + "src": "3023:30:12" + } + ] + }, + "documentation": { + "id": 916, + "nodeType": "StructuredDocumentation", + "src": "2830:77:12", + "text": " @notice Initializes the contract and any parent contracts." + }, + "id": 928, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 919, + "kind": "modifierInvocation", + "modifierName": { + "id": 918, + "name": "onlyInitializing", + "nameLocations": ["2951:16:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "2951:16:12" + }, + "nodeType": "ModifierInvocation", + "src": "2951:16:12" + } + ], + "name": "__DataService_init", + "nameLocation": "2921:18:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 917, + "nodeType": "ParameterList", + "parameters": [], + "src": "2939:2:12" + }, + "returnParameters": { + "id": 920, + "nodeType": "ParameterList", + "parameters": [], + "src": "2968:0:12" + }, + "scope": 936, + "src": "2912:148:12", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 934, + "nodeType": "Block", + "src": "3189:2:12", + "statements": [] + }, + "documentation": { + "id": 929, + "nodeType": "StructuredDocumentation", + "src": "3066:52:12", + "text": " @notice Initializes the contract." + }, + "id": 935, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 932, + "kind": "modifierInvocation", + "modifierName": { + "id": 931, + "name": "onlyInitializing", + "nameLocations": ["3172:16:12"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "3172:16:12" + }, + "nodeType": "ModifierInvocation", + "src": "3172:16:12" + } + ], + "name": "__DataService_init_unchained", + "nameLocation": "3132:28:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 930, + "nodeType": "ParameterList", + "parameters": [], + "src": "3160:2:12" + }, + "returnParameters": { + "id": 933, + "nodeType": "ParameterList", + "parameters": [], + "src": "3189:0:12" + }, + "scope": 936, + "src": "3123:68:12", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 937, + "src": "1838:1355:12", + "usedErrors": [1918, 1925, 1932, 1937, 4655, 5140, 5143], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473, 1888, 1893, 1900, 1907, 4650, 5148] + } + ], + "src": "45:3149:12" + }, + "id": 12 + }, + "@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol", + "exportedSymbols": { + "DataServiceV1Storage": [945] + }, + "id": 946, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 938, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:13" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "DataServiceV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 939, + "nodeType": "StructuredDocumentation", + "src": "70:256:13", + "text": " @title DataServiceStorage\n @dev This contract holds the storage variables for the DataService contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 945, + "linearizedBaseContracts": [945], + "name": "DataServiceV1Storage", + "nameLocation": "345:20:13", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 940, + "nodeType": "StructuredDocumentation", + "src": "372:158:13", + "text": "@dev Gap to allow adding variables in future upgrades\n Note that this contract is not upgradeable but might be inherited by an upgradeable contract" + }, + "id": 944, + "mutability": "mutable", + "name": "__gap", + "nameLocation": "555:5:13", + "nodeType": "VariableDeclaration", + "scope": 945, + "src": "535:25:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage", + "typeString": "uint256[50]" + }, + "typeName": { + "baseType": { + "id": 941, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "535:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 943, + "length": { + "hexValue": "3530", + "id": 942, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "543:2:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "nodeType": "ArrayTypeName", + "src": "535:11:13", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr", + "typeString": "uint256[50]" + } + }, + "visibility": "private" + } + ], + "scope": 946, + "src": "327:236:13", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:519:13" + }, + "id": 13 + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol", + "exportedSymbols": { + "DataService": [936], + "DataServiceFees": [1278], + "DataServiceFeesV1Storage": [1308], + "IDataServiceFees": [1620], + "LinkedList": [4364], + "ProvisionTracker": [1801] + }, + "id": 1279, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 947, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:14" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol", + "file": "../interfaces/IDataServiceFees.sol", + "id": 949, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1279, + "sourceUnit": 1621, + "src": "70:70:14", + "symbolAliases": [ + { + "foreign": { + "id": 948, + "name": "IDataServiceFees", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1620, + "src": "79:16:14", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol", + "file": "../libraries/ProvisionTracker.sol", + "id": 951, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1279, + "sourceUnit": 1802, + "src": "142:69:14", + "symbolAliases": [ + { + "foreign": { + "id": 950, + "name": "ProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1801, + "src": "151:16:14", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/LinkedList.sol", + "file": "../../libraries/LinkedList.sol", + "id": 953, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1279, + "sourceUnit": 4365, + "src": "212:60:14", + "symbolAliases": [ + { + "foreign": { + "id": 952, + "name": "LinkedList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4364, + "src": "221:10:14", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/DataService.sol", + "file": "../DataService.sol", + "id": 955, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1279, + "sourceUnit": 937, + "src": "274:49:14", + "symbolAliases": [ + { + "foreign": { + "id": 954, + "name": "DataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 936, + "src": "283:11:14", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol", + "file": "./DataServiceFeesStorage.sol", + "id": 957, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1279, + "sourceUnit": 1309, + "src": "324:72:14", + "symbolAliases": [ + { + "foreign": { + "id": 956, + "name": "DataServiceFeesV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1308, + "src": "333:24:14", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 959, + "name": "DataService", + "nameLocations": ["974:11:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 936, + "src": "974:11:14" + }, + "id": 960, + "nodeType": "InheritanceSpecifier", + "src": "974:11:14" + }, + { + "baseName": { + "id": 961, + "name": "DataServiceFeesV1Storage", + "nameLocations": ["987:24:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1308, + "src": "987:24:14" + }, + "id": 962, + "nodeType": "InheritanceSpecifier", + "src": "987:24:14" + }, + { + "baseName": { + "id": 963, + "name": "IDataServiceFees", + "nameLocations": ["1013:16:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1620, + "src": "1013:16:14" + }, + "id": 964, + "nodeType": "InheritanceSpecifier", + "src": "1013:16:14" + } + ], + "canonicalName": "DataServiceFees", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 958, + "nodeType": "StructuredDocumentation", + "src": "398:538:14", + "text": " @title DataServiceFees contract\n @dev Implementation of the {IDataServiceFees} interface.\n @notice Extension for the {IDataService} contract to handle payment collateralization\n using a Horizon provision. See {IDataServiceFees} for more details.\n @dev This contract inherits from {DataService} which needs to be initialized, please see\n {DataService} for detailed instructions.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 1278, + "internalFunctionIDs": { + "1199": 1, + "1211": 2, + "1254": 3 + }, + "linearizedBaseContracts": [1278, 1620, 1308, 936, 1557, 945, 2395, 2425, 4928, 5391], + "name": "DataServiceFees", + "nameLocation": "955:15:14", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 969, + "libraryName": { + "id": 965, + "name": "ProvisionTracker", + "nameLocations": ["1042:16:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1801, + "src": "1042:16:14" + }, + "nodeType": "UsingForDirective", + "src": "1036:55:14", + "typeName": { + "id": 968, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 966, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1071:7:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1063:27:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 967, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1082:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + } + }, + { + "global": false, + "id": 973, + "libraryName": { + "id": 970, + "name": "LinkedList", + "nameLocations": ["1102:10:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4364, + "src": "1102:10:14" + }, + "nodeType": "UsingForDirective", + "src": "1096:37:14", + "typeName": { + "id": 972, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 971, + "name": "LinkedList.List", + "nameLocations": ["1117:10:14", "1128:4:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "1117:15:14" + }, + "referencedDeclaration": 4090, + "src": "1117:15:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + } + }, + { + "baseFunctions": [1619], + "body": { + "id": 986, + "nodeType": "Block", + "src": "1252:62:14", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 981, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1276:3:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 982, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1280:6:14", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "1276:10:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 983, + "name": "numClaimsToRelease", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 976, + "src": "1288:18:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 980, + "name": "_releaseStake", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1121, + "src": "1262:13:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 984, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1262:45:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 985, + "nodeType": "ExpressionStatement", + "src": "1262:45:14" + } + ] + }, + "documentation": { + "id": 974, + "nodeType": "StructuredDocumentation", + "src": "1139:32:14", + "text": "@inheritdoc IDataServiceFees" + }, + "functionSelector": "45f54485", + "id": 987, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "releaseStake", + "nameLocation": "1185:12:14", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 978, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1243:8:14" + }, + "parameters": { + "id": 977, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 976, + "mutability": "mutable", + "name": "numClaimsToRelease", + "nameLocation": "1206:18:14", + "nodeType": "VariableDeclaration", + "scope": 987, + "src": "1198:26:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 975, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1198:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1197:28:14" + }, + "returnParameters": { + "id": 979, + "nodeType": "ParameterList", + "parameters": [], + "src": "1252:0:14" + }, + "scope": 1278, + "src": "1176:138:14", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "external" + }, + { + "body": { + "id": 1073, + "nodeType": "Block", + "src": "1963:762:14", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1000, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 998, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 992, + "src": "1981:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 999, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1992:1:14", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1981:12:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1001, + "name": "DataServiceFeesZeroTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1613, + "src": "1995:25:14", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 1002, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1995:27:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 997, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "1973:7:14", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1003, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1973:50:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1004, + "nodeType": "ExpressionStatement", + "src": "1973:50:14" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1008, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "2059:13:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 1009, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2059:15:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + { + "id": 1010, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 990, + "src": "2076:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1011, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 992, + "src": "2094:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1012, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "2103:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 1005, + "name": "feesProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1290, + "src": "2033:20:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1007, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2054:4:14", + "memberName": "lock", + "nodeType": "MemberAccess", + "referencedDeclaration": 1726, + "src": "2033:25:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_uint256_$_$_t_contract$_IHorizonStaking_$2625_$_t_address_$_t_uint256_$_t_uint32_$returns$__$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),contract IHorizonStaking,address,uint256,uint32)" + } + }, + "id": 1013, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2033:87:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1014, + "nodeType": "ExpressionStatement", + "src": "2033:87:14" + }, + { + "assignments": [1019], + "declarations": [ + { + "constant": false, + "id": 1019, + "mutability": "mutable", + "name": "claimsList", + "nameLocation": "2155:10:14", + "nodeType": "VariableDeclaration", + "scope": 1073, + "src": "2131:34:14", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + }, + "typeName": { + "id": 1018, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1017, + "name": "LinkedList.List", + "nameLocations": ["2131:10:14", "2142:4:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "2131:15:14" + }, + "referencedDeclaration": 4090, + "src": "2131:15:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + }, + "visibility": "internal" + } + ], + "id": 1023, + "initialValue": { + "baseExpression": { + "id": 1020, + "name": "claimsLists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1302, + "src": "2168:11:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_List_$4090_storage_$", + "typeString": "mapping(address => struct LinkedList.List storage ref)" + } + }, + "id": 1022, + "indexExpression": { + "id": 1021, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 990, + "src": "2180:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2168:29:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage", + "typeString": "struct LinkedList.List storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2131:66:14" + }, + { + "assignments": [1025], + "declarations": [ + { + "constant": false, + "id": 1025, + "mutability": "mutable", + "name": "claimId", + "nameLocation": "2253:7:14", + "nodeType": "VariableDeclaration", + "scope": 1073, + "src": "2245:15:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1024, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2245:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1031, + "initialValue": { + "arguments": [ + { + "id": 1027, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 990, + "src": "2282:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 1028, + "name": "claimsList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1019, + "src": "2300:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 1029, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2311:5:14", + "memberName": "nonce", + "nodeType": "MemberAccess", + "referencedDeclaration": 4087, + "src": "2300:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1026, + "name": "_buildStakeClaimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1277, + "src": "2263:18:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (address,uint256) view returns (bytes32)" + } + }, + "id": 1030, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2263:54:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2245:72:14" + }, + { + "expression": { + "id": 1045, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 1032, + "name": "claims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1296, + "src": "2327:6:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim storage ref)" + } + }, + "id": 1034, + "indexExpression": { + "id": 1033, + "name": "claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1025, + "src": "2334:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2327:15:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage", + "typeString": "struct IDataServiceFees.StakeClaim storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1036, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 992, + "src": "2378:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 1037, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "2410:5:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1038, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2416:9:14", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "2410:15:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1039, + "name": "_unlockTimestamp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 994, + "src": "2453:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 1042, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2502:1:14", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1041, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2494:7:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1040, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2494:7:14", + "typeDescriptions": {} + } + }, + "id": 1043, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2494:10:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 1035, + "name": "StakeClaim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1574, + "src": "2345:10:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_StakeClaim_$1574_storage_ptr_$", + "typeString": "type(struct IDataServiceFees.StakeClaim storage pointer)" + } + }, + "id": 1044, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": ["2370:6:14", "2399:9:14", "2439:12:14", "2483:9:14"], + "names": ["tokens", "createdAt", "releasableAt", "nextClaim"], + "nodeType": "FunctionCall", + "src": "2345:170:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "src": "2327:188:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage", + "typeString": "struct IDataServiceFees.StakeClaim storage ref" + } + }, + "id": 1046, + "nodeType": "ExpressionStatement", + "src": "2327:188:14" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1050, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 1047, + "name": "claimsList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1019, + "src": "2529:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 1048, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2540:5:14", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "2529:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 1049, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2549:1:14", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2529:21:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1059, + "nodeType": "IfStatement", + "src": "2525:70:14", + "trueBody": { + "expression": { + "id": 1057, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "baseExpression": { + "id": 1051, + "name": "claims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1296, + "src": "2552:6:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim storage ref)" + } + }, + "id": 1054, + "indexExpression": { + "expression": { + "id": 1052, + "name": "claimsList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1019, + "src": "2559:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 1053, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2570:4:14", + "memberName": "tail", + "nodeType": "MemberAccess", + "referencedDeclaration": 4085, + "src": "2559:15:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2552:23:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage", + "typeString": "struct IDataServiceFees.StakeClaim storage ref" + } + }, + "id": 1055, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "2576:9:14", + "memberName": "nextClaim", + "nodeType": "MemberAccess", + "referencedDeclaration": 1573, + "src": "2552:33:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 1056, + "name": "claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1025, + "src": "2588:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2552:43:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1058, + "nodeType": "ExpressionStatement", + "src": "2552:43:14" + } + }, + { + "expression": { + "arguments": [ + { + "id": 1063, + "name": "claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1025, + "src": "2624:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1060, + "name": "claimsList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1019, + "src": "2605:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 1062, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2616:7:14", + "memberName": "addTail", + "nodeType": "MemberAccess", + "referencedDeclaration": 4172, + "src": "2605:18:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_List_$4090_storage_ptr_$_t_bytes32_$returns$__$attached_to$_t_struct$_List_$4090_storage_ptr_$", + "typeString": "function (struct LinkedList.List storage pointer,bytes32)" + } + }, + "id": 1064, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2605:27:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1065, + "nodeType": "ExpressionStatement", + "src": "2605:27:14" + }, + { + "eventCall": { + "arguments": [ + { + "id": 1067, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 990, + "src": "2665:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1068, + "name": "claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1025, + "src": "2683:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1069, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 992, + "src": "2692:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1070, + "name": "_unlockTimestamp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 994, + "src": "2701:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1066, + "name": "StakeClaimLocked", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1585, + "src": "2648:16:14", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,bytes32,uint256,uint256)" + } + }, + "id": 1071, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2648:70:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1072, + "nodeType": "EmitStatement", + "src": "2643:75:14" + } + ] + }, + "documentation": { + "id": 988, + "nodeType": "StructuredDocumentation", + "src": "1320:540:14", + "text": " @notice Locks stake for a service provider to back a payment.\n Creates a stake claim, which is stored in a linked list by service provider.\n @dev Requirements:\n - The associated provision must have enough available tokens to lock the stake.\n Emits a {StakeClaimLocked} event.\n @param _serviceProvider The address of the service provider\n @param _tokens The amount of tokens to lock in the claim\n @param _unlockTimestamp The timestamp when the tokens can be released" + }, + "id": 1074, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_lockStake", + "nameLocation": "1874:10:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 995, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 990, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "1893:16:14", + "nodeType": "VariableDeclaration", + "scope": 1074, + "src": "1885:24:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 989, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1885:7:14", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 992, + "mutability": "mutable", + "name": "_tokens", + "nameLocation": "1919:7:14", + "nodeType": "VariableDeclaration", + "scope": 1074, + "src": "1911:15:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 991, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1911:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 994, + "mutability": "mutable", + "name": "_unlockTimestamp", + "nameLocation": "1936:16:14", + "nodeType": "VariableDeclaration", + "scope": 1074, + "src": "1928:24:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 993, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1928:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1884:69:14" + }, + "returnParameters": { + "id": 996, + "nodeType": "ParameterList", + "parameters": [], + "src": "1963:0:14" + }, + "scope": 1278, + "src": "1865:860:14", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1120, + "nodeType": "Block", + "src": "3546:439:14", + "statements": [ + { + "assignments": [1086], + "declarations": [ + { + "constant": false, + "id": 1086, + "mutability": "mutable", + "name": "claimsList", + "nameLocation": "3580:10:14", + "nodeType": "VariableDeclaration", + "scope": 1120, + "src": "3556:34:14", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + }, + "typeName": { + "id": 1085, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1084, + "name": "LinkedList.List", + "nameLocations": ["3556:10:14", "3567:4:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "3556:15:14" + }, + "referencedDeclaration": 4090, + "src": "3556:15:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + }, + "visibility": "internal" + } + ], + "id": 1090, + "initialValue": { + "baseExpression": { + "id": 1087, + "name": "claimsLists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1302, + "src": "3593:11:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_List_$4090_storage_$", + "typeString": "mapping(address => struct LinkedList.List storage ref)" + } + }, + "id": 1089, + "indexExpression": { + "id": 1088, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1077, + "src": "3605:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3593:29:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage", + "typeString": "struct LinkedList.List storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3556:66:14" + }, + { + "assignments": [1092, 1094], + "declarations": [ + { + "constant": false, + "id": 1092, + "mutability": "mutable", + "name": "claimsReleased", + "nameLocation": "3641:14:14", + "nodeType": "VariableDeclaration", + "scope": 1120, + "src": "3633:22:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1091, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3633:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1094, + "mutability": "mutable", + "name": "data", + "nameLocation": "3670:4:14", + "nodeType": "VariableDeclaration", + "scope": 1120, + "src": "3657:17:14", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1093, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3657:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 1107, + "initialValue": { + "arguments": [ + { + "id": 1097, + "name": "_getNextStakeClaim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1254, + "src": "3711:18:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + { + "id": 1098, + "name": "_processStakeClaim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1199, + "src": "3743:18:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes32,bytes memory) returns (bool,bytes memory)" + } + }, + { + "id": 1099, + "name": "_deleteStakeClaim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1211, + "src": "3775:17:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + } + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 1102, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3817:1:14", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "id": 1103, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1077, + "src": "3820:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 1100, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3806:3:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1101, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3810:6:14", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "3806:10:14", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3806:31:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 1105, + "name": "_numClaimsToRelease", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1079, + "src": "3851:19:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + }, + { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes32,bytes memory) returns (bool,bytes memory)" + }, + { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1095, + "name": "claimsList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1086, + "src": "3678:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 1096, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3689:8:14", + "memberName": "traverse", + "nodeType": "MemberAccess", + "referencedDeclaration": 4363, + "src": "3678:19:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_List_$4090_storage_ptr_$_t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$_$_t_function_internal_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$_$_t_function_internal_nonpayable$_t_bytes32_$returns$__$_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint256_$_t_bytes_memory_ptr_$attached_to$_t_struct$_List_$4090_storage_ptr_$", + "typeString": "function (struct LinkedList.List storage pointer,function (bytes32) view returns (bytes32),function (bytes32,bytes memory) returns (bool,bytes memory),function (bytes32),bytes memory,uint256) returns (uint256,bytes memory)" + } + }, + "id": 1106, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3678:202:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$", + "typeString": "tuple(uint256,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3632:248:14" + }, + { + "eventCall": { + "arguments": [ + { + "id": 1109, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1077, + "src": "3916:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1110, + "name": "claimsReleased", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1092, + "src": "3934:14:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 1113, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1094, + "src": "3961:4:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 1115, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3968:7:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1114, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3968:7:14", + "typeDescriptions": {} + } + } + ], + "id": 1116, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3967:9:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "expression": { + "id": 1111, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3950:3:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1112, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3954:6:14", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "3950:10:14", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1117, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3950:27:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1108, + "name": "StakeClaimsReleased", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1605, + "src": "3896:19:14", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256,uint256)" + } + }, + "id": 1118, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3896:82:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1119, + "nodeType": "EmitStatement", + "src": "3891:87:14" + } + ] + }, + "documentation": { + "id": 1075, + "nodeType": "StructuredDocumentation", + "src": "2731:723:14", + "text": " @notice Releases expired stake claims for a service provider.\n @dev This function can be overriden and/or disabled.\n @dev Note that the list is traversed by creation date not by releasableAt date. Traversing will stop\n when the first stake claim that is not yet expired is found even if later stake claims have expired. This\n could happen if stake claims are genereted with different unlock periods.\n @dev Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\n @param _serviceProvider The address of the service provider\n @param _numClaimsToRelease Amount of stake claims to process. If 0, all stake claims are processed." + }, + "id": 1121, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_releaseStake", + "nameLocation": "3468:13:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1080, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1077, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "3490:16:14", + "nodeType": "VariableDeclaration", + "scope": 1121, + "src": "3482:24:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1076, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3482:7:14", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1079, + "mutability": "mutable", + "name": "_numClaimsToRelease", + "nameLocation": "3516:19:14", + "nodeType": "VariableDeclaration", + "scope": 1121, + "src": "3508:27:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1078, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3508:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3481:55:14" + }, + "returnParameters": { + "id": 1081, + "nodeType": "ParameterList", + "parameters": [], + "src": "3546:0:14" + }, + "scope": 1278, + "src": "3459:526:14", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1198, + "nodeType": "Block", + "src": "4563:624:14", + "statements": [ + { + "assignments": [1135], + "declarations": [ + { + "constant": false, + "id": 1135, + "mutability": "mutable", + "name": "claim", + "nameLocation": "4591:5:14", + "nodeType": "VariableDeclaration", + "scope": 1198, + "src": "4573:23:14", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + }, + "typeName": { + "id": 1134, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1133, + "name": "StakeClaim", + "nameLocations": ["4573:10:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1574, + "src": "4573:10:14" + }, + "referencedDeclaration": 1574, + "src": "4573:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + } + }, + "visibility": "internal" + } + ], + "id": 1139, + "initialValue": { + "arguments": [ + { + "id": 1137, + "name": "_claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1124, + "src": "4614:8:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 1136, + "name": "_getStakeClaim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1240, + "src": "4599:14:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_struct$_StakeClaim_$1574_memory_ptr_$", + "typeString": "function (bytes32) view returns (struct IDataServiceFees.StakeClaim memory)" + } + }, + "id": 1138, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4599:24:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4573:50:14" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1144, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 1140, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1135, + "src": "4660:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "id": 1141, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4666:12:14", + "memberName": "releasableAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 1571, + "src": "4660:18:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "id": 1142, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "4681:5:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1143, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4687:9:14", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "4681:15:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4660:36:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1151, + "nodeType": "IfStatement", + "src": "4656:103:14", + "trueBody": { + "id": 1150, + "nodeType": "Block", + "src": "4698:61:14", + "statements": [ + { + "expression": { + "components": [ + { + "hexValue": "74727565", + "id": 1145, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4720:4:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + { + "expression": { + "id": 1146, + "name": "LinkedList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4364, + "src": "4726:10:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LinkedList_$4364_$", + "typeString": "type(library LinkedList)" + } + }, + "id": 1147, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4737:10:14", + "memberName": "NULL_BYTES", + "nodeType": "MemberAccess", + "referencedDeclaration": 4097, + "src": "4726:21:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "id": 1148, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4719:29:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "functionReturnParameters": 1132, + "id": 1149, + "nodeType": "Return", + "src": "4712:36:14" + } + ] + } + }, + { + "assignments": [1153, 1155], + "declarations": [ + { + "constant": false, + "id": 1153, + "mutability": "mutable", + "name": "tokensClaimed", + "nameLocation": "4796:13:14", + "nodeType": "VariableDeclaration", + "scope": 1198, + "src": "4788:21:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1152, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4788:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1155, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4819:15:14", + "nodeType": "VariableDeclaration", + "scope": 1198, + "src": "4811:23:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1154, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4811:7:14", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 1165, + "initialValue": { + "arguments": [ + { + "id": 1158, + "name": "_acc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1126, + "src": "4849:4:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 1160, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4856:7:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1159, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4856:7:14", + "typeDescriptions": {} + } + }, + { + "id": 1162, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4865:7:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1161, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4865:7:14", + "typeDescriptions": {} + } + } + ], + "id": 1163, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4855:18:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_uint256_$_$_t_type$_t_address_$_$", + "typeString": "tuple(type(uint256),type(address))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_uint256_$_$_t_type$_t_address_$_$", + "typeString": "tuple(type(uint256),type(address))" + } + ], + "expression": { + "id": 1156, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "4838:3:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1157, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4842:6:14", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "4838:10:14", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1164, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4838:36:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_address_payable_$", + "typeString": "tuple(uint256,address payable)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4787:87:14" + }, + { + "expression": { + "arguments": [ + { + "id": 1169, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1155, + "src": "4933:15:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 1170, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1135, + "src": "4950:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "id": 1171, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4956:6:14", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 1567, + "src": "4950:12:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1166, + "name": "feesProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1290, + "src": "4904:20:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4925:7:14", + "memberName": "release", + "nodeType": "MemberAccess", + "referencedDeclaration": 1764, + "src": "4904:28:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_uint256_$_$_t_address_$_t_uint256_$returns$__$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),address,uint256)" + } + }, + "id": 1172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4904:59:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1173, + "nodeType": "ExpressionStatement", + "src": "4904:59:14" + }, + { + "eventCall": { + "arguments": [ + { + "id": 1175, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1155, + "src": "4997:15:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1176, + "name": "_claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1124, + "src": "5014:8:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 1177, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1135, + "src": "5024:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "id": 1178, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5030:6:14", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 1567, + "src": "5024:12:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 1179, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1135, + "src": "5038:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "id": 1180, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5044:12:14", + "memberName": "releasableAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 1571, + "src": "5038:18:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1174, + "name": "StakeClaimReleased", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1596, + "src": "4978:18:14", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,bytes32,uint256,uint256)" + } + }, + "id": 1181, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4978:79:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1182, + "nodeType": "EmitStatement", + "src": "4973:84:14" + }, + { + "expression": { + "id": 1192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1183, + "name": "_acc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1126, + "src": "5086:4:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1189, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1186, + "name": "tokensClaimed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1153, + "src": "5104:13:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "expression": { + "id": 1187, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1135, + "src": "5120:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "id": 1188, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5126:6:14", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 1567, + "src": "5120:12:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5104:28:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1190, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1155, + "src": "5134:15:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 1184, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "5093:3:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1185, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "5097:6:14", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "5093:10:14", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1191, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5093:57:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "src": "5086:64:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 1193, + "nodeType": "ExpressionStatement", + "src": "5086:64:14" + }, + { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 1194, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5168:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "id": 1195, + "name": "_acc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1126, + "src": "5175:4:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "id": 1196, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5167:13:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "functionReturnParameters": 1132, + "id": 1197, + "nodeType": "Return", + "src": "5160:20:14" + } + ] + }, + "documentation": { + "id": 1122, + "nodeType": "StructuredDocumentation", + "src": "3991:465:14", + "text": " @notice Processes a stake claim, releasing the tokens if the claim has expired.\n @dev This function is used as a callback in the stake claims linked list traversal.\n @param _claimId The id of the stake claim\n @param _acc The accumulator for the stake claims being processed\n @return Whether the stake claim is still locked, indicating that the traversal should continue or stop.\n @return The updated accumulator data" + }, + "id": 1199, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_processStakeClaim", + "nameLocation": "4470:18:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1127, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1124, + "mutability": "mutable", + "name": "_claimId", + "nameLocation": "4497:8:14", + "nodeType": "VariableDeclaration", + "scope": 1199, + "src": "4489:16:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1123, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4489:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1126, + "mutability": "mutable", + "name": "_acc", + "nameLocation": "4520:4:14", + "nodeType": "VariableDeclaration", + "scope": 1199, + "src": "4507:17:14", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1125, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4507:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4488:37:14" + }, + "returnParameters": { + "id": 1132, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1129, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1199, + "src": "4543:4:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1128, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4543:4:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1131, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1199, + "src": "4549:12:14", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1130, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4549:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4542:20:14" + }, + "scope": 1278, + "src": "4461:726:14", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 1210, + "nodeType": "Block", + "src": "5450:40:14", + "statements": [ + { + "expression": { + "id": 1208, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "delete", + "prefix": true, + "src": "5460:23:14", + "subExpression": { + "baseExpression": { + "id": 1205, + "name": "claims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1296, + "src": "5467:6:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim storage ref)" + } + }, + "id": 1207, + "indexExpression": { + "id": 1206, + "name": "_claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1202, + "src": "5474:8:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5467:16:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage", + "typeString": "struct IDataServiceFees.StakeClaim storage ref" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1209, + "nodeType": "ExpressionStatement", + "src": "5460:23:14" + } + ] + }, + "documentation": { + "id": 1200, + "nodeType": "StructuredDocumentation", + "src": "5193:199:14", + "text": " @notice Deletes a stake claim.\n @dev This function is used as a callback in the stake claims linked list traversal.\n @param _claimId The ID of the stake claim to delete" + }, + "id": 1211, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_deleteStakeClaim", + "nameLocation": "5406:17:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1203, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1202, + "mutability": "mutable", + "name": "_claimId", + "nameLocation": "5432:8:14", + "nodeType": "VariableDeclaration", + "scope": 1211, + "src": "5424:16:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1201, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5424:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5423:18:14" + }, + "returnParameters": { + "id": 1204, + "nodeType": "ParameterList", + "parameters": [], + "src": "5450:0:14" + }, + "scope": 1278, + "src": "5397:93:14", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 1239, + "nodeType": "Block", + "src": "5732:160:14", + "statements": [ + { + "assignments": [1222], + "declarations": [ + { + "constant": false, + "id": 1222, + "mutability": "mutable", + "name": "claim", + "nameLocation": "5760:5:14", + "nodeType": "VariableDeclaration", + "scope": 1239, + "src": "5742:23:14", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + }, + "typeName": { + "id": 1221, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1220, + "name": "StakeClaim", + "nameLocations": ["5742:10:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1574, + "src": "5742:10:14" + }, + "referencedDeclaration": 1574, + "src": "5742:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + } + }, + "visibility": "internal" + } + ], + "id": 1226, + "initialValue": { + "baseExpression": { + "id": 1223, + "name": "claims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1296, + "src": "5768:6:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim storage ref)" + } + }, + "id": 1225, + "indexExpression": { + "id": 1224, + "name": "_claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1214, + "src": "5775:8:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5768:16:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage", + "typeString": "struct IDataServiceFees.StakeClaim storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5742:42:14" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1231, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 1228, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1222, + "src": "5802:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "id": 1229, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5808:9:14", + "memberName": "createdAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 1569, + "src": "5802:15:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 1230, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5821:1:14", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5802:20:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 1233, + "name": "_claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1214, + "src": "5853:8:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 1232, + "name": "DataServiceFeesClaimNotFound", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1610, + "src": "5824:28:14", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 1234, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5824:38:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 1227, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5794:7:14", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5794:69:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1236, + "nodeType": "ExpressionStatement", + "src": "5794:69:14" + }, + { + "expression": { + "id": 1237, + "name": "claim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1222, + "src": "5880:5:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim memory" + } + }, + "functionReturnParameters": 1219, + "id": 1238, + "nodeType": "Return", + "src": "5873:12:14" + } + ] + }, + "documentation": { + "id": 1212, + "nodeType": "StructuredDocumentation", + "src": "5496:148:14", + "text": " @notice Gets the details of a stake claim\n @param _claimId The ID of the stake claim\n @return The stake claim details" + }, + "id": 1240, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getStakeClaim", + "nameLocation": "5658:14:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1215, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1214, + "mutability": "mutable", + "name": "_claimId", + "nameLocation": "5681:8:14", + "nodeType": "VariableDeclaration", + "scope": 1240, + "src": "5673:16:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1213, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5673:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5672:18:14" + }, + "returnParameters": { + "id": 1219, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1218, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1240, + "src": "5713:17:14", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_memory_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + }, + "typeName": { + "id": 1217, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1216, + "name": "StakeClaim", + "nameLocations": ["5713:10:14"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1574, + "src": "5713:10:14" + }, + "referencedDeclaration": 1574, + "src": "5713:10:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + } + }, + "visibility": "internal" + } + ], + "src": "5712:19:14" + }, + "scope": 1278, + "src": "5649:243:14", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 1253, + "nodeType": "Block", + "src": "6230:50:14", + "statements": [ + { + "expression": { + "expression": { + "baseExpression": { + "id": 1248, + "name": "claims", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1296, + "src": "6247:6:14", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim storage ref)" + } + }, + "id": 1250, + "indexExpression": { + "id": 1249, + "name": "_claimId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1243, + "src": "6254:8:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6247:16:14", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage", + "typeString": "struct IDataServiceFees.StakeClaim storage ref" + } + }, + "id": 1251, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6264:9:14", + "memberName": "nextClaim", + "nodeType": "MemberAccess", + "referencedDeclaration": 1573, + "src": "6247:26:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 1247, + "id": 1252, + "nodeType": "Return", + "src": "6240:33:14" + } + ] + }, + "documentation": { + "id": 1241, + "nodeType": "StructuredDocumentation", + "src": "5898:250:14", + "text": " @notice Gets the next stake claim in the linked list\n @dev This function is used as a callback in the stake claims linked list traversal.\n @param _claimId The ID of the stake claim\n @return The next stake claim ID" + }, + "id": 1254, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getNextStakeClaim", + "nameLocation": "6162:18:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1244, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1243, + "mutability": "mutable", + "name": "_claimId", + "nameLocation": "6189:8:14", + "nodeType": "VariableDeclaration", + "scope": 1254, + "src": "6181:16:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1242, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6181:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "6180:18:14" + }, + "returnParameters": { + "id": 1247, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1246, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1254, + "src": "6221:7:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1245, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6221:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "6220:9:14" + }, + "scope": 1278, + "src": "6153:127:14", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 1276, + "nodeType": "Block", + "src": "6591:92:14", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 1269, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "6643:4:14", + "typeDescriptions": { + "typeIdentifier": "t_contract$_DataServiceFees_$1278", + "typeString": "contract DataServiceFees" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_DataServiceFees_$1278", + "typeString": "contract DataServiceFees" + } + ], + "id": 1268, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6635:7:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1267, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6635:7:14", + "typeDescriptions": {} + } + }, + "id": 1270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6635:13:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1271, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1257, + "src": "6650:16:14", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1272, + "name": "_nonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1259, + "src": "6668:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1265, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "6618:3:14", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1266, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6622:12:14", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "6618:16:14", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1273, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6618:57:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 1264, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "6608:9:14", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 1274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6608:68:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 1263, + "id": 1275, + "nodeType": "Return", + "src": "6601:75:14" + } + ] + }, + "documentation": { + "id": 1255, + "nodeType": "StructuredDocumentation", + "src": "6286:199:14", + "text": " @notice Builds a stake claim ID\n @param _serviceProvider The address of the service provider\n @param _nonce A nonce of the stake claim\n @return The stake claim ID" + }, + "id": 1277, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_buildStakeClaimId", + "nameLocation": "6499:18:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1260, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1257, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "6526:16:14", + "nodeType": "VariableDeclaration", + "scope": 1277, + "src": "6518:24:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1256, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6518:7:14", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1259, + "mutability": "mutable", + "name": "_nonce", + "nameLocation": "6552:6:14", + "nodeType": "VariableDeclaration", + "scope": 1277, + "src": "6544:14:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1258, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6544:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6517:42:14" + }, + "returnParameters": { + "id": 1263, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1262, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1277, + "src": "6582:7:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1261, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6582:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "6581:9:14" + }, + "scope": 1278, + "src": "6490:193:14", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 1279, + "src": "937:5748:14", + "usedErrors": [1610, 1613, 1667, 1918, 1925, 1932, 1937, 4104, 4110, 4655, 5140, 5143], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473, 1585, 1596, 1605, 1888, 1893, 1900, 1907, 4650, 5148] + } + ], + "src": "45:6641:14" + }, + "id": 14 + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol", + "exportedSymbols": { + "DataServiceFeesV1Storage": [1308], + "IDataServiceFees": [1620], + "LinkedList": [4364] + }, + "id": 1309, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1280, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:15" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol", + "file": "../interfaces/IDataServiceFees.sol", + "id": 1282, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1309, + "sourceUnit": 1621, + "src": "70:70:15", + "symbolAliases": [ + { + "foreign": { + "id": 1281, + "name": "IDataServiceFees", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1620, + "src": "79:16:15", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/LinkedList.sol", + "file": "../../libraries/LinkedList.sol", + "id": 1284, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1309, + "sourceUnit": 4365, + "src": "142:60:15", + "symbolAliases": [ + { + "foreign": { + "id": 1283, + "name": "LinkedList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4364, + "src": "151:10:15", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "DataServiceFeesV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 1285, + "nodeType": "StructuredDocumentation", + "src": "204:218:15", + "text": " @title Storage layout for the {DataServiceFees} extension contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 1308, + "linearizedBaseContracts": [1308], + "name": "DataServiceFeesV1Storage", + "nameLocation": "441:24:15", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 1286, + "nodeType": "StructuredDocumentation", + "src": "472:81:15", + "text": "@notice The amount of tokens locked in stake claims for each service provider" + }, + "functionSelector": "cbe5f3f2", + "id": 1290, + "mutability": "mutable", + "name": "feesProvisionTracker", + "nameLocation": "616:20:15", + "nodeType": "VariableDeclaration", + "scope": 1308, + "src": "558:78:15", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 1289, + "keyName": "serviceProvider", + "keyNameLocation": "574:15:15", + "keyType": { + "id": 1287, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "566:7:15", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "558:50:15", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "tokens", + "valueNameLocation": "601:6:15", + "valueType": { + "id": 1288, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "593:7:15", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 1291, + "nodeType": "StructuredDocumentation", + "src": "643:79:15", + "text": "@notice List of all locked stake claims to be released to service providers" + }, + "functionSelector": "eff0f592", + "id": 1296, + "mutability": "mutable", + "name": "claims", + "nameLocation": "796:6:15", + "nodeType": "VariableDeclaration", + "scope": 1308, + "src": "727:75:15", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim)" + }, + "typeName": { + "id": 1295, + "keyName": "claimId", + "keyNameLocation": "743:7:15", + "keyType": { + "id": 1292, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "735:7:15", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Mapping", + "src": "727:61:15", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_StakeClaim_$1574_storage_$", + "typeString": "mapping(bytes32 => struct IDataServiceFees.StakeClaim)" + }, + "valueName": "claim", + "valueNameLocation": "782:5:15", + "valueType": { + "id": 1294, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1293, + "name": "IDataServiceFees.StakeClaim", + "nameLocations": ["754:16:15", "771:10:15"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1574, + "src": "754:27:15" + }, + "referencedDeclaration": 1574, + "src": "754:27:15", + "typeDescriptions": { + "typeIdentifier": "t_struct$_StakeClaim_$1574_storage_ptr", + "typeString": "struct IDataServiceFees.StakeClaim" + } + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 1297, + "nodeType": "StructuredDocumentation", + "src": "809:60:15", + "text": "@notice Service providers registered in the data service" + }, + "functionSelector": "13c474c9", + "id": 1302, + "mutability": "mutable", + "name": "claimsLists", + "nameLocation": "938:11:15", + "nodeType": "VariableDeclaration", + "scope": 1308, + "src": "874:75:15", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_List_$4090_storage_$", + "typeString": "mapping(address => struct LinkedList.List)" + }, + "typeName": { + "id": 1301, + "keyName": "serviceProvider", + "keyNameLocation": "890:15:15", + "keyType": { + "id": 1298, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "882:7:15", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "874:56:15", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_List_$4090_storage_$", + "typeString": "mapping(address => struct LinkedList.List)" + }, + "valueName": "list", + "valueNameLocation": "925:4:15", + "valueType": { + "id": 1300, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1299, + "name": "LinkedList.List", + "nameLocations": ["909:10:15", "920:4:15"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "909:15:15" + }, + "referencedDeclaration": 4090, + "src": "909:15:15", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 1303, + "nodeType": "StructuredDocumentation", + "src": "956:158:15", + "text": "@dev Gap to allow adding variables in future upgrades\n Note that this contract is not upgradeable but might be inherited by an upgradeable contract" + }, + "id": 1307, + "mutability": "mutable", + "name": "__gap", + "nameLocation": "1139:5:15", + "nodeType": "VariableDeclaration", + "scope": 1308, + "src": "1119:25:15", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage", + "typeString": "uint256[50]" + }, + "typeName": { + "baseType": { + "id": 1304, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1119:7:15", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1306, + "length": { + "hexValue": "3530", + "id": 1305, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1127:2:15", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "nodeType": "ArrayTypeName", + "src": "1119:11:15", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr", + "typeString": "uint256[50]" + } + }, + "visibility": "private" + } + ], + "scope": 1309, + "src": "423:724:15", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:1103:15" + }, + "id": 15 + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol", + "exportedSymbols": { + "DataService": [936], + "DataServicePausableUpgradeable": [1425], + "IDataServicePausable": [1655], + "PausableUpgradeable": [5700] + }, + "id": 1426, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1310, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:16" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol", + "file": "../interfaces/IDataServicePausable.sol", + "id": 1312, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1426, + "sourceUnit": 1656, + "src": "70:78:16", + "symbolAliases": [ + { + "foreign": { + "id": 1311, + "name": "IDataServicePausable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1655, + "src": "79:20:16", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol", + "file": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol", + "id": 1314, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1426, + "sourceUnit": 5701, + "src": "150:104:16", + "symbolAliases": [ + { + "foreign": { + "id": 1313, + "name": "PausableUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5700, + "src": "159:19:16", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/DataService.sol", + "file": "../DataService.sol", + "id": 1316, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1426, + "sourceUnit": 937, + "src": "255:49:16", + "symbolAliases": [ + { + "foreign": { + "id": 1315, + "name": "DataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 936, + "src": "264:11:16", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 1318, + "name": "PausableUpgradeable", + "nameLocations": ["823:19:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5700, + "src": "823:19:16" + }, + "id": 1319, + "nodeType": "InheritanceSpecifier", + "src": "823:19:16" + }, + { + "baseName": { + "id": 1320, + "name": "DataService", + "nameLocations": ["844:11:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 936, + "src": "844:11:16" + }, + "id": 1321, + "nodeType": "InheritanceSpecifier", + "src": "844:11:16" + }, + { + "baseName": { + "id": 1322, + "name": "IDataServicePausable", + "nameLocations": ["857:20:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1655, + "src": "857:20:16" + }, + "id": 1323, + "nodeType": "InheritanceSpecifier", + "src": "857:20:16" + } + ], + "canonicalName": "DataServicePausableUpgradeable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 1317, + "nodeType": "StructuredDocumentation", + "src": "306:464:16", + "text": " @title DataServicePausableUpgradeable contract\n @dev Implementation of the {IDataServicePausable} interface.\n @dev Upgradeable version of the {DataServicePausable} contract.\n @dev This contract inherits from {DataService} which needs to be initialized, please see\n {DataService} for detailed instructions.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 1425, + "linearizedBaseContracts": [1425, 1655, 936, 1557, 945, 2395, 2425, 4928, 5700, 5437, 5391], + "name": "DataServicePausableUpgradeable", + "nameLocation": "789:30:16", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 1324, + "nodeType": "StructuredDocumentation", + "src": "884:60:16", + "text": "@notice List of pause guardians and their allowed status" + }, + "functionSelector": "9384e078", + "id": 1328, + "mutability": "mutable", + "name": "pauseGuardians", + "nameLocation": "1003:14:16", + "nodeType": "VariableDeclaration", + "scope": 1425, + "src": "949:68:16", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "typeName": { + "id": 1327, + "keyName": "pauseGuardian", + "keyNameLocation": "965:13:16", + "keyType": { + "id": 1325, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "957:7:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "949:46:16", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "valueName": "allowed", + "valueNameLocation": "987:7:16", + "valueType": { + "id": 1326, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "982:4:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 1329, + "nodeType": "StructuredDocumentation", + "src": "1024:57:16", + "text": "@dev Gap to allow adding variables in future upgrades" + }, + "id": 1333, + "mutability": "mutable", + "name": "__gap", + "nameLocation": "1106:5:16", + "nodeType": "VariableDeclaration", + "scope": 1425, + "src": "1086:25:16", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage", + "typeString": "uint256[50]" + }, + "typeName": { + "baseType": { + "id": 1330, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1086:7:16", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1332, + "length": { + "hexValue": "3530", + "id": 1331, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1094:2:16", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "nodeType": "ArrayTypeName", + "src": "1086:11:16", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr", + "typeString": "uint256[50]" + } + }, + "visibility": "private" + }, + { + "body": { + "id": 1348, + "nodeType": "Block", + "src": "1220:112:16", + "statements": [ + { + "expression": { + "arguments": [ + { + "baseExpression": { + "id": 1337, + "name": "pauseGuardians", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1328, + "src": "1238:14:16", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 1340, + "indexExpression": { + "expression": { + "id": 1338, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1253:3:16", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1339, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1257:6:16", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "1253:10:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1238:26:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 1342, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1302:3:16", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1306:6:16", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "1302:10:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1341, + "name": "DataServicePausableNotPauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1639, + "src": "1266:35:16", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 1344, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1266:47:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 1336, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "1230:7:16", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1345, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1230:84:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1346, + "nodeType": "ExpressionStatement", + "src": "1230:84:16" + }, + { + "id": 1347, + "nodeType": "PlaceholderStatement", + "src": "1324:1:16" + } + ] + }, + "documentation": { + "id": 1334, + "nodeType": "StructuredDocumentation", + "src": "1118:68:16", + "text": " @notice Checks if the caller is a pause guardian." + }, + "id": 1349, + "name": "onlyPauseGuardian", + "nameLocation": "1200:17:16", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 1335, + "nodeType": "ParameterList", + "parameters": [], + "src": "1217:2:16" + }, + "src": "1191:141:16", + "virtual": false, + "visibility": "internal" + }, + { + "baseFunctions": [1650], + "body": { + "id": 1359, + "nodeType": "Block", + "src": "1432:25:16", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1356, + "name": "_pause", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5675, + "src": "1442:6:16", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 1357, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1442:8:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1358, + "nodeType": "ExpressionStatement", + "src": "1442:8:16" + } + ] + }, + "documentation": { + "id": 1350, + "nodeType": "StructuredDocumentation", + "src": "1338:36:16", + "text": "@inheritdoc IDataServicePausable" + }, + "functionSelector": "8456cb59", + "id": 1360, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 1354, + "kind": "modifierInvocation", + "modifierName": { + "id": 1353, + "name": "onlyPauseGuardian", + "nameLocations": ["1414:17:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1349, + "src": "1414:17:16" + }, + "nodeType": "ModifierInvocation", + "src": "1414:17:16" + } + ], + "name": "pause", + "nameLocation": "1388:5:16", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 1352, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1405:8:16" + }, + "parameters": { + "id": 1351, + "nodeType": "ParameterList", + "parameters": [], + "src": "1393:2:16" + }, + "returnParameters": { + "id": 1355, + "nodeType": "ParameterList", + "parameters": [], + "src": "1432:0:16" + }, + "scope": 1425, + "src": "1379:78:16", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1654], + "body": { + "id": 1370, + "nodeType": "Block", + "src": "1559:27:16", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1367, + "name": "_unpause", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5699, + "src": "1569:8:16", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 1368, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1569:10:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1369, + "nodeType": "ExpressionStatement", + "src": "1569:10:16" + } + ] + }, + "documentation": { + "id": 1361, + "nodeType": "StructuredDocumentation", + "src": "1463:36:16", + "text": "@inheritdoc IDataServicePausable" + }, + "functionSelector": "3f4ba83a", + "id": 1371, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 1365, + "kind": "modifierInvocation", + "modifierName": { + "id": 1364, + "name": "onlyPauseGuardian", + "nameLocations": ["1541:17:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1349, + "src": "1541:17:16" + }, + "nodeType": "ModifierInvocation", + "src": "1541:17:16" + } + ], + "name": "unpause", + "nameLocation": "1513:7:16", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 1363, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1532:8:16" + }, + "parameters": { + "id": 1362, + "nodeType": "ParameterList", + "parameters": [], + "src": "1520:2:16" + }, + "returnParameters": { + "id": 1366, + "nodeType": "ParameterList", + "parameters": [], + "src": "1559:0:16" + }, + "scope": 1425, + "src": "1504:82:16", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 1383, + "nodeType": "Block", + "src": "1733:92:16", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1377, + "name": "__Pausable_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5610, + "src": "1743:25:16", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 1378, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1743:27:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1379, + "nodeType": "ExpressionStatement", + "src": "1743:27:16" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1380, + "name": "__DataServicePausable_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1391, + "src": "1780:36:16", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 1381, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1780:38:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1382, + "nodeType": "ExpressionStatement", + "src": "1780:38:16" + } + ] + }, + "documentation": { + "id": 1372, + "nodeType": "StructuredDocumentation", + "src": "1592:72:16", + "text": " @notice Initializes the contract and parent contracts" + }, + "id": 1384, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 1375, + "kind": "modifierInvocation", + "modifierName": { + "id": 1374, + "name": "onlyInitializing", + "nameLocations": ["1716:16:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "1716:16:16" + }, + "nodeType": "ModifierInvocation", + "src": "1716:16:16" + } + ], + "name": "__DataServicePausable_init", + "nameLocation": "1678:26:16", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1373, + "nodeType": "ParameterList", + "parameters": [], + "src": "1704:2:16" + }, + "returnParameters": { + "id": 1376, + "nodeType": "ParameterList", + "parameters": [], + "src": "1733:0:16" + }, + "scope": 1425, + "src": "1669:156:16", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1390, + "nodeType": "Block", + "src": "1961:2:16", + "statements": [] + }, + "documentation": { + "id": 1385, + "nodeType": "StructuredDocumentation", + "src": "1831:51:16", + "text": " @notice Initializes the contract" + }, + "id": 1391, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 1388, + "kind": "modifierInvocation", + "modifierName": { + "id": 1387, + "name": "onlyInitializing", + "nameLocations": ["1944:16:16"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "1944:16:16" + }, + "nodeType": "ModifierInvocation", + "src": "1944:16:16" + } + ], + "name": "__DataServicePausable_init_unchained", + "nameLocation": "1896:36:16", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1386, + "nodeType": "ParameterList", + "parameters": [], + "src": "1932:2:16" + }, + "returnParameters": { + "id": 1389, + "nodeType": "ParameterList", + "parameters": [], + "src": "1961:0:16" + }, + "scope": 1425, + "src": "1887:76:16", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1423, + "nodeType": "Block", + "src": "2369:279:16", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 1405, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 1400, + "name": "pauseGuardians", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1328, + "src": "2400:14:16", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 1402, + "indexExpression": { + "id": 1401, + "name": "_pauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1394, + "src": "2415:14:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2400:30:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1404, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2434:9:16", + "subExpression": { + "id": 1403, + "name": "_allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1396, + "src": "2435:8:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2400:43:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 1407, + "name": "_pauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1394, + "src": "2498:14:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1408, + "name": "_allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1396, + "src": "2514:8:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1406, + "name": "DataServicePausablePauseGuardianNoChange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1646, + "src": "2457:40:16", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_bool_$returns$_t_error_$", + "typeString": "function (address,bool) pure returns (error)" + } + }, + "id": 1409, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2457:66:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 1399, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2379:7:16", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1410, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2379:154:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1411, + "nodeType": "ExpressionStatement", + "src": "2379:154:16" + }, + { + "expression": { + "id": 1416, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 1412, + "name": "pauseGuardians", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1328, + "src": "2543:14:16", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 1414, + "indexExpression": { + "id": 1413, + "name": "_pauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1394, + "src": "2558:14:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2543:30:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 1415, + "name": "_allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1396, + "src": "2576:8:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2543:41:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1417, + "nodeType": "ExpressionStatement", + "src": "2543:41:16" + }, + { + "eventCall": { + "arguments": [ + { + "id": 1419, + "name": "_pauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1394, + "src": "2616:14:16", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1420, + "name": "_allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1396, + "src": "2632:8:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1418, + "name": "PauseGuardianSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1634, + "src": "2599:16:16", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bool_$returns$__$", + "typeString": "function (address,bool)" + } + }, + "id": 1421, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2599:42:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1422, + "nodeType": "EmitStatement", + "src": "2594:47:16" + } + ] + }, + "documentation": { + "id": 1392, + "nodeType": "StructuredDocumentation", + "src": "1969:320:16", + "text": " @notice Sets a pause guardian.\n @dev Internal function to be used by the derived contract to set pause guardians.\n Emits a {PauseGuardianSet} event.\n @param _pauseGuardian The address of the pause guardian\n @param _allowed The allowed status of the pause guardian" + }, + "id": 1424, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setPauseGuardian", + "nameLocation": "2303:17:16", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1397, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1394, + "mutability": "mutable", + "name": "_pauseGuardian", + "nameLocation": "2329:14:16", + "nodeType": "VariableDeclaration", + "scope": 1424, + "src": "2321:22:16", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1393, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2321:7:16", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1396, + "mutability": "mutable", + "name": "_allowed", + "nameLocation": "2350:8:16", + "nodeType": "VariableDeclaration", + "scope": 1424, + "src": "2345:13:16", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1395, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2345:4:16", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2320:39:16" + }, + "returnParameters": { + "id": 1398, + "nodeType": "ParameterList", + "parameters": [], + "src": "2369:0:16" + }, + "scope": 1425, + "src": "2294:354:16", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 1426, + "src": "771:1879:16", + "usedErrors": [1639, 1646, 1918, 1925, 1932, 1937, 4655, 5140, 5143, 5579, 5582], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473, 1634, 1888, 1893, 1900, 1907, 4650, 5148, 5571, 5576] + } + ], + "src": "45:2606:16" + }, + "id": 16 + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol", + "exportedSymbols": { + "IDataService": [1557], + "IGraphPayments": [2489] + }, + "id": 1558, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1427, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:17" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "../../interfaces/IGraphPayments.sol", + "id": 1429, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1558, + "sourceUnit": 2490, + "src": "70:69:17", + "symbolAliases": [ + { + "foreign": { + "id": 1428, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "79:14:17", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IDataService", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 1430, + "nodeType": "StructuredDocumentation", + "src": "141:895:17", + "text": " @title Interface of the base {DataService} contract as defined by the Graph Horizon specification.\n @notice This interface provides a guardrail for contracts that use the Data Service framework\n to implement a data service on Graph Horizon. Much of the specification is intentionally loose\n to allow for greater flexibility when designing a data service. It's not possible to guarantee that\n an implementation will honor the Data Service framework guidelines so it's advised to always review\n the implementation code and the documentation.\n @dev This interface is expected to be inherited and extended by a data service interface. It can be\n used to interact with it however it's advised to use the more specific parent interface.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 1557, + "linearizedBaseContracts": [1557], + "name": "IDataService", + "nameLocation": "1047:12:17", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 1431, + "nodeType": "StructuredDocumentation", + "src": "1066:229:17", + "text": " @notice Emitted when a service provider is registered with the data service.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "eventSelector": "159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa", + "id": 1437, + "name": "ServiceProviderRegistered", + "nameLocation": "1306:25:17", + "nodeType": "EventDefinition", + "parameters": { + "id": 1436, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1433, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1348:15:17", + "nodeType": "VariableDeclaration", + "scope": 1437, + "src": "1332:31:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1432, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1332:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1435, + "indexed": false, + "mutability": "mutable", + "name": "data", + "nameLocation": "1371:4:17", + "nodeType": "VariableDeclaration", + "scope": 1437, + "src": "1365:10:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1434, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1365:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1331:45:17" + }, + "src": "1300:77:17" + }, + { + "anonymous": false, + "documentation": { + "id": 1438, + "nodeType": "StructuredDocumentation", + "src": "1383:182:17", + "text": " @notice Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\n @param serviceProvider The address of the service provider." + }, + "eventSelector": "f53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a939", + "id": 1442, + "name": "ProvisionPendingParametersAccepted", + "nameLocation": "1576:34:17", + "nodeType": "EventDefinition", + "parameters": { + "id": 1441, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1440, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1627:15:17", + "nodeType": "VariableDeclaration", + "scope": 1442, + "src": "1611:31:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1439, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1611:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1610:33:17" + }, + "src": "1570:74:17" + }, + { + "anonymous": false, + "documentation": { + "id": 1443, + "nodeType": "StructuredDocumentation", + "src": "1650:222:17", + "text": " @notice Emitted when a service provider starts providing the service.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "eventSelector": "d3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e7", + "id": 1449, + "name": "ServiceStarted", + "nameLocation": "1883:14:17", + "nodeType": "EventDefinition", + "parameters": { + "id": 1448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1445, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1914:15:17", + "nodeType": "VariableDeclaration", + "scope": 1449, + "src": "1898:31:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1444, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1898:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1447, + "indexed": false, + "mutability": "mutable", + "name": "data", + "nameLocation": "1937:4:17", + "nodeType": "VariableDeclaration", + "scope": 1449, + "src": "1931:10:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1446, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1931:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1897:45:17" + }, + "src": "1877:66:17" + }, + { + "anonymous": false, + "documentation": { + "id": 1450, + "nodeType": "StructuredDocumentation", + "src": "1949:221:17", + "text": " @notice Emitted when a service provider stops providing the service.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "eventSelector": "73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a", + "id": 1456, + "name": "ServiceStopped", + "nameLocation": "2181:14:17", + "nodeType": "EventDefinition", + "parameters": { + "id": 1455, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1452, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2212:15:17", + "nodeType": "VariableDeclaration", + "scope": 1456, + "src": "2196:31:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1451, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2196:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1454, + "indexed": false, + "mutability": "mutable", + "name": "data", + "nameLocation": "2235:4:17", + "nodeType": "VariableDeclaration", + "scope": 1456, + "src": "2229:10:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1453, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2229:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2195:45:17" + }, + "src": "2175:66:17" + }, + { + "anonymous": false, + "documentation": { + "id": 1457, + "nodeType": "StructuredDocumentation", + "src": "2247:276:17", + "text": " @notice Emitted when a service provider collects payment.\n @param serviceProvider The address of the service provider.\n @param feeType The type of fee to collect as defined in {GraphPayments}.\n @param tokens The amount of tokens collected." + }, + "eventSelector": "54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff5", + "id": 1466, + "name": "ServicePaymentCollected", + "nameLocation": "2534:23:17", + "nodeType": "EventDefinition", + "parameters": { + "id": 1465, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1459, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2583:15:17", + "nodeType": "VariableDeclaration", + "scope": 1466, + "src": "2567:31:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1458, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2567:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1462, + "indexed": true, + "mutability": "mutable", + "name": "feeType", + "nameLocation": "2644:7:17", + "nodeType": "VariableDeclaration", + "scope": 1466, + "src": "2608:43:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 1461, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1460, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["2608:14:17", "2623:12:17"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "2608:27:17" + }, + "referencedDeclaration": 2433, + "src": "2608:27:17", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1464, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2669:6:17", + "nodeType": "VariableDeclaration", + "scope": 1466, + "src": "2661:14:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1463, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2661:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2557:124:17" + }, + "src": "2528:154:17" + }, + { + "anonymous": false, + "documentation": { + "id": 1467, + "nodeType": "StructuredDocumentation", + "src": "2688:188:17", + "text": " @notice Emitted when a service provider is slashed.\n @param serviceProvider The address of the service provider.\n @param tokens The amount of tokens slashed." + }, + "eventSelector": "02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c58", + "id": 1473, + "name": "ServiceProviderSlashed", + "nameLocation": "2887:22:17", + "nodeType": "EventDefinition", + "parameters": { + "id": 1472, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1469, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2926:15:17", + "nodeType": "VariableDeclaration", + "scope": 1473, + "src": "2910:31:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1468, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2910:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1471, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2951:6:17", + "nodeType": "VariableDeclaration", + "scope": 1473, + "src": "2943:14:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1470, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2943:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2909:49:17" + }, + "src": "2881:78:17" + }, + { + "documentation": { + "id": 1474, + "nodeType": "StructuredDocumentation", + "src": "2965:903:17", + "text": " @notice Registers a service provider with the data service. The service provider can now\n start providing the service.\n @dev Before registering, the service provider must have created a provision in the\n Graph Horizon staking contract with parameters that are compatible with the data service.\n Verifies provision parameters and rejects registration in the event they are not valid.\n Emits a {ServiceProviderRegistered} event.\n NOTE: Failing to accept the provision will result in the service provider operating\n on an unverified provision. Depending on of the data service this can be a security\n risk as the protocol won't be able to guarantee economic security for the consumer.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "functionSelector": "24b8fbf6", + "id": 1481, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "register", + "nameLocation": "3882:8:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1479, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1476, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3899:15:17", + "nodeType": "VariableDeclaration", + "scope": 1481, + "src": "3891:23:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1475, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3891:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1478, + "mutability": "mutable", + "name": "data", + "nameLocation": "3931:4:17", + "nodeType": "VariableDeclaration", + "scope": 1481, + "src": "3916:19:17", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1477, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3916:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3890:46:17" + }, + "returnParameters": { + "id": 1480, + "nodeType": "ParameterList", + "parameters": [], + "src": "3945:0:17" + }, + "scope": 1557, + "src": "3873:73:17", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1482, + "nodeType": "StructuredDocumentation", + "src": "3952:472:17", + "text": " @notice Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking\n contract}.\n @dev Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}.\n Emits a {ProvisionPendingParametersAccepted} event.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "functionSelector": "ce0fc0cc", + "id": 1489, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "acceptProvisionPendingParameters", + "nameLocation": "4438:32:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1487, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1484, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4479:15:17", + "nodeType": "VariableDeclaration", + "scope": 1489, + "src": "4471:23:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1483, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4471:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1486, + "mutability": "mutable", + "name": "data", + "nameLocation": "4511:4:17", + "nodeType": "VariableDeclaration", + "scope": 1489, + "src": "4496:19:17", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1485, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4496:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4470:46:17" + }, + "returnParameters": { + "id": 1488, + "nodeType": "ParameterList", + "parameters": [], + "src": "4525:0:17" + }, + "scope": 1557, + "src": "4429:97:17", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1490, + "nodeType": "StructuredDocumentation", + "src": "4532:251:17", + "text": " @notice Service provider starts providing the service.\n @dev Emits a {ServiceStarted} event.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "functionSelector": "dedf6726", + "id": 1497, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "startService", + "nameLocation": "4797:12:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1495, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1492, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4818:15:17", + "nodeType": "VariableDeclaration", + "scope": 1497, + "src": "4810:23:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1491, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4810:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1494, + "mutability": "mutable", + "name": "data", + "nameLocation": "4850:4:17", + "nodeType": "VariableDeclaration", + "scope": 1497, + "src": "4835:19:17", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1493, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4835:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4809:46:17" + }, + "returnParameters": { + "id": 1496, + "nodeType": "ParameterList", + "parameters": [], + "src": "4864:0:17" + }, + "scope": 1557, + "src": "4788:77:17", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1498, + "nodeType": "StructuredDocumentation", + "src": "4871:250:17", + "text": " @notice Service provider stops providing the service.\n @dev Emits a {ServiceStopped} event.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "functionSelector": "8180083b", + "id": 1505, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "stopService", + "nameLocation": "5135:11:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1503, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1500, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "5155:15:17", + "nodeType": "VariableDeclaration", + "scope": 1505, + "src": "5147:23:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1499, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5147:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1502, + "mutability": "mutable", + "name": "data", + "nameLocation": "5187:4:17", + "nodeType": "VariableDeclaration", + "scope": 1505, + "src": "5172:19:17", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1501, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5172:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5146:46:17" + }, + "returnParameters": { + "id": 1504, + "nodeType": "ParameterList", + "parameters": [], + "src": "5201:0:17" + }, + "scope": 1557, + "src": "5126:76:17", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1506, + "nodeType": "StructuredDocumentation", + "src": "5208:864:17", + "text": " @notice Collects payment earnt by the service provider.\n @dev The implementation of this function is expected to interact with {GraphPayments}\n to collect payment from the service payer, which is done via {IGraphPayments-collect}.\n Emits a {ServicePaymentCollected} event.\n NOTE: Data services that are vetted by the Graph Council might qualify for a portion of\n protocol issuance to cover for these payments. In this case, the funds are taken by\n interacting with the rewards manager contract instead of the {GraphPayments} contract.\n @param serviceProvider The address of the service provider.\n @param feeType The type of fee to collect as defined in {GraphPayments}.\n @param data Custom data, usage defined by the data service.\n @return The amount of tokens collected." + }, + "functionSelector": "b15d2a2c", + "id": 1518, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "6086:7:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1514, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1508, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "6111:15:17", + "nodeType": "VariableDeclaration", + "scope": 1518, + "src": "6103:23:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1507, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6103:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1511, + "mutability": "mutable", + "name": "feeType", + "nameLocation": "6164:7:17", + "nodeType": "VariableDeclaration", + "scope": 1518, + "src": "6136:35:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 1510, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1509, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["6136:14:17", "6151:12:17"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "6136:27:17" + }, + "referencedDeclaration": 2433, + "src": "6136:27:17", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1513, + "mutability": "mutable", + "name": "data", + "nameLocation": "6196:4:17", + "nodeType": "VariableDeclaration", + "scope": 1518, + "src": "6181:19:17", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1512, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "6181:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "6093:113:17" + }, + "returnParameters": { + "id": 1517, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1516, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1518, + "src": "6225:7:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1515, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6225:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6224:9:17" + }, + "scope": 1557, + "src": "6077:157:17", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1519, + "nodeType": "StructuredDocumentation", + "src": "6240:367:17", + "text": " @notice Slash a service provider for misbehaviour.\n @dev To slash the service provider's provision the function should call\n {Staking-slash}.\n Emits a {ServiceProviderSlashed} event.\n @param serviceProvider The address of the service provider.\n @param data Custom data, usage defined by the data service." + }, + "functionSelector": "cb8347fe", + "id": 1526, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "slash", + "nameLocation": "6621:5:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1524, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1521, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "6635:15:17", + "nodeType": "VariableDeclaration", + "scope": 1526, + "src": "6627:23:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1520, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6627:7:17", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1523, + "mutability": "mutable", + "name": "data", + "nameLocation": "6667:4:17", + "nodeType": "VariableDeclaration", + "scope": 1526, + "src": "6652:19:17", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1522, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "6652:5:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "6626:46:17" + }, + "returnParameters": { + "id": 1525, + "nodeType": "ParameterList", + "parameters": [], + "src": "6681:0:17" + }, + "scope": 1557, + "src": "6612:70:17", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1527, + "nodeType": "StructuredDocumentation", + "src": "6688:163:17", + "text": " @notice External getter for the thawing period range\n @return Minimum thawing period allowed\n @return Maximum thawing period allowed" + }, + "functionSelector": "71ce020a", + "id": 1534, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getThawingPeriodRange", + "nameLocation": "6865:21:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1528, + "nodeType": "ParameterList", + "parameters": [], + "src": "6886:2:17" + }, + "returnParameters": { + "id": 1533, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1530, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1534, + "src": "6912:6:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 1529, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "6912:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1532, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1534, + "src": "6920:6:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 1531, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "6920:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "6911:16:17" + }, + "scope": 1557, + "src": "6856:72:17", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1535, + "nodeType": "StructuredDocumentation", + "src": "6934:157:17", + "text": " @notice External getter for the verifier cut range\n @return Minimum verifier cut allowed\n @return Maximum verifier cut allowed" + }, + "functionSelector": "482468b7", + "id": 1542, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getVerifierCutRange", + "nameLocation": "7105:19:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1536, + "nodeType": "ParameterList", + "parameters": [], + "src": "7124:2:17" + }, + "returnParameters": { + "id": 1541, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1538, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1542, + "src": "7150:6:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1537, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "7150:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1540, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1542, + "src": "7158:6:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1539, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "7158:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "7149:16:17" + }, + "scope": 1557, + "src": "7096:70:17", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1543, + "nodeType": "StructuredDocumentation", + "src": "7172:169:17", + "text": " @notice External getter for the provision tokens range\n @return Minimum provision tokens allowed\n @return Maximum provision tokens allowed" + }, + "functionSelector": "819ba366", + "id": 1550, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getProvisionTokensRange", + "nameLocation": "7355:23:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1544, + "nodeType": "ParameterList", + "parameters": [], + "src": "7378:2:17" + }, + "returnParameters": { + "id": 1549, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1546, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1550, + "src": "7404:7:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1545, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7404:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1548, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1550, + "src": "7413:7:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1547, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7413:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7403:18:17" + }, + "scope": 1557, + "src": "7346:76:17", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1551, + "nodeType": "StructuredDocumentation", + "src": "7428:103:17", + "text": " @notice External getter for the delegation ratio\n @return The delegation ratio" + }, + "functionSelector": "1ebb7c30", + "id": 1556, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDelegationRatio", + "nameLocation": "7545:18:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1552, + "nodeType": "ParameterList", + "parameters": [], + "src": "7563:2:17" + }, + "returnParameters": { + "id": 1555, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1554, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1556, + "src": "7589:6:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1553, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "7589:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "7588:8:17" + }, + "scope": 1557, + "src": "7536:61:17", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 1558, + "src": "1037:6562:17", + "usedErrors": [], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473] + } + ], + "src": "45:7555:17" + }, + "id": 17 + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol", + "exportedSymbols": { + "IDataService": [1557], + "IDataServiceFees": [1620] + }, + "id": 1621, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1559, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:18" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol", + "file": "./IDataService.sol", + "id": 1561, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1621, + "sourceUnit": 1558, + "src": "70:50:18", + "symbolAliases": [ + { + "foreign": { + "id": 1560, + "name": "IDataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "79:12:18", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 1563, + "name": "IDataService", + "nameLocations": ["1207:12:18"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1557, + "src": "1207:12:18" + }, + "id": 1564, + "nodeType": "InheritanceSpecifier", + "src": "1207:12:18" + } + ], + "canonicalName": "IDataServiceFees", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 1562, + "nodeType": "StructuredDocumentation", + "src": "122:1054:18", + "text": " @title Interface for the {DataServiceFees} contract.\n @notice Extension for the {IDataService} contract to handle payment collateralization\n using a Horizon provision.\n It's designed to be used with the Data Service framework:\n - When a service provider collects payment with {IDataService.collect} the data service should lock\n stake to back the payment using {_lockStake}.\n - Every time there is a payment collection with {IDataService.collect}, the data service should\n attempt to release any expired stake claims by calling {_releaseStake}.\n - Stake claims can also be manually released by calling {releaseStake} directly.\n @dev Note that this implementation uses the entire provisioned stake as collateral for the payment.\n It can be used to provide economic security for the payments collected as long as the provisioned\n stake is not being used for other purposes.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 1620, + "linearizedBaseContracts": [1620, 1557], + "name": "IDataServiceFees", + "nameLocation": "1187:16:18", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IDataServiceFees.StakeClaim", + "documentation": { + "id": 1565, + "nodeType": "StructuredDocumentation", + "src": "1226:508:18", + "text": " @notice A stake claim, representing provisioned stake that gets locked\n to be released to a service provider.\n @dev StakeClaims are stored in linked lists by service provider, ordered by\n creation timestamp.\n @param tokens The amount of tokens to be locked in the claim\n @param createdAt The timestamp when the claim was created\n @param releasableAt The timestamp when the tokens can be released\n @param nextClaim The next claim in the linked list" + }, + "id": 1574, + "members": [ + { + "constant": false, + "id": 1567, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1775:6:18", + "nodeType": "VariableDeclaration", + "scope": 1574, + "src": "1767:14:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1566, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1767:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1569, + "mutability": "mutable", + "name": "createdAt", + "nameLocation": "1799:9:18", + "nodeType": "VariableDeclaration", + "scope": 1574, + "src": "1791:17:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1568, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1791:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1571, + "mutability": "mutable", + "name": "releasableAt", + "nameLocation": "1826:12:18", + "nodeType": "VariableDeclaration", + "scope": 1574, + "src": "1818:20:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1570, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1818:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1573, + "mutability": "mutable", + "name": "nextClaim", + "nameLocation": "1856:9:18", + "nodeType": "VariableDeclaration", + "scope": 1574, + "src": "1848:17:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1572, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1848:7:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "name": "StakeClaim", + "nameLocation": "1746:10:18", + "nodeType": "StructDefinition", + "scope": 1620, + "src": "1739:133:18", + "visibility": "public" + }, + { + "anonymous": false, + "documentation": { + "id": 1575, + "nodeType": "StructuredDocumentation", + "src": "1878:338:18", + "text": " @notice Emitted when a stake claim is created and stake is locked.\n @param serviceProvider The address of the service provider\n @param claimId The id of the stake claim\n @param tokens The amount of tokens to lock in the claim\n @param unlockTimestamp The timestamp when the tokens can be released" + }, + "eventSelector": "5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f", + "id": 1585, + "name": "StakeClaimLocked", + "nameLocation": "2227:16:18", + "nodeType": "EventDefinition", + "parameters": { + "id": 1584, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1577, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2269:15:18", + "nodeType": "VariableDeclaration", + "scope": 1585, + "src": "2253:31:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1576, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2253:7:18", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1579, + "indexed": true, + "mutability": "mutable", + "name": "claimId", + "nameLocation": "2310:7:18", + "nodeType": "VariableDeclaration", + "scope": 1585, + "src": "2294:23:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1578, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2294:7:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1581, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2335:6:18", + "nodeType": "VariableDeclaration", + "scope": 1585, + "src": "2327:14:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1580, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2327:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1583, + "indexed": false, + "mutability": "mutable", + "name": "unlockTimestamp", + "nameLocation": "2359:15:18", + "nodeType": "VariableDeclaration", + "scope": 1585, + "src": "2351:23:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1582, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2351:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2243:137:18" + }, + "src": "2221:160:18" + }, + { + "anonymous": false, + "documentation": { + "id": 1586, + "nodeType": "StructuredDocumentation", + "src": "2387:324:18", + "text": " @notice Emitted when a stake claim is released and stake is unlocked.\n @param serviceProvider The address of the service provider\n @param claimId The id of the stake claim\n @param tokens The amount of tokens released\n @param releasableAt The timestamp when the tokens were released" + }, + "eventSelector": "4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f44", + "id": 1596, + "name": "StakeClaimReleased", + "nameLocation": "2722:18:18", + "nodeType": "EventDefinition", + "parameters": { + "id": 1595, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1588, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2766:15:18", + "nodeType": "VariableDeclaration", + "scope": 1596, + "src": "2750:31:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1587, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2750:7:18", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1590, + "indexed": true, + "mutability": "mutable", + "name": "claimId", + "nameLocation": "2807:7:18", + "nodeType": "VariableDeclaration", + "scope": 1596, + "src": "2791:23:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1589, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2791:7:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1592, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2832:6:18", + "nodeType": "VariableDeclaration", + "scope": 1596, + "src": "2824:14:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1591, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2824:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1594, + "indexed": false, + "mutability": "mutable", + "name": "releasableAt", + "nameLocation": "2856:12:18", + "nodeType": "VariableDeclaration", + "scope": 1596, + "src": "2848:20:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1593, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2848:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2740:134:18" + }, + "src": "2716:159:18" + }, + { + "anonymous": false, + "documentation": { + "id": 1597, + "nodeType": "StructuredDocumentation", + "src": "2881:283:18", + "text": " @notice Emitted when a series of stake claims are released.\n @param serviceProvider The address of the service provider\n @param claimsCount The number of stake claims being released\n @param tokensReleased The total amount of tokens being released" + }, + "eventSelector": "13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb", + "id": 1605, + "name": "StakeClaimsReleased", + "nameLocation": "3175:19:18", + "nodeType": "EventDefinition", + "parameters": { + "id": 1604, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1599, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3211:15:18", + "nodeType": "VariableDeclaration", + "scope": 1605, + "src": "3195:31:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1598, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3195:7:18", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1601, + "indexed": false, + "mutability": "mutable", + "name": "claimsCount", + "nameLocation": "3236:11:18", + "nodeType": "VariableDeclaration", + "scope": 1605, + "src": "3228:19:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1600, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3228:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1603, + "indexed": false, + "mutability": "mutable", + "name": "tokensReleased", + "nameLocation": "3257:14:18", + "nodeType": "VariableDeclaration", + "scope": 1605, + "src": "3249:22:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1602, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3249:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3194:78:18" + }, + "src": "3169:104:18" + }, + { + "documentation": { + "id": 1606, + "nodeType": "StructuredDocumentation", + "src": "3279:139:18", + "text": " @notice Thrown when attempting to get a stake claim that does not exist.\n @param claimId The id of the stake claim" + }, + "errorSelector": "41cd26a4", + "id": 1610, + "name": "DataServiceFeesClaimNotFound", + "nameLocation": "3429:28:18", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1609, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1608, + "mutability": "mutable", + "name": "claimId", + "nameLocation": "3466:7:18", + "nodeType": "VariableDeclaration", + "scope": 1610, + "src": "3458:15:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1607, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3458:7:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3457:17:18" + }, + "src": "3423:52:18" + }, + { + "documentation": { + "id": 1611, + "nodeType": "StructuredDocumentation", + "src": "3481:83:18", + "text": " @notice Emitted when trying to lock zero tokens in a stake claim" + }, + "errorSelector": "8f4c63d9", + "id": 1613, + "name": "DataServiceFeesZeroTokens", + "nameLocation": "3575:25:18", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1612, + "nodeType": "ParameterList", + "parameters": [], + "src": "3600:2:18" + }, + "src": "3569:34:18" + }, + { + "documentation": { + "id": 1614, + "nodeType": "StructuredDocumentation", + "src": "3609:519:18", + "text": " @notice Releases expired stake claims for the caller.\n @dev This function is only meant to be called if the service provider has enough\n stake claims that releasing them all at once would exceed the block gas limit.\n @dev This function can be overriden and/or disabled.\n @dev Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\n @param numClaimsToRelease Amount of stake claims to process. If 0, all stake claims are processed." + }, + "functionSelector": "45f54485", + "id": 1619, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "releaseStake", + "nameLocation": "4142:12:18", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1617, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1616, + "mutability": "mutable", + "name": "numClaimsToRelease", + "nameLocation": "4163:18:18", + "nodeType": "VariableDeclaration", + "scope": 1619, + "src": "4155:26:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1615, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4155:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4154:28:18" + }, + "returnParameters": { + "id": 1618, + "nodeType": "ParameterList", + "parameters": [], + "src": "4191:0:18" + }, + "scope": 1620, + "src": "4133:59:18", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 1621, + "src": "1177:3017:18", + "usedErrors": [1610, 1613], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473, 1585, 1596, 1605] + } + ], + "src": "45:4150:18" + }, + "id": 18 + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol", + "exportedSymbols": { + "IDataService": [1557], + "IDataServicePausable": [1655] + }, + "id": 1656, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1622, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:19" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol", + "file": "./IDataService.sol", + "id": 1624, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1656, + "sourceUnit": 1558, + "src": "70:50:19", + "symbolAliases": [ + { + "foreign": { + "id": 1623, + "name": "IDataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "79:12:19", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 1626, + "name": "IDataService", + "nameLocations": ["541:12:19"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1557, + "src": "541:12:19" + }, + "id": 1627, + "nodeType": "InheritanceSpecifier", + "src": "541:12:19" + } + ], + "canonicalName": "IDataServicePausable", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 1625, + "nodeType": "StructuredDocumentation", + "src": "122:384:19", + "text": " @title Interface for the {DataServicePausable} contract.\n @notice Extension for the {IDataService} contract, adds pausing functionality\n to the data service. Pausing is controlled by privileged accounts called\n pause guardians.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 1655, + "linearizedBaseContracts": [1655, 1557], + "name": "IDataServicePausable", + "nameLocation": "517:20:19", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 1628, + "nodeType": "StructuredDocumentation", + "src": "560:183:19", + "text": " @notice Emitted when a pause guardian is set.\n @param account The address of the pause guardian\n @param allowed The allowed status of the pause guardian" + }, + "eventSelector": "a95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789", + "id": 1634, + "name": "PauseGuardianSet", + "nameLocation": "754:16:19", + "nodeType": "EventDefinition", + "parameters": { + "id": 1633, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1630, + "indexed": true, + "mutability": "mutable", + "name": "account", + "nameLocation": "787:7:19", + "nodeType": "VariableDeclaration", + "scope": 1634, + "src": "771:23:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1629, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "771:7:19", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1632, + "indexed": false, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "801:7:19", + "nodeType": "VariableDeclaration", + "scope": 1634, + "src": "796:12:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1631, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "796:4:19", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "770:39:19" + }, + "src": "748:62:19" + }, + { + "documentation": { + "id": 1635, + "nodeType": "StructuredDocumentation", + "src": "816:132:19", + "text": " @notice Emitted when a the caller is not a pause guardian\n @param account The address of the pause guardian" + }, + "errorSelector": "72e3ef97", + "id": 1639, + "name": "DataServicePausableNotPauseGuardian", + "nameLocation": "959:35:19", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1638, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1637, + "mutability": "mutable", + "name": "account", + "nameLocation": "1003:7:19", + "nodeType": "VariableDeclaration", + "scope": 1639, + "src": "995:15:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1636, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "995:7:19", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "994:17:19" + }, + "src": "953:59:19" + }, + { + "documentation": { + "id": 1640, + "nodeType": "StructuredDocumentation", + "src": "1018:209:19", + "text": " @notice Emitted when a pause guardian is set to the same allowed status\n @param account The address of the pause guardian\n @param allowed The allowed status of the pause guardian" + }, + "errorSelector": "5e67e54b", + "id": 1646, + "name": "DataServicePausablePauseGuardianNoChange", + "nameLocation": "1238:40:19", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1645, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1642, + "mutability": "mutable", + "name": "account", + "nameLocation": "1287:7:19", + "nodeType": "VariableDeclaration", + "scope": 1646, + "src": "1279:15:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1641, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1279:7:19", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1644, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "1301:7:19", + "nodeType": "VariableDeclaration", + "scope": 1646, + "src": "1296:12:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1643, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1296:4:19", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1278:31:19" + }, + "src": "1232:78:19" + }, + { + "documentation": { + "id": 1647, + "nodeType": "StructuredDocumentation", + "src": "1316:256:19", + "text": " @notice Pauses the data service.\n @dev Note that only functions using the modifiers `whenNotPaused`\n and `whenPaused` will be affected by the pause.\n Requirements:\n - The contract must not be already paused" + }, + "functionSelector": "8456cb59", + "id": 1650, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "pause", + "nameLocation": "1586:5:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1648, + "nodeType": "ParameterList", + "parameters": [], + "src": "1591:2:19" + }, + "returnParameters": { + "id": 1649, + "nodeType": "ParameterList", + "parameters": [], + "src": "1602:0:19" + }, + "scope": 1655, + "src": "1577:26:19", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1651, + "nodeType": "StructuredDocumentation", + "src": "1609:246:19", + "text": " @notice Unpauses the data service.\n @dev Note that only functions using the modifiers `whenNotPaused`\n and `whenPaused` will be affected by the pause.\n Requirements:\n - The contract must be paused" + }, + "functionSelector": "3f4ba83a", + "id": 1654, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "unpause", + "nameLocation": "1869:7:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1652, + "nodeType": "ParameterList", + "parameters": [], + "src": "1876:2:19" + }, + "returnParameters": { + "id": 1653, + "nodeType": "ParameterList", + "parameters": [], + "src": "1887:0:19" + }, + "scope": 1655, + "src": "1860:28:19", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 1656, + "src": "507:1383:19", + "usedErrors": [1639, 1646], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473, 1634] + } + ], + "src": "45:1846:19" + }, + "id": 19 + }, + "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol", + "exportedSymbols": { + "IHorizonStaking": [2625], + "ProvisionTracker": [1801] + }, + "id": 1802, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1657, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:20" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "file": "../../interfaces/IHorizonStaking.sol", + "id": 1659, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1802, + "sourceUnit": 2626, + "src": "70:71:20", + "symbolAliases": [ + { + "foreign": { + "id": 1658, + "name": "IHorizonStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2625, + "src": "79:15:20", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ProvisionTracker", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 1660, + "nodeType": "StructuredDocumentation", + "src": "143:635:20", + "text": " @title ProvisionTracker library\n @notice A library to facilitate tracking of \"used tokens\" on Graph Horizon provisions. This can be used to\n ensure data services have enough economic security (provisioned stake) to back the payments they collect for\n their services.\n The library provides two primitives, lock and release to signal token usage and free up tokens respectively. It\n does not make any assumptions about the conditions under which tokens are locked or released.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 1801, + "linearizedBaseContracts": [1801], + "name": "ProvisionTracker", + "nameLocation": "787:16:20", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 1661, + "nodeType": "StructuredDocumentation", + "src": "810:200:20", + "text": " @notice Thrown when trying to lock more tokens than available\n @param tokensAvailable The amount of tokens available\n @param tokensRequired The amount of tokens required" + }, + "errorSelector": "5f8ec709", + "id": 1667, + "name": "ProvisionTrackerInsufficientTokens", + "nameLocation": "1021:34:20", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1666, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1663, + "mutability": "mutable", + "name": "tokensAvailable", + "nameLocation": "1064:15:20", + "nodeType": "VariableDeclaration", + "scope": 1667, + "src": "1056:23:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1662, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1056:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1665, + "mutability": "mutable", + "name": "tokensRequired", + "nameLocation": "1089:14:20", + "nodeType": "VariableDeclaration", + "scope": 1667, + "src": "1081:22:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1664, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1081:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1055:49:20" + }, + "src": "1015:90:20" + }, + { + "body": { + "id": 1725, + "nodeType": "Block", + "src": "1843:384:20", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1686, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1684, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1679, + "src": "1857:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 1685, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1867:1:20", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1857:11:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1688, + "nodeType": "IfStatement", + "src": "1853:24:20", + "trueBody": { + "functionReturnParameters": 1683, + "id": 1687, + "nodeType": "Return", + "src": "1870:7:20" + } + }, + { + "assignments": [1690], + "declarations": [ + { + "constant": false, + "id": 1690, + "mutability": "mutable", + "name": "tokensRequired", + "nameLocation": "1895:14:20", + "nodeType": "VariableDeclaration", + "scope": 1725, + "src": "1887:22:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1689, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1887:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1696, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 1691, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1672, + "src": "1912:4:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1693, + "indexExpression": { + "id": 1692, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "1917:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1912:21:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 1694, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1679, + "src": "1936:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1912:30:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1887:55:20" + }, + { + "assignments": [1698], + "declarations": [ + { + "constant": false, + "id": 1698, + "mutability": "mutable", + "name": "tokensAvailable", + "nameLocation": "1960:15:20", + "nodeType": "VariableDeclaration", + "scope": 1725, + "src": "1952:23:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1697, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1952:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1708, + "initialValue": { + "arguments": [ + { + "id": 1701, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "2010:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 1704, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "2035:4:20", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ProvisionTracker_$1801", + "typeString": "library ProvisionTracker" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ProvisionTracker_$1801", + "typeString": "library ProvisionTracker" + } + ], + "id": 1703, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2027:7:20", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1702, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2027:7:20", + "typeDescriptions": {} + } + }, + "id": 1705, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2027:13:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1706, + "name": "delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1681, + "src": "2042:15:20", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 1699, + "name": "graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1675, + "src": "1978:12:20", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 1700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1991:18:20", + "memberName": "getTokensAvailable", + "nodeType": "MemberAccess", + "referencedDeclaration": 2962, + "src": "1978:31:20", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$_t_uint32_$returns$_t_uint256_$", + "typeString": "function (address,address,uint32) view external returns (uint256)" + } + }, + "id": 1707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1978:80:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1952:106:20" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1712, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1710, + "name": "tokensRequired", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1690, + "src": "2076:14:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 1711, + "name": "tokensAvailable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1698, + "src": "2094:15:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2076:33:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 1714, + "name": "tokensAvailable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1698, + "src": "2146:15:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1715, + "name": "tokensRequired", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1690, + "src": "2163:14:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1713, + "name": "ProvisionTrackerInsufficientTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1667, + "src": "2111:34:20", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 1716, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2111:67:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 1709, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2068:7:20", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2068:111:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1718, + "nodeType": "ExpressionStatement", + "src": "2068:111:20" + }, + { + "expression": { + "id": 1723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 1719, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1672, + "src": "2189:4:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1721, + "indexExpression": { + "id": 1720, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "2194:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2189:21:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 1722, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1679, + "src": "2214:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2189:31:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1724, + "nodeType": "ExpressionStatement", + "src": "2189:31:20" + } + ] + }, + "documentation": { + "id": 1668, + "nodeType": "StructuredDocumentation", + "src": "1111:521:20", + "text": " @notice Locks tokens for a service provider\n @dev Requirements:\n - `tokens` must be less than or equal to the amount of tokens available, as reported by the HorizonStaking contract\n @param self The provision tracker mapping\n @param graphStaking The HorizonStaking contract\n @param serviceProvider The service provider address\n @param tokens The amount of tokens to lock\n @param delegationRatio A delegation ratio to limit the amount of delegation that's usable" + }, + "id": 1726, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "lock", + "nameLocation": "1646:4:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1682, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1672, + "mutability": "mutable", + "name": "self", + "nameLocation": "1696:4:20", + "nodeType": "VariableDeclaration", + "scope": 1726, + "src": "1660:40:20", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 1671, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 1669, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1668:7:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1660:27:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 1670, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1679:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1675, + "mutability": "mutable", + "name": "graphStaking", + "nameLocation": "1726:12:20", + "nodeType": "VariableDeclaration", + "scope": 1726, + "src": "1710:28:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + "typeName": { + "id": 1674, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1673, + "name": "IHorizonStaking", + "nameLocations": ["1710:15:20"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2625, + "src": "1710:15:20" + }, + "referencedDeclaration": 2625, + "src": "1710:15:20", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1677, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1756:15:20", + "nodeType": "VariableDeclaration", + "scope": 1726, + "src": "1748:23:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1676, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1748:7:20", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1679, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1789:6:20", + "nodeType": "VariableDeclaration", + "scope": 1726, + "src": "1781:14:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1678, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1781:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1681, + "mutability": "mutable", + "name": "delegationRatio", + "nameLocation": "1812:15:20", + "nodeType": "VariableDeclaration", + "scope": 1726, + "src": "1805:22:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1680, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1805:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "1650:183:20" + }, + "returnParameters": { + "id": 1683, + "nodeType": "ParameterList", + "parameters": [], + "src": "1843:0:20" + }, + "scope": 1801, + "src": "1637:590:20", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1763, + "nodeType": "Block", + "src": "2700:198:20", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1740, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1738, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1735, + "src": "2714:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 1739, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2724:1:20", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2714:11:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1742, + "nodeType": "IfStatement", + "src": "2710:24:20", + "trueBody": { + "functionReturnParameters": 1737, + "id": 1741, + "nodeType": "Return", + "src": "2727:7:20" + } + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1748, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 1744, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1731, + "src": "2751:4:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1746, + "indexExpression": { + "id": 1745, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1733, + "src": "2756:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2751:21:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 1747, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1735, + "src": "2776:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2751:31:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "baseExpression": { + "id": 1750, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1731, + "src": "2819:4:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1752, + "indexExpression": { + "id": 1751, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1733, + "src": "2824:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2819:21:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1753, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1735, + "src": "2842:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1749, + "name": "ProvisionTrackerInsufficientTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1667, + "src": "2784:34:20", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 1754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2784:65:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 1743, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2743:7:20", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1755, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2743:107:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1756, + "nodeType": "ExpressionStatement", + "src": "2743:107:20" + }, + { + "expression": { + "id": 1761, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 1757, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1731, + "src": "2860:4:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1759, + "indexExpression": { + "id": 1758, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1733, + "src": "2865:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2860:21:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "id": 1760, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1735, + "src": "2885:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2860:31:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1762, + "nodeType": "ExpressionStatement", + "src": "2860:31:20" + } + ] + }, + "documentation": { + "id": 1727, + "nodeType": "StructuredDocumentation", + "src": "2233:353:20", + "text": " @notice Releases tokens for a service provider\n @dev Requirements:\n - `tokens` must be less than or equal to the amount of tokens locked for the service provider\n @param self The provision tracker mapping\n @param serviceProvider The service provider address\n @param tokens The amount of tokens to release" + }, + "id": 1764, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "release", + "nameLocation": "2600:7:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1736, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1731, + "mutability": "mutable", + "name": "self", + "nameLocation": "2644:4:20", + "nodeType": "VariableDeclaration", + "scope": 1764, + "src": "2608:40:20", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 1730, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 1728, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2616:7:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "2608:27:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 1729, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2627:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1733, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2658:15:20", + "nodeType": "VariableDeclaration", + "scope": 1764, + "src": "2650:23:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1732, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2650:7:20", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1735, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2683:6:20", + "nodeType": "VariableDeclaration", + "scope": 1764, + "src": "2675:14:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1734, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2675:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2607:83:20" + }, + "returnParameters": { + "id": 1737, + "nodeType": "ParameterList", + "parameters": [], + "src": "2700:0:20" + }, + "scope": 1801, + "src": "2591:307:20", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1799, + "nodeType": "Block", + "src": "3560:180:20", + "statements": [ + { + "assignments": [1782], + "declarations": [ + { + "constant": false, + "id": 1782, + "mutability": "mutable", + "name": "tokensAvailable", + "nameLocation": "3578:15:20", + "nodeType": "VariableDeclaration", + "scope": 1799, + "src": "3570:23:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1781, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3570:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1792, + "initialValue": { + "arguments": [ + { + "id": 1785, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1774, + "src": "3628:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 1788, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "3653:4:20", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ProvisionTracker_$1801", + "typeString": "library ProvisionTracker" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ProvisionTracker_$1801", + "typeString": "library ProvisionTracker" + } + ], + "id": 1787, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3645:7:20", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1786, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3645:7:20", + "typeDescriptions": {} + } + }, + "id": 1789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3645:13:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1790, + "name": "delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1776, + "src": "3660:15:20", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 1783, + "name": "graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1772, + "src": "3596:12:20", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 1784, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3609:18:20", + "memberName": "getTokensAvailable", + "nodeType": "MemberAccess", + "referencedDeclaration": 2962, + "src": "3596:31:20", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$_t_uint32_$returns$_t_uint256_$", + "typeString": "function (address,address,uint32) view external returns (uint256)" + } + }, + "id": 1791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3596:80:20", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3570:106:20" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1797, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 1793, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1769, + "src": "3693:4:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1795, + "indexExpression": { + "id": 1794, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1774, + "src": "3698:15:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3693:21:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 1796, + "name": "tokensAvailable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1782, + "src": "3718:15:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3693:40:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 1780, + "id": 1798, + "nodeType": "Return", + "src": "3686:47:20" + } + ] + }, + "documentation": { + "id": 1765, + "nodeType": "StructuredDocumentation", + "src": "2904:448:20", + "text": " @notice Checks if a service provider has enough tokens available to lock\n @param self The provision tracker mapping\n @param graphStaking The HorizonStaking contract\n @param serviceProvider The service provider address\n @param delegationRatio A delegation ratio to limit the amount of delegation that's usable\n @return true if the service provider has enough tokens available to lock, false otherwise" + }, + "id": 1800, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "check", + "nameLocation": "3366:5:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1777, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1769, + "mutability": "mutable", + "name": "self", + "nameLocation": "3417:4:20", + "nodeType": "VariableDeclaration", + "scope": 1800, + "src": "3381:40:20", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 1768, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 1766, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3389:7:20", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "3381:27:20", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 1767, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3400:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1772, + "mutability": "mutable", + "name": "graphStaking", + "nameLocation": "3447:12:20", + "nodeType": "VariableDeclaration", + "scope": 1800, + "src": "3431:28:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + "typeName": { + "id": 1771, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1770, + "name": "IHorizonStaking", + "nameLocations": ["3431:15:20"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2625, + "src": "3431:15:20" + }, + "referencedDeclaration": 2625, + "src": "3431:15:20", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1774, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3477:15:20", + "nodeType": "VariableDeclaration", + "scope": 1800, + "src": "3469:23:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1773, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3469:7:20", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1776, + "mutability": "mutable", + "name": "delegationRatio", + "nameLocation": "3509:15:20", + "nodeType": "VariableDeclaration", + "scope": 1800, + "src": "3502:22:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1775, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "3502:6:20", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "3371:159:20" + }, + "returnParameters": { + "id": 1780, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1779, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1800, + "src": "3554:4:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1778, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3554:4:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "3553:6:20" + }, + "scope": 1801, + "src": "3357:383:20", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 1802, + "src": "779:2963:20", + "usedErrors": [1667], + "usedEvents": [] + } + ], + "src": "45:3698:20" + }, + "id": 20 + }, + "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol", + "exportedSymbols": { + "GraphDirectory": [4928], + "IHorizonStaking": [2625], + "Initializable": [5391], + "PPMMath": [4539], + "ProvisionManager": [2395], + "ProvisionManagerV1Storage": [2425], + "UintRange": [4564] + }, + "id": 2396, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1803, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:21" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "file": "../../interfaces/IHorizonStaking.sol", + "id": 1805, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2396, + "sourceUnit": 2626, + "src": "70:71:21", + "symbolAliases": [ + { + "foreign": { + "id": 1804, + "name": "IHorizonStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2625, + "src": "79:15:21", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/UintRange.sol", + "file": "../../libraries/UintRange.sol", + "id": 1807, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2396, + "sourceUnit": 4565, + "src": "143:58:21", + "symbolAliases": [ + { + "foreign": { + "id": 1806, + "name": "UintRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4564, + "src": "152:9:21", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "file": "../../libraries/PPMMath.sol", + "id": 1809, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2396, + "sourceUnit": 4540, + "src": "202:54:21", + "symbolAliases": [ + { + "foreign": { + "id": 1808, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "211:7:21", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "id": 1811, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2396, + "sourceUnit": 5392, + "src": "258:98:21", + "symbolAliases": [ + { + "foreign": { + "id": 1810, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "267:13:21", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "file": "../../utilities/GraphDirectory.sol", + "id": 1813, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2396, + "sourceUnit": 4929, + "src": "357:68:21", + "symbolAliases": [ + { + "foreign": { + "id": 1812, + "name": "GraphDirectory", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4928, + "src": "366:14:21", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol", + "file": "./ProvisionManagerStorage.sol", + "id": 1815, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2396, + "sourceUnit": 2426, + "src": "426:74:21", + "symbolAliases": [ + { + "foreign": { + "id": 1814, + "name": "ProvisionManagerV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2425, + "src": "435:25:21", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 1817, + "name": "Initializable", + "nameLocations": ["1324:13:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "1324:13:21" + }, + "id": 1818, + "nodeType": "InheritanceSpecifier", + "src": "1324:13:21" + }, + { + "baseName": { + "id": 1819, + "name": "GraphDirectory", + "nameLocations": ["1339:14:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4928, + "src": "1339:14:21" + }, + "id": 1820, + "nodeType": "InheritanceSpecifier", + "src": "1339:14:21" + }, + { + "baseName": { + "id": 1821, + "name": "ProvisionManagerV1Storage", + "nameLocations": ["1355:25:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2425, + "src": "1355:25:21" + }, + "id": 1822, + "nodeType": "InheritanceSpecifier", + "src": "1355:25:21" + } + ], + "canonicalName": "ProvisionManager", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 1816, + "nodeType": "StructuredDocumentation", + "src": "502:783:21", + "text": " @title ProvisionManager contract\n @notice A helper contract that implements several provision management functions.\n @dev Provides utilities to verify provision parameters are within an acceptable range. Each\n parameter has an overridable setter and getter for the validity range, and a checker that reverts\n if the parameter is out of range.\n The parameters are:\n - Provision parameters (thawing period and verifier cut)\n - Provision tokens\n Note that default values for all provision parameters provide the most permissive configuration, it's\n highly recommended to override them at the data service level.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 2395, + "linearizedBaseContracts": [2395, 2425, 4928, 5391], + "name": "ProvisionManager", + "nameLocation": "1304:16:21", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 1825, + "libraryName": { + "id": 1823, + "name": "UintRange", + "nameLocations": ["1393:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4564, + "src": "1393:9:21" + }, + "nodeType": "UsingForDirective", + "src": "1387:28:21", + "typeName": { + "id": 1824, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1407:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "constant": true, + "documentation": { + "id": 1826, + "nodeType": "StructuredDocumentation", + "src": "1421:45:21", + "text": "@notice The default minimum verifier cut." + }, + "id": 1833, + "mutability": "constant", + "name": "DEFAULT_MIN_VERIFIER_CUT", + "nameLocation": "1496:24:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "1471:68:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1827, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1471:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "value": { + "expression": { + "arguments": [ + { + "id": 1830, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1528:6:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + }, + "typeName": { + "id": 1829, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1528:6:21", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + } + ], + "id": 1828, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "1523:4:21", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1831, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1523:12:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint32", + "typeString": "type(uint32)" + } + }, + "id": 1832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1536:3:21", + "memberName": "min", + "nodeType": "MemberAccess", + "src": "1523:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 1834, + "nodeType": "StructuredDocumentation", + "src": "1546:45:21", + "text": "@notice The default maximum verifier cut." + }, + "id": 1841, + "mutability": "constant", + "name": "DEFAULT_MAX_VERIFIER_CUT", + "nameLocation": "1621:24:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "1596:75:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1835, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1596:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "value": { + "arguments": [ + { + "expression": { + "id": 1838, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "1655:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_PPMMath_$4539_$", + "typeString": "type(library PPMMath)" + } + }, + "id": 1839, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1663:7:21", + "memberName": "MAX_PPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4452, + "src": "1655:15:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1837, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1648:6:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + }, + "typeName": { + "id": 1836, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1648:6:21", + "typeDescriptions": {} + } + }, + "id": 1840, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1648:23:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 1842, + "nodeType": "StructuredDocumentation", + "src": "1678:47:21", + "text": "@notice The default minimum thawing period." + }, + "id": 1849, + "mutability": "constant", + "name": "DEFAULT_MIN_THAWING_PERIOD", + "nameLocation": "1755:26:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "1730:70:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 1843, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1730:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": { + "expression": { + "arguments": [ + { + "id": 1846, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1789:6:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 1845, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1789:6:21", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + } + ], + "id": 1844, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "1784:4:21", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1847, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1784:12:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint64", + "typeString": "type(uint64)" + } + }, + "id": 1848, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1797:3:21", + "memberName": "min", + "nodeType": "MemberAccess", + "src": "1784:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 1850, + "nodeType": "StructuredDocumentation", + "src": "1807:47:21", + "text": "@notice The default maximum thawing period." + }, + "id": 1857, + "mutability": "constant", + "name": "DEFAULT_MAX_THAWING_PERIOD", + "nameLocation": "1884:26:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "1859:70:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 1851, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1859:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": { + "expression": { + "arguments": [ + { + "id": 1854, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1918:6:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 1853, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1918:6:21", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + } + ], + "id": 1852, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "1913:4:21", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1855, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1913:12:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint64", + "typeString": "type(uint64)" + } + }, + "id": 1856, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1926:3:21", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "1913:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 1858, + "nodeType": "StructuredDocumentation", + "src": "1936:49:21", + "text": "@notice The default minimum provision tokens." + }, + "id": 1865, + "mutability": "constant", + "name": "DEFAULT_MIN_PROVISION_TOKENS", + "nameLocation": "2016:28:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "1990:74:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1859, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1990:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "expression": { + "arguments": [ + { + "id": 1862, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2052:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1861, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2052:7:21", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 1860, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2047:4:21", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1863, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2047:13:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 1864, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2061:3:21", + "memberName": "min", + "nodeType": "MemberAccess", + "src": "2047:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 1866, + "nodeType": "StructuredDocumentation", + "src": "2071:49:21", + "text": "@notice The default maximum provision tokens." + }, + "id": 1873, + "mutability": "constant", + "name": "DEFAULT_MAX_PROVISION_TOKENS", + "nameLocation": "2151:28:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "2125:74:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1867, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2125:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "expression": { + "arguments": [ + { + "id": 1870, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2187:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1869, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2187:7:21", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 1868, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2182:4:21", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1871, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2182:13:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 1872, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2196:3:21", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "2182:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 1874, + "nodeType": "StructuredDocumentation", + "src": "2206:41:21", + "text": "@notice The default delegation ratio." + }, + "id": 1881, + "mutability": "constant", + "name": "DEFAULT_DELEGATION_RATIO", + "nameLocation": "2277:24:21", + "nodeType": "VariableDeclaration", + "scope": 2395, + "src": "2252:68:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1875, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2252:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "value": { + "expression": { + "arguments": [ + { + "id": 1878, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2309:6:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + }, + "typeName": { + "id": 1877, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2309:6:21", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + } + ], + "id": 1876, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2304:4:21", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1879, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2304:12:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint32", + "typeString": "type(uint32)" + } + }, + "id": 1880, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2317:3:21", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "2304:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "anonymous": false, + "documentation": { + "id": 1882, + "nodeType": "StructuredDocumentation", + "src": "2327:214:21", + "text": " @notice Emitted when the provision tokens range is set.\n @param min The minimum allowed value for the provision tokens.\n @param max The maximum allowed value for the provision tokens." + }, + "eventSelector": "90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f568849", + "id": 1888, + "name": "ProvisionTokensRangeSet", + "nameLocation": "2552:23:21", + "nodeType": "EventDefinition", + "parameters": { + "id": 1887, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1884, + "indexed": false, + "mutability": "mutable", + "name": "min", + "nameLocation": "2584:3:21", + "nodeType": "VariableDeclaration", + "scope": 1888, + "src": "2576:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1883, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2576:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1886, + "indexed": false, + "mutability": "mutable", + "name": "max", + "nameLocation": "2597:3:21", + "nodeType": "VariableDeclaration", + "scope": 1888, + "src": "2589:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1885, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2589:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2575:26:21" + }, + "src": "2546:56:21" + }, + { + "anonymous": false, + "documentation": { + "id": 1889, + "nodeType": "StructuredDocumentation", + "src": "2608:109:21", + "text": " @notice Emitted when the delegation ratio is set.\n @param ratio The delegation ratio" + }, + "eventSelector": "472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f", + "id": 1893, + "name": "DelegationRatioSet", + "nameLocation": "2728:18:21", + "nodeType": "EventDefinition", + "parameters": { + "id": 1892, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1891, + "indexed": false, + "mutability": "mutable", + "name": "ratio", + "nameLocation": "2754:5:21", + "nodeType": "VariableDeclaration", + "scope": 1893, + "src": "2747:12:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1890, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2747:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "2746:14:21" + }, + "src": "2722:39:21" + }, + { + "anonymous": false, + "documentation": { + "id": 1894, + "nodeType": "StructuredDocumentation", + "src": "2767:210:21", + "text": " @notice Emitted when the verifier cut range is set.\n @param min The minimum allowed value for the max verifier cut.\n @param max The maximum allowed value for the max verifier cut." + }, + "eventSelector": "2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a36", + "id": 1900, + "name": "VerifierCutRangeSet", + "nameLocation": "2988:19:21", + "nodeType": "EventDefinition", + "parameters": { + "id": 1899, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1896, + "indexed": false, + "mutability": "mutable", + "name": "min", + "nameLocation": "3015:3:21", + "nodeType": "VariableDeclaration", + "scope": 1900, + "src": "3008:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1895, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "3008:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1898, + "indexed": false, + "mutability": "mutable", + "name": "max", + "nameLocation": "3027:3:21", + "nodeType": "VariableDeclaration", + "scope": 1900, + "src": "3020:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 1897, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "3020:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "3007:24:21" + }, + "src": "2982:50:21" + }, + { + "anonymous": false, + "documentation": { + "id": 1901, + "nodeType": "StructuredDocumentation", + "src": "3038:208:21", + "text": " @notice Emitted when the thawing period range is set.\n @param min The minimum allowed value for the thawing period.\n @param max The maximum allowed value for the thawing period." + }, + "eventSelector": "2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d1", + "id": 1907, + "name": "ThawingPeriodRangeSet", + "nameLocation": "3257:21:21", + "nodeType": "EventDefinition", + "parameters": { + "id": 1906, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1903, + "indexed": false, + "mutability": "mutable", + "name": "min", + "nameLocation": "3286:3:21", + "nodeType": "VariableDeclaration", + "scope": 1907, + "src": "3279:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 1902, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "3279:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1905, + "indexed": false, + "mutability": "mutable", + "name": "max", + "nameLocation": "3298:3:21", + "nodeType": "VariableDeclaration", + "scope": 1907, + "src": "3291:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 1904, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "3291:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "3278:24:21" + }, + "src": "3251:52:21" + }, + { + "documentation": { + "id": 1908, + "nodeType": "StructuredDocumentation", + "src": "3309:260:21", + "text": " @notice Thrown when a provision parameter is out of range.\n @param message The error message.\n @param value The value that is out of range.\n @param min The minimum allowed value.\n @param max The maximum allowed value." + }, + "errorSelector": "0871e13d", + "id": 1918, + "name": "ProvisionManagerInvalidValue", + "nameLocation": "3580:28:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1917, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1910, + "mutability": "mutable", + "name": "message", + "nameLocation": "3615:7:21", + "nodeType": "VariableDeclaration", + "scope": 1918, + "src": "3609:13:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1909, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3609:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1912, + "mutability": "mutable", + "name": "value", + "nameLocation": "3632:5:21", + "nodeType": "VariableDeclaration", + "scope": 1918, + "src": "3624:13:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1911, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3624:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1914, + "mutability": "mutable", + "name": "min", + "nameLocation": "3647:3:21", + "nodeType": "VariableDeclaration", + "scope": 1918, + "src": "3639:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1913, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3639:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1916, + "mutability": "mutable", + "name": "max", + "nameLocation": "3660:3:21", + "nodeType": "VariableDeclaration", + "scope": 1918, + "src": "3652:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1915, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3652:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3608:56:21" + }, + "src": "3574:91:21" + }, + { + "documentation": { + "id": 1919, + "nodeType": "StructuredDocumentation", + "src": "3671:169:21", + "text": " @notice Thrown when attempting to set a range where min is greater than max.\n @param min The minimum value.\n @param max The maximum value." + }, + "errorSelector": "ccccdafb", + "id": 1925, + "name": "ProvisionManagerInvalidRange", + "nameLocation": "3851:28:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1924, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1921, + "mutability": "mutable", + "name": "min", + "nameLocation": "3888:3:21", + "nodeType": "VariableDeclaration", + "scope": 1925, + "src": "3880:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1920, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3880:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1923, + "mutability": "mutable", + "name": "max", + "nameLocation": "3901:3:21", + "nodeType": "VariableDeclaration", + "scope": 1925, + "src": "3893:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1922, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3893:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3879:26:21" + }, + "src": "3845:61:21" + }, + { + "documentation": { + "id": 1926, + "nodeType": "StructuredDocumentation", + "src": "3912:228:21", + "text": " @notice Thrown when the caller is not authorized to manage the provision of a service provider.\n @param serviceProvider The address of the serviceProvider.\n @param caller The address of the caller." + }, + "errorSelector": "cc5d3c8b", + "id": 1932, + "name": "ProvisionManagerNotAuthorized", + "nameLocation": "4151:29:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1931, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1928, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4189:15:21", + "nodeType": "VariableDeclaration", + "scope": 1932, + "src": "4181:23:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1927, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4181:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1930, + "mutability": "mutable", + "name": "caller", + "nameLocation": "4214:6:21", + "nodeType": "VariableDeclaration", + "scope": 1932, + "src": "4206:14:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1929, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4206:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "4180:41:21" + }, + "src": "4145:77:21" + }, + { + "documentation": { + "id": 1933, + "nodeType": "StructuredDocumentation", + "src": "4228:131:21", + "text": " @notice Thrown when a provision is not found.\n @param serviceProvider The address of the service provider." + }, + "errorSelector": "7b3c09bf", + "id": 1937, + "name": "ProvisionManagerProvisionNotFound", + "nameLocation": "4370:33:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1936, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1935, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4412:15:21", + "nodeType": "VariableDeclaration", + "scope": 1937, + "src": "4404:23:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1934, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4404:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "4403:25:21" + }, + "src": "4364:65:21" + }, + { + "body": { + "id": 1962, + "nodeType": "Block", + "src": "4676:203:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 1946, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1940, + "src": "4736:15:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 1949, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "4761:4:21", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ProvisionManager_$2395", + "typeString": "contract ProvisionManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ProvisionManager_$2395", + "typeString": "contract ProvisionManager" + } + ], + "id": 1948, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4753:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1947, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4753:7:21", + "typeDescriptions": {} + } + }, + "id": 1950, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4753:13:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 1951, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "4768:3:21", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1952, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4772:6:21", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "4768:10:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1943, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "4707:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 1944, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4707:15:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 1945, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4723:12:21", + "memberName": "isAuthorized", + "nodeType": "MemberAccess", + "referencedDeclaration": 3930, + "src": "4707:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$_t_address_$returns$_t_bool_$", + "typeString": "function (address,address,address) view external returns (bool)" + } + }, + "id": 1953, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4707:72:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 1955, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1940, + "src": "4823:15:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 1956, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "4840:3:21", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1957, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4844:6:21", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "4840:10:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1954, + "name": "ProvisionManagerNotAuthorized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1932, + "src": "4793:29:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 1958, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4793:58:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 1942, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "4686:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 1959, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4686:175:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1960, + "nodeType": "ExpressionStatement", + "src": "4686:175:21" + }, + { + "id": 1961, + "nodeType": "PlaceholderStatement", + "src": "4871:1:21" + } + ] + }, + "documentation": { + "id": 1938, + "nodeType": "StructuredDocumentation", + "src": "4435:175:21", + "text": " @notice Checks if the caller is authorized to manage the provision of a service provider.\n @param serviceProvider The address of the service provider." + }, + "id": 1963, + "name": "onlyAuthorizedForProvision", + "nameLocation": "4624:26:21", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 1941, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1940, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4659:15:21", + "nodeType": "VariableDeclaration", + "scope": 1963, + "src": "4651:23:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1939, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4651:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "4650:25:21" + }, + "src": "4615:264:21", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1987, + "nodeType": "Block", + "src": "5151:198:21", + "statements": [ + { + "assignments": [1972], + "declarations": [ + { + "constant": false, + "id": 1972, + "mutability": "mutable", + "name": "provision", + "nameLocation": "5194:9:21", + "nodeType": "VariableDeclaration", + "scope": 1987, + "src": "5161:42:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 1971, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1970, + "name": "IHorizonStaking.Provision", + "nameLocations": ["5161:15:21", "5177:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "5161:25:21" + }, + "referencedDeclaration": 3962, + "src": "5161:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 1976, + "initialValue": { + "arguments": [ + { + "id": 1974, + "name": "serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1966, + "src": "5220:15:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1973, + "name": "_getProvision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2367, + "src": "5206:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address) view returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 1975, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5206:30:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5161:75:21" + }, + { + "expression": { + "arguments": [ + { + "id": 1978, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1972, + "src": "5268:9:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + ], + "id": 1977, + "name": "_checkProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [2184, 2203], + "referencedDeclaration": 2203, + "src": "5246:21:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Provision_$3962_memory_ptr_$returns$__$", + "typeString": "function (struct IHorizonStakingTypes.Provision memory) view" + } + }, + "id": 1979, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5246:32:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1980, + "nodeType": "ExpressionStatement", + "src": "5246:32:21" + }, + { + "expression": { + "arguments": [ + { + "id": 1982, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1972, + "src": "5314:9:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + { + "hexValue": "66616c7365", + "id": 1983, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5325:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1981, + "name": "_checkProvisionParameters", + "nodeType": "Identifier", + "overloadedDeclarations": [2226, 2282], + "referencedDeclaration": 2282, + "src": "5288:25:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Provision_$3962_memory_ptr_$_t_bool_$returns$__$", + "typeString": "function (struct IHorizonStakingTypes.Provision memory,bool) view" + } + }, + "id": 1984, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5288:43:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1985, + "nodeType": "ExpressionStatement", + "src": "5288:43:21" + }, + { + "id": 1986, + "nodeType": "PlaceholderStatement", + "src": "5341:1:21" + } + ] + }, + "documentation": { + "id": 1964, + "nodeType": "StructuredDocumentation", + "src": "4885:200:21", + "text": " @notice Checks if a provision of a service provider is valid according\n to the parameter ranges established.\n @param serviceProvider The address of the service provider." + }, + "id": 1988, + "name": "onlyValidProvision", + "nameLocation": "5099:18:21", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 1967, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1966, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "5126:15:21", + "nodeType": "VariableDeclaration", + "scope": 1988, + "src": "5118:23:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1965, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5118:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5117:25:21" + }, + "src": "5090:259:21", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 1997, + "nodeType": "Block", + "src": "5498:52:21", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1994, + "name": "__ProvisionManager_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2024, + "src": "5508:33:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 1995, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5508:35:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1996, + "nodeType": "ExpressionStatement", + "src": "5508:35:21" + } + ] + }, + "documentation": { + "id": 1989, + "nodeType": "StructuredDocumentation", + "src": "5355:77:21", + "text": " @notice Initializes the contract and any parent contracts." + }, + "id": 1998, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 1992, + "kind": "modifierInvocation", + "modifierName": { + "id": 1991, + "name": "onlyInitializing", + "nameLocations": ["5481:16:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "5481:16:21" + }, + "nodeType": "ModifierInvocation", + "src": "5481:16:21" + } + ], + "name": "__ProvisionManager_init", + "nameLocation": "5446:23:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1990, + "nodeType": "ParameterList", + "parameters": [], + "src": "5469:2:21" + }, + "returnParameters": { + "id": 1993, + "nodeType": "ParameterList", + "parameters": [], + "src": "5498:0:21" + }, + "scope": 2395, + "src": "5437:113:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2023, + "nodeType": "Block", + "src": "5747:326:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 2005, + "name": "DEFAULT_MIN_PROVISION_TOKENS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "5782:28:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2006, + "name": "DEFAULT_MAX_PROVISION_TOKENS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1873, + "src": "5812:28:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2004, + "name": "_setProvisionTokensRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2089, + "src": "5757:24:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2007, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5757:84:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2008, + "nodeType": "ExpressionStatement", + "src": "5757:84:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2010, + "name": "DEFAULT_MIN_VERIFIER_CUT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1833, + "src": "5872:24:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2011, + "name": "DEFAULT_MAX_VERIFIER_CUT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1841, + "src": "5898:24:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 2009, + "name": "_setVerifierCutRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2132, + "src": "5851:20:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_uint32_$returns$__$", + "typeString": "function (uint32,uint32)" + } + }, + "id": 2012, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5851:72:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2013, + "nodeType": "ExpressionStatement", + "src": "5851:72:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2015, + "name": "DEFAULT_MIN_THAWING_PERIOD", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1849, + "src": "5956:26:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 2016, + "name": "DEFAULT_MAX_THAWING_PERIOD", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1857, + "src": "5984:26:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 2014, + "name": "_setThawingPeriodRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2164, + "src": "5933:22:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint64_$_t_uint64_$returns$__$", + "typeString": "function (uint64,uint64)" + } + }, + "id": 2017, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5933:78:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2018, + "nodeType": "ExpressionStatement", + "src": "5933:78:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2020, + "name": "DEFAULT_DELEGATION_RATIO", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1881, + "src": "6041:24:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 2019, + "name": "_setDelegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2057, + "src": "6021:19:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 2021, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6021:45:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2022, + "nodeType": "ExpressionStatement", + "src": "6021:45:21" + } + ] + }, + "documentation": { + "id": 1999, + "nodeType": "StructuredDocumentation", + "src": "5556:115:21", + "text": " @notice Initializes the contract.\n @dev All parameters set to their entire range as valid." + }, + "id": 2024, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 2002, + "kind": "modifierInvocation", + "modifierName": { + "id": 2001, + "name": "onlyInitializing", + "nameLocations": ["5730:16:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "5730:16:21" + }, + "nodeType": "ModifierInvocation", + "src": "5730:16:21" + } + ], + "name": "__ProvisionManager_init_unchained", + "nameLocation": "5685:33:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2000, + "nodeType": "ParameterList", + "parameters": [], + "src": "5718:2:21" + }, + "returnParameters": { + "id": 2003, + "nodeType": "ParameterList", + "parameters": [], + "src": "5747:0:21" + }, + "scope": 2395, + "src": "5676:397:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2041, + "nodeType": "Block", + "src": "6440:135:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 2031, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2027, + "src": "6476:16:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "74727565", + "id": 2032, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6494:4:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 2030, + "name": "_checkProvisionParameters", + "nodeType": "Identifier", + "overloadedDeclarations": [2226, 2282], + "referencedDeclaration": 2226, + "src": "6450:25:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$returns$__$", + "typeString": "function (address,bool) view" + } + }, + "id": 2033, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6450:49:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2034, + "nodeType": "ExpressionStatement", + "src": "6450:49:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2038, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2027, + "src": "6551:16:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2035, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "6509:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 2036, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6509:15:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 2037, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6525:25:21", + "memberName": "acceptProvisionParameters", + "nodeType": "MemberAccess", + "referencedDeclaration": 3751, + "src": "6509:41:21", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$", + "typeString": "function (address) external" + } + }, + "id": 2039, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6509:59:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2040, + "nodeType": "ExpressionStatement", + "src": "6509:59:21" + } + ] + }, + "documentation": { + "id": 2025, + "nodeType": "StructuredDocumentation", + "src": "6079:285:21", + "text": " @notice Verifies and accepts the provision parameters of a service provider in\n the {HorizonStaking} contract.\n @dev Checks the pending provision parameters, not the current ones.\n @param _serviceProvider The address of the service provider." + }, + "id": 2042, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_acceptProvisionParameters", + "nameLocation": "6378:26:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2028, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2027, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "6413:16:21", + "nodeType": "VariableDeclaration", + "scope": 2042, + "src": "6405:24:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2026, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6405:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6404:26:21" + }, + "returnParameters": { + "id": 2029, + "nodeType": "ParameterList", + "parameters": [], + "src": "6440:0:21" + }, + "scope": 2395, + "src": "6369:206:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2056, + "nodeType": "Block", + "src": "6765:83:21", + "statements": [ + { + "expression": { + "id": 2050, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2048, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "6775:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2049, + "name": "_ratio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2045, + "src": "6794:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "6775:25:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "id": 2051, + "nodeType": "ExpressionStatement", + "src": "6775:25:21" + }, + { + "eventCall": { + "arguments": [ + { + "id": 2053, + "name": "_ratio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2045, + "src": "6834:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 2052, + "name": "DelegationRatioSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1893, + "src": "6815:18:21", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 2054, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6815:26:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2055, + "nodeType": "EmitStatement", + "src": "6810:31:21" + } + ] + }, + "documentation": { + "id": 2043, + "nodeType": "StructuredDocumentation", + "src": "6602:105:21", + "text": " @notice Sets the delegation ratio.\n @param _ratio The delegation ratio to be set" + }, + "id": 2057, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setDelegationRatio", + "nameLocation": "6721:19:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2046, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2045, + "mutability": "mutable", + "name": "_ratio", + "nameLocation": "6748:6:21", + "nodeType": "VariableDeclaration", + "scope": 2057, + "src": "6741:13:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2044, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "6741:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "6740:15:21" + }, + "returnParameters": { + "id": 2047, + "nodeType": "ParameterList", + "parameters": [], + "src": "6765:0:21" + }, + "scope": 2395, + "src": "6712:136:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2088, + "nodeType": "Block", + "src": "7139:210:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2068, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2066, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2060, + "src": "7157:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 2067, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2062, + "src": "7165:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7157:12:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 2070, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2060, + "src": "7200:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2071, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2062, + "src": "7206:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2069, + "name": "ProvisionManagerInvalidRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1925, + "src": "7171:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 2072, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7171:40:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 2065, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "7149:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 2073, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7149:63:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2074, + "nodeType": "ExpressionStatement", + "src": "7149:63:21" + }, + { + "expression": { + "id": 2077, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2075, + "name": "_minimumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2401, + "src": "7222:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2076, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2060, + "src": "7248:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7222:30:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2078, + "nodeType": "ExpressionStatement", + "src": "7222:30:21" + }, + { + "expression": { + "id": 2081, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2079, + "name": "_maximumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2404, + "src": "7262:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2080, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2062, + "src": "7288:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7262:30:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2082, + "nodeType": "ExpressionStatement", + "src": "7262:30:21" + }, + { + "eventCall": { + "arguments": [ + { + "id": 2084, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2060, + "src": "7331:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2085, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2062, + "src": "7337:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2083, + "name": "ProvisionTokensRangeSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1888, + "src": "7307:23:21", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2086, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7307:35:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2087, + "nodeType": "EmitStatement", + "src": "7302:40:21" + } + ] + }, + "documentation": { + "id": 2058, + "nodeType": "StructuredDocumentation", + "src": "6854:209:21", + "text": " @notice Sets the range for the provision tokens.\n @param _min The minimum allowed value for the provision tokens.\n @param _max The maximum allowed value for the provision tokens." + }, + "id": 2089, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setProvisionTokensRange", + "nameLocation": "7077:24:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2063, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2060, + "mutability": "mutable", + "name": "_min", + "nameLocation": "7110:4:21", + "nodeType": "VariableDeclaration", + "scope": 2089, + "src": "7102:12:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2059, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7102:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2062, + "mutability": "mutable", + "name": "_max", + "nameLocation": "7124:4:21", + "nodeType": "VariableDeclaration", + "scope": 2089, + "src": "7116:12:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2061, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7116:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7101:28:21" + }, + "returnParameters": { + "id": 2064, + "nodeType": "ParameterList", + "parameters": [], + "src": "7139:0:21" + }, + "scope": 2395, + "src": "7068:281:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2131, + "nodeType": "Block", + "src": "7630:283:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "id": 2100, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2098, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2092, + "src": "7648:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 2099, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "7656:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "7648:12:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 2102, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2092, + "src": "7691:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2103, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "7697:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 2101, + "name": "ProvisionManagerInvalidRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1925, + "src": "7662:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 2104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7662:40:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 2097, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "7640:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 2105, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7640:63:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2106, + "nodeType": "ExpressionStatement", + "src": "7640:63:21" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 2110, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "7740:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 2108, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "7721:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_PPMMath_$4539_$", + "typeString": "type(library PPMMath)" + } + }, + "id": 2109, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7729:10:21", + "memberName": "isValidPPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4538, + "src": "7721:18:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_bool_$", + "typeString": "function (uint256) pure returns (bool)" + } + }, + "id": 2111, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7721:24:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 2113, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2092, + "src": "7776:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2114, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "7782:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 2112, + "name": "ProvisionManagerInvalidRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1925, + "src": "7747:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 2115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7747:40:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 2107, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "7713:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 2116, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7713:75:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2117, + "nodeType": "ExpressionStatement", + "src": "7713:75:21" + }, + { + "expression": { + "id": 2120, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2118, + "name": "_minimumVerifierCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2413, + "src": "7798:19:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2119, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2092, + "src": "7820:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "7798:26:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "id": 2121, + "nodeType": "ExpressionStatement", + "src": "7798:26:21" + }, + { + "expression": { + "id": 2124, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2122, + "name": "_maximumVerifierCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2416, + "src": "7834:19:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2123, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "7856:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "7834:26:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "id": 2125, + "nodeType": "ExpressionStatement", + "src": "7834:26:21" + }, + { + "eventCall": { + "arguments": [ + { + "id": 2127, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2092, + "src": "7895:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2128, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "7901:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 2126, + "name": "VerifierCutRangeSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1900, + "src": "7875:19:21", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$_t_uint32_$returns$__$", + "typeString": "function (uint32,uint32)" + } + }, + "id": 2129, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7875:31:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2130, + "nodeType": "EmitStatement", + "src": "7870:36:21" + } + ] + }, + "documentation": { + "id": 2090, + "nodeType": "StructuredDocumentation", + "src": "7355:205:21", + "text": " @notice Sets the range for the verifier cut.\n @param _min The minimum allowed value for the max verifier cut.\n @param _max The maximum allowed value for the max verifier cut." + }, + "id": 2132, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setVerifierCutRange", + "nameLocation": "7574:20:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2095, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2092, + "mutability": "mutable", + "name": "_min", + "nameLocation": "7602:4:21", + "nodeType": "VariableDeclaration", + "scope": 2132, + "src": "7595:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2091, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "7595:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2094, + "mutability": "mutable", + "name": "_max", + "nameLocation": "7615:4:21", + "nodeType": "VariableDeclaration", + "scope": 2132, + "src": "7608:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2093, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "7608:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "7594:26:21" + }, + "returnParameters": { + "id": 2096, + "nodeType": "ParameterList", + "parameters": [], + "src": "7630:0:21" + }, + "scope": 2395, + "src": "7565:348:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2163, + "nodeType": "Block", + "src": "8194:204:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 2143, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2141, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2135, + "src": "8212:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 2142, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2137, + "src": "8220:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "8212:12:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 2145, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2135, + "src": "8255:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 2146, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2137, + "src": "8261:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 2144, + "name": "ProvisionManagerInvalidRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1925, + "src": "8226:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 2147, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8226:40:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 2140, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "8204:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 2148, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8204:63:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2149, + "nodeType": "ExpressionStatement", + "src": "8204:63:21" + }, + { + "expression": { + "id": 2152, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2150, + "name": "_minimumThawingPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2407, + "src": "8277:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2151, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2135, + "src": "8301:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "8277:28:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 2153, + "nodeType": "ExpressionStatement", + "src": "8277:28:21" + }, + { + "expression": { + "id": 2156, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2154, + "name": "_maximumThawingPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2410, + "src": "8315:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2155, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2137, + "src": "8339:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "8315:28:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 2157, + "nodeType": "ExpressionStatement", + "src": "8315:28:21" + }, + { + "eventCall": { + "arguments": [ + { + "id": 2159, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2135, + "src": "8380:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 2160, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2137, + "src": "8386:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 2158, + "name": "ThawingPeriodRangeSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1907, + "src": "8358:21:21", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint64_$_t_uint64_$returns$__$", + "typeString": "function (uint64,uint64)" + } + }, + "id": 2161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8358:33:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2162, + "nodeType": "EmitStatement", + "src": "8353:38:21" + } + ] + }, + "documentation": { + "id": 2133, + "nodeType": "StructuredDocumentation", + "src": "7919:203:21", + "text": " @notice Sets the range for the thawing period.\n @param _min The minimum allowed value for the thawing period.\n @param _max The maximum allowed value for the thawing period." + }, + "id": 2164, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setThawingPeriodRange", + "nameLocation": "8136:22:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2138, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2135, + "mutability": "mutable", + "name": "_min", + "nameLocation": "8166:4:21", + "nodeType": "VariableDeclaration", + "scope": 2164, + "src": "8159:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2134, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8159:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2137, + "mutability": "mutable", + "name": "_max", + "nameLocation": "8179:4:21", + "nodeType": "VariableDeclaration", + "scope": 2164, + "src": "8172:11:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2136, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8172:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "8158:26:21" + }, + "returnParameters": { + "id": 2139, + "nodeType": "ParameterList", + "parameters": [], + "src": "8194:0:21" + }, + "scope": 2395, + "src": "8127:271:21", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2183, + "nodeType": "Block", + "src": "8684:135:21", + "statements": [ + { + "assignments": [2174], + "declarations": [ + { + "constant": false, + "id": 2174, + "mutability": "mutable", + "name": "provision", + "nameLocation": "8727:9:21", + "nodeType": "VariableDeclaration", + "scope": 2183, + "src": "8694:42:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2173, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2172, + "name": "IHorizonStaking.Provision", + "nameLocations": ["8694:15:21", "8710:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "8694:25:21" + }, + "referencedDeclaration": 3962, + "src": "8694:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 2178, + "initialValue": { + "arguments": [ + { + "id": 2176, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2167, + "src": "8753:16:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2175, + "name": "_getProvision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2367, + "src": "8739:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address) view returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 2177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8739:31:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8694:76:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2180, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2174, + "src": "8802:9:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + ], + "id": 2179, + "name": "_checkProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [2184, 2203], + "referencedDeclaration": 2203, + "src": "8780:21:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Provision_$3962_memory_ptr_$returns$__$", + "typeString": "function (struct IHorizonStakingTypes.Provision memory) view" + } + }, + "id": 2181, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8780:32:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2182, + "nodeType": "ExpressionStatement", + "src": "8780:32:21" + } + ] + }, + "documentation": { + "id": 2165, + "nodeType": "StructuredDocumentation", + "src": "8425:175:21", + "text": " @notice Checks if the provision tokens of a service provider are within the valid range.\n @param _serviceProvider The address of the service provider." + }, + "id": 2184, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkProvisionTokens", + "nameLocation": "8614:21:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2168, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2167, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "8644:16:21", + "nodeType": "VariableDeclaration", + "scope": 2184, + "src": "8636:24:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2166, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8636:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8635:26:21" + }, + "returnParameters": { + "id": 2169, + "nodeType": "ParameterList", + "parameters": [], + "src": "8684:0:21" + }, + "scope": 2395, + "src": "8605:214:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2202, + "nodeType": "Block", + "src": "9150:199:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2196, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2192, + "name": "_provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2188, + "src": "9192:10:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2193, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9203:6:21", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "9192:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "expression": { + "id": 2194, + "name": "_provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2188, + "src": "9212:10:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2195, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9223:13:21", + "memberName": "tokensThawing", + "nodeType": "MemberAccess", + "referencedDeclaration": 3945, + "src": "9212:24:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9192:44:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2197, + "name": "_minimumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2401, + "src": "9250:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2198, + "name": "_maximumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2404, + "src": "9287:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "746f6b656e73", + "id": 2199, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9324:8:21", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_680989b8ba4329dbb34fe099c4644fce6e521152facc82d70e978bdc51facd5c", + "typeString": "literal_string \"tokens\"" + }, + "value": "tokens" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_stringliteral_680989b8ba4329dbb34fe099c4644fce6e521152facc82d70e978bdc51facd5c", + "typeString": "literal_string \"tokens\"" + } + ], + "id": 2191, + "name": "_checkValueInRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2394, + "src": "9160:18:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (uint256,uint256,uint256,bytes memory) pure" + } + }, + "id": 2200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9160:182:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2201, + "nodeType": "ExpressionStatement", + "src": "9160:182:21" + } + ] + }, + "documentation": { + "id": 2185, + "nodeType": "StructuredDocumentation", + "src": "8825:222:21", + "text": " @notice Checks if the provision tokens of a service provider are within the valid range.\n Note that thawing tokens are not considered in this check.\n @param _provision The provision to check." + }, + "id": 2203, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkProvisionTokens", + "nameLocation": "9061:21:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2189, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2188, + "mutability": "mutable", + "name": "_provision", + "nameLocation": "9116:10:21", + "nodeType": "VariableDeclaration", + "scope": 2203, + "src": "9083:43:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2187, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2186, + "name": "IHorizonStaking.Provision", + "nameLocations": ["9083:15:21", "9099:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "9083:25:21" + }, + "referencedDeclaration": 3962, + "src": "9083:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "src": "9082:45:21" + }, + "returnParameters": { + "id": 2190, + "nodeType": "ParameterList", + "parameters": [], + "src": "9150:0:21" + }, + "scope": 2395, + "src": "9052:297:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2225, + "nodeType": "Block", + "src": "9720:154:21", + "statements": [ + { + "assignments": [2215], + "declarations": [ + { + "constant": false, + "id": 2215, + "mutability": "mutable", + "name": "provision", + "nameLocation": "9763:9:21", + "nodeType": "VariableDeclaration", + "scope": 2225, + "src": "9730:42:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2214, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2213, + "name": "IHorizonStaking.Provision", + "nameLocations": ["9730:15:21", "9746:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "9730:25:21" + }, + "referencedDeclaration": 3962, + "src": "9730:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 2219, + "initialValue": { + "arguments": [ + { + "id": 2217, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2206, + "src": "9789:16:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2216, + "name": "_getProvision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2367, + "src": "9775:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address) view returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 2218, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9775:31:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9730:76:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2221, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2215, + "src": "9842:9:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + { + "id": 2222, + "name": "_checkPending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2208, + "src": "9853:13:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 2220, + "name": "_checkProvisionParameters", + "nodeType": "Identifier", + "overloadedDeclarations": [2226, 2282], + "referencedDeclaration": 2282, + "src": "9816:25:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Provision_$3962_memory_ptr_$_t_bool_$returns$__$", + "typeString": "function (struct IHorizonStakingTypes.Provision memory,bool) view" + } + }, + "id": 2223, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9816:51:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2224, + "nodeType": "ExpressionStatement", + "src": "9816:51:21" + } + ] + }, + "documentation": { + "id": 2204, + "nodeType": "StructuredDocumentation", + "src": "9355:257:21", + "text": " @notice Checks if the provision parameters of a service provider are within the valid range.\n @param _serviceProvider The address of the service provider.\n @param _checkPending If true, checks the pending provision parameters." + }, + "id": 2226, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkProvisionParameters", + "nameLocation": "9626:25:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2209, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2206, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "9660:16:21", + "nodeType": "VariableDeclaration", + "scope": 2226, + "src": "9652:24:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2205, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9652:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2208, + "mutability": "mutable", + "name": "_checkPending", + "nameLocation": "9683:13:21", + "nodeType": "VariableDeclaration", + "scope": 2226, + "src": "9678:18:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 2207, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9678:4:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "9651:46:21" + }, + "returnParameters": { + "id": 2210, + "nodeType": "ParameterList", + "parameters": [], + "src": "9720:0:21" + }, + "scope": 2395, + "src": "9617:257:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2281, + "nodeType": "Block", + "src": "10295:611:21", + "statements": [ + { + "assignments": [2236, 2238], + "declarations": [ + { + "constant": false, + "id": 2236, + "mutability": "mutable", + "name": "thawingPeriodMin", + "nameLocation": "10313:16:21", + "nodeType": "VariableDeclaration", + "scope": 2281, + "src": "10306:23:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2235, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "10306:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2238, + "mutability": "mutable", + "name": "thawingPeriodMax", + "nameLocation": "10338:16:21", + "nodeType": "VariableDeclaration", + "scope": 2281, + "src": "10331:23:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2237, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "10331:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "id": 2241, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2239, + "name": "_getThawingPeriodRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2317, + "src": "10358:22:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint64_$_t_uint64_$", + "typeString": "function () view returns (uint64,uint64)" + } + }, + "id": 2240, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10358:24:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint64_$_t_uint64_$", + "typeString": "tuple(uint64,uint64)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10305:77:21" + }, + { + "assignments": [2243], + "declarations": [ + { + "constant": false, + "id": 2243, + "mutability": "mutable", + "name": "thawingPeriodToCheck", + "nameLocation": "10399:20:21", + "nodeType": "VariableDeclaration", + "scope": 2281, + "src": "10392:27:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2242, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "10392:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "id": 2250, + "initialValue": { + "condition": { + "id": 2244, + "name": "_checkPending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2232, + "src": "10422:13:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "expression": { + "id": 2247, + "name": "_provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2230, + "src": "10472:10:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2248, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10483:13:21", + "memberName": "thawingPeriod", + "nodeType": "MemberAccess", + "referencedDeclaration": 3951, + "src": "10472:24:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 2249, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "10422:74:21", + "trueExpression": { + "expression": { + "id": 2245, + "name": "_provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2230, + "src": "10438:10:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2246, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10449:20:21", + "memberName": "thawingPeriodPending", + "nodeType": "MemberAccess", + "referencedDeclaration": 3957, + "src": "10438:31:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10392:104:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2252, + "name": "thawingPeriodToCheck", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2243, + "src": "10525:20:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 2253, + "name": "thawingPeriodMin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2236, + "src": "10547:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 2254, + "name": "thawingPeriodMax", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2238, + "src": "10565:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "hexValue": "74686177696e67506572696f64", + "id": 2255, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10583:15:21", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_305ab1a02b7b2a803db444b8e35c7e19e6475b5dd6b215ff165ee071bbd360ee", + "typeString": "literal_string \"thawingPeriod\"" + }, + "value": "thawingPeriod" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_stringliteral_305ab1a02b7b2a803db444b8e35c7e19e6475b5dd6b215ff165ee071bbd360ee", + "typeString": "literal_string \"thawingPeriod\"" + } + ], + "id": 2251, + "name": "_checkValueInRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2394, + "src": "10506:18:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (uint256,uint256,uint256,bytes memory) pure" + } + }, + "id": 2256, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10506:93:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2257, + "nodeType": "ExpressionStatement", + "src": "10506:93:21" + }, + { + "assignments": [2259, 2261], + "declarations": [ + { + "constant": false, + "id": 2259, + "mutability": "mutable", + "name": "verifierCutMin", + "nameLocation": "10618:14:21", + "nodeType": "VariableDeclaration", + "scope": 2281, + "src": "10611:21:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2258, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "10611:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2261, + "mutability": "mutable", + "name": "verifierCutMax", + "nameLocation": "10641:14:21", + "nodeType": "VariableDeclaration", + "scope": 2281, + "src": "10634:21:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2260, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "10634:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "id": 2264, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2262, + "name": "_getVerifierCutRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2330, + "src": "10659:20:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$_t_uint32_$", + "typeString": "function () view returns (uint32,uint32)" + } + }, + "id": 2263, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10659:22:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint32_$_t_uint32_$", + "typeString": "tuple(uint32,uint32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10610:71:21" + }, + { + "assignments": [2266], + "declarations": [ + { + "constant": false, + "id": 2266, + "mutability": "mutable", + "name": "maxVerifierCutToCheck", + "nameLocation": "10698:21:21", + "nodeType": "VariableDeclaration", + "scope": 2281, + "src": "10691:28:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2265, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "10691:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "id": 2273, + "initialValue": { + "condition": { + "id": 2267, + "name": "_checkPending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2232, + "src": "10722:13:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "expression": { + "id": 2270, + "name": "_provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2230, + "src": "10773:10:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2271, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10784:14:21", + "memberName": "maxVerifierCut", + "nodeType": "MemberAccess", + "referencedDeclaration": 3949, + "src": "10773:25:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "id": 2272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "10722:76:21", + "trueExpression": { + "expression": { + "id": 2268, + "name": "_provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2230, + "src": "10738:10:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2269, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10749:21:21", + "memberName": "maxVerifierCutPending", + "nodeType": "MemberAccess", + "referencedDeclaration": 3955, + "src": "10738:32:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10691:107:21" + }, + { + "expression": { + "arguments": [ + { + "id": 2275, + "name": "maxVerifierCutToCheck", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2266, + "src": "10827:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2276, + "name": "verifierCutMin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2259, + "src": "10850:14:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2277, + "name": "verifierCutMax", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2261, + "src": "10866:14:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "hexValue": "6d61785665726966696572437574", + "id": 2278, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10882:16:21", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_68fc3345e83d56ef118660e3367c327aecf533ff1f8bdee8e3dd2ce1b31b5e0c", + "typeString": "literal_string \"maxVerifierCut\"" + }, + "value": "maxVerifierCut" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_stringliteral_68fc3345e83d56ef118660e3367c327aecf533ff1f8bdee8e3dd2ce1b31b5e0c", + "typeString": "literal_string \"maxVerifierCut\"" + } + ], + "id": 2274, + "name": "_checkValueInRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2394, + "src": "10808:18:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (uint256,uint256,uint256,bytes memory) pure" + } + }, + "id": 2279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10808:91:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2280, + "nodeType": "ExpressionStatement", + "src": "10808:91:21" + } + ] + }, + "documentation": { + "id": 2227, + "nodeType": "StructuredDocumentation", + "src": "9880:266:21", + "text": " @notice Checks if the provision parameters of a service provider are within the valid range.\n @param _provision The provision to check.\n @param _checkPending If true, checks the pending provision parameters instead of the current ones." + }, + "id": 2282, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkProvisionParameters", + "nameLocation": "10160:25:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2233, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2230, + "mutability": "mutable", + "name": "_provision", + "nameLocation": "10228:10:21", + "nodeType": "VariableDeclaration", + "scope": 2282, + "src": "10195:43:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2229, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2228, + "name": "IHorizonStaking.Provision", + "nameLocations": ["10195:15:21", "10211:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "10195:25:21" + }, + "referencedDeclaration": 3962, + "src": "10195:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2232, + "mutability": "mutable", + "name": "_checkPending", + "nameLocation": "10253:13:21", + "nodeType": "VariableDeclaration", + "scope": 2282, + "src": "10248:18:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 2231, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "10248:4:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "10185:87:21" + }, + "returnParameters": { + "id": 2234, + "nodeType": "ParameterList", + "parameters": [], + "src": "10295:0:21" + }, + "scope": 2395, + "src": "10151:755:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2290, + "nodeType": "Block", + "src": "11090:40:21", + "statements": [ + { + "expression": { + "id": 2288, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "11107:16:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "functionReturnParameters": 2287, + "id": 2289, + "nodeType": "Return", + "src": "11100:23:21" + } + ] + }, + "documentation": { + "id": 2283, + "nodeType": "StructuredDocumentation", + "src": "10934:89:21", + "text": " @notice Gets the delegation ratio.\n @return The delegation ratio" + }, + "id": 2291, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getDelegationRatio", + "nameLocation": "11037:19:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2284, + "nodeType": "ParameterList", + "parameters": [], + "src": "11056:2:21" + }, + "returnParameters": { + "id": 2287, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2286, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2291, + "src": "11082:6:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2285, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "11082:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "11081:8:21" + }, + "scope": 2395, + "src": "11028:102:21", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2303, + "nodeType": "Block", + "src": "11427:74:21", + "statements": [ + { + "expression": { + "components": [ + { + "id": 2299, + "name": "_minimumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2401, + "src": "11445:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2300, + "name": "_maximumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2404, + "src": "11470:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2301, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "11444:50:21", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "functionReturnParameters": 2298, + "id": 2302, + "nodeType": "Return", + "src": "11437:57:21" + } + ] + }, + "documentation": { + "id": 2292, + "nodeType": "StructuredDocumentation", + "src": "11136:201:21", + "text": " @notice Gets the range for the provision tokens.\n @return The minimum allowed value for the provision tokens.\n @return The maximum allowed value for the provision tokens." + }, + "id": 2304, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getProvisionTokensRange", + "nameLocation": "11351:24:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2293, + "nodeType": "ParameterList", + "parameters": [], + "src": "11375:2:21" + }, + "returnParameters": { + "id": 2298, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2295, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2304, + "src": "11409:7:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2294, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11409:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2297, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2304, + "src": "11418:7:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2296, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11418:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11408:18:21" + }, + "scope": 2395, + "src": "11342:159:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2316, + "nodeType": "Block", + "src": "11789:70:21", + "statements": [ + { + "expression": { + "components": [ + { + "id": 2312, + "name": "_minimumThawingPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2407, + "src": "11807:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 2313, + "name": "_maximumThawingPeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2410, + "src": "11830:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "id": 2314, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "11806:46:21", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint64_$_t_uint64_$", + "typeString": "tuple(uint64,uint64)" + } + }, + "functionReturnParameters": 2311, + "id": 2315, + "nodeType": "Return", + "src": "11799:53:21" + } + ] + }, + "documentation": { + "id": 2305, + "nodeType": "StructuredDocumentation", + "src": "11507:196:21", + "text": " @notice Gets the range for the thawing period.\n @return The minimum allowed value for the thawing period.\n @return The maximum allowed value for the thawing period." + }, + "id": 2317, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getThawingPeriodRange", + "nameLocation": "11717:22:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2306, + "nodeType": "ParameterList", + "parameters": [], + "src": "11739:2:21" + }, + "returnParameters": { + "id": 2311, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2308, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2317, + "src": "11773:6:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2307, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "11773:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2310, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2317, + "src": "11781:6:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2309, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "11781:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "11772:16:21" + }, + "scope": 2395, + "src": "11708:151:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2329, + "nodeType": "Block", + "src": "12146:66:21", + "statements": [ + { + "expression": { + "components": [ + { + "id": 2325, + "name": "_minimumVerifierCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2413, + "src": "12164:19:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 2326, + "name": "_maximumVerifierCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2416, + "src": "12185:19:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "id": 2327, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "12163:42:21", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint32_$_t_uint32_$", + "typeString": "tuple(uint32,uint32)" + } + }, + "functionReturnParameters": 2324, + "id": 2328, + "nodeType": "Return", + "src": "12156:49:21" + } + ] + }, + "documentation": { + "id": 2318, + "nodeType": "StructuredDocumentation", + "src": "11865:197:21", + "text": " @notice Gets the range for the verifier cut.\n @return The minimum allowed value for the max verifier cut.\n @return The maximum allowed value for the max verifier cut." + }, + "id": 2330, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getVerifierCutRange", + "nameLocation": "12076:20:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2319, + "nodeType": "ParameterList", + "parameters": [], + "src": "12096:2:21" + }, + "returnParameters": { + "id": 2324, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2321, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2330, + "src": "12130:6:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2320, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "12130:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2323, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2330, + "src": "12138:6:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2322, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "12138:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "12129:16:21" + }, + "scope": 2395, + "src": "12067:145:21", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 2366, + "nodeType": "Block", + "src": "12567:245:21", + "statements": [ + { + "assignments": [2343], + "declarations": [ + { + "constant": false, + "id": 2343, + "mutability": "mutable", + "name": "provision", + "nameLocation": "12610:9:21", + "nodeType": "VariableDeclaration", + "scope": 2366, + "src": "12577:42:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2342, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2341, + "name": "IHorizonStaking.Provision", + "nameLocations": ["12577:15:21", "12593:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "12577:25:21" + }, + "referencedDeclaration": 3962, + "src": "12577:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 2353, + "initialValue": { + "arguments": [ + { + "id": 2347, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2333, + "src": "12651:16:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 2350, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "12677:4:21", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ProvisionManager_$2395", + "typeString": "contract ProvisionManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ProvisionManager_$2395", + "typeString": "contract ProvisionManager" + } + ], + "id": 2349, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12669:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2348, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12669:7:21", + "typeDescriptions": {} + } + }, + "id": 2351, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12669:13:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2344, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "12622:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 2345, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12622:15:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 2346, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12638:12:21", + "memberName": "getProvision", + "nodeType": "MemberAccess", + "referencedDeclaration": 2950, + "src": "12622:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 2352, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12622:61:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12577:106:21" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 2358, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2355, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2343, + "src": "12701:9:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 2356, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12711:9:21", + "memberName": "createdAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 3953, + "src": "12701:19:21", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 2357, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12724:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "12701:24:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 2360, + "name": "_serviceProvider", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2333, + "src": "12761:16:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2359, + "name": "ProvisionManagerProvisionNotFound", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1937, + "src": "12727:33:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 2361, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12727:51:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 2354, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "12693:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 2362, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12693:86:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2363, + "nodeType": "ExpressionStatement", + "src": "12693:86:21" + }, + { + "expression": { + "id": 2364, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2343, + "src": "12796:9:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "functionReturnParameters": 2338, + "id": 2365, + "nodeType": "Return", + "src": "12789:16:21" + } + ] + }, + "documentation": { + "id": 2331, + "nodeType": "StructuredDocumentation", + "src": "12218:238:21", + "text": " @notice Gets a provision from the {HorizonStaking} contract.\n @dev Requirements:\n - The provision must exist.\n @param _serviceProvider The address of the service provider.\n @return The provision." + }, + "id": 2367, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getProvision", + "nameLocation": "12470:13:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2334, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2333, + "mutability": "mutable", + "name": "_serviceProvider", + "nameLocation": "12492:16:21", + "nodeType": "VariableDeclaration", + "scope": 2367, + "src": "12484:24:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2332, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12484:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12483:26:21" + }, + "returnParameters": { + "id": 2338, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2337, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2367, + "src": "12533:32:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2336, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2335, + "name": "IHorizonStaking.Provision", + "nameLocations": ["12533:15:21", "12549:9:21"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "12533:25:21" + }, + "referencedDeclaration": 3962, + "src": "12533:25:21", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "src": "12532:34:21" + }, + "scope": 2395, + "src": "12461:351:21", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2393, + "nodeType": "Block", + "src": "13228:120:21", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 2382, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2372, + "src": "13263:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2383, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2374, + "src": "13269:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2380, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2370, + "src": "13246:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2381, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13253:9:21", + "memberName": "isInRange", + "nodeType": "MemberAccess", + "referencedDeclaration": 4563, + "src": "13246:16:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_bool_$attached_to$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (bool)" + } + }, + "id": 2384, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13246:28:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 2386, + "name": "_revertMessage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2376, + "src": "13305:14:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 2387, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2370, + "src": "13321:6:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2388, + "name": "_min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2372, + "src": "13329:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2389, + "name": "_max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2374, + "src": "13335:4:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2385, + "name": "ProvisionManagerInvalidValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1918, + "src": "13276:28:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (bytes memory,uint256,uint256,uint256) pure returns (error)" + } + }, + "id": 2390, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13276:64:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 2379, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "13238:7:21", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 2391, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13238:103:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2392, + "nodeType": "ExpressionStatement", + "src": "13238:103:21" + } + ] + }, + "documentation": { + "id": 2368, + "nodeType": "StructuredDocumentation", + "src": "12818:291:21", + "text": " @notice Checks if a value is within a valid range.\n @param _value The value to check.\n @param _min The minimum allowed value.\n @param _max The maximum allowed value.\n @param _revertMessage The revert message to display if the value is out of range." + }, + "id": 2394, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkValueInRange", + "nameLocation": "13123:18:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2377, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2370, + "mutability": "mutable", + "name": "_value", + "nameLocation": "13150:6:21", + "nodeType": "VariableDeclaration", + "scope": 2394, + "src": "13142:14:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2369, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13142:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2372, + "mutability": "mutable", + "name": "_min", + "nameLocation": "13166:4:21", + "nodeType": "VariableDeclaration", + "scope": 2394, + "src": "13158:12:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2371, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13158:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2374, + "mutability": "mutable", + "name": "_max", + "nameLocation": "13180:4:21", + "nodeType": "VariableDeclaration", + "scope": 2394, + "src": "13172:12:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2373, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13172:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2376, + "mutability": "mutable", + "name": "_revertMessage", + "nameLocation": "13199:14:21", + "nodeType": "VariableDeclaration", + "scope": 2394, + "src": "13186:27:21", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2375, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "13186:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "13141:73:21" + }, + "returnParameters": { + "id": 2378, + "nodeType": "ParameterList", + "parameters": [], + "src": "13228:0:21" + }, + "scope": 2395, + "src": "13114:234:21", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + } + ], + "scope": 2396, + "src": "1286:12064:21", + "usedErrors": [1918, 1925, 1932, 1937, 4655, 5140, 5143], + "usedEvents": [1888, 1893, 1900, 1907, 4650, 5148] + } + ], + "src": "45:13306:21" + }, + "id": 21 + }, + "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol", + "exportedSymbols": { + "ProvisionManagerV1Storage": [2425] + }, + "id": 2426, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2397, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:22" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "ProvisionManagerV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 2398, + "nodeType": "StructuredDocumentation", + "src": "70:216:22", + "text": " @title Storage layout for the {ProvisionManager} helper contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 2425, + "linearizedBaseContracts": [2425], + "name": "ProvisionManagerV1Storage", + "nameLocation": "305:25:22", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 2399, + "nodeType": "StructuredDocumentation", + "src": "337:93:22", + "text": "@notice The minimum amount of tokens required to register a provision in the data service" + }, + "id": 2401, + "mutability": "mutable", + "name": "_minimumProvisionTokens", + "nameLocation": "452:23:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "435:40:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2400, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "435:7:22", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2402, + "nodeType": "StructuredDocumentation", + "src": "482:92:22", + "text": "@notice The maximum amount of tokens allowed to register a provision in the data service" + }, + "id": 2404, + "mutability": "mutable", + "name": "_maximumProvisionTokens", + "nameLocation": "596:23:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "579:40:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2403, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "579:7:22", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2405, + "nodeType": "StructuredDocumentation", + "src": "626:91:22", + "text": "@notice The minimum thawing period required to register a provision in the data service" + }, + "id": 2407, + "mutability": "mutable", + "name": "_minimumThawingPeriod", + "nameLocation": "738:21:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "722:37:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2406, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "722:6:22", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2408, + "nodeType": "StructuredDocumentation", + "src": "766:90:22", + "text": "@notice The maximum thawing period allowed to register a provision in the data service" + }, + "id": 2410, + "mutability": "mutable", + "name": "_maximumThawingPeriod", + "nameLocation": "877:21:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "861:37:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2409, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "861:6:22", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2411, + "nodeType": "StructuredDocumentation", + "src": "905:98:22", + "text": "@notice The minimum verifier cut required to register a provision in the data service (in PPM)" + }, + "id": 2413, + "mutability": "mutable", + "name": "_minimumVerifierCut", + "nameLocation": "1024:19:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "1008:35:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2412, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1008:6:22", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2414, + "nodeType": "StructuredDocumentation", + "src": "1050:97:22", + "text": "@notice The maximum verifier cut allowed to register a provision in the data service (in PPM)" + }, + "id": 2416, + "mutability": "mutable", + "name": "_maximumVerifierCut", + "nameLocation": "1168:19:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "1152:35:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2415, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1152:6:22", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2417, + "nodeType": "StructuredDocumentation", + "src": "1194:146:22", + "text": "@notice How much delegation the service provider can effectively use\n @dev Max calculated as service provider's stake * delegationRatio" + }, + "id": 2419, + "mutability": "mutable", + "name": "_delegationRatio", + "nameLocation": "1361:16:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "1345:32:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2418, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1345:6:22", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 2420, + "nodeType": "StructuredDocumentation", + "src": "1384:158:22", + "text": "@dev Gap to allow adding variables in future upgrades\n Note that this contract is not upgradeable but might be inherited by an upgradeable contract" + }, + "id": 2424, + "mutability": "mutable", + "name": "__gap", + "nameLocation": "1567:5:22", + "nodeType": "VariableDeclaration", + "scope": 2425, + "src": "1547:25:22", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage", + "typeString": "uint256[50]" + }, + "typeName": { + "baseType": { + "id": 2421, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1547:7:22", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2423, + "length": { + "hexValue": "3530", + "id": 2422, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1555:2:22", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "nodeType": "ArrayTypeName", + "src": "1547:11:22", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr", + "typeString": "uint256[50]" + } + }, + "visibility": "private" + } + ], + "scope": 2426, + "src": "287:1288:22", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:1531:22" + }, + "id": 22 + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "exportedSymbols": { + "IGraphPayments": [2489] + }, + "id": 2490, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2427, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:23" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IGraphPayments", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2428, + "nodeType": "StructuredDocumentation", + "src": "70:404:23", + "text": " @title Interface for the {GraphPayments} contract\n @notice This contract is part of the Graph Horizon payments protocol. It's designed\n to pull funds (GRT) from the {PaymentsEscrow} and distribute them according to a\n set of pre established rules.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 2489, + "linearizedBaseContracts": [2489], + "name": "IGraphPayments", + "nameLocation": "485:14:23", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IGraphPayments.PaymentTypes", + "documentation": { + "id": 2429, + "nodeType": "StructuredDocumentation", + "src": "506:100:23", + "text": " @notice Types of payments that are supported by the payments protocol\n @dev" + }, + "id": 2433, + "members": [ + { + "id": 2430, + "name": "QueryFee", + "nameLocation": "639:8:23", + "nodeType": "EnumValue", + "src": "639:8:23" + }, + { + "id": 2431, + "name": "IndexingFee", + "nameLocation": "657:11:23", + "nodeType": "EnumValue", + "src": "657:11:23" + }, + { + "id": 2432, + "name": "IndexingRewards", + "nameLocation": "678:15:23", + "nodeType": "EnumValue", + "src": "678:15:23" + } + ], + "name": "PaymentTypes", + "nameLocation": "616:12:23", + "nodeType": "EnumDefinition", + "src": "611:88:23" + }, + { + "anonymous": false, + "documentation": { + "id": 2434, + "nodeType": "StructuredDocumentation", + "src": "705:715:23", + "text": " @notice Emitted when a payment is collected\n @param paymentType The type of payment as defined in {IGraphPayments}\n @param payer The address of the payer\n @param receiver The address of the receiver\n @param dataService The address of the data service\n @param tokens The total amount of tokens being collected\n @param tokensProtocol Amount of tokens charged as protocol tax\n @param tokensDataService Amount of tokens for the data service\n @param tokensDelegationPool Amount of tokens for delegators\n @param tokensReceiver Amount of tokens for the receiver\n @param receiverDestination The address where the receiver's payment cut is sent." + }, + "eventSelector": "b1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f", + "id": 2457, + "name": "GraphPaymentCollected", + "nameLocation": "1431:21:23", + "nodeType": "EventDefinition", + "parameters": { + "id": 2456, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2437, + "indexed": true, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "1483:11:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1462:32:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2436, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2435, + "name": "PaymentTypes", + "nameLocations": ["1462:12:23"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "1462:12:23" + }, + "referencedDeclaration": 2433, + "src": "1462:12:23", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2439, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "1520:5:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1504:21:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2438, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1504:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2441, + "indexed": false, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "1543:8:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1535:16:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2440, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1535:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2443, + "indexed": true, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "1577:11:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1561:27:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2442, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1561:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2445, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1606:6:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1598:14:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2444, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1598:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2447, + "indexed": false, + "mutability": "mutable", + "name": "tokensProtocol", + "nameLocation": "1630:14:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1622:22:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2446, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1622:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2449, + "indexed": false, + "mutability": "mutable", + "name": "tokensDataService", + "nameLocation": "1662:17:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1654:25:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2448, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1654:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2451, + "indexed": false, + "mutability": "mutable", + "name": "tokensDelegationPool", + "nameLocation": "1697:20:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1689:28:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2450, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1689:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2453, + "indexed": false, + "mutability": "mutable", + "name": "tokensReceiver", + "nameLocation": "1735:14:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1727:22:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2452, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1727:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2455, + "indexed": false, + "mutability": "mutable", + "name": "receiverDestination", + "nameLocation": "1767:19:23", + "nodeType": "VariableDeclaration", + "scope": 2457, + "src": "1759:27:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2454, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1759:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1452:340:23" + }, + "src": "1425:368:23" + }, + { + "documentation": { + "id": 2458, + "nodeType": "StructuredDocumentation", + "src": "1799:132:23", + "text": " @notice Thrown when the protocol payment cut is invalid\n @param protocolPaymentCut The protocol payment cut" + }, + "errorSelector": "d3097bcb", + "id": 2462, + "name": "GraphPaymentsInvalidProtocolPaymentCut", + "nameLocation": "1942:38:23", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2461, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2460, + "mutability": "mutable", + "name": "protocolPaymentCut", + "nameLocation": "1989:18:23", + "nodeType": "VariableDeclaration", + "scope": 2462, + "src": "1981:26:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2459, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1981:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1980:28:23" + }, + "src": "1936:73:23" + }, + { + "documentation": { + "id": 2463, + "nodeType": "StructuredDocumentation", + "src": "2015:113:23", + "text": " @notice Thrown when trying to use a cut that is not expressed in PPM\n @param cut The cut" + }, + "errorSelector": "e6dd8b94", + "id": 2467, + "name": "GraphPaymentsInvalidCut", + "nameLocation": "2139:23:23", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2466, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2465, + "mutability": "mutable", + "name": "cut", + "nameLocation": "2171:3:23", + "nodeType": "VariableDeclaration", + "scope": 2467, + "src": "2163:11:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2464, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2163:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2162:13:23" + }, + "src": "2133:43:23" + }, + { + "documentation": { + "id": 2468, + "nodeType": "StructuredDocumentation", + "src": "2182:50:23", + "text": " @notice Initialize the contract" + }, + "functionSelector": "8129fc1c", + "id": 2471, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "initialize", + "nameLocation": "2246:10:23", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2469, + "nodeType": "ParameterList", + "parameters": [], + "src": "2256:2:23" + }, + "returnParameters": { + "id": 2470, + "nodeType": "ParameterList", + "parameters": [], + "src": "2267:0:23" + }, + "scope": 2489, + "src": "2237:31:23", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2472, + "nodeType": "StructuredDocumentation", + "src": "2274:849:23", + "text": " @notice Collects funds from a payer.\n It will pay cuts to all relevant parties and forward the rest to the receiver destination address. If the\n destination address is zero the funds are automatically staked to the receiver. Note that the receiver \n destination address can be set to the receiver address to collect funds on the receiver without re-staking.\n Note that the collected amount can be zero.\n @param paymentType The type of payment as defined in {IGraphPayments}\n @param receiver The address of the receiver\n @param tokens The amount of tokens being collected.\n @param dataService The address of the data service\n @param dataServiceCut The data service cut in PPM\n @param receiverDestination The address where the receiver's payment cut is sent." + }, + "functionSelector": "81cd11a0", + "id": 2488, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "3137:7:23", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2486, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2475, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "3167:11:23", + "nodeType": "VariableDeclaration", + "scope": 2488, + "src": "3154:24:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2474, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2473, + "name": "PaymentTypes", + "nameLocations": ["3154:12:23"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "3154:12:23" + }, + "referencedDeclaration": 2433, + "src": "3154:12:23", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2477, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "3196:8:23", + "nodeType": "VariableDeclaration", + "scope": 2488, + "src": "3188:16:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2476, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3188:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2479, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "3222:6:23", + "nodeType": "VariableDeclaration", + "scope": 2488, + "src": "3214:14:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2478, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3214:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2481, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "3246:11:23", + "nodeType": "VariableDeclaration", + "scope": 2488, + "src": "3238:19:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2480, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3238:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2483, + "mutability": "mutable", + "name": "dataServiceCut", + "nameLocation": "3275:14:23", + "nodeType": "VariableDeclaration", + "scope": 2488, + "src": "3267:22:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2482, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3267:7:23", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2485, + "mutability": "mutable", + "name": "receiverDestination", + "nameLocation": "3307:19:23", + "nodeType": "VariableDeclaration", + "scope": 2488, + "src": "3299:27:23", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2484, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3299:7:23", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3144:188:23" + }, + "returnParameters": { + "id": 2487, + "nodeType": "ParameterList", + "parameters": [], + "src": "3341:0:23" + }, + "scope": 2489, + "src": "3128:214:23", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2490, + "src": "475:2869:23", + "usedErrors": [2462, 2467], + "usedEvents": [2457] + } + ], + "src": "45:3300:23" + }, + "id": 23 + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol", + "exportedSymbols": { + "IGraphProxyAdmin": [2493] + }, + "id": 2494, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2491, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:24" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IGraphProxyAdmin", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2492, + "nodeType": "StructuredDocumentation", + "src": "71:282:24", + "text": " @title IGraphProxyAdmin\n @dev Empty interface to allow the GraphProxyAdmin contract to be used\n in the GraphDirectory contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 2493, + "linearizedBaseContracts": [2493], + "name": "IGraphProxyAdmin", + "nameLocation": "364:16:24", + "nodeType": "ContractDefinition", + "nodes": [], + "scope": 2494, + "src": "354:29:24", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:338:24" + }, + "id": 24 + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol", + "exportedSymbols": { + "IGraphPayments": [2489], + "IGraphTallyCollector": [2605], + "IPaymentsCollector": [2658] + }, + "id": 2606, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2495, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:25" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol", + "file": "./IPaymentsCollector.sol", + "id": 2497, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2606, + "sourceUnit": 2659, + "src": "70:62:25", + "symbolAliases": [ + { + "foreign": { + "id": 2496, + "name": "IPaymentsCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2658, + "src": "79:18:25", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "./IGraphPayments.sol", + "id": 2499, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2606, + "sourceUnit": 2490, + "src": "133:54:25", + "symbolAliases": [ + { + "foreign": { + "id": 2498, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "142:14:25", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 2501, + "name": "IPaymentsCollector", + "nameLocations": ["681:18:25"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2658, + "src": "681:18:25" + }, + "id": 2502, + "nodeType": "InheritanceSpecifier", + "src": "681:18:25" + } + ], + "canonicalName": "IGraphTallyCollector", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2500, + "nodeType": "StructuredDocumentation", + "src": "189:457:25", + "text": " @title Interface for the {GraphTallyCollector} contract\n @dev Implements the {IPaymentCollector} interface as defined by the Graph\n Horizon payments protocol.\n @notice Implements a payments collector contract that can be used to collect\n payments using a GraphTally RAV (Receipt Aggregate Voucher).\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 2605, + "linearizedBaseContracts": [2605, 2658], + "name": "IGraphTallyCollector", + "nameLocation": "657:20:25", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IGraphTallyCollector.ReceiptAggregateVoucher", + "documentation": { + "id": 2503, + "nodeType": "StructuredDocumentation", + "src": "706:831:25", + "text": " @notice The Receipt Aggregate Voucher (RAV) struct\n @param collectionId The ID of the collection \"bucket\" the RAV belongs to. Note that multiple RAVs can be collected for the same collection id.\n @param payer The address of the payer the RAV was issued by\n @param serviceProvider The address of the service provider the RAV was issued to\n @param dataService The address of the data service the RAV was issued to\n @param timestampNs The RAV timestamp, indicating the latest GraphTally Receipt in the RAV\n @param valueAggregate The total amount owed to the service provider since the beginning of the payer-service provider relationship, including all debt that is already paid for.\n @param metadata Arbitrary metadata to extend functionality if a data service requires it" + }, + "id": 2518, + "members": [ + { + "constant": false, + "id": 2505, + "mutability": "mutable", + "name": "collectionId", + "nameLocation": "1591:12:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1583:20:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2504, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1583:7:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2507, + "mutability": "mutable", + "name": "payer", + "nameLocation": "1621:5:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1613:13:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2506, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1613:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2509, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1644:15:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1636:23:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2508, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1636:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2511, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "1677:11:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1669:19:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2510, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1669:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2513, + "mutability": "mutable", + "name": "timestampNs", + "nameLocation": "1705:11:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1698:18:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2512, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1698:6:25", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2515, + "mutability": "mutable", + "name": "valueAggregate", + "nameLocation": "1734:14:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1726:22:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + }, + "typeName": { + "id": 2514, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "1726:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2517, + "mutability": "mutable", + "name": "metadata", + "nameLocation": "1764:8:25", + "nodeType": "VariableDeclaration", + "scope": 2518, + "src": "1758:14:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2516, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1758:5:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "name": "ReceiptAggregateVoucher", + "nameLocation": "1549:23:25", + "nodeType": "StructDefinition", + "scope": 2605, + "src": "1542:237:25", + "visibility": "public" + }, + { + "canonicalName": "IGraphTallyCollector.SignedRAV", + "documentation": { + "id": 2519, + "nodeType": "StructuredDocumentation", + "src": "1785:191:25", + "text": " @notice A struct representing a signed RAV\n @param rav The RAV\n @param signature The signature of the RAV - 65 bytes: r (32 Bytes) || s (32 Bytes) || v (1 Byte)" + }, + "id": 2525, + "members": [ + { + "constant": false, + "id": 2522, + "mutability": "mutable", + "name": "rav", + "nameLocation": "2032:3:25", + "nodeType": "VariableDeclaration", + "scope": 2525, + "src": "2008:27:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_storage_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher" + }, + "typeName": { + "id": 2521, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2520, + "name": "ReceiptAggregateVoucher", + "nameLocations": ["2008:23:25"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2518, + "src": "2008:23:25" + }, + "referencedDeclaration": 2518, + "src": "2008:23:25", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_storage_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2524, + "mutability": "mutable", + "name": "signature", + "nameLocation": "2051:9:25", + "nodeType": "VariableDeclaration", + "scope": 2525, + "src": "2045:15:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2523, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2045:5:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "name": "SignedRAV", + "nameLocation": "1988:9:25", + "nodeType": "StructDefinition", + "scope": 2605, + "src": "1981:86:25", + "visibility": "public" + }, + { + "anonymous": false, + "documentation": { + "id": 2526, + "nodeType": "StructuredDocumentation", + "src": "2073:525:25", + "text": " @notice Emitted when a RAV is collected\n @param collectionId The ID of the collection \"bucket\" the RAV belongs to.\n @param payer The address of the payer\n @param dataService The address of the data service\n @param serviceProvider The address of the service provider\n @param timestampNs The timestamp of the RAV\n @param valueAggregate The total amount owed to the service provider\n @param metadata Arbitrary metadata\n @param signature The signature of the RAV" + }, + "eventSelector": "3943fc3b19ec289c87b57de7a8bf1448d81ced03d1806144ecaca4ba9e976056", + "id": 2544, + "name": "RAVCollected", + "nameLocation": "2609:12:25", + "nodeType": "EventDefinition", + "parameters": { + "id": 2543, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2528, + "indexed": true, + "mutability": "mutable", + "name": "collectionId", + "nameLocation": "2647:12:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2631:28:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2527, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2631:7:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2530, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "2685:5:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2669:21:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2529, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2669:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2532, + "indexed": false, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2708:15:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2700:23:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2531, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2700:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2534, + "indexed": true, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "2749:11:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2733:27:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2533, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2733:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2536, + "indexed": false, + "mutability": "mutable", + "name": "timestampNs", + "nameLocation": "2777:11:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2770:18:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2535, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2770:6:25", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2538, + "indexed": false, + "mutability": "mutable", + "name": "valueAggregate", + "nameLocation": "2806:14:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2798:22:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + }, + "typeName": { + "id": 2537, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "2798:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2540, + "indexed": false, + "mutability": "mutable", + "name": "metadata", + "nameLocation": "2836:8:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2830:14:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2539, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2830:5:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2542, + "indexed": false, + "mutability": "mutable", + "name": "signature", + "nameLocation": "2860:9:25", + "nodeType": "VariableDeclaration", + "scope": 2544, + "src": "2854:15:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2541, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2854:5:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2621:254:25" + }, + "src": "2603:273:25" + }, + { + "documentation": { + "id": 2545, + "nodeType": "StructuredDocumentation", + "src": "2882:64:25", + "text": " @notice Thrown when the RAV signer is invalid" + }, + "errorSelector": "aa415c33", + "id": 2547, + "name": "GraphTallyCollectorInvalidRAVSigner", + "nameLocation": "2957:35:25", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2546, + "nodeType": "ParameterList", + "parameters": [], + "src": "2992:2:25" + }, + "src": "2951:44:25" + }, + { + "documentation": { + "id": 2548, + "nodeType": "StructuredDocumentation", + "src": "3001:168:25", + "text": " @notice Thrown when the RAV is for a data service the service provider has no provision for\n @param dataService The address of the data service" + }, + "errorSelector": "de8b47c0", + "id": 2552, + "name": "GraphTallyCollectorUnauthorizedDataService", + "nameLocation": "3180:42:25", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2551, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2550, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "3231:11:25", + "nodeType": "VariableDeclaration", + "scope": 2552, + "src": "3223:19:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2549, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3223:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3222:21:25" + }, + "src": "3174:70:25" + }, + { + "documentation": { + "id": 2553, + "nodeType": "StructuredDocumentation", + "src": "3250:200:25", + "text": " @notice Thrown when the caller is not the data service the RAV was issued to\n @param caller The address of the caller\n @param dataService The address of the data service" + }, + "errorSelector": "56cbc92e", + "id": 2559, + "name": "GraphTallyCollectorCallerNotDataService", + "nameLocation": "3461:39:25", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2558, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2555, + "mutability": "mutable", + "name": "caller", + "nameLocation": "3509:6:25", + "nodeType": "VariableDeclaration", + "scope": 2559, + "src": "3501:14:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2554, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3501:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2557, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "3525:11:25", + "nodeType": "VariableDeclaration", + "scope": 2559, + "src": "3517:19:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2556, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3517:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3500:37:25" + }, + "src": "3455:83:25" + }, + { + "documentation": { + "id": 2560, + "nodeType": "StructuredDocumentation", + "src": "3544:292:25", + "text": " @notice Thrown when the tokens collected are inconsistent with the collection history\n Each RAV should have a value greater than the previous one\n @param tokens The amount of tokens in the RAV\n @param tokensCollected The amount of tokens already collected" + }, + "errorSelector": "7007d4a1", + "id": 2566, + "name": "GraphTallyCollectorInconsistentRAVTokens", + "nameLocation": "3847:40:25", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2565, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2562, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "3896:6:25", + "nodeType": "VariableDeclaration", + "scope": 2566, + "src": "3888:14:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2561, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3888:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2564, + "mutability": "mutable", + "name": "tokensCollected", + "nameLocation": "3912:15:25", + "nodeType": "VariableDeclaration", + "scope": 2566, + "src": "3904:23:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2563, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3904:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3887:41:25" + }, + "src": "3841:88:25" + }, + { + "documentation": { + "id": 2567, + "nodeType": "StructuredDocumentation", + "src": "3935:231:25", + "text": " @notice Thrown when the attempting to collect more tokens than what it's owed\n @param tokensToCollect The amount of tokens to collect\n @param maxTokensToCollect The maximum amount of tokens to collect" + }, + "errorSelector": "c5602bb1", + "id": 2573, + "name": "GraphTallyCollectorInvalidTokensToCollectAmount", + "nameLocation": "4177:47:25", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2572, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2569, + "mutability": "mutable", + "name": "tokensToCollect", + "nameLocation": "4233:15:25", + "nodeType": "VariableDeclaration", + "scope": 2573, + "src": "4225:23:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2568, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4225:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2571, + "mutability": "mutable", + "name": "maxTokensToCollect", + "nameLocation": "4258:18:25", + "nodeType": "VariableDeclaration", + "scope": 2573, + "src": "4250:26:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2570, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4250:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4224:53:25" + }, + "src": "4171:107:25" + }, + { + "documentation": { + "id": 2574, + "nodeType": "StructuredDocumentation", + "src": "4284:813:25", + "text": " @notice See {IPaymentsCollector.collect}\n This variant adds the ability to partially collect a RAV by specifying the amount of tokens to collect.\n Requirements:\n - The amount of tokens to collect must be less than or equal to the total amount of tokens in the RAV minus\n the tokens already collected.\n @param paymentType The payment type to collect\n @param data Additional data required for the payment collection. Encoded as follows:\n - SignedRAV `signedRAV`: The signed RAV\n - uint256 `dataServiceCut`: The data service cut in PPM\n - address `receiverDestination`: The address where the receiver's payment should be sent.\n @param tokensToCollect The amount of tokens to collect\n @return The amount of tokens collected" + }, + "functionSelector": "692209ce", + "id": 2586, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "5111:7:25", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2582, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2577, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "5156:11:25", + "nodeType": "VariableDeclaration", + "scope": 2586, + "src": "5128:39:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2576, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2575, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["5128:14:25", "5143:12:25"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "5128:27:25" + }, + "referencedDeclaration": 2433, + "src": "5128:27:25", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2579, + "mutability": "mutable", + "name": "data", + "nameLocation": "5192:4:25", + "nodeType": "VariableDeclaration", + "scope": 2586, + "src": "5177:19:25", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2578, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5177:5:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2581, + "mutability": "mutable", + "name": "tokensToCollect", + "nameLocation": "5214:15:25", + "nodeType": "VariableDeclaration", + "scope": 2586, + "src": "5206:23:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2580, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5206:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5118:117:25" + }, + "returnParameters": { + "id": 2585, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2584, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2586, + "src": "5254:7:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2583, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5254:7:25", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5253:9:25" + }, + "scope": 2605, + "src": "5102:161:25", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2587, + "nodeType": "StructuredDocumentation", + "src": "5269:212:25", + "text": " @dev Recovers the signer address of a signed ReceiptAggregateVoucher (RAV).\n @param signedRAV The SignedRAV containing the RAV and its signature.\n @return The address of the signer." + }, + "functionSelector": "63648817", + "id": 2595, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "recoverRAVSigner", + "nameLocation": "5495:16:25", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2591, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2590, + "mutability": "mutable", + "name": "signedRAV", + "nameLocation": "5531:9:25", + "nodeType": "VariableDeclaration", + "scope": 2595, + "src": "5512:28:25", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_calldata_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV" + }, + "typeName": { + "id": 2589, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2588, + "name": "SignedRAV", + "nameLocations": ["5512:9:25"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2525, + "src": "5512:9:25" + }, + "referencedDeclaration": 2525, + "src": "5512:9:25", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_storage_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV" + } + }, + "visibility": "internal" + } + ], + "src": "5511:30:25" + }, + "returnParameters": { + "id": 2594, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2593, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2595, + "src": "5565:7:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2592, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5565:7:25", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5564:9:25" + }, + "scope": 2605, + "src": "5486:88:25", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2596, + "nodeType": "StructuredDocumentation", + "src": "5580:170:25", + "text": " @dev Computes the hash of a ReceiptAggregateVoucher (RAV).\n @param rav The RAV for which to compute the hash.\n @return The hash of the RAV." + }, + "functionSelector": "26969c4c", + "id": 2604, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "encodeRAV", + "nameLocation": "5764:9:25", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2600, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2599, + "mutability": "mutable", + "name": "rav", + "nameLocation": "5807:3:25", + "nodeType": "VariableDeclaration", + "scope": 2604, + "src": "5774:36:25", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_calldata_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher" + }, + "typeName": { + "id": 2598, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2597, + "name": "ReceiptAggregateVoucher", + "nameLocations": ["5774:23:25"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2518, + "src": "5774:23:25" + }, + "referencedDeclaration": 2518, + "src": "5774:23:25", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_storage_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher" + } + }, + "visibility": "internal" + } + ], + "src": "5773:38:25" + }, + "returnParameters": { + "id": 2603, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2602, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2604, + "src": "5835:7:25", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2601, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5835:7:25", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5834:9:25" + }, + "scope": 2605, + "src": "5755:89:25", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2606, + "src": "647:5199:25", + "usedErrors": [2547, 2552, 2559, 2566, 2573], + "usedEvents": [2544, 2646] + } + ], + "src": "45:5802:25" + }, + "id": 25 + }, + "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "exportedSymbols": { + "IHorizonStaking": [2625], + "IHorizonStakingBase": [3046], + "IHorizonStakingExtension": [3226], + "IHorizonStakingMain": [3937], + "IHorizonStakingTypes": [4073] + }, + "id": 2626, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2607, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:26" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol", + "file": "./internal/IHorizonStakingTypes.sol", + "id": 2609, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2626, + "sourceUnit": 4074, + "src": "71:75:26", + "symbolAliases": [ + { + "foreign": { + "id": 2608, + "name": "IHorizonStakingTypes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4073, + "src": "80:20:26", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol", + "file": "./internal/IHorizonStakingMain.sol", + "id": 2611, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2626, + "sourceUnit": 3938, + "src": "147:73:26", + "symbolAliases": [ + { + "foreign": { + "id": 2610, + "name": "IHorizonStakingMain", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3937, + "src": "156:19:26", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol", + "file": "./internal/IHorizonStakingBase.sol", + "id": 2613, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2626, + "sourceUnit": 3047, + "src": "221:73:26", + "symbolAliases": [ + { + "foreign": { + "id": 2612, + "name": "IHorizonStakingBase", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3046, + "src": "230:19:26", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol", + "file": "./internal/IHorizonStakingExtension.sol", + "id": 2615, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2626, + "sourceUnit": 3227, + "src": "295:83:26", + "symbolAliases": [ + { + "foreign": { + "id": 2614, + "name": "IHorizonStakingExtension", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3226, + "src": "304:24:26", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 2617, + "name": "IHorizonStakingTypes", + "nameLocations": ["888:20:26"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4073, + "src": "888:20:26" + }, + "id": 2618, + "nodeType": "InheritanceSpecifier", + "src": "888:20:26" + }, + { + "baseName": { + "id": 2619, + "name": "IHorizonStakingBase", + "nameLocations": ["910:19:26"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3046, + "src": "910:19:26" + }, + "id": 2620, + "nodeType": "InheritanceSpecifier", + "src": "910:19:26" + }, + { + "baseName": { + "id": 2621, + "name": "IHorizonStakingMain", + "nameLocations": ["931:19:26"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3937, + "src": "931:19:26" + }, + "id": 2622, + "nodeType": "InheritanceSpecifier", + "src": "931:19:26" + }, + { + "baseName": { + "id": 2623, + "name": "IHorizonStakingExtension", + "nameLocations": ["952:24:26"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3226, + "src": "952:24:26" + }, + "id": 2624, + "nodeType": "InheritanceSpecifier", + "src": "952:24:26" + } + ], + "canonicalName": "IHorizonStaking", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2616, + "nodeType": "StructuredDocumentation", + "src": "380:478:26", + "text": " @title Complete interface for the Horizon Staking contract\n @notice This interface exposes all functions implemented by the {HorizonStaking} contract and its extension\n {HorizonStakingExtension} as well as the custom data types used by the contract.\n @dev Use this interface to interact with the Horizon Staking contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 2625, + "linearizedBaseContracts": [2625, 3226, 561, 3937, 3046, 4073], + "name": "IHorizonStaking", + "nameLocation": "869:15:26", + "nodeType": "ContractDefinition", + "nodes": [], + "scope": 2626, + "src": "859:120:26", + "usedErrors": [ + 2877, 3500, 3507, 3514, 3521, 3530, 3535, 3540, 3547, 3550, 3557, 3564, 3571, 3574, 3581, 3588, 3595, + 3602, 3605, 3608, 3611, 3614, 3617, 3622, 3627, 3630, 3635, 3638, 3641 + ], + "usedEvents": [ + 2874, 3097, 3122, 3133, 3242, 3249, 3262, 3271, 3280, 3289, 3300, 3311, 3322, 3331, 3340, 3349, 3360, + 3373, 3386, 3397, 3406, 3415, 3427, 3447, 3463, 3479, 3484, 3491, 3494, 3497 + ] + } + ], + "src": "46:934:26" + }, + "id": 26 + }, + "@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol", + "exportedSymbols": { + "IGraphPayments": [2489], + "IPaymentsCollector": [2658] + }, + "id": 2659, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2627, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:27" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "./IGraphPayments.sol", + "id": 2629, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2659, + "sourceUnit": 2490, + "src": "71:54:27", + "symbolAliases": [ + { + "foreign": { + "id": 2628, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "80:14:27", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IPaymentsCollector", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2630, + "nodeType": "StructuredDocumentation", + "src": "127:631:27", + "text": " @title Interface for a payments collector contract as defined by Graph Horizon payments protocol\n @notice Contracts implementing this interface can be used with the payments protocol. First, a payer must\n approve the collector to collect payments on their behalf. Only then can payment collection be initiated\n using the collector contract.\n @dev It's important to note that it's the collector contract's responsibility to validate the payment\n request is legitimate.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 2658, + "linearizedBaseContracts": [2658], + "name": "IPaymentsCollector", + "nameLocation": "769:18:27", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 2631, + "nodeType": "StructuredDocumentation", + "src": "794:487:27", + "text": " @notice Emitted when a payment is collected\n @param paymentType The payment type collected as defined by {IGraphPayments}\n @param collectionId The id for the collection. Can be used at the discretion of the collector to group multiple payments.\n @param payer The address of the payer\n @param receiver The address of the receiver\n @param dataService The address of the data service\n @param tokens The amount of tokens being collected" + }, + "eventSelector": "481a17595c709e8f745444fb9ffc8f0b5e98458de94463971947f548e12bbdb4", + "id": 2646, + "name": "PaymentCollected", + "nameLocation": "1292:16:27", + "nodeType": "EventDefinition", + "parameters": { + "id": 2645, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2634, + "indexed": false, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "1346:11:27", + "nodeType": "VariableDeclaration", + "scope": 2646, + "src": "1318:39:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2633, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2632, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["1318:14:27", "1333:12:27"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "1318:27:27" + }, + "referencedDeclaration": 2433, + "src": "1318:27:27", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2636, + "indexed": true, + "mutability": "mutable", + "name": "collectionId", + "nameLocation": "1383:12:27", + "nodeType": "VariableDeclaration", + "scope": 2646, + "src": "1367:28:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2635, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1367:7:27", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2638, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "1421:5:27", + "nodeType": "VariableDeclaration", + "scope": 2646, + "src": "1405:21:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2637, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1405:7:27", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2640, + "indexed": false, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "1444:8:27", + "nodeType": "VariableDeclaration", + "scope": 2646, + "src": "1436:16:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2639, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1436:7:27", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2642, + "indexed": true, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "1478:11:27", + "nodeType": "VariableDeclaration", + "scope": 2646, + "src": "1462:27:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2641, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1462:7:27", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2644, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1507:6:27", + "nodeType": "VariableDeclaration", + "scope": 2646, + "src": "1499:14:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2643, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1499:7:27", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1308:211:27" + }, + "src": "1286:234:27" + }, + { + "documentation": { + "id": 2647, + "nodeType": "StructuredDocumentation", + "src": "1526:613:27", + "text": " @notice Initiate a payment collection through the payments protocol\n @dev This function should require the caller to present some form of evidence of the payer's debt to\n the receiver. The collector should validate this evidence and, if valid, collect the payment.\n Emits a {PaymentCollected} event\n @param paymentType The payment type to collect, as defined by {IGraphPayments}\n @param data Additional data required for the payment collection. Will vary depending on the collector\n implementation.\n @return The amount of tokens collected" + }, + "functionSelector": "7f07d283", + "id": 2657, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "2153:7:27", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2653, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2650, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "2189:11:27", + "nodeType": "VariableDeclaration", + "scope": 2657, + "src": "2161:39:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2649, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2648, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["2161:14:27", "2176:12:27"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "2161:27:27" + }, + "referencedDeclaration": 2433, + "src": "2161:27:27", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2652, + "mutability": "mutable", + "name": "data", + "nameLocation": "2215:4:27", + "nodeType": "VariableDeclaration", + "scope": 2657, + "src": "2202:17:27", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2651, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2202:5:27", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2160:60:27" + }, + "returnParameters": { + "id": 2656, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2655, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2657, + "src": "2239:7:27", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2654, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2239:7:27", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2238:9:27" + }, + "scope": 2658, + "src": "2144:104:27", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2659, + "src": "759:1491:27", + "usedErrors": [], + "usedEvents": [2646] + } + ], + "src": "46:2205:27" + }, + "id": 27 + }, + "@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol", + "exportedSymbols": { + "IGraphPayments": [2489], + "IPaymentsEscrow": [2858] + }, + "id": 2859, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2660, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:28" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "./IGraphPayments.sol", + "id": 2662, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2859, + "sourceUnit": 2490, + "src": "70:54:28", + "symbolAliases": [ + { + "foreign": { + "id": 2661, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "79:14:28", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IPaymentsEscrow", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2663, + "nodeType": "StructuredDocumentation", + "src": "126:771:28", + "text": " @title Interface for the {PaymentsEscrow} contract\n @notice This contract is part of the Graph Horizon payments protocol. It holds the funds (GRT)\n for payments made through the payments protocol for services provided\n via a Graph Horizon data service.\n Payers deposit funds on the escrow, signalling their ability to pay for a service, and only\n being able to retrieve them after a thawing period. Receivers collect funds from the escrow,\n provided the payer has authorized them. The payer authorization is delegated to a payment\n collector contract which implements the {IPaymentsCollector} interface.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 2858, + "linearizedBaseContracts": [2858], + "name": "IPaymentsEscrow", + "nameLocation": "908:15:28", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IPaymentsEscrow.EscrowAccount", + "documentation": { + "id": 2664, + "nodeType": "StructuredDocumentation", + "src": "930:331:28", + "text": " @notice Escrow account for a payer-collector-receiver tuple\n @param balance The total token balance for the payer-collector-receiver tuple\n @param tokensThawing The amount of tokens currently being thawed\n @param thawEndTimestamp The timestamp at which thawing period ends (zero if not thawing)" + }, + "id": 2671, + "members": [ + { + "constant": false, + "id": 2666, + "mutability": "mutable", + "name": "balance", + "nameLocation": "1305:7:28", + "nodeType": "VariableDeclaration", + "scope": 2671, + "src": "1297:15:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2665, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1297:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2668, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "1330:13:28", + "nodeType": "VariableDeclaration", + "scope": 2671, + "src": "1322:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2667, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1322:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2670, + "mutability": "mutable", + "name": "thawEndTimestamp", + "nameLocation": "1361:16:28", + "nodeType": "VariableDeclaration", + "scope": 2671, + "src": "1353:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2669, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1353:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "EscrowAccount", + "nameLocation": "1273:13:28", + "nodeType": "StructDefinition", + "scope": 2858, + "src": "1266:118:28", + "visibility": "public" + }, + { + "anonymous": false, + "documentation": { + "id": 2672, + "nodeType": "StructuredDocumentation", + "src": "1390:316:28", + "text": " @notice Emitted when a payer deposits funds into the escrow for a payer-collector-receiver tuple\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens deposited" + }, + "eventSelector": "7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96", + "id": 2682, + "name": "Deposit", + "nameLocation": "1717:7:28", + "nodeType": "EventDefinition", + "parameters": { + "id": 2681, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2674, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "1741:5:28", + "nodeType": "VariableDeclaration", + "scope": 2682, + "src": "1725:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2673, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1725:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2676, + "indexed": true, + "mutability": "mutable", + "name": "collector", + "nameLocation": "1764:9:28", + "nodeType": "VariableDeclaration", + "scope": 2682, + "src": "1748:25:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2675, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1748:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2678, + "indexed": true, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "1791:8:28", + "nodeType": "VariableDeclaration", + "scope": 2682, + "src": "1775:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2677, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1775:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2680, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1809:6:28", + "nodeType": "VariableDeclaration", + "scope": 2682, + "src": "1801:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2679, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1801:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1724:92:28" + }, + "src": "1711:106:28" + }, + { + "anonymous": false, + "documentation": { + "id": 2683, + "nodeType": "StructuredDocumentation", + "src": "1823:378:28", + "text": " @notice Emitted when a payer cancels an escrow thawing\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokensThawing The amount of tokens that were being thawed\n @param thawEndTimestamp The timestamp at which the thawing period was ending" + }, + "eventSelector": "6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535", + "id": 2695, + "name": "CancelThaw", + "nameLocation": "2212:10:28", + "nodeType": "EventDefinition", + "parameters": { + "id": 2694, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2685, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "2248:5:28", + "nodeType": "VariableDeclaration", + "scope": 2695, + "src": "2232:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2684, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2232:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2687, + "indexed": true, + "mutability": "mutable", + "name": "collector", + "nameLocation": "2279:9:28", + "nodeType": "VariableDeclaration", + "scope": 2695, + "src": "2263:25:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2686, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2263:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2689, + "indexed": true, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "2314:8:28", + "nodeType": "VariableDeclaration", + "scope": 2695, + "src": "2298:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2688, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2298:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2691, + "indexed": false, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "2340:13:28", + "nodeType": "VariableDeclaration", + "scope": 2695, + "src": "2332:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2690, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2332:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2693, + "indexed": false, + "mutability": "mutable", + "name": "thawEndTimestamp", + "nameLocation": "2371:16:28", + "nodeType": "VariableDeclaration", + "scope": 2695, + "src": "2363:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2692, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2363:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2222:171:28" + }, + "src": "2206:188:28" + }, + { + "anonymous": false, + "documentation": { + "id": 2696, + "nodeType": "StructuredDocumentation", + "src": "2400:394:28", + "text": " @notice Emitted when a payer thaws funds from the escrow for a payer-collector-receiver tuple\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens being thawed\n @param thawEndTimestamp The timestamp at which the thawing period ends" + }, + "eventSelector": "ba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc", + "id": 2708, + "name": "Thaw", + "nameLocation": "2805:4:28", + "nodeType": "EventDefinition", + "parameters": { + "id": 2707, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2698, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "2835:5:28", + "nodeType": "VariableDeclaration", + "scope": 2708, + "src": "2819:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2697, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2819:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2700, + "indexed": true, + "mutability": "mutable", + "name": "collector", + "nameLocation": "2866:9:28", + "nodeType": "VariableDeclaration", + "scope": 2708, + "src": "2850:25:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2699, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2850:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2702, + "indexed": true, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "2901:8:28", + "nodeType": "VariableDeclaration", + "scope": 2708, + "src": "2885:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2701, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2885:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2704, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2927:6:28", + "nodeType": "VariableDeclaration", + "scope": 2708, + "src": "2919:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2703, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2919:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2706, + "indexed": false, + "mutability": "mutable", + "name": "thawEndTimestamp", + "nameLocation": "2951:16:28", + "nodeType": "VariableDeclaration", + "scope": 2708, + "src": "2943:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2705, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2943:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2809:164:28" + }, + "src": "2799:175:28" + }, + { + "anonymous": false, + "documentation": { + "id": 2709, + "nodeType": "StructuredDocumentation", + "src": "2980:317:28", + "text": " @notice Emitted when a payer withdraws funds from the escrow for a payer-collector-receiver tuple\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens withdrawn" + }, + "eventSelector": "3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f7", + "id": 2719, + "name": "Withdraw", + "nameLocation": "3308:8:28", + "nodeType": "EventDefinition", + "parameters": { + "id": 2718, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2711, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "3333:5:28", + "nodeType": "VariableDeclaration", + "scope": 2719, + "src": "3317:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2710, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3317:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2713, + "indexed": true, + "mutability": "mutable", + "name": "collector", + "nameLocation": "3356:9:28", + "nodeType": "VariableDeclaration", + "scope": 2719, + "src": "3340:25:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2712, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3340:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2715, + "indexed": true, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "3383:8:28", + "nodeType": "VariableDeclaration", + "scope": 2719, + "src": "3367:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2714, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3367:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2717, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "3401:6:28", + "nodeType": "VariableDeclaration", + "scope": 2719, + "src": "3393:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2716, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3393:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3316:92:28" + }, + "src": "3302:107:28" + }, + { + "anonymous": false, + "documentation": { + "id": 2720, + "nodeType": "StructuredDocumentation", + "src": "3415:518:28", + "text": " @notice Emitted when a collector collects funds from the escrow for a payer-collector-receiver tuple\n @param paymentType The type of payment being collected as defined in the {IGraphPayments} interface\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens collected\n @param receiverDestination The address where the receiver's payment should be sent." + }, + "eventSelector": "399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c913", + "id": 2735, + "name": "EscrowCollected", + "nameLocation": "3944:15:28", + "nodeType": "EventDefinition", + "parameters": { + "id": 2734, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2723, + "indexed": true, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "4005:11:28", + "nodeType": "VariableDeclaration", + "scope": 2735, + "src": "3969:47:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2722, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2721, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["3969:14:28", "3984:12:28"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "3969:27:28" + }, + "referencedDeclaration": 2433, + "src": "3969:27:28", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2725, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "4042:5:28", + "nodeType": "VariableDeclaration", + "scope": 2735, + "src": "4026:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2724, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4026:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2727, + "indexed": true, + "mutability": "mutable", + "name": "collector", + "nameLocation": "4073:9:28", + "nodeType": "VariableDeclaration", + "scope": 2735, + "src": "4057:25:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2726, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4057:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2729, + "indexed": false, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "4100:8:28", + "nodeType": "VariableDeclaration", + "scope": 2735, + "src": "4092:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2728, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4092:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2731, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "4126:6:28", + "nodeType": "VariableDeclaration", + "scope": 2735, + "src": "4118:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2730, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4118:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2733, + "indexed": false, + "mutability": "mutable", + "name": "receiverDestination", + "nameLocation": "4150:19:28", + "nodeType": "VariableDeclaration", + "scope": 2735, + "src": "4142:27:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2732, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4142:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3959:216:28" + }, + "src": "3938:238:28" + }, + { + "documentation": { + "id": 2736, + "nodeType": "StructuredDocumentation", + "src": "4203:97:28", + "text": " @notice Thrown when a protected function is called and the contract is paused." + }, + "errorSelector": "9e68cf0b", + "id": 2738, + "name": "PaymentsEscrowIsPaused", + "nameLocation": "4311:22:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2737, + "nodeType": "ParameterList", + "parameters": [], + "src": "4333:2:28" + }, + "src": "4305:31:28" + }, + { + "documentation": { + "id": 2739, + "nodeType": "StructuredDocumentation", + "src": "4342:196:28", + "text": " @notice Thrown when the available balance is insufficient to perform an operation\n @param balance The current balance\n @param minBalance The minimum required balance" + }, + "errorSelector": "3db4e691", + "id": 2745, + "name": "PaymentsEscrowInsufficientBalance", + "nameLocation": "4549:33:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2744, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2741, + "mutability": "mutable", + "name": "balance", + "nameLocation": "4591:7:28", + "nodeType": "VariableDeclaration", + "scope": 2745, + "src": "4583:15:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2740, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4583:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2743, + "mutability": "mutable", + "name": "minBalance", + "nameLocation": "4608:10:28", + "nodeType": "VariableDeclaration", + "scope": 2745, + "src": "4600:18:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2742, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4600:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4582:37:28" + }, + "src": "4543:77:28" + }, + { + "documentation": { + "id": 2746, + "nodeType": "StructuredDocumentation", + "src": "4626:92:28", + "text": " @notice Thrown when a thawing is expected to be in progress but it is not" + }, + "errorSelector": "8cbd172f", + "id": 2748, + "name": "PaymentsEscrowNotThawing", + "nameLocation": "4729:24:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2747, + "nodeType": "ParameterList", + "parameters": [], + "src": "4753:2:28" + }, + "src": "4723:33:28" + }, + { + "documentation": { + "id": 2749, + "nodeType": "StructuredDocumentation", + "src": "4762:200:28", + "text": " @notice Thrown when a thawing is still in progress\n @param currentTimestamp The current timestamp\n @param thawEndTimestamp The timestamp at which the thawing period ends" + }, + "errorSelector": "78a1b6f2", + "id": 2755, + "name": "PaymentsEscrowStillThawing", + "nameLocation": "4973:26:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2754, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2751, + "mutability": "mutable", + "name": "currentTimestamp", + "nameLocation": "5008:16:28", + "nodeType": "VariableDeclaration", + "scope": 2755, + "src": "5000:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2750, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5000:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2753, + "mutability": "mutable", + "name": "thawEndTimestamp", + "nameLocation": "5034:16:28", + "nodeType": "VariableDeclaration", + "scope": 2755, + "src": "5026:24:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2752, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5026:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4999:52:28" + }, + "src": "4967:85:28" + }, + { + "documentation": { + "id": 2756, + "nodeType": "StructuredDocumentation", + "src": "5058:200:28", + "text": " @notice Thrown when setting the thawing period to a value greater than the maximum\n @param thawingPeriod The thawing period\n @param maxWaitPeriod The maximum wait period" + }, + "errorSelector": "5c0f65a1", + "id": 2762, + "name": "PaymentsEscrowThawingPeriodTooLong", + "nameLocation": "5269:34:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2761, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2758, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "5312:13:28", + "nodeType": "VariableDeclaration", + "scope": 2762, + "src": "5304:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2757, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5304:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2760, + "mutability": "mutable", + "name": "maxWaitPeriod", + "nameLocation": "5335:13:28", + "nodeType": "VariableDeclaration", + "scope": 2762, + "src": "5327:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2759, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5327:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5303:46:28" + }, + "src": "5263:87:28" + }, + { + "documentation": { + "id": 2763, + "nodeType": "StructuredDocumentation", + "src": "5356:278:28", + "text": " @notice Thrown when the contract balance is not consistent with the collection amount\n @param balanceBefore The balance before the collection\n @param balanceAfter The balance after the collection\n @param tokens The amount of tokens collected" + }, + "errorSelector": "7e09c9ac", + "id": 2771, + "name": "PaymentsEscrowInconsistentCollection", + "nameLocation": "5645:36:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2770, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2765, + "mutability": "mutable", + "name": "balanceBefore", + "nameLocation": "5690:13:28", + "nodeType": "VariableDeclaration", + "scope": 2771, + "src": "5682:21:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2764, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5682:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2767, + "mutability": "mutable", + "name": "balanceAfter", + "nameLocation": "5713:12:28", + "nodeType": "VariableDeclaration", + "scope": 2771, + "src": "5705:20:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2766, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5705:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2769, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "5735:6:28", + "nodeType": "VariableDeclaration", + "scope": 2771, + "src": "5727:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2768, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5727:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5681:61:28" + }, + "src": "5639:104:28" + }, + { + "documentation": { + "id": 2772, + "nodeType": "StructuredDocumentation", + "src": "5749:84:28", + "text": " @notice Thrown when operating a zero token amount is not allowed." + }, + "errorSelector": "ebfc7cdc", + "id": 2774, + "name": "PaymentsEscrowInvalidZeroTokens", + "nameLocation": "5844:31:28", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2773, + "nodeType": "ParameterList", + "parameters": [], + "src": "5875:2:28" + }, + "src": "5838:40:28" + }, + { + "documentation": { + "id": 2775, + "nodeType": "StructuredDocumentation", + "src": "5884:50:28", + "text": " @notice Initialize the contract" + }, + "functionSelector": "8129fc1c", + "id": 2778, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "initialize", + "nameLocation": "5948:10:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2776, + "nodeType": "ParameterList", + "parameters": [], + "src": "5958:2:28" + }, + "returnParameters": { + "id": 2777, + "nodeType": "ParameterList", + "parameters": [], + "src": "5969:0:28" + }, + "scope": 2858, + "src": "5939:31:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2779, + "nodeType": "StructuredDocumentation", + "src": "5976:338:28", + "text": " @notice Deposits funds into the escrow for a payer-collector-receiver tuple, where\n the payer is the transaction caller.\n @dev Emits a {Deposit} event\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens to deposit" + }, + "functionSelector": "8340f549", + "id": 2788, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "deposit", + "nameLocation": "6328:7:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2786, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2781, + "mutability": "mutable", + "name": "collector", + "nameLocation": "6344:9:28", + "nodeType": "VariableDeclaration", + "scope": 2788, + "src": "6336:17:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2780, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6336:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2783, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "6363:8:28", + "nodeType": "VariableDeclaration", + "scope": 2788, + "src": "6355:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2782, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6355:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2785, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6381:6:28", + "nodeType": "VariableDeclaration", + "scope": 2788, + "src": "6373:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2784, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6373:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6335:53:28" + }, + "returnParameters": { + "id": 2787, + "nodeType": "ParameterList", + "parameters": [], + "src": "6397:0:28" + }, + "scope": 2858, + "src": "6319:79:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2789, + "nodeType": "StructuredDocumentation", + "src": "6404:374:28", + "text": " @notice Deposits funds into the escrow for a payer-collector-receiver tuple, where\n the payer can be specified.\n @dev Emits a {Deposit} event\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens to deposit" + }, + "functionSelector": "72eb521e", + "id": 2800, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "depositTo", + "nameLocation": "6792:9:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2798, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2791, + "mutability": "mutable", + "name": "payer", + "nameLocation": "6810:5:28", + "nodeType": "VariableDeclaration", + "scope": 2800, + "src": "6802:13:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2790, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6802:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2793, + "mutability": "mutable", + "name": "collector", + "nameLocation": "6825:9:28", + "nodeType": "VariableDeclaration", + "scope": 2800, + "src": "6817:17:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2792, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6817:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2795, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "6844:8:28", + "nodeType": "VariableDeclaration", + "scope": 2800, + "src": "6836:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2794, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6836:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2797, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6862:6:28", + "nodeType": "VariableDeclaration", + "scope": 2800, + "src": "6854:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2796, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6854:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6801:68:28" + }, + "returnParameters": { + "id": 2799, + "nodeType": "ParameterList", + "parameters": [], + "src": "6878:0:28" + }, + "scope": 2858, + "src": "6783:96:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2801, + "nodeType": "StructuredDocumentation", + "src": "6885:575:28", + "text": " @notice Thaw a specific amount of escrow from a payer-collector-receiver's escrow account.\n The payer is the transaction caller.\n Note that repeated calls to this function will overwrite the previous thawing amount\n and reset the thawing period.\n @dev Requirements:\n - `tokens` must be less than or equal to the available balance\n Emits a {Thaw} event.\n @param collector The address of the collector\n @param receiver The address of the receiver\n @param tokens The amount of tokens to thaw" + }, + "functionSelector": "f93f1cd0", + "id": 2810, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "thaw", + "nameLocation": "7474:4:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2808, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2803, + "mutability": "mutable", + "name": "collector", + "nameLocation": "7487:9:28", + "nodeType": "VariableDeclaration", + "scope": 2810, + "src": "7479:17:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2802, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7479:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2805, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "7506:8:28", + "nodeType": "VariableDeclaration", + "scope": 2810, + "src": "7498:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2804, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7498:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2807, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "7524:6:28", + "nodeType": "VariableDeclaration", + "scope": 2810, + "src": "7516:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2806, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7516:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7478:53:28" + }, + "returnParameters": { + "id": 2809, + "nodeType": "ParameterList", + "parameters": [], + "src": "7540:0:28" + }, + "scope": 2858, + "src": "7465:76:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2811, + "nodeType": "StructuredDocumentation", + "src": "7547:312:28", + "text": " @notice Cancels the thawing of escrow from a payer-collector-receiver's escrow account.\n @param collector The address of the collector\n @param receiver The address of the receiver\n @dev Requirements:\n - The payer must be thawing funds\n Emits a {CancelThaw} event." + }, + "functionSelector": "b1d07de4", + "id": 2818, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "cancelThaw", + "nameLocation": "7873:10:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2816, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2813, + "mutability": "mutable", + "name": "collector", + "nameLocation": "7892:9:28", + "nodeType": "VariableDeclaration", + "scope": 2818, + "src": "7884:17:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2812, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7884:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2815, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "7911:8:28", + "nodeType": "VariableDeclaration", + "scope": 2818, + "src": "7903:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2814, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7903:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7883:37:28" + }, + "returnParameters": { + "id": 2817, + "nodeType": "ParameterList", + "parameters": [], + "src": "7929:0:28" + }, + "scope": 2858, + "src": "7864:66:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2819, + "nodeType": "StructuredDocumentation", + "src": "7936:486:28", + "text": " @notice Withdraws all thawed escrow from a payer-collector-receiver's escrow account.\n The payer is the transaction caller.\n Note that the withdrawn funds might be less than the thawed amount if there were\n payment collections in the meantime.\n @dev Requirements:\n - Funds must be thawed\n Emits a {Withdraw} event\n @param collector The address of the collector\n @param receiver The address of the receiver" + }, + "functionSelector": "f940e385", + "id": 2826, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "8436:8:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2824, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2821, + "mutability": "mutable", + "name": "collector", + "nameLocation": "8453:9:28", + "nodeType": "VariableDeclaration", + "scope": 2826, + "src": "8445:17:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2820, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8445:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2823, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "8472:8:28", + "nodeType": "VariableDeclaration", + "scope": 2826, + "src": "8464:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2822, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8464:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8444:37:28" + }, + "returnParameters": { + "id": 2825, + "nodeType": "ParameterList", + "parameters": [], + "src": "8490:0:28" + }, + "scope": 2858, + "src": "8427:64:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2827, + "nodeType": "StructuredDocumentation", + "src": "8497:811:28", + "text": " @notice Collects funds from the payer-collector-receiver's escrow and sends them to {GraphPayments} for\n distribution using the Graph Horizon Payments protocol.\n The function will revert if there are not enough funds in the escrow.\n Emits an {EscrowCollected} event\n @param paymentType The type of payment being collected as defined in the {IGraphPayments} interface\n @param payer The address of the payer\n @param receiver The address of the receiver\n @param tokens The amount of tokens to collect\n @param dataService The address of the data service\n @param dataServiceCut The data service cut in PPM that {GraphPayments} should send\n @param receiverDestination The address where the receiver's payment should be sent." + }, + "functionSelector": "1230fa3e", + "id": 2845, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "9322:7:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2843, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2830, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "9367:11:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9339:39:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2829, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2828, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["9339:14:28", "9354:12:28"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "9339:27:28" + }, + "referencedDeclaration": 2433, + "src": "9339:27:28", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2832, + "mutability": "mutable", + "name": "payer", + "nameLocation": "9396:5:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9388:13:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2831, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9388:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2834, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "9419:8:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9411:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2833, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9411:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2836, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "9445:6:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9437:14:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2835, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9437:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2838, + "mutability": "mutable", + "name": "dataService", + "nameLocation": "9469:11:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9461:19:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2837, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9461:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2840, + "mutability": "mutable", + "name": "dataServiceCut", + "nameLocation": "9498:14:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9490:22:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2839, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9490:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2842, + "mutability": "mutable", + "name": "receiverDestination", + "nameLocation": "9530:19:28", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "9522:27:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2841, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9522:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "9329:226:28" + }, + "returnParameters": { + "id": 2844, + "nodeType": "ParameterList", + "parameters": [], + "src": "9564:0:28" + }, + "scope": 2858, + "src": "9313:252:28", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2846, + "nodeType": "StructuredDocumentation", + "src": "9571:397:28", + "text": " @notice Get the balance of a payer-collector-receiver tuple\n This function will return 0 if the current balance is less than the amount of funds being thawed.\n @param payer The address of the payer\n @param collector The address of the collector\n @param receiver The address of the receiver\n @return The balance of the payer-collector-receiver tuple" + }, + "functionSelector": "d6bd603c", + "id": 2857, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getBalance", + "nameLocation": "9982:10:28", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2853, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2848, + "mutability": "mutable", + "name": "payer", + "nameLocation": "10001:5:28", + "nodeType": "VariableDeclaration", + "scope": 2857, + "src": "9993:13:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2847, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9993:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2850, + "mutability": "mutable", + "name": "collector", + "nameLocation": "10016:9:28", + "nodeType": "VariableDeclaration", + "scope": 2857, + "src": "10008:17:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2849, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10008:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2852, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "10035:8:28", + "nodeType": "VariableDeclaration", + "scope": 2857, + "src": "10027:16:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2851, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10027:7:28", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "9992:52:28" + }, + "returnParameters": { + "id": 2856, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2855, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2857, + "src": "10068:7:28", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2854, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10068:7:28", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10067:9:28" + }, + "scope": 2858, + "src": "9973:104:28", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2859, + "src": "898:9181:28", + "usedErrors": [2738, 2745, 2748, 2755, 2762, 2771, 2774], + "usedEvents": [2682, 2695, 2708, 2719, 2735] + } + ], + "src": "45:10035:28" + }, + "id": 28 + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol", + "exportedSymbols": { + "IGraphPayments": [2489], + "IHorizonStakingBase": [3046], + "IHorizonStakingTypes": [4073], + "LinkedList": [4364] + }, + "id": 3047, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2860, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:29" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol", + "file": "./IHorizonStakingTypes.sol", + "id": 2862, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 3047, + "sourceUnit": 4074, + "src": "71:66:29", + "symbolAliases": [ + { + "foreign": { + "id": 2861, + "name": "IHorizonStakingTypes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4073, + "src": "80:20:29", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "../IGraphPayments.sol", + "id": 2864, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 3047, + "sourceUnit": 2490, + "src": "138:55:29", + "symbolAliases": [ + { + "foreign": { + "id": 2863, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "147:14:29", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/LinkedList.sol", + "file": "../../libraries/LinkedList.sol", + "id": 2866, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 3047, + "sourceUnit": 4365, + "src": "195:60:29", + "symbolAliases": [ + { + "foreign": { + "id": 2865, + "name": "LinkedList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4364, + "src": "204:10:29", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IHorizonStakingBase", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 2867, + "nodeType": "StructuredDocumentation", + "src": "257:464:29", + "text": " @title Interface for the {HorizonStakingBase} contract.\n @notice Provides getters for {HorizonStaking} and {HorizonStakingExtension} storage variables.\n @dev Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision\n functions take `serviceProvider` and `verifier` addresses.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 3046, + "linearizedBaseContracts": [3046], + "name": "IHorizonStakingBase", + "nameLocation": "732:19:29", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 2868, + "nodeType": "StructuredDocumentation", + "src": "758:421:29", + "text": " @notice Emitted when a service provider stakes tokens.\n @dev TRANSITION PERIOD: After transition period move to IHorizonStakingMain. Temporarily it\n needs to be here since it's emitted by {_stake} which is used by both {HorizonStaking}\n and {HorizonStakingExtension}.\n @param serviceProvider The address of the service provider.\n @param tokens The amount of tokens staked." + }, + "eventSelector": "48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b", + "id": 2874, + "name": "HorizonStakeDeposited", + "nameLocation": "1190:21:29", + "nodeType": "EventDefinition", + "parameters": { + "id": 2873, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2870, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1228:15:29", + "nodeType": "VariableDeclaration", + "scope": 2874, + "src": "1212:31:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2869, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1212:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2872, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1253:6:29", + "nodeType": "VariableDeclaration", + "scope": 2874, + "src": "1245:14:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2871, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1245:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1211:49:29" + }, + "src": "1184:77:29" + }, + { + "documentation": { + "id": 2875, + "nodeType": "StructuredDocumentation", + "src": "1267:74:29", + "text": " @notice Thrown when using an invalid thaw request type." + }, + "errorSelector": "d7a3f74e", + "id": 2877, + "name": "HorizonStakingInvalidThawRequestType", + "nameLocation": "1352:36:29", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2876, + "nodeType": "ParameterList", + "parameters": [], + "src": "1388:2:29" + }, + "src": "1346:45:29" + }, + { + "documentation": { + "id": 2878, + "nodeType": "StructuredDocumentation", + "src": "1397:178:29", + "text": " @notice Gets the details of a service provider.\n @param serviceProvider The address of the service provider.\n @return The service provider details." + }, + "functionSelector": "8cc01c86", + "id": 2886, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getServiceProvider", + "nameLocation": "1589:18:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2881, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2880, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1625:15:29", + "nodeType": "VariableDeclaration", + "scope": 2886, + "src": "1617:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2879, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1617:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1607:39:29" + }, + "returnParameters": { + "id": 2885, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2884, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2886, + "src": "1670:43:29", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ServiceProvider_$3968_memory_ptr", + "typeString": "struct IHorizonStakingTypes.ServiceProvider" + }, + "typeName": { + "id": 2883, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2882, + "name": "IHorizonStakingTypes.ServiceProvider", + "nameLocations": ["1670:20:29", "1691:15:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3968, + "src": "1670:36:29" + }, + "referencedDeclaration": 3968, + "src": "1670:36:29", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ServiceProvider_$3968_storage_ptr", + "typeString": "struct IHorizonStakingTypes.ServiceProvider" + } + }, + "visibility": "internal" + } + ], + "src": "1669:45:29" + }, + "scope": 3046, + "src": "1580:135:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2887, + "nodeType": "StructuredDocumentation", + "src": "1721:175:29", + "text": " @notice Gets the stake of a service provider.\n @param serviceProvider The address of the service provider.\n @return The amount of tokens staked." + }, + "functionSelector": "7a766460", + "id": 2894, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getStake", + "nameLocation": "1910:8:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2890, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2889, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1927:15:29", + "nodeType": "VariableDeclaration", + "scope": 2894, + "src": "1919:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2888, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1919:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1918:25:29" + }, + "returnParameters": { + "id": 2893, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2892, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2894, + "src": "1967:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2891, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1967:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1966:9:29" + }, + "scope": 3046, + "src": "1901:75:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2895, + "nodeType": "StructuredDocumentation", + "src": "1982:311:29", + "text": " @notice Gets the service provider's idle stake which is the stake that is not being\n used for any provision. Note that this only includes service provider's self stake.\n @param serviceProvider The address of the service provider.\n @return The amount of tokens that are idle." + }, + "functionSelector": "a784d498", + "id": 2902, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getIdleStake", + "nameLocation": "2307:12:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2898, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2897, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2328:15:29", + "nodeType": "VariableDeclaration", + "scope": 2902, + "src": "2320:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2896, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2320:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2319:25:29" + }, + "returnParameters": { + "id": 2901, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2900, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2902, + "src": "2368:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2899, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2368:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2367:9:29" + }, + "scope": 3046, + "src": "2298:79:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2903, + "nodeType": "StructuredDocumentation", + "src": "2383:226:29", + "text": " @notice Gets the details of delegation pool.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @return The delegation pool details." + }, + "functionSelector": "561285e4", + "id": 2913, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDelegationPool", + "nameLocation": "2623:17:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2908, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2905, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2658:15:29", + "nodeType": "VariableDeclaration", + "scope": 2913, + "src": "2650:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2904, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2650:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2907, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "2691:8:29", + "nodeType": "VariableDeclaration", + "scope": 2913, + "src": "2683:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2906, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2683:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2640:65:29" + }, + "returnParameters": { + "id": 2912, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2911, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2913, + "src": "2729:42:29", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_memory_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool" + }, + "typeName": { + "id": 2910, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2909, + "name": "IHorizonStakingTypes.DelegationPool", + "nameLocations": ["2729:20:29", "2750:14:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3992, + "src": "2729:35:29" + }, + "referencedDeclaration": 3992, + "src": "2729:35:29", + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_storage_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool" + } + }, + "visibility": "internal" + } + ], + "src": "2728:44:29" + }, + "scope": 3046, + "src": "2614:159:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2914, + "nodeType": "StructuredDocumentation", + "src": "2779:272:29", + "text": " @notice Gets the details of a delegation.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @param delegator The address of the delegator.\n @return The delegation details." + }, + "functionSelector": "ccebcabb", + "id": 2926, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDelegation", + "nameLocation": "3065:13:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2921, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2916, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3096:15:29", + "nodeType": "VariableDeclaration", + "scope": 2926, + "src": "3088:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2915, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3088:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2918, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "3129:8:29", + "nodeType": "VariableDeclaration", + "scope": 2926, + "src": "3121:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2917, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3121:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2920, + "mutability": "mutable", + "name": "delegator", + "nameLocation": "3155:9:29", + "nodeType": "VariableDeclaration", + "scope": 2926, + "src": "3147:17:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2919, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3147:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3078:92:29" + }, + "returnParameters": { + "id": 2925, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2924, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2926, + "src": "3194:38:29", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Delegation_$4021_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Delegation" + }, + "typeName": { + "id": 2923, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2922, + "name": "IHorizonStakingTypes.Delegation", + "nameLocations": ["3194:20:29", "3215:10:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4021, + "src": "3194:31:29" + }, + "referencedDeclaration": 4021, + "src": "3194:31:29", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Delegation_$4021_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Delegation" + } + }, + "visibility": "internal" + } + ], + "src": "3193:40:29" + }, + "scope": 3046, + "src": "3056:178:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2927, + "nodeType": "StructuredDocumentation", + "src": "3240:327:29", + "text": " @notice Gets the delegation fee cut for a payment type.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @param paymentType The payment type as defined by {IGraphPayments.PaymentTypes}.\n @return The delegation fee cut in PPM." + }, + "functionSelector": "7573ef4f", + "id": 2939, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDelegationFeeCut", + "nameLocation": "3581:19:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2935, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2929, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3618:15:29", + "nodeType": "VariableDeclaration", + "scope": 2939, + "src": "3610:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2928, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3610:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2931, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "3651:8:29", + "nodeType": "VariableDeclaration", + "scope": 2939, + "src": "3643:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2930, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3643:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2934, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "3697:11:29", + "nodeType": "VariableDeclaration", + "scope": 2939, + "src": "3669:39:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 2933, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2932, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["3669:14:29", "3684:12:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "3669:27:29" + }, + "referencedDeclaration": 2433, + "src": "3669:27:29", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + } + ], + "src": "3600:114:29" + }, + "returnParameters": { + "id": 2938, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2937, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2939, + "src": "3738:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2936, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3738:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3737:9:29" + }, + "scope": 3046, + "src": "3572:175:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2940, + "nodeType": "StructuredDocumentation", + "src": "3753:216:29", + "text": " @notice Gets the details of a provision.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @return The provision details." + }, + "functionSelector": "25d9897e", + "id": 2950, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getProvision", + "nameLocation": "3983:12:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2945, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2942, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4013:15:29", + "nodeType": "VariableDeclaration", + "scope": 2950, + "src": "4005:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2941, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4005:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2944, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "4046:8:29", + "nodeType": "VariableDeclaration", + "scope": 2950, + "src": "4038:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2943, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4038:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3995:65:29" + }, + "returnParameters": { + "id": 2949, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2948, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2950, + "src": "4084:37:29", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 2947, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2946, + "name": "IHorizonStakingTypes.Provision", + "nameLocations": ["4084:20:29", "4105:9:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "4084:30:29" + }, + "referencedDeclaration": 3962, + "src": "4084:30:29", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "src": "4083:39:29" + }, + "scope": 3046, + "src": "3974:149:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2951, + "nodeType": "StructuredDocumentation", + "src": "4129:559:29", + "text": " @notice Gets the tokens available in a provision.\n Tokens available are the tokens in a provision that are not thawing. Includes service\n provider's and delegator's stake.\n Allows specifying a `delegationRatio` which caps the amount of delegated tokens that are\n considered available.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @param delegationRatio The delegation ratio.\n @return The amount of tokens available." + }, + "functionSelector": "872d0489", + "id": 2962, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getTokensAvailable", + "nameLocation": "4702:18:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2958, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2953, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4738:15:29", + "nodeType": "VariableDeclaration", + "scope": 2962, + "src": "4730:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2952, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4730:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2955, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "4771:8:29", + "nodeType": "VariableDeclaration", + "scope": 2962, + "src": "4763:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2954, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4763:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2957, + "mutability": "mutable", + "name": "delegationRatio", + "nameLocation": "4796:15:29", + "nodeType": "VariableDeclaration", + "scope": 2962, + "src": "4789:22:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2956, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "4789:6:29", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "4720:97:29" + }, + "returnParameters": { + "id": 2961, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2960, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2962, + "src": "4841:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2959, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4841:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4840:9:29" + }, + "scope": 3046, + "src": "4693:157:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2963, + "nodeType": "StructuredDocumentation", + "src": "4856:326:29", + "text": " @notice Gets the service provider's tokens available in a provision.\n @dev Calculated as the tokens available minus the tokens thawing.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @return The amount of tokens available." + }, + "functionSelector": "08ce5f68", + "id": 2972, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getProviderTokensAvailable", + "nameLocation": "5196:26:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2968, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2965, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "5231:15:29", + "nodeType": "VariableDeclaration", + "scope": 2972, + "src": "5223:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2964, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5223:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2967, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "5256:8:29", + "nodeType": "VariableDeclaration", + "scope": 2972, + "src": "5248:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2966, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5248:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5222:43:29" + }, + "returnParameters": { + "id": 2971, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2970, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2972, + "src": "5289:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2969, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5289:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5288:9:29" + }, + "scope": 3046, + "src": "5187:111:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2973, + "nodeType": "StructuredDocumentation", + "src": "5304:319:29", + "text": " @notice Gets the delegator's tokens available in a provision.\n @dev Calculated as the tokens available minus the tokens thawing.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @return The amount of tokens available." + }, + "functionSelector": "fb744cc0", + "id": 2982, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDelegatedTokensAvailable", + "nameLocation": "5637:27:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2978, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2975, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "5673:15:29", + "nodeType": "VariableDeclaration", + "scope": 2982, + "src": "5665:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2974, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5665:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2977, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "5698:8:29", + "nodeType": "VariableDeclaration", + "scope": 2982, + "src": "5690:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2976, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5690:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5664:43:29" + }, + "returnParameters": { + "id": 2981, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2980, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2982, + "src": "5731:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2979, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5731:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5730:9:29" + }, + "scope": 3046, + "src": "5628:112:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2983, + "nodeType": "StructuredDocumentation", + "src": "5746:200:29", + "text": " @notice Gets a thaw request.\n @param thawRequestType The type of thaw request.\n @param thawRequestId The id of the thaw request.\n @return The thaw request details." + }, + "functionSelector": "d48de845", + "id": 2994, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getThawRequest", + "nameLocation": "5960:14:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2989, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2986, + "mutability": "mutable", + "name": "thawRequestType", + "nameLocation": "6021:15:29", + "nodeType": "VariableDeclaration", + "scope": 2994, + "src": "5984:52:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 2985, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2984, + "name": "IHorizonStakingTypes.ThawRequestType", + "nameLocations": ["5984:20:29", "6005:15:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "5984:36:29" + }, + "referencedDeclaration": 4033, + "src": "5984:36:29", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2988, + "mutability": "mutable", + "name": "thawRequestId", + "nameLocation": "6054:13:29", + "nodeType": "VariableDeclaration", + "scope": 2994, + "src": "6046:21:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2987, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6046:7:29", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5974:99:29" + }, + "returnParameters": { + "id": 2993, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2992, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2994, + "src": "6097:39:29", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ThawRequest_$4043_memory_ptr", + "typeString": "struct IHorizonStakingTypes.ThawRequest" + }, + "typeName": { + "id": 2991, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2990, + "name": "IHorizonStakingTypes.ThawRequest", + "nameLocations": ["6097:20:29", "6118:11:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4043, + "src": "6097:32:29" + }, + "referencedDeclaration": 4043, + "src": "6097:32:29", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ThawRequest_$4043_storage_ptr", + "typeString": "struct IHorizonStakingTypes.ThawRequest" + } + }, + "visibility": "internal" + } + ], + "src": "6096:41:29" + }, + "scope": 3046, + "src": "5951:187:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 2995, + "nodeType": "StructuredDocumentation", + "src": "6144:585:29", + "text": " @notice Gets the metadata of a thaw request list.\n Service provider and delegators each have their own thaw request list per provision.\n Metadata includes the head and tail of the list, plus the total number of thaw requests.\n @param thawRequestType The type of thaw request.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @param owner The owner of the thaw requests. Use either the service provider or delegator address.\n @return The thaw requests list metadata." + }, + "functionSelector": "e56f8a1d", + "id": 3010, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getThawRequestList", + "nameLocation": "6743:18:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3005, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2998, + "mutability": "mutable", + "name": "thawRequestType", + "nameLocation": "6808:15:29", + "nodeType": "VariableDeclaration", + "scope": 3010, + "src": "6771:52:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 2997, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2996, + "name": "IHorizonStakingTypes.ThawRequestType", + "nameLocations": ["6771:20:29", "6792:15:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "6771:36:29" + }, + "referencedDeclaration": 4033, + "src": "6771:36:29", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3000, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "6841:15:29", + "nodeType": "VariableDeclaration", + "scope": 3010, + "src": "6833:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2999, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6833:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3002, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "6874:8:29", + "nodeType": "VariableDeclaration", + "scope": 3010, + "src": "6866:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3001, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6866:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3004, + "mutability": "mutable", + "name": "owner", + "nameLocation": "6900:5:29", + "nodeType": "VariableDeclaration", + "scope": 3010, + "src": "6892:13:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3003, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6892:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6761:150:29" + }, + "returnParameters": { + "id": 3009, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3008, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3010, + "src": "6935:22:29", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_memory_ptr", + "typeString": "struct LinkedList.List" + }, + "typeName": { + "id": 3007, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3006, + "name": "LinkedList.List", + "nameLocations": ["6935:10:29", "6946:4:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "6935:15:29" + }, + "referencedDeclaration": 4090, + "src": "6935:15:29", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + }, + "visibility": "internal" + } + ], + "src": "6934:24:29" + }, + "scope": 3046, + "src": "6734:225:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3011, + "nodeType": "StructuredDocumentation", + "src": "6965:870:29", + "text": " @notice Gets the amount of thawed tokens that can be releasedfor a given provision.\n @dev Note that the value returned by this function does not return the total amount of thawed tokens\n but only those that can be released. If thaw requests are created with different thawing periods it's\n possible that an unexpired thaw request temporarily blocks the release of other ones that have already\n expired. This function will stop counting when it encounters the first thaw request that is not yet expired.\n @param thawRequestType The type of thaw request.\n @param serviceProvider The address of the service provider.\n @param verifier The address of the verifier.\n @param owner The owner of the thaw requests. Use either the service provider or delegator address.\n @return The amount of thawed tokens." + }, + "functionSelector": "2f7cc501", + "id": 3025, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getThawedTokens", + "nameLocation": "7849:15:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3021, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3014, + "mutability": "mutable", + "name": "thawRequestType", + "nameLocation": "7911:15:29", + "nodeType": "VariableDeclaration", + "scope": 3025, + "src": "7874:52:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 3013, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3012, + "name": "IHorizonStakingTypes.ThawRequestType", + "nameLocations": ["7874:20:29", "7895:15:29"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "7874:36:29" + }, + "referencedDeclaration": 4033, + "src": "7874:36:29", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3016, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "7944:15:29", + "nodeType": "VariableDeclaration", + "scope": 3025, + "src": "7936:23:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3015, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7936:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3018, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "7977:8:29", + "nodeType": "VariableDeclaration", + "scope": 3025, + "src": "7969:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3017, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7969:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3020, + "mutability": "mutable", + "name": "owner", + "nameLocation": "8003:5:29", + "nodeType": "VariableDeclaration", + "scope": 3025, + "src": "7995:13:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3019, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7995:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7864:150:29" + }, + "returnParameters": { + "id": 3024, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3023, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3025, + "src": "8038:7:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3022, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8038:7:29", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8037:9:29" + }, + "scope": 3046, + "src": "7840:207:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3026, + "nodeType": "StructuredDocumentation", + "src": "8053:145:29", + "text": " @notice Gets the maximum allowed thawing period for a provision.\n @return The maximum allowed thawing period in seconds." + }, + "functionSelector": "39514ad2", + "id": 3031, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getMaxThawingPeriod", + "nameLocation": "8212:19:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3027, + "nodeType": "ParameterList", + "parameters": [], + "src": "8231:2:29" + }, + "returnParameters": { + "id": 3030, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3029, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3031, + "src": "8257:6:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3028, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8257:6:29", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "8256:8:29" + }, + "scope": 3046, + "src": "8203:62:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3032, + "nodeType": "StructuredDocumentation", + "src": "8271:208:29", + "text": " @notice Return true if the verifier is an allowed locked verifier.\n @param verifier Address of the verifier\n @return True if verifier is allowed locked verifier, false otherwise" + }, + "functionSelector": "ae4fe67a", + "id": 3039, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isAllowedLockedVerifier", + "nameLocation": "8493:23:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3035, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3034, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "8525:8:29", + "nodeType": "VariableDeclaration", + "scope": 3039, + "src": "8517:16:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3033, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8517:7:29", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8516:18:29" + }, + "returnParameters": { + "id": 3038, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3037, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3039, + "src": "8558:4:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3036, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8558:4:29", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "8557:6:29" + }, + "scope": 3046, + "src": "8484:80:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3040, + "nodeType": "StructuredDocumentation", + "src": "8570:161:29", + "text": " @notice Return true if delegation slashing is enabled, false otherwise.\n @return True if delegation slashing is enabled, false otherwise" + }, + "functionSelector": "fc54fb27", + "id": 3045, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isDelegationSlashingEnabled", + "nameLocation": "8745:27:29", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3041, + "nodeType": "ParameterList", + "parameters": [], + "src": "8772:2:29" + }, + "returnParameters": { + "id": 3044, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3043, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3045, + "src": "8798:4:29", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3042, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8798:4:29", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "8797:6:29" + }, + "scope": 3046, + "src": "8736:68:29", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 3047, + "src": "722:8084:29", + "usedErrors": [2877], + "usedEvents": [2874] + } + ], + "src": "46:8761:29" + }, + "id": 29 + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol", + "exportedSymbols": { + "IHorizonStakingExtension": [3226], + "IRewardsIssuer": [561] + }, + "id": 3227, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 3048, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:30" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol", + "file": "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol", + "id": 3050, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 3227, + "sourceUnit": 562, + "src": "71:95:30", + "symbolAliases": [ + { + "foreign": { + "id": 3049, + "name": "IRewardsIssuer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 561, + "src": "80:14:30", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 3052, + "name": "IRewardsIssuer", + "nameLocations": ["477:14:30"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 561, + "src": "477:14:30" + }, + "id": 3053, + "nodeType": "InheritanceSpecifier", + "src": "477:14:30" + } + ], + "canonicalName": "IHorizonStakingExtension", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 3051, + "nodeType": "StructuredDocumentation", + "src": "168:270:30", + "text": " @title Interface for {HorizonStakingExtension} contract.\n @notice Provides functions for managing legacy allocations.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 3226, + "linearizedBaseContracts": [3226, 561], + "name": "IHorizonStakingExtension", + "nameLocation": "449:24:30", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IHorizonStakingExtension.Allocation", + "documentation": { + "id": 3054, + "nodeType": "StructuredDocumentation", + "src": "498:825:30", + "text": " @dev Allocate GRT tokens for the purpose of serving queries of a subgraph deployment\n An allocation is created in the allocate() function and closed in closeAllocation()\n @param indexer The indexer address\n @param subgraphDeploymentID The subgraph deployment ID\n @param tokens The amount of tokens allocated to the subgraph deployment\n @param createdAtEpoch The epoch when the allocation was created\n @param closedAtEpoch The epoch when the allocation was closed\n @param collectedFees The amount of collected fees for the allocation\n @param __DEPRECATED_effectiveAllocation Deprecated field.\n @param accRewardsPerAllocatedToken Snapshot used for reward calculation\n @param distributedRebates The amount of collected rebates that have been rebated" + }, + "id": 3073, + "members": [ + { + "constant": false, + "id": 3056, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "1364:7:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1356:15:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3055, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1356:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3058, + "mutability": "mutable", + "name": "subgraphDeploymentID", + "nameLocation": "1389:20:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1381:28:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3057, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1381:7:30", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3060, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1427:6:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1419:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3059, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1419:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3062, + "mutability": "mutable", + "name": "createdAtEpoch", + "nameLocation": "1451:14:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1443:22:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3061, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1443:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3064, + "mutability": "mutable", + "name": "closedAtEpoch", + "nameLocation": "1483:13:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1475:21:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3063, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1475:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3066, + "mutability": "mutable", + "name": "collectedFees", + "nameLocation": "1514:13:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1506:21:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3065, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1506:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3068, + "mutability": "mutable", + "name": "__DEPRECATED_effectiveAllocation", + "nameLocation": "1545:32:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1537:40:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3067, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1537:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3070, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "1595:27:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1587:35:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3069, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1587:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3072, + "mutability": "mutable", + "name": "distributedRebates", + "nameLocation": "1640:18:30", + "nodeType": "VariableDeclaration", + "scope": 3073, + "src": "1632:26:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3071, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1632:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "Allocation", + "nameLocation": "1335:10:30", + "nodeType": "StructDefinition", + "scope": 3226, + "src": "1328:337:30", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingExtension.AllocationState", + "documentation": { + "id": 3074, + "nodeType": "StructuredDocumentation", + "src": "1671:202:30", + "text": " @dev Possible states an allocation can be.\n States:\n - Null = indexer == address(0)\n - Active = not Null && tokens > 0\n - Closed = Active && closedAtEpoch != 0" + }, + "id": 3078, + "members": [ + { + "id": 3075, + "name": "Null", + "nameLocation": "1909:4:30", + "nodeType": "EnumValue", + "src": "1909:4:30" + }, + { + "id": 3076, + "name": "Active", + "nameLocation": "1923:6:30", + "nodeType": "EnumValue", + "src": "1923:6:30" + }, + { + "id": 3077, + "name": "Closed", + "nameLocation": "1939:6:30", + "nodeType": "EnumValue", + "src": "1939:6:30" + } + ], + "name": "AllocationState", + "nameLocation": "1883:15:30", + "nodeType": "EnumDefinition", + "src": "1878:73:30" + }, + { + "anonymous": false, + "documentation": { + "id": 3079, + "nodeType": "StructuredDocumentation", + "src": "1957:855:30", + "text": " @dev Emitted when `indexer` close an allocation in `epoch` for `allocationID`.\n An amount of `tokens` get unallocated from `subgraphDeploymentID`.\n This event also emits the POI (proof of indexing) submitted by the indexer.\n `isPublic` is true if the sender was someone other than the indexer.\n @param indexer The indexer address\n @param subgraphDeploymentID The subgraph deployment ID\n @param epoch The protocol epoch the allocation was closed on\n @param tokens The amount of tokens unallocated from the allocation\n @param allocationID The allocation identifier\n @param sender The address closing the allocation\n @param poi The proof of indexing submitted by the sender\n @param isPublic True if the allocation was force closed by someone other than the indexer/operator" + }, + "eventSelector": "f6725dd105a6fc88bb79a6e4627f128577186c567a17c94818d201c2a4ce1403", + "id": 3097, + "name": "AllocationClosed", + "nameLocation": "2823:16:30", + "nodeType": "EventDefinition", + "parameters": { + "id": 3096, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3081, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "2865:7:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "2849:23:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3080, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2849:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3083, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentID", + "nameLocation": "2898:20:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "2882:36:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3082, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2882:7:30", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3085, + "indexed": false, + "mutability": "mutable", + "name": "epoch", + "nameLocation": "2936:5:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "2928:13:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3084, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2928:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3087, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2959:6:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "2951:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3086, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2951:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3089, + "indexed": true, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "2991:12:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "2975:28:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3088, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2975:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3091, + "indexed": false, + "mutability": "mutable", + "name": "sender", + "nameLocation": "3021:6:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "3013:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3090, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3013:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3093, + "indexed": false, + "mutability": "mutable", + "name": "poi", + "nameLocation": "3045:3:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "3037:11:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3092, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3037:7:30", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3095, + "indexed": false, + "mutability": "mutable", + "name": "isPublic", + "nameLocation": "3063:8:30", + "nodeType": "VariableDeclaration", + "scope": 3097, + "src": "3058:13:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3094, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3058:4:30", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2839:238:30" + }, + "src": "2817:261:30" + }, + { + "anonymous": false, + "documentation": { + "id": 3098, + "nodeType": "StructuredDocumentation", + "src": "3084:1258:30", + "text": " @dev Emitted when `indexer` collects a rebate on `subgraphDeploymentID` for `allocationID`.\n `epoch` is the protocol epoch the rebate was collected on\n The rebate is for `tokens` amount which are being provided by `assetHolder`; `queryFees`\n is the amount up for rebate after `curationFees` are distributed and `protocolTax` is burnt.\n `queryRebates` is the amount distributed to the `indexer` with `delegationFees` collected\n and sent to the delegation pool.\n @param assetHolder The address of the asset holder, the entity paying the query fees\n @param indexer The indexer address\n @param subgraphDeploymentID The subgraph deployment ID\n @param allocationID The allocation identifier\n @param epoch The protocol epoch the rebate was collected on\n @param tokens The amount of tokens collected\n @param protocolTax The amount of tokens burnt as protocol tax\n @param curationFees The amount of tokens distributed to the curation pool\n @param queryFees The amount of tokens collected as query fees\n @param queryRebates The amount of tokens distributed to the indexer\n @param delegationRewards The amount of tokens collected from the delegation pool" + }, + "eventSelector": "f5ded07502b6feba4c13b19a0c6646efd4b4119f439bcbd49076e4f0ed1eec4b", + "id": 3122, + "name": "RebateCollected", + "nameLocation": "4353:15:30", + "nodeType": "EventDefinition", + "parameters": { + "id": 3121, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3100, + "indexed": false, + "mutability": "mutable", + "name": "assetHolder", + "nameLocation": "4386:11:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4378:19:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3099, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4378:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3102, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "4423:7:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4407:23:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3101, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4407:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3104, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentID", + "nameLocation": "4456:20:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4440:36:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3103, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4440:7:30", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3106, + "indexed": true, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "4502:12:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4486:28:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3105, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4486:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3108, + "indexed": false, + "mutability": "mutable", + "name": "epoch", + "nameLocation": "4532:5:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4524:13:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3107, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4524:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3110, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "4555:6:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4547:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3109, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4547:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3112, + "indexed": false, + "mutability": "mutable", + "name": "protocolTax", + "nameLocation": "4579:11:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4571:19:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3111, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4571:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3114, + "indexed": false, + "mutability": "mutable", + "name": "curationFees", + "nameLocation": "4608:12:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4600:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3113, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4600:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3116, + "indexed": false, + "mutability": "mutable", + "name": "queryFees", + "nameLocation": "4638:9:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4630:17:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3115, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4630:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3118, + "indexed": false, + "mutability": "mutable", + "name": "queryRebates", + "nameLocation": "4665:12:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4657:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3117, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4657:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3120, + "indexed": false, + "mutability": "mutable", + "name": "delegationRewards", + "nameLocation": "4695:17:30", + "nodeType": "VariableDeclaration", + "scope": 3122, + "src": "4687:25:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3119, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4687:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4368:350:30" + }, + "src": "4347:372:30" + }, + { + "anonymous": false, + "documentation": { + "id": 3123, + "nodeType": "StructuredDocumentation", + "src": "4725:412:30", + "text": " @dev Emitted when `indexer` was slashed for a total of `tokens` amount.\n Tracks `reward` amount of tokens given to `beneficiary`.\n @param indexer The indexer address\n @param tokens The amount of tokens slashed\n @param reward The amount of reward tokens to send to a beneficiary\n @param beneficiary The address of a beneficiary to receive a reward for the slashing" + }, + "eventSelector": "f2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f3", + "id": 3133, + "name": "StakeSlashed", + "nameLocation": "5148:12:30", + "nodeType": "EventDefinition", + "parameters": { + "id": 3132, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3125, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "5177:7:30", + "nodeType": "VariableDeclaration", + "scope": 3133, + "src": "5161:23:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3124, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5161:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3127, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "5194:6:30", + "nodeType": "VariableDeclaration", + "scope": 3133, + "src": "5186:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3126, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5186:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3129, + "indexed": false, + "mutability": "mutable", + "name": "reward", + "nameLocation": "5210:6:30", + "nodeType": "VariableDeclaration", + "scope": 3133, + "src": "5202:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3128, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5202:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3131, + "indexed": false, + "mutability": "mutable", + "name": "beneficiary", + "nameLocation": "5226:11:30", + "nodeType": "VariableDeclaration", + "scope": 3133, + "src": "5218:19:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3130, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5218:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5160:78:30" + }, + "src": "5142:97:30" + }, + { + "documentation": { + "id": 3134, + "nodeType": "StructuredDocumentation", + "src": "5245:381:30", + "text": " @notice Close an allocation and free the staked tokens.\n To be eligible for rewards a proof of indexing must be presented.\n Presenting a bad proof is subject to slashable condition.\n To opt out of rewards set _poi to 0x0\n @param allocationID The allocation identifier\n @param poi Proof of indexing submitted for the allocated period" + }, + "functionSelector": "44c32a61", + "id": 3141, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "closeAllocation", + "nameLocation": "5640:15:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3139, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3136, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "5664:12:30", + "nodeType": "VariableDeclaration", + "scope": 3141, + "src": "5656:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3135, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5656:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3138, + "mutability": "mutable", + "name": "poi", + "nameLocation": "5686:3:30", + "nodeType": "VariableDeclaration", + "scope": 3141, + "src": "5678:11:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3137, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5678:7:30", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5655:35:30" + }, + "returnParameters": { + "id": 3140, + "nodeType": "ParameterList", + "parameters": [], + "src": "5699:0:30" + }, + "scope": 3226, + "src": "5631:69:30", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3142, + "nodeType": "StructuredDocumentation", + "src": "5706:560:30", + "text": " @dev Collect and rebate query fees to the indexer\n This function will accept calls with zero tokens.\n We use an exponential rebate formula to calculate the amount of tokens to rebate to the indexer.\n This implementation allows collecting multiple times on the same allocation, keeping track of the\n total amount rebated, the total amount collected and compensating the indexer for the difference.\n @param tokens Amount of tokens to collect\n @param allocationID Allocation where the tokens will be assigned" + }, + "functionSelector": "8d3c100a", + "id": 3149, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "collect", + "nameLocation": "6280:7:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3147, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3144, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6296:6:30", + "nodeType": "VariableDeclaration", + "scope": 3149, + "src": "6288:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3143, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6288:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3146, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "6312:12:30", + "nodeType": "VariableDeclaration", + "scope": 3149, + "src": "6304:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3145, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6304:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6287:38:30" + }, + "returnParameters": { + "id": 3148, + "nodeType": "ParameterList", + "parameters": [], + "src": "6334:0:30" + }, + "scope": 3226, + "src": "6271:64:30", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3150, + "nodeType": "StructuredDocumentation", + "src": "6341:778:30", + "text": " @notice Slash the indexer stake. Delegated tokens are not subject to slashing.\n Note that depending on the state of the indexer's stake, the slashed amount might be smaller than the\n requested slash amount. This can happen if the indexer has moved a significant part of their stake to\n a provision. Any outstanding slashing amount should be settled using Horizon's slash function\n {IHorizonStaking.slash}.\n @dev Can only be called by the slasher role.\n @param indexer Address of indexer to slash\n @param tokens Amount of tokens to slash from the indexer stake\n @param reward Amount of reward tokens to send to a beneficiary\n @param beneficiary Address of a beneficiary to receive a reward for the slashing" + }, + "functionSelector": "4488a382", + "id": 3161, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "legacySlash", + "nameLocation": "7133:11:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3159, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3152, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "7153:7:30", + "nodeType": "VariableDeclaration", + "scope": 3161, + "src": "7145:15:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3151, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7145:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3154, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "7170:6:30", + "nodeType": "VariableDeclaration", + "scope": 3161, + "src": "7162:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3153, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7162:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3156, + "mutability": "mutable", + "name": "reward", + "nameLocation": "7186:6:30", + "nodeType": "VariableDeclaration", + "scope": 3161, + "src": "7178:14:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3155, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7178:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3158, + "mutability": "mutable", + "name": "beneficiary", + "nameLocation": "7202:11:30", + "nodeType": "VariableDeclaration", + "scope": 3161, + "src": "7194:19:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3157, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7194:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7144:70:30" + }, + "returnParameters": { + "id": 3160, + "nodeType": "ParameterList", + "parameters": [], + "src": "7223:0:30" + }, + "scope": 3226, + "src": "7124:100:30", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3162, + "nodeType": "StructuredDocumentation", + "src": "7230:298:30", + "text": " @notice (Legacy) Return true if operator is allowed for the service provider on the subgraph data service.\n @param operator Address of the operator\n @param indexer Address of the service provider\n @return True if operator is allowed for indexer, false otherwise" + }, + "functionSelector": "b6363cf2", + "id": 3171, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isOperator", + "nameLocation": "7542:10:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3167, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3164, + "mutability": "mutable", + "name": "operator", + "nameLocation": "7561:8:30", + "nodeType": "VariableDeclaration", + "scope": 3171, + "src": "7553:16:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3163, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7553:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3166, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "7579:7:30", + "nodeType": "VariableDeclaration", + "scope": 3171, + "src": "7571:15:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3165, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7571:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7552:35:30" + }, + "returnParameters": { + "id": 3170, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3169, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3171, + "src": "7611:4:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3168, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7611:4:30", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "7610:6:30" + }, + "scope": 3226, + "src": "7533:84:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3172, + "nodeType": "StructuredDocumentation", + "src": "7623:169:30", + "text": " @notice Getter that returns if an indexer has any stake.\n @param indexer Address of the indexer\n @return True if indexer has staked tokens" + }, + "functionSelector": "e73e14bf", + "id": 3179, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "hasStake", + "nameLocation": "7806:8:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3175, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3174, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "7823:7:30", + "nodeType": "VariableDeclaration", + "scope": 3179, + "src": "7815:15:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3173, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7815:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7814:17:30" + }, + "returnParameters": { + "id": 3178, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3177, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3179, + "src": "7855:4:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3176, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7855:4:30", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "7854:6:30" + }, + "scope": 3226, + "src": "7797:64:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3180, + "nodeType": "StructuredDocumentation", + "src": "7867:179:30", + "text": " @notice Get the total amount of tokens staked by the indexer.\n @param indexer Address of the indexer\n @return Amount of tokens staked by the indexer" + }, + "functionSelector": "1787e69f", + "id": 3187, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getIndexerStakedTokens", + "nameLocation": "8060:22:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3183, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3182, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "8091:7:30", + "nodeType": "VariableDeclaration", + "scope": 3187, + "src": "8083:15:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3181, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8083:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8082:17:30" + }, + "returnParameters": { + "id": 3186, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3185, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3187, + "src": "8123:7:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3184, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8123:7:30", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8122:9:30" + }, + "scope": 3226, + "src": "8051:81:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3188, + "nodeType": "StructuredDocumentation", + "src": "8138:151:30", + "text": " @notice Return the allocation by ID.\n @param allocationID Address used as allocation identifier\n @return Allocation data" + }, + "functionSelector": "0e022923", + "id": 3196, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAllocation", + "nameLocation": "8303:13:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3191, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3190, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "8325:12:30", + "nodeType": "VariableDeclaration", + "scope": 3196, + "src": "8317:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3189, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8317:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8316:22:30" + }, + "returnParameters": { + "id": 3195, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3194, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3196, + "src": "8362:17:30", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Allocation_$3073_memory_ptr", + "typeString": "struct IHorizonStakingExtension.Allocation" + }, + "typeName": { + "id": 3193, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3192, + "name": "Allocation", + "nameLocations": ["8362:10:30"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3073, + "src": "8362:10:30" + }, + "referencedDeclaration": 3073, + "src": "8362:10:30", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Allocation_$3073_storage_ptr", + "typeString": "struct IHorizonStakingExtension.Allocation" + } + }, + "visibility": "internal" + } + ], + "src": "8361:19:30" + }, + "scope": 3226, + "src": "8294:87:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3197, + "nodeType": "StructuredDocumentation", + "src": "8387:186:30", + "text": " @notice Return the current state of an allocation\n @param allocationID Allocation identifier\n @return AllocationState enum with the state of the allocation" + }, + "functionSelector": "98c657dc", + "id": 3205, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAllocationState", + "nameLocation": "8587:18:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3200, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3199, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "8614:12:30", + "nodeType": "VariableDeclaration", + "scope": 3205, + "src": "8606:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3198, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8606:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8605:22:30" + }, + "returnParameters": { + "id": 3204, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3203, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3205, + "src": "8651:15:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_AllocationState_$3078", + "typeString": "enum IHorizonStakingExtension.AllocationState" + }, + "typeName": { + "id": 3202, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3201, + "name": "AllocationState", + "nameLocations": ["8651:15:30"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3078, + "src": "8651:15:30" + }, + "referencedDeclaration": 3078, + "src": "8651:15:30", + "typeDescriptions": { + "typeIdentifier": "t_enum$_AllocationState_$3078", + "typeString": "enum IHorizonStakingExtension.AllocationState" + } + }, + "visibility": "internal" + } + ], + "src": "8650:17:30" + }, + "scope": 3226, + "src": "8578:90:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3206, + "nodeType": "StructuredDocumentation", + "src": "8674:190:30", + "text": " @notice Return if allocationID is used.\n @param allocationID Address used as signer by the indexer for an allocation\n @return True if allocationID already used" + }, + "functionSelector": "f1d60d66", + "id": 3213, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isAllocation", + "nameLocation": "8878:12:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3209, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3208, + "mutability": "mutable", + "name": "allocationID", + "nameLocation": "8899:12:30", + "nodeType": "VariableDeclaration", + "scope": 3213, + "src": "8891:20:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3207, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8891:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8890:22:30" + }, + "returnParameters": { + "id": 3212, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3211, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3213, + "src": "8936:4:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3210, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8936:4:30", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "8935:6:30" + }, + "scope": 3226, + "src": "8869:73:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3214, + "nodeType": "StructuredDocumentation", + "src": "8948:167:30", + "text": " @notice Return the time in blocks to unstake\n Deprecated, now enforced by each data service (verifier)\n @return Thawing period in blocks" + }, + "functionSelector": "c0641994", + "id": 3219, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "__DEPRECATED_getThawingPeriod", + "nameLocation": "9129:29:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3215, + "nodeType": "ParameterList", + "parameters": [], + "src": "9158:2:30" + }, + "returnParameters": { + "id": 3218, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3217, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3219, + "src": "9184:6:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3216, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "9184:6:30", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "9183:8:30" + }, + "scope": 3226, + "src": "9120:72:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3220, + "nodeType": "StructuredDocumentation", + "src": "9198:219:30", + "text": " @notice Return the address of the subgraph data service.\n @dev TRANSITION PERIOD: After transition period move to main HorizonStaking contract\n @return Address of the subgraph data service" + }, + "functionSelector": "9363c522", + "id": 3225, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getSubgraphService", + "nameLocation": "9431:18:30", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3221, + "nodeType": "ParameterList", + "parameters": [], + "src": "9449:2:30" + }, + "returnParameters": { + "id": 3224, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3223, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3225, + "src": "9475:7:30", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3222, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9475:7:30", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "9474:9:30" + }, + "scope": 3226, + "src": "9422:62:30", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 3227, + "src": "439:9047:30", + "usedErrors": [], + "usedEvents": [3097, 3122, 3133] + } + ], + "src": "46:9441:30" + }, + "id": 30 + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol", + "exportedSymbols": { + "IGraphPayments": [2489], + "IHorizonStakingMain": [3937], + "IHorizonStakingTypes": [4073] + }, + "id": 3938, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 3228, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:31" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "../../interfaces/IGraphPayments.sol", + "id": 3230, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 3938, + "sourceUnit": 2490, + "src": "71:69:31", + "symbolAliases": [ + { + "foreign": { + "id": 3229, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "80:14:31", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol", + "file": "./IHorizonStakingTypes.sol", + "id": 3232, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 3938, + "sourceUnit": 4074, + "src": "141:66:31", + "symbolAliases": [ + { + "foreign": { + "id": 3231, + "name": "IHorizonStakingTypes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4073, + "src": "150:20:31", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IHorizonStakingMain", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 3233, + "nodeType": "StructuredDocumentation", + "src": "209:822:31", + "text": " @title Inferface for the {HorizonStaking} contract.\n @notice Provides functions for managing stake, provisions, delegations, and slashing.\n @dev Note that this interface only includes the functions implemented by {HorizonStaking} contract,\n and not those implemented by {HorizonStakingExtension}.\n Do not use this interface to interface with the {HorizonStaking} contract, use {IHorizonStaking} for\n the complete interface.\n @dev Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision\n functions take `serviceProvider` and `verifier` addresses.\n @dev TRANSITION PERIOD: After transition period rename to IHorizonStaking.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 3937, + "linearizedBaseContracts": [3937], + "name": "IHorizonStakingMain", + "nameLocation": "1042:19:31", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 3234, + "nodeType": "StructuredDocumentation", + "src": "1096:323:31", + "text": " @notice Emitted when a service provider unstakes tokens during the transition period.\n @param serviceProvider The address of the service provider\n @param tokens The amount of tokens now locked (including previously locked tokens)\n @param until The block number until the stake is locked" + }, + "eventSelector": "91642f23a1196e1424949fafa2a428c3b5d1f699763942ff08a6fbe9d4d7e980", + "id": 3242, + "name": "HorizonStakeLocked", + "nameLocation": "1430:18:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3241, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3236, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1465:15:31", + "nodeType": "VariableDeclaration", + "scope": 3242, + "src": "1449:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3235, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1449:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3238, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1490:6:31", + "nodeType": "VariableDeclaration", + "scope": 3242, + "src": "1482:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3237, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1482:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3240, + "indexed": false, + "mutability": "mutable", + "name": "until", + "nameLocation": "1506:5:31", + "nodeType": "VariableDeclaration", + "scope": 3242, + "src": "1498:13:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3239, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1498:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1448:64:31" + }, + "src": "1424:89:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3243, + "nodeType": "StructuredDocumentation", + "src": "1519:223:31", + "text": " @notice Emitted when a service provider withdraws tokens during the transition period.\n @param serviceProvider The address of the service provider\n @param tokens The amount of tokens withdrawn" + }, + "eventSelector": "32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be83", + "id": 3249, + "name": "HorizonStakeWithdrawn", + "nameLocation": "1753:21:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3248, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3245, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "1791:15:31", + "nodeType": "VariableDeclaration", + "scope": 3249, + "src": "1775:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3244, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1775:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3247, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1816:6:31", + "nodeType": "VariableDeclaration", + "scope": 3249, + "src": "1808:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3246, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1808:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1774:49:31" + }, + "src": "1747:77:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3250, + "nodeType": "StructuredDocumentation", + "src": "1862:537:31", + "text": " @notice Emitted when a service provider provisions staked tokens to a verifier.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens provisioned\n @param maxVerifierCut The maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\n @param thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision" + }, + "eventSelector": "88b4c2d08cea0f01a24841ff5d14814ddb5b14ac44b05e0835fcc0dcd8c7bc25", + "id": 3262, + "name": "ProvisionCreated", + "nameLocation": "2410:16:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3261, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3252, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2452:15:31", + "nodeType": "VariableDeclaration", + "scope": 3262, + "src": "2436:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3251, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2436:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3254, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "2493:8:31", + "nodeType": "VariableDeclaration", + "scope": 3262, + "src": "2477:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3253, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2477:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3256, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2519:6:31", + "nodeType": "VariableDeclaration", + "scope": 3262, + "src": "2511:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3255, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2511:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3258, + "indexed": false, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "2542:14:31", + "nodeType": "VariableDeclaration", + "scope": 3262, + "src": "2535:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3257, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2535:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3260, + "indexed": false, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "2573:13:31", + "nodeType": "VariableDeclaration", + "scope": 3262, + "src": "2566:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3259, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2566:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "2426:166:31" + }, + "src": "2404:189:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3263, + "nodeType": "StructuredDocumentation", + "src": "2599:274:31", + "text": " @notice Emitted whenever staked tokens are added to an existing provision\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens added to the provision" + }, + "eventSelector": "eaf6ea3a42ed2fd1b6d575f818cbda593af9524aa94bd30e65302ac4dc234745", + "id": 3271, + "name": "ProvisionIncreased", + "nameLocation": "2884:18:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3270, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3265, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2919:15:31", + "nodeType": "VariableDeclaration", + "scope": 3271, + "src": "2903:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3264, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2903:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3267, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "2952:8:31", + "nodeType": "VariableDeclaration", + "scope": 3271, + "src": "2936:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3266, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2936:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3269, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2970:6:31", + "nodeType": "VariableDeclaration", + "scope": 3271, + "src": "2962:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3268, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2962:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2902:75:31" + }, + "src": "2878:100:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3272, + "nodeType": "StructuredDocumentation", + "src": "2984:255:31", + "text": " @notice Emitted when a service provider thaws tokens from a provision.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens thawed" + }, + "eventSelector": "3b81913739097ced1e7fa748c6058d34e2c00b961fb501094543b397b198fdaa", + "id": 3280, + "name": "ProvisionThawed", + "nameLocation": "3250:15:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3279, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3274, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3282:15:31", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3266:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3273, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3266:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3276, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "3315:8:31", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3299:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3275, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3299:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3278, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "3333:6:31", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3325:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3277, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3325:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3265:75:31" + }, + "src": "3244:97:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3281, + "nodeType": "StructuredDocumentation", + "src": "3347:258:31", + "text": " @notice Emitted when a service provider removes tokens from a provision.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens removed" + }, + "eventSelector": "9008d731ddfbec70bc364780efd63057c6877bee8027c4708a104b365395885d", + "id": 3289, + "name": "TokensDeprovisioned", + "nameLocation": "3616:19:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3288, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3283, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "3652:15:31", + "nodeType": "VariableDeclaration", + "scope": 3289, + "src": "3636:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3282, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3636:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3285, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "3685:8:31", + "nodeType": "VariableDeclaration", + "scope": 3289, + "src": "3669:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3284, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3669:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3287, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "3703:6:31", + "nodeType": "VariableDeclaration", + "scope": 3289, + "src": "3695:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3286, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3695:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3635:75:31" + }, + "src": "3610:101:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3290, + "nodeType": "StructuredDocumentation", + "src": "3717:512:31", + "text": " @notice Emitted when a service provider stages a provision parameter update.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param maxVerifierCut The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for\n themselves when slashing\n @param thawingPeriod The proposed period in seconds that the tokens will be thawing before they can be removed from\n the provision" + }, + "eventSelector": "e89cbb9d63ba60af555547b12dde6817283e88cbdd45feb2059f2ba71ea346ba", + "id": 3300, + "name": "ProvisionParametersStaged", + "nameLocation": "4240:25:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3299, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3292, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4291:15:31", + "nodeType": "VariableDeclaration", + "scope": 3300, + "src": "4275:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3291, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4275:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3294, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "4332:8:31", + "nodeType": "VariableDeclaration", + "scope": 3300, + "src": "4316:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3293, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4316:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3296, + "indexed": false, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "4357:14:31", + "nodeType": "VariableDeclaration", + "scope": 3300, + "src": "4350:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3295, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "4350:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3298, + "indexed": false, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "4388:13:31", + "nodeType": "VariableDeclaration", + "scope": 3300, + "src": "4381:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3297, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "4381:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "4265:142:31" + }, + "src": "4234:174:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3301, + "nodeType": "StructuredDocumentation", + "src": "4414:503:31", + "text": " @notice Emitted when a service provider accepts a staged provision parameter update.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param maxVerifierCut The new maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves\n when slashing\n @param thawingPeriod The new period in seconds that the tokens will be thawing before they can be removed from the provision" + }, + "eventSelector": "a4c005afae9298a5ca51e7710c334ac406fb3d914588ade970850f917cedb1c6", + "id": 3311, + "name": "ProvisionParametersSet", + "nameLocation": "4928:22:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3310, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3303, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "4976:15:31", + "nodeType": "VariableDeclaration", + "scope": 3311, + "src": "4960:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3302, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4960:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3305, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "5017:8:31", + "nodeType": "VariableDeclaration", + "scope": 3311, + "src": "5001:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3304, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5001:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3307, + "indexed": false, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "5042:14:31", + "nodeType": "VariableDeclaration", + "scope": 3311, + "src": "5035:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3306, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "5035:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3309, + "indexed": false, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "5073:13:31", + "nodeType": "VariableDeclaration", + "scope": 3311, + "src": "5066:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3308, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "5066:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "4950:142:31" + }, + "src": "4922:171:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3312, + "nodeType": "StructuredDocumentation", + "src": "5099:349:31", + "text": " @dev Emitted when an operator is allowed or denied by a service provider for a particular verifier\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param operator The address of the operator\n @param allowed Whether the operator is allowed or denied" + }, + "eventSelector": "aa5a59b38e8f68292982382bf635c2f263ca37137bbc52956acd808fd7bf976f", + "id": 3322, + "name": "OperatorSet", + "nameLocation": "5459:11:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3321, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3314, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "5496:15:31", + "nodeType": "VariableDeclaration", + "scope": 3322, + "src": "5480:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3313, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5480:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3316, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "5537:8:31", + "nodeType": "VariableDeclaration", + "scope": 3322, + "src": "5521:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3315, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5521:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3318, + "indexed": true, + "mutability": "mutable", + "name": "operator", + "nameLocation": "5571:8:31", + "nodeType": "VariableDeclaration", + "scope": 3322, + "src": "5555:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3317, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5555:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3320, + "indexed": false, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "5594:7:31", + "nodeType": "VariableDeclaration", + "scope": 3322, + "src": "5589:12:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3319, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5589:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "5470:137:31" + }, + "src": "5453:155:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3323, + "nodeType": "StructuredDocumentation", + "src": "5645:305:31", + "text": " @notice Emitted when a provision is slashed by a verifier.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens slashed (note this only represents service provider's slashed stake)" + }, + "eventSelector": "e7b110f13cde981d5079ab7faa4249c5f331f5c292dbc6031969d2ce694188a3", + "id": 3331, + "name": "ProvisionSlashed", + "nameLocation": "5961:16:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3330, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3325, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "5994:15:31", + "nodeType": "VariableDeclaration", + "scope": 3331, + "src": "5978:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3324, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5978:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3327, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "6027:8:31", + "nodeType": "VariableDeclaration", + "scope": 3331, + "src": "6011:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3326, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6011:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3329, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6045:6:31", + "nodeType": "VariableDeclaration", + "scope": 3331, + "src": "6037:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3328, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6037:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5977:75:31" + }, + "src": "5955:98:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3332, + "nodeType": "StructuredDocumentation", + "src": "6059:310:31", + "text": " @notice Emitted when a delegation pool is slashed by a verifier.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens slashed (note this only represents delegation pool's slashed stake)" + }, + "eventSelector": "c5d16dbb577cf07678b577232717c9a606197a014f61847e623d47fc6bf6b771", + "id": 3340, + "name": "DelegationSlashed", + "nameLocation": "6380:17:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3339, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3334, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "6414:15:31", + "nodeType": "VariableDeclaration", + "scope": 3340, + "src": "6398:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3333, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6398:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3336, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "6447:8:31", + "nodeType": "VariableDeclaration", + "scope": 3340, + "src": "6431:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3335, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6431:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3338, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6465:6:31", + "nodeType": "VariableDeclaration", + "scope": 3340, + "src": "6457:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3337, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6457:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6397:75:31" + }, + "src": "6374:99:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3341, + "nodeType": "StructuredDocumentation", + "src": "6479:441:31", + "text": " @notice Emitted when a delegation pool would have been slashed by a verifier, but the slashing was skipped\n because delegation slashing global parameter is not enabled.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens that would have been slashed (note this only represents delegation pool's slashed stake)" + }, + "eventSelector": "dce44f0aeed2089c75db59f5a517b9a19a734bf0213412fa129f0d0434126b24", + "id": 3349, + "name": "DelegationSlashingSkipped", + "nameLocation": "6931:25:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3348, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3343, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "6973:15:31", + "nodeType": "VariableDeclaration", + "scope": 3349, + "src": "6957:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3342, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6957:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3345, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "7006:8:31", + "nodeType": "VariableDeclaration", + "scope": 3349, + "src": "6990:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3344, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6990:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3347, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "7024:6:31", + "nodeType": "VariableDeclaration", + "scope": 3349, + "src": "7016:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3346, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7016:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6956:75:31" + }, + "src": "6925:107:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3350, + "nodeType": "StructuredDocumentation", + "src": "7038:357:31", + "text": " @notice Emitted when the verifier cut is sent to the verifier after slashing a provision.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param destination The address where the verifier cut is sent\n @param tokens The amount of tokens sent to the verifier" + }, + "eventSelector": "95ff4196cd75fa49180ba673948ea43935f59e7c4ba101fa09b9fe0ec266d582", + "id": 3360, + "name": "VerifierTokensSent", + "nameLocation": "7406:18:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3359, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3352, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "7450:15:31", + "nodeType": "VariableDeclaration", + "scope": 3360, + "src": "7434:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3351, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7434:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3354, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "7491:8:31", + "nodeType": "VariableDeclaration", + "scope": 3360, + "src": "7475:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3353, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7475:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3356, + "indexed": true, + "mutability": "mutable", + "name": "destination", + "nameLocation": "7525:11:31", + "nodeType": "VariableDeclaration", + "scope": 3360, + "src": "7509:27:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3355, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7509:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3358, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "7554:6:31", + "nodeType": "VariableDeclaration", + "scope": 3360, + "src": "7546:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3357, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7546:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7424:142:31" + }, + "src": "7400:167:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3361, + "nodeType": "StructuredDocumentation", + "src": "7606:350:31", + "text": " @notice Emitted when tokens are delegated to a provision.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param delegator The address of the delegator\n @param tokens The amount of tokens delegated\n @param shares The amount of shares delegated" + }, + "eventSelector": "237818af8bb47710142edd8fc301fbc507064fb357cf122fb161ca447e3cb13e", + "id": 3373, + "name": "TokensDelegated", + "nameLocation": "7967:15:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3372, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3363, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "8008:15:31", + "nodeType": "VariableDeclaration", + "scope": 3373, + "src": "7992:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3362, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7992:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3365, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "8049:8:31", + "nodeType": "VariableDeclaration", + "scope": 3373, + "src": "8033:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3364, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8033:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3367, + "indexed": true, + "mutability": "mutable", + "name": "delegator", + "nameLocation": "8083:9:31", + "nodeType": "VariableDeclaration", + "scope": 3373, + "src": "8067:25:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3366, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8067:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3369, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "8110:6:31", + "nodeType": "VariableDeclaration", + "scope": 3373, + "src": "8102:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3368, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8102:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3371, + "indexed": false, + "mutability": "mutable", + "name": "shares", + "nameLocation": "8134:6:31", + "nodeType": "VariableDeclaration", + "scope": 3373, + "src": "8126:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3370, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8126:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7982:164:31" + }, + "src": "7961:186:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3374, + "nodeType": "StructuredDocumentation", + "src": "8153:397:31", + "text": " @notice Emitted when a delegator undelegates tokens from a provision and starts\n thawing them.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param delegator The address of the delegator\n @param tokens The amount of tokens undelegated\n @param shares The amount of shares undelegated" + }, + "eventSelector": "0525d6ad1aa78abc571b5c1984b5e1ea4f1412368c1cc348ca408dbb1085c9a1", + "id": 3386, + "name": "TokensUndelegated", + "nameLocation": "8561:17:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3385, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3376, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "8604:15:31", + "nodeType": "VariableDeclaration", + "scope": 3386, + "src": "8588:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3375, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8588:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3378, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "8645:8:31", + "nodeType": "VariableDeclaration", + "scope": 3386, + "src": "8629:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3377, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8629:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3380, + "indexed": true, + "mutability": "mutable", + "name": "delegator", + "nameLocation": "8679:9:31", + "nodeType": "VariableDeclaration", + "scope": 3386, + "src": "8663:25:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3379, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8663:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3382, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "8706:6:31", + "nodeType": "VariableDeclaration", + "scope": 3386, + "src": "8698:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3381, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8698:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3384, + "indexed": false, + "mutability": "mutable", + "name": "shares", + "nameLocation": "8730:6:31", + "nodeType": "VariableDeclaration", + "scope": 3386, + "src": "8722:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3383, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8722:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8578:164:31" + }, + "src": "8555:188:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3387, + "nodeType": "StructuredDocumentation", + "src": "8749:322:31", + "text": " @notice Emitted when a delegator withdraws tokens from a provision after thawing.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param delegator The address of the delegator\n @param tokens The amount of tokens withdrawn" + }, + "eventSelector": "305f519d8909c676ffd870495d4563032eb0b506891a6dd9827490256cc9914e", + "id": 3397, + "name": "DelegatedTokensWithdrawn", + "nameLocation": "9082:24:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3396, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3389, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "9132:15:31", + "nodeType": "VariableDeclaration", + "scope": 3397, + "src": "9116:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3388, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9116:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3391, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "9173:8:31", + "nodeType": "VariableDeclaration", + "scope": 3397, + "src": "9157:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3390, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9157:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3393, + "indexed": true, + "mutability": "mutable", + "name": "delegator", + "nameLocation": "9207:9:31", + "nodeType": "VariableDeclaration", + "scope": 3397, + "src": "9191:25:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3392, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9191:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3395, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "9234:6:31", + "nodeType": "VariableDeclaration", + "scope": 3397, + "src": "9226:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3394, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9226:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9106:140:31" + }, + "src": "9076:171:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3398, + "nodeType": "StructuredDocumentation", + "src": "9253:346:31", + "text": " @notice Emitted when `delegator` withdrew delegated `tokens` from `indexer` using `withdrawDelegated`.\n @dev This event is for the legacy `withdrawDelegated` function.\n @param indexer The address of the indexer\n @param delegator The address of the delegator\n @param tokens The amount of tokens withdrawn" + }, + "eventSelector": "1b2e7737e043c5cf1b587ceb4daeb7ae00148b9bda8f79f1093eead08f141952", + "id": 3406, + "name": "StakeDelegatedWithdrawn", + "nameLocation": "9610:23:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3405, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3400, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "9650:7:31", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "9634:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3399, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9634:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3402, + "indexed": true, + "mutability": "mutable", + "name": "delegator", + "nameLocation": "9675:9:31", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "9659:25:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3401, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9659:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3404, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "9694:6:31", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "9686:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3403, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9686:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9633:68:31" + }, + "src": "9604:98:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3407, + "nodeType": "StructuredDocumentation", + "src": "9708:257:31", + "text": " @notice Emitted when tokens are added to a delegation pool's reserve.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param tokens The amount of tokens withdrawn" + }, + "eventSelector": "673007a04e501145e79f59aea5e0413b6e88344fdaf10326254530d6a1511530", + "id": 3415, + "name": "TokensToDelegationPoolAdded", + "nameLocation": "9976:27:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3409, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "10020:15:31", + "nodeType": "VariableDeclaration", + "scope": 3415, + "src": "10004:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3408, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10004:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3411, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "10053:8:31", + "nodeType": "VariableDeclaration", + "scope": 3415, + "src": "10037:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3410, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10037:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3413, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "10071:6:31", + "nodeType": "VariableDeclaration", + "scope": 3415, + "src": "10063:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3412, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10063:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10003:75:31" + }, + "src": "9970:109:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3416, + "nodeType": "StructuredDocumentation", + "src": "10085:365:31", + "text": " @notice Emitted when a service provider sets delegation fee cuts for a verifier.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param paymentType The payment type for which the fee cut is set, as defined in {IGraphPayments}\n @param feeCut The fee cut set, in PPM" + }, + "eventSelector": "3474eba30406cacbfbc5a596a7e471662bbcccf206f8d244dbb6f4cc578c5220", + "id": 3427, + "name": "DelegationFeeCutSet", + "nameLocation": "10461:19:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3426, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3418, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "10506:15:31", + "nodeType": "VariableDeclaration", + "scope": 3427, + "src": "10490:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3417, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10490:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3420, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "10547:8:31", + "nodeType": "VariableDeclaration", + "scope": 3427, + "src": "10531:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3419, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10531:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3423, + "indexed": true, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "10601:11:31", + "nodeType": "VariableDeclaration", + "scope": 3427, + "src": "10565:47:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 3422, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3421, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["10565:14:31", "10580:12:31"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "10565:27:31" + }, + "referencedDeclaration": 2433, + "src": "10565:27:31", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3425, + "indexed": false, + "mutability": "mutable", + "name": "feeCut", + "nameLocation": "10630:6:31", + "nodeType": "VariableDeclaration", + "scope": 3427, + "src": "10622:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3424, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10622:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10480:162:31" + }, + "src": "10455:188:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3428, + "nodeType": "StructuredDocumentation", + "src": "10679:636:31", + "text": " @notice Emitted when a thaw request is created.\n @dev Can be emitted by the service provider when thawing stake or by the delegator when undelegating.\n @param requestType The type of thaw request\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param owner The address of the owner of the thaw request.\n @param shares The amount of shares being thawed\n @param thawingUntil The timestamp until the stake is thawed\n @param thawRequestId The ID of the thaw request\n @param nonce The nonce of the thaw request" + }, + "eventSelector": "036538df4a591a5cc74b68cfc7f8c61e8173dbc81627e1d62600b61e82046178", + "id": 3447, + "name": "ThawRequestCreated", + "nameLocation": "11326:18:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3446, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3431, + "indexed": true, + "mutability": "mutable", + "name": "requestType", + "nameLocation": "11399:11:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11354:56:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 3430, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3429, + "name": "IHorizonStakingTypes.ThawRequestType", + "nameLocations": ["11354:20:31", "11375:15:31"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "11354:36:31" + }, + "referencedDeclaration": 4033, + "src": "11354:36:31", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3433, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "11436:15:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11420:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3432, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11420:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3435, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "11477:8:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11461:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3434, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11461:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3437, + "indexed": false, + "mutability": "mutable", + "name": "owner", + "nameLocation": "11503:5:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11495:13:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3436, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11495:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3439, + "indexed": false, + "mutability": "mutable", + "name": "shares", + "nameLocation": "11526:6:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11518:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3438, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11518:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3441, + "indexed": false, + "mutability": "mutable", + "name": "thawingUntil", + "nameLocation": "11549:12:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11542:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3440, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "11542:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3443, + "indexed": false, + "mutability": "mutable", + "name": "thawRequestId", + "nameLocation": "11579:13:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11571:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3442, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "11571:7:31", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3445, + "indexed": false, + "mutability": "mutable", + "name": "nonce", + "nameLocation": "11610:5:31", + "nodeType": "VariableDeclaration", + "scope": 3447, + "src": "11602:13:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3444, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11602:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11344:277:31" + }, + "src": "11320:302:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3448, + "nodeType": "StructuredDocumentation", + "src": "11628:469:31", + "text": " @notice Emitted when a thaw request is fulfilled, meaning the stake is released.\n @param requestType The type of thaw request\n @param thawRequestId The ID of the thaw request\n @param tokens The amount of tokens being released\n @param shares The amount of shares being released\n @param thawingUntil The timestamp until the stake has thawed\n @param valid Whether the thaw request was valid at the time of fulfillment" + }, + "eventSelector": "469e89d0a4e0e5deb2eb1ade5b3fa67fdfbeb4787c3a7c1e8e89aaf28562cab2", + "id": 3463, + "name": "ThawRequestFulfilled", + "nameLocation": "12108:20:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3462, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3451, + "indexed": true, + "mutability": "mutable", + "name": "requestType", + "nameLocation": "12183:11:31", + "nodeType": "VariableDeclaration", + "scope": 3463, + "src": "12138:56:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 3450, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3449, + "name": "IHorizonStakingTypes.ThawRequestType", + "nameLocations": ["12138:20:31", "12159:15:31"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "12138:36:31" + }, + "referencedDeclaration": 4033, + "src": "12138:36:31", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3453, + "indexed": true, + "mutability": "mutable", + "name": "thawRequestId", + "nameLocation": "12220:13:31", + "nodeType": "VariableDeclaration", + "scope": 3463, + "src": "12204:29:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3452, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12204:7:31", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3455, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "12251:6:31", + "nodeType": "VariableDeclaration", + "scope": 3463, + "src": "12243:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3454, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12243:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3457, + "indexed": false, + "mutability": "mutable", + "name": "shares", + "nameLocation": "12275:6:31", + "nodeType": "VariableDeclaration", + "scope": 3463, + "src": "12267:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3456, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12267:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3459, + "indexed": false, + "mutability": "mutable", + "name": "thawingUntil", + "nameLocation": "12298:12:31", + "nodeType": "VariableDeclaration", + "scope": 3463, + "src": "12291:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3458, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "12291:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3461, + "indexed": false, + "mutability": "mutable", + "name": "valid", + "nameLocation": "12325:5:31", + "nodeType": "VariableDeclaration", + "scope": 3463, + "src": "12320:10:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3460, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "12320:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "12128:208:31" + }, + "src": "12102:235:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3464, + "nodeType": "StructuredDocumentation", + "src": "12343:451:31", + "text": " @notice Emitted when a series of thaw requests are fulfilled.\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param owner The address of the owner of the thaw requests\n @param thawRequestsFulfilled The number of thaw requests fulfilled\n @param tokens The total amount of tokens being released\n @param requestType The type of thaw request" + }, + "eventSelector": "86c2f162872d7c46d7ee0caad366da6dc430889b9d8f27e4bed3785548f9954b", + "id": 3479, + "name": "ThawRequestsFulfilled", + "nameLocation": "12805:21:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3478, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3467, + "indexed": true, + "mutability": "mutable", + "name": "requestType", + "nameLocation": "12881:11:31", + "nodeType": "VariableDeclaration", + "scope": 3479, + "src": "12836:56:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 3466, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3465, + "name": "IHorizonStakingTypes.ThawRequestType", + "nameLocations": ["12836:20:31", "12857:15:31"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "12836:36:31" + }, + "referencedDeclaration": 4033, + "src": "12836:36:31", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3469, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "12918:15:31", + "nodeType": "VariableDeclaration", + "scope": 3479, + "src": "12902:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3468, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12902:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3471, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "12959:8:31", + "nodeType": "VariableDeclaration", + "scope": 3479, + "src": "12943:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3470, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12943:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3473, + "indexed": false, + "mutability": "mutable", + "name": "owner", + "nameLocation": "12985:5:31", + "nodeType": "VariableDeclaration", + "scope": 3479, + "src": "12977:13:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3472, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12977:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3475, + "indexed": false, + "mutability": "mutable", + "name": "thawRequestsFulfilled", + "nameLocation": "13008:21:31", + "nodeType": "VariableDeclaration", + "scope": 3479, + "src": "13000:29:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3474, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13000:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3477, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "13047:6:31", + "nodeType": "VariableDeclaration", + "scope": 3479, + "src": "13039:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3476, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13039:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12826:233:31" + }, + "src": "12799:261:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3480, + "nodeType": "StructuredDocumentation", + "src": "13099:166:31", + "text": " @notice Emitted when the global maximum thawing period allowed for provisions is set.\n @param maxThawingPeriod The new maximum thawing period" + }, + "eventSelector": "e8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f", + "id": 3484, + "name": "MaxThawingPeriodSet", + "nameLocation": "13276:19:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3483, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3482, + "indexed": false, + "mutability": "mutable", + "name": "maxThawingPeriod", + "nameLocation": "13303:16:31", + "nodeType": "VariableDeclaration", + "scope": 3484, + "src": "13296:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3481, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "13296:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "13295:25:31" + }, + "src": "13270:51:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3485, + "nodeType": "StructuredDocumentation", + "src": "13327:228:31", + "text": " @notice Emitted when a verifier is allowed or disallowed to be used for locked provisions.\n @param verifier The address of the verifier\n @param allowed Whether the verifier is allowed or disallowed" + }, + "eventSelector": "4542960abc7f2d26dab244fc440acf511e3dd0f5cefad571ca802283b4751bbb", + "id": 3491, + "name": "AllowedLockedVerifierSet", + "nameLocation": "13566:24:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3490, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3487, + "indexed": true, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "13607:8:31", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "13591:24:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3486, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13591:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3489, + "indexed": false, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "13622:7:31", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "13617:12:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3488, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "13617:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "13590:40:31" + }, + "src": "13560:71:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3492, + "nodeType": "StructuredDocumentation", + "src": "13637:145:31", + "text": " @notice Emitted when the legacy global thawing period is set to zero.\n @dev This marks the end of the transition period." + }, + "eventSelector": "93be484d290d119d9cf99cce69d173c732f9403333ad84f69c807b590203d109", + "id": 3494, + "name": "ThawingPeriodCleared", + "nameLocation": "13793:20:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3493, + "nodeType": "ParameterList", + "parameters": [], + "src": "13813:2:31" + }, + "src": "13787:29:31" + }, + { + "anonymous": false, + "documentation": { + "id": 3495, + "nodeType": "StructuredDocumentation", + "src": "13822:83:31", + "text": " @notice Emitted when the delegation slashing global flag is set." + }, + "eventSelector": "2192802a8934dbf383338406b279ec7f3eccee31e58d6c0444d6dd6bfff24b35", + "id": 3497, + "name": "DelegationSlashingEnabled", + "nameLocation": "13916:25:31", + "nodeType": "EventDefinition", + "parameters": { + "id": 3496, + "nodeType": "ParameterList", + "parameters": [], + "src": "13941:2:31" + }, + "src": "13910:34:31" + }, + { + "documentation": { + "id": 3498, + "nodeType": "StructuredDocumentation", + "src": "13976:84:31", + "text": " @notice Thrown when operating a zero token amount is not allowed." + }, + "errorSelector": "14549cb6", + "id": 3500, + "name": "HorizonStakingInvalidZeroTokens", + "nameLocation": "14071:31:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3499, + "nodeType": "ParameterList", + "parameters": [], + "src": "14102:2:31" + }, + "src": "14065:40:31" + }, + { + "documentation": { + "id": 3501, + "nodeType": "StructuredDocumentation", + "src": "14111:207:31", + "text": " @notice Thrown when a minimum token amount is required to operate but it's not met.\n @param tokens The actual token amount\n @param minRequired The minimum required token amount" + }, + "errorSelector": "b0f57356", + "id": 3507, + "name": "HorizonStakingInsufficientTokens", + "nameLocation": "14329:32:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3506, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3503, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "14370:6:31", + "nodeType": "VariableDeclaration", + "scope": 3507, + "src": "14362:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3502, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14362:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3505, + "mutability": "mutable", + "name": "minRequired", + "nameLocation": "14386:11:31", + "nodeType": "VariableDeclaration", + "scope": 3507, + "src": "14378:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3504, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14378:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "14361:37:31" + }, + "src": "14323:76:31" + }, + { + "documentation": { + "id": 3508, + "nodeType": "StructuredDocumentation", + "src": "14405:201:31", + "text": " @notice Thrown when the amount of tokens exceeds the maximum allowed to operate.\n @param tokens The actual token amount\n @param maxTokens The maximum allowed token amount" + }, + "errorSelector": "bd45355c", + "id": 3514, + "name": "HorizonStakingTooManyTokens", + "nameLocation": "14617:27:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3513, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3510, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "14653:6:31", + "nodeType": "VariableDeclaration", + "scope": 3514, + "src": "14645:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3509, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14645:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3512, + "mutability": "mutable", + "name": "maxTokens", + "nameLocation": "14669:9:31", + "nodeType": "VariableDeclaration", + "scope": 3514, + "src": "14661:17:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3511, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14661:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "14644:35:31" + }, + "src": "14611:69:31" + }, + { + "documentation": { + "id": 3515, + "nodeType": "StructuredDocumentation", + "src": "14718:201:31", + "text": " @notice Thrown when attempting to operate with a provision that does not exist.\n @param serviceProvider The service provider address\n @param verifier The verifier address" + }, + "errorSelector": "6159d41a", + "id": 3521, + "name": "HorizonStakingInvalidProvision", + "nameLocation": "14930:30:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3520, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3517, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "14969:15:31", + "nodeType": "VariableDeclaration", + "scope": 3521, + "src": "14961:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3516, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14961:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3519, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "14994:8:31", + "nodeType": "VariableDeclaration", + "scope": 3521, + "src": "14986:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3518, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14986:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "14960:43:31" + }, + "src": "14924:80:31" + }, + { + "documentation": { + "id": 3522, + "nodeType": "StructuredDocumentation", + "src": "15010:237:31", + "text": " @notice Thrown when the caller is not authorized to operate on a provision.\n @param caller The caller address\n @param serviceProvider The service provider address\n @param verifier The verifier address" + }, + "errorSelector": "c76b97b0", + "id": 3530, + "name": "HorizonStakingNotAuthorized", + "nameLocation": "15258:27:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3529, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3524, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "15294:15:31", + "nodeType": "VariableDeclaration", + "scope": 3530, + "src": "15286:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3523, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15286:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3526, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "15319:8:31", + "nodeType": "VariableDeclaration", + "scope": 3530, + "src": "15311:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3525, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15311:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3528, + "mutability": "mutable", + "name": "caller", + "nameLocation": "15337:6:31", + "nodeType": "VariableDeclaration", + "scope": 3530, + "src": "15329:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3527, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15329:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "15285:59:31" + }, + "src": "15252:93:31" + }, + { + "documentation": { + "id": 3531, + "nodeType": "StructuredDocumentation", + "src": "15351:236:31", + "text": " @notice Thrown when attempting to create a provision with a verifier other than the\n subgraph data service. This restriction only applies during the transition period.\n @param verifier The verifier address" + }, + "errorSelector": "353666ff", + "id": 3535, + "name": "HorizonStakingInvalidVerifier", + "nameLocation": "15598:29:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3534, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3533, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "15636:8:31", + "nodeType": "VariableDeclaration", + "scope": 3535, + "src": "15628:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3532, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15628:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "15627:18:31" + }, + "src": "15592:54:31" + }, + { + "documentation": { + "id": 3536, + "nodeType": "StructuredDocumentation", + "src": "15652:163:31", + "text": " @notice Thrown when attempting to create a provision with an invalid maximum verifier cut.\n @param maxVerifierCut The maximum verifier cut" + }, + "errorSelector": "29bff5f5", + "id": 3540, + "name": "HorizonStakingInvalidMaxVerifierCut", + "nameLocation": "15826:35:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3539, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3538, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "15869:14:31", + "nodeType": "VariableDeclaration", + "scope": 3540, + "src": "15862:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3537, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "15862:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "15861:23:31" + }, + "src": "15820:65:31" + }, + { + "documentation": { + "id": 3541, + "nodeType": "StructuredDocumentation", + "src": "15891:217:31", + "text": " @notice Thrown when attempting to create a provision with an invalid thawing period.\n @param thawingPeriod The thawing period\n @param maxThawingPeriod The maximum `thawingPeriod` allowed" + }, + "errorSelector": "ee5602e1", + "id": 3547, + "name": "HorizonStakingInvalidThawingPeriod", + "nameLocation": "16119:34:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3546, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3543, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "16161:13:31", + "nodeType": "VariableDeclaration", + "scope": 3547, + "src": "16154:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3542, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "16154:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3545, + "mutability": "mutable", + "name": "maxThawingPeriod", + "nameLocation": "16183:16:31", + "nodeType": "VariableDeclaration", + "scope": 3547, + "src": "16176:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3544, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "16176:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "16153:47:31" + }, + "src": "16113:88:31" + }, + { + "documentation": { + "id": 3548, + "nodeType": "StructuredDocumentation", + "src": "16207:120:31", + "text": " @notice Thrown when attempting to create a provision for a data service that already has a provision." + }, + "errorSelector": "56a8581a", + "id": 3550, + "name": "HorizonStakingProvisionAlreadyExists", + "nameLocation": "16338:36:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3549, + "nodeType": "ParameterList", + "parameters": [], + "src": "16374:2:31" + }, + "src": "16332:45:31" + }, + { + "documentation": { + "id": 3551, + "nodeType": "StructuredDocumentation", + "src": "16411:202:31", + "text": " @notice Thrown when the service provider has insufficient idle stake to operate.\n @param tokens The actual token amount\n @param minTokens The minimum required token amount" + }, + "errorSelector": "ccaf28a9", + "id": 3557, + "name": "HorizonStakingInsufficientIdleStake", + "nameLocation": "16624:35:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3556, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3553, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "16668:6:31", + "nodeType": "VariableDeclaration", + "scope": 3557, + "src": "16660:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3552, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16660:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3555, + "mutability": "mutable", + "name": "minTokens", + "nameLocation": "16684:9:31", + "nodeType": "VariableDeclaration", + "scope": 3557, + "src": "16676:17:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3554, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16676:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16659:35:31" + }, + "src": "16618:77:31" + }, + { + "documentation": { + "id": 3558, + "nodeType": "StructuredDocumentation", + "src": "16701:265:31", + "text": " @notice Thrown during the transition period when the service provider has insufficient stake to\n cover their existing legacy allocations.\n @param tokens The actual token amount\n @param minTokens The minimum required token amount" + }, + "errorSelector": "5dd9b9c7", + "id": 3564, + "name": "HorizonStakingInsufficientStakeForLegacyAllocations", + "nameLocation": "16977:51:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3563, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3560, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "17037:6:31", + "nodeType": "VariableDeclaration", + "scope": 3564, + "src": "17029:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3559, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17029:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3562, + "mutability": "mutable", + "name": "minTokens", + "nameLocation": "17053:9:31", + "nodeType": "VariableDeclaration", + "scope": 3564, + "src": "17045:17:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3561, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17045:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "17028:35:31" + }, + "src": "16971:93:31" + }, + { + "documentation": { + "id": 3565, + "nodeType": "StructuredDocumentation", + "src": "17103:199:31", + "text": " @notice Thrown when delegation shares obtained are below the expected amount.\n @param shares The actual share amount\n @param minShares The minimum required share amount" + }, + "errorSelector": "5d88e8d1", + "id": 3571, + "name": "HorizonStakingSlippageProtection", + "nameLocation": "17313:32:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3570, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3567, + "mutability": "mutable", + "name": "shares", + "nameLocation": "17354:6:31", + "nodeType": "VariableDeclaration", + "scope": 3571, + "src": "17346:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3566, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17346:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3569, + "mutability": "mutable", + "name": "minShares", + "nameLocation": "17370:9:31", + "nodeType": "VariableDeclaration", + "scope": 3571, + "src": "17362:17:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3568, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17362:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "17345:35:31" + }, + "src": "17307:74:31" + }, + { + "documentation": { + "id": 3572, + "nodeType": "StructuredDocumentation", + "src": "17387:84:31", + "text": " @notice Thrown when operating a zero share amount is not allowed." + }, + "errorSelector": "7318ad99", + "id": 3574, + "name": "HorizonStakingInvalidZeroShares", + "nameLocation": "17482:31:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3573, + "nodeType": "ParameterList", + "parameters": [], + "src": "17513:2:31" + }, + "src": "17476:40:31" + }, + { + "documentation": { + "id": 3575, + "nodeType": "StructuredDocumentation", + "src": "17522:205:31", + "text": " @notice Thrown when a minimum share amount is required to operate but it's not met.\n @param shares The actual share amount\n @param minShares The minimum required share amount" + }, + "errorSelector": "ab997935", + "id": 3581, + "name": "HorizonStakingInsufficientShares", + "nameLocation": "17738:32:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3580, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3577, + "mutability": "mutable", + "name": "shares", + "nameLocation": "17779:6:31", + "nodeType": "VariableDeclaration", + "scope": 3581, + "src": "17771:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3576, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17771:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3579, + "mutability": "mutable", + "name": "minShares", + "nameLocation": "17795:9:31", + "nodeType": "VariableDeclaration", + "scope": 3581, + "src": "17787:17:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3578, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17787:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "17770:35:31" + }, + "src": "17732:74:31" + }, + { + "documentation": { + "id": 3582, + "nodeType": "StructuredDocumentation", + "src": "17812:211:31", + "text": " @notice Thrown when as a result of slashing delegation pool has no tokens but has shares.\n @param serviceProvider The service provider address\n @param verifier The verifier address" + }, + "errorSelector": "cc276f78", + "id": 3588, + "name": "HorizonStakingInvalidDelegationPoolState", + "nameLocation": "18034:40:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3587, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3584, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "18083:15:31", + "nodeType": "VariableDeclaration", + "scope": 3588, + "src": "18075:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3583, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18075:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3586, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "18108:8:31", + "nodeType": "VariableDeclaration", + "scope": 3588, + "src": "18100:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3585, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18100:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "18074:43:31" + }, + "src": "18028:90:31" + }, + { + "documentation": { + "id": 3589, + "nodeType": "StructuredDocumentation", + "src": "18124:207:31", + "text": " @notice Thrown when attempting to operate with a delegation pool that does not exist.\n @param serviceProvider The service provider address\n @param verifier The verifier address" + }, + "errorSelector": "b6a70b3b", + "id": 3595, + "name": "HorizonStakingInvalidDelegationPool", + "nameLocation": "18342:35:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3594, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3591, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "18386:15:31", + "nodeType": "VariableDeclaration", + "scope": 3595, + "src": "18378:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3590, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18378:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3593, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "18411:8:31", + "nodeType": "VariableDeclaration", + "scope": 3595, + "src": "18403:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3592, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18403:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "18377:43:31" + }, + "src": "18336:85:31" + }, + { + "documentation": { + "id": 3596, + "nodeType": "StructuredDocumentation", + "src": "18427:202:31", + "text": " @notice Thrown when the minimum token amount required for delegation is not met.\n @param tokens The actual token amount\n @param minTokens The minimum required token amount" + }, + "errorSelector": "b86d8857", + "id": 3602, + "name": "HorizonStakingInsufficientDelegationTokens", + "nameLocation": "18640:42:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3601, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3598, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "18691:6:31", + "nodeType": "VariableDeclaration", + "scope": 3602, + "src": "18683:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3597, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18683:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3600, + "mutability": "mutable", + "name": "minTokens", + "nameLocation": "18707:9:31", + "nodeType": "VariableDeclaration", + "scope": 3602, + "src": "18699:17:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3599, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18699:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "18682:35:31" + }, + "src": "18634:84:31" + }, + { + "documentation": { + "id": 3603, + "nodeType": "StructuredDocumentation", + "src": "18724:113:31", + "text": " @notice Thrown when attempting to redelegate with a serivce provider that is the zero address." + }, + "errorSelector": "88d1f59c", + "id": 3605, + "name": "HorizonStakingInvalidServiceProviderZeroAddress", + "nameLocation": "18848:47:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3604, + "nodeType": "ParameterList", + "parameters": [], + "src": "18895:2:31" + }, + "src": "18842:56:31" + }, + { + "documentation": { + "id": 3606, + "nodeType": "StructuredDocumentation", + "src": "18904:105:31", + "text": " @notice Thrown when attempting to redelegate with a verifier that is the zero address." + }, + "errorSelector": "a9626059", + "id": 3608, + "name": "HorizonStakingInvalidVerifierZeroAddress", + "nameLocation": "19020:40:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3607, + "nodeType": "ParameterList", + "parameters": [], + "src": "19060:2:31" + }, + "src": "19014:49:31" + }, + { + "documentation": { + "id": 3609, + "nodeType": "StructuredDocumentation", + "src": "19105:105:31", + "text": " @notice Thrown when attempting to fulfill a thaw request but there is nothing thawing." + }, + "errorSelector": "3f199628", + "id": 3611, + "name": "HorizonStakingNothingThawing", + "nameLocation": "19221:28:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3610, + "nodeType": "ParameterList", + "parameters": [], + "src": "19249:2:31" + }, + "src": "19215:37:31" + }, + { + "documentation": { + "id": 3612, + "nodeType": "StructuredDocumentation", + "src": "19258:85:31", + "text": " @notice Thrown when a service provider has too many thaw requests." + }, + "errorSelector": "66570a56", + "id": 3614, + "name": "HorizonStakingTooManyThawRequests", + "nameLocation": "19354:33:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3613, + "nodeType": "ParameterList", + "parameters": [], + "src": "19387:2:31" + }, + "src": "19348:42:31" + }, + { + "documentation": { + "id": 3615, + "nodeType": "StructuredDocumentation", + "src": "19396:110:31", + "text": " @notice Thrown when attempting to withdraw tokens that have not thawed (legacy undelegate)." + }, + "errorSelector": "19e9a8e0", + "id": 3617, + "name": "HorizonStakingNothingToWithdraw", + "nameLocation": "19517:31:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3616, + "nodeType": "ParameterList", + "parameters": [], + "src": "19548:2:31" + }, + "src": "19511:40:31" + }, + { + "documentation": { + "id": 3618, + "nodeType": "StructuredDocumentation", + "src": "19583:329:31", + "text": " @notice Thrown during the transition period when attempting to withdraw tokens that are still thawing.\n @dev Note this thawing refers to the global thawing period applied to legacy allocated tokens,\n it does not refer to thaw requests.\n @param until The block number until the stake is locked" + }, + "errorSelector": "e91178d8", + "id": 3622, + "name": "HorizonStakingStillThawing", + "nameLocation": "19923:26:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3621, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3620, + "mutability": "mutable", + "name": "until", + "nameLocation": "19958:5:31", + "nodeType": "VariableDeclaration", + "scope": 3622, + "src": "19950:13:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3619, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "19950:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "19949:15:31" + }, + "src": "19917:48:31" + }, + { + "documentation": { + "id": 3623, + "nodeType": "StructuredDocumentation", + "src": "19971:211:31", + "text": " @notice Thrown when a service provider attempts to operate on verifiers that are not allowed.\n @dev Only applies to stake from locked wallets.\n @param verifier The verifier address" + }, + "errorSelector": "00a483dc", + "id": 3627, + "name": "HorizonStakingVerifierNotAllowed", + "nameLocation": "20193:32:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3626, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3625, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "20234:8:31", + "nodeType": "VariableDeclaration", + "scope": 3627, + "src": "20226:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3624, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "20226:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "20225:18:31" + }, + "src": "20187:57:31" + }, + { + "documentation": { + "id": 3628, + "nodeType": "StructuredDocumentation", + "src": "20250:103:31", + "text": " @notice Thrown when a service provider attempts to change their own operator access." + }, + "errorSelector": "01230653", + "id": 3630, + "name": "HorizonStakingCallerIsServiceProvider", + "nameLocation": "20364:37:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3629, + "nodeType": "ParameterList", + "parameters": [], + "src": "20401:2:31" + }, + "src": "20358:46:31" + }, + { + "documentation": { + "id": 3631, + "nodeType": "StructuredDocumentation", + "src": "20410:125:31", + "text": " @notice Thrown when trying to set a delegation fee cut that is not valid.\n @param feeCut The fee cut" + }, + "errorSelector": "54125404", + "id": 3635, + "name": "HorizonStakingInvalidDelegationFeeCut", + "nameLocation": "20546:37:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3634, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3633, + "mutability": "mutable", + "name": "feeCut", + "nameLocation": "20592:6:31", + "nodeType": "VariableDeclaration", + "scope": 3635, + "src": "20584:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3632, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20584:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "20583:16:31" + }, + "src": "20540:60:31" + }, + { + "documentation": { + "id": 3636, + "nodeType": "StructuredDocumentation", + "src": "20606:60:31", + "text": " @notice Thrown when a legacy slash fails." + }, + "errorSelector": "ef370f51", + "id": 3638, + "name": "HorizonStakingLegacySlashFailed", + "nameLocation": "20677:31:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3637, + "nodeType": "ParameterList", + "parameters": [], + "src": "20708:2:31" + }, + "src": "20671:40:31" + }, + { + "documentation": { + "id": 3639, + "nodeType": "StructuredDocumentation", + "src": "20717:101:31", + "text": " @notice Thrown when there attempting to slash a provision with no tokens to slash." + }, + "errorSelector": "5452ae48", + "id": 3641, + "name": "HorizonStakingNoTokensToSlash", + "nameLocation": "20829:29:31", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 3640, + "nodeType": "ParameterList", + "parameters": [], + "src": "20858:2:31" + }, + "src": "20823:38:31" + }, + { + "documentation": { + "id": 3642, + "nodeType": "StructuredDocumentation", + "src": "20891:373:31", + "text": " @notice Deposit tokens on the staking contract.\n @dev Pulls tokens from the caller.\n Requirements:\n - `_tokens` cannot be zero.\n - Caller must have previously approved this contract to pull tokens from their balance.\n Emits a {HorizonStakeDeposited} event.\n @param tokens Amount of tokens to stake" + }, + "functionSelector": "a694fc3a", + "id": 3647, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "stake", + "nameLocation": "21278:5:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3645, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3644, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "21292:6:31", + "nodeType": "VariableDeclaration", + "scope": 3647, + "src": "21284:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3643, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21284:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "21283:16:31" + }, + "returnParameters": { + "id": 3646, + "nodeType": "ParameterList", + "parameters": [], + "src": "21308:0:31" + }, + "scope": 3937, + "src": "21269:40:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3648, + "nodeType": "StructuredDocumentation", + "src": "21315:476:31", + "text": " @notice Deposit tokens on the service provider stake, on behalf of the service provider.\n @dev Pulls tokens from the caller.\n Requirements:\n - `_tokens` cannot be zero.\n - Caller must have previously approved this contract to pull tokens from their balance.\n Emits a {HorizonStakeDeposited} event.\n @param serviceProvider Address of the service provider\n @param tokens Amount of tokens to stake" + }, + "functionSelector": "a2a31722", + "id": 3655, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "stakeTo", + "nameLocation": "21805:7:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3653, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3650, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "21821:15:31", + "nodeType": "VariableDeclaration", + "scope": 3655, + "src": "21813:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3649, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21813:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3652, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "21846:6:31", + "nodeType": "VariableDeclaration", + "scope": 3655, + "src": "21838:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3651, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21838:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "21812:41:31" + }, + "returnParameters": { + "id": 3654, + "nodeType": "ParameterList", + "parameters": [], + "src": "21862:0:31" + }, + "scope": 3937, + "src": "21796:67:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3656, + "nodeType": "StructuredDocumentation", + "src": "21869:749:31", + "text": " @notice Deposit tokens on the service provider stake, on behalf of the service provider,\n provisioned to a specific verifier.\n @dev This function can be called by the service provider, by an authorized operator or by the verifier itself.\n @dev Requirements:\n - The `serviceProvider` must have previously provisioned stake to `verifier`.\n - `_tokens` cannot be zero.\n - Caller must have previously approved this contract to pull tokens from their balance.\n Emits {HorizonStakeDeposited} and {ProvisionIncreased} events.\n @param serviceProvider Address of the service provider\n @param verifier Address of the verifier\n @param tokens Amount of tokens to stake" + }, + "functionSelector": "74612092", + "id": 3665, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "stakeToProvision", + "nameLocation": "22632:16:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3663, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3658, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "22657:15:31", + "nodeType": "VariableDeclaration", + "scope": 3665, + "src": "22649:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3657, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "22649:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3660, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "22682:8:31", + "nodeType": "VariableDeclaration", + "scope": 3665, + "src": "22674:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3659, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "22674:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3662, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "22700:6:31", + "nodeType": "VariableDeclaration", + "scope": 3665, + "src": "22692:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3661, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "22692:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "22648:59:31" + }, + "returnParameters": { + "id": 3664, + "nodeType": "ParameterList", + "parameters": [], + "src": "22716:0:31" + }, + "scope": 3937, + "src": "22623:94:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3666, + "nodeType": "StructuredDocumentation", + "src": "22723:838:31", + "text": " @notice Move idle stake back to the owner's account.\n Stake is removed from the protocol:\n - During the transition period it's locked for a period of time before it can be withdrawn\n by calling {withdraw}.\n - After the transition period it's immediately withdrawn.\n Note that after the transition period if there are tokens still locked they will have to be\n withdrawn by calling {withdraw}.\n @dev Requirements:\n - `_tokens` cannot be zero.\n - `_serviceProvider` must have enough idle stake to cover the staking amount and any\n legacy allocation.\n Emits a {HorizonStakeLocked} event during the transition period.\n Emits a {HorizonStakeWithdrawn} event after the transition period.\n @param tokens Amount of tokens to unstake" + }, + "functionSelector": "2e17de78", + "id": 3671, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "unstake", + "nameLocation": "23575:7:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3669, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3668, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "23591:6:31", + "nodeType": "VariableDeclaration", + "scope": 3671, + "src": "23583:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3667, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "23583:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "23582:16:31" + }, + "returnParameters": { + "id": 3670, + "nodeType": "ParameterList", + "parameters": [], + "src": "23607:0:31" + }, + "scope": 3937, + "src": "23566:42:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3672, + "nodeType": "StructuredDocumentation", + "src": "23614:314:31", + "text": " @notice Withdraw service provider tokens once the thawing period (initiated by {unstake}) has passed.\n All thawed tokens are withdrawn.\n @dev This is only needed during the transition period while we still have\n a global lock. After that, unstake() will automatically withdraw." + }, + "functionSelector": "3ccfd60b", + "id": 3675, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "23942:8:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3673, + "nodeType": "ParameterList", + "parameters": [], + "src": "23950:2:31" + }, + "returnParameters": { + "id": 3674, + "nodeType": "ParameterList", + "parameters": [], + "src": "23961:0:31" + }, + "scope": 3937, + "src": "23933:29:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3676, + "nodeType": "StructuredDocumentation", + "src": "23968:1408:31", + "text": " @notice Provision stake to a verifier. The tokens will be locked with a thawing period\n and will be slashable by the verifier. This is the main mechanism to provision stake to a data\n service, where the data service is the verifier.\n This function can be called by the service provider or by an operator authorized by the provider\n for this specific verifier.\n @dev During the transition period, only the subgraph data service can be used as a verifier. This\n prevents an escape hatch for legacy allocation stake.\n @dev Requirements:\n - `tokens` cannot be zero.\n - The `serviceProvider` must have enough idle stake to cover the tokens to provision.\n - `maxVerifierCut` must be a valid PPM.\n - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`.\n Emits a {ProvisionCreated} event.\n @param serviceProvider The service provider address\n @param verifier The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\n @param tokens The amount of tokens that will be locked and slashable\n @param maxVerifierCut The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\n @param thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision" + }, + "functionSelector": "010167e5", + "id": 3689, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "provision", + "nameLocation": "25390:9:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3687, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3678, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "25417:15:31", + "nodeType": "VariableDeclaration", + "scope": 3689, + "src": "25409:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3677, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25409:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3680, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "25450:8:31", + "nodeType": "VariableDeclaration", + "scope": 3689, + "src": "25442:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3679, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25442:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3682, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "25476:6:31", + "nodeType": "VariableDeclaration", + "scope": 3689, + "src": "25468:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3681, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "25468:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3684, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "25499:14:31", + "nodeType": "VariableDeclaration", + "scope": 3689, + "src": "25492:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3683, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "25492:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3686, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "25530:13:31", + "nodeType": "VariableDeclaration", + "scope": 3689, + "src": "25523:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3685, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "25523:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "25399:150:31" + }, + "returnParameters": { + "id": 3688, + "nodeType": "ParameterList", + "parameters": [], + "src": "25558:0:31" + }, + "scope": 3937, + "src": "25381:178:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3690, + "nodeType": "StructuredDocumentation", + "src": "25565:564:31", + "text": " @notice Adds tokens from the service provider's idle stake to a provision\n @dev\n Requirements:\n - The `serviceProvider` must have previously provisioned stake to `verifier`.\n - `tokens` cannot be zero.\n - The `serviceProvider` must have enough idle stake to cover the tokens to add.\n Emits a {ProvisionIncreased} event.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param tokens The amount of tokens to add to the provision" + }, + "functionSelector": "fecc9cc1", + "id": 3699, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "addToProvision", + "nameLocation": "26143:14:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3697, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3692, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "26166:15:31", + "nodeType": "VariableDeclaration", + "scope": 3699, + "src": "26158:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3691, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "26158:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3694, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "26191:8:31", + "nodeType": "VariableDeclaration", + "scope": 3699, + "src": "26183:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3693, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "26183:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3696, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "26209:6:31", + "nodeType": "VariableDeclaration", + "scope": 3699, + "src": "26201:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3695, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "26201:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "26157:59:31" + }, + "returnParameters": { + "id": 3698, + "nodeType": "ParameterList", + "parameters": [], + "src": "26225:0:31" + }, + "scope": 3937, + "src": "26134:92:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3700, + "nodeType": "StructuredDocumentation", + "src": "26232:929:31", + "text": " @notice Start thawing tokens to remove them from a provision.\n This function can be called by the service provider or by an operator authorized by the provider\n for this specific verifier.\n Note that removing tokens from a provision is a two step process:\n - First the tokens are thawed using this function.\n - Then after the thawing period, the tokens are removed from the provision using {deprovision}\n or {reprovision}.\n @dev Requirements:\n - The provision must have enough tokens available to thaw.\n - `tokens` cannot be zero.\n Emits {ProvisionThawed} and {ThawRequestCreated} events.\n @param serviceProvider The service provider address\n @param verifier The verifier address for which the tokens are provisioned\n @param tokens The amount of tokens to thaw\n @return The ID of the thaw request" + }, + "functionSelector": "f93f1cd0", + "id": 3711, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "thaw", + "nameLocation": "27175:4:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3707, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3702, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "27188:15:31", + "nodeType": "VariableDeclaration", + "scope": 3711, + "src": "27180:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3701, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "27180:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3704, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "27213:8:31", + "nodeType": "VariableDeclaration", + "scope": 3711, + "src": "27205:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3703, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "27205:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3706, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "27231:6:31", + "nodeType": "VariableDeclaration", + "scope": 3711, + "src": "27223:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3705, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "27223:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "27179:59:31" + }, + "returnParameters": { + "id": 3710, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3709, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3711, + "src": "27257:7:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3708, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "27257:7:31", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "27256:9:31" + }, + "scope": 3937, + "src": "27166:100:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3712, + "nodeType": "StructuredDocumentation", + "src": "27272:854:31", + "text": " @notice Remove tokens from a provision and move them back to the service provider's idle stake.\n @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw\n requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function\n will attempt to fulfill all thaw requests until the first one that is not yet expired is found.\n Requirements:\n - Must have previously initiated a thaw request using {thaw}.\n Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {TokensDeprovisioned} events.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests." + }, + "functionSelector": "21195373", + "id": 3721, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "deprovision", + "nameLocation": "28140:11:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3719, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3714, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "28160:15:31", + "nodeType": "VariableDeclaration", + "scope": 3721, + "src": "28152:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3713, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "28152:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3716, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "28185:8:31", + "nodeType": "VariableDeclaration", + "scope": 3721, + "src": "28177:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3715, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "28177:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3718, + "mutability": "mutable", + "name": "nThawRequests", + "nameLocation": "28203:13:31", + "nodeType": "VariableDeclaration", + "scope": 3721, + "src": "28195:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3717, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "28195:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "28151:66:31" + }, + "returnParameters": { + "id": 3720, + "nodeType": "ParameterList", + "parameters": [], + "src": "28226:0:31" + }, + "scope": 3937, + "src": "28131:96:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3722, + "nodeType": "StructuredDocumentation", + "src": "28233:1032:31", + "text": " @notice Move already thawed stake from one provision into another provision\n This function can be called by the service provider or by an operator authorized by the provider\n for the two corresponding verifiers.\n @dev Requirements:\n - Must have previously initiated a thaw request using {thaw}.\n - `tokens` cannot be zero.\n - The `serviceProvider` must have previously provisioned stake to `newVerifier`.\n - The `serviceProvider` must have enough idle stake to cover the tokens to add.\n Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled}, {TokensDeprovisioned} and {ProvisionIncreased}\n events.\n @param serviceProvider The service provider address\n @param oldVerifier The verifier address for which the tokens are currently provisioned\n @param newVerifier The verifier address for which the tokens will be provisioned\n @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests." + }, + "functionSelector": "ba7fb0b4", + "id": 3733, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "reprovision", + "nameLocation": "29279:11:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3731, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3724, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "29308:15:31", + "nodeType": "VariableDeclaration", + "scope": 3733, + "src": "29300:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3723, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "29300:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3726, + "mutability": "mutable", + "name": "oldVerifier", + "nameLocation": "29341:11:31", + "nodeType": "VariableDeclaration", + "scope": 3733, + "src": "29333:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3725, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "29333:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3728, + "mutability": "mutable", + "name": "newVerifier", + "nameLocation": "29370:11:31", + "nodeType": "VariableDeclaration", + "scope": 3733, + "src": "29362:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3727, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "29362:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3730, + "mutability": "mutable", + "name": "nThawRequests", + "nameLocation": "29399:13:31", + "nodeType": "VariableDeclaration", + "scope": 3733, + "src": "29391:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3729, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "29391:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "29290:128:31" + }, + "returnParameters": { + "id": 3732, + "nodeType": "ParameterList", + "parameters": [], + "src": "29427:0:31" + }, + "scope": 3937, + "src": "29270:158:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3734, + "nodeType": "StructuredDocumentation", + "src": "29434:1146:31", + "text": " @notice Stages a provision parameter update. Note that the change is not effective until the verifier calls\n {acceptProvisionParameters}. Calling this function is a no-op if the new parameters are the same as the current\n ones.\n @dev This two step update process prevents the service provider from changing the parameters\n without the verifier's consent.\n Requirements:\n - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`. Note that if `_maxThawingPeriod` changes the\n function will not revert if called with the same thawing period as the current one.\n Emits a {ProvisionParametersStaged} event if at least one of the parameters changed.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param maxVerifierCut The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for\n themselves when slashing\n @param thawingPeriod The proposed period in seconds that the tokens will be thawing before they can be removed from\n the provision" + }, + "functionSelector": "81e21b56", + "id": 3745, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setProvisionParameters", + "nameLocation": "30594:22:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3743, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3736, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "30634:15:31", + "nodeType": "VariableDeclaration", + "scope": 3745, + "src": "30626:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3735, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "30626:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3738, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "30667:8:31", + "nodeType": "VariableDeclaration", + "scope": 3745, + "src": "30659:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3737, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "30659:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3740, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "30692:14:31", + "nodeType": "VariableDeclaration", + "scope": 3745, + "src": "30685:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3739, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "30685:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3742, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "30723:13:31", + "nodeType": "VariableDeclaration", + "scope": 3745, + "src": "30716:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3741, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "30716:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "30616:126:31" + }, + "returnParameters": { + "id": 3744, + "nodeType": "ParameterList", + "parameters": [], + "src": "30751:0:31" + }, + "scope": 3937, + "src": "30585:167:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3746, + "nodeType": "StructuredDocumentation", + "src": "30758:257:31", + "text": " @notice Accepts a staged provision parameter update.\n @dev Only the provision's verifier can call this function.\n Emits a {ProvisionParametersSet} event.\n @param serviceProvider The service provider address" + }, + "functionSelector": "3a78b732", + "id": 3751, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "acceptProvisionParameters", + "nameLocation": "31029:25:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3749, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3748, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "31063:15:31", + "nodeType": "VariableDeclaration", + "scope": 3751, + "src": "31055:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3747, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "31055:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "31054:25:31" + }, + "returnParameters": { + "id": 3750, + "nodeType": "ParameterList", + "parameters": [], + "src": "31088:0:31" + }, + "scope": 3937, + "src": "31020:69:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3752, + "nodeType": "StructuredDocumentation", + "src": "31095:547:31", + "text": " @notice Delegate tokens to a provision.\n @dev Requirements:\n - `tokens` cannot be zero.\n - Caller must have previously approved this contract to pull tokens from their balance.\n - The provision must exist.\n Emits a {TokensDelegated} event.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param tokens The amount of tokens to delegate\n @param minSharesOut The minimum amount of shares to accept, slippage protection." + }, + "functionSelector": "6230001a", + "id": 3763, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "delegate", + "nameLocation": "31656:8:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3761, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3754, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "31673:15:31", + "nodeType": "VariableDeclaration", + "scope": 3763, + "src": "31665:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3753, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "31665:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3756, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "31698:8:31", + "nodeType": "VariableDeclaration", + "scope": 3763, + "src": "31690:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3755, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "31690:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3758, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "31716:6:31", + "nodeType": "VariableDeclaration", + "scope": 3763, + "src": "31708:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3757, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "31708:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3760, + "mutability": "mutable", + "name": "minSharesOut", + "nameLocation": "31732:12:31", + "nodeType": "VariableDeclaration", + "scope": 3763, + "src": "31724:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3759, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "31724:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "31664:81:31" + }, + "returnParameters": { + "id": 3762, + "nodeType": "ParameterList", + "parameters": [], + "src": "31754:0:31" + }, + "scope": 3937, + "src": "31647:108:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3764, + "nodeType": "StructuredDocumentation", + "src": "31761:632:31", + "text": " @notice Add tokens to a delegation pool without issuing shares.\n Used by data services to pay delegation fees/rewards.\n Delegators SHOULD NOT call this function.\n @dev Requirements:\n - `tokens` cannot be zero.\n - Caller must have previously approved this contract to pull tokens from their balance.\n Emits a {TokensToDelegationPoolAdded} event.\n @param serviceProvider The service provider address\n @param verifier The verifier address for which the tokens are provisioned\n @param tokens The amount of tokens to add to the delegation pool" + }, + "functionSelector": "ca94b0e9", + "id": 3773, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "addToDelegationPool", + "nameLocation": "32407:19:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3771, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3766, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "32435:15:31", + "nodeType": "VariableDeclaration", + "scope": 3773, + "src": "32427:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3765, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "32427:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3768, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "32460:8:31", + "nodeType": "VariableDeclaration", + "scope": 3773, + "src": "32452:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3767, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "32452:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3770, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "32478:6:31", + "nodeType": "VariableDeclaration", + "scope": 3773, + "src": "32470:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3769, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "32470:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "32426:59:31" + }, + "returnParameters": { + "id": 3772, + "nodeType": "ParameterList", + "parameters": [], + "src": "32494:0:31" + }, + "scope": 3937, + "src": "32398:97:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3774, + "nodeType": "StructuredDocumentation", + "src": "32501:673:31", + "text": " @notice Undelegate tokens from a provision and start thawing them.\n Note that undelegating tokens from a provision is a two step process:\n - First the tokens are thawed using this function.\n - Then after the thawing period, the tokens are removed from the provision using {withdrawDelegated}.\n Requirements:\n - `shares` cannot be zero.\n Emits a {TokensUndelegated} and {ThawRequestCreated} event.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param shares The amount of shares to undelegate\n @return The ID of the thaw request" + }, + "functionSelector": "a02b9426", + "id": 3785, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "undelegate", + "nameLocation": "33188:10:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3781, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3776, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "33207:15:31", + "nodeType": "VariableDeclaration", + "scope": 3785, + "src": "33199:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3775, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "33199:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3778, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "33232:8:31", + "nodeType": "VariableDeclaration", + "scope": 3785, + "src": "33224:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3777, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "33224:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3780, + "mutability": "mutable", + "name": "shares", + "nameLocation": "33250:6:31", + "nodeType": "VariableDeclaration", + "scope": 3785, + "src": "33242:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3779, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "33242:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "33198:59:31" + }, + "returnParameters": { + "id": 3784, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3783, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3785, + "src": "33276:7:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 3782, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "33276:7:31", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "33275:9:31" + }, + "scope": 3937, + "src": "33179:106:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3786, + "nodeType": "StructuredDocumentation", + "src": "33291:1005:31", + "text": " @notice Withdraw undelegated tokens from a provision after thawing.\n @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw\n requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function\n will attempt to fulfill all thaw requests until the first one that is not yet expired is found.\n @dev If the delegation pool was completely slashed before withdrawing, calling this function will fulfill\n the thaw requests with an amount equal to zero.\n Requirements:\n - Must have previously initiated a thaw request using {undelegate}.\n Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests." + }, + "functionSelector": "3993d849", + "id": 3795, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "withdrawDelegated", + "nameLocation": "34310:17:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3793, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3788, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "34336:15:31", + "nodeType": "VariableDeclaration", + "scope": 3795, + "src": "34328:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3787, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "34328:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3790, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "34361:8:31", + "nodeType": "VariableDeclaration", + "scope": 3795, + "src": "34353:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3789, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "34353:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3792, + "mutability": "mutable", + "name": "nThawRequests", + "nameLocation": "34379:13:31", + "nodeType": "VariableDeclaration", + "scope": 3795, + "src": "34371:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3791, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "34371:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "34327:66:31" + }, + "returnParameters": { + "id": 3794, + "nodeType": "ParameterList", + "parameters": [], + "src": "34402:0:31" + }, + "scope": 3937, + "src": "34301:102:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3796, + "nodeType": "StructuredDocumentation", + "src": "34409:1169:31", + "text": " @notice Re-delegate undelegated tokens from a provision after thawing to a `newServiceProvider` and `newVerifier`.\n @dev The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw\n requests in the event that fulfilling all of them results in a gas limit error.\n Requirements:\n - Must have previously initiated a thaw request using {undelegate}.\n - `newServiceProvider` and `newVerifier` must not be the zero address.\n - `newServiceProvider` must have previously provisioned stake to `newVerifier`.\n Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\n @param oldServiceProvider The old service provider address\n @param oldVerifier The old verifier address\n @param newServiceProvider The address of a new service provider\n @param newVerifier The address of a new verifier\n @param minSharesForNewProvider The minimum amount of shares to accept for the new service provider\n @param nThawRequests The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests." + }, + "functionSelector": "f64b3598", + "id": 3811, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "redelegate", + "nameLocation": "35592:10:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3809, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3798, + "mutability": "mutable", + "name": "oldServiceProvider", + "nameLocation": "35620:18:31", + "nodeType": "VariableDeclaration", + "scope": 3811, + "src": "35612:26:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3797, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "35612:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3800, + "mutability": "mutable", + "name": "oldVerifier", + "nameLocation": "35656:11:31", + "nodeType": "VariableDeclaration", + "scope": 3811, + "src": "35648:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3799, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "35648:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3802, + "mutability": "mutable", + "name": "newServiceProvider", + "nameLocation": "35685:18:31", + "nodeType": "VariableDeclaration", + "scope": 3811, + "src": "35677:26:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3801, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "35677:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3804, + "mutability": "mutable", + "name": "newVerifier", + "nameLocation": "35721:11:31", + "nodeType": "VariableDeclaration", + "scope": 3811, + "src": "35713:19:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3803, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "35713:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3806, + "mutability": "mutable", + "name": "minSharesForNewProvider", + "nameLocation": "35750:23:31", + "nodeType": "VariableDeclaration", + "scope": 3811, + "src": "35742:31:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3805, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "35742:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3808, + "mutability": "mutable", + "name": "nThawRequests", + "nameLocation": "35791:13:31", + "nodeType": "VariableDeclaration", + "scope": 3811, + "src": "35783:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3807, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "35783:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "35602:208:31" + }, + "returnParameters": { + "id": 3810, + "nodeType": "ParameterList", + "parameters": [], + "src": "35819:0:31" + }, + "scope": 3937, + "src": "35583:237:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3812, + "nodeType": "StructuredDocumentation", + "src": "35826:389:31", + "text": " @notice Set the fee cut for a verifier on a specific payment type.\n @dev Emits a {DelegationFeeCutSet} event.\n @param serviceProvider The service provider address\n @param verifier The verifier address\n @param paymentType The payment type for which the fee cut is set, as defined in {IGraphPayments}\n @param feeCut The fee cut to set, in PPM" + }, + "functionSelector": "42c51693", + "id": 3824, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDelegationFeeCut", + "nameLocation": "36229:19:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3822, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3814, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "36266:15:31", + "nodeType": "VariableDeclaration", + "scope": 3824, + "src": "36258:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3813, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "36258:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3816, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "36299:8:31", + "nodeType": "VariableDeclaration", + "scope": 3824, + "src": "36291:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3815, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "36291:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3819, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "36345:11:31", + "nodeType": "VariableDeclaration", + "scope": 3824, + "src": "36317:39:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 3818, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 3817, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["36317:14:31", "36332:12:31"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "36317:27:31" + }, + "referencedDeclaration": 2433, + "src": "36317:27:31", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3821, + "mutability": "mutable", + "name": "feeCut", + "nameLocation": "36374:6:31", + "nodeType": "VariableDeclaration", + "scope": 3824, + "src": "36366:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3820, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "36366:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "36248:138:31" + }, + "returnParameters": { + "id": 3823, + "nodeType": "ParameterList", + "parameters": [], + "src": "36395:0:31" + }, + "scope": 3937, + "src": "36220:176:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3825, + "nodeType": "StructuredDocumentation", + "src": "36402:410:31", + "text": " @notice Delegate tokens to the subgraph data service provision.\n This function is for backwards compatibility with the legacy staking contract.\n It only allows delegating to the subgraph data service and DOES NOT have slippage protection.\n @dev See {delegate}.\n @param serviceProvider The service provider address\n @param tokens The amount of tokens to delegate" + }, + "functionSelector": "026e402b", + "id": 3832, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "delegate", + "nameLocation": "36826:8:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3830, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3827, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "36843:15:31", + "nodeType": "VariableDeclaration", + "scope": 3832, + "src": "36835:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3826, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "36835:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3829, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "36868:6:31", + "nodeType": "VariableDeclaration", + "scope": 3832, + "src": "36860:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3828, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "36860:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "36834:41:31" + }, + "returnParameters": { + "id": 3831, + "nodeType": "ParameterList", + "parameters": [], + "src": "36884:0:31" + }, + "scope": 3937, + "src": "36817:68:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3833, + "nodeType": "StructuredDocumentation", + "src": "36891:407:31", + "text": " @notice Undelegate tokens from the subgraph data service provision and start thawing them.\n This function is for backwards compatibility with the legacy staking contract.\n It only allows undelegating from the subgraph data service.\n @dev See {undelegate}.\n @param serviceProvider The service provider address\n @param shares The amount of shares to undelegate" + }, + "functionSelector": "4d99dd16", + "id": 3840, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "undelegate", + "nameLocation": "37312:10:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3838, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3835, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "37331:15:31", + "nodeType": "VariableDeclaration", + "scope": 3840, + "src": "37323:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3834, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "37323:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3837, + "mutability": "mutable", + "name": "shares", + "nameLocation": "37356:6:31", + "nodeType": "VariableDeclaration", + "scope": 3840, + "src": "37348:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3836, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "37348:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "37322:41:31" + }, + "returnParameters": { + "id": 3839, + "nodeType": "ParameterList", + "parameters": [], + "src": "37372:0:31" + }, + "scope": 3937, + "src": "37303:70:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3841, + "nodeType": "StructuredDocumentation", + "src": "37379:485:31", + "text": " @notice Withdraw undelegated tokens from the subgraph data service provision after thawing.\n This function is for backwards compatibility with the legacy staking contract.\n It only allows withdrawing tokens undelegated before horizon upgrade.\n @dev See {delegate}.\n @param serviceProvider The service provider address\n @param deprecated Deprecated parameter kept for backwards compatibility\n @return The amount of tokens withdrawn" + }, + "functionSelector": "51a60b02", + "id": 3850, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "withdrawDelegated", + "nameLocation": "37878:17:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3846, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3843, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "37913:15:31", + "nodeType": "VariableDeclaration", + "scope": 3850, + "src": "37905:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3842, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "37905:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3845, + "mutability": "mutable", + "name": "deprecated", + "nameLocation": "37946:10:31", + "nodeType": "VariableDeclaration", + "scope": 3850, + "src": "37938:18:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3844, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "37938:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "37895:103:31" + }, + "returnParameters": { + "id": 3849, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3848, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3850, + "src": "38017:7:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3847, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "38017:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "38016:9:31" + }, + "scope": 3937, + "src": "37869:157:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3851, + "nodeType": "StructuredDocumentation", + "src": "38032:1190:31", + "text": " @notice Slash a service provider. This can only be called by a verifier to which\n the provider has provisioned stake, and up to the amount of tokens they have provisioned.\n If the service provider's stake is not enough, the associated delegation pool might be slashed\n depending on the value of the global delegation slashing flag.\n Part of the slashed tokens are sent to the `verifierDestination` as a reward.\n @dev Requirements:\n - `tokens` must be less than or equal to the amount of tokens provisioned by the service provider.\n - `tokensVerifier` must be less than the provision's tokens times the provision's maximum verifier cut.\n Emits a {ProvisionSlashed} and {VerifierTokensSent} events.\n Emits a {DelegationSlashed} or {DelegationSlashingSkipped} event depending on the global delegation slashing\n flag.\n @param serviceProvider The service provider to slash\n @param tokens The amount of tokens to slash\n @param tokensVerifier The amount of tokens to transfer instead of burning\n @param verifierDestination The address to transfer the verifier cut to" + }, + "functionSelector": "e76fede6", + "id": 3862, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "slash", + "nameLocation": "39236:5:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3860, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3853, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "39259:15:31", + "nodeType": "VariableDeclaration", + "scope": 3862, + "src": "39251:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3852, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "39251:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3855, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "39292:6:31", + "nodeType": "VariableDeclaration", + "scope": 3862, + "src": "39284:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3854, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "39284:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3857, + "mutability": "mutable", + "name": "tokensVerifier", + "nameLocation": "39316:14:31", + "nodeType": "VariableDeclaration", + "scope": 3862, + "src": "39308:22:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3856, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "39308:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3859, + "mutability": "mutable", + "name": "verifierDestination", + "nameLocation": "39348:19:31", + "nodeType": "VariableDeclaration", + "scope": 3862, + "src": "39340:27:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3858, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "39340:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "39241:132:31" + }, + "returnParameters": { + "id": 3861, + "nodeType": "ParameterList", + "parameters": [], + "src": "39382:0:31" + }, + "scope": 3937, + "src": "39227:156:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3863, + "nodeType": "StructuredDocumentation", + "src": "39389:769:31", + "text": " @notice Provision stake to a verifier using locked tokens (i.e. from GraphTokenLockWallets).\n @dev See {provision}.\n Additional requirements:\n - The `verifier` must be allowed to be used for locked provisions.\n @param serviceProvider The service provider address\n @param verifier The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\n @param tokens The amount of tokens that will be locked and slashable\n @param maxVerifierCut The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\n @param thawingPeriod The period in seconds that the tokens will be thawing before they can be removed from the provision" + }, + "functionSelector": "82d66cb8", + "id": 3876, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "provisionLocked", + "nameLocation": "40172:15:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3874, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3865, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "40205:15:31", + "nodeType": "VariableDeclaration", + "scope": 3876, + "src": "40197:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3864, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "40197:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3867, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "40238:8:31", + "nodeType": "VariableDeclaration", + "scope": 3876, + "src": "40230:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3866, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "40230:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3869, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "40264:6:31", + "nodeType": "VariableDeclaration", + "scope": 3876, + "src": "40256:14:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3868, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "40256:7:31", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3871, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "40287:14:31", + "nodeType": "VariableDeclaration", + "scope": 3876, + "src": "40280:21:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3870, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "40280:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3873, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "40318:13:31", + "nodeType": "VariableDeclaration", + "scope": 3876, + "src": "40311:20:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3872, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "40311:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "40187:150:31" + }, + "returnParameters": { + "id": 3875, + "nodeType": "ParameterList", + "parameters": [], + "src": "40346:0:31" + }, + "scope": 3937, + "src": "40163:184:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3877, + "nodeType": "StructuredDocumentation", + "src": "40353:474:31", + "text": " @notice Authorize or unauthorize an address to be an operator for the caller on a verifier.\n @dev See {setOperator}.\n Additional requirements:\n - The `verifier` must be allowed to be used for locked provisions.\n @param verifier The verifier / data service on which they'll be allowed to operate\n @param operator Address to authorize or unauthorize\n @param allowed Whether the operator is authorized or not" + }, + "functionSelector": "ad4d35b5", + "id": 3886, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setOperatorLocked", + "nameLocation": "40841:17:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3884, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3879, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "40867:8:31", + "nodeType": "VariableDeclaration", + "scope": 3886, + "src": "40859:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3878, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "40859:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3881, + "mutability": "mutable", + "name": "operator", + "nameLocation": "40885:8:31", + "nodeType": "VariableDeclaration", + "scope": 3886, + "src": "40877:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3880, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "40877:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3883, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "40900:7:31", + "nodeType": "VariableDeclaration", + "scope": 3886, + "src": "40895:12:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3882, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "40895:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "40858:50:31" + }, + "returnParameters": { + "id": 3885, + "nodeType": "ParameterList", + "parameters": [], + "src": "40917:0:31" + }, + "scope": 3937, + "src": "40832:86:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3887, + "nodeType": "StructuredDocumentation", + "src": "40924:449:31", + "text": " @notice Sets a verifier as a globally allowed verifier for locked provisions.\n @dev This function can only be called by the contract governor, it's used to maintain\n a whitelist of verifiers that do not allow the stake from a locked wallet to escape the lock.\n @dev Emits a {AllowedLockedVerifierSet} event.\n @param verifier The verifier address\n @param allowed Whether the verifier is allowed or not" + }, + "functionSelector": "4ca7ac22", + "id": 3894, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setAllowedLockedVerifier", + "nameLocation": "41387:24:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3892, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3889, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "41420:8:31", + "nodeType": "VariableDeclaration", + "scope": 3894, + "src": "41412:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3888, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "41412:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3891, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "41435:7:31", + "nodeType": "VariableDeclaration", + "scope": 3894, + "src": "41430:12:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3890, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "41430:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "41411:32:31" + }, + "returnParameters": { + "id": 3893, + "nodeType": "ParameterList", + "parameters": [], + "src": "41452:0:31" + }, + "scope": 3937, + "src": "41378:75:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3895, + "nodeType": "StructuredDocumentation", + "src": "41459:146:31", + "text": " @notice Set the global delegation slashing flag to true.\n @dev This function can only be called by the contract governor." + }, + "functionSelector": "ef58bd67", + "id": 3898, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDelegationSlashingEnabled", + "nameLocation": "41619:28:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3896, + "nodeType": "ParameterList", + "parameters": [], + "src": "41647:2:31" + }, + "returnParameters": { + "id": 3897, + "nodeType": "ParameterList", + "parameters": [], + "src": "41658:0:31" + }, + "scope": 3937, + "src": "41610:49:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3899, + "nodeType": "StructuredDocumentation", + "src": "41665:293:31", + "text": " @notice Clear the legacy global thawing period.\n This signifies the end of the transition period, after which no legacy allocations should be left.\n @dev This function can only be called by the contract governor.\n @dev Emits a {ThawingPeriodCleared} event." + }, + "functionSelector": "e473522a", + "id": 3902, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "clearThawingPeriod", + "nameLocation": "41972:18:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3900, + "nodeType": "ParameterList", + "parameters": [], + "src": "41990:2:31" + }, + "returnParameters": { + "id": 3901, + "nodeType": "ParameterList", + "parameters": [], + "src": "42001:0:31" + }, + "scope": 3937, + "src": "41963:39:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3903, + "nodeType": "StructuredDocumentation", + "src": "42008:163:31", + "text": " @notice Sets the global maximum thawing period allowed for provisions.\n @param maxThawingPeriod The new maximum thawing period, in seconds" + }, + "functionSelector": "259bc435", + "id": 3908, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMaxThawingPeriod", + "nameLocation": "42185:19:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3906, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3905, + "mutability": "mutable", + "name": "maxThawingPeriod", + "nameLocation": "42212:16:31", + "nodeType": "VariableDeclaration", + "scope": 3908, + "src": "42205:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3904, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "42205:6:31", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "42204:25:31" + }, + "returnParameters": { + "id": 3907, + "nodeType": "ParameterList", + "parameters": [], + "src": "42238:0:31" + }, + "scope": 3937, + "src": "42176:63:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3909, + "nodeType": "StructuredDocumentation", + "src": "42245:368:31", + "text": " @notice Authorize or unauthorize an address to be an operator for the caller on a data service.\n @dev Emits a {OperatorSet} event.\n @param verifier The verifier / data service on which they'll be allowed to operate\n @param operator Address to authorize or unauthorize\n @param allowed Whether the operator is authorized or not" + }, + "functionSelector": "bc735d90", + "id": 3918, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setOperator", + "nameLocation": "42627:11:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3916, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3911, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "42647:8:31", + "nodeType": "VariableDeclaration", + "scope": 3918, + "src": "42639:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3910, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "42639:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3913, + "mutability": "mutable", + "name": "operator", + "nameLocation": "42665:8:31", + "nodeType": "VariableDeclaration", + "scope": 3918, + "src": "42657:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3912, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "42657:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3915, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "42680:7:31", + "nodeType": "VariableDeclaration", + "scope": 3918, + "src": "42675:12:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3914, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "42675:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "42638:50:31" + }, + "returnParameters": { + "id": 3917, + "nodeType": "ParameterList", + "parameters": [], + "src": "42697:0:31" + }, + "scope": 3937, + "src": "42618:80:31", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3919, + "nodeType": "StructuredDocumentation", + "src": "42704:402:31", + "text": " @notice Check if an operator is authorized for the caller on a specific verifier / data service.\n @param serviceProvider The service provider on behalf of whom they're claiming to act\n @param verifier The verifier / data service on which they're claiming to act\n @param operator The address to check for auth\n @return Whether the operator is authorized or not" + }, + "functionSelector": "7c145cc7", + "id": 3930, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isAuthorized", + "nameLocation": "43120:12:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3926, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3921, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "43141:15:31", + "nodeType": "VariableDeclaration", + "scope": 3930, + "src": "43133:23:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3920, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "43133:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3923, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "43166:8:31", + "nodeType": "VariableDeclaration", + "scope": 3930, + "src": "43158:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3922, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "43158:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3925, + "mutability": "mutable", + "name": "operator", + "nameLocation": "43184:8:31", + "nodeType": "VariableDeclaration", + "scope": 3930, + "src": "43176:16:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3924, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "43176:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "43132:61:31" + }, + "returnParameters": { + "id": 3929, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3928, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3930, + "src": "43217:4:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3927, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "43217:4:31", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "43216:6:31" + }, + "scope": 3937, + "src": "43111:112:31", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 3931, + "nodeType": "StructuredDocumentation", + "src": "43229:120:31", + "text": " @notice Get the address of the staking extension.\n @return The address of the staking extension" + }, + "functionSelector": "66ee1b28", + "id": 3936, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getStakingExtension", + "nameLocation": "43363:19:31", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3932, + "nodeType": "ParameterList", + "parameters": [], + "src": "43382:2:31" + }, + "returnParameters": { + "id": 3935, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3934, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 3936, + "src": "43408:7:31", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3933, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "43408:7:31", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "43407:9:31" + }, + "scope": 3937, + "src": "43354:63:31", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 3938, + "src": "1032:42387:31", + "usedErrors": [ + 3500, 3507, 3514, 3521, 3530, 3535, 3540, 3547, 3550, 3557, 3564, 3571, 3574, 3581, 3588, 3595, 3602, + 3605, 3608, 3611, 3614, 3617, 3622, 3627, 3630, 3635, 3638, 3641 + ], + "usedEvents": [ + 3242, 3249, 3262, 3271, 3280, 3289, 3300, 3311, 3322, 3331, 3340, 3349, 3360, 3373, 3386, 3397, 3406, + 3415, 3427, 3447, 3463, 3479, 3484, 3491, 3494, 3497 + ] + } + ], + "src": "46:43374:31" + }, + "id": 31 + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol", + "exportedSymbols": { + "IHorizonStakingTypes": [4073] + }, + "id": 4074, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 3939, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:32" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IHorizonStakingTypes", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 3940, + "nodeType": "StructuredDocumentation", + "src": "71:552:32", + "text": " @title Defines the data types used in the Horizon staking contract\n @dev In order to preserve storage compatibility some data structures keep deprecated fields.\n These structures have then two representations, an internal one used by the contract storage and a public one.\n Getter functions should retrieve internal representations, remove deprecated fields and return the public representation.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 4073, + "linearizedBaseContracts": [4073], + "name": "IHorizonStakingTypes", + "nameLocation": "634:20:32", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IHorizonStakingTypes.Provision", + "documentation": { + "id": 3941, + "nodeType": "StructuredDocumentation", + "src": "661:1299:32", + "text": " @notice Represents stake assigned to a specific verifier/data service.\n Provisioned stake is locked and can be used as economic security by a data service.\n @param tokens Service provider tokens in the provision (does not include delegated tokens)\n @param tokensThawing Service provider tokens that are being thawed (and will stop being slashable soon)\n @param sharesThawing Shares representing the thawing tokens\n @param maxVerifierCut Max amount that can be taken by the verifier when slashing, expressed in parts-per-million of the amount slashed\n @param thawingPeriod Time, in seconds, tokens must thaw before being withdrawn\n @param createdAt Timestamp when the provision was created\n @param maxVerifierCutPending Pending value for `maxVerifierCut`. Verifier needs to accept it before it becomes active.\n @param thawingPeriodPending Pending value for `thawingPeriod`. Verifier needs to accept it before it becomes active.\n @param lastParametersStagedAt Timestamp when the provision parameters were last staged. Can be used by data service implementation to\n implement arbitrary parameter update logic.\n @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid." + }, + "id": 3962, + "members": [ + { + "constant": false, + "id": 3943, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2000:6:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "1992:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3942, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1992:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3945, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "2024:13:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2016:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3944, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2016:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3947, + "mutability": "mutable", + "name": "sharesThawing", + "nameLocation": "2055:13:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2047:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3946, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2047:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3949, + "mutability": "mutable", + "name": "maxVerifierCut", + "nameLocation": "2085:14:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2078:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3948, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2078:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3951, + "mutability": "mutable", + "name": "thawingPeriod", + "nameLocation": "2116:13:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2109:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3950, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2109:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3953, + "mutability": "mutable", + "name": "createdAt", + "nameLocation": "2146:9:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2139:16:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3952, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2139:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3955, + "mutability": "mutable", + "name": "maxVerifierCutPending", + "nameLocation": "2172:21:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2165:28:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3954, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2165:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3957, + "mutability": "mutable", + "name": "thawingPeriodPending", + "nameLocation": "2210:20:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2203:27:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 3956, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2203:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3959, + "mutability": "mutable", + "name": "lastParametersStagedAt", + "nameLocation": "2248:22:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2240:30:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3958, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2240:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3961, + "mutability": "mutable", + "name": "thawingNonce", + "nameLocation": "2288:12:32", + "nodeType": "VariableDeclaration", + "scope": 3962, + "src": "2280:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3960, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2280:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "Provision", + "nameLocation": "1972:9:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "1965:342:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.ServiceProvider", + "documentation": { + "id": 3963, + "nodeType": "StructuredDocumentation", + "src": "2313:384:32", + "text": " @notice Public representation of a service provider.\n @dev See {ServiceProviderInternal} for the actual storage representation\n @param tokensStaked Total amount of tokens on the provider stake (only staked by the provider, includes all provisions)\n @param tokensProvisioned Total amount of tokens locked in provisions (only staked by the provider)" + }, + "id": 3968, + "members": [ + { + "constant": false, + "id": 3965, + "mutability": "mutable", + "name": "tokensStaked", + "nameLocation": "2743:12:32", + "nodeType": "VariableDeclaration", + "scope": 3968, + "src": "2735:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3964, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2735:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3967, + "mutability": "mutable", + "name": "tokensProvisioned", + "nameLocation": "2773:17:32", + "nodeType": "VariableDeclaration", + "scope": 3968, + "src": "2765:25:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3966, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2765:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "ServiceProvider", + "nameLocation": "2709:15:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "2702:95:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.ServiceProviderInternal", + "documentation": { + "id": 3969, + "nodeType": "StructuredDocumentation", + "src": "2803:700:32", + "text": " @notice Internal representation of a service provider.\n @dev It contains deprecated fields from the `Indexer` struct to maintain storage compatibility.\n @param tokensStaked Total amount of tokens on the provider stake (only staked by the provider, includes all provisions)\n @param __DEPRECATED_tokensAllocated (Deprecated) Tokens used in allocations\n @param __DEPRECATED_tokensLocked (Deprecated) Tokens locked for withdrawal subject to thawing period\n @param __DEPRECATED_tokensLockedUntil (Deprecated) Block when locked tokens can be withdrawn\n @param tokensProvisioned Total amount of tokens locked in provisions (only staked by the provider)" + }, + "id": 3980, + "members": [ + { + "constant": false, + "id": 3971, + "mutability": "mutable", + "name": "tokensStaked", + "nameLocation": "3557:12:32", + "nodeType": "VariableDeclaration", + "scope": 3980, + "src": "3549:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3970, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3549:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3973, + "mutability": "mutable", + "name": "__DEPRECATED_tokensAllocated", + "nameLocation": "3587:28:32", + "nodeType": "VariableDeclaration", + "scope": 3980, + "src": "3579:36:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3972, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3579:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3975, + "mutability": "mutable", + "name": "__DEPRECATED_tokensLocked", + "nameLocation": "3633:25:32", + "nodeType": "VariableDeclaration", + "scope": 3980, + "src": "3625:33:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3974, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3625:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3977, + "mutability": "mutable", + "name": "__DEPRECATED_tokensLockedUntil", + "nameLocation": "3676:30:32", + "nodeType": "VariableDeclaration", + "scope": 3980, + "src": "3668:38:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3976, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3668:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3979, + "mutability": "mutable", + "name": "tokensProvisioned", + "nameLocation": "3724:17:32", + "nodeType": "VariableDeclaration", + "scope": 3980, + "src": "3716:25:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3978, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3716:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "ServiceProviderInternal", + "nameLocation": "3515:23:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "3508:240:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.DelegationPool", + "documentation": { + "id": 3981, + "nodeType": "StructuredDocumentation", + "src": "3754:483:32", + "text": " @notice Public representation of a delegation pool.\n @dev See {DelegationPoolInternal} for the actual storage representation\n @param tokens Total tokens as pool reserves\n @param shares Total shares minted in the pool\n @param tokensThawing Tokens thawing in the pool\n @param sharesThawing Shares representing the thawing tokens\n @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid." + }, + "id": 3992, + "members": [ + { + "constant": false, + "id": 3983, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "4282:6:32", + "nodeType": "VariableDeclaration", + "scope": 3992, + "src": "4274:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3982, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4274:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3985, + "mutability": "mutable", + "name": "shares", + "nameLocation": "4306:6:32", + "nodeType": "VariableDeclaration", + "scope": 3992, + "src": "4298:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3984, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4298:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3987, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "4330:13:32", + "nodeType": "VariableDeclaration", + "scope": 3992, + "src": "4322:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3986, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4322:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3989, + "mutability": "mutable", + "name": "sharesThawing", + "nameLocation": "4361:13:32", + "nodeType": "VariableDeclaration", + "scope": 3992, + "src": "4353:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3988, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4353:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3991, + "mutability": "mutable", + "name": "thawingNonce", + "nameLocation": "4392:12:32", + "nodeType": "VariableDeclaration", + "scope": 3992, + "src": "4384:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3990, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4384:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "DelegationPool", + "nameLocation": "4249:14:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "4242:169:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.DelegationPoolInternal", + "documentation": { + "id": 3993, + "nodeType": "StructuredDocumentation", + "src": "4417:1077:32", + "text": " @notice Internal representation of a delegation pool.\n @dev It contains deprecated fields from the previous version of the `DelegationPool` struct\n to maintain storage compatibility.\n @param __DEPRECATED_cooldownBlocks (Deprecated) Time, in blocks, an indexer must wait before updating delegation parameters\n @param __DEPRECATED_indexingRewardCut (Deprecated) Percentage of indexing rewards for the service provider, in PPM\n @param __DEPRECATED_queryFeeCut (Deprecated) Percentage of query fees for the service provider, in PPM\n @param __DEPRECATED_updatedAtBlock (Deprecated) Block when the delegation parameters were last updated\n @param tokens Total tokens as pool reserves\n @param shares Total shares minted in the pool\n @param delegators Delegation details by delegator\n @param tokensThawing Tokens thawing in the pool\n @param sharesThawing Shares representing the thawing tokens\n @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid." + }, + "id": 4017, + "members": [ + { + "constant": false, + "id": 3995, + "mutability": "mutable", + "name": "__DEPRECATED_cooldownBlocks", + "nameLocation": "5546:27:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5539:34:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3994, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "5539:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3997, + "mutability": "mutable", + "name": "__DEPRECATED_indexingRewardCut", + "nameLocation": "5590:30:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5583:37:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3996, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "5583:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 3999, + "mutability": "mutable", + "name": "__DEPRECATED_queryFeeCut", + "nameLocation": "5637:24:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5630:31:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 3998, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "5630:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4001, + "mutability": "mutable", + "name": "__DEPRECATED_updatedAtBlock", + "nameLocation": "5679:27:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5671:35:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4000, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5671:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4003, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "5724:6:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5716:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4002, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5716:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4005, + "mutability": "mutable", + "name": "shares", + "nameLocation": "5748:6:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5740:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4004, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5740:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4010, + "mutability": "mutable", + "name": "delegators", + "nameLocation": "5824:10:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5764:70:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_DelegationInternal_$4029_storage_$", + "typeString": "mapping(address => struct IHorizonStakingTypes.DelegationInternal)" + }, + "typeName": { + "id": 4009, + "keyName": "delegator", + "keyNameLocation": "5780:9:32", + "keyType": { + "id": 4006, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5772:7:32", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "5764:59:32", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_DelegationInternal_$4029_storage_$", + "typeString": "mapping(address => struct IHorizonStakingTypes.DelegationInternal)" + }, + "valueName": "delegation", + "valueNameLocation": "5812:10:32", + "valueType": { + "id": 4008, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4007, + "name": "DelegationInternal", + "nameLocations": ["5793:18:32"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4029, + "src": "5793:18:32" + }, + "referencedDeclaration": 4029, + "src": "5793:18:32", + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationInternal_$4029_storage_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationInternal" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4012, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "5852:13:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5844:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4011, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5844:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4014, + "mutability": "mutable", + "name": "sharesThawing", + "nameLocation": "5883:13:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5875:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4013, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5875:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4016, + "mutability": "mutable", + "name": "thawingNonce", + "nameLocation": "5914:12:32", + "nodeType": "VariableDeclaration", + "scope": 4017, + "src": "5906:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4015, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5906:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "DelegationPoolInternal", + "nameLocation": "5506:22:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "5499:434:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.Delegation", + "documentation": { + "id": 4018, + "nodeType": "StructuredDocumentation", + "src": "5939:207:32", + "text": " @notice Public representation of delegation details.\n @dev See {DelegationInternal} for the actual storage representation\n @param shares Shares owned by a delegator in the pool" + }, + "id": 4021, + "members": [ + { + "constant": false, + "id": 4020, + "mutability": "mutable", + "name": "shares", + "nameLocation": "6187:6:32", + "nodeType": "VariableDeclaration", + "scope": 4021, + "src": "6179:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4019, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6179:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "Delegation", + "nameLocation": "6158:10:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "6151:49:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.DelegationInternal", + "documentation": { + "id": 4022, + "nodeType": "StructuredDocumentation", + "src": "6206:431:32", + "text": " @notice Internal representation of delegation details.\n @dev It contains deprecated fields from the previous version of the `Delegation` struct\n to maintain storage compatibility.\n @param shares Shares owned by the delegator in the pool\n @param __DEPRECATED_tokensLocked Tokens locked for undelegation\n @param __DEPRECATED_tokensLockedUntil Epoch when locked tokens can be withdrawn" + }, + "id": 4029, + "members": [ + { + "constant": false, + "id": 4024, + "mutability": "mutable", + "name": "shares", + "nameLocation": "6686:6:32", + "nodeType": "VariableDeclaration", + "scope": 4029, + "src": "6678:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4023, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6678:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4026, + "mutability": "mutable", + "name": "__DEPRECATED_tokensLocked", + "nameLocation": "6710:25:32", + "nodeType": "VariableDeclaration", + "scope": 4029, + "src": "6702:33:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4025, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6702:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4028, + "mutability": "mutable", + "name": "__DEPRECATED_tokensLockedUntil", + "nameLocation": "6753:30:32", + "nodeType": "VariableDeclaration", + "scope": 4029, + "src": "6745:38:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4027, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6745:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "DelegationInternal", + "nameLocation": "6649:18:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "6642:148:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.ThawRequestType", + "documentation": { + "id": 4030, + "nodeType": "StructuredDocumentation", + "src": "6796:201:32", + "text": " @dev Enum to specify the type of thaw request.\n @param Provision Represents a thaw request for a provision.\n @param Delegation Represents a thaw request for a delegation." + }, + "id": 4033, + "members": [ + { + "id": 4031, + "name": "Provision", + "nameLocation": "7033:9:32", + "nodeType": "EnumValue", + "src": "7033:9:32" + }, + { + "id": 4032, + "name": "Delegation", + "nameLocation": "7052:10:32", + "nodeType": "EnumValue", + "src": "7052:10:32" + } + ], + "name": "ThawRequestType", + "nameLocation": "7007:15:32", + "nodeType": "EnumDefinition", + "src": "7002:66:32" + }, + { + "canonicalName": "IHorizonStakingTypes.ThawRequest", + "documentation": { + "id": 4034, + "nodeType": "StructuredDocumentation", + "src": "7074:494:32", + "text": " @notice Details of a stake thawing operation.\n @dev ThawRequests are stored in linked lists by service provider/delegator,\n ordered by creation timestamp.\n @param shares Shares that represent the tokens being thawed\n @param thawingUntil The timestamp when the thawed funds can be removed from the provision\n @param nextRequest Id of the next thaw request in the linked list\n @param thawingNonce Used to invalidate unfulfilled thaw requests" + }, + "id": 4043, + "members": [ + { + "constant": false, + "id": 4036, + "mutability": "mutable", + "name": "shares", + "nameLocation": "7610:6:32", + "nodeType": "VariableDeclaration", + "scope": 4043, + "src": "7602:14:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4035, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7602:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4038, + "mutability": "mutable", + "name": "thawingUntil", + "nameLocation": "7633:12:32", + "nodeType": "VariableDeclaration", + "scope": 4043, + "src": "7626:19:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 4037, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "7626:6:32", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4040, + "mutability": "mutable", + "name": "nextRequest", + "nameLocation": "7663:11:32", + "nodeType": "VariableDeclaration", + "scope": 4043, + "src": "7655:19:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4039, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7655:7:32", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4042, + "mutability": "mutable", + "name": "thawingNonce", + "nameLocation": "7692:12:32", + "nodeType": "VariableDeclaration", + "scope": 4043, + "src": "7684:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4041, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7684:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "ThawRequest", + "nameLocation": "7580:11:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "7573:138:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.FulfillThawRequestsParams", + "documentation": { + "id": 4044, + "nodeType": "StructuredDocumentation", + "src": "7717:817:32", + "text": " @notice Parameters to fulfill thaw requests.\n @dev This struct is used to avoid stack too deep error in the `fulfillThawRequests` function.\n @param requestType The type of thaw request (Provision or Delegation)\n @param serviceProvider The address of the service provider\n @param verifier The address of the verifier\n @param owner The address of the owner of the thaw request\n @param tokensThawing The current amount of tokens already thawing\n @param sharesThawing The current amount of shares already thawing\n @param nThawRequests The number of thaw requests to fulfill. If set to 0, all thaw requests are fulfilled.\n @param thawingNonce The current valid thawing nonce. Any thaw request with a different nonce is invalid and should be ignored." + }, + "id": 4062, + "members": [ + { + "constant": false, + "id": 4047, + "mutability": "mutable", + "name": "requestType", + "nameLocation": "8598:11:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8582:27:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + }, + "typeName": { + "id": 4046, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4045, + "name": "ThawRequestType", + "nameLocations": ["8582:15:32"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4033, + "src": "8582:15:32" + }, + "referencedDeclaration": 4033, + "src": "8582:15:32", + "typeDescriptions": { + "typeIdentifier": "t_enum$_ThawRequestType_$4033", + "typeString": "enum IHorizonStakingTypes.ThawRequestType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4049, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "8627:15:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8619:23:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4048, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8619:7:32", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4051, + "mutability": "mutable", + "name": "verifier", + "nameLocation": "8660:8:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8652:16:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4050, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8652:7:32", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4053, + "mutability": "mutable", + "name": "owner", + "nameLocation": "8686:5:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8678:13:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4052, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8678:7:32", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4055, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "8709:13:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8701:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4054, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8701:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4057, + "mutability": "mutable", + "name": "sharesThawing", + "nameLocation": "8740:13:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8732:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4056, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8732:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4059, + "mutability": "mutable", + "name": "nThawRequests", + "nameLocation": "8771:13:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8763:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4058, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8763:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4061, + "mutability": "mutable", + "name": "thawingNonce", + "nameLocation": "8802:12:32", + "nodeType": "VariableDeclaration", + "scope": 4062, + "src": "8794:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4060, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8794:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "FulfillThawRequestsParams", + "nameLocation": "8546:25:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "8539:282:32", + "visibility": "public" + }, + { + "canonicalName": "IHorizonStakingTypes.TraverseThawRequestsResults", + "documentation": { + "id": 4063, + "nodeType": "StructuredDocumentation", + "src": "8827:427:32", + "text": " @notice Results of the traversal of thaw requests.\n @dev This struct is used to avoid stack too deep error in the `fulfillThawRequests` function.\n @param requestsFulfilled The number of thaw requests fulfilled\n @param tokensThawed The total amount of tokens thawed\n @param tokensThawing The total amount of tokens thawing\n @param sharesThawing The total amount of shares thawing" + }, + "id": 4072, + "members": [ + { + "constant": false, + "id": 4065, + "mutability": "mutable", + "name": "requestsFulfilled", + "nameLocation": "9312:17:32", + "nodeType": "VariableDeclaration", + "scope": 4072, + "src": "9304:25:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4064, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9304:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4067, + "mutability": "mutable", + "name": "tokensThawed", + "nameLocation": "9347:12:32", + "nodeType": "VariableDeclaration", + "scope": 4072, + "src": "9339:20:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4066, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9339:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4069, + "mutability": "mutable", + "name": "tokensThawing", + "nameLocation": "9377:13:32", + "nodeType": "VariableDeclaration", + "scope": 4072, + "src": "9369:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4068, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9369:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4071, + "mutability": "mutable", + "name": "sharesThawing", + "nameLocation": "9408:13:32", + "nodeType": "VariableDeclaration", + "scope": 4072, + "src": "9400:21:32", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4070, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9400:7:32", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "TraverseThawRequestsResults", + "nameLocation": "9266:27:32", + "nodeType": "StructDefinition", + "scope": 4073, + "src": "9259:169:32", + "visibility": "public" + } + ], + "scope": 4074, + "src": "624:8806:32", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:9385:32" + }, + "id": 32 + }, + "@graphprotocol/horizon/contracts/libraries/LinkedList.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/LinkedList.sol", + "exportedSymbols": { + "LinkedList": [4364] + }, + "id": 4365, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 4075, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:33" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "LinkedList", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 4076, + "nodeType": "StructuredDocumentation", + "src": "71:714:33", + "text": " @title LinkedList library\n @notice A library to manage singly linked lists.\n The library makes no assumptions about the contents of the items, the only\n requirements on the items are:\n - they must be represented by a unique bytes32 id\n - the id of the item must not be bytes32(0)\n - each item must have a reference to the next item in the list\n - the list cannot have more than `MAX_ITEMS` items\n A contract using this library must store:\n - a LinkedList.List to keep track of the list metadata\n - a mapping from bytes32 to the item data\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 4364, + "linearizedBaseContracts": [4364], + "name": "LinkedList", + "nameLocation": "794:10:33", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 4080, + "libraryName": { + "id": 4077, + "name": "LinkedList", + "nameLocations": ["817:10:33"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4364, + "src": "817:10:33" + }, + "nodeType": "UsingForDirective", + "src": "811:26:33", + "typeName": { + "id": 4079, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4078, + "name": "List", + "nameLocations": ["832:4:33"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "832:4:33" + }, + "referencedDeclaration": 4090, + "src": "832:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + } + }, + { + "canonicalName": "LinkedList.List", + "documentation": { + "id": 4081, + "nodeType": "StructuredDocumentation", + "src": "843:264:33", + "text": " @notice Represents a linked list\n @param head The head of the list\n @param tail The tail of the list\n @param nonce A nonce, which can optionally be used to generate unique ids\n @param count The number of items in the list" + }, + "id": 4090, + "members": [ + { + "constant": false, + "id": 4083, + "mutability": "mutable", + "name": "head", + "nameLocation": "1142:4:33", + "nodeType": "VariableDeclaration", + "scope": 4090, + "src": "1134:12:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4082, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1134:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4085, + "mutability": "mutable", + "name": "tail", + "nameLocation": "1164:4:33", + "nodeType": "VariableDeclaration", + "scope": 4090, + "src": "1156:12:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4084, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1156:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4087, + "mutability": "mutable", + "name": "nonce", + "nameLocation": "1186:5:33", + "nodeType": "VariableDeclaration", + "scope": 4090, + "src": "1178:13:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4086, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1178:7:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4089, + "mutability": "mutable", + "name": "count", + "nameLocation": "1209:5:33", + "nodeType": "VariableDeclaration", + "scope": 4090, + "src": "1201:13:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4088, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1201:7:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "List", + "nameLocation": "1119:4:33", + "nodeType": "StructDefinition", + "scope": 4364, + "src": "1112:109:33", + "visibility": "public" + }, + { + "constant": true, + "documentation": { + "id": 4091, + "nodeType": "StructuredDocumentation", + "src": "1227:32:33", + "text": "@notice Empty bytes constant" + }, + "id": 4097, + "mutability": "constant", + "name": "NULL_BYTES", + "nameLocation": "1288:10:33", + "nodeType": "VariableDeclaration", + "scope": 4364, + "src": "1264:46:33", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4092, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1264:5:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "value": { + "arguments": [ + { + "hexValue": "", + "id": 4095, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1307:2:33", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "id": 4094, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1301:5:33", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 4093, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1301:5:33", + "typeDescriptions": {} + } + }, + "id": 4096, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1301:9:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 4098, + "nodeType": "StructuredDocumentation", + "src": "1317:55:33", + "text": "@notice Maximum amount of items allowed in the list" + }, + "id": 4101, + "mutability": "constant", + "name": "MAX_ITEMS", + "nameLocation": "1403:9:33", + "nodeType": "VariableDeclaration", + "scope": 4364, + "src": "1377:44:33", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4099, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1377:7:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "31305f303030", + "id": 4100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1415:6:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + }, + "value": "10_000" + }, + "visibility": "internal" + }, + { + "documentation": { + "id": 4102, + "nodeType": "StructuredDocumentation", + "src": "1428:82:33", + "text": " @notice Thrown when trying to remove an item from an empty list" + }, + "errorSelector": "ddaf8f21", + "id": 4104, + "name": "LinkedListEmptyList", + "nameLocation": "1521:19:33", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4103, + "nodeType": "ParameterList", + "parameters": [], + "src": "1540:2:33" + }, + "src": "1515:28:33" + }, + { + "documentation": { + "id": 4105, + "nodeType": "StructuredDocumentation", + "src": "1549:118:33", + "text": " @notice Thrown when trying to add an item to a list that has reached the maximum number of elements" + }, + "errorSelector": "ea315ac0", + "id": 4107, + "name": "LinkedListMaxElementsExceeded", + "nameLocation": "1678:29:33", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4106, + "nodeType": "ParameterList", + "parameters": [], + "src": "1707:2:33" + }, + "src": "1672:38:33" + }, + { + "documentation": { + "id": 4108, + "nodeType": "StructuredDocumentation", + "src": "1716:99:33", + "text": " @notice Thrown when trying to traverse a list with more iterations than elements" + }, + "errorSelector": "9482373a", + "id": 4110, + "name": "LinkedListInvalidIterations", + "nameLocation": "1826:27:33", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4109, + "nodeType": "ParameterList", + "parameters": [], + "src": "1853:2:33" + }, + "src": "1820:36:33" + }, + { + "documentation": { + "id": 4111, + "nodeType": "StructuredDocumentation", + "src": "1862:88:33", + "text": " @notice Thrown when trying to add an item with id equal to bytes32(0)" + }, + "errorSelector": "8f4a893d", + "id": 4113, + "name": "LinkedListInvalidZeroId", + "nameLocation": "1961:23:33", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4112, + "nodeType": "ParameterList", + "parameters": [], + "src": "1984:2:33" + }, + "src": "1955:32:33" + }, + { + "body": { + "id": 4171, + "nodeType": "Block", + "src": "2503:262:33", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4126, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 4123, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4117, + "src": "2521:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4124, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2526:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "2521:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 4125, + "name": "MAX_ITEMS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4101, + "src": "2534:9:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2521:22:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 4127, + "name": "LinkedListMaxElementsExceeded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4107, + "src": "2545:29:33", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 4128, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2545:31:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4122, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2513:7:33", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4129, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2513:64:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4130, + "nodeType": "ExpressionStatement", + "src": "2513:64:33" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 4137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4132, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4119, + "src": "2595:2:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 4135, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2609:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4134, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2601:7:33", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 4133, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2601:7:33", + "typeDescriptions": {} + } + }, + "id": 4136, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2601:10:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2595:16:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 4138, + "name": "LinkedListInvalidZeroId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4113, + "src": "2613:23:33", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 4139, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2613:25:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4131, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2587:7:33", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4140, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2587:52:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4141, + "nodeType": "ExpressionStatement", + "src": "2587:52:33" + }, + { + "expression": { + "id": 4146, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4142, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4117, + "src": "2649:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4144, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "2654:4:33", + "memberName": "tail", + "nodeType": "MemberAccess", + "referencedDeclaration": 4085, + "src": "2649:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 4145, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4119, + "src": "2661:2:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2649:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 4147, + "nodeType": "ExpressionStatement", + "src": "2649:14:33" + }, + { + "expression": { + "id": 4152, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4148, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4117, + "src": "2673:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4150, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "2678:5:33", + "memberName": "nonce", + "nodeType": "MemberAccess", + "referencedDeclaration": 4087, + "src": "2673:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "31", + "id": 4151, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2687:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "2673:15:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4153, + "nodeType": "ExpressionStatement", + "src": "2673:15:33" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4157, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 4154, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4117, + "src": "2702:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4155, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2707:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "2702:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 4156, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2716:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2702:15:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 4164, + "nodeType": "IfStatement", + "src": "2698:35:33", + "trueBody": { + "expression": { + "id": 4162, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4158, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4117, + "src": "2719:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4160, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "2724:4:33", + "memberName": "head", + "nodeType": "MemberAccess", + "referencedDeclaration": 4083, + "src": "2719:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 4161, + "name": "id", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4119, + "src": "2731:2:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2719:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 4163, + "nodeType": "ExpressionStatement", + "src": "2719:14:33" + } + }, + { + "expression": { + "id": 4169, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4165, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4117, + "src": "2743:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4167, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "2748:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "2743:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "31", + "id": 4168, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2757:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "2743:15:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4170, + "nodeType": "ExpressionStatement", + "src": "2743:15:33" + } + ] + }, + "documentation": { + "id": 4114, + "nodeType": "StructuredDocumentation", + "src": "1993:448:33", + "text": " @notice Adds an item to the list.\n The item is added to the end of the list.\n @dev Note that this function will not take care of linking the\n old tail to the new item. The caller should take care of this.\n It will also not ensure id uniqueness.\n @dev There is a maximum number of elements that can be added to the list.\n @param self The list metadata\n @param id The id of the item to add" + }, + "id": 4172, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "addTail", + "nameLocation": "2455:7:33", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4120, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4117, + "mutability": "mutable", + "name": "self", + "nameLocation": "2476:4:33", + "nodeType": "VariableDeclaration", + "scope": 4172, + "src": "2463:17:33", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + }, + "typeName": { + "id": 4116, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4115, + "name": "List", + "nameLocations": ["2463:4:33"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "2463:4:33" + }, + "referencedDeclaration": 4090, + "src": "2463:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4119, + "mutability": "mutable", + "name": "id", + "nameLocation": "2490:2:33", + "nodeType": "VariableDeclaration", + "scope": 4172, + "src": "2482:10:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4118, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2482:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2462:31:33" + }, + "returnParameters": { + "id": 4121, + "nodeType": "ParameterList", + "parameters": [], + "src": "2503:0:33" + }, + "scope": 4364, + "src": "2446:319:33", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4245, + "nodeType": "Block", + "src": "3468:279:33", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4199, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 4196, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3486:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4197, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3491:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "3486:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 4198, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3499:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3486:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 4200, + "name": "LinkedListEmptyList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4104, + "src": "3502:19:33", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 4201, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3502:21:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4195, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3478:7:33", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4202, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3478:46:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4203, + "nodeType": "ExpressionStatement", + "src": "3478:46:33" + }, + { + "assignments": [4205], + "declarations": [ + { + "constant": false, + "id": 4205, + "mutability": "mutable", + "name": "nextItem", + "nameLocation": "3542:8:33", + "nodeType": "VariableDeclaration", + "scope": 4245, + "src": "3534:16:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4204, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3534:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 4210, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 4207, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3565:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4208, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3570:4:33", + "memberName": "head", + "nodeType": "MemberAccess", + "referencedDeclaration": 4083, + "src": "3565:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 4206, + "name": "getNextItem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4184, + "src": "3553:11:33", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 4209, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3553:22:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3534:41:33" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 4212, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3596:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4213, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3601:4:33", + "memberName": "head", + "nodeType": "MemberAccess", + "referencedDeclaration": 4083, + "src": "3596:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 4211, + "name": "deleteItem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4190, + "src": "3585:10:33", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + } + }, + "id": 4214, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3585:21:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4215, + "nodeType": "ExpressionStatement", + "src": "3585:21:33" + }, + { + "expression": { + "id": 4220, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4216, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3616:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4218, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3621:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "3616:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "hexValue": "31", + "id": 4219, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3630:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "3616:15:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4221, + "nodeType": "ExpressionStatement", + "src": "3616:15:33" + }, + { + "expression": { + "id": 4226, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4222, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3641:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4224, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3646:4:33", + "memberName": "head", + "nodeType": "MemberAccess", + "referencedDeclaration": 4083, + "src": "3641:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 4225, + "name": "nextItem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4205, + "src": "3653:8:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "3641:20:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 4227, + "nodeType": "ExpressionStatement", + "src": "3641:20:33" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4231, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 4228, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3675:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4229, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3680:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "3675:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 4230, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3689:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3675:15:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 4241, + "nodeType": "IfStatement", + "src": "3671:43:33", + "trueBody": { + "expression": { + "id": 4239, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 4232, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3692:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4234, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3697:4:33", + "memberName": "tail", + "nodeType": "MemberAccess", + "referencedDeclaration": 4085, + "src": "3692:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "hexValue": "30", + "id": 4237, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3712:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4236, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3704:7:33", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 4235, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3704:7:33", + "typeDescriptions": {} + } + }, + "id": 4238, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3704:10:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "3692:22:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 4240, + "nodeType": "ExpressionStatement", + "src": "3692:22:33" + } + }, + { + "expression": { + "expression": { + "id": 4242, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4176, + "src": "3731:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4243, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3736:4:33", + "memberName": "head", + "nodeType": "MemberAccess", + "referencedDeclaration": 4083, + "src": "3731:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 4194, + "id": 4244, + "nodeType": "Return", + "src": "3724:16:33" + } + ] + }, + "documentation": { + "id": 4173, + "nodeType": "StructuredDocumentation", + "src": "2771:512:33", + "text": " @notice Removes an item from the list.\n The item is removed from the beginning of the list.\n @param self The list metadata\n @param getNextItem A function to get the next item in the list. It should take\n the id of the current item and return the id of the next item.\n @param deleteItem A function to delete an item. This should delete the item from\n the contract storage. It takes the id of the item to delete.\n @return The id of the head of the list." + }, + "id": 4246, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "removeHead", + "nameLocation": "3297:10:33", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4191, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4176, + "mutability": "mutable", + "name": "self", + "nameLocation": "3330:4:33", + "nodeType": "VariableDeclaration", + "scope": 4246, + "src": "3317:17:33", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + }, + "typeName": { + "id": 4175, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4174, + "name": "List", + "nameLocations": ["3317:4:33"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "3317:4:33" + }, + "referencedDeclaration": 4090, + "src": "3317:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4184, + "mutability": "mutable", + "name": "getNextItem", + "nameLocation": "3385:11:33", + "nodeType": "VariableDeclaration", + "scope": 4246, + "src": "3344:52:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + }, + "typeName": { + "id": 4183, + "nodeType": "FunctionTypeName", + "parameterTypes": { + "id": 4179, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4178, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4183, + "src": "3353:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4177, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3353:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3352:9:33" + }, + "returnParameterTypes": { + "id": 4182, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4181, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4183, + "src": "3376:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4180, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3376:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3375:9:33" + }, + "src": "3344:52:33", + "stateMutability": "view", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + }, + "visibility": "internal" + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4190, + "mutability": "mutable", + "name": "deleteItem", + "nameLocation": "3424:10:33", + "nodeType": "VariableDeclaration", + "scope": 4246, + "src": "3406:28:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + }, + "typeName": { + "id": 4189, + "nodeType": "FunctionTypeName", + "parameterTypes": { + "id": 4187, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4186, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4189, + "src": "3415:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4185, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3415:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3414:9:33" + }, + "returnParameterTypes": { + "id": 4188, + "nodeType": "ParameterList", + "parameters": [], + "src": "3424:0:33" + }, + "src": "3406:28:33", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + }, + "visibility": "internal" + }, + "visibility": "internal" + } + ], + "src": "3307:133:33" + }, + "returnParameters": { + "id": 4194, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4193, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4246, + "src": "3459:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4192, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3459:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3458:9:33" + }, + "scope": 4364, + "src": "3288:459:33", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4362, + "nodeType": "Block", + "src": "5142:606:33", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4288, + "name": "iterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4280, + "src": "5160:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "expression": { + "id": 4289, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4250, + "src": "5174:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4290, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5179:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "5174:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5160:24:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 4292, + "name": "LinkedListInvalidIterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4110, + "src": "5186:27:33", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 4293, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5186:29:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4287, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5152:7:33", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4294, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5152:64:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4295, + "nodeType": "ExpressionStatement", + "src": "5152:64:33" + }, + { + "assignments": [4297], + "declarations": [ + { + "constant": false, + "id": 4297, + "mutability": "mutable", + "name": "itemCount", + "nameLocation": "5235:9:33", + "nodeType": "VariableDeclaration", + "scope": 4362, + "src": "5227:17:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4296, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5227:7:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 4299, + "initialValue": { + "hexValue": "30", + "id": 4298, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5247:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "5227:21:33" + }, + { + "expression": { + "id": 4309, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4300, + "name": "iterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4280, + "src": "5258:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4303, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4301, + "name": "iterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4280, + "src": "5272:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 4302, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5286:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5272:15:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 4304, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5271:17:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 4307, + "name": "iterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4280, + "src": "5304:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4308, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "5271:43:33", + "trueExpression": { + "expression": { + "id": 4305, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4250, + "src": "5291:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4306, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5296:5:33", + "memberName": "count", + "nodeType": "MemberAccess", + "referencedDeclaration": 4089, + "src": "5291:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5258:56:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4310, + "nodeType": "ExpressionStatement", + "src": "5258:56:33" + }, + { + "assignments": [4312], + "declarations": [ + { + "constant": false, + "id": 4312, + "mutability": "mutable", + "name": "cursor", + "nameLocation": "5333:6:33", + "nodeType": "VariableDeclaration", + "scope": 4362, + "src": "5325:14:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4311, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5325:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 4315, + "initialValue": { + "expression": { + "id": 4313, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4250, + "src": "5342:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4314, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5347:4:33", + "memberName": "head", + "nodeType": "MemberAccess", + "referencedDeclaration": 4083, + "src": "5342:9:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5325:26:33" + }, + { + "body": { + "id": 4356, + "nodeType": "Block", + "src": "5409:288:33", + "statements": [ + { + "assignments": [4327, 4329], + "declarations": [ + { + "constant": false, + "id": 4327, + "mutability": "mutable", + "name": "shouldBreak", + "nameLocation": "5429:11:33", + "nodeType": "VariableDeclaration", + "scope": 4356, + "src": "5424:16:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 4326, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5424:4:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4329, + "mutability": "mutable", + "name": "acc_", + "nameLocation": "5455:4:33", + "nodeType": "VariableDeclaration", + "scope": 4356, + "src": "5442:17:33", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4328, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5442:5:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 4334, + "initialValue": { + "arguments": [ + { + "id": 4331, + "name": "cursor", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4312, + "src": "5475:6:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 4332, + "name": "processInitAcc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4278, + "src": "5483:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 4330, + "name": "processItem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4270, + "src": "5463:11:33", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes32,bytes memory) returns (bool,bytes memory)" + } + }, + "id": 4333, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5463:35:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5423:75:33" + }, + { + "condition": { + "id": 4335, + "name": "shouldBreak", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4327, + "src": "5517:11:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 4337, + "nodeType": "IfStatement", + "src": "5513:22:33", + "trueBody": { + "id": 4336, + "nodeType": "Break", + "src": "5530:5:33" + } + }, + { + "expression": { + "id": 4340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4338, + "name": "processInitAcc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4278, + "src": "5550:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 4339, + "name": "acc_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4329, + "src": "5567:4:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "src": "5550:21:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 4341, + "nodeType": "ExpressionStatement", + "src": "5550:21:33" + }, + { + "expression": { + "id": 4348, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4342, + "name": "cursor", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4312, + "src": "5585:6:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 4345, + "name": "getNextItem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4258, + "src": "5610:11:33", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + { + "id": 4346, + "name": "deleteItem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4276, + "src": "5623:10:33", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + }, + { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + } + ], + "expression": { + "id": 4343, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4250, + "src": "5594:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List storage pointer" + } + }, + "id": 4344, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5599:10:33", + "memberName": "removeHead", + "nodeType": "MemberAccess", + "referencedDeclaration": 4246, + "src": "5594:15:33", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_List_$4090_storage_ptr_$_t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$_$_t_function_internal_nonpayable$_t_bytes32_$returns$__$_$returns$_t_bytes32_$attached_to$_t_struct$_List_$4090_storage_ptr_$", + "typeString": "function (struct LinkedList.List storage pointer,function (bytes32) view returns (bytes32),function (bytes32)) returns (bytes32)" + } + }, + "id": 4347, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5594:40:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "5585:49:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 4349, + "nodeType": "ExpressionStatement", + "src": "5585:49:33" + }, + { + "expression": { + "id": 4351, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "--", + "prefix": false, + "src": "5649:12:33", + "subExpression": { + "id": 4350, + "name": "iterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4280, + "src": "5649:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4352, + "nodeType": "ExpressionStatement", + "src": "5649:12:33" + }, + { + "expression": { + "id": 4354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "5675:11:33", + "subExpression": { + "id": 4353, + "name": "itemCount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4297, + "src": "5675:9:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4355, + "nodeType": "ExpressionStatement", + "src": "5675:11:33" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 4325, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 4321, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4316, + "name": "cursor", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4312, + "src": "5369:6:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 4319, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5387:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4318, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5379:7:33", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 4317, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5379:7:33", + "typeDescriptions": {} + } + }, + "id": 4320, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5379:10:33", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "5369:20:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4324, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4322, + "name": "iterations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4280, + "src": "5393:10:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 4323, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5406:1:33", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5393:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "5369:38:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 4357, + "nodeType": "WhileStatement", + "src": "5362:335:33" + }, + { + "expression": { + "components": [ + { + "id": 4358, + "name": "itemCount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4297, + "src": "5715:9:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 4359, + "name": "processInitAcc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4278, + "src": "5726:14:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "id": 4360, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5714:27:33", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$", + "typeString": "tuple(uint256,bytes memory)" + } + }, + "functionReturnParameters": 4286, + "id": 4361, + "nodeType": "Return", + "src": "5707:34:33" + } + ] + }, + "documentation": { + "id": 4247, + "nodeType": "StructuredDocumentation", + "src": "3753:1045:33", + "text": " @notice Traverses the list and processes each item.\n It deletes the processed items from both the list and the storage mapping.\n @param self The list metadata\n @param getNextItem A function to get the next item in the list. It should take\n the id of the current item and return the id of the next item.\n @param processItem A function to process an item. The function should take the id of the item\n and an accumulator, and return:\n - a boolean indicating whether the traversal should stop\n - an accumulator to pass data between iterations\n @param deleteItem A function to delete an item. This should delete the item from\n the contract storage. It takes the id of the item to delete.\n @param processInitAcc The initial accumulator data\n @param iterations The maximum number of iterations to perform. If 0, the traversal will continue\n until the end of the list.\n @return The number of items processed\n @return The final accumulator data." + }, + "id": 4363, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "traverse", + "nameLocation": "4812:8:33", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4281, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4250, + "mutability": "mutable", + "name": "self", + "nameLocation": "4843:4:33", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "4830:17:33", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + }, + "typeName": { + "id": 4249, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4248, + "name": "List", + "nameLocations": ["4830:4:33"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4090, + "src": "4830:4:33" + }, + "referencedDeclaration": 4090, + "src": "4830:4:33", + "typeDescriptions": { + "typeIdentifier": "t_struct$_List_$4090_storage_ptr", + "typeString": "struct LinkedList.List" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4258, + "mutability": "mutable", + "name": "getNextItem", + "nameLocation": "4898:11:33", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "4857:52:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + }, + "typeName": { + "id": 4257, + "nodeType": "FunctionTypeName", + "parameterTypes": { + "id": 4253, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4252, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4257, + "src": "4866:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4251, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4866:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4865:9:33" + }, + "returnParameterTypes": { + "id": 4256, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4255, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4257, + "src": "4889:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4254, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4889:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4888:9:33" + }, + "src": "4857:52:33", + "stateMutability": "view", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + }, + "visibility": "internal" + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4270, + "mutability": "mutable", + "name": "processItem", + "nameLocation": "4980:11:33", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "4919:72:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes32,bytes) returns (bool,bytes)" + }, + "typeName": { + "id": 4269, + "nodeType": "FunctionTypeName", + "parameterTypes": { + "id": 4263, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4260, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4269, + "src": "4928:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4259, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4928:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4262, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4269, + "src": "4937:12:33", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4261, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4937:5:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4927:23:33" + }, + "returnParameterTypes": { + "id": 4268, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4265, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4269, + "src": "4960:4:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 4264, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4960:4:33", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4267, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4269, + "src": "4966:12:33", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4266, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4966:5:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4959:20:33" + }, + "src": "4919:72:33", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes32,bytes) returns (bool,bytes)" + }, + "visibility": "internal" + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4276, + "mutability": "mutable", + "name": "deleteItem", + "nameLocation": "5019:10:33", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "5001:28:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + }, + "typeName": { + "id": 4275, + "nodeType": "FunctionTypeName", + "parameterTypes": { + "id": 4273, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4272, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4275, + "src": "5010:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4271, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5010:7:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5009:9:33" + }, + "returnParameterTypes": { + "id": 4274, + "nodeType": "ParameterList", + "parameters": [], + "src": "5019:0:33" + }, + "src": "5001:28:33", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + }, + "visibility": "internal" + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4278, + "mutability": "mutable", + "name": "processInitAcc", + "nameLocation": "5052:14:33", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "5039:27:33", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4277, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5039:5:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4280, + "mutability": "mutable", + "name": "iterations", + "nameLocation": "5084:10:33", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "5076:18:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4279, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5076:7:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4820:280:33" + }, + "returnParameters": { + "id": 4286, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4283, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "5119:7:33", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4282, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5119:7:33", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4285, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4363, + "src": "5128:12:33", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4284, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5128:5:33", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5118:23:33" + }, + "scope": 4364, + "src": "4803:945:33", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 4365, + "src": "786:4964:33", + "usedErrors": [4104, 4107, 4110, 4113], + "usedEvents": [] + } + ], + "src": "46:5705:33" + }, + "id": 33 + }, + "@graphprotocol/horizon/contracts/libraries/MathUtils.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/MathUtils.sol", + "exportedSymbols": { + "MathUtils": [4445] + }, + "id": 4446, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 4366, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:34" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "MathUtils", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 4367, + "nodeType": "StructuredDocumentation", + "src": "71:239:34", + "text": " @title MathUtils Library\n @notice A collection of functions to perform math operations\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 4445, + "linearizedBaseContracts": [4445], + "name": "MathUtils", + "nameLocation": "319:9:34", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 4404, + "nodeType": "Block", + "src": "1029:113:34", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4402, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4396, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4389, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4383, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4381, + "name": "valueA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4370, + "src": "1048:6:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 4382, + "name": "weightA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4372, + "src": "1057:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1048:16:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 4384, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1047:18:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4387, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4385, + "name": "valueB", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4374, + "src": "1069:6:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 4386, + "name": "weightB", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4376, + "src": "1078:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1069:16:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 4388, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1068:18:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1047:39:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4394, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4390, + "name": "weightA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4372, + "src": "1090:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 4391, + "name": "weightB", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4376, + "src": "1100:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1090:17:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "hexValue": "31", + "id": 4393, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1110:1:34", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "1090:21:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 4395, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1089:23:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1047:65:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 4397, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1046:67:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4398, + "name": "weightA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4372, + "src": "1117:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 4399, + "name": "weightB", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4376, + "src": "1127:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1117:17:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 4401, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1116:19:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1046:89:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 4380, + "id": 4403, + "nodeType": "Return", + "src": "1039:96:34" + } + ] + }, + "documentation": { + "id": 4368, + "nodeType": "StructuredDocumentation", + "src": "335:518:34", + "text": " @dev Calculates the weighted average of two values pondering each of these\n values based on configured weights. The contribution of each value N is\n weightN/(weightA + weightB). The calculation rounds up to ensure the result\n is always equal or greater than the smallest of the two values.\n @param valueA The amount for value A\n @param weightA The weight to use for value A\n @param valueB The amount for value B\n @param weightB The weight to use for value B" + }, + "id": 4405, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "weightedAverageRoundingUp", + "nameLocation": "867:25:34", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4377, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4370, + "mutability": "mutable", + "name": "valueA", + "nameLocation": "910:6:34", + "nodeType": "VariableDeclaration", + "scope": 4405, + "src": "902:14:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4369, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "902:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4372, + "mutability": "mutable", + "name": "weightA", + "nameLocation": "934:7:34", + "nodeType": "VariableDeclaration", + "scope": 4405, + "src": "926:15:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4371, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "926:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4374, + "mutability": "mutable", + "name": "valueB", + "nameLocation": "959:6:34", + "nodeType": "VariableDeclaration", + "scope": 4405, + "src": "951:14:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4373, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "951:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4376, + "mutability": "mutable", + "name": "weightB", + "nameLocation": "983:7:34", + "nodeType": "VariableDeclaration", + "scope": 4405, + "src": "975:15:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4375, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "975:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "892:104:34" + }, + "returnParameters": { + "id": 4380, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4379, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4405, + "src": "1020:7:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4378, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1020:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1019:9:34" + }, + "scope": 4445, + "src": "858:284:34", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4422, + "nodeType": "Block", + "src": "1392:38:34", + "statements": [ + { + "expression": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4417, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4415, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4408, + "src": "1409:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 4416, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4410, + "src": "1414:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1409:6:34", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 4419, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4410, + "src": "1422:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 4420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "1409:14:34", + "trueExpression": { + "id": 4418, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4408, + "src": "1418:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 4414, + "id": 4421, + "nodeType": "Return", + "src": "1402:21:34" + } + ] + }, + "documentation": { + "id": 4406, + "nodeType": "StructuredDocumentation", + "src": "1148:172:34", + "text": " @dev Returns the minimum of two numbers.\n @param x The first number\n @param y The second number\n @return The minimum of the two numbers" + }, + "id": 4423, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "min", + "nameLocation": "1334:3:34", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4411, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4408, + "mutability": "mutable", + "name": "x", + "nameLocation": "1346:1:34", + "nodeType": "VariableDeclaration", + "scope": 4423, + "src": "1338:9:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4407, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1338:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4410, + "mutability": "mutable", + "name": "y", + "nameLocation": "1357:1:34", + "nodeType": "VariableDeclaration", + "scope": 4423, + "src": "1349:9:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4409, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1349:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1337:22:34" + }, + "returnParameters": { + "id": 4414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4413, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4423, + "src": "1383:7:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4412, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1383:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1382:9:34" + }, + "scope": 4445, + "src": "1325:105:34", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4443, + "nodeType": "Block", + "src": "1743:43:34", + "statements": [ + { + "expression": { + "condition": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4435, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4433, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4426, + "src": "1761:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 4434, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4428, + "src": "1765:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1761:5:34", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 4436, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1760:7:34", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "30", + "id": 4440, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1778:1:34", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 4441, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "1760:19:34", + "trueExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4439, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4437, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4426, + "src": "1770:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 4438, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4428, + "src": "1774:1:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1770:5:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 4432, + "id": 4442, + "nodeType": "Return", + "src": "1753:26:34" + } + ] + }, + "documentation": { + "id": 4424, + "nodeType": "StructuredDocumentation", + "src": "1436:228:34", + "text": " @dev Returns the difference between two numbers or zero if negative.\n @param x The first number\n @param y The second number\n @return The difference between the two numbers or zero if negative" + }, + "id": 4444, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "diffOrZero", + "nameLocation": "1678:10:34", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4429, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4426, + "mutability": "mutable", + "name": "x", + "nameLocation": "1697:1:34", + "nodeType": "VariableDeclaration", + "scope": 4444, + "src": "1689:9:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4425, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1689:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4428, + "mutability": "mutable", + "name": "y", + "nameLocation": "1708:1:34", + "nodeType": "VariableDeclaration", + "scope": 4444, + "src": "1700:9:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4427, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1700:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1688:22:34" + }, + "returnParameters": { + "id": 4432, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4431, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4444, + "src": "1734:7:34", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4430, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1734:7:34", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1733:9:34" + }, + "scope": 4445, + "src": "1669:117:34", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 4446, + "src": "311:1477:34", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:1743:34" + }, + "id": 34 + }, + "@graphprotocol/horizon/contracts/libraries/PPMMath.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "exportedSymbols": { + "PPMMath": [4539] + }, + "id": 4540, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 4447, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:35" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "PPMMath", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 4448, + "nodeType": "StructuredDocumentation", + "src": "70:258:35", + "text": " @title PPMMath library\n @notice A library for handling calculations with parts per million (PPM) amounts.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 4539, + "linearizedBaseContracts": [4539], + "name": "PPMMath", + "nameLocation": "337:7:35", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "documentation": { + "id": 4449, + "nodeType": "StructuredDocumentation", + "src": "351:60:35", + "text": "@notice Maximum value (100%) in parts per million (PPM)." + }, + "id": 4452, + "mutability": "constant", + "name": "MAX_PPM", + "nameLocation": "442:7:35", + "nodeType": "VariableDeclaration", + "scope": 4539, + "src": "416:45:35", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4450, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "416:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "315f3030305f303030", + "id": 4451, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "452:9:35", + "typeDescriptions": { + "typeIdentifier": "t_rational_1000000_by_1", + "typeString": "int_const 1000000" + }, + "value": "1_000_000" + }, + "visibility": "internal" + }, + { + "documentation": { + "id": 4453, + "nodeType": "StructuredDocumentation", + "src": "468:133:35", + "text": " @notice Thrown when a value is expected to be in PPM but is not.\n @param value The value that is not in PPM." + }, + "errorSelector": "3dc311df", + "id": 4457, + "name": "PPMMathInvalidPPM", + "nameLocation": "612:17:35", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4456, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4455, + "mutability": "mutable", + "name": "value", + "nameLocation": "638:5:35", + "nodeType": "VariableDeclaration", + "scope": 4457, + "src": "630:13:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4454, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "630:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "629:15:35" + }, + "src": "606:39:35" + }, + { + "documentation": { + "id": 4458, + "nodeType": "StructuredDocumentation", + "src": "651:189:35", + "text": " @notice Thrown when no value in a multiplication is in PPM.\n @param a The first value in the multiplication.\n @param b The second value in the multiplication." + }, + "errorSelector": "ed17e1d6", + "id": 4464, + "name": "PPMMathInvalidMulPPM", + "nameLocation": "851:20:35", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4463, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4460, + "mutability": "mutable", + "name": "a", + "nameLocation": "880:1:35", + "nodeType": "VariableDeclaration", + "scope": 4464, + "src": "872:9:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4459, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "872:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4462, + "mutability": "mutable", + "name": "b", + "nameLocation": "891:1:35", + "nodeType": "VariableDeclaration", + "scope": 4464, + "src": "883:9:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4461, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "883:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "871:22:35" + }, + "src": "845:49:35" + }, + { + "body": { + "id": 4495, + "nodeType": "Block", + "src": "1169:118:35", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 4481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 4476, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4467, + "src": "1198:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 4475, + "name": "isValidPPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4538, + "src": "1187:10:35", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_bool_$", + "typeString": "function (uint256) pure returns (bool)" + } + }, + "id": 4477, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1187:13:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "arguments": [ + { + "id": 4479, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4469, + "src": "1215:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 4478, + "name": "isValidPPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4538, + "src": "1204:10:35", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_bool_$", + "typeString": "function (uint256) pure returns (bool)" + } + }, + "id": 4480, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1204:13:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1187:30:35", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 4483, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4467, + "src": "1240:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 4484, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4469, + "src": "1243:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 4482, + "name": "PPMMathInvalidMulPPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4464, + "src": "1219:20:35", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 4485, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1219:26:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4474, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "1179:7:35", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4486, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1179:67:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4487, + "nodeType": "ExpressionStatement", + "src": "1179:67:35" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4493, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4490, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4488, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4467, + "src": "1264:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 4489, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4469, + "src": "1268:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1264:5:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 4491, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1263:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 4492, + "name": "MAX_PPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4452, + "src": "1273:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1263:17:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 4473, + "id": 4494, + "nodeType": "Return", + "src": "1256:24:35" + } + ] + }, + "documentation": { + "id": 4465, + "nodeType": "StructuredDocumentation", + "src": "900:194:35", + "text": " @notice Multiplies two values, one of which must be in PPM.\n @param a The first value.\n @param b The second value.\n @return The result of the multiplication." + }, + "id": 4496, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mulPPM", + "nameLocation": "1108:6:35", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4470, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4467, + "mutability": "mutable", + "name": "a", + "nameLocation": "1123:1:35", + "nodeType": "VariableDeclaration", + "scope": 4496, + "src": "1115:9:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4466, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1115:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4469, + "mutability": "mutable", + "name": "b", + "nameLocation": "1134:1:35", + "nodeType": "VariableDeclaration", + "scope": 4496, + "src": "1126:9:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4468, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1126:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1114:22:35" + }, + "returnParameters": { + "id": 4473, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4472, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4496, + "src": "1160:7:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4471, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1160:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1159:9:35" + }, + "scope": 4539, + "src": "1099:188:35", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4524, + "nodeType": "Block", + "src": "1665:104:35", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 4508, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4501, + "src": "1694:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 4507, + "name": "isValidPPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4538, + "src": "1683:10:35", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_bool_$", + "typeString": "function (uint256) pure returns (bool)" + } + }, + "id": 4509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1683:13:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 4511, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4501, + "src": "1716:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 4510, + "name": "PPMMathInvalidPPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4457, + "src": "1698:17:35", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256) pure returns (error)" + } + }, + "id": 4512, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1698:20:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4506, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "1675:7:35", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4513, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1675:44:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4514, + "nodeType": "ExpressionStatement", + "src": "1675:44:35" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4522, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4515, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4499, + "src": "1736:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "arguments": [ + { + "id": 4517, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4499, + "src": "1747:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4520, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4518, + "name": "MAX_PPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4452, + "src": "1750:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 4519, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4501, + "src": "1760:1:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1750:11:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 4516, + "name": "mulPPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4496, + "src": "1740:6:35", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 4521, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1740:22:35", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1736:26:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 4505, + "id": 4523, + "nodeType": "Return", + "src": "1729:33:35" + } + ] + }, + "documentation": { + "id": 4497, + "nodeType": "StructuredDocumentation", + "src": "1293:290:35", + "text": " @notice Multiplies two values, the second one must be in PPM, and rounds up the result.\n @dev requirements:\n - The second value must be in PPM.\n @param a The first value.\n @param b The second value.\n @return The result of the multiplication." + }, + "id": 4525, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mulPPMRoundUp", + "nameLocation": "1597:13:35", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4502, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4499, + "mutability": "mutable", + "name": "a", + "nameLocation": "1619:1:35", + "nodeType": "VariableDeclaration", + "scope": 4525, + "src": "1611:9:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4498, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1611:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4501, + "mutability": "mutable", + "name": "b", + "nameLocation": "1630:1:35", + "nodeType": "VariableDeclaration", + "scope": 4525, + "src": "1622:9:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4500, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1622:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1610:22:35" + }, + "returnParameters": { + "id": 4505, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4504, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4525, + "src": "1656:7:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4503, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1656:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1655:9:35" + }, + "scope": 4539, + "src": "1588:181:35", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4537, + "nodeType": "Block", + "src": "2056:40:35", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4533, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4528, + "src": "2073:5:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 4534, + "name": "MAX_PPM", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4452, + "src": "2082:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2073:16:35", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 4532, + "id": 4536, + "nodeType": "Return", + "src": "2066:23:35" + } + ] + }, + "documentation": { + "id": 4526, + "nodeType": "StructuredDocumentation", + "src": "1775:212:35", + "text": " @notice Checks if a value is in PPM.\n @dev A valid PPM value is between 0 and MAX_PPM.\n @param value The value to check.\n @return true if the value is in PPM, false otherwise." + }, + "id": 4538, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isValidPPM", + "nameLocation": "2001:10:35", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4529, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4528, + "mutability": "mutable", + "name": "value", + "nameLocation": "2020:5:35", + "nodeType": "VariableDeclaration", + "scope": 4538, + "src": "2012:13:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4527, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2012:7:35", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2011:15:35" + }, + "returnParameters": { + "id": 4532, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4531, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4538, + "src": "2050:4:35", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 4530, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2050:4:35", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2049:6:35" + }, + "scope": 4539, + "src": "1992:104:35", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 4540, + "src": "329:1769:35", + "usedErrors": [4457, 4464], + "usedEvents": [] + } + ], + "src": "45:2054:35" + }, + "id": 35 + }, + "@graphprotocol/horizon/contracts/libraries/UintRange.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/UintRange.sol", + "exportedSymbols": { + "UintRange": [4564] + }, + "id": 4565, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 4541, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:36" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "UintRange", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 4542, + "nodeType": "StructuredDocumentation", + "src": "70:241:36", + "text": " @title UintRange library\n @notice A library for handling range checks on uint256 values.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 4564, + "linearizedBaseContracts": [4564], + "name": "UintRange", + "nameLocation": "320:9:36", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 4562, + "nodeType": "Block", + "src": "713:52:36", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 4560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4556, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4554, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4545, + "src": "730:5:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 4555, + "name": "min", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4547, + "src": "739:3:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "730:12:36", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 4559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4557, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4545, + "src": "746:5:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 4558, + "name": "max", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4549, + "src": "755:3:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "746:12:36", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "730:28:36", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 4553, + "id": 4561, + "nodeType": "Return", + "src": "723:35:36" + } + ] + }, + "documentation": { + "id": 4543, + "nodeType": "StructuredDocumentation", + "src": "336:283:36", + "text": " @notice Checks if a value is in the range [`min`, `max`].\n @param value The value to check.\n @param min The minimum value of the range.\n @param max The maximum value of the range.\n @return true if the value is in the range, false otherwise." + }, + "id": 4563, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isInRange", + "nameLocation": "633:9:36", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4550, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4545, + "mutability": "mutable", + "name": "value", + "nameLocation": "651:5:36", + "nodeType": "VariableDeclaration", + "scope": 4563, + "src": "643:13:36", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4544, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "643:7:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4547, + "mutability": "mutable", + "name": "min", + "nameLocation": "666:3:36", + "nodeType": "VariableDeclaration", + "scope": 4563, + "src": "658:11:36", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4546, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "658:7:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4549, + "mutability": "mutable", + "name": "max", + "nameLocation": "679:3:36", + "nodeType": "VariableDeclaration", + "scope": 4563, + "src": "671:11:36", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4548, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "671:7:36", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "642:41:36" + }, + "returnParameters": { + "id": 4553, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4552, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4563, + "src": "707:4:36", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 4551, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "707:4:36", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "706:6:36" + }, + "scope": 4564, + "src": "624:141:36", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 4565, + "src": "312:455:36", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:723:36" + }, + "id": 36 + }, + "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol": { + "ast": { + "absolutePath": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "exportedSymbols": { + "GraphDirectory": [4928], + "IController": [441], + "ICuration": [165], + "IEpochManager": [369], + "IGraphPayments": [2489], + "IGraphProxyAdmin": [2493], + "IGraphToken": [758], + "IHorizonStaking": [2625], + "IPaymentsEscrow": [2858], + "IRewardsManager": [678], + "ITokenGateway": [41] + }, + "id": 4929, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 4566, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:37" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "file": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "id": 4568, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 759, + "src": "71:87:37", + "symbolAliases": [ + { + "foreign": { + "id": 4567, + "name": "IGraphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 758, + "src": "80:11:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "file": "../interfaces/IHorizonStaking.sol", + "id": 4570, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 2626, + "src": "159:68:37", + "symbolAliases": [ + { + "foreign": { + "id": 4569, + "name": "IHorizonStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2625, + "src": "168:15:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "../interfaces/IGraphPayments.sol", + "id": 4572, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 2490, + "src": "228:66:37", + "symbolAliases": [ + { + "foreign": { + "id": 4571, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "237:14:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol", + "file": "../interfaces/IPaymentsEscrow.sol", + "id": 4574, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 2859, + "src": "295:68:37", + "symbolAliases": [ + { + "foreign": { + "id": 4573, + "name": "IPaymentsEscrow", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2858, + "src": "304:15:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/governance/IController.sol", + "file": "@graphprotocol/contracts/contracts/governance/IController.sol", + "id": 4576, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 442, + "src": "365:92:37", + "symbolAliases": [ + { + "foreign": { + "id": 4575, + "name": "IController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 441, + "src": "374:11:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol", + "file": "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol", + "id": 4578, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 370, + "src": "458:92:37", + "symbolAliases": [ + { + "foreign": { + "id": 4577, + "name": "IEpochManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 369, + "src": "467:13:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol", + "file": "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol", + "id": 4580, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 679, + "src": "551:97:37", + "symbolAliases": [ + { + "foreign": { + "id": 4579, + "name": "IRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 678, + "src": "560:15:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol", + "file": "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol", + "id": 4582, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 42, + "src": "649:94:37", + "symbolAliases": [ + { + "foreign": { + "id": 4581, + "name": "ITokenGateway", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 41, + "src": "658:13:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol", + "file": "../interfaces/IGraphProxyAdmin.sol", + "id": 4584, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 2494, + "src": "744:70:37", + "symbolAliases": [ + { + "foreign": { + "id": 4583, + "name": "IGraphProxyAdmin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2493, + "src": "753:16:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/curation/ICuration.sol", + "file": "@graphprotocol/contracts/contracts/curation/ICuration.sol", + "id": 4586, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 4929, + "sourceUnit": 166, + "src": "816:86:37", + "symbolAliases": [ + { + "foreign": { + "id": 4585, + "name": "ICuration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 165, + "src": "825:9:37", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "GraphDirectory", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 4587, + "nodeType": "StructuredDocumentation", + "src": "904:315:37", + "text": " @title GraphDirectory contract\n @notice This contract is meant to be inherited by other contracts that\n need to keep track of the addresses in Graph Horizon contracts.\n It fetches the addresses from the Controller supplied during construction,\n and uses immutable variables to minimize gas costs." + }, + "fullyImplemented": true, + "id": 4928, + "linearizedBaseContracts": [4928], + "name": "GraphDirectory", + "nameLocation": "1238:14:37", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 4588, + "nodeType": "StructuredDocumentation", + "src": "1297:44:37", + "text": "@notice The Graph Token contract address" + }, + "id": 4591, + "mutability": "immutable", + "name": "GRAPH_TOKEN", + "nameLocation": "1376:11:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "1346:41:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + }, + "typeName": { + "id": 4590, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4589, + "name": "IGraphToken", + "nameLocations": ["1346:11:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "1346:11:37" + }, + "referencedDeclaration": 758, + "src": "1346:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4592, + "nodeType": "StructuredDocumentation", + "src": "1394:48:37", + "text": "@notice The Horizon Staking contract address" + }, + "id": 4595, + "mutability": "immutable", + "name": "GRAPH_STAKING", + "nameLocation": "1481:13:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "1447:47:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + "typeName": { + "id": 4594, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4593, + "name": "IHorizonStaking", + "nameLocations": ["1447:15:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2625, + "src": "1447:15:37" + }, + "referencedDeclaration": 2625, + "src": "1447:15:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4596, + "nodeType": "StructuredDocumentation", + "src": "1501:47:37", + "text": "@notice The Graph Payments contract address" + }, + "id": 4599, + "mutability": "immutable", + "name": "GRAPH_PAYMENTS", + "nameLocation": "1586:14:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "1553:47:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + }, + "typeName": { + "id": 4598, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4597, + "name": "IGraphPayments", + "nameLocations": ["1553:14:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2489, + "src": "1553:14:37" + }, + "referencedDeclaration": 2489, + "src": "1553:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4600, + "nodeType": "StructuredDocumentation", + "src": "1607:48:37", + "text": "@notice The Payments Escrow contract address" + }, + "id": 4603, + "mutability": "immutable", + "name": "GRAPH_PAYMENTS_ESCROW", + "nameLocation": "1694:21:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "1660:55:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + }, + "typeName": { + "id": 4602, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4601, + "name": "IPaymentsEscrow", + "nameLocations": ["1660:15:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2858, + "src": "1660:15:37" + }, + "referencedDeclaration": 2858, + "src": "1660:15:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4604, + "nodeType": "StructuredDocumentation", + "src": "1762:49:37", + "text": "@notice The Graph Controller contract address" + }, + "id": 4607, + "mutability": "immutable", + "name": "GRAPH_CONTROLLER", + "nameLocation": "1846:16:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "1816:46:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + }, + "typeName": { + "id": 4606, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4605, + "name": "IController", + "nameLocations": ["1816:11:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 441, + "src": "1816:11:37" + }, + "referencedDeclaration": 441, + "src": "1816:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4608, + "nodeType": "StructuredDocumentation", + "src": "1869:46:37", + "text": "@notice The Epoch Manager contract address" + }, + "id": 4611, + "mutability": "immutable", + "name": "GRAPH_EPOCH_MANAGER", + "nameLocation": "1952:19:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "1920:51:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + }, + "typeName": { + "id": 4610, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4609, + "name": "IEpochManager", + "nameLocations": ["1920:13:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 369, + "src": "1920:13:37" + }, + "referencedDeclaration": 369, + "src": "1920:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4612, + "nodeType": "StructuredDocumentation", + "src": "1978:48:37", + "text": "@notice The Rewards Manager contract address" + }, + "id": 4615, + "mutability": "immutable", + "name": "GRAPH_REWARDS_MANAGER", + "nameLocation": "2065:21:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "2031:55:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + }, + "typeName": { + "id": 4614, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4613, + "name": "IRewardsManager", + "nameLocations": ["2031:15:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 678, + "src": "2031:15:37" + }, + "referencedDeclaration": 678, + "src": "2031:15:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4616, + "nodeType": "StructuredDocumentation", + "src": "2093:46:37", + "text": "@notice The Token Gateway contract address" + }, + "id": 4619, + "mutability": "immutable", + "name": "GRAPH_TOKEN_GATEWAY", + "nameLocation": "2176:19:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "2144:51:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + }, + "typeName": { + "id": 4618, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4617, + "name": "ITokenGateway", + "nameLocations": ["2144:13:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 41, + "src": "2144:13:37" + }, + "referencedDeclaration": 41, + "src": "2144:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4620, + "nodeType": "StructuredDocumentation", + "src": "2202:50:37", + "text": "@notice The Graph Proxy Admin contract address" + }, + "id": 4623, + "mutability": "immutable", + "name": "GRAPH_PROXY_ADMIN", + "nameLocation": "2292:17:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "2257:52:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + }, + "typeName": { + "id": 4622, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4621, + "name": "IGraphProxyAdmin", + "nameLocations": ["2257:16:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2493, + "src": "2257:16:37" + }, + "referencedDeclaration": 2493, + "src": "2257:16:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 4624, + "nodeType": "StructuredDocumentation", + "src": "2513:41:37", + "text": "@notice The Curation contract address" + }, + "id": 4627, + "mutability": "immutable", + "name": "GRAPH_CURATION", + "nameLocation": "2587:14:37", + "nodeType": "VariableDeclaration", + "scope": 4928, + "src": "2559:42:37", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + }, + "typeName": { + "id": 4626, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4625, + "name": "ICuration", + "nameLocations": ["2559:9:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 165, + "src": "2559:9:37" + }, + "referencedDeclaration": 165, + "src": "2559:9:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": { + "id": 4628, + "nodeType": "StructuredDocumentation", + "src": "2608:722:37", + "text": " @notice Emitted when the GraphDirectory is initialized\n @param graphToken The Graph Token contract address\n @param graphStaking The Horizon Staking contract address\n @param graphPayments The Graph Payments contract address\n @param graphEscrow The Payments Escrow contract address\n @param graphController The Graph Controller contract address\n @param graphEpochManager The Epoch Manager contract address\n @param graphRewardsManager The Rewards Manager contract address\n @param graphTokenGateway The Token Gateway contract address\n @param graphProxyAdmin The Graph Proxy Admin contract address\n @param graphCuration The Curation contract address" + }, + "eventSelector": "ef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43", + "id": 4650, + "name": "GraphDirectoryInitialized", + "nameLocation": "3341:25:37", + "nodeType": "EventDefinition", + "parameters": { + "id": 4649, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4630, + "indexed": true, + "mutability": "mutable", + "name": "graphToken", + "nameLocation": "3392:10:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3376:26:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4629, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3376:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4632, + "indexed": true, + "mutability": "mutable", + "name": "graphStaking", + "nameLocation": "3428:12:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3412:28:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4631, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3412:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4634, + "indexed": false, + "mutability": "mutable", + "name": "graphPayments", + "nameLocation": "3458:13:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3450:21:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4633, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3450:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4636, + "indexed": false, + "mutability": "mutable", + "name": "graphEscrow", + "nameLocation": "3489:11:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3481:19:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4635, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3481:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4638, + "indexed": true, + "mutability": "mutable", + "name": "graphController", + "nameLocation": "3526:15:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3510:31:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4637, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3510:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4640, + "indexed": false, + "mutability": "mutable", + "name": "graphEpochManager", + "nameLocation": "3559:17:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3551:25:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4639, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3551:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4642, + "indexed": false, + "mutability": "mutable", + "name": "graphRewardsManager", + "nameLocation": "3594:19:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3586:27:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4641, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3586:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4644, + "indexed": false, + "mutability": "mutable", + "name": "graphTokenGateway", + "nameLocation": "3631:17:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3623:25:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4643, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3623:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4646, + "indexed": false, + "mutability": "mutable", + "name": "graphProxyAdmin", + "nameLocation": "3666:15:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3658:23:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4645, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3658:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4648, + "indexed": false, + "mutability": "mutable", + "name": "graphCuration", + "nameLocation": "3699:13:37", + "nodeType": "VariableDeclaration", + "scope": 4650, + "src": "3691:21:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4647, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3691:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3366:352:37" + }, + "src": "3335:384:37" + }, + { + "documentation": { + "id": 4651, + "nodeType": "StructuredDocumentation", + "src": "3725:230:37", + "text": " @notice Thrown when either the controller is the zero address or a contract address is not found\n on the controller\n @param contractName The name of the contract that was not found, or the controller" + }, + "errorSelector": "431eb5ba", + "id": 4655, + "name": "GraphDirectoryInvalidZeroAddress", + "nameLocation": "3966:32:37", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4654, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4653, + "mutability": "mutable", + "name": "contractName", + "nameLocation": "4005:12:37", + "nodeType": "VariableDeclaration", + "scope": 4655, + "src": "3999:18:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4652, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3999:5:37", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3998:20:37" + }, + "src": "3960:59:37" + }, + { + "body": { + "id": 4794, + "nodeType": "Block", + "src": "4337:1382:37", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 4667, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4662, + "name": "controller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4658, + "src": "4355:10:37", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 4665, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4377:1:37", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4664, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4369:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4663, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4369:7:37", + "typeDescriptions": {} + } + }, + "id": 4666, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4369:10:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "4355:24:37", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "hexValue": "436f6e74726f6c6c6572", + "id": 4669, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4414:12:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a", + "typeString": "literal_string \"Controller\"" + }, + "value": "Controller" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a", + "typeString": "literal_string \"Controller\"" + } + ], + "id": 4668, + "name": "GraphDirectoryInvalidZeroAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4655, + "src": "4381:32:37", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$returns$_t_error_$", + "typeString": "function (bytes memory) pure returns (error)" + } + }, + "id": 4670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4381:46:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4661, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "4347:7:37", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4671, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4347:81:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4672, + "nodeType": "ExpressionStatement", + "src": "4347:81:37" + }, + { + "expression": { + "id": 4677, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4673, + "name": "GRAPH_CONTROLLER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4607, + "src": "4439:16:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 4675, + "name": "controller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4658, + "src": "4470:10:37", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4674, + "name": "IController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 441, + "src": "4458:11:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IController_$441_$", + "typeString": "type(contract IController)" + } + }, + "id": 4676, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4458:23:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "src": "4439:42:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "id": 4678, + "nodeType": "ExpressionStatement", + "src": "4439:42:37" + }, + { + "expression": { + "id": 4685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4679, + "name": "GRAPH_TOKEN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4591, + "src": "4491:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "4772617068546f6b656e", + "id": 4682, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4544:12:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247", + "typeString": "literal_string \"GraphToken\"" + }, + "value": "GraphToken" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247", + "typeString": "literal_string \"GraphToken\"" + } + ], + "id": 4681, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "4517:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4683, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4517:40:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4680, + "name": "IGraphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 758, + "src": "4505:11:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphToken_$758_$", + "typeString": "type(contract IGraphToken)" + } + }, + "id": 4684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4505:53:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "src": "4491:67:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 4686, + "nodeType": "ExpressionStatement", + "src": "4491:67:37" + }, + { + "expression": { + "id": 4693, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4687, + "name": "GRAPH_STAKING", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4595, + "src": "4568:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "5374616b696e67", + "id": 4690, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4627:9:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034", + "typeString": "literal_string \"Staking\"" + }, + "value": "Staking" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034", + "typeString": "literal_string \"Staking\"" + } + ], + "id": 4689, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "4600:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4691, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4600:37:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4688, + "name": "IHorizonStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2625, + "src": "4584:15:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "type(contract IHorizonStaking)" + } + }, + "id": 4692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4584:54:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "src": "4568:70:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 4694, + "nodeType": "ExpressionStatement", + "src": "4568:70:37" + }, + { + "expression": { + "id": 4701, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4695, + "name": "GRAPH_PAYMENTS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4599, + "src": "4648:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "47726170685061796d656e7473", + "id": 4698, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4707:15:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_88cae14a9889b95b4cfd9472fc7dcbca2da791846a1e314bac9c1f8a234cbf9f", + "typeString": "literal_string \"GraphPayments\"" + }, + "value": "GraphPayments" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_88cae14a9889b95b4cfd9472fc7dcbca2da791846a1e314bac9c1f8a234cbf9f", + "typeString": "literal_string \"GraphPayments\"" + } + ], + "id": 4697, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "4680:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4699, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4680:43:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4696, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "4665:14:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphPayments_$2489_$", + "typeString": "type(contract IGraphPayments)" + } + }, + "id": 4700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4665:59:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + }, + "src": "4648:76:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + }, + "id": 4702, + "nodeType": "ExpressionStatement", + "src": "4648:76:37" + }, + { + "expression": { + "id": 4709, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4703, + "name": "GRAPH_PAYMENTS_ESCROW", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4603, + "src": "4734:21:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "5061796d656e7473457363726f77", + "id": 4706, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4801:16:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_628f67391f8b955553cabfadbf5f1b6a31d2a2d0fea175f5594af9d40b0bedc9", + "typeString": "literal_string \"PaymentsEscrow\"" + }, + "value": "PaymentsEscrow" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_628f67391f8b955553cabfadbf5f1b6a31d2a2d0fea175f5594af9d40b0bedc9", + "typeString": "literal_string \"PaymentsEscrow\"" + } + ], + "id": 4705, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "4774:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4774:44:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4704, + "name": "IPaymentsEscrow", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2858, + "src": "4758:15:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IPaymentsEscrow_$2858_$", + "typeString": "type(contract IPaymentsEscrow)" + } + }, + "id": 4708, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4758:61:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + }, + "src": "4734:85:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + }, + "id": 4710, + "nodeType": "ExpressionStatement", + "src": "4734:85:37" + }, + { + "expression": { + "id": 4717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4711, + "name": "GRAPH_EPOCH_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4611, + "src": "4829:19:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "45706f63684d616e61676572", + "id": 4714, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4892:14:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f67063", + "typeString": "literal_string \"EpochManager\"" + }, + "value": "EpochManager" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f67063", + "typeString": "literal_string \"EpochManager\"" + } + ], + "id": 4713, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "4865:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4715, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4865:42:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4712, + "name": "IEpochManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 369, + "src": "4851:13:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IEpochManager_$369_$", + "typeString": "type(contract IEpochManager)" + } + }, + "id": 4716, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4851:57:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "src": "4829:79:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "id": 4718, + "nodeType": "ExpressionStatement", + "src": "4829:79:37" + }, + { + "expression": { + "id": 4725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4719, + "name": "GRAPH_REWARDS_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4615, + "src": "4918:21:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "526577617264734d616e61676572", + "id": 4722, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4985:16:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c53180761", + "typeString": "literal_string \"RewardsManager\"" + }, + "value": "RewardsManager" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c53180761", + "typeString": "literal_string \"RewardsManager\"" + } + ], + "id": 4721, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "4958:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4958:44:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4720, + "name": "IRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 678, + "src": "4942:15:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IRewardsManager_$678_$", + "typeString": "type(contract IRewardsManager)" + } + }, + "id": 4724, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4942:61:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "src": "4918:85:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 4726, + "nodeType": "ExpressionStatement", + "src": "4918:85:37" + }, + { + "expression": { + "id": 4733, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4727, + "name": "GRAPH_TOKEN_GATEWAY", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4619, + "src": "5013:19:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "4772617068546f6b656e47617465776179", + "id": 4730, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5076:19:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_d362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0", + "typeString": "literal_string \"GraphTokenGateway\"" + }, + "value": "GraphTokenGateway" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_d362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0", + "typeString": "literal_string \"GraphTokenGateway\"" + } + ], + "id": 4729, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "5049:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4731, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5049:47:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4728, + "name": "ITokenGateway", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 41, + "src": "5035:13:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ITokenGateway_$41_$", + "typeString": "type(contract ITokenGateway)" + } + }, + "id": 4732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5035:62:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + }, + "src": "5013:84:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + }, + "id": 4734, + "nodeType": "ExpressionStatement", + "src": "5013:84:37" + }, + { + "expression": { + "id": 4741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4735, + "name": "GRAPH_PROXY_ADMIN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4623, + "src": "5107:17:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "477261706850726f787941646d696e", + "id": 4738, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5171:17:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_ed734418922426bf2cc8783754bd80fc4d441a4dbe994549aee8a2f03136fcdb", + "typeString": "literal_string \"GraphProxyAdmin\"" + }, + "value": "GraphProxyAdmin" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_ed734418922426bf2cc8783754bd80fc4d441a4dbe994549aee8a2f03136fcdb", + "typeString": "literal_string \"GraphProxyAdmin\"" + } + ], + "id": 4737, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "5144:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5144:45:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4736, + "name": "IGraphProxyAdmin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2493, + "src": "5127:16:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphProxyAdmin_$2493_$", + "typeString": "type(contract IGraphProxyAdmin)" + } + }, + "id": 4740, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5127:63:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + }, + "src": "5107:83:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + }, + "id": 4742, + "nodeType": "ExpressionStatement", + "src": "5107:83:37" + }, + { + "expression": { + "id": 4749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 4743, + "name": "GRAPH_CURATION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4627, + "src": "5200:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "4375726174696f6e", + "id": 4746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5254:10:37", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_e6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f", + "typeString": "literal_string \"Curation\"" + }, + "value": "Curation" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_e6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f", + "typeString": "literal_string \"Curation\"" + } + ], + "id": 4745, + "name": "_getContractFromController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4927, + "src": "5227:26:37", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes memory) view returns (address)" + } + }, + "id": 4747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5227:38:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4744, + "name": "ICuration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 165, + "src": "5217:9:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ICuration_$165_$", + "typeString": "type(contract ICuration)" + } + }, + "id": 4748, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5217:49:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "src": "5200:66:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "id": 4750, + "nodeType": "ExpressionStatement", + "src": "5200:66:37" + }, + { + "eventCall": { + "arguments": [ + { + "arguments": [ + { + "id": 4754, + "name": "GRAPH_TOKEN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4591, + "src": "5329:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + ], + "id": 4753, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5321:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4752, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5321:7:37", + "typeDescriptions": {} + } + }, + "id": 4755, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5321:20:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4758, + "name": "GRAPH_STAKING", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4595, + "src": "5363:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + ], + "id": 4757, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5355:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4756, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5355:7:37", + "typeDescriptions": {} + } + }, + "id": 4759, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5355:22:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4762, + "name": "GRAPH_PAYMENTS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4599, + "src": "5399:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + ], + "id": 4761, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5391:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4760, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5391:7:37", + "typeDescriptions": {} + } + }, + "id": 4763, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5391:23:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4766, + "name": "GRAPH_PAYMENTS_ESCROW", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4603, + "src": "5436:21:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + ], + "id": 4765, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5428:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4764, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5428:7:37", + "typeDescriptions": {} + } + }, + "id": 4767, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5428:30:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4770, + "name": "GRAPH_CONTROLLER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4607, + "src": "5480:16:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + ], + "id": 4769, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5472:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4768, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5472:7:37", + "typeDescriptions": {} + } + }, + "id": 4771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5472:25:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4774, + "name": "GRAPH_EPOCH_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4611, + "src": "5519:19:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + ], + "id": 4773, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5511:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4772, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5511:7:37", + "typeDescriptions": {} + } + }, + "id": 4775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5511:28:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4778, + "name": "GRAPH_REWARDS_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4615, + "src": "5561:21:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + ], + "id": 4777, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5553:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4776, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5553:7:37", + "typeDescriptions": {} + } + }, + "id": 4779, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5553:30:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4782, + "name": "GRAPH_TOKEN_GATEWAY", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4619, + "src": "5605:19:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + ], + "id": 4781, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5597:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4780, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5597:7:37", + "typeDescriptions": {} + } + }, + "id": 4783, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5597:28:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4786, + "name": "GRAPH_PROXY_ADMIN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4623, + "src": "5647:17:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + ], + "id": 4785, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5639:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4784, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5639:7:37", + "typeDescriptions": {} + } + }, + "id": 4787, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5639:26:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 4790, + "name": "GRAPH_CURATION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4627, + "src": "5687:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + ], + "id": 4789, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5679:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4788, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5679:7:37", + "typeDescriptions": {} + } + }, + "id": 4791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5679:23:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4751, + "name": "GraphDirectoryInitialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4650, + "src": "5282:25:37", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$_t_address_$_t_address_$_t_address_$_t_address_$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address,address,address,address,address,address,address,address,address)" + } + }, + "id": 4792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5282:430:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4793, + "nodeType": "EmitStatement", + "src": "5277:435:37" + } + ] + }, + "documentation": { + "id": 4656, + "nodeType": "StructuredDocumentation", + "src": "4025:275:37", + "text": " @notice Constructor for the GraphDirectory contract\n @dev Requirements:\n - `controller` cannot be zero address\n Emits a {GraphDirectoryInitialized} event\n @param controller The address of the Graph Controller contract." + }, + "id": 4795, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4659, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4658, + "mutability": "mutable", + "name": "controller", + "nameLocation": "4325:10:37", + "nodeType": "VariableDeclaration", + "scope": 4795, + "src": "4317:18:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4657, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4317:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "4316:20:37" + }, + "returnParameters": { + "id": 4660, + "nodeType": "ParameterList", + "parameters": [], + "src": "4337:0:37" + }, + "scope": 4928, + "src": "4305:1414:37", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4804, + "nodeType": "Block", + "src": "5884:35:37", + "statements": [ + { + "expression": { + "id": 4802, + "name": "GRAPH_TOKEN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4591, + "src": "5901:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "functionReturnParameters": 4801, + "id": 4803, + "nodeType": "Return", + "src": "5894:18:37" + } + ] + }, + "documentation": { + "id": 4796, + "nodeType": "StructuredDocumentation", + "src": "5725:95:37", + "text": " @notice Get the Graph Token contract\n @return The Graph Token contract" + }, + "id": 4805, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphToken", + "nameLocation": "5834:11:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4797, + "nodeType": "ParameterList", + "parameters": [], + "src": "5845:2:37" + }, + "returnParameters": { + "id": 4801, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4800, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4805, + "src": "5871:11:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + }, + "typeName": { + "id": 4799, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4798, + "name": "IGraphToken", + "nameLocations": ["5871:11:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "5871:11:37" + }, + "referencedDeclaration": 758, + "src": "5871:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "visibility": "internal" + } + ], + "src": "5870:13:37" + }, + "scope": 4928, + "src": "5825:94:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4814, + "nodeType": "Block", + "src": "6098:37:37", + "statements": [ + { + "expression": { + "id": 4812, + "name": "GRAPH_STAKING", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4595, + "src": "6115:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "functionReturnParameters": 4811, + "id": 4813, + "nodeType": "Return", + "src": "6108:20:37" + } + ] + }, + "documentation": { + "id": 4806, + "nodeType": "StructuredDocumentation", + "src": "5925:103:37", + "text": " @notice Get the Horizon Staking contract\n @return The Horizon Staking contract" + }, + "id": 4815, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphStaking", + "nameLocation": "6042:13:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4807, + "nodeType": "ParameterList", + "parameters": [], + "src": "6055:2:37" + }, + "returnParameters": { + "id": 4811, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4810, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4815, + "src": "6081:15:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + "typeName": { + "id": 4809, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4808, + "name": "IHorizonStaking", + "nameLocations": ["6081:15:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2625, + "src": "6081:15:37" + }, + "referencedDeclaration": 2625, + "src": "6081:15:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "visibility": "internal" + } + ], + "src": "6080:17:37" + }, + "scope": 4928, + "src": "6033:102:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4824, + "nodeType": "Block", + "src": "6312:38:37", + "statements": [ + { + "expression": { + "id": 4822, + "name": "GRAPH_PAYMENTS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4599, + "src": "6329:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + }, + "functionReturnParameters": 4821, + "id": 4823, + "nodeType": "Return", + "src": "6322:21:37" + } + ] + }, + "documentation": { + "id": 4816, + "nodeType": "StructuredDocumentation", + "src": "6141:101:37", + "text": " @notice Get the Graph Payments contract\n @return The Graph Payments contract" + }, + "id": 4825, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphPayments", + "nameLocation": "6256:14:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4817, + "nodeType": "ParameterList", + "parameters": [], + "src": "6270:2:37" + }, + "returnParameters": { + "id": 4821, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4820, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4825, + "src": "6296:14:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + }, + "typeName": { + "id": 4819, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4818, + "name": "IGraphPayments", + "nameLocations": ["6296:14:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2489, + "src": "6296:14:37" + }, + "referencedDeclaration": 2489, + "src": "6296:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphPayments_$2489", + "typeString": "contract IGraphPayments" + } + }, + "visibility": "internal" + } + ], + "src": "6295:16:37" + }, + "scope": 4928, + "src": "6247:103:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4834, + "nodeType": "Block", + "src": "6536:45:37", + "statements": [ + { + "expression": { + "id": 4832, + "name": "GRAPH_PAYMENTS_ESCROW", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4603, + "src": "6553:21:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + }, + "functionReturnParameters": 4831, + "id": 4833, + "nodeType": "Return", + "src": "6546:28:37" + } + ] + }, + "documentation": { + "id": 4826, + "nodeType": "StructuredDocumentation", + "src": "6356:103:37", + "text": " @notice Get the Payments Escrow contract\n @return The Payments Escrow contract" + }, + "id": 4835, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphPaymentsEscrow", + "nameLocation": "6473:20:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4827, + "nodeType": "ParameterList", + "parameters": [], + "src": "6493:2:37" + }, + "returnParameters": { + "id": 4831, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4830, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4835, + "src": "6519:15:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + }, + "typeName": { + "id": 4829, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4828, + "name": "IPaymentsEscrow", + "nameLocations": ["6519:15:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2858, + "src": "6519:15:37" + }, + "referencedDeclaration": 2858, + "src": "6519:15:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IPaymentsEscrow_$2858", + "typeString": "contract IPaymentsEscrow" + } + }, + "visibility": "internal" + } + ], + "src": "6518:17:37" + }, + "scope": 4928, + "src": "6464:117:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4844, + "nodeType": "Block", + "src": "6761:40:37", + "statements": [ + { + "expression": { + "id": 4842, + "name": "GRAPH_CONTROLLER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4607, + "src": "6778:16:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "functionReturnParameters": 4841, + "id": 4843, + "nodeType": "Return", + "src": "6771:23:37" + } + ] + }, + "documentation": { + "id": 4836, + "nodeType": "StructuredDocumentation", + "src": "6587:105:37", + "text": " @notice Get the Graph Controller contract\n @return The Graph Controller contract" + }, + "id": 4845, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphController", + "nameLocation": "6706:16:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4837, + "nodeType": "ParameterList", + "parameters": [], + "src": "6722:2:37" + }, + "returnParameters": { + "id": 4841, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4840, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4845, + "src": "6748:11:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + }, + "typeName": { + "id": 4839, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4838, + "name": "IController", + "nameLocations": ["6748:11:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 441, + "src": "6748:11:37" + }, + "referencedDeclaration": 441, + "src": "6748:11:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "visibility": "internal" + } + ], + "src": "6747:13:37" + }, + "scope": 4928, + "src": "6697:104:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4854, + "nodeType": "Block", + "src": "6979:43:37", + "statements": [ + { + "expression": { + "id": 4852, + "name": "GRAPH_EPOCH_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4611, + "src": "6996:19:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "functionReturnParameters": 4851, + "id": 4853, + "nodeType": "Return", + "src": "6989:26:37" + } + ] + }, + "documentation": { + "id": 4846, + "nodeType": "StructuredDocumentation", + "src": "6807:99:37", + "text": " @notice Get the Epoch Manager contract\n @return The Epoch Manager contract" + }, + "id": 4855, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphEpochManager", + "nameLocation": "6920:18:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4847, + "nodeType": "ParameterList", + "parameters": [], + "src": "6938:2:37" + }, + "returnParameters": { + "id": 4851, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4850, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4855, + "src": "6964:13:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + }, + "typeName": { + "id": 4849, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4848, + "name": "IEpochManager", + "nameLocations": ["6964:13:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 369, + "src": "6964:13:37" + }, + "referencedDeclaration": 369, + "src": "6964:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "visibility": "internal" + } + ], + "src": "6963:15:37" + }, + "scope": 4928, + "src": "6911:111:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4864, + "nodeType": "Block", + "src": "7216:45:37", + "statements": [ + { + "expression": { + "id": 4862, + "name": "GRAPH_REWARDS_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4615, + "src": "7233:21:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "functionReturnParameters": 4861, + "id": 4863, + "nodeType": "Return", + "src": "7226:28:37" + } + ] + }, + "documentation": { + "id": 4856, + "nodeType": "StructuredDocumentation", + "src": "7028:111:37", + "text": " @notice Get the Rewards Manager contract\n @return The Rewards Manager contract address" + }, + "id": 4865, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphRewardsManager", + "nameLocation": "7153:20:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4857, + "nodeType": "ParameterList", + "parameters": [], + "src": "7173:2:37" + }, + "returnParameters": { + "id": 4861, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4860, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4865, + "src": "7199:15:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + }, + "typeName": { + "id": 4859, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4858, + "name": "IRewardsManager", + "nameLocations": ["7199:15:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 678, + "src": "7199:15:37" + }, + "referencedDeclaration": 678, + "src": "7199:15:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "visibility": "internal" + } + ], + "src": "7198:17:37" + }, + "scope": 4928, + "src": "7144:117:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4874, + "nodeType": "Block", + "src": "7451:43:37", + "statements": [ + { + "expression": { + "id": 4872, + "name": "GRAPH_TOKEN_GATEWAY", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4619, + "src": "7468:19:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + }, + "functionReturnParameters": 4871, + "id": 4873, + "nodeType": "Return", + "src": "7461:26:37" + } + ] + }, + "documentation": { + "id": 4866, + "nodeType": "StructuredDocumentation", + "src": "7267:111:37", + "text": " @notice Get the Graph Token Gateway contract\n @return The Graph Token Gateway contract" + }, + "id": 4875, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphTokenGateway", + "nameLocation": "7392:18:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4867, + "nodeType": "ParameterList", + "parameters": [], + "src": "7410:2:37" + }, + "returnParameters": { + "id": 4871, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4870, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4875, + "src": "7436:13:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + }, + "typeName": { + "id": 4869, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4868, + "name": "ITokenGateway", + "nameLocations": ["7436:13:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 41, + "src": "7436:13:37" + }, + "referencedDeclaration": 41, + "src": "7436:13:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ITokenGateway_$41", + "typeString": "contract ITokenGateway" + } + }, + "visibility": "internal" + } + ], + "src": "7435:15:37" + }, + "scope": 4928, + "src": "7383:111:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4884, + "nodeType": "Block", + "src": "7681:41:37", + "statements": [ + { + "expression": { + "id": 4882, + "name": "GRAPH_PROXY_ADMIN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4623, + "src": "7698:17:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + }, + "functionReturnParameters": 4881, + "id": 4883, + "nodeType": "Return", + "src": "7691:24:37" + } + ] + }, + "documentation": { + "id": 4876, + "nodeType": "StructuredDocumentation", + "src": "7500:107:37", + "text": " @notice Get the Graph Proxy Admin contract\n @return The Graph Proxy Admin contract" + }, + "id": 4885, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphProxyAdmin", + "nameLocation": "7621:16:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4877, + "nodeType": "ParameterList", + "parameters": [], + "src": "7637:2:37" + }, + "returnParameters": { + "id": 4881, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4880, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4885, + "src": "7663:16:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + }, + "typeName": { + "id": 4879, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4878, + "name": "IGraphProxyAdmin", + "nameLocations": ["7663:16:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2493, + "src": "7663:16:37" + }, + "referencedDeclaration": 2493, + "src": "7663:16:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphProxyAdmin_$2493", + "typeString": "contract IGraphProxyAdmin" + } + }, + "visibility": "internal" + } + ], + "src": "7662:18:37" + }, + "scope": 4928, + "src": "7612:110:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4894, + "nodeType": "Block", + "src": "7882:38:37", + "statements": [ + { + "expression": { + "id": 4892, + "name": "GRAPH_CURATION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4627, + "src": "7899:14:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "functionReturnParameters": 4891, + "id": 4893, + "nodeType": "Return", + "src": "7892:21:37" + } + ] + }, + "documentation": { + "id": 4886, + "nodeType": "StructuredDocumentation", + "src": "7728:89:37", + "text": " @notice Get the Curation contract\n @return The Curation contract" + }, + "id": 4895, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphCuration", + "nameLocation": "7831:14:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4887, + "nodeType": "ParameterList", + "parameters": [], + "src": "7845:2:37" + }, + "returnParameters": { + "id": 4891, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4890, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4895, + "src": "7871:9:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + }, + "typeName": { + "id": 4889, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4888, + "name": "ICuration", + "nameLocations": ["7871:9:37"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 165, + "src": "7871:9:37" + }, + "referencedDeclaration": 165, + "src": "7871:9:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "visibility": "internal" + } + ], + "src": "7870:11:37" + }, + "scope": 4928, + "src": "7822:98:37", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 4926, + "nodeType": "Block", + "src": "8312:231:37", + "statements": [ + { + "assignments": [4904], + "declarations": [ + { + "constant": false, + "id": 4904, + "mutability": "mutable", + "name": "contractAddress", + "nameLocation": "8330:15:37", + "nodeType": "VariableDeclaration", + "scope": 4926, + "src": "8322:23:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4903, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8322:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 4911, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 4908, + "name": "_contractName", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4898, + "src": "8392:13:37", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 4907, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "8382:9:37", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 4909, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8382:24:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 4905, + "name": "GRAPH_CONTROLLER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4607, + "src": "8348:16:37", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IController_$441", + "typeString": "contract IController" + } + }, + "id": 4906, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8365:16:37", + "memberName": "getContractProxy", + "nodeType": "MemberAccess", + "referencedDeclaration": 415, + "src": "8348:33:37", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_bytes32_$returns$_t_address_$", + "typeString": "function (bytes32) view external returns (address)" + } + }, + "id": 4910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8348:59:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8322:85:37" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 4918, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4913, + "name": "contractAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4904, + "src": "8425:15:37", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 4916, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8452:1:37", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4915, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8444:7:37", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4914, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8444:7:37", + "typeDescriptions": {} + } + }, + "id": 4917, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8444:10:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "8425:29:37", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 4920, + "name": "_contractName", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4898, + "src": "8489:13:37", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 4919, + "name": "GraphDirectoryInvalidZeroAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4655, + "src": "8456:32:37", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$returns$_t_error_$", + "typeString": "function (bytes memory) pure returns (error)" + } + }, + "id": 4921, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8456:47:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 4912, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "8417:7:37", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 4922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8417:87:37", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4923, + "nodeType": "ExpressionStatement", + "src": "8417:87:37" + }, + { + "expression": { + "id": 4924, + "name": "contractAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4904, + "src": "8521:15:37", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 4902, + "id": 4925, + "nodeType": "Return", + "src": "8514:22:37" + } + ] + }, + "documentation": { + "id": 4896, + "nodeType": "StructuredDocumentation", + "src": "7926:286:37", + "text": " @notice Get a contract address from the controller\n @dev Requirements:\n - The `_contractName` must be registered in the controller\n @param _contractName The name of the contract to fetch from the controller\n @return The address of the contract" + }, + "id": 4927, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getContractFromController", + "nameLocation": "8226:26:37", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4899, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4898, + "mutability": "mutable", + "name": "_contractName", + "nameLocation": "8266:13:37", + "nodeType": "VariableDeclaration", + "scope": 4927, + "src": "8253:26:37", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 4897, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8253:5:37", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "8252:28:37" + }, + "returnParameters": { + "id": 4902, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4901, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 4927, + "src": "8303:7:37", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4900, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8303:7:37", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "8302:9:37" + }, + "scope": 4928, + "src": "8217:326:37", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 4929, + "src": "1220:7325:37", + "usedErrors": [4655], + "usedEvents": [4650] + } + ], + "src": "46:8500:37" + }, + "id": 37 + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", + "exportedSymbols": { + "ContextUpgradeable": [5437], + "Initializable": [5391], + "OwnableUpgradeable": [5123] + }, + "id": 5124, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 4930, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "102:24:38" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol", + "file": "../utils/ContextUpgradeable.sol", + "id": 4932, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5124, + "sourceUnit": 5438, + "src": "128:67:38", + "symbolAliases": [ + { + "foreign": { + "id": 4931, + "name": "ContextUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5437, + "src": "136:18:38", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "../proxy/utils/Initializable.sol", + "id": 4934, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5124, + "sourceUnit": 5392, + "src": "196:63:38", + "symbolAliases": [ + { + "foreign": { + "id": 4933, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "204:13:38", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 4936, + "name": "Initializable", + "nameLocations": ["789:13:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "789:13:38" + }, + "id": 4937, + "nodeType": "InheritanceSpecifier", + "src": "789:13:38" + }, + { + "baseName": { + "id": 4938, + "name": "ContextUpgradeable", + "nameLocations": ["804:18:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5437, + "src": "804:18:38" + }, + "id": 4939, + "nodeType": "InheritanceSpecifier", + "src": "804:18:38" + } + ], + "canonicalName": "OwnableUpgradeable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 4935, + "nodeType": "StructuredDocumentation", + "src": "261:487:38", + "text": " @dev Contract module which provides a basic access control mechanism, where\n there is an account (an owner) that can be granted exclusive access to\n specific functions.\n The initial owner is set to the address provided by the deployer. This can\n later be changed with {transferOwnership}.\n This module is used through inheritance. It will make available the modifier\n `onlyOwner`, which can be applied to your functions to restrict their use to\n the owner." + }, + "fullyImplemented": true, + "id": 5123, + "linearizedBaseContracts": [5123, 5437, 5391], + "name": "OwnableUpgradeable", + "nameLocation": "767:18:38", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "OwnableUpgradeable.OwnableStorage", + "documentation": { + "id": 4940, + "nodeType": "StructuredDocumentation", + "src": "829:65:38", + "text": "@custom:storage-location erc7201:openzeppelin.storage.Ownable" + }, + "id": 4943, + "members": [ + { + "constant": false, + "id": 4942, + "mutability": "mutable", + "name": "_owner", + "nameLocation": "939:6:38", + "nodeType": "VariableDeclaration", + "scope": 4943, + "src": "931:14:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4941, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "931:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "name": "OwnableStorage", + "nameLocation": "906:14:38", + "nodeType": "StructDefinition", + "scope": 5123, + "src": "899:53:38", + "visibility": "public" + }, + { + "constant": true, + "id": 4946, + "mutability": "constant", + "name": "OwnableStorageLocation", + "nameLocation": "1094:22:38", + "nodeType": "VariableDeclaration", + "scope": 5123, + "src": "1069:116:38", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 4944, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1069:7:38", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "hexValue": "307839303136643039643732643430666461653266643863656163366236323334633737303632313466643339633163643165363039613035323863313939333030", + "id": 4945, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1119:66:38", + "typeDescriptions": { + "typeIdentifier": "t_rational_65173360639460082030725920392146925864023520599682862633725751242436743107328_by_1", + "typeString": "int_const 6517...(69 digits omitted)...7328" + }, + "value": "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300" + }, + "visibility": "private" + }, + { + "body": { + "id": 4953, + "nodeType": "Block", + "src": "1270:81:38", + "statements": [ + { + "AST": { + "nativeSrc": "1289:56:38", + "nodeType": "YulBlock", + "src": "1289:56:38", + "statements": [ + { + "nativeSrc": "1303:32:38", + "nodeType": "YulAssignment", + "src": "1303:32:38", + "value": { + "name": "OwnableStorageLocation", + "nativeSrc": "1313:22:38", + "nodeType": "YulIdentifier", + "src": "1313:22:38" + }, + "variableNames": [ + { + "name": "$.slot", + "nativeSrc": "1303:6:38", + "nodeType": "YulIdentifier", + "src": "1303:6:38" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 4950, + "isOffset": false, + "isSlot": true, + "src": "1303:6:38", + "suffix": "slot", + "valueSize": 1 + }, + { + "declaration": 4946, + "isOffset": false, + "isSlot": false, + "src": "1313:22:38", + "valueSize": 1 + } + ], + "id": 4952, + "nodeType": "InlineAssembly", + "src": "1280:65:38" + } + ] + }, + "id": 4954, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getOwnableStorage", + "nameLocation": "1201:18:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4947, + "nodeType": "ParameterList", + "parameters": [], + "src": "1219:2:38" + }, + "returnParameters": { + "id": 4951, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4950, + "mutability": "mutable", + "name": "$", + "nameLocation": "1267:1:38", + "nodeType": "VariableDeclaration", + "scope": 4954, + "src": "1244:24:38", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage" + }, + "typeName": { + "id": 4949, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 4948, + "name": "OwnableStorage", + "nameLocations": ["1244:14:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4943, + "src": "1244:14:38" + }, + "referencedDeclaration": 4943, + "src": "1244:14:38", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage" + } + }, + "visibility": "internal" + } + ], + "src": "1243:26:38" + }, + "scope": 5123, + "src": "1192:159:38", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "documentation": { + "id": 4955, + "nodeType": "StructuredDocumentation", + "src": "1357:85:38", + "text": " @dev The caller account is not authorized to perform an operation." + }, + "errorSelector": "118cdaa7", + "id": 4959, + "name": "OwnableUnauthorizedAccount", + "nameLocation": "1453:26:38", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4958, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4957, + "mutability": "mutable", + "name": "account", + "nameLocation": "1488:7:38", + "nodeType": "VariableDeclaration", + "scope": 4959, + "src": "1480:15:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4956, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1480:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1479:17:38" + }, + "src": "1447:50:38" + }, + { + "documentation": { + "id": 4960, + "nodeType": "StructuredDocumentation", + "src": "1503:82:38", + "text": " @dev The owner is not a valid owner account. (eg. `address(0)`)" + }, + "errorSelector": "1e4fbdf7", + "id": 4964, + "name": "OwnableInvalidOwner", + "nameLocation": "1596:19:38", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 4963, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4962, + "mutability": "mutable", + "name": "owner", + "nameLocation": "1624:5:38", + "nodeType": "VariableDeclaration", + "scope": 4964, + "src": "1616:13:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4961, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1616:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1615:15:38" + }, + "src": "1590:41:38" + }, + { + "anonymous": false, + "eventSelector": "8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "id": 4970, + "name": "OwnershipTransferred", + "nameLocation": "1643:20:38", + "nodeType": "EventDefinition", + "parameters": { + "id": 4969, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4966, + "indexed": true, + "mutability": "mutable", + "name": "previousOwner", + "nameLocation": "1680:13:38", + "nodeType": "VariableDeclaration", + "scope": 4970, + "src": "1664:29:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4965, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1664:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 4968, + "indexed": true, + "mutability": "mutable", + "name": "newOwner", + "nameLocation": "1711:8:38", + "nodeType": "VariableDeclaration", + "scope": 4970, + "src": "1695:24:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4967, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1695:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1663:57:38" + }, + "src": "1637:84:38" + }, + { + "body": { + "id": 4982, + "nodeType": "Block", + "src": "1919:55:38", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 4979, + "name": "initialOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4973, + "src": "1954:12:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4978, + "name": "__Ownable_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5010, + "src": "1929:24:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 4980, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1929:38:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 4981, + "nodeType": "ExpressionStatement", + "src": "1929:38:38" + } + ] + }, + "documentation": { + "id": 4971, + "nodeType": "StructuredDocumentation", + "src": "1727:115:38", + "text": " @dev Initializes the contract setting the address provided by the deployer as the initial owner." + }, + "id": 4983, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 4976, + "kind": "modifierInvocation", + "modifierName": { + "id": 4975, + "name": "onlyInitializing", + "nameLocations": ["1902:16:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "1902:16:38" + }, + "nodeType": "ModifierInvocation", + "src": "1902:16:38" + } + ], + "name": "__Ownable_init", + "nameLocation": "1856:14:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4974, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4973, + "mutability": "mutable", + "name": "initialOwner", + "nameLocation": "1879:12:38", + "nodeType": "VariableDeclaration", + "scope": 4983, + "src": "1871:20:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4972, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1871:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1870:22:38" + }, + "returnParameters": { + "id": 4977, + "nodeType": "ParameterList", + "parameters": [], + "src": "1919:0:38" + }, + "scope": 5123, + "src": "1847:127:38", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5009, + "nodeType": "Block", + "src": "2062:153:38", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 4995, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 4990, + "name": "initialOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4985, + "src": "2076:12:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 4993, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2100:1:38", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4992, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2092:7:38", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4991, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2092:7:38", + "typeDescriptions": {} + } + }, + "id": 4994, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2092:10:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2076:26:38", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5004, + "nodeType": "IfStatement", + "src": "2072:95:38", + "trueBody": { + "id": 5003, + "nodeType": "Block", + "src": "2104:63:38", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "30", + "id": 4999, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2153:1:38", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 4998, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2145:7:38", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 4997, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2145:7:38", + "typeDescriptions": {} + } + }, + "id": 5000, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2145:10:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 4996, + "name": "OwnableInvalidOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4964, + "src": "2125:19:38", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 5001, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2125:31:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5002, + "nodeType": "RevertStatement", + "src": "2118:38:38" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 5006, + "name": "initialOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4985, + "src": "2195:12:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5005, + "name": "_transferOwnership", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5122, + "src": "2176:18:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 5007, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2176:32:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5008, + "nodeType": "ExpressionStatement", + "src": "2176:32:38" + } + ] + }, + "id": 5010, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 4988, + "kind": "modifierInvocation", + "modifierName": { + "id": 4987, + "name": "onlyInitializing", + "nameLocations": ["2045:16:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "2045:16:38" + }, + "nodeType": "ModifierInvocation", + "src": "2045:16:38" + } + ], + "name": "__Ownable_init_unchained", + "nameLocation": "1989:24:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4986, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4985, + "mutability": "mutable", + "name": "initialOwner", + "nameLocation": "2022:12:38", + "nodeType": "VariableDeclaration", + "scope": 5010, + "src": "2014:20:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4984, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2014:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2013:22:38" + }, + "returnParameters": { + "id": 4989, + "nodeType": "ParameterList", + "parameters": [], + "src": "2062:0:38" + }, + "scope": 5123, + "src": "1980:235:38", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5017, + "nodeType": "Block", + "src": "2324:41:38", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5013, + "name": "_checkOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5051, + "src": "2334:11:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$__$", + "typeString": "function () view" + } + }, + "id": 5014, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2334:13:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5015, + "nodeType": "ExpressionStatement", + "src": "2334:13:38" + }, + { + "id": 5016, + "nodeType": "PlaceholderStatement", + "src": "2357:1:38" + } + ] + }, + "documentation": { + "id": 5011, + "nodeType": "StructuredDocumentation", + "src": "2221:77:38", + "text": " @dev Throws if called by any account other than the owner." + }, + "id": 5018, + "name": "onlyOwner", + "nameLocation": "2312:9:38", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 5012, + "nodeType": "ParameterList", + "parameters": [], + "src": "2321:2:38" + }, + "src": "2303:62:38", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5033, + "nodeType": "Block", + "src": "2496:89:38", + "statements": [ + { + "assignments": [5026], + "declarations": [ + { + "constant": false, + "id": 5026, + "mutability": "mutable", + "name": "$", + "nameLocation": "2529:1:38", + "nodeType": "VariableDeclaration", + "scope": 5033, + "src": "2506:24:38", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage" + }, + "typeName": { + "id": 5025, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5024, + "name": "OwnableStorage", + "nameLocations": ["2506:14:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4943, + "src": "2506:14:38" + }, + "referencedDeclaration": 4943, + "src": "2506:14:38", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5029, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5027, + "name": "_getOwnableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4954, + "src": "2533:18:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_OwnableStorage_$4943_storage_ptr_$", + "typeString": "function () pure returns (struct OwnableUpgradeable.OwnableStorage storage pointer)" + } + }, + "id": 5028, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2533:20:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2506:47:38" + }, + { + "expression": { + "expression": { + "id": 5030, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5026, + "src": "2570:1:38", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage storage pointer" + } + }, + "id": 5031, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2572:6:38", + "memberName": "_owner", + "nodeType": "MemberAccess", + "referencedDeclaration": 4942, + "src": "2570:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 5023, + "id": 5032, + "nodeType": "Return", + "src": "2563:15:38" + } + ] + }, + "documentation": { + "id": 5019, + "nodeType": "StructuredDocumentation", + "src": "2371:65:38", + "text": " @dev Returns the address of the current owner." + }, + "functionSelector": "8da5cb5b", + "id": 5034, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "owner", + "nameLocation": "2450:5:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5020, + "nodeType": "ParameterList", + "parameters": [], + "src": "2455:2:38" + }, + "returnParameters": { + "id": 5023, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5022, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5034, + "src": "2487:7:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5021, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2487:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2486:9:38" + }, + "scope": 5123, + "src": "2441:144:38", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 5050, + "nodeType": "Block", + "src": "2703:117:38", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 5042, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5038, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5034, + "src": "2717:5:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 5039, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2717:7:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5040, + "name": "_msgSender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5419, + "src": "2728:10:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 5041, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2728:12:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2717:23:38", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5049, + "nodeType": "IfStatement", + "src": "2713:101:38", + "trueBody": { + "id": 5048, + "nodeType": "Block", + "src": "2742:72:38", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5044, + "name": "_msgSender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5419, + "src": "2790:10:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 5045, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2790:12:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5043, + "name": "OwnableUnauthorizedAccount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4959, + "src": "2763:26:38", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 5046, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2763:40:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5047, + "nodeType": "RevertStatement", + "src": "2756:47:38" + } + ] + } + } + ] + }, + "documentation": { + "id": 5035, + "nodeType": "StructuredDocumentation", + "src": "2591:62:38", + "text": " @dev Throws if the sender is not the owner." + }, + "id": 5051, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkOwner", + "nameLocation": "2667:11:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5036, + "nodeType": "ParameterList", + "parameters": [], + "src": "2678:2:38" + }, + "returnParameters": { + "id": 5037, + "nodeType": "ParameterList", + "parameters": [], + "src": "2703:0:38" + }, + "scope": 5123, + "src": "2658:162:38", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5064, + "nodeType": "Block", + "src": "3209:47:38", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "30", + "id": 5060, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3246:1:38", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 5059, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3238:7:38", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5058, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3238:7:38", + "typeDescriptions": {} + } + }, + "id": 5061, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3238:10:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5057, + "name": "_transferOwnership", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5122, + "src": "3219:18:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 5062, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3219:30:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5063, + "nodeType": "ExpressionStatement", + "src": "3219:30:38" + } + ] + }, + "documentation": { + "id": 5052, + "nodeType": "StructuredDocumentation", + "src": "2826:324:38", + "text": " @dev Leaves the contract without owner. It will not be possible to call\n `onlyOwner` functions. Can only be called by the current owner.\n NOTE: Renouncing ownership will leave the contract without an owner,\n thereby disabling any functionality that is only available to the owner." + }, + "functionSelector": "715018a6", + "id": 5065, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5055, + "kind": "modifierInvocation", + "modifierName": { + "id": 5054, + "name": "onlyOwner", + "nameLocations": ["3199:9:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "3199:9:38" + }, + "nodeType": "ModifierInvocation", + "src": "3199:9:38" + } + ], + "name": "renounceOwnership", + "nameLocation": "3164:17:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5053, + "nodeType": "ParameterList", + "parameters": [], + "src": "3181:2:38" + }, + "returnParameters": { + "id": 5056, + "nodeType": "ParameterList", + "parameters": [], + "src": "3209:0:38" + }, + "scope": 5123, + "src": "3155:101:38", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 5092, + "nodeType": "Block", + "src": "3475:145:38", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 5078, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 5073, + "name": "newOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5068, + "src": "3489:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 5076, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3509:1:38", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 5075, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3501:7:38", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5074, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3501:7:38", + "typeDescriptions": {} + } + }, + "id": 5077, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3501:10:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3489:22:38", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5087, + "nodeType": "IfStatement", + "src": "3485:91:38", + "trueBody": { + "id": 5086, + "nodeType": "Block", + "src": "3513:63:38", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "30", + "id": 5082, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3562:1:38", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 5081, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3554:7:38", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5080, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3554:7:38", + "typeDescriptions": {} + } + }, + "id": 5083, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3554:10:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5079, + "name": "OwnableInvalidOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4964, + "src": "3534:19:38", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 5084, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3534:31:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5085, + "nodeType": "RevertStatement", + "src": "3527:38:38" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 5089, + "name": "newOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5068, + "src": "3604:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5088, + "name": "_transferOwnership", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5122, + "src": "3585:18:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 5090, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3585:28:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5091, + "nodeType": "ExpressionStatement", + "src": "3585:28:38" + } + ] + }, + "documentation": { + "id": 5066, + "nodeType": "StructuredDocumentation", + "src": "3262:138:38", + "text": " @dev Transfers ownership of the contract to a new account (`newOwner`).\n Can only be called by the current owner." + }, + "functionSelector": "f2fde38b", + "id": 5093, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5071, + "kind": "modifierInvocation", + "modifierName": { + "id": 5070, + "name": "onlyOwner", + "nameLocations": ["3465:9:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "3465:9:38" + }, + "nodeType": "ModifierInvocation", + "src": "3465:9:38" + } + ], + "name": "transferOwnership", + "nameLocation": "3414:17:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5069, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5068, + "mutability": "mutable", + "name": "newOwner", + "nameLocation": "3440:8:38", + "nodeType": "VariableDeclaration", + "scope": 5093, + "src": "3432:16:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5067, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3432:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3431:18:38" + }, + "returnParameters": { + "id": 5072, + "nodeType": "ParameterList", + "parameters": [], + "src": "3475:0:38" + }, + "scope": 5123, + "src": "3405:215:38", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 5121, + "nodeType": "Block", + "src": "3837:185:38", + "statements": [ + { + "assignments": [5101], + "declarations": [ + { + "constant": false, + "id": 5101, + "mutability": "mutable", + "name": "$", + "nameLocation": "3870:1:38", + "nodeType": "VariableDeclaration", + "scope": 5121, + "src": "3847:24:38", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage" + }, + "typeName": { + "id": 5100, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5099, + "name": "OwnableStorage", + "nameLocations": ["3847:14:38"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4943, + "src": "3847:14:38" + }, + "referencedDeclaration": 4943, + "src": "3847:14:38", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5104, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5102, + "name": "_getOwnableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4954, + "src": "3874:18:38", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_OwnableStorage_$4943_storage_ptr_$", + "typeString": "function () pure returns (struct OwnableUpgradeable.OwnableStorage storage pointer)" + } + }, + "id": 5103, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3874:20:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3847:47:38" + }, + { + "assignments": [5106], + "declarations": [ + { + "constant": false, + "id": 5106, + "mutability": "mutable", + "name": "oldOwner", + "nameLocation": "3912:8:38", + "nodeType": "VariableDeclaration", + "scope": 5121, + "src": "3904:16:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5105, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3904:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 5109, + "initialValue": { + "expression": { + "id": 5107, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5101, + "src": "3923:1:38", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage storage pointer" + } + }, + "id": 5108, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3925:6:38", + "memberName": "_owner", + "nodeType": "MemberAccess", + "referencedDeclaration": 4942, + "src": "3923:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3904:27:38" + }, + { + "expression": { + "id": 5114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5110, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5101, + "src": "3941:1:38", + "typeDescriptions": { + "typeIdentifier": "t_struct$_OwnableStorage_$4943_storage_ptr", + "typeString": "struct OwnableUpgradeable.OwnableStorage storage pointer" + } + }, + "id": 5112, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3943:6:38", + "memberName": "_owner", + "nodeType": "MemberAccess", + "referencedDeclaration": 4942, + "src": "3941:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 5113, + "name": "newOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5096, + "src": "3952:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3941:19:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 5115, + "nodeType": "ExpressionStatement", + "src": "3941:19:38" + }, + { + "eventCall": { + "arguments": [ + { + "id": 5117, + "name": "oldOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5106, + "src": "3996:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 5118, + "name": "newOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5096, + "src": "4006:8:38", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5116, + "name": "OwnershipTransferred", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4970, + "src": "3975:20:38", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address)" + } + }, + "id": 5119, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3975:40:38", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5120, + "nodeType": "EmitStatement", + "src": "3970:45:38" + } + ] + }, + "documentation": { + "id": 5094, + "nodeType": "StructuredDocumentation", + "src": "3626:143:38", + "text": " @dev Transfers ownership of the contract to a new account (`newOwner`).\n Internal function without access restriction." + }, + "id": 5122, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_transferOwnership", + "nameLocation": "3783:18:38", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5097, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5096, + "mutability": "mutable", + "name": "newOwner", + "nameLocation": "3810:8:38", + "nodeType": "VariableDeclaration", + "scope": 5122, + "src": "3802:16:38", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5095, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3802:7:38", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3801:18:38" + }, + "returnParameters": { + "id": 5098, + "nodeType": "ParameterList", + "parameters": [], + "src": "3837:0:38" + }, + "scope": 5123, + "src": "3774:248:38", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + } + ], + "scope": 5124, + "src": "749:3275:38", + "usedErrors": [4959, 4964, 5140, 5143], + "usedEvents": [4970, 5148] + } + ], + "src": "102:3923:38" + }, + "id": 38 + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "exportedSymbols": { + "Initializable": [5391] + }, + "id": 5392, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 5125, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "113:24:39" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "Initializable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 5126, + "nodeType": "StructuredDocumentation", + "src": "139:2209:39", + "text": " @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n case an upgrade adds a module that needs to be initialized.\n For example:\n [.hljs-theme-light.nopadding]\n ```solidity\n contract MyToken is ERC20Upgradeable {\n function initialize() initializer public {\n __ERC20_init(\"MyToken\", \"MTK\");\n }\n }\n contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n function initializeV2() reinitializer(2) public {\n __ERC20Permit_init(\"MyToken\");\n }\n }\n ```\n TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n [CAUTION]\n ====\n Avoid leaving a contract uninitialized.\n An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n [.hljs-theme-light.nopadding]\n ```\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n ```\n ====" + }, + "fullyImplemented": true, + "id": 5391, + "linearizedBaseContracts": [5391], + "name": "Initializable", + "nameLocation": "2367:13:39", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "Initializable.InitializableStorage", + "documentation": { + "id": 5127, + "nodeType": "StructuredDocumentation", + "src": "2387:293:39", + "text": " @dev Storage of the initializable contract.\n It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n when using with upgradeable contracts.\n @custom:storage-location erc7201:openzeppelin.storage.Initializable" + }, + "id": 5134, + "members": [ + { + "constant": false, + "id": 5130, + "mutability": "mutable", + "name": "_initialized", + "nameLocation": "2820:12:39", + "nodeType": "VariableDeclaration", + "scope": 5134, + "src": "2813:19:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 5129, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2813:6:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5133, + "mutability": "mutable", + "name": "_initializing", + "nameLocation": "2955:13:39", + "nodeType": "VariableDeclaration", + "scope": 5134, + "src": "2950:18:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5132, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2950:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "name": "InitializableStorage", + "nameLocation": "2692:20:39", + "nodeType": "StructDefinition", + "scope": 5391, + "src": "2685:290:39", + "visibility": "public" + }, + { + "constant": true, + "id": 5137, + "mutability": "constant", + "name": "INITIALIZABLE_STORAGE", + "nameLocation": "3123:21:39", + "nodeType": "VariableDeclaration", + "scope": 5391, + "src": "3098:115:39", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5135, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3098:7:39", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "hexValue": "307866306335376531363834306466303430663135303838646332663831666533393163333932336265633733653233613936363265666339633232396336613030", + "id": 5136, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3147:66:39", + "typeDescriptions": { + "typeIdentifier": "t_rational_108904022758810753673719992590105913556127789646572562039383141376366747609600_by_1", + "typeString": "int_const 1089...(70 digits omitted)...9600" + }, + "value": "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00" + }, + "visibility": "private" + }, + { + "documentation": { + "id": 5138, + "nodeType": "StructuredDocumentation", + "src": "3220:60:39", + "text": " @dev The contract is already initialized." + }, + "errorSelector": "f92ee8a9", + "id": 5140, + "name": "InvalidInitialization", + "nameLocation": "3291:21:39", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 5139, + "nodeType": "ParameterList", + "parameters": [], + "src": "3312:2:39" + }, + "src": "3285:30:39" + }, + { + "documentation": { + "id": 5141, + "nodeType": "StructuredDocumentation", + "src": "3321:57:39", + "text": " @dev The contract is not initializing." + }, + "errorSelector": "d7e6bcf8", + "id": 5143, + "name": "NotInitializing", + "nameLocation": "3389:15:39", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 5142, + "nodeType": "ParameterList", + "parameters": [], + "src": "3404:2:39" + }, + "src": "3383:24:39" + }, + { + "anonymous": false, + "documentation": { + "id": 5144, + "nodeType": "StructuredDocumentation", + "src": "3413:90:39", + "text": " @dev Triggered when the contract has been initialized or reinitialized." + }, + "eventSelector": "c7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2", + "id": 5148, + "name": "Initialized", + "nameLocation": "3514:11:39", + "nodeType": "EventDefinition", + "parameters": { + "id": 5147, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5146, + "indexed": false, + "mutability": "mutable", + "name": "version", + "nameLocation": "3533:7:39", + "nodeType": "VariableDeclaration", + "scope": 5148, + "src": "3526:14:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 5145, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "3526:6:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "3525:16:39" + }, + "src": "3508:34:39" + }, + { + "body": { + "id": 5230, + "nodeType": "Block", + "src": "4092:1079:39", + "statements": [ + { + "assignments": [5153], + "declarations": [ + { + "constant": false, + "id": 5153, + "mutability": "mutable", + "name": "$", + "nameLocation": "4187:1:39", + "nodeType": "VariableDeclaration", + "scope": 5230, + "src": "4158:30:39", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + }, + "typeName": { + "id": 5152, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5151, + "name": "InitializableStorage", + "nameLocations": ["4158:20:39"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5134, + "src": "4158:20:39" + }, + "referencedDeclaration": 5134, + "src": "4158:20:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5156, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5154, + "name": "_getInitializableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5390, + "src": "4191:24:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_InitializableStorage_$5134_storage_ptr_$", + "typeString": "function () pure returns (struct Initializable.InitializableStorage storage pointer)" + } + }, + "id": 5155, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4191:26:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4158:59:39" + }, + { + "assignments": [5158], + "declarations": [ + { + "constant": false, + "id": 5158, + "mutability": "mutable", + "name": "isTopLevelCall", + "nameLocation": "4284:14:39", + "nodeType": "VariableDeclaration", + "scope": 5230, + "src": "4279:19:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5157, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4279:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 5162, + "initialValue": { + "id": 5161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4301:16:39", + "subExpression": { + "expression": { + "id": 5159, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5153, + "src": "4302:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5160, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4304:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "4302:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4279:38:39" + }, + { + "assignments": [5164], + "declarations": [ + { + "constant": false, + "id": 5164, + "mutability": "mutable", + "name": "initialized", + "nameLocation": "4334:11:39", + "nodeType": "VariableDeclaration", + "scope": 5230, + "src": "4327:18:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 5163, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "4327:6:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "id": 5167, + "initialValue": { + "expression": { + "id": 5165, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5153, + "src": "4348:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5166, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4350:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "4348:14:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4327:35:39" + }, + { + "assignments": [5169], + "declarations": [ + { + "constant": false, + "id": 5169, + "mutability": "mutable", + "name": "initialSetup", + "nameLocation": "4709:12:39", + "nodeType": "VariableDeclaration", + "scope": 5230, + "src": "4704:17:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5168, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4704:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 5175, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 5174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 5172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 5170, + "name": "initialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5164, + "src": "4724:11:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 5171, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4739:1:39", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4724:16:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "id": 5173, + "name": "isTopLevelCall", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5158, + "src": "4744:14:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4724:34:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4704:54:39" + }, + { + "assignments": [5177], + "declarations": [ + { + "constant": false, + "id": 5177, + "mutability": "mutable", + "name": "construction", + "nameLocation": "4773:12:39", + "nodeType": "VariableDeclaration", + "scope": 5230, + "src": "4768:17:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5176, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4768:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 5190, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 5189, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 5180, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 5178, + "name": "initialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5164, + "src": "4788:11:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "31", + "id": 5179, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4803:1:39", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "4788:16:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 5188, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "expression": { + "arguments": [ + { + "id": 5183, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "4816:4:39", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Initializable_$5391", + "typeString": "contract Initializable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Initializable_$5391", + "typeString": "contract Initializable" + } + ], + "id": 5182, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4808:7:39", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5181, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4808:7:39", + "typeDescriptions": {} + } + }, + "id": 5184, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4808:13:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 5185, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4822:4:39", + "memberName": "code", + "nodeType": "MemberAccess", + "src": "4808:18:39", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 5186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4827:6:39", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4808:25:39", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 5187, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4837:1:39", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4808:30:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4788:50:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4768:70:39" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 5195, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 5192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4853:13:39", + "subExpression": { + "id": 5191, + "name": "initialSetup", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5169, + "src": "4854:12:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "id": 5194, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4870:13:39", + "subExpression": { + "id": 5193, + "name": "construction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5177, + "src": "4871:12:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4853:30:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5200, + "nodeType": "IfStatement", + "src": "4849:91:39", + "trueBody": { + "id": 5199, + "nodeType": "Block", + "src": "4885:55:39", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5196, + "name": "InvalidInitialization", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5140, + "src": "4906:21:39", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 5197, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4906:23:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5198, + "nodeType": "RevertStatement", + "src": "4899:30:39" + } + ] + } + }, + { + "expression": { + "id": 5205, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5201, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5153, + "src": "4949:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5203, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "4951:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "4949:14:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "31", + "id": 5204, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4966:1:39", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "4949:18:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 5206, + "nodeType": "ExpressionStatement", + "src": "4949:18:39" + }, + { + "condition": { + "id": 5207, + "name": "isTopLevelCall", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5158, + "src": "4981:14:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5215, + "nodeType": "IfStatement", + "src": "4977:67:39", + "trueBody": { + "id": 5214, + "nodeType": "Block", + "src": "4997:47:39", + "statements": [ + { + "expression": { + "id": 5212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5208, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5153, + "src": "5011:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5210, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "5013:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "5011:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "74727565", + "id": 5211, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5029:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "5011:22:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5213, + "nodeType": "ExpressionStatement", + "src": "5011:22:39" + } + ] + } + }, + { + "id": 5216, + "nodeType": "PlaceholderStatement", + "src": "5053:1:39" + }, + { + "condition": { + "id": 5217, + "name": "isTopLevelCall", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5158, + "src": "5068:14:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5229, + "nodeType": "IfStatement", + "src": "5064:101:39", + "trueBody": { + "id": 5228, + "nodeType": "Block", + "src": "5084:81:39", + "statements": [ + { + "expression": { + "id": 5222, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5218, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5153, + "src": "5098:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5220, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "5100:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "5098:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "66616c7365", + "id": 5221, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5116:5:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "5098:23:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5223, + "nodeType": "ExpressionStatement", + "src": "5098:23:39" + }, + { + "eventCall": { + "arguments": [ + { + "hexValue": "31", + "id": 5225, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5152:1:39", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + } + ], + "id": 5224, + "name": "Initialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5148, + "src": "5140:11:39", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint64_$returns$__$", + "typeString": "function (uint64)" + } + }, + "id": 5226, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5140:14:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5227, + "nodeType": "EmitStatement", + "src": "5135:19:39" + } + ] + } + } + ] + }, + "documentation": { + "id": 5149, + "nodeType": "StructuredDocumentation", + "src": "3548:516:39", + "text": " @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n `onlyInitializing` functions can be used to initialize parent contracts.\n Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n production.\n Emits an {Initialized} event." + }, + "id": 5231, + "name": "initializer", + "nameLocation": "4078:11:39", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 5150, + "nodeType": "ParameterList", + "parameters": [], + "src": "4089:2:39" + }, + "src": "4069:1102:39", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5277, + "nodeType": "Block", + "src": "6289:392:39", + "statements": [ + { + "assignments": [5238], + "declarations": [ + { + "constant": false, + "id": 5238, + "mutability": "mutable", + "name": "$", + "nameLocation": "6384:1:39", + "nodeType": "VariableDeclaration", + "scope": 5277, + "src": "6355:30:39", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + }, + "typeName": { + "id": 5237, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5236, + "name": "InitializableStorage", + "nameLocations": ["6355:20:39"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5134, + "src": "6355:20:39" + }, + "referencedDeclaration": 5134, + "src": "6355:20:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5241, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5239, + "name": "_getInitializableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5390, + "src": "6388:24:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_InitializableStorage_$5134_storage_ptr_$", + "typeString": "function () pure returns (struct Initializable.InitializableStorage storage pointer)" + } + }, + "id": 5240, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6388:26:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6355:59:39" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 5248, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 5242, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5238, + "src": "6429:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5243, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6431:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "6429:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 5247, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 5244, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5238, + "src": "6448:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5245, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6450:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "6448:14:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 5246, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5234, + "src": "6466:7:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "6448:25:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "6429:44:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5253, + "nodeType": "IfStatement", + "src": "6425:105:39", + "trueBody": { + "id": 5252, + "nodeType": "Block", + "src": "6475:55:39", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5249, + "name": "InvalidInitialization", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5140, + "src": "6496:21:39", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 5250, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6496:23:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5251, + "nodeType": "RevertStatement", + "src": "6489:30:39" + } + ] + } + }, + { + "expression": { + "id": 5258, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5254, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5238, + "src": "6539:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5256, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "6541:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "6539:14:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 5257, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5234, + "src": "6556:7:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "6539:24:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 5259, + "nodeType": "ExpressionStatement", + "src": "6539:24:39" + }, + { + "expression": { + "id": 5264, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5260, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5238, + "src": "6573:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5262, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "6575:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "6573:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "74727565", + "id": 5263, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6591:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "6573:22:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5265, + "nodeType": "ExpressionStatement", + "src": "6573:22:39" + }, + { + "id": 5266, + "nodeType": "PlaceholderStatement", + "src": "6605:1:39" + }, + { + "expression": { + "id": 5271, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5267, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5238, + "src": "6616:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5269, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "6618:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "6616:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "66616c7365", + "id": 5270, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6634:5:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "6616:23:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5272, + "nodeType": "ExpressionStatement", + "src": "6616:23:39" + }, + { + "eventCall": { + "arguments": [ + { + "id": 5274, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5234, + "src": "6666:7:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 5273, + "name": "Initialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5148, + "src": "6654:11:39", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint64_$returns$__$", + "typeString": "function (uint64)" + } + }, + "id": 5275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6654:20:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5276, + "nodeType": "EmitStatement", + "src": "6649:25:39" + } + ] + }, + "documentation": { + "id": 5232, + "nodeType": "StructuredDocumentation", + "src": "5177:1068:39", + "text": " @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n used to initialize parent contracts.\n A reinitializer may be used after the original initialization step. This is essential to configure modules that\n are added through upgrades and that require initialization.\n When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n cannot be nested. If one is invoked in the context of another, execution will revert.\n Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n a contract, executing them in the right order is up to the developer or operator.\n WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n Emits an {Initialized} event." + }, + "id": 5278, + "name": "reinitializer", + "nameLocation": "6259:13:39", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 5235, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5234, + "mutability": "mutable", + "name": "version", + "nameLocation": "6280:7:39", + "nodeType": "VariableDeclaration", + "scope": 5278, + "src": "6273:14:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 5233, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "6273:6:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "6272:16:39" + }, + "src": "6250:431:39", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5285, + "nodeType": "Block", + "src": "6919:48:39", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5281, + "name": "_checkInitializing", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5299, + "src": "6929:18:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$__$", + "typeString": "function () view" + } + }, + "id": 5282, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6929:20:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5283, + "nodeType": "ExpressionStatement", + "src": "6929:20:39" + }, + { + "id": 5284, + "nodeType": "PlaceholderStatement", + "src": "6959:1:39" + } + ] + }, + "documentation": { + "id": 5279, + "nodeType": "StructuredDocumentation", + "src": "6687:199:39", + "text": " @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n {initializer} and {reinitializer} modifiers, directly or indirectly." + }, + "id": 5286, + "name": "onlyInitializing", + "nameLocation": "6900:16:39", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 5280, + "nodeType": "ParameterList", + "parameters": [], + "src": "6916:2:39" + }, + "src": "6891:76:39", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5298, + "nodeType": "Block", + "src": "7134:89:39", + "statements": [ + { + "condition": { + "id": 5292, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "7148:18:39", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5290, + "name": "_isInitializing", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5367, + "src": "7149:15:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", + "typeString": "function () view returns (bool)" + } + }, + "id": 5291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7149:17:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5297, + "nodeType": "IfStatement", + "src": "7144:73:39", + "trueBody": { + "id": 5296, + "nodeType": "Block", + "src": "7168:49:39", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5293, + "name": "NotInitializing", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5143, + "src": "7189:15:39", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 5294, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7189:17:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5295, + "nodeType": "RevertStatement", + "src": "7182:24:39" + } + ] + } + } + ] + }, + "documentation": { + "id": 5287, + "nodeType": "StructuredDocumentation", + "src": "6973:104:39", + "text": " @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}." + }, + "id": 5299, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_checkInitializing", + "nameLocation": "7091:18:39", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5288, + "nodeType": "ParameterList", + "parameters": [], + "src": "7109:2:39" + }, + "returnParameters": { + "id": 5289, + "nodeType": "ParameterList", + "parameters": [], + "src": "7134:0:39" + }, + "scope": 5391, + "src": "7082:141:39", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5344, + "nodeType": "Block", + "src": "7758:373:39", + "statements": [ + { + "assignments": [5305], + "declarations": [ + { + "constant": false, + "id": 5305, + "mutability": "mutable", + "name": "$", + "nameLocation": "7853:1:39", + "nodeType": "VariableDeclaration", + "scope": 5344, + "src": "7824:30:39", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + }, + "typeName": { + "id": 5304, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5303, + "name": "InitializableStorage", + "nameLocations": ["7824:20:39"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5134, + "src": "7824:20:39" + }, + "referencedDeclaration": 5134, + "src": "7824:20:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5308, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5306, + "name": "_getInitializableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5390, + "src": "7857:24:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_InitializableStorage_$5134_storage_ptr_$", + "typeString": "function () pure returns (struct Initializable.InitializableStorage storage pointer)" + } + }, + "id": 5307, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7857:26:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7824:59:39" + }, + { + "condition": { + "expression": { + "id": 5309, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5305, + "src": "7898:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5310, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7900:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "7898:15:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5315, + "nodeType": "IfStatement", + "src": "7894:76:39", + "trueBody": { + "id": 5314, + "nodeType": "Block", + "src": "7915:55:39", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5311, + "name": "InvalidInitialization", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5140, + "src": "7936:21:39", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 5312, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7936:23:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5313, + "nodeType": "RevertStatement", + "src": "7929:30:39" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 5323, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 5316, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5305, + "src": "7983:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5317, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7985:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "7983:14:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 5320, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8006:6:39", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 5319, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8006:6:39", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + } + ], + "id": 5318, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "8001:4:39", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 5321, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8001:12:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint64", + "typeString": "type(uint64)" + } + }, + "id": 5322, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8014:3:39", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "8001:16:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "7983:34:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5343, + "nodeType": "IfStatement", + "src": "7979:146:39", + "trueBody": { + "id": 5342, + "nodeType": "Block", + "src": "8019:106:39", + "statements": [ + { + "expression": { + "id": 5332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5324, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5305, + "src": "8033:1:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5326, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "8035:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "8033:14:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "arguments": [ + { + "id": 5329, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8055:6:39", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 5328, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8055:6:39", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + } + ], + "id": 5327, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "8050:4:39", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 5330, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8050:12:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint64", + "typeString": "type(uint64)" + } + }, + "id": 5331, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8063:3:39", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "8050:16:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "8033:33:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 5333, + "nodeType": "ExpressionStatement", + "src": "8033:33:39" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 5337, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8102:6:39", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 5336, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8102:6:39", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + } + ], + "id": 5335, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "8097:4:39", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 5338, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8097:12:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint64", + "typeString": "type(uint64)" + } + }, + "id": 5339, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8110:3:39", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "8097:16:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 5334, + "name": "Initialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5148, + "src": "8085:11:39", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint64_$returns$__$", + "typeString": "function (uint64)" + } + }, + "id": 5340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8085:29:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5341, + "nodeType": "EmitStatement", + "src": "8080:34:39" + } + ] + } + } + ] + }, + "documentation": { + "id": 5300, + "nodeType": "StructuredDocumentation", + "src": "7229:475:39", + "text": " @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n through proxies.\n Emits an {Initialized} event the first time it is successfully executed." + }, + "id": 5345, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_disableInitializers", + "nameLocation": "7718:20:39", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5301, + "nodeType": "ParameterList", + "parameters": [], + "src": "7738:2:39" + }, + "returnParameters": { + "id": 5302, + "nodeType": "ParameterList", + "parameters": [], + "src": "7758:0:39" + }, + "scope": 5391, + "src": "7709:422:39", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5355, + "nodeType": "Block", + "src": "8306:63:39", + "statements": [ + { + "expression": { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5351, + "name": "_getInitializableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5390, + "src": "8323:24:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_InitializableStorage_$5134_storage_ptr_$", + "typeString": "function () pure returns (struct Initializable.InitializableStorage storage pointer)" + } + }, + "id": 5352, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8323:26:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5353, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8350:12:39", + "memberName": "_initialized", + "nodeType": "MemberAccess", + "referencedDeclaration": 5130, + "src": "8323:39:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "functionReturnParameters": 5350, + "id": 5354, + "nodeType": "Return", + "src": "8316:46:39" + } + ] + }, + "documentation": { + "id": 5346, + "nodeType": "StructuredDocumentation", + "src": "8137:99:39", + "text": " @dev Returns the highest version that has been initialized. See {reinitializer}." + }, + "id": 5356, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getInitializedVersion", + "nameLocation": "8250:22:39", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5347, + "nodeType": "ParameterList", + "parameters": [], + "src": "8272:2:39" + }, + "returnParameters": { + "id": 5350, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5349, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5356, + "src": "8298:6:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 5348, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "8298:6:39", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "8297:8:39" + }, + "scope": 5391, + "src": "8241:128:39", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5366, + "nodeType": "Block", + "src": "8541:64:39", + "statements": [ + { + "expression": { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5362, + "name": "_getInitializableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5390, + "src": "8558:24:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_InitializableStorage_$5134_storage_ptr_$", + "typeString": "function () pure returns (struct Initializable.InitializableStorage storage pointer)" + } + }, + "id": 5363, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8558:26:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage storage pointer" + } + }, + "id": 5364, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8585:13:39", + "memberName": "_initializing", + "nodeType": "MemberAccess", + "referencedDeclaration": 5133, + "src": "8558:40:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 5361, + "id": 5365, + "nodeType": "Return", + "src": "8551:47:39" + } + ] + }, + "documentation": { + "id": 5357, + "nodeType": "StructuredDocumentation", + "src": "8375:105:39", + "text": " @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}." + }, + "id": 5367, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_isInitializing", + "nameLocation": "8494:15:39", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5358, + "nodeType": "ParameterList", + "parameters": [], + "src": "8509:2:39" + }, + "returnParameters": { + "id": 5361, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5360, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5367, + "src": "8535:4:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5359, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8535:4:39", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "8534:6:39" + }, + "scope": 5391, + "src": "8485:120:39", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5375, + "nodeType": "Block", + "src": "8896:45:39", + "statements": [ + { + "expression": { + "id": 5373, + "name": "INITIALIZABLE_STORAGE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5137, + "src": "8913:21:39", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5372, + "id": 5374, + "nodeType": "Return", + "src": "8906:28:39" + } + ] + }, + "documentation": { + "id": 5368, + "nodeType": "StructuredDocumentation", + "src": "8611:203:39", + "text": " @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n NOTE: Consider following the ERC-7201 formula to derive storage locations." + }, + "id": 5376, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_initializableStorageSlot", + "nameLocation": "8828:25:39", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5369, + "nodeType": "ParameterList", + "parameters": [], + "src": "8853:2:39" + }, + "returnParameters": { + "id": 5372, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5371, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5376, + "src": "8887:7:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5370, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8887:7:39", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "8886:9:39" + }, + "scope": 5391, + "src": "8819:122:39", + "stateMutability": "pure", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5389, + "nodeType": "Block", + "src": "9161:115:39", + "statements": [ + { + "assignments": [5384], + "declarations": [ + { + "constant": false, + "id": 5384, + "mutability": "mutable", + "name": "slot", + "nameLocation": "9179:4:39", + "nodeType": "VariableDeclaration", + "scope": 5389, + "src": "9171:12:39", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5383, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "9171:7:39", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 5387, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5385, + "name": "_initializableStorageSlot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5376, + "src": "9186:25:39", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_bytes32_$", + "typeString": "function () pure returns (bytes32)" + } + }, + "id": 5386, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9186:27:39", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9171:42:39" + }, + { + "AST": { + "nativeSrc": "9232:38:39", + "nodeType": "YulBlock", + "src": "9232:38:39", + "statements": [ + { + "nativeSrc": "9246:14:39", + "nodeType": "YulAssignment", + "src": "9246:14:39", + "value": { + "name": "slot", + "nativeSrc": "9256:4:39", + "nodeType": "YulIdentifier", + "src": "9256:4:39" + }, + "variableNames": [ + { + "name": "$.slot", + "nativeSrc": "9246:6:39", + "nodeType": "YulIdentifier", + "src": "9246:6:39" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 5381, + "isOffset": false, + "isSlot": true, + "src": "9246:6:39", + "suffix": "slot", + "valueSize": 1 + }, + { + "declaration": 5384, + "isOffset": false, + "isSlot": false, + "src": "9256:4:39", + "valueSize": 1 + } + ], + "id": 5388, + "nodeType": "InlineAssembly", + "src": "9223:47:39" + } + ] + }, + "documentation": { + "id": 5377, + "nodeType": "StructuredDocumentation", + "src": "8947:67:39", + "text": " @dev Returns a pointer to the storage namespace." + }, + "id": 5390, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getInitializableStorage", + "nameLocation": "9080:24:39", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5378, + "nodeType": "ParameterList", + "parameters": [], + "src": "9104:2:39" + }, + "returnParameters": { + "id": 5382, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5381, + "mutability": "mutable", + "name": "$", + "nameLocation": "9158:1:39", + "nodeType": "VariableDeclaration", + "scope": 5390, + "src": "9129:30:39", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + }, + "typeName": { + "id": 5380, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5379, + "name": "InitializableStorage", + "nameLocations": ["9129:20:39"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5134, + "src": "9129:20:39" + }, + "referencedDeclaration": 5134, + "src": "9129:20:39", + "typeDescriptions": { + "typeIdentifier": "t_struct$_InitializableStorage_$5134_storage_ptr", + "typeString": "struct Initializable.InitializableStorage" + } + }, + "visibility": "internal" + } + ], + "src": "9128:32:39" + }, + "scope": 5391, + "src": "9071:205:39", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + } + ], + "scope": 5392, + "src": "2349:6929:39", + "usedErrors": [5140, 5143], + "usedEvents": [5148] + } + ], + "src": "113:9166:39" + }, + "id": 39 + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol", + "exportedSymbols": { + "ContextUpgradeable": [5437], + "Initializable": [5391] + }, + "id": 5438, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 5393, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "101:24:40" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "../proxy/utils/Initializable.sol", + "id": 5395, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5438, + "sourceUnit": 5392, + "src": "126:63:40", + "symbolAliases": [ + { + "foreign": { + "id": 5394, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "134:13:40", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 5397, + "name": "Initializable", + "nameLocations": ["728:13:40"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "728:13:40" + }, + "id": 5398, + "nodeType": "InheritanceSpecifier", + "src": "728:13:40" + } + ], + "canonicalName": "ContextUpgradeable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 5396, + "nodeType": "StructuredDocumentation", + "src": "191:496:40", + "text": " @dev Provides information about the current execution context, including the\n sender of the transaction and its data. While these are generally available\n via msg.sender and msg.data, they should not be accessed in such a direct\n manner, since when dealing with meta-transactions the account sending and\n paying for execution may not be the actual sender (as far as an application\n is concerned).\n This contract is only required for intermediate, library-like contracts." + }, + "fullyImplemented": true, + "id": 5437, + "linearizedBaseContracts": [5437, 5391], + "name": "ContextUpgradeable", + "nameLocation": "706:18:40", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 5403, + "nodeType": "Block", + "src": "800:7:40", + "statements": [] + }, + "id": 5404, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5401, + "kind": "modifierInvocation", + "modifierName": { + "id": 5400, + "name": "onlyInitializing", + "nameLocations": ["783:16:40"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "783:16:40" + }, + "nodeType": "ModifierInvocation", + "src": "783:16:40" + } + ], + "name": "__Context_init", + "nameLocation": "757:14:40", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5399, + "nodeType": "ParameterList", + "parameters": [], + "src": "771:2:40" + }, + "returnParameters": { + "id": 5402, + "nodeType": "ParameterList", + "parameters": [], + "src": "800:0:40" + }, + "scope": 5437, + "src": "748:59:40", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5409, + "nodeType": "Block", + "src": "875:7:40", + "statements": [] + }, + "id": 5410, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5407, + "kind": "modifierInvocation", + "modifierName": { + "id": 5406, + "name": "onlyInitializing", + "nameLocations": ["858:16:40"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "858:16:40" + }, + "nodeType": "ModifierInvocation", + "src": "858:16:40" + } + ], + "name": "__Context_init_unchained", + "nameLocation": "822:24:40", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5405, + "nodeType": "ParameterList", + "parameters": [], + "src": "846:2:40" + }, + "returnParameters": { + "id": 5408, + "nodeType": "ParameterList", + "parameters": [], + "src": "875:0:40" + }, + "scope": 5437, + "src": "813:69:40", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5418, + "nodeType": "Block", + "src": "949:34:40", + "statements": [ + { + "expression": { + "expression": { + "id": 5415, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "966:3:40", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 5416, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "970:6:40", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "966:10:40", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 5414, + "id": 5417, + "nodeType": "Return", + "src": "959:17:40" + } + ] + }, + "id": 5419, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_msgSender", + "nameLocation": "896:10:40", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5411, + "nodeType": "ParameterList", + "parameters": [], + "src": "906:2:40" + }, + "returnParameters": { + "id": 5414, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5413, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5419, + "src": "940:7:40", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5412, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "940:7:40", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "939:9:40" + }, + "scope": 5437, + "src": "887:96:40", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5427, + "nodeType": "Block", + "src": "1056:32:40", + "statements": [ + { + "expression": { + "expression": { + "id": 5424, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1073:3:40", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 5425, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1077:4:40", + "memberName": "data", + "nodeType": "MemberAccess", + "src": "1073:8:40", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "functionReturnParameters": 5423, + "id": 5426, + "nodeType": "Return", + "src": "1066:15:40" + } + ] + }, + "id": 5428, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_msgData", + "nameLocation": "998:8:40", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5420, + "nodeType": "ParameterList", + "parameters": [], + "src": "1006:2:40" + }, + "returnParameters": { + "id": 5423, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5422, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5428, + "src": "1040:14:40", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 5421, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1040:5:40", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1039:16:40" + }, + "scope": 5437, + "src": "989:99:40", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5435, + "nodeType": "Block", + "src": "1166:25:40", + "statements": [ + { + "expression": { + "hexValue": "30", + "id": 5433, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1183:1:40", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 5432, + "id": 5434, + "nodeType": "Return", + "src": "1176:8:40" + } + ] + }, + "id": 5436, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_contextSuffixLength", + "nameLocation": "1103:20:40", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5429, + "nodeType": "ParameterList", + "parameters": [], + "src": "1123:2:40" + }, + "returnParameters": { + "id": 5432, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5431, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5436, + "src": "1157:7:40", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 5430, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1157:7:40", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1156:9:40" + }, + "scope": 5437, + "src": "1094:97:40", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + } + ], + "scope": 5438, + "src": "688:505:40", + "usedErrors": [5140, 5143], + "usedEvents": [5148] + } + ], + "src": "101:1093:40" + }, + "id": 40 + }, + "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol", + "exportedSymbols": { + "Address": [6407], + "ContextUpgradeable": [5437], + "Initializable": [5391], + "MulticallUpgradeable": [5540] + }, + "id": 5541, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 5439, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "103:24:41" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/Address.sol", + "file": "@openzeppelin/contracts/utils/Address.sol", + "id": 5441, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5541, + "sourceUnit": 6408, + "src": "129:66:41", + "symbolAliases": [ + { + "foreign": { + "id": 5440, + "name": "Address", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6407, + "src": "137:7:41", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol", + "file": "./ContextUpgradeable.sol", + "id": 5443, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5541, + "sourceUnit": 5438, + "src": "196:60:41", + "symbolAliases": [ + { + "foreign": { + "id": 5442, + "name": "ContextUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5437, + "src": "204:18:41", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "../proxy/utils/Initializable.sol", + "id": 5445, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5541, + "sourceUnit": 5392, + "src": "257:63:41", + "symbolAliases": [ + { + "foreign": { + "id": 5444, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "265:13:41", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 5447, + "name": "Initializable", + "nameLocations": ["1178:13:41"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "1178:13:41" + }, + "id": 5448, + "nodeType": "InheritanceSpecifier", + "src": "1178:13:41" + }, + { + "baseName": { + "id": 5449, + "name": "ContextUpgradeable", + "nameLocations": ["1193:18:41"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5437, + "src": "1193:18:41" + }, + "id": 5450, + "nodeType": "InheritanceSpecifier", + "src": "1193:18:41" + } + ], + "canonicalName": "MulticallUpgradeable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 5446, + "nodeType": "StructuredDocumentation", + "src": "322:813:41", + "text": " @dev Provides a function to batch together multiple calls in a single external call.\n Consider any assumption about calldata validation performed by the sender may be violated if it's not especially\n careful about sending transactions invoking {multicall}. For example, a relay address that filters function\n selectors won't filter calls nested within a {multicall} operation.\n NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {Context-_msgSender}).\n If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data`\n to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of\n {Context-_msgSender} are not propagated to subcalls." + }, + "fullyImplemented": true, + "id": 5540, + "linearizedBaseContracts": [5540, 5437, 5391], + "name": "MulticallUpgradeable", + "nameLocation": "1154:20:41", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 5455, + "nodeType": "Block", + "src": "1272:7:41", + "statements": [] + }, + "id": 5456, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5453, + "kind": "modifierInvocation", + "modifierName": { + "id": 5452, + "name": "onlyInitializing", + "nameLocations": ["1255:16:41"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "1255:16:41" + }, + "nodeType": "ModifierInvocation", + "src": "1255:16:41" + } + ], + "name": "__Multicall_init", + "nameLocation": "1227:16:41", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5451, + "nodeType": "ParameterList", + "parameters": [], + "src": "1243:2:41" + }, + "returnParameters": { + "id": 5454, + "nodeType": "ParameterList", + "parameters": [], + "src": "1272:0:41" + }, + "scope": 5540, + "src": "1218:61:41", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5461, + "nodeType": "Block", + "src": "1349:7:41", + "statements": [] + }, + "id": 5462, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5459, + "kind": "modifierInvocation", + "modifierName": { + "id": 5458, + "name": "onlyInitializing", + "nameLocations": ["1332:16:41"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "1332:16:41" + }, + "nodeType": "ModifierInvocation", + "src": "1332:16:41" + } + ], + "name": "__Multicall_init_unchained", + "nameLocation": "1294:26:41", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5457, + "nodeType": "ParameterList", + "parameters": [], + "src": "1320:2:41" + }, + "returnParameters": { + "id": 5460, + "nodeType": "ParameterList", + "parameters": [], + "src": "1349:0:41" + }, + "scope": 5540, + "src": "1285:71:41", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5538, + "nodeType": "Block", + "src": "1610:392:41", + "statements": [ + { + "assignments": [5473], + "declarations": [ + { + "constant": false, + "id": 5473, + "mutability": "mutable", + "name": "context", + "nameLocation": "1633:7:41", + "nodeType": "VariableDeclaration", + "scope": 5538, + "src": "1620:20:41", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 5472, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1620:5:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 5493, + "initialValue": { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 5478, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 5474, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1643:3:41", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 5475, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1647:6:41", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "1643:10:41", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5476, + "name": "_msgSender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5419, + "src": "1657:10:41", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 5477, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1657:12:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1643:26:41", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "baseExpression": { + "expression": { + "id": 5483, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1711:3:41", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 5484, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1715:4:41", + "memberName": "data", + "nodeType": "MemberAccess", + "src": "1711:8:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 5491, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "1711:51:41", + "startExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 5490, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "expression": { + "id": 5485, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1720:3:41", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 5486, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1724:4:41", + "memberName": "data", + "nodeType": "MemberAccess", + "src": "1720:8:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 5487, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1729:6:41", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1720:15:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5488, + "name": "_contextSuffixLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5436, + "src": "1738:20:41", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 5489, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1738:22:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1720:40:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + }, + "id": 5492, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "1643:119:41", + "trueExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 5481, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1694:1:41", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 5480, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "1684:9:41", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (uint256) pure returns (bytes memory)" + }, + "typeName": { + "id": 5479, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1688:5:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + "id": 5482, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1684:12:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1620:142:41" + }, + { + "expression": { + "id": 5501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 5494, + "name": "results", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5470, + "src": "1773:7:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 5498, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5466, + "src": "1795:4:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", + "typeString": "bytes calldata[] calldata" + } + }, + "id": 5499, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1800:6:41", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1795:11:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 5497, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "1783:11:41", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$", + "typeString": "function (uint256) pure returns (bytes memory[] memory)" + }, + "typeName": { + "baseType": { + "id": 5495, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1787:5:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "id": 5496, + "nodeType": "ArrayTypeName", + "src": "1787:7:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr", + "typeString": "bytes[]" + } + } + }, + "id": 5500, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1783:24:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "src": "1773:34:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 5502, + "nodeType": "ExpressionStatement", + "src": "1773:34:41" + }, + { + "body": { + "id": 5534, + "nodeType": "Block", + "src": "1859:113:41", + "statements": [ + { + "expression": { + "id": 5532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 5514, + "name": "results", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5470, + "src": "1873:7:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "id": 5516, + "indexExpression": { + "id": 5515, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5504, + "src": "1881:1:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "1873:10:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "id": 5521, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "1923:4:41", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MulticallUpgradeable_$5540", + "typeString": "contract MulticallUpgradeable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MulticallUpgradeable_$5540", + "typeString": "contract MulticallUpgradeable" + } + ], + "id": 5520, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1915:7:41", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5519, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1915:7:41", + "typeDescriptions": {} + } + }, + "id": 5522, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1915:13:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "baseExpression": { + "id": 5526, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5466, + "src": "1943:4:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", + "typeString": "bytes calldata[] calldata" + } + }, + "id": 5528, + "indexExpression": { + "id": 5527, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5504, + "src": "1948:1:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1943:7:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "id": 5529, + "name": "context", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5473, + "src": "1952:7:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 5524, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1930:5:41", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 5523, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1930:5:41", + "typeDescriptions": {} + } + }, + "id": 5525, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1936:6:41", + "memberName": "concat", + "nodeType": "MemberAccess", + "src": "1930:12:41", + "typeDescriptions": { + "typeIdentifier": "t_function_bytesconcat_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 5530, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1930:30:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 5517, + "name": "Address", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6407, + "src": "1886:7:41", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Address_$6407_$", + "typeString": "type(library Address)" + } + }, + "id": 5518, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1894:20:41", + "memberName": "functionDelegateCall", + "nodeType": "MemberAccess", + "referencedDeclaration": 6324, + "src": "1886:28:41", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (address,bytes memory) returns (bytes memory)" + } + }, + "id": 5531, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1886:75:41", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "src": "1873:88:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 5533, + "nodeType": "ExpressionStatement", + "src": "1873:88:41" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 5510, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 5507, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5504, + "src": "1837:1:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "expression": { + "id": 5508, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5466, + "src": "1841:4:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", + "typeString": "bytes calldata[] calldata" + } + }, + "id": 5509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1846:6:41", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1841:11:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1837:15:41", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5535, + "initializationExpression": { + "assignments": [5504], + "declarations": [ + { + "constant": false, + "id": 5504, + "mutability": "mutable", + "name": "i", + "nameLocation": "1830:1:41", + "nodeType": "VariableDeclaration", + "scope": 5535, + "src": "1822:9:41", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 5503, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1822:7:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 5506, + "initialValue": { + "hexValue": "30", + "id": 5505, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1834:1:41", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "1822:13:41" + }, + "isSimpleCounterLoop": true, + "loopExpression": { + "expression": { + "id": 5512, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "1854:3:41", + "subExpression": { + "id": 5511, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5504, + "src": "1854:1:41", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 5513, + "nodeType": "ExpressionStatement", + "src": "1854:3:41" + }, + "nodeType": "ForStatement", + "src": "1817:155:41" + }, + { + "expression": { + "id": 5536, + "name": "results", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5470, + "src": "1988:7:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes memory[] memory" + } + }, + "functionReturnParameters": 5471, + "id": 5537, + "nodeType": "Return", + "src": "1981:14:41" + } + ] + }, + "documentation": { + "id": 5463, + "nodeType": "StructuredDocumentation", + "src": "1361:152:41", + "text": " @dev Receives and executes a batch of function calls on this contract.\n @custom:oz-upgrades-unsafe-allow-reachable delegatecall" + }, + "functionSelector": "ac9650d8", + "id": 5539, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "multicall", + "nameLocation": "1527:9:41", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5467, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5466, + "mutability": "mutable", + "name": "data", + "nameLocation": "1554:4:41", + "nodeType": "VariableDeclaration", + "scope": 5539, + "src": "1537:21:41", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", + "typeString": "bytes[]" + }, + "typeName": { + "baseType": { + "id": 5464, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1537:5:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "id": 5465, + "nodeType": "ArrayTypeName", + "src": "1537:7:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr", + "typeString": "bytes[]" + } + }, + "visibility": "internal" + } + ], + "src": "1536:23:41" + }, + "returnParameters": { + "id": 5471, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5470, + "mutability": "mutable", + "name": "results", + "nameLocation": "1601:7:41", + "nodeType": "VariableDeclaration", + "scope": 5539, + "src": "1586:22:41", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", + "typeString": "bytes[]" + }, + "typeName": { + "baseType": { + "id": 5468, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1586:5:41", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "id": 5469, + "nodeType": "ArrayTypeName", + "src": "1586:7:41", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr", + "typeString": "bytes[]" + } + }, + "visibility": "internal" + } + ], + "src": "1585:24:41" + }, + "scope": 5540, + "src": "1518:484:41", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "external" + } + ], + "scope": 5541, + "src": "1136:868:41", + "usedErrors": [5140, 5143, 6157, 6420], + "usedEvents": [5148] + } + ], + "src": "103:1902:41" + }, + "id": 41 + }, + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol", + "exportedSymbols": { + "ContextUpgradeable": [5437], + "Initializable": [5391], + "PausableUpgradeable": [5700] + }, + "id": 5701, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 5542, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "102:24:42" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol", + "file": "../utils/ContextUpgradeable.sol", + "id": 5544, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5701, + "sourceUnit": 5438, + "src": "128:67:42", + "symbolAliases": [ + { + "foreign": { + "id": 5543, + "name": "ContextUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5437, + "src": "136:18:42", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "../proxy/utils/Initializable.sol", + "id": 5546, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 5701, + "sourceUnit": 5392, + "src": "196:63:42", + "symbolAliases": [ + { + "foreign": { + "id": 5545, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "204:13:42", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 5548, + "name": "Initializable", + "nameLocations": ["742:13:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "742:13:42" + }, + "id": 5549, + "nodeType": "InheritanceSpecifier", + "src": "742:13:42" + }, + { + "baseName": { + "id": 5550, + "name": "ContextUpgradeable", + "nameLocations": ["757:18:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5437, + "src": "757:18:42" + }, + "id": 5551, + "nodeType": "InheritanceSpecifier", + "src": "757:18:42" + } + ], + "canonicalName": "PausableUpgradeable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 5547, + "nodeType": "StructuredDocumentation", + "src": "261:439:42", + "text": " @dev Contract module which allows children to implement an emergency stop\n mechanism that can be triggered by an authorized account.\n This module is used through inheritance. It will make available the\n modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n the functions of your contract. Note that they will not be pausable by\n simply including this module, only once the modifiers are put in place." + }, + "fullyImplemented": true, + "id": 5700, + "linearizedBaseContracts": [5700, 5437, 5391], + "name": "PausableUpgradeable", + "nameLocation": "719:19:42", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "PausableUpgradeable.PausableStorage", + "documentation": { + "id": 5552, + "nodeType": "StructuredDocumentation", + "src": "782:66:42", + "text": "@custom:storage-location erc7201:openzeppelin.storage.Pausable" + }, + "id": 5555, + "members": [ + { + "constant": false, + "id": 5554, + "mutability": "mutable", + "name": "_paused", + "nameLocation": "891:7:42", + "nodeType": "VariableDeclaration", + "scope": 5555, + "src": "886:12:42", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5553, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "886:4:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "name": "PausableStorage", + "nameLocation": "860:15:42", + "nodeType": "StructDefinition", + "scope": 5700, + "src": "853:52:42", + "visibility": "public" + }, + { + "constant": true, + "id": 5558, + "mutability": "constant", + "name": "PausableStorageLocation", + "nameLocation": "1048:23:42", + "nodeType": "VariableDeclaration", + "scope": 5700, + "src": "1023:117:42", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5556, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1023:7:42", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "hexValue": "307863643565643135633665313837653737653961656538383138346332316634663231383261623538323763623362376530376662656463643633663033333030", + "id": 5557, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1074:66:42", + "typeDescriptions": { + "typeIdentifier": "t_rational_92891662540554778686986514950364265630913525426840345632122912437671245656832_by_1", + "typeString": "int_const 9289...(69 digits omitted)...6832" + }, + "value": "0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300" + }, + "visibility": "private" + }, + { + "body": { + "id": 5565, + "nodeType": "Block", + "src": "1227:82:42", + "statements": [ + { + "AST": { + "nativeSrc": "1246:57:42", + "nodeType": "YulBlock", + "src": "1246:57:42", + "statements": [ + { + "nativeSrc": "1260:33:42", + "nodeType": "YulAssignment", + "src": "1260:33:42", + "value": { + "name": "PausableStorageLocation", + "nativeSrc": "1270:23:42", + "nodeType": "YulIdentifier", + "src": "1270:23:42" + }, + "variableNames": [ + { + "name": "$.slot", + "nativeSrc": "1260:6:42", + "nodeType": "YulIdentifier", + "src": "1260:6:42" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 5562, + "isOffset": false, + "isSlot": true, + "src": "1260:6:42", + "suffix": "slot", + "valueSize": 1 + }, + { + "declaration": 5558, + "isOffset": false, + "isSlot": false, + "src": "1270:23:42", + "valueSize": 1 + } + ], + "id": 5564, + "nodeType": "InlineAssembly", + "src": "1237:66:42" + } + ] + }, + "id": 5566, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getPausableStorage", + "nameLocation": "1156:19:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5559, + "nodeType": "ParameterList", + "parameters": [], + "src": "1175:2:42" + }, + "returnParameters": { + "id": 5563, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5562, + "mutability": "mutable", + "name": "$", + "nameLocation": "1224:1:42", + "nodeType": "VariableDeclaration", + "scope": 5566, + "src": "1200:25:42", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + }, + "typeName": { + "id": 5561, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5560, + "name": "PausableStorage", + "nameLocations": ["1200:15:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5555, + "src": "1200:15:42" + }, + "referencedDeclaration": 5555, + "src": "1200:15:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + } + }, + "visibility": "internal" + } + ], + "src": "1199:27:42" + }, + "scope": 5700, + "src": "1147:162:42", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": { + "id": 5567, + "nodeType": "StructuredDocumentation", + "src": "1315:73:42", + "text": " @dev Emitted when the pause is triggered by `account`." + }, + "eventSelector": "62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258", + "id": 5571, + "name": "Paused", + "nameLocation": "1399:6:42", + "nodeType": "EventDefinition", + "parameters": { + "id": 5570, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5569, + "indexed": false, + "mutability": "mutable", + "name": "account", + "nameLocation": "1414:7:42", + "nodeType": "VariableDeclaration", + "scope": 5571, + "src": "1406:15:42", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5568, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1406:7:42", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1405:17:42" + }, + "src": "1393:30:42" + }, + { + "anonymous": false, + "documentation": { + "id": 5572, + "nodeType": "StructuredDocumentation", + "src": "1429:70:42", + "text": " @dev Emitted when the pause is lifted by `account`." + }, + "eventSelector": "5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa", + "id": 5576, + "name": "Unpaused", + "nameLocation": "1510:8:42", + "nodeType": "EventDefinition", + "parameters": { + "id": 5575, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5574, + "indexed": false, + "mutability": "mutable", + "name": "account", + "nameLocation": "1527:7:42", + "nodeType": "VariableDeclaration", + "scope": 5576, + "src": "1519:15:42", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5573, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1519:7:42", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1518:17:42" + }, + "src": "1504:32:42" + }, + { + "documentation": { + "id": 5577, + "nodeType": "StructuredDocumentation", + "src": "1542:76:42", + "text": " @dev The operation failed because the contract is paused." + }, + "errorSelector": "d93c0665", + "id": 5579, + "name": "EnforcedPause", + "nameLocation": "1629:13:42", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 5578, + "nodeType": "ParameterList", + "parameters": [], + "src": "1642:2:42" + }, + "src": "1623:22:42" + }, + { + "documentation": { + "id": 5580, + "nodeType": "StructuredDocumentation", + "src": "1651:80:42", + "text": " @dev The operation failed because the contract is not paused." + }, + "errorSelector": "8dfc202b", + "id": 5582, + "name": "ExpectedPause", + "nameLocation": "1742:13:42", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 5581, + "nodeType": "ParameterList", + "parameters": [], + "src": "1755:2:42" + }, + "src": "1736:22:42" + }, + { + "body": { + "id": 5589, + "nodeType": "Block", + "src": "1969:47:42", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5585, + "name": "_requireNotPaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5638, + "src": "1979:17:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$__$", + "typeString": "function () view" + } + }, + "id": 5586, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1979:19:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5587, + "nodeType": "ExpressionStatement", + "src": "1979:19:42" + }, + { + "id": 5588, + "nodeType": "PlaceholderStatement", + "src": "2008:1:42" + } + ] + }, + "documentation": { + "id": 5583, + "nodeType": "StructuredDocumentation", + "src": "1764:175:42", + "text": " @dev Modifier to make a function callable only when the contract is not paused.\n Requirements:\n - The contract must not be paused." + }, + "id": 5590, + "name": "whenNotPaused", + "nameLocation": "1953:13:42", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 5584, + "nodeType": "ParameterList", + "parameters": [], + "src": "1966:2:42" + }, + "src": "1944:72:42", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5597, + "nodeType": "Block", + "src": "2216:44:42", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5593, + "name": "_requirePaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5651, + "src": "2226:14:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$__$", + "typeString": "function () view" + } + }, + "id": 5594, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2226:16:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5595, + "nodeType": "ExpressionStatement", + "src": "2226:16:42" + }, + { + "id": 5596, + "nodeType": "PlaceholderStatement", + "src": "2252:1:42" + } + ] + }, + "documentation": { + "id": 5591, + "nodeType": "StructuredDocumentation", + "src": "2022:167:42", + "text": " @dev Modifier to make a function callable only when the contract is paused.\n Requirements:\n - The contract must be paused." + }, + "id": 5598, + "name": "whenPaused", + "nameLocation": "2203:10:42", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 5592, + "nodeType": "ParameterList", + "parameters": [], + "src": "2213:2:42" + }, + "src": "2194:66:42", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5603, + "nodeType": "Block", + "src": "2319:7:42", + "statements": [] + }, + "id": 5604, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5601, + "kind": "modifierInvocation", + "modifierName": { + "id": 5600, + "name": "onlyInitializing", + "nameLocations": ["2302:16:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "2302:16:42" + }, + "nodeType": "ModifierInvocation", + "src": "2302:16:42" + } + ], + "name": "__Pausable_init", + "nameLocation": "2275:15:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5599, + "nodeType": "ParameterList", + "parameters": [], + "src": "2290:2:42" + }, + "returnParameters": { + "id": 5602, + "nodeType": "ParameterList", + "parameters": [], + "src": "2319:0:42" + }, + "scope": 5700, + "src": "2266:60:42", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5609, + "nodeType": "Block", + "src": "2395:7:42", + "statements": [] + }, + "id": 5610, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5607, + "kind": "modifierInvocation", + "modifierName": { + "id": 5606, + "name": "onlyInitializing", + "nameLocations": ["2378:16:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "2378:16:42" + }, + "nodeType": "ModifierInvocation", + "src": "2378:16:42" + } + ], + "name": "__Pausable_init_unchained", + "nameLocation": "2341:25:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5605, + "nodeType": "ParameterList", + "parameters": [], + "src": "2366:2:42" + }, + "returnParameters": { + "id": 5608, + "nodeType": "ParameterList", + "parameters": [], + "src": "2395:0:42" + }, + "scope": 5700, + "src": "2332:70:42", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5625, + "nodeType": "Block", + "src": "2549:92:42", + "statements": [ + { + "assignments": [5618], + "declarations": [ + { + "constant": false, + "id": 5618, + "mutability": "mutable", + "name": "$", + "nameLocation": "2583:1:42", + "nodeType": "VariableDeclaration", + "scope": 5625, + "src": "2559:25:42", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + }, + "typeName": { + "id": 5617, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5616, + "name": "PausableStorage", + "nameLocations": ["2559:15:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5555, + "src": "2559:15:42" + }, + "referencedDeclaration": 5555, + "src": "2559:15:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5621, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5619, + "name": "_getPausableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5566, + "src": "2587:19:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_PausableStorage_$5555_storage_ptr_$", + "typeString": "function () pure returns (struct PausableUpgradeable.PausableStorage storage pointer)" + } + }, + "id": 5620, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2587:21:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2559:49:42" + }, + { + "expression": { + "expression": { + "id": 5622, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5618, + "src": "2625:1:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage storage pointer" + } + }, + "id": 5623, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2627:7:42", + "memberName": "_paused", + "nodeType": "MemberAccess", + "referencedDeclaration": 5554, + "src": "2625:9:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 5615, + "id": 5624, + "nodeType": "Return", + "src": "2618:16:42" + } + ] + }, + "documentation": { + "id": 5611, + "nodeType": "StructuredDocumentation", + "src": "2407:84:42", + "text": " @dev Returns true if the contract is paused, and false otherwise." + }, + "functionSelector": "5c975abb", + "id": 5626, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "paused", + "nameLocation": "2505:6:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5612, + "nodeType": "ParameterList", + "parameters": [], + "src": "2511:2:42" + }, + "returnParameters": { + "id": 5615, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5614, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5626, + "src": "2543:4:42", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 5613, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2543:4:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2542:6:42" + }, + "scope": 5700, + "src": "2496:145:42", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 5637, + "nodeType": "Block", + "src": "2760:77:42", + "statements": [ + { + "condition": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5630, + "name": "paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5626, + "src": "2774:6:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", + "typeString": "function () view returns (bool)" + } + }, + "id": 5631, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2774:8:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5636, + "nodeType": "IfStatement", + "src": "2770:61:42", + "trueBody": { + "id": 5635, + "nodeType": "Block", + "src": "2784:47:42", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5632, + "name": "EnforcedPause", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5579, + "src": "2805:13:42", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 5633, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2805:15:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5634, + "nodeType": "RevertStatement", + "src": "2798:22:42" + } + ] + } + } + ] + }, + "documentation": { + "id": 5627, + "nodeType": "StructuredDocumentation", + "src": "2647:57:42", + "text": " @dev Throws if the contract is paused." + }, + "id": 5638, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_requireNotPaused", + "nameLocation": "2718:17:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5628, + "nodeType": "ParameterList", + "parameters": [], + "src": "2735:2:42" + }, + "returnParameters": { + "id": 5629, + "nodeType": "ParameterList", + "parameters": [], + "src": "2760:0:42" + }, + "scope": 5700, + "src": "2709:128:42", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5650, + "nodeType": "Block", + "src": "2957:78:42", + "statements": [ + { + "condition": { + "id": 5644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2971:9:42", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5642, + "name": "paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5626, + "src": "2972:6:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", + "typeString": "function () view returns (bool)" + } + }, + "id": 5643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2972:8:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5649, + "nodeType": "IfStatement", + "src": "2967:62:42", + "trueBody": { + "id": 5648, + "nodeType": "Block", + "src": "2982:47:42", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5645, + "name": "ExpectedPause", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5582, + "src": "3003:13:42", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 5646, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3003:15:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 5647, + "nodeType": "RevertStatement", + "src": "2996:22:42" + } + ] + } + } + ] + }, + "documentation": { + "id": 5639, + "nodeType": "StructuredDocumentation", + "src": "2843:61:42", + "text": " @dev Throws if the contract is not paused." + }, + "id": 5651, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_requirePaused", + "nameLocation": "2918:14:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5640, + "nodeType": "ParameterList", + "parameters": [], + "src": "2932:2:42" + }, + "returnParameters": { + "id": 5641, + "nodeType": "ParameterList", + "parameters": [], + "src": "2957:0:42" + }, + "scope": 5700, + "src": "2909:126:42", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5674, + "nodeType": "Block", + "src": "3219:127:42", + "statements": [ + { + "assignments": [5659], + "declarations": [ + { + "constant": false, + "id": 5659, + "mutability": "mutable", + "name": "$", + "nameLocation": "3253:1:42", + "nodeType": "VariableDeclaration", + "scope": 5674, + "src": "3229:25:42", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + }, + "typeName": { + "id": 5658, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5657, + "name": "PausableStorage", + "nameLocations": ["3229:15:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5555, + "src": "3229:15:42" + }, + "referencedDeclaration": 5555, + "src": "3229:15:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5662, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5660, + "name": "_getPausableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5566, + "src": "3257:19:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_PausableStorage_$5555_storage_ptr_$", + "typeString": "function () pure returns (struct PausableUpgradeable.PausableStorage storage pointer)" + } + }, + "id": 5661, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3257:21:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3229:49:42" + }, + { + "expression": { + "id": 5667, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5663, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5659, + "src": "3288:1:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage storage pointer" + } + }, + "id": 5665, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3290:7:42", + "memberName": "_paused", + "nodeType": "MemberAccess", + "referencedDeclaration": 5554, + "src": "3288:9:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "74727565", + "id": 5666, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3300:4:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "3288:16:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5668, + "nodeType": "ExpressionStatement", + "src": "3288:16:42" + }, + { + "eventCall": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5670, + "name": "_msgSender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5419, + "src": "3326:10:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 5671, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3326:12:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5669, + "name": "Paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5571, + "src": "3319:6:42", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 5672, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3319:20:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5673, + "nodeType": "EmitStatement", + "src": "3314:25:42" + } + ] + }, + "documentation": { + "id": 5652, + "nodeType": "StructuredDocumentation", + "src": "3041:124:42", + "text": " @dev Triggers stopped state.\n Requirements:\n - The contract must not be paused." + }, + "id": 5675, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5655, + "kind": "modifierInvocation", + "modifierName": { + "id": 5654, + "name": "whenNotPaused", + "nameLocations": ["3205:13:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "3205:13:42" + }, + "nodeType": "ModifierInvocation", + "src": "3205:13:42" + } + ], + "name": "_pause", + "nameLocation": "3179:6:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5653, + "nodeType": "ParameterList", + "parameters": [], + "src": "3185:2:42" + }, + "returnParameters": { + "id": 5656, + "nodeType": "ParameterList", + "parameters": [], + "src": "3219:0:42" + }, + "scope": 5700, + "src": "3170:176:42", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5698, + "nodeType": "Block", + "src": "3526:130:42", + "statements": [ + { + "assignments": [5683], + "declarations": [ + { + "constant": false, + "id": 5683, + "mutability": "mutable", + "name": "$", + "nameLocation": "3560:1:42", + "nodeType": "VariableDeclaration", + "scope": 5698, + "src": "3536:25:42", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + }, + "typeName": { + "id": 5682, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5681, + "name": "PausableStorage", + "nameLocations": ["3536:15:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5555, + "src": "3536:15:42" + }, + "referencedDeclaration": 5555, + "src": "3536:15:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage" + } + }, + "visibility": "internal" + } + ], + "id": 5686, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5684, + "name": "_getPausableStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5566, + "src": "3564:19:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_PausableStorage_$5555_storage_ptr_$", + "typeString": "function () pure returns (struct PausableUpgradeable.PausableStorage storage pointer)" + } + }, + "id": 5685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3564:21:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3536:49:42" + }, + { + "expression": { + "id": 5691, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5687, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5683, + "src": "3595:1:42", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PausableStorage_$5555_storage_ptr", + "typeString": "struct PausableUpgradeable.PausableStorage storage pointer" + } + }, + "id": 5689, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3597:7:42", + "memberName": "_paused", + "nodeType": "MemberAccess", + "referencedDeclaration": 5554, + "src": "3595:9:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "66616c7365", + "id": 5690, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3607:5:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "3595:17:42", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 5692, + "nodeType": "ExpressionStatement", + "src": "3595:17:42" + }, + { + "eventCall": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5694, + "name": "_msgSender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5419, + "src": "3636:10:42", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", + "typeString": "function () view returns (address)" + } + }, + "id": 5695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3636:12:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 5693, + "name": "Unpaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5576, + "src": "3627:8:42", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 5696, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3627:22:42", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5697, + "nodeType": "EmitStatement", + "src": "3622:27:42" + } + ] + }, + "documentation": { + "id": 5676, + "nodeType": "StructuredDocumentation", + "src": "3352:121:42", + "text": " @dev Returns to normal state.\n Requirements:\n - The contract must be paused." + }, + "id": 5699, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5679, + "kind": "modifierInvocation", + "modifierName": { + "id": 5678, + "name": "whenPaused", + "nameLocations": ["3515:10:42"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5598, + "src": "3515:10:42" + }, + "nodeType": "ModifierInvocation", + "src": "3515:10:42" + } + ], + "name": "_unpause", + "nameLocation": "3487:8:42", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5677, + "nodeType": "ParameterList", + "parameters": [], + "src": "3495:2:42" + }, + "returnParameters": { + "id": 5680, + "nodeType": "ParameterList", + "parameters": [], + "src": "3526:0:42" + }, + "scope": 5700, + "src": "3478:178:42", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + } + ], + "scope": 5701, + "src": "701:2957:42", + "usedErrors": [5140, 5143, 5579, 5582], + "usedEvents": [5148, 5571, 5576] + } + ], + "src": "102:3557:42" + }, + "id": 42 + }, + "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol", + "exportedSymbols": { + "EIP712Upgradeable": [6044], + "IERC5267": [6069], + "Initializable": [5391], + "MessageHashUtils": [8317] + }, + "id": 6045, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 5702, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "113:24:43" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol", + "file": "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol", + "id": 5704, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 6045, + "sourceUnit": 8318, + "src": "139:97:43", + "symbolAliases": [ + { + "foreign": { + "id": 5703, + "name": "MessageHashUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8317, + "src": "147:16:43", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts/interfaces/IERC5267.sol", + "file": "@openzeppelin/contracts/interfaces/IERC5267.sol", + "id": 5706, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 6045, + "sourceUnit": 6070, + "src": "237:73:43", + "symbolAliases": [ + { + "foreign": { + "id": 5705, + "name": "IERC5267", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6069, + "src": "245:8:43", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "../../proxy/utils/Initializable.sol", + "id": 5708, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 6045, + "sourceUnit": 5392, + "src": "311:66:43", + "symbolAliases": [ + { + "foreign": { + "id": 5707, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "319:13:43", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 5710, + "name": "Initializable", + "nameLocations": ["1998:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "1998:13:43" + }, + "id": 5711, + "nodeType": "InheritanceSpecifier", + "src": "1998:13:43" + }, + { + "baseName": { + "id": 5712, + "name": "IERC5267", + "nameLocations": ["2013:8:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 6069, + "src": "2013:8:43" + }, + "id": 5713, + "nodeType": "InheritanceSpecifier", + "src": "2013:8:43" + } + ], + "canonicalName": "EIP712Upgradeable", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 5709, + "nodeType": "StructuredDocumentation", + "src": "379:1579:43", + "text": " @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.\n The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\n encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\n does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\n produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\n This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n ({_hashTypedDataV4}).\n The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n the chain id to protect against replay attacks on an eventual fork of the chain.\n NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\n separator from the immutable values, which is cheaper than accessing a cached version in cold storage." + }, + "fullyImplemented": true, + "id": 6044, + "linearizedBaseContracts": [6044, 6069, 5391], + "name": "EIP712Upgradeable", + "nameLocation": "1977:17:43", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "id": 5718, + "mutability": "constant", + "name": "TYPE_HASH", + "nameLocation": "2053:9:43", + "nodeType": "VariableDeclaration", + "scope": 6044, + "src": "2028:140:43", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5714, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2028:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429", + "id": 5716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2083:84:43", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f", + "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"" + }, + "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f", + "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"" + } + ], + "id": 5715, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2073:9:43", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 5717, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2073:95:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "canonicalName": "EIP712Upgradeable.EIP712Storage", + "documentation": { + "id": 5719, + "nodeType": "StructuredDocumentation", + "src": "2175:64:43", + "text": "@custom:storage-location erc7201:openzeppelin.storage.EIP712" + }, + "id": 5730, + "members": [ + { + "constant": false, + "id": 5722, + "mutability": "mutable", + "name": "_hashedName", + "nameLocation": "2332:11:43", + "nodeType": "VariableDeclaration", + "scope": 5730, + "src": "2324:19:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5721, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2324:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5725, + "mutability": "mutable", + "name": "_hashedVersion", + "nameLocation": "2413:14:43", + "nodeType": "VariableDeclaration", + "scope": 5730, + "src": "2405:22:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5724, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2405:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5727, + "mutability": "mutable", + "name": "_name", + "nameLocation": "2445:5:43", + "nodeType": "VariableDeclaration", + "scope": 5730, + "src": "2438:12:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5726, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "2438:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5729, + "mutability": "mutable", + "name": "_version", + "nameLocation": "2467:8:43", + "nodeType": "VariableDeclaration", + "scope": 5730, + "src": "2460:15:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5728, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "2460:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "name": "EIP712Storage", + "nameLocation": "2251:13:43", + "nodeType": "StructDefinition", + "scope": 6044, + "src": "2244:238:43", + "visibility": "public" + }, + { + "constant": true, + "id": 5733, + "mutability": "constant", + "name": "EIP712StorageLocation", + "nameLocation": "2623:21:43", + "nodeType": "VariableDeclaration", + "scope": 6044, + "src": "2598:115:43", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5731, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2598:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "hexValue": "307861313661343664393432363163373531376363386666383966363163306365393335393865336338343938303130313164656536343961366135353764313030", + "id": 5732, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2647:66:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_73010143390315934406010559831118728393600729754696197287367516085911467577600_by_1", + "typeString": "int_const 7301...(69 digits omitted)...7600" + }, + "value": "0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100" + }, + "visibility": "private" + }, + { + "body": { + "id": 5740, + "nodeType": "Block", + "src": "2796:80:43", + "statements": [ + { + "AST": { + "nativeSrc": "2815:55:43", + "nodeType": "YulBlock", + "src": "2815:55:43", + "statements": [ + { + "nativeSrc": "2829:31:43", + "nodeType": "YulAssignment", + "src": "2829:31:43", + "value": { + "name": "EIP712StorageLocation", + "nativeSrc": "2839:21:43", + "nodeType": "YulIdentifier", + "src": "2839:21:43" + }, + "variableNames": [ + { + "name": "$.slot", + "nativeSrc": "2829:6:43", + "nodeType": "YulIdentifier", + "src": "2829:6:43" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 5737, + "isOffset": false, + "isSlot": true, + "src": "2829:6:43", + "suffix": "slot", + "valueSize": 1 + }, + { + "declaration": 5733, + "isOffset": false, + "isSlot": false, + "src": "2839:21:43", + "valueSize": 1 + } + ], + "id": 5739, + "nodeType": "InlineAssembly", + "src": "2806:64:43" + } + ] + }, + "id": 5741, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getEIP712Storage", + "nameLocation": "2729:17:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5734, + "nodeType": "ParameterList", + "parameters": [], + "src": "2746:2:43" + }, + "returnParameters": { + "id": 5738, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5737, + "mutability": "mutable", + "name": "$", + "nameLocation": "2793:1:43", + "nodeType": "VariableDeclaration", + "scope": 5741, + "src": "2771:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5736, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5735, + "name": "EIP712Storage", + "nameLocations": ["2771:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "2771:13:43" + }, + "referencedDeclaration": 5730, + "src": "2771:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "src": "2770:25:43" + }, + "scope": 6044, + "src": "2720:156:43", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 5756, + "nodeType": "Block", + "src": "3538:55:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 5752, + "name": "name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5744, + "src": "3572:4:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 5753, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5746, + "src": "3578:7:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 5751, + "name": "__EIP712_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5797, + "src": "3548:23:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory,string memory)" + } + }, + "id": 5754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3548:38:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5755, + "nodeType": "ExpressionStatement", + "src": "3548:38:43" + } + ] + }, + "documentation": { + "id": 5742, + "nodeType": "StructuredDocumentation", + "src": "2882:559:43", + "text": " @dev Initializes the domain separator and parameter caches.\n The meaning of `name` and `version` is specified in\n https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:\n - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n - `version`: the current major version of the signing domain.\n NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n contract upgrade]." + }, + "id": 5757, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5749, + "kind": "modifierInvocation", + "modifierName": { + "id": 5748, + "name": "onlyInitializing", + "nameLocations": ["3521:16:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "3521:16:43" + }, + "nodeType": "ModifierInvocation", + "src": "3521:16:43" + } + ], + "name": "__EIP712_init", + "nameLocation": "3455:13:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5747, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5744, + "mutability": "mutable", + "name": "name", + "nameLocation": "3483:4:43", + "nodeType": "VariableDeclaration", + "scope": 5757, + "src": "3469:18:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5743, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3469:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5746, + "mutability": "mutable", + "name": "version", + "nameLocation": "3503:7:43", + "nodeType": "VariableDeclaration", + "scope": 5757, + "src": "3489:21:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5745, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3489:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "3468:43:43" + }, + "returnParameters": { + "id": 5750, + "nodeType": "ParameterList", + "parameters": [], + "src": "3538:0:43" + }, + "scope": 6044, + "src": "3446:147:43", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5796, + "nodeType": "Block", + "src": "3701:228:43", + "statements": [ + { + "assignments": [5768], + "declarations": [ + { + "constant": false, + "id": 5768, + "mutability": "mutable", + "name": "$", + "nameLocation": "3733:1:43", + "nodeType": "VariableDeclaration", + "scope": 5796, + "src": "3711:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5767, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5766, + "name": "EIP712Storage", + "nameLocations": ["3711:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "3711:13:43" + }, + "referencedDeclaration": 5730, + "src": "3711:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "id": 5771, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5769, + "name": "_getEIP712Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5741, + "src": "3737:17:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_EIP712Storage_$5730_storage_ptr_$", + "typeString": "function () pure returns (struct EIP712Upgradeable.EIP712Storage storage pointer)" + } + }, + "id": 5770, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3737:19:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3711:45:43" + }, + { + "expression": { + "id": 5776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5772, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5768, + "src": "3766:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5774, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3768:5:43", + "memberName": "_name", + "nodeType": "MemberAccess", + "referencedDeclaration": 5727, + "src": "3766:7:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 5775, + "name": "name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5759, + "src": "3776:4:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "src": "3766:14:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "id": 5777, + "nodeType": "ExpressionStatement", + "src": "3766:14:43" + }, + { + "expression": { + "id": 5782, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5778, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5768, + "src": "3790:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5780, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3792:8:43", + "memberName": "_version", + "nodeType": "MemberAccess", + "referencedDeclaration": 5729, + "src": "3790:10:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 5781, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5761, + "src": "3803:7:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "src": "3790:20:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "id": 5783, + "nodeType": "ExpressionStatement", + "src": "3790:20:43" + }, + { + "expression": { + "id": 5788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5784, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5768, + "src": "3875:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5786, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3877:11:43", + "memberName": "_hashedName", + "nodeType": "MemberAccess", + "referencedDeclaration": 5722, + "src": "3875:13:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "30", + "id": 5787, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3891:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3875:17:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 5789, + "nodeType": "ExpressionStatement", + "src": "3875:17:43" + }, + { + "expression": { + "id": 5794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 5790, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5768, + "src": "3902:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5792, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "3904:14:43", + "memberName": "_hashedVersion", + "nodeType": "MemberAccess", + "referencedDeclaration": 5725, + "src": "3902:16:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "30", + "id": 5793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3921:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3902:20:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 5795, + "nodeType": "ExpressionStatement", + "src": "3902:20:43" + } + ] + }, + "id": 5797, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 5764, + "kind": "modifierInvocation", + "modifierName": { + "id": 5763, + "name": "onlyInitializing", + "nameLocations": ["3684:16:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "3684:16:43" + }, + "nodeType": "ModifierInvocation", + "src": "3684:16:43" + } + ], + "name": "__EIP712_init_unchained", + "nameLocation": "3608:23:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5762, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5759, + "mutability": "mutable", + "name": "name", + "nameLocation": "3646:4:43", + "nodeType": "VariableDeclaration", + "scope": 5797, + "src": "3632:18:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5758, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3632:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5761, + "mutability": "mutable", + "name": "version", + "nameLocation": "3666:7:43", + "nodeType": "VariableDeclaration", + "scope": 5797, + "src": "3652:21:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5760, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3652:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "3631:43:43" + }, + "returnParameters": { + "id": 5765, + "nodeType": "ParameterList", + "parameters": [], + "src": "3701:0:43" + }, + "scope": 6044, + "src": "3599:330:43", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5806, + "nodeType": "Block", + "src": "4077:47:43", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5803, + "name": "_buildDomainSeparator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5830, + "src": "4094:21:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", + "typeString": "function () view returns (bytes32)" + } + }, + "id": 5804, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4094:23:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5802, + "id": 5805, + "nodeType": "Return", + "src": "4087:30:43" + } + ] + }, + "documentation": { + "id": 5798, + "nodeType": "StructuredDocumentation", + "src": "3935:75:43", + "text": " @dev Returns the domain separator for the current chain." + }, + "id": 5807, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_domainSeparatorV4", + "nameLocation": "4024:18:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5799, + "nodeType": "ParameterList", + "parameters": [], + "src": "4042:2:43" + }, + "returnParameters": { + "id": 5802, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5801, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5807, + "src": "4068:7:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5800, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4068:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4067:9:43" + }, + "scope": 6044, + "src": "4015:109:43", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 5829, + "nodeType": "Block", + "src": "4194:127:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 5815, + "name": "TYPE_HASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5718, + "src": "4232:9:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5816, + "name": "_EIP712NameHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5991, + "src": "4243:15:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", + "typeString": "function () view returns (bytes32)" + } + }, + "id": 5817, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4243:17:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5818, + "name": "_EIP712VersionHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6043, + "src": "4262:18:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", + "typeString": "function () view returns (bytes32)" + } + }, + "id": 5819, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4262:20:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 5820, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "4284:5:43", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 5821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4290:7:43", + "memberName": "chainid", + "nodeType": "MemberAccess", + "src": "4284:13:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 5824, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "4307:4:43", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EIP712Upgradeable_$6044", + "typeString": "contract EIP712Upgradeable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_EIP712Upgradeable_$6044", + "typeString": "contract EIP712Upgradeable" + } + ], + "id": 5823, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4299:7:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5822, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4299:7:43", + "typeDescriptions": {} + } + }, + "id": 5825, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4299:13:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 5813, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "4221:3:43", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 5814, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4225:6:43", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "4221:10:43", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 5826, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4221:92:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 5812, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "4211:9:43", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 5827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4211:103:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5811, + "id": 5828, + "nodeType": "Return", + "src": "4204:110:43" + } + ] + }, + "id": 5830, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_buildDomainSeparator", + "nameLocation": "4139:21:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5808, + "nodeType": "ParameterList", + "parameters": [], + "src": "4160:2:43" + }, + "returnParameters": { + "id": 5811, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5810, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5830, + "src": "4185:7:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5809, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4185:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4184:9:43" + }, + "scope": 6044, + "src": "4130:191:43", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 5845, + "nodeType": "Block", + "src": "5032:90:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5840, + "name": "_domainSeparatorV4", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5807, + "src": "5082:18:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$", + "typeString": "function () view returns (bytes32)" + } + }, + "id": 5841, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5082:20:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 5842, + "name": "structHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5833, + "src": "5104:10:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 5838, + "name": "MessageHashUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8317, + "src": "5049:16:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_MessageHashUtils_$8317_$", + "typeString": "type(library MessageHashUtils)" + } + }, + "id": 5839, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5066:15:43", + "memberName": "toTypedDataHash", + "nodeType": "MemberAccess", + "referencedDeclaration": 8316, + "src": "5049:32:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 5843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5049:66:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5837, + "id": 5844, + "nodeType": "Return", + "src": "5042:73:43" + } + ] + }, + "documentation": { + "id": 5831, + "nodeType": "StructuredDocumentation", + "src": "4327:614:43", + "text": " @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n function returns the hash of the fully encoded EIP712 message for this domain.\n This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n ```solidity\n bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n keccak256(\"Mail(address to,string contents)\"),\n mailTo,\n keccak256(bytes(mailContents))\n )));\n address signer = ECDSA.recover(digest, signature);\n ```" + }, + "id": 5846, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_hashTypedDataV4", + "nameLocation": "4955:16:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5834, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5833, + "mutability": "mutable", + "name": "structHash", + "nameLocation": "4980:10:43", + "nodeType": "VariableDeclaration", + "scope": 5846, + "src": "4972:18:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5832, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4972:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4971:20:43" + }, + "returnParameters": { + "id": 5837, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5836, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5846, + "src": "5023:7:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5835, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5023:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5022:9:43" + }, + "scope": 6044, + "src": "4946:176:43", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "baseFunctions": [6068], + "body": { + "id": 5906, + "nodeType": "Block", + "src": "5500:575:43", + "statements": [ + { + "assignments": [5867], + "declarations": [ + { + "constant": false, + "id": 5867, + "mutability": "mutable", + "name": "$", + "nameLocation": "5532:1:43", + "nodeType": "VariableDeclaration", + "scope": 5906, + "src": "5510:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5866, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5865, + "name": "EIP712Storage", + "nameLocations": ["5510:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "5510:13:43" + }, + "referencedDeclaration": 5730, + "src": "5510:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "id": 5870, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5868, + "name": "_getEIP712Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5741, + "src": "5536:17:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_EIP712Storage_$5730_storage_ptr_$", + "typeString": "function () pure returns (struct EIP712Upgradeable.EIP712Storage storage pointer)" + } + }, + "id": 5869, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5536:19:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5510:45:43" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 5880, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 5875, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 5872, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5867, + "src": "5776:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5873, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5778:11:43", + "memberName": "_hashedName", + "nodeType": "MemberAccess", + "referencedDeclaration": 5722, + "src": "5776:13:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 5874, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5793:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5776:18:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 5879, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 5876, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5867, + "src": "5798:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5877, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5800:14:43", + "memberName": "_hashedVersion", + "nodeType": "MemberAccess", + "referencedDeclaration": 5725, + "src": "5798:16:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 5878, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5818:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5798:21:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "5776:43:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "4549503731323a20556e696e697469616c697a6564", + "id": 5881, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5821:23:43", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_2e5045ff73280aa8e8acd8c82710f23812497f87f7f576e2220a2ddd0d45eade", + "typeString": "literal_string \"EIP712: Uninitialized\"" + }, + "value": "EIP712: Uninitialized" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_2e5045ff73280aa8e8acd8c82710f23812497f87f7f576e2220a2ddd0d45eade", + "typeString": "literal_string \"EIP712: Uninitialized\"" + } + ], + "id": 5871, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5768:7:43", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 5882, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5768:77:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 5883, + "nodeType": "ExpressionStatement", + "src": "5768:77:43" + }, + { + "expression": { + "components": [ + { + "hexValue": "0f", + "id": 5884, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "hexString", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5877:7:43", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_3d725c5ee53025f027da36bea8d3af3b6a3e9d2d1542d47c162631de48e66c1c", + "typeString": "literal_string hex\"0f\"" + }, + "value": "\u000f" + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5885, + "name": "_EIP712Name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5923, + "src": "5907:11:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_string_memory_ptr_$", + "typeString": "function () view returns (string memory)" + } + }, + "id": 5886, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5907:13:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5887, + "name": "_EIP712Version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5939, + "src": "5934:14:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_string_memory_ptr_$", + "typeString": "function () view returns (string memory)" + } + }, + "id": 5888, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5934:16:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "expression": { + "id": 5889, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "5964:5:43", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 5890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5970:7:43", + "memberName": "chainid", + "nodeType": "MemberAccess", + "src": "5964:13:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 5893, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "5999:4:43", + "typeDescriptions": { + "typeIdentifier": "t_contract$_EIP712Upgradeable_$6044", + "typeString": "contract EIP712Upgradeable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_EIP712Upgradeable_$6044", + "typeString": "contract EIP712Upgradeable" + } + ], + "id": 5892, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5991:7:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 5891, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5991:7:43", + "typeDescriptions": {} + } + }, + "id": 5894, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5991:13:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 5897, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6026:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 5896, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6018:7:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 5895, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6018:7:43", + "typeDescriptions": {} + } + }, + "id": 5898, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6018:10:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 5902, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6056:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 5901, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "6042:13:43", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$", + "typeString": "function (uint256) pure returns (uint256[] memory)" + }, + "typeName": { + "baseType": { + "id": 5899, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6046:7:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 5900, + "nodeType": "ArrayTypeName", + "src": "6046:9:43", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + } + }, + "id": 5903, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6042:16:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[] memory" + } + } + ], + "id": 5904, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5863:205:43", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_stringliteral_3d725c5ee53025f027da36bea8d3af3b6a3e9d2d1542d47c162631de48e66c1c_$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint256_$_t_address_$_t_bytes32_$_t_array$_t_uint256_$dyn_memory_ptr_$", + "typeString": "tuple(literal_string hex\"0f\",string memory,string memory,uint256,address,bytes32,uint256[] memory)" + } + }, + "functionReturnParameters": 5864, + "id": 5905, + "nodeType": "Return", + "src": "5856:212:43" + } + ] + }, + "documentation": { + "id": 5847, + "nodeType": "StructuredDocumentation", + "src": "5128:39:43", + "text": " @inheritdoc IERC5267" + }, + "functionSelector": "84b0196e", + "id": 5907, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "eip712Domain", + "nameLocation": "5181:12:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5848, + "nodeType": "ParameterList", + "parameters": [], + "src": "5193:2:43" + }, + "returnParameters": { + "id": 5864, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5850, + "mutability": "mutable", + "name": "fields", + "nameLocation": "5277:6:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5270:13:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 5849, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "5270:6:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5852, + "mutability": "mutable", + "name": "name", + "nameLocation": "5311:4:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5297:18:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5851, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5297:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5854, + "mutability": "mutable", + "name": "version", + "nameLocation": "5343:7:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5329:21:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5853, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5329:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5856, + "mutability": "mutable", + "name": "chainId", + "nameLocation": "5372:7:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5364:15:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 5855, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5364:7:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5858, + "mutability": "mutable", + "name": "verifyingContract", + "nameLocation": "5401:17:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5393:25:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 5857, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5393:7:43", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5860, + "mutability": "mutable", + "name": "salt", + "nameLocation": "5440:4:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5432:12:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5859, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5432:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5863, + "mutability": "mutable", + "name": "extensions", + "nameLocation": "5475:10:43", + "nodeType": "VariableDeclaration", + "scope": 5907, + "src": "5458:27:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 5861, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5458:7:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 5862, + "nodeType": "ArrayTypeName", + "src": "5458:9:43", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "visibility": "internal" + } + ], + "src": "5256:239:43" + }, + "scope": 6044, + "src": "5172:903:43", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 5922, + "nodeType": "Block", + "src": "6368:86:43", + "statements": [ + { + "assignments": [5915], + "declarations": [ + { + "constant": false, + "id": 5915, + "mutability": "mutable", + "name": "$", + "nameLocation": "6400:1:43", + "nodeType": "VariableDeclaration", + "scope": 5922, + "src": "6378:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5914, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5913, + "name": "EIP712Storage", + "nameLocations": ["6378:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "6378:13:43" + }, + "referencedDeclaration": 5730, + "src": "6378:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "id": 5918, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5916, + "name": "_getEIP712Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5741, + "src": "6404:17:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_EIP712Storage_$5730_storage_ptr_$", + "typeString": "function () pure returns (struct EIP712Upgradeable.EIP712Storage storage pointer)" + } + }, + "id": 5917, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6404:19:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6378:45:43" + }, + { + "expression": { + "expression": { + "id": 5919, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5915, + "src": "6440:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5920, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6442:5:43", + "memberName": "_name", + "nodeType": "MemberAccess", + "referencedDeclaration": 5727, + "src": "6440:7:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "functionReturnParameters": 5912, + "id": 5921, + "nodeType": "Return", + "src": "6433:14:43" + } + ] + }, + "documentation": { + "id": 5908, + "nodeType": "StructuredDocumentation", + "src": "6081:213:43", + "text": " @dev The name parameter for the EIP712 domain.\n NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n are a concern." + }, + "id": 5923, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_EIP712Name", + "nameLocation": "6308:11:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5909, + "nodeType": "ParameterList", + "parameters": [], + "src": "6319:2:43" + }, + "returnParameters": { + "id": 5912, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5911, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5923, + "src": "6353:13:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5910, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6353:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "6352:15:43" + }, + "scope": 6044, + "src": "6299:155:43", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5938, + "nodeType": "Block", + "src": "6753:89:43", + "statements": [ + { + "assignments": [5931], + "declarations": [ + { + "constant": false, + "id": 5931, + "mutability": "mutable", + "name": "$", + "nameLocation": "6785:1:43", + "nodeType": "VariableDeclaration", + "scope": 5938, + "src": "6763:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5930, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5929, + "name": "EIP712Storage", + "nameLocations": ["6763:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "6763:13:43" + }, + "referencedDeclaration": 5730, + "src": "6763:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "id": 5934, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5932, + "name": "_getEIP712Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5741, + "src": "6789:17:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_EIP712Storage_$5730_storage_ptr_$", + "typeString": "function () pure returns (struct EIP712Upgradeable.EIP712Storage storage pointer)" + } + }, + "id": 5933, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6789:19:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6763:45:43" + }, + { + "expression": { + "expression": { + "id": 5935, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5931, + "src": "6825:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5936, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6827:8:43", + "memberName": "_version", + "nodeType": "MemberAccess", + "referencedDeclaration": 5729, + "src": "6825:10:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "functionReturnParameters": 5928, + "id": 5937, + "nodeType": "Return", + "src": "6818:17:43" + } + ] + }, + "documentation": { + "id": 5924, + "nodeType": "StructuredDocumentation", + "src": "6460:216:43", + "text": " @dev The version parameter for the EIP712 domain.\n NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n are a concern." + }, + "id": 5939, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_EIP712Version", + "nameLocation": "6690:14:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5925, + "nodeType": "ParameterList", + "parameters": [], + "src": "6704:2:43" + }, + "returnParameters": { + "id": 5928, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5927, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5939, + "src": "6738:13:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5926, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6738:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "6737:15:43" + }, + "scope": 6044, + "src": "6681:161:43", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "body": { + "id": 5990, + "nodeType": "Block", + "src": "7116:628:43", + "statements": [ + { + "assignments": [5947], + "declarations": [ + { + "constant": false, + "id": 5947, + "mutability": "mutable", + "name": "$", + "nameLocation": "7148:1:43", + "nodeType": "VariableDeclaration", + "scope": 5990, + "src": "7126:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5946, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5945, + "name": "EIP712Storage", + "nameLocations": ["7126:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "7126:13:43" + }, + "referencedDeclaration": 5730, + "src": "7126:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "id": 5950, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5948, + "name": "_getEIP712Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5741, + "src": "7152:17:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_EIP712Storage_$5730_storage_ptr_$", + "typeString": "function () pure returns (struct EIP712Upgradeable.EIP712Storage storage pointer)" + } + }, + "id": 5949, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7152:19:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7126:45:43" + }, + { + "assignments": [5952], + "declarations": [ + { + "constant": false, + "id": 5952, + "mutability": "mutable", + "name": "name", + "nameLocation": "7195:4:43", + "nodeType": "VariableDeclaration", + "scope": 5990, + "src": "7181:18:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 5951, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "7181:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "id": 5955, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 5953, + "name": "_EIP712Name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5923, + "src": "7202:11:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_string_memory_ptr_$", + "typeString": "function () view returns (string memory)" + } + }, + "id": 5954, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7202:13:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7181:34:43" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 5962, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 5958, + "name": "name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5952, + "src": "7235:4:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 5957, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7229:5:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 5956, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "7229:5:43", + "typeDescriptions": {} + } + }, + "id": 5959, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7229:11:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 5960, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7241:6:43", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "7229:18:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 5961, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7250:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7229:22:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 5988, + "nodeType": "Block", + "src": "7313:425:43", + "statements": [ + { + "assignments": [5972], + "declarations": [ + { + "constant": false, + "id": 5972, + "mutability": "mutable", + "name": "hashedName", + "nameLocation": "7558:10:43", + "nodeType": "VariableDeclaration", + "scope": 5988, + "src": "7550:18:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5971, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7550:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 5975, + "initialValue": { + "expression": { + "id": 5973, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5947, + "src": "7571:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 5974, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7573:11:43", + "memberName": "_hashedName", + "nodeType": "MemberAccess", + "referencedDeclaration": 5722, + "src": "7571:13:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7550:34:43" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 5978, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 5976, + "name": "hashedName", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5972, + "src": "7602:10:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 5977, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7616:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7602:15:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 5986, + "nodeType": "Block", + "src": "7675:53:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "hexValue": "", + "id": 5983, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7710:2:43", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "id": 5982, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "7700:9:43", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 5984, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7700:13:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5944, + "id": 5985, + "nodeType": "Return", + "src": "7693:20:43" + } + ] + }, + "id": 5987, + "nodeType": "IfStatement", + "src": "7598:130:43", + "trueBody": { + "id": 5981, + "nodeType": "Block", + "src": "7619:50:43", + "statements": [ + { + "expression": { + "id": 5979, + "name": "hashedName", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5972, + "src": "7644:10:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5944, + "id": 5980, + "nodeType": "Return", + "src": "7637:17:43" + } + ] + } + } + ] + }, + "id": 5989, + "nodeType": "IfStatement", + "src": "7225:513:43", + "trueBody": { + "id": 5970, + "nodeType": "Block", + "src": "7253:54:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 5966, + "name": "name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5952, + "src": "7290:4:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 5965, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7284:5:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 5964, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "7284:5:43", + "typeDescriptions": {} + } + }, + "id": 5967, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7284:11:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 5963, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "7274:9:43", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 5968, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7274:22:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5944, + "id": 5969, + "nodeType": "Return", + "src": "7267:29:43" + } + ] + } + } + ] + }, + "documentation": { + "id": 5940, + "nodeType": "StructuredDocumentation", + "src": "6848:204:43", + "text": " @dev The hash of the name parameter for the EIP712 domain.\n NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead." + }, + "id": 5991, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_EIP712NameHash", + "nameLocation": "7066:15:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5941, + "nodeType": "ParameterList", + "parameters": [], + "src": "7081:2:43" + }, + "returnParameters": { + "id": 5944, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5943, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 5991, + "src": "7107:7:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5942, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7107:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "7106:9:43" + }, + "scope": 6044, + "src": "7057:687:43", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6042, + "nodeType": "Block", + "src": "8027:661:43", + "statements": [ + { + "assignments": [5999], + "declarations": [ + { + "constant": false, + "id": 5999, + "mutability": "mutable", + "name": "$", + "nameLocation": "8059:1:43", + "nodeType": "VariableDeclaration", + "scope": 6042, + "src": "8037:23:43", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + }, + "typeName": { + "id": 5998, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 5997, + "name": "EIP712Storage", + "nameLocations": ["8037:13:43"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5730, + "src": "8037:13:43" + }, + "referencedDeclaration": 5730, + "src": "8037:13:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage" + } + }, + "visibility": "internal" + } + ], + "id": 6002, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6000, + "name": "_getEIP712Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5741, + "src": "8063:17:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_struct$_EIP712Storage_$5730_storage_ptr_$", + "typeString": "function () pure returns (struct EIP712Upgradeable.EIP712Storage storage pointer)" + } + }, + "id": 6001, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8063:19:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8037:45:43" + }, + { + "assignments": [6004], + "declarations": [ + { + "constant": false, + "id": 6004, + "mutability": "mutable", + "name": "version", + "nameLocation": "8106:7:43", + "nodeType": "VariableDeclaration", + "scope": 6042, + "src": "8092:21:43", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6003, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "8092:6:43", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "id": 6007, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6005, + "name": "_EIP712Version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5939, + "src": "8116:14:43", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_string_memory_ptr_$", + "typeString": "function () view returns (string memory)" + } + }, + "id": 6006, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8116:16:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8092:40:43" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6014, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 6010, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6004, + "src": "8152:7:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6009, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8146:5:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6008, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8146:5:43", + "typeDescriptions": {} + } + }, + "id": 6011, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8146:14:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6012, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8161:6:43", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "8146:21:43", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 6013, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8170:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "8146:25:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6040, + "nodeType": "Block", + "src": "8236:446:43", + "statements": [ + { + "assignments": [6024], + "declarations": [ + { + "constant": false, + "id": 6024, + "mutability": "mutable", + "name": "hashedVersion", + "nameLocation": "8490:13:43", + "nodeType": "VariableDeclaration", + "scope": 6040, + "src": "8482:21:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 6023, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8482:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 6027, + "initialValue": { + "expression": { + "id": 6025, + "name": "$", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5999, + "src": "8506:1:43", + "typeDescriptions": { + "typeIdentifier": "t_struct$_EIP712Storage_$5730_storage_ptr", + "typeString": "struct EIP712Upgradeable.EIP712Storage storage pointer" + } + }, + "id": 6026, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8508:14:43", + "memberName": "_hashedVersion", + "nodeType": "MemberAccess", + "referencedDeclaration": 5725, + "src": "8506:16:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8482:40:43" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 6030, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6028, + "name": "hashedVersion", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6024, + "src": "8540:13:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 6029, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8557:1:43", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "8540:18:43", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6038, + "nodeType": "Block", + "src": "8619:53:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "hexValue": "", + "id": 6035, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8654:2:43", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "id": 6034, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "8644:9:43", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 6036, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8644:13:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5996, + "id": 6037, + "nodeType": "Return", + "src": "8637:20:43" + } + ] + }, + "id": 6039, + "nodeType": "IfStatement", + "src": "8536:136:43", + "trueBody": { + "id": 6033, + "nodeType": "Block", + "src": "8560:53:43", + "statements": [ + { + "expression": { + "id": 6031, + "name": "hashedVersion", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6024, + "src": "8585:13:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5996, + "id": 6032, + "nodeType": "Return", + "src": "8578:20:43" + } + ] + } + } + ] + }, + "id": 6041, + "nodeType": "IfStatement", + "src": "8142:540:43", + "trueBody": { + "id": 6022, + "nodeType": "Block", + "src": "8173:57:43", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 6018, + "name": "version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6004, + "src": "8210:7:43", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6017, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8204:5:43", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6016, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8204:5:43", + "typeDescriptions": {} + } + }, + "id": 6019, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8204:14:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6015, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "8194:9:43", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 6020, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8194:25:43", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 5996, + "id": 6021, + "nodeType": "Return", + "src": "8187:32:43" + } + ] + } + } + ] + }, + "documentation": { + "id": 5992, + "nodeType": "StructuredDocumentation", + "src": "7750:210:43", + "text": " @dev The hash of the version parameter for the EIP712 domain.\n NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead." + }, + "id": 6043, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_EIP712VersionHash", + "nameLocation": "7974:18:43", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 5993, + "nodeType": "ParameterList", + "parameters": [], + "src": "7992:2:43" + }, + "returnParameters": { + "id": 5996, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5995, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6043, + "src": "8018:7:43", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 5994, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8018:7:43", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "8017:9:43" + }, + "scope": 6044, + "src": "7965:723:43", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 6045, + "src": "1959:6731:43", + "usedErrors": [5140, 5143], + "usedEvents": [5148, 6049] + } + ], + "src": "113:8578:43" + }, + "id": 43 + }, + "@openzeppelin/contracts/interfaces/IERC5267.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/interfaces/IERC5267.sol", + "exportedSymbols": { + "IERC5267": [6069] + }, + "id": 6070, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6046, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "107:24:44" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IERC5267", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 6069, + "linearizedBaseContracts": [6069], + "name": "IERC5267", + "nameLocation": "143:8:44", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 6047, + "nodeType": "StructuredDocumentation", + "src": "158:84:44", + "text": " @dev MAY be emitted to signal that the domain could have changed." + }, + "eventSelector": "0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31", + "id": 6049, + "name": "EIP712DomainChanged", + "nameLocation": "253:19:44", + "nodeType": "EventDefinition", + "parameters": { + "id": 6048, + "nodeType": "ParameterList", + "parameters": [], + "src": "272:2:44" + }, + "src": "247:28:44" + }, + { + "documentation": { + "id": 6050, + "nodeType": "StructuredDocumentation", + "src": "281:140:44", + "text": " @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n signature." + }, + "functionSelector": "84b0196e", + "id": 6068, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "eip712Domain", + "nameLocation": "435:12:44", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6051, + "nodeType": "ParameterList", + "parameters": [], + "src": "447:2:44" + }, + "returnParameters": { + "id": 6067, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6053, + "mutability": "mutable", + "name": "fields", + "nameLocation": "517:6:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "510:13:44", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 6052, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "510:6:44", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6055, + "mutability": "mutable", + "name": "name", + "nameLocation": "551:4:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "537:18:44", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6054, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "537:6:44", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6057, + "mutability": "mutable", + "name": "version", + "nameLocation": "583:7:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "569:21:44", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6056, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "569:6:44", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6059, + "mutability": "mutable", + "name": "chainId", + "nameLocation": "612:7:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "604:15:44", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6058, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "604:7:44", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6061, + "mutability": "mutable", + "name": "verifyingContract", + "nameLocation": "641:17:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "633:25:44", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6060, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "633:7:44", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6063, + "mutability": "mutable", + "name": "salt", + "nameLocation": "680:4:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "672:12:44", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 6062, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "672:7:44", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6066, + "mutability": "mutable", + "name": "extensions", + "nameLocation": "715:10:44", + "nodeType": "VariableDeclaration", + "scope": 6068, + "src": "698:27:44", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 6064, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "698:7:44", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6065, + "nodeType": "ArrayTypeName", + "src": "698:9:44", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "visibility": "internal" + } + ], + "src": "496:239:44" + }, + "scope": 6069, + "src": "426:310:44", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 6070, + "src": "133:605:44", + "usedErrors": [], + "usedEvents": [6049] + } + ], + "src": "107:632:44" + }, + "id": 44 + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol", + "exportedSymbols": { + "IERC20": [6147] + }, + "id": 6148, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6071, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "106:24:45" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IERC20", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 6072, + "nodeType": "StructuredDocumentation", + "src": "132:71:45", + "text": " @dev Interface of the ERC-20 standard as defined in the ERC." + }, + "fullyImplemented": false, + "id": 6147, + "linearizedBaseContracts": [6147], + "name": "IERC20", + "nameLocation": "214:6:45", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": { + "id": 6073, + "nodeType": "StructuredDocumentation", + "src": "227:158:45", + "text": " @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero." + }, + "eventSelector": "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "id": 6081, + "name": "Transfer", + "nameLocation": "396:8:45", + "nodeType": "EventDefinition", + "parameters": { + "id": 6080, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6075, + "indexed": true, + "mutability": "mutable", + "name": "from", + "nameLocation": "421:4:45", + "nodeType": "VariableDeclaration", + "scope": 6081, + "src": "405:20:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6074, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "405:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6077, + "indexed": true, + "mutability": "mutable", + "name": "to", + "nameLocation": "443:2:45", + "nodeType": "VariableDeclaration", + "scope": 6081, + "src": "427:18:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6076, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "427:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6079, + "indexed": false, + "mutability": "mutable", + "name": "value", + "nameLocation": "455:5:45", + "nodeType": "VariableDeclaration", + "scope": 6081, + "src": "447:13:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6078, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "447:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "404:57:45" + }, + "src": "390:72:45" + }, + { + "anonymous": false, + "documentation": { + "id": 6082, + "nodeType": "StructuredDocumentation", + "src": "468:148:45", + "text": " @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance." + }, + "eventSelector": "8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "id": 6090, + "name": "Approval", + "nameLocation": "627:8:45", + "nodeType": "EventDefinition", + "parameters": { + "id": 6089, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6084, + "indexed": true, + "mutability": "mutable", + "name": "owner", + "nameLocation": "652:5:45", + "nodeType": "VariableDeclaration", + "scope": 6090, + "src": "636:21:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6083, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "636:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6086, + "indexed": true, + "mutability": "mutable", + "name": "spender", + "nameLocation": "675:7:45", + "nodeType": "VariableDeclaration", + "scope": 6090, + "src": "659:23:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6085, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "659:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6088, + "indexed": false, + "mutability": "mutable", + "name": "value", + "nameLocation": "692:5:45", + "nodeType": "VariableDeclaration", + "scope": 6090, + "src": "684:13:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6087, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "684:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "635:63:45" + }, + "src": "621:78:45" + }, + { + "documentation": { + "id": 6091, + "nodeType": "StructuredDocumentation", + "src": "705:65:45", + "text": " @dev Returns the value of tokens in existence." + }, + "functionSelector": "18160ddd", + "id": 6096, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "totalSupply", + "nameLocation": "784:11:45", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6092, + "nodeType": "ParameterList", + "parameters": [], + "src": "795:2:45" + }, + "returnParameters": { + "id": 6095, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6094, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6096, + "src": "821:7:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6093, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "821:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "820:9:45" + }, + "scope": 6147, + "src": "775:55:45", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 6097, + "nodeType": "StructuredDocumentation", + "src": "836:71:45", + "text": " @dev Returns the value of tokens owned by `account`." + }, + "functionSelector": "70a08231", + "id": 6104, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "balanceOf", + "nameLocation": "921:9:45", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6100, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6099, + "mutability": "mutable", + "name": "account", + "nameLocation": "939:7:45", + "nodeType": "VariableDeclaration", + "scope": 6104, + "src": "931:15:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6098, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "931:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "930:17:45" + }, + "returnParameters": { + "id": 6103, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6102, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6104, + "src": "971:7:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6101, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "971:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "970:9:45" + }, + "scope": 6147, + "src": "912:68:45", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 6105, + "nodeType": "StructuredDocumentation", + "src": "986:213:45", + "text": " @dev Moves a `value` amount of tokens from the caller's account to `to`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event." + }, + "functionSelector": "a9059cbb", + "id": 6114, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "transfer", + "nameLocation": "1213:8:45", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6110, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6107, + "mutability": "mutable", + "name": "to", + "nameLocation": "1230:2:45", + "nodeType": "VariableDeclaration", + "scope": 6114, + "src": "1222:10:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6106, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1222:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6109, + "mutability": "mutable", + "name": "value", + "nameLocation": "1242:5:45", + "nodeType": "VariableDeclaration", + "scope": 6114, + "src": "1234:13:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6108, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1234:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1221:27:45" + }, + "returnParameters": { + "id": 6113, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6112, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6114, + "src": "1267:4:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6111, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1267:4:45", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1266:6:45" + }, + "scope": 6147, + "src": "1204:69:45", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 6115, + "nodeType": "StructuredDocumentation", + "src": "1279:264:45", + "text": " @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called." + }, + "functionSelector": "dd62ed3e", + "id": 6124, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "allowance", + "nameLocation": "1557:9:45", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6120, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6117, + "mutability": "mutable", + "name": "owner", + "nameLocation": "1575:5:45", + "nodeType": "VariableDeclaration", + "scope": 6124, + "src": "1567:13:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6116, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1567:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6119, + "mutability": "mutable", + "name": "spender", + "nameLocation": "1590:7:45", + "nodeType": "VariableDeclaration", + "scope": 6124, + "src": "1582:15:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6118, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1582:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1566:32:45" + }, + "returnParameters": { + "id": 6123, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6122, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6124, + "src": "1622:7:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6121, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1622:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1621:9:45" + }, + "scope": 6147, + "src": "1548:83:45", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 6125, + "nodeType": "StructuredDocumentation", + "src": "1637:667:45", + "text": " @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event." + }, + "functionSelector": "095ea7b3", + "id": 6134, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "approve", + "nameLocation": "2318:7:45", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6130, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6127, + "mutability": "mutable", + "name": "spender", + "nameLocation": "2334:7:45", + "nodeType": "VariableDeclaration", + "scope": 6134, + "src": "2326:15:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6126, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2326:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6129, + "mutability": "mutable", + "name": "value", + "nameLocation": "2351:5:45", + "nodeType": "VariableDeclaration", + "scope": 6134, + "src": "2343:13:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6128, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2343:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2325:32:45" + }, + "returnParameters": { + "id": 6133, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6132, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6134, + "src": "2376:4:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6131, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2376:4:45", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2375:6:45" + }, + "scope": 6147, + "src": "2309:73:45", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 6135, + "nodeType": "StructuredDocumentation", + "src": "2388:297:45", + "text": " @dev Moves a `value` amount of tokens from `from` to `to` using the\n allowance mechanism. `value` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event." + }, + "functionSelector": "23b872dd", + "id": 6146, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "transferFrom", + "nameLocation": "2699:12:45", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6142, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6137, + "mutability": "mutable", + "name": "from", + "nameLocation": "2720:4:45", + "nodeType": "VariableDeclaration", + "scope": 6146, + "src": "2712:12:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6136, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2712:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6139, + "mutability": "mutable", + "name": "to", + "nameLocation": "2734:2:45", + "nodeType": "VariableDeclaration", + "scope": 6146, + "src": "2726:10:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6138, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2726:7:45", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6141, + "mutability": "mutable", + "name": "value", + "nameLocation": "2746:5:45", + "nodeType": "VariableDeclaration", + "scope": 6146, + "src": "2738:13:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6140, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2738:7:45", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2711:41:45" + }, + "returnParameters": { + "id": 6145, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6144, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6146, + "src": "2771:4:45", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6143, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2771:4:45", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2770:6:45" + }, + "scope": 6147, + "src": "2690:87:45", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 6148, + "src": "204:2575:45", + "usedErrors": [], + "usedEvents": [6081, 6090] + } + ], + "src": "106:2674:45" + }, + "id": 45 + }, + "@openzeppelin/contracts/utils/Address.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/Address.sol", + "exportedSymbols": { + "Address": [6407], + "Errors": [6429] + }, + "id": 6408, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6149, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "101:24:46" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/Errors.sol", + "file": "./Errors.sol", + "id": 6151, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 6408, + "sourceUnit": 6430, + "src": "127:36:46", + "symbolAliases": [ + { + "foreign": { + "id": 6150, + "name": "Errors", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6429, + "src": "135:6:46", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Address", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 6152, + "nodeType": "StructuredDocumentation", + "src": "165:67:46", + "text": " @dev Collection of functions related to the address type" + }, + "fullyImplemented": true, + "id": 6407, + "linearizedBaseContracts": [6407], + "name": "Address", + "nameLocation": "241:7:46", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 6153, + "nodeType": "StructuredDocumentation", + "src": "255:75:46", + "text": " @dev There's no code at `target` (it is not a contract)." + }, + "errorSelector": "9996b315", + "id": 6157, + "name": "AddressEmptyCode", + "nameLocation": "341:16:46", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6156, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6155, + "mutability": "mutable", + "name": "target", + "nameLocation": "366:6:46", + "nodeType": "VariableDeclaration", + "scope": 6157, + "src": "358:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6154, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "358:7:46", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "357:16:46" + }, + "src": "335:39:46" + }, + { + "body": { + "id": 6204, + "nodeType": "Block", + "src": "1361:294:46", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 6167, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "1383:4:46", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + ], + "id": 6166, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1375:7:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6165, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1375:7:46", + "typeDescriptions": {} + } + }, + "id": 6168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1375:13:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6169, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1389:7:46", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "1375:21:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 6170, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6162, + "src": "1399:6:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1375:30:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6184, + "nodeType": "IfStatement", + "src": "1371:125:46", + "trueBody": { + "id": 6183, + "nodeType": "Block", + "src": "1407:89:46", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 6177, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "1463:4:46", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + ], + "id": 6176, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1455:7:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6175, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1455:7:46", + "typeDescriptions": {} + } + }, + "id": 6178, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1455:13:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6179, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1469:7:46", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "1455:21:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 6180, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6162, + "src": "1478:6:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 6172, + "name": "Errors", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6429, + "src": "1428:6:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Errors_$6429_$", + "typeString": "type(library Errors)" + } + }, + "id": 6174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1435:19:46", + "memberName": "InsufficientBalance", + "nodeType": "MemberAccess", + "referencedDeclaration": 6417, + "src": "1428:26:46", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 6181, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1428:57:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 6182, + "nodeType": "RevertStatement", + "src": "1421:64:46" + } + ] + } + }, + { + "assignments": [6186, 6188], + "declarations": [ + { + "constant": false, + "id": 6186, + "mutability": "mutable", + "name": "success", + "nameLocation": "1512:7:46", + "nodeType": "VariableDeclaration", + "scope": 6204, + "src": "1507:12:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6185, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1507:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6188, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "1534:10:46", + "nodeType": "VariableDeclaration", + "scope": 6204, + "src": "1521:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6187, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1521:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6195, + "initialValue": { + "arguments": [ + { + "hexValue": "", + "id": 6193, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1578:2:46", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + } + ], + "expression": { + "id": 6189, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6160, + "src": "1548:9:46", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 6190, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1558:4:46", + "memberName": "call", + "nodeType": "MemberAccess", + "src": "1548:14:46", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 6192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "names": ["value"], + "nodeType": "FunctionCallOptions", + "options": [ + { + "id": 6191, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6162, + "src": "1570:6:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "src": "1548:29:46", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 6194, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1548:33:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1506:75:46" + }, + { + "condition": { + "id": 6197, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1595:8:46", + "subExpression": { + "id": 6196, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6186, + "src": "1596:7:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6203, + "nodeType": "IfStatement", + "src": "1591:58:46", + "trueBody": { + "id": 6202, + "nodeType": "Block", + "src": "1605:44:46", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6199, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6188, + "src": "1627:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6198, + "name": "_revert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6406, + "src": "1619:7:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes memory) pure" + } + }, + "id": 6200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1619:19:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6201, + "nodeType": "ExpressionStatement", + "src": "1619:19:46" + } + ] + } + } + ] + }, + "documentation": { + "id": 6158, + "nodeType": "StructuredDocumentation", + "src": "380:905:46", + "text": " @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n `recipient`, forwarding all available gas and reverting on errors.\n https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n of certain opcodes, possibly making contracts go over the 2300 gas limit\n imposed by `transfer`, making them unable to receive funds via\n `transfer`. {sendValue} removes this limitation.\n https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n IMPORTANT: because control is transferred to `recipient`, care must be\n taken to not create reentrancy vulnerabilities. Consider using\n {ReentrancyGuard} or the\n https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]." + }, + "id": 6205, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sendValue", + "nameLocation": "1299:9:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6163, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6160, + "mutability": "mutable", + "name": "recipient", + "nameLocation": "1325:9:46", + "nodeType": "VariableDeclaration", + "scope": 6205, + "src": "1309:25:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + "typeName": { + "id": 6159, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1309:15:46", + "stateMutability": "payable", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6162, + "mutability": "mutable", + "name": "amount", + "nameLocation": "1344:6:46", + "nodeType": "VariableDeclaration", + "scope": 6205, + "src": "1336:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6161, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1336:7:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1308:43:46" + }, + "returnParameters": { + "id": 6164, + "nodeType": "ParameterList", + "parameters": [], + "src": "1361:0:46" + }, + "scope": 6407, + "src": "1290:365:46", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6221, + "nodeType": "Block", + "src": "2589:62:46", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6216, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6208, + "src": "2628:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6217, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6210, + "src": "2636:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "hexValue": "30", + "id": 6218, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2642:1:46", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 6215, + "name": "functionCallWithValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6272, + "src": "2606:21:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (address,bytes memory,uint256) returns (bytes memory)" + } + }, + "id": 6219, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2606:38:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 6214, + "id": 6220, + "nodeType": "Return", + "src": "2599:45:46" + } + ] + }, + "documentation": { + "id": 6206, + "nodeType": "StructuredDocumentation", + "src": "1661:834:46", + "text": " @dev Performs a Solidity function call using a low level `call`. A\n plain `call` is an unsafe replacement for a function call: use this\n function instead.\n If `target` reverts with a revert reason or custom error, it is bubbled\n up by this function (like regular Solidity function calls). However, if\n the call reverted with no returned reason, this function reverts with a\n {Errors.FailedCall} error.\n Returns the raw returned data. To convert to the expected return value,\n use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n Requirements:\n - `target` must be a contract.\n - calling `target` with `data` must not revert." + }, + "id": 6222, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "functionCall", + "nameLocation": "2509:12:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6211, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6208, + "mutability": "mutable", + "name": "target", + "nameLocation": "2530:6:46", + "nodeType": "VariableDeclaration", + "scope": 6222, + "src": "2522:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6207, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2522:7:46", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6210, + "mutability": "mutable", + "name": "data", + "nameLocation": "2551:4:46", + "nodeType": "VariableDeclaration", + "scope": 6222, + "src": "2538:17:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6209, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2538:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2521:35:46" + }, + "returnParameters": { + "id": 6214, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6213, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6222, + "src": "2575:12:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6212, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2575:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2574:14:46" + }, + "scope": 6407, + "src": "2500:151:46", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6271, + "nodeType": "Block", + "src": "3088:294:46", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6240, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 6236, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "3110:4:46", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + ], + "id": 6235, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3102:7:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6234, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3102:7:46", + "typeDescriptions": {} + } + }, + "id": 6237, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3102:13:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6238, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3116:7:46", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "3102:21:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 6239, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6229, + "src": "3126:5:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3102:29:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6253, + "nodeType": "IfStatement", + "src": "3098:123:46", + "trueBody": { + "id": 6252, + "nodeType": "Block", + "src": "3133:88:46", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 6246, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "3189:4:46", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Address_$6407", + "typeString": "library Address" + } + ], + "id": 6245, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3181:7:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 6244, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3181:7:46", + "typeDescriptions": {} + } + }, + "id": 6247, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3181:13:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6248, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3195:7:46", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "3181:21:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 6249, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6229, + "src": "3204:5:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 6241, + "name": "Errors", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6429, + "src": "3154:6:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Errors_$6429_$", + "typeString": "type(library Errors)" + } + }, + "id": 6243, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3161:19:46", + "memberName": "InsufficientBalance", + "nodeType": "MemberAccess", + "referencedDeclaration": 6417, + "src": "3154:26:46", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 6250, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3154:56:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 6251, + "nodeType": "RevertStatement", + "src": "3147:63:46" + } + ] + } + }, + { + "assignments": [6255, 6257], + "declarations": [ + { + "constant": false, + "id": 6255, + "mutability": "mutable", + "name": "success", + "nameLocation": "3236:7:46", + "nodeType": "VariableDeclaration", + "scope": 6271, + "src": "3231:12:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6254, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3231:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6257, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "3258:10:46", + "nodeType": "VariableDeclaration", + "scope": 6271, + "src": "3245:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6256, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3245:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6264, + "initialValue": { + "arguments": [ + { + "id": 6262, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6227, + "src": "3298:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 6258, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6225, + "src": "3272:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3279:4:46", + "memberName": "call", + "nodeType": "MemberAccess", + "src": "3272:11:46", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 6261, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "names": ["value"], + "nodeType": "FunctionCallOptions", + "options": [ + { + "id": 6260, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6229, + "src": "3291:5:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "src": "3272:25:46", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 6263, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3272:31:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3230:73:46" + }, + { + "expression": { + "arguments": [ + { + "id": 6266, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6225, + "src": "3347:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6267, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6255, + "src": "3355:7:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 6268, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6257, + "src": "3364:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6265, + "name": "verifyCallResultFromTarget", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6364, + "src": "3320:26:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (address,bool,bytes memory) view returns (bytes memory)" + } + }, + "id": 6269, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3320:55:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 6233, + "id": 6270, + "nodeType": "Return", + "src": "3313:62:46" + } + ] + }, + "documentation": { + "id": 6223, + "nodeType": "StructuredDocumentation", + "src": "2657:313:46", + "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but also transferring `value` wei to `target`.\n Requirements:\n - the calling contract must have an ETH balance of at least `value`.\n - the called Solidity function must be `payable`." + }, + "id": 6272, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "functionCallWithValue", + "nameLocation": "2984:21:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6230, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6225, + "mutability": "mutable", + "name": "target", + "nameLocation": "3014:6:46", + "nodeType": "VariableDeclaration", + "scope": 6272, + "src": "3006:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6224, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3006:7:46", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6227, + "mutability": "mutable", + "name": "data", + "nameLocation": "3035:4:46", + "nodeType": "VariableDeclaration", + "scope": 6272, + "src": "3022:17:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6226, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3022:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6229, + "mutability": "mutable", + "name": "value", + "nameLocation": "3049:5:46", + "nodeType": "VariableDeclaration", + "scope": 6272, + "src": "3041:13:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6228, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3041:7:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3005:50:46" + }, + "returnParameters": { + "id": 6233, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6232, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6272, + "src": "3074:12:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6231, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3074:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3073:14:46" + }, + "scope": 6407, + "src": "2975:407:46", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6297, + "nodeType": "Block", + "src": "3621:154:46", + "statements": [ + { + "assignments": [6283, 6285], + "declarations": [ + { + "constant": false, + "id": 6283, + "mutability": "mutable", + "name": "success", + "nameLocation": "3637:7:46", + "nodeType": "VariableDeclaration", + "scope": 6297, + "src": "3632:12:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6282, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3632:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6285, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "3659:10:46", + "nodeType": "VariableDeclaration", + "scope": 6297, + "src": "3646:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6284, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3646:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6290, + "initialValue": { + "arguments": [ + { + "id": 6288, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6277, + "src": "3691:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 6286, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6275, + "src": "3673:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6287, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3680:10:46", + "memberName": "staticcall", + "nodeType": "MemberAccess", + "src": "3673:17:46", + "typeDescriptions": { + "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) view returns (bool,bytes memory)" + } + }, + "id": 6289, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3673:23:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3631:65:46" + }, + { + "expression": { + "arguments": [ + { + "id": 6292, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6275, + "src": "3740:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6293, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6283, + "src": "3748:7:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 6294, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6285, + "src": "3757:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6291, + "name": "verifyCallResultFromTarget", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6364, + "src": "3713:26:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (address,bool,bytes memory) view returns (bytes memory)" + } + }, + "id": 6295, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3713:55:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 6281, + "id": 6296, + "nodeType": "Return", + "src": "3706:62:46" + } + ] + }, + "documentation": { + "id": 6273, + "nodeType": "StructuredDocumentation", + "src": "3388:128:46", + "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a static call." + }, + "id": 6298, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "functionStaticCall", + "nameLocation": "3530:18:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6278, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6275, + "mutability": "mutable", + "name": "target", + "nameLocation": "3557:6:46", + "nodeType": "VariableDeclaration", + "scope": 6298, + "src": "3549:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6274, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3549:7:46", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6277, + "mutability": "mutable", + "name": "data", + "nameLocation": "3578:4:46", + "nodeType": "VariableDeclaration", + "scope": 6298, + "src": "3565:17:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6276, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3565:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3548:35:46" + }, + "returnParameters": { + "id": 6281, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6280, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6298, + "src": "3607:12:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6279, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3607:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3606:14:46" + }, + "scope": 6407, + "src": "3521:254:46", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6323, + "nodeType": "Block", + "src": "4013:156:46", + "statements": [ + { + "assignments": [6309, 6311], + "declarations": [ + { + "constant": false, + "id": 6309, + "mutability": "mutable", + "name": "success", + "nameLocation": "4029:7:46", + "nodeType": "VariableDeclaration", + "scope": 6323, + "src": "4024:12:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6308, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4024:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6311, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "4051:10:46", + "nodeType": "VariableDeclaration", + "scope": 6323, + "src": "4038:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6310, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4038:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6316, + "initialValue": { + "arguments": [ + { + "id": 6314, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6303, + "src": "4085:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 6312, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6301, + "src": "4065:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6313, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4072:12:46", + "memberName": "delegatecall", + "nodeType": "MemberAccess", + "src": "4065:19:46", + "typeDescriptions": { + "typeIdentifier": "t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) returns (bool,bytes memory)" + } + }, + "id": 6315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4065:25:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4023:67:46" + }, + { + "expression": { + "arguments": [ + { + "id": 6318, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6301, + "src": "4134:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 6319, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6309, + "src": "4142:7:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 6320, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6311, + "src": "4151:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6317, + "name": "verifyCallResultFromTarget", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6364, + "src": "4107:26:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (address,bool,bytes memory) view returns (bytes memory)" + } + }, + "id": 6321, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4107:55:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 6307, + "id": 6322, + "nodeType": "Return", + "src": "4100:62:46" + } + ] + }, + "documentation": { + "id": 6299, + "nodeType": "StructuredDocumentation", + "src": "3781:130:46", + "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a delegate call." + }, + "id": 6324, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "functionDelegateCall", + "nameLocation": "3925:20:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6304, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6301, + "mutability": "mutable", + "name": "target", + "nameLocation": "3954:6:46", + "nodeType": "VariableDeclaration", + "scope": 6324, + "src": "3946:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6300, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3946:7:46", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6303, + "mutability": "mutable", + "name": "data", + "nameLocation": "3975:4:46", + "nodeType": "VariableDeclaration", + "scope": 6324, + "src": "3962:17:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6302, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3962:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3945:35:46" + }, + "returnParameters": { + "id": 6307, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6306, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6324, + "src": "3999:12:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6305, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3999:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3998:14:46" + }, + "scope": 6407, + "src": "3916:253:46", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6363, + "nodeType": "Block", + "src": "4595:424:46", + "statements": [ + { + "condition": { + "id": 6337, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "4609:8:46", + "subExpression": { + "id": 6336, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6329, + "src": "4610:7:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6361, + "nodeType": "Block", + "src": "4669:344:46", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 6352, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6346, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 6343, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6331, + "src": "4857:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6344, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4868:6:46", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4857:17:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 6345, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4878:1:46", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4857:22:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6351, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "expression": { + "id": 6347, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6327, + "src": "4883:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 6348, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4890:4:46", + "memberName": "code", + "nodeType": "MemberAccess", + "src": "4883:11:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6349, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4895:6:46", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4883:18:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 6350, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4905:1:46", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4883:23:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4857:49:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6358, + "nodeType": "IfStatement", + "src": "4853:119:46", + "trueBody": { + "id": 6357, + "nodeType": "Block", + "src": "4908:64:46", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 6354, + "name": "target", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6327, + "src": "4950:6:46", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6353, + "name": "AddressEmptyCode", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6157, + "src": "4933:16:46", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 6355, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4933:24:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 6356, + "nodeType": "RevertStatement", + "src": "4926:31:46" + } + ] + } + }, + { + "expression": { + "id": 6359, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6331, + "src": "4992:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 6335, + "id": 6360, + "nodeType": "Return", + "src": "4985:17:46" + } + ] + }, + "id": 6362, + "nodeType": "IfStatement", + "src": "4605:408:46", + "trueBody": { + "id": 6342, + "nodeType": "Block", + "src": "4619:44:46", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6339, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6331, + "src": "4641:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6338, + "name": "_revert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6406, + "src": "4633:7:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes memory) pure" + } + }, + "id": 6340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4633:19:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6341, + "nodeType": "ExpressionStatement", + "src": "4633:19:46" + } + ] + } + } + ] + }, + "documentation": { + "id": 6325, + "nodeType": "StructuredDocumentation", + "src": "4175:257:46", + "text": " @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n of an unsuccessful call." + }, + "id": 6364, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "verifyCallResultFromTarget", + "nameLocation": "4446:26:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6332, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6327, + "mutability": "mutable", + "name": "target", + "nameLocation": "4490:6:46", + "nodeType": "VariableDeclaration", + "scope": 6364, + "src": "4482:14:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6326, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4482:7:46", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6329, + "mutability": "mutable", + "name": "success", + "nameLocation": "4511:7:46", + "nodeType": "VariableDeclaration", + "scope": 6364, + "src": "4506:12:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6328, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4506:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6331, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "4541:10:46", + "nodeType": "VariableDeclaration", + "scope": 6364, + "src": "4528:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6330, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4528:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4472:85:46" + }, + "returnParameters": { + "id": 6335, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6334, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6364, + "src": "4581:12:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6333, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4581:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4580:14:46" + }, + "scope": 6407, + "src": "4437:582:46", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6385, + "nodeType": "Block", + "src": "5323:122:46", + "statements": [ + { + "condition": { + "id": 6375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "5337:8:46", + "subExpression": { + "id": 6374, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6367, + "src": "5338:7:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6383, + "nodeType": "Block", + "src": "5397:42:46", + "statements": [ + { + "expression": { + "id": 6381, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6369, + "src": "5418:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 6373, + "id": 6382, + "nodeType": "Return", + "src": "5411:17:46" + } + ] + }, + "id": 6384, + "nodeType": "IfStatement", + "src": "5333:106:46", + "trueBody": { + "id": 6380, + "nodeType": "Block", + "src": "5347:44:46", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6377, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6369, + "src": "5369:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6376, + "name": "_revert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6406, + "src": "5361:7:46", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes memory) pure" + } + }, + "id": 6378, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5361:19:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 6379, + "nodeType": "ExpressionStatement", + "src": "5361:19:46" + } + ] + } + } + ] + }, + "documentation": { + "id": 6365, + "nodeType": "StructuredDocumentation", + "src": "5025:191:46", + "text": " @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n revert reason or with a default {Errors.FailedCall} error." + }, + "id": 6386, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "verifyCallResult", + "nameLocation": "5230:16:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6370, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6367, + "mutability": "mutable", + "name": "success", + "nameLocation": "5252:7:46", + "nodeType": "VariableDeclaration", + "scope": 6386, + "src": "5247:12:46", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6366, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5247:4:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6369, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "5274:10:46", + "nodeType": "VariableDeclaration", + "scope": 6386, + "src": "5261:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6368, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5261:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5246:39:46" + }, + "returnParameters": { + "id": 6373, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6372, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6386, + "src": "5309:12:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6371, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5309:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5308:14:46" + }, + "scope": 6407, + "src": "5221:224:46", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6405, + "nodeType": "Block", + "src": "5614:432:46", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 6392, + "name": "returndata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6389, + "src": "5690:10:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6393, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5701:6:46", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5690:17:46", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 6394, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5710:1:46", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5690:21:46", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 6403, + "nodeType": "Block", + "src": "5989:51:46", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 6398, + "name": "Errors", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6429, + "src": "6010:6:46", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Errors_$6429_$", + "typeString": "type(library Errors)" + } + }, + "id": 6400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6017:10:46", + "memberName": "FailedCall", + "nodeType": "MemberAccess", + "referencedDeclaration": 6420, + "src": "6010:17:46", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 6401, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6010:19:46", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 6402, + "nodeType": "RevertStatement", + "src": "6003:26:46" + } + ] + }, + "id": 6404, + "nodeType": "IfStatement", + "src": "5686:354:46", + "trueBody": { + "id": 6397, + "nodeType": "Block", + "src": "5713:270:46", + "statements": [ + { + "AST": { + "nativeSrc": "5840:133:46", + "nodeType": "YulBlock", + "src": "5840:133:46", + "statements": [ + { + "nativeSrc": "5858:40:46", + "nodeType": "YulVariableDeclaration", + "src": "5858:40:46", + "value": { + "arguments": [ + { + "name": "returndata", + "nativeSrc": "5887:10:46", + "nodeType": "YulIdentifier", + "src": "5887:10:46" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "5881:5:46", + "nodeType": "YulIdentifier", + "src": "5881:5:46" + }, + "nativeSrc": "5881:17:46", + "nodeType": "YulFunctionCall", + "src": "5881:17:46" + }, + "variables": [ + { + "name": "returndata_size", + "nativeSrc": "5862:15:46", + "nodeType": "YulTypedName", + "src": "5862:15:46", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "5926:2:46", + "nodeType": "YulLiteral", + "src": "5926:2:46", + "type": "", + "value": "32" + }, + { + "name": "returndata", + "nativeSrc": "5930:10:46", + "nodeType": "YulIdentifier", + "src": "5930:10:46" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5922:3:46", + "nodeType": "YulIdentifier", + "src": "5922:3:46" + }, + "nativeSrc": "5922:19:46", + "nodeType": "YulFunctionCall", + "src": "5922:19:46" + }, + { + "name": "returndata_size", + "nativeSrc": "5943:15:46", + "nodeType": "YulIdentifier", + "src": "5943:15:46" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "5915:6:46", + "nodeType": "YulIdentifier", + "src": "5915:6:46" + }, + "nativeSrc": "5915:44:46", + "nodeType": "YulFunctionCall", + "src": "5915:44:46" + }, + "nativeSrc": "5915:44:46", + "nodeType": "YulExpressionStatement", + "src": "5915:44:46" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 6389, + "isOffset": false, + "isSlot": false, + "src": "5887:10:46", + "valueSize": 1 + }, + { + "declaration": 6389, + "isOffset": false, + "isSlot": false, + "src": "5930:10:46", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 6396, + "nodeType": "InlineAssembly", + "src": "5815:158:46" + } + ] + } + } + ] + }, + "documentation": { + "id": 6387, + "nodeType": "StructuredDocumentation", + "src": "5451:103:46", + "text": " @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}." + }, + "id": 6406, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_revert", + "nameLocation": "5568:7:46", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6390, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6389, + "mutability": "mutable", + "name": "returndata", + "nameLocation": "5589:10:46", + "nodeType": "VariableDeclaration", + "scope": 6406, + "src": "5576:23:46", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6388, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5576:5:46", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5575:25:46" + }, + "returnParameters": { + "id": 6391, + "nodeType": "ParameterList", + "parameters": [], + "src": "5614:0:46" + }, + "scope": 6407, + "src": "5559:487:46", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + } + ], + "scope": 6408, + "src": "233:5815:46", + "usedErrors": [6157], + "usedEvents": [] + } + ], + "src": "101:5948:46" + }, + "id": 46 + }, + "@openzeppelin/contracts/utils/Errors.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/Errors.sol", + "exportedSymbols": { + "Errors": [6429] + }, + "id": 6430, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6409, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "100:24:47" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Errors", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 6410, + "nodeType": "StructuredDocumentation", + "src": "126:284:47", + "text": " @dev Collection of common custom errors used in multiple contracts\n IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n It is recommended to avoid relying on the error API for critical functionality.\n _Available since v5.1._" + }, + "fullyImplemented": true, + "id": 6429, + "linearizedBaseContracts": [6429], + "name": "Errors", + "nameLocation": "419:6:47", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 6411, + "nodeType": "StructuredDocumentation", + "src": "432:94:47", + "text": " @dev The ETH balance of the account is not enough to perform the operation." + }, + "errorSelector": "cf479181", + "id": 6417, + "name": "InsufficientBalance", + "nameLocation": "537:19:47", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6416, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6413, + "mutability": "mutable", + "name": "balance", + "nameLocation": "565:7:47", + "nodeType": "VariableDeclaration", + "scope": 6417, + "src": "557:15:47", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6412, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "557:7:47", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6415, + "mutability": "mutable", + "name": "needed", + "nameLocation": "582:6:47", + "nodeType": "VariableDeclaration", + "scope": 6417, + "src": "574:14:47", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6414, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "574:7:47", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "556:33:47" + }, + "src": "531:59:47" + }, + { + "documentation": { + "id": 6418, + "nodeType": "StructuredDocumentation", + "src": "596:89:47", + "text": " @dev A call to an address target failed. The target may have reverted." + }, + "errorSelector": "d6bda275", + "id": 6420, + "name": "FailedCall", + "nameLocation": "696:10:47", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6419, + "nodeType": "ParameterList", + "parameters": [], + "src": "706:2:47" + }, + "src": "690:19:47" + }, + { + "documentation": { + "id": 6421, + "nodeType": "StructuredDocumentation", + "src": "715:46:47", + "text": " @dev The deployment failed." + }, + "errorSelector": "b06ebf3d", + "id": 6423, + "name": "FailedDeployment", + "nameLocation": "772:16:47", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6422, + "nodeType": "ParameterList", + "parameters": [], + "src": "788:2:47" + }, + "src": "766:25:47" + }, + { + "documentation": { + "id": 6424, + "nodeType": "StructuredDocumentation", + "src": "797:58:47", + "text": " @dev A necessary precompile is missing." + }, + "errorSelector": "42b01bce", + "id": 6428, + "name": "MissingPrecompile", + "nameLocation": "866:17:47", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6427, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6426, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6428, + "src": "884:7:47", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6425, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "884:7:47", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "883:9:47" + }, + "src": "860:33:47" + } + ], + "scope": 6430, + "src": "411:484:47", + "usedErrors": [6417, 6420, 6423, 6428], + "usedEvents": [] + } + ], + "src": "100:796:47" + }, + "id": 47 + }, + "@openzeppelin/contracts/utils/Panic.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/Panic.sol", + "exportedSymbols": { + "Panic": [6481] + }, + "id": 6482, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6431, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "99:24:48" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Panic", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 6432, + "nodeType": "StructuredDocumentation", + "src": "125:489:48", + "text": " @dev Helper library for emitting standardized panic codes.\n ```solidity\n contract Example {\n using Panic for uint256;\n // Use any of the declared internal constants\n function foo() { Panic.GENERIC.panic(); }\n // Alternatively\n function foo() { Panic.panic(Panic.GENERIC); }\n }\n ```\n Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n _Available since v5.1._" + }, + "fullyImplemented": true, + "id": 6481, + "linearizedBaseContracts": [6481], + "name": "Panic", + "nameLocation": "665:5:48", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "documentation": { + "id": 6433, + "nodeType": "StructuredDocumentation", + "src": "677:36:48", + "text": "@dev generic / unspecified error" + }, + "id": 6436, + "mutability": "constant", + "name": "GENERIC", + "nameLocation": "744:7:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "718:40:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6434, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "718:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783030", + "id": 6435, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "754:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0x00" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6437, + "nodeType": "StructuredDocumentation", + "src": "764:37:48", + "text": "@dev used by the assert() builtin" + }, + "id": 6440, + "mutability": "constant", + "name": "ASSERT", + "nameLocation": "832:6:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "806:39:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6438, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "806:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783031", + "id": 6439, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "841:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "0x01" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6441, + "nodeType": "StructuredDocumentation", + "src": "851:41:48", + "text": "@dev arithmetic underflow or overflow" + }, + "id": 6444, + "mutability": "constant", + "name": "UNDER_OVERFLOW", + "nameLocation": "923:14:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "897:47:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6442, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "897:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783131", + "id": 6443, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "940:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_17_by_1", + "typeString": "int_const 17" + }, + "value": "0x11" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6445, + "nodeType": "StructuredDocumentation", + "src": "950:35:48", + "text": "@dev division or modulo by zero" + }, + "id": 6448, + "mutability": "constant", + "name": "DIVISION_BY_ZERO", + "nameLocation": "1016:16:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "990:49:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6446, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "990:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783132", + "id": 6447, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1035:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_18_by_1", + "typeString": "int_const 18" + }, + "value": "0x12" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6449, + "nodeType": "StructuredDocumentation", + "src": "1045:30:48", + "text": "@dev enum conversion error" + }, + "id": 6452, + "mutability": "constant", + "name": "ENUM_CONVERSION_ERROR", + "nameLocation": "1106:21:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "1080:54:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6450, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1080:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783231", + "id": 6451, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1130:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_33_by_1", + "typeString": "int_const 33" + }, + "value": "0x21" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6453, + "nodeType": "StructuredDocumentation", + "src": "1140:36:48", + "text": "@dev invalid encoding in storage" + }, + "id": 6456, + "mutability": "constant", + "name": "STORAGE_ENCODING_ERROR", + "nameLocation": "1207:22:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "1181:55:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6454, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1181:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783232", + "id": 6455, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1232:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_34_by_1", + "typeString": "int_const 34" + }, + "value": "0x22" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6457, + "nodeType": "StructuredDocumentation", + "src": "1242:24:48", + "text": "@dev empty array pop" + }, + "id": 6460, + "mutability": "constant", + "name": "EMPTY_ARRAY_POP", + "nameLocation": "1297:15:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "1271:48:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6458, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1271:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783331", + "id": 6459, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1315:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_49_by_1", + "typeString": "int_const 49" + }, + "value": "0x31" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6461, + "nodeType": "StructuredDocumentation", + "src": "1325:35:48", + "text": "@dev array out of bounds access" + }, + "id": 6464, + "mutability": "constant", + "name": "ARRAY_OUT_OF_BOUNDS", + "nameLocation": "1391:19:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "1365:52:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6462, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1365:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783332", + "id": 6463, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1413:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "0x32" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6465, + "nodeType": "StructuredDocumentation", + "src": "1423:65:48", + "text": "@dev resource error (too large allocation or too large array)" + }, + "id": 6468, + "mutability": "constant", + "name": "RESOURCE_ERROR", + "nameLocation": "1519:14:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "1493:47:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6466, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1493:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783431", + "id": 6467, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1536:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_65_by_1", + "typeString": "int_const 65" + }, + "value": "0x41" + }, + "visibility": "internal" + }, + { + "constant": true, + "documentation": { + "id": 6469, + "nodeType": "StructuredDocumentation", + "src": "1546:42:48", + "text": "@dev calling invalid internal function" + }, + "id": 6472, + "mutability": "constant", + "name": "INVALID_INTERNAL_FUNCTION", + "nameLocation": "1619:25:48", + "nodeType": "VariableDeclaration", + "scope": 6481, + "src": "1593:58:48", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6470, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1593:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30783531", + "id": 6471, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1647:4:48", + "typeDescriptions": { + "typeIdentifier": "t_rational_81_by_1", + "typeString": "int_const 81" + }, + "value": "0x51" + }, + "visibility": "internal" + }, + { + "body": { + "id": 6479, + "nodeType": "Block", + "src": "1819:151:48", + "statements": [ + { + "AST": { + "nativeSrc": "1854:110:48", + "nodeType": "YulBlock", + "src": "1854:110:48", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1875:4:48", + "nodeType": "YulLiteral", + "src": "1875:4:48", + "type": "", + "value": "0x00" + }, + { + "kind": "number", + "nativeSrc": "1881:10:48", + "nodeType": "YulLiteral", + "src": "1881:10:48", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1868:6:48", + "nodeType": "YulIdentifier", + "src": "1868:6:48" + }, + "nativeSrc": "1868:24:48", + "nodeType": "YulFunctionCall", + "src": "1868:24:48" + }, + "nativeSrc": "1868:24:48", + "nodeType": "YulExpressionStatement", + "src": "1868:24:48" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1912:4:48", + "nodeType": "YulLiteral", + "src": "1912:4:48", + "type": "", + "value": "0x20" + }, + { + "name": "code", + "nativeSrc": "1918:4:48", + "nodeType": "YulIdentifier", + "src": "1918:4:48" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1905:6:48", + "nodeType": "YulIdentifier", + "src": "1905:6:48" + }, + "nativeSrc": "1905:18:48", + "nodeType": "YulFunctionCall", + "src": "1905:18:48" + }, + "nativeSrc": "1905:18:48", + "nodeType": "YulExpressionStatement", + "src": "1905:18:48" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1943:4:48", + "nodeType": "YulLiteral", + "src": "1943:4:48", + "type": "", + "value": "0x1c" + }, + { + "kind": "number", + "nativeSrc": "1949:4:48", + "nodeType": "YulLiteral", + "src": "1949:4:48", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "1936:6:48", + "nodeType": "YulIdentifier", + "src": "1936:6:48" + }, + "nativeSrc": "1936:18:48", + "nodeType": "YulFunctionCall", + "src": "1936:18:48" + }, + "nativeSrc": "1936:18:48", + "nodeType": "YulExpressionStatement", + "src": "1936:18:48" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 6475, + "isOffset": false, + "isSlot": false, + "src": "1918:4:48", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 6478, + "nodeType": "InlineAssembly", + "src": "1829:135:48" + } + ] + }, + "documentation": { + "id": 6473, + "nodeType": "StructuredDocumentation", + "src": "1658:113:48", + "text": "@dev Reverts with a panic code. Recommended to use with\n the internal constants with predefined codes." + }, + "id": 6480, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "panic", + "nameLocation": "1785:5:48", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6476, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6475, + "mutability": "mutable", + "name": "code", + "nameLocation": "1799:4:48", + "nodeType": "VariableDeclaration", + "scope": 6480, + "src": "1791:12:48", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6474, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1791:7:48", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1790:14:48" + }, + "returnParameters": { + "id": 6477, + "nodeType": "ParameterList", + "parameters": [], + "src": "1819:0:48" + }, + "scope": 6481, + "src": "1776:194:48", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 6482, + "src": "657:1315:48", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "99:1874:48" + }, + "id": 48 + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/Strings.sol", + "exportedSymbols": { + "Math": [9938], + "SafeCast": [11703], + "SignedMath": [11847], + "Strings": [7883] + }, + "id": 7884, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6483, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "101:24:49" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/math/Math.sol", + "file": "./math/Math.sol", + "id": 6485, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 7884, + "sourceUnit": 9939, + "src": "127:37:49", + "symbolAliases": [ + { + "foreign": { + "id": 6484, + "name": "Math", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9938, + "src": "135:4:49", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/math/SafeCast.sol", + "file": "./math/SafeCast.sol", + "id": 6487, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 7884, + "sourceUnit": 11704, + "src": "165:45:49", + "symbolAliases": [ + { + "foreign": { + "id": 6486, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "173:8:49", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/math/SignedMath.sol", + "file": "./math/SignedMath.sol", + "id": 6489, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 7884, + "sourceUnit": 11848, + "src": "211:49:49", + "symbolAliases": [ + { + "foreign": { + "id": 6488, + "name": "SignedMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11847, + "src": "219:10:49", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Strings", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 6490, + "nodeType": "StructuredDocumentation", + "src": "262:34:49", + "text": " @dev String operations." + }, + "fullyImplemented": true, + "id": 7883, + "linearizedBaseContracts": [7883], + "name": "Strings", + "nameLocation": "305:7:49", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 6492, + "libraryName": { + "id": 6491, + "name": "SafeCast", + "nameLocations": ["325:8:49"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11703, + "src": "325:8:49" + }, + "nodeType": "UsingForDirective", + "src": "319:21:49" + }, + { + "constant": true, + "id": 6495, + "mutability": "constant", + "name": "HEX_DIGITS", + "nameLocation": "371:10:49", + "nodeType": "VariableDeclaration", + "scope": 7883, + "src": "346:56:49", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes16", + "typeString": "bytes16" + }, + "typeName": { + "id": 6493, + "name": "bytes16", + "nodeType": "ElementaryTypeName", + "src": "346:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes16", + "typeString": "bytes16" + } + }, + "value": { + "hexValue": "30313233343536373839616263646566", + "id": 6494, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "384:18:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_cb29997ed99ead0db59ce4d12b7d3723198c827273e5796737c926d78019c39f", + "typeString": "literal_string \"0123456789abcdef\"" + }, + "value": "0123456789abcdef" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 6498, + "mutability": "constant", + "name": "ADDRESS_LENGTH", + "nameLocation": "431:14:49", + "nodeType": "VariableDeclaration", + "scope": 7883, + "src": "408:42:49", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 6496, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "408:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "value": { + "hexValue": "3230", + "id": 6497, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "448:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_20_by_1", + "typeString": "int_const 20" + }, + "value": "20" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 6534, + "mutability": "constant", + "name": "SPECIAL_CHARS_LOOKUP", + "nameLocation": "481:20:49", + "nodeType": "VariableDeclaration", + "scope": 7883, + "src": "456:302:49", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6499, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "456:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "commonType": { + "typeIdentifier": "t_rational_4951760157141521116776380160_by_1", + "typeString": "int_const 4951760157141521116776380160" + }, + "id": 6533, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_rational_17179883264_by_1", + "typeString": "int_const 17179883264" + }, + "id": 6528, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_rational_14080_by_1", + "typeString": "int_const 14080" + }, + "id": 6523, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_rational_5888_by_1", + "typeString": "int_const 5888" + }, + "id": 6518, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_rational_1792_by_1", + "typeString": "int_const 1792" + }, + "id": 6513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_rational_768_by_1", + "typeString": "int_const 768" + }, + "id": 6508, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + }, + "id": 6502, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6500, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "513:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783038", + "id": 6501, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "518:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "0x08" + }, + "src": "513:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + } + } + ], + "id": 6503, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "512:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_512_by_1", + "typeString": "int_const 512" + }, + "id": 6506, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6504, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "552:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783039", + "id": 6505, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "557:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_9_by_1", + "typeString": "int_const 9" + }, + "value": "0x09" + }, + "src": "552:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_512_by_1", + "typeString": "int_const 512" + } + } + ], + "id": 6507, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "551:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_512_by_1", + "typeString": "int_const 512" + } + }, + "src": "512:50:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_768_by_1", + "typeString": "int_const 768" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_1024_by_1", + "typeString": "int_const 1024" + }, + "id": 6511, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6509, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "585:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783061", + "id": 6510, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "590:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "0x0a" + }, + "src": "585:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1024_by_1", + "typeString": "int_const 1024" + } + } + ], + "id": 6512, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "584:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1024_by_1", + "typeString": "int_const 1024" + } + }, + "src": "512:83:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1792_by_1", + "typeString": "int_const 1792" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_4096_by_1", + "typeString": "int_const 4096" + }, + "id": 6516, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6514, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "622:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783063", + "id": 6515, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "627:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_12_by_1", + "typeString": "int_const 12" + }, + "value": "0x0c" + }, + "src": "622:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4096_by_1", + "typeString": "int_const 4096" + } + } + ], + "id": 6517, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "621:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4096_by_1", + "typeString": "int_const 4096" + } + }, + "src": "512:120:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_5888_by_1", + "typeString": "int_const 5888" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_8192_by_1", + "typeString": "int_const 8192" + }, + "id": 6521, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6519, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "661:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783064", + "id": 6520, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "666:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_13_by_1", + "typeString": "int_const 13" + }, + "value": "0x0d" + }, + "src": "661:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_8192_by_1", + "typeString": "int_const 8192" + } + } + ], + "id": 6522, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "660:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_8192_by_1", + "typeString": "int_const 8192" + } + }, + "src": "512:159:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_14080_by_1", + "typeString": "int_const 14080" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_17179869184_by_1", + "typeString": "int_const 17179869184" + }, + "id": 6526, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6524, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "706:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783232", + "id": 6525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "711:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_34_by_1", + "typeString": "int_const 34" + }, + "value": "0x22" + }, + "src": "706:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_17179869184_by_1", + "typeString": "int_const 17179869184" + } + } + ], + "id": 6527, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "705:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_17179869184_by_1", + "typeString": "int_const 17179869184" + } + }, + "src": "512:204:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_17179883264_by_1", + "typeString": "int_const 17179883264" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_4951760157141521099596496896_by_1", + "typeString": "int_const 4951760157141521099596496896" + }, + "id": 6531, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 6529, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "748:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "30783563", + "id": 6530, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "753:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_92_by_1", + "typeString": "int_const 92" + }, + "value": "0x5c" + }, + "src": "748:9:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4951760157141521099596496896_by_1", + "typeString": "int_const 4951760157141521099596496896" + } + } + ], + "id": 6532, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "747:11:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4951760157141521099596496896_by_1", + "typeString": "int_const 4951760157141521099596496896" + } + }, + "src": "512:246:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4951760157141521116776380160_by_1", + "typeString": "int_const 4951760157141521116776380160" + } + }, + "visibility": "private" + }, + { + "documentation": { + "id": 6535, + "nodeType": "StructuredDocumentation", + "src": "778:81:49", + "text": " @dev The `value` string doesn't fit in the specified `length`." + }, + "errorSelector": "e22e27eb", + "id": 6541, + "name": "StringsInsufficientHexLength", + "nameLocation": "870:28:49", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6540, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6537, + "mutability": "mutable", + "name": "value", + "nameLocation": "907:5:49", + "nodeType": "VariableDeclaration", + "scope": 6541, + "src": "899:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6536, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "899:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6539, + "mutability": "mutable", + "name": "length", + "nameLocation": "922:6:49", + "nodeType": "VariableDeclaration", + "scope": 6541, + "src": "914:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6538, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "914:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "898:31:49" + }, + "src": "864:66:49" + }, + { + "documentation": { + "id": 6542, + "nodeType": "StructuredDocumentation", + "src": "936:108:49", + "text": " @dev The string being parsed contains characters that are not in scope of the given base." + }, + "errorSelector": "94e2737e", + "id": 6544, + "name": "StringsInvalidChar", + "nameLocation": "1055:18:49", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6543, + "nodeType": "ParameterList", + "parameters": [], + "src": "1073:2:49" + }, + "src": "1049:27:49" + }, + { + "documentation": { + "id": 6545, + "nodeType": "StructuredDocumentation", + "src": "1082:84:49", + "text": " @dev The string being parsed is not a properly formatted address." + }, + "errorSelector": "1d15ae44", + "id": 6547, + "name": "StringsInvalidAddressFormat", + "nameLocation": "1177:27:49", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 6546, + "nodeType": "ParameterList", + "parameters": [], + "src": "1204:2:49" + }, + "src": "1171:36:49" + }, + { + "body": { + "id": 6594, + "nodeType": "Block", + "src": "1379:561:49", + "statements": [ + { + "id": 6593, + "nodeType": "UncheckedBlock", + "src": "1389:545:49", + "statements": [ + { + "assignments": [6556], + "declarations": [ + { + "constant": false, + "id": 6556, + "mutability": "mutable", + "name": "length", + "nameLocation": "1421:6:49", + "nodeType": "VariableDeclaration", + "scope": 6593, + "src": "1413:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6555, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1413:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6563, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6562, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 6559, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6550, + "src": "1441:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 6557, + "name": "Math", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9938, + "src": "1430:4:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Math_$9938_$", + "typeString": "type(library Math)" + } + }, + "id": 6558, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1435:5:49", + "memberName": "log10", + "nodeType": "MemberAccess", + "referencedDeclaration": 9770, + "src": "1430:10:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 6560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1430:17:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 6561, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1450:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "1430:21:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1413:38:49" + }, + { + "assignments": [6565], + "declarations": [ + { + "constant": false, + "id": 6565, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "1479:6:49", + "nodeType": "VariableDeclaration", + "scope": 6593, + "src": "1465:20:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6564, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1465:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "id": 6570, + "initialValue": { + "arguments": [ + { + "id": 6568, + "name": "length", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6556, + "src": "1499:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6567, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "1488:10:49", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_string_memory_ptr_$", + "typeString": "function (uint256) pure returns (string memory)" + }, + "typeName": { + "id": 6566, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1492:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + } + }, + "id": 6569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1488:18:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1465:41:49" + }, + { + "assignments": [6572], + "declarations": [ + { + "constant": false, + "id": 6572, + "mutability": "mutable", + "name": "ptr", + "nameLocation": "1528:3:49", + "nodeType": "VariableDeclaration", + "scope": 6593, + "src": "1520:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6571, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1520:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6573, + "nodeType": "VariableDeclarationStatement", + "src": "1520:11:49" + }, + { + "AST": { + "nativeSrc": "1570:67:49", + "nodeType": "YulBlock", + "src": "1570:67:49", + "statements": [ + { + "nativeSrc": "1588:35:49", + "nodeType": "YulAssignment", + "src": "1588:35:49", + "value": { + "arguments": [ + { + "name": "buffer", + "nativeSrc": "1599:6:49", + "nodeType": "YulIdentifier", + "src": "1599:6:49" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1611:2:49", + "nodeType": "YulLiteral", + "src": "1611:2:49", + "type": "", + "value": "32" + }, + { + "name": "length", + "nativeSrc": "1615:6:49", + "nodeType": "YulIdentifier", + "src": "1615:6:49" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1607:3:49", + "nodeType": "YulIdentifier", + "src": "1607:3:49" + }, + "nativeSrc": "1607:15:49", + "nodeType": "YulFunctionCall", + "src": "1607:15:49" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1595:3:49", + "nodeType": "YulIdentifier", + "src": "1595:3:49" + }, + "nativeSrc": "1595:28:49", + "nodeType": "YulFunctionCall", + "src": "1595:28:49" + }, + "variableNames": [ + { + "name": "ptr", + "nativeSrc": "1588:3:49", + "nodeType": "YulIdentifier", + "src": "1588:3:49" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 6565, + "isOffset": false, + "isSlot": false, + "src": "1599:6:49", + "valueSize": 1 + }, + { + "declaration": 6556, + "isOffset": false, + "isSlot": false, + "src": "1615:6:49", + "valueSize": 1 + }, + { + "declaration": 6572, + "isOffset": false, + "isSlot": false, + "src": "1588:3:49", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 6574, + "nodeType": "InlineAssembly", + "src": "1545:92:49" + }, + { + "body": { + "id": 6589, + "nodeType": "Block", + "src": "1663:234:49", + "statements": [ + { + "expression": { + "id": 6577, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "--", + "prefix": false, + "src": "1681:5:49", + "subExpression": { + "id": 6576, + "name": "ptr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6572, + "src": "1681:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6578, + "nodeType": "ExpressionStatement", + "src": "1681:5:49" + }, + { + "AST": { + "nativeSrc": "1729:86:49", + "nodeType": "YulBlock", + "src": "1729:86:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "1759:3:49", + "nodeType": "YulIdentifier", + "src": "1759:3:49" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "1773:5:49", + "nodeType": "YulIdentifier", + "src": "1773:5:49" + }, + { + "kind": "number", + "nativeSrc": "1780:2:49", + "nodeType": "YulLiteral", + "src": "1780:2:49", + "type": "", + "value": "10" + } + ], + "functionName": { + "name": "mod", + "nativeSrc": "1769:3:49", + "nodeType": "YulIdentifier", + "src": "1769:3:49" + }, + "nativeSrc": "1769:14:49", + "nodeType": "YulFunctionCall", + "src": "1769:14:49" + }, + { + "name": "HEX_DIGITS", + "nativeSrc": "1785:10:49", + "nodeType": "YulIdentifier", + "src": "1785:10:49" + } + ], + "functionName": { + "name": "byte", + "nativeSrc": "1764:4:49", + "nodeType": "YulIdentifier", + "src": "1764:4:49" + }, + "nativeSrc": "1764:32:49", + "nodeType": "YulFunctionCall", + "src": "1764:32:49" + } + ], + "functionName": { + "name": "mstore8", + "nativeSrc": "1751:7:49", + "nodeType": "YulIdentifier", + "src": "1751:7:49" + }, + "nativeSrc": "1751:46:49", + "nodeType": "YulFunctionCall", + "src": "1751:46:49" + }, + "nativeSrc": "1751:46:49", + "nodeType": "YulExpressionStatement", + "src": "1751:46:49" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 6495, + "isOffset": false, + "isSlot": false, + "src": "1785:10:49", + "valueSize": 1 + }, + { + "declaration": 6572, + "isOffset": false, + "isSlot": false, + "src": "1759:3:49", + "valueSize": 1 + }, + { + "declaration": 6550, + "isOffset": false, + "isSlot": false, + "src": "1773:5:49", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 6579, + "nodeType": "InlineAssembly", + "src": "1704:111:49" + }, + { + "expression": { + "id": 6582, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 6580, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6550, + "src": "1832:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "hexValue": "3130", + "id": 6581, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1841:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "src": "1832:11:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6583, + "nodeType": "ExpressionStatement", + "src": "1832:11:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6586, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6584, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6550, + "src": "1865:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 6585, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1874:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1865:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6588, + "nodeType": "IfStatement", + "src": "1861:21:49", + "trueBody": { + "id": 6587, + "nodeType": "Break", + "src": "1877:5:49" + } + } + ] + }, + "condition": { + "hexValue": "74727565", + "id": 6575, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1657:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "id": 6590, + "nodeType": "WhileStatement", + "src": "1650:247:49" + }, + { + "expression": { + "id": 6591, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6565, + "src": "1917:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 6554, + "id": 6592, + "nodeType": "Return", + "src": "1910:13:49" + } + ] + } + ] + }, + "documentation": { + "id": 6548, + "nodeType": "StructuredDocumentation", + "src": "1213:90:49", + "text": " @dev Converts a `uint256` to its ASCII `string` decimal representation." + }, + "id": 6595, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toString", + "nameLocation": "1317:8:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6551, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6550, + "mutability": "mutable", + "name": "value", + "nameLocation": "1334:5:49", + "nodeType": "VariableDeclaration", + "scope": 6595, + "src": "1326:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6549, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1326:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1325:15:49" + }, + "returnParameters": { + "id": 6554, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6553, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6595, + "src": "1364:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6552, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1364:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "1363:15:49" + }, + "scope": 7883, + "src": "1308:632:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6620, + "nodeType": "Block", + "src": "2116:92:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 6608, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6606, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6598, + "src": "2147:5:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "hexValue": "30", + "id": 6607, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2155:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2147:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "", + "id": 6610, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2165:2:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "typeString": "literal_string \"\"" + }, + "value": "" + }, + "id": 6611, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "2147:20:49", + "trueExpression": { + "hexValue": "2d", + "id": 6609, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2159:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561", + "typeString": "literal_string \"-\"" + }, + "value": "-" + }, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "arguments": [ + { + "arguments": [ + { + "id": 6615, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6598, + "src": "2193:5:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "id": 6613, + "name": "SignedMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11847, + "src": "2178:10:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SignedMath_$11847_$", + "typeString": "type(library SignedMath)" + } + }, + "id": 6614, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2189:3:49", + "memberName": "abs", + "nodeType": "MemberAccess", + "referencedDeclaration": 11846, + "src": "2178:14:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$", + "typeString": "function (int256) pure returns (uint256)" + } + }, + "id": 6616, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2178:21:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6612, + "name": "toString", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6595, + "src": "2169:8:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$", + "typeString": "function (uint256) pure returns (string memory)" + } + }, + "id": 6617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2169:31:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "expression": { + "id": 6604, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2133:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 6603, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "2133:6:49", + "typeDescriptions": {} + } + }, + "id": 6605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2140:6:49", + "memberName": "concat", + "nodeType": "MemberAccess", + "src": "2133:13:49", + "typeDescriptions": { + "typeIdentifier": "t_function_stringconcat_pure$__$returns$_t_string_memory_ptr_$", + "typeString": "function () pure returns (string memory)" + } + }, + "id": 6618, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2133:68:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 6602, + "id": 6619, + "nodeType": "Return", + "src": "2126:75:49" + } + ] + }, + "documentation": { + "id": 6596, + "nodeType": "StructuredDocumentation", + "src": "1946:89:49", + "text": " @dev Converts a `int256` to its ASCII `string` decimal representation." + }, + "id": 6621, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toStringSigned", + "nameLocation": "2049:14:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6599, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6598, + "mutability": "mutable", + "name": "value", + "nameLocation": "2071:5:49", + "nodeType": "VariableDeclaration", + "scope": 6621, + "src": "2064:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 6597, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2064:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "2063:14:49" + }, + "returnParameters": { + "id": 6602, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6601, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6621, + "src": "2101:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6600, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "2101:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "2100:15:49" + }, + "scope": 7883, + "src": "2040:168:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6640, + "nodeType": "Block", + "src": "2387:100:49", + "statements": [ + { + "id": 6639, + "nodeType": "UncheckedBlock", + "src": "2397:84:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6630, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6624, + "src": "2440:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6636, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 6633, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6624, + "src": "2459:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 6631, + "name": "Math", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9938, + "src": "2447:4:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Math_$9938_$", + "typeString": "type(library Math)" + } + }, + "id": 6632, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2452:6:49", + "memberName": "log256", + "nodeType": "MemberAccess", + "referencedDeclaration": 9881, + "src": "2447:11:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 6634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2447:18:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 6635, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2468:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "2447:22:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6629, + "name": "toHexString", + "nodeType": "Identifier", + "overloadedDeclarations": [6641, 6724, 6744], + "referencedDeclaration": 6724, + "src": "2428:11:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$", + "typeString": "function (uint256,uint256) pure returns (string memory)" + } + }, + "id": 6637, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2428:42:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 6628, + "id": 6638, + "nodeType": "Return", + "src": "2421:49:49" + } + ] + } + ] + }, + "documentation": { + "id": 6622, + "nodeType": "StructuredDocumentation", + "src": "2214:94:49", + "text": " @dev Converts a `uint256` to its ASCII `string` hexadecimal representation." + }, + "id": 6641, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toHexString", + "nameLocation": "2322:11:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6625, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6624, + "mutability": "mutable", + "name": "value", + "nameLocation": "2342:5:49", + "nodeType": "VariableDeclaration", + "scope": 6641, + "src": "2334:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6623, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2334:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2333:15:49" + }, + "returnParameters": { + "id": 6628, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6627, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6641, + "src": "2372:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6626, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "2372:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "2371:15:49" + }, + "scope": 7883, + "src": "2313:174:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6723, + "nodeType": "Block", + "src": "2700:435:49", + "statements": [ + { + "assignments": [6652], + "declarations": [ + { + "constant": false, + "id": 6652, + "mutability": "mutable", + "name": "localValue", + "nameLocation": "2718:10:49", + "nodeType": "VariableDeclaration", + "scope": 6723, + "src": "2710:18:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6651, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2710:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6654, + "initialValue": { + "id": 6653, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6644, + "src": "2731:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2710:26:49" + }, + { + "assignments": [6656], + "declarations": [ + { + "constant": false, + "id": 6656, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "2759:6:49", + "nodeType": "VariableDeclaration", + "scope": 6723, + "src": "2746:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6655, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2746:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6665, + "initialValue": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6661, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 6659, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2778:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 6660, + "name": "length", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6646, + "src": "2782:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2778:10:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "32", + "id": 6662, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2791:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "2778:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6658, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "2768:9:49", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (uint256) pure returns (bytes memory)" + }, + "typeName": { + "id": 6657, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2772:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + "id": 6664, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2768:25:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2746:47:49" + }, + { + "expression": { + "id": 6670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 6666, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6656, + "src": "2803:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6668, + "indexExpression": { + "hexValue": "30", + "id": 6667, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2810:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2803:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "30", + "id": 6669, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2815:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "typeString": "literal_string \"0\"" + }, + "value": "0" + }, + "src": "2803:15:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 6671, + "nodeType": "ExpressionStatement", + "src": "2803:15:49" + }, + { + "expression": { + "id": 6676, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 6672, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6656, + "src": "2828:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6674, + "indexExpression": { + "hexValue": "31", + "id": 6673, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2835:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2828:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "78", + "id": 6675, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2840:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7521d1cadbcfa91eec65aa16715b94ffc1c9654ba57ea2ef1a2127bca1127a83", + "typeString": "literal_string \"x\"" + }, + "value": "x" + }, + "src": "2828:15:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 6677, + "nodeType": "ExpressionStatement", + "src": "2828:15:49" + }, + { + "body": { + "id": 6706, + "nodeType": "Block", + "src": "2898:95:49", + "statements": [ + { + "expression": { + "id": 6700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 6692, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6656, + "src": "2912:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6694, + "indexExpression": { + "id": 6693, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6679, + "src": "2919:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2912:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "baseExpression": { + "id": 6695, + "name": "HEX_DIGITS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6495, + "src": "2924:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes16", + "typeString": "bytes16" + } + }, + "id": 6699, + "indexExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6698, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6696, + "name": "localValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6652, + "src": "2935:10:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "hexValue": "307866", + "id": 6697, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2948:3:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_15_by_1", + "typeString": "int_const 15" + }, + "value": "0xf" + }, + "src": "2935:16:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2924:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "2912:40:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 6701, + "nodeType": "ExpressionStatement", + "src": "2912:40:49" + }, + { + "expression": { + "id": 6704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 6702, + "name": "localValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6652, + "src": "2966:10:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "34", + "id": 6703, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2981:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "2966:16:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6705, + "nodeType": "ExpressionStatement", + "src": "2966:16:49" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6688, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6686, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6679, + "src": "2886:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "31", + "id": 6687, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2890:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "2886:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6707, + "initializationExpression": { + "assignments": [6679], + "declarations": [ + { + "constant": false, + "id": 6679, + "mutability": "mutable", + "name": "i", + "nameLocation": "2866:1:49", + "nodeType": "VariableDeclaration", + "scope": 6707, + "src": "2858:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6678, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2858:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6685, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6682, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 6680, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2870:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 6681, + "name": "length", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6646, + "src": "2874:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2870:10:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 6683, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2883:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "2870:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2858:26:49" + }, + "isSimpleCounterLoop": false, + "loopExpression": { + "expression": { + "id": 6690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "--", + "prefix": true, + "src": "2893:3:49", + "subExpression": { + "id": 6689, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6679, + "src": "2895:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6691, + "nodeType": "ExpressionStatement", + "src": "2893:3:49" + }, + "nodeType": "ForStatement", + "src": "2853:140:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6710, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6708, + "name": "localValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6652, + "src": "3006:10:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 6709, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3020:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3006:15:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6717, + "nodeType": "IfStatement", + "src": "3002:96:49", + "trueBody": { + "id": 6716, + "nodeType": "Block", + "src": "3023:75:49", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 6712, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6644, + "src": "3073:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 6713, + "name": "length", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6646, + "src": "3080:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6711, + "name": "StringsInsufficientHexLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6541, + "src": "3044:28:49", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 6714, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3044:43:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 6715, + "nodeType": "RevertStatement", + "src": "3037:50:49" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 6720, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6656, + "src": "3121:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6719, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3114:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 6718, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3114:6:49", + "typeDescriptions": {} + } + }, + "id": 6721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3114:14:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 6650, + "id": 6722, + "nodeType": "Return", + "src": "3107:21:49" + } + ] + }, + "documentation": { + "id": 6642, + "nodeType": "StructuredDocumentation", + "src": "2493:112:49", + "text": " @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length." + }, + "id": 6724, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toHexString", + "nameLocation": "2619:11:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6647, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6644, + "mutability": "mutable", + "name": "value", + "nameLocation": "2639:5:49", + "nodeType": "VariableDeclaration", + "scope": 6724, + "src": "2631:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6643, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2631:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6646, + "mutability": "mutable", + "name": "length", + "nameLocation": "2654:6:49", + "nodeType": "VariableDeclaration", + "scope": 6724, + "src": "2646:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6645, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2646:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2630:31:49" + }, + "returnParameters": { + "id": 6650, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6649, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6724, + "src": "2685:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6648, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "2685:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "2684:15:49" + }, + "scope": 7883, + "src": "2610:525:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6743, + "nodeType": "Block", + "src": "3367:75:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 6737, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6727, + "src": "3412:4:49", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6736, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3404:7:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 6735, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "3404:7:49", + "typeDescriptions": {} + } + }, + "id": 6738, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3404:13:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + ], + "id": 6734, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3396:7:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 6733, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3396:7:49", + "typeDescriptions": {} + } + }, + "id": 6739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3396:22:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 6740, + "name": "ADDRESS_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6498, + "src": "3420:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 6732, + "name": "toHexString", + "nodeType": "Identifier", + "overloadedDeclarations": [6641, 6724, 6744], + "referencedDeclaration": 6724, + "src": "3384:11:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$", + "typeString": "function (uint256,uint256) pure returns (string memory)" + } + }, + "id": 6741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3384:51:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 6731, + "id": 6742, + "nodeType": "Return", + "src": "3377:58:49" + } + ] + }, + "documentation": { + "id": 6725, + "nodeType": "StructuredDocumentation", + "src": "3141:148:49", + "text": " @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n representation." + }, + "id": 6744, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toHexString", + "nameLocation": "3303:11:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6728, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6727, + "mutability": "mutable", + "name": "addr", + "nameLocation": "3323:4:49", + "nodeType": "VariableDeclaration", + "scope": 6744, + "src": "3315:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6726, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3315:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3314:14:49" + }, + "returnParameters": { + "id": 6731, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6730, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6744, + "src": "3352:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6729, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3352:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "3351:15:49" + }, + "scope": 7883, + "src": "3294:148:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6808, + "nodeType": "Block", + "src": "3699:642:49", + "statements": [ + { + "assignments": [6753], + "declarations": [ + { + "constant": false, + "id": 6753, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "3722:6:49", + "nodeType": "VariableDeclaration", + "scope": 6808, + "src": "3709:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6752, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3709:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6760, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 6757, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6747, + "src": "3749:4:49", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 6756, + "name": "toHexString", + "nodeType": "Identifier", + "overloadedDeclarations": [6641, 6724, 6744], + "referencedDeclaration": 6744, + "src": "3737:11:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_address_$returns$_t_string_memory_ptr_$", + "typeString": "function (address) pure returns (string memory)" + } + }, + "id": 6758, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3737:17:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6755, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3731:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6754, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3731:5:49", + "typeDescriptions": {} + } + }, + "id": 6759, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3731:24:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3709:46:49" + }, + { + "assignments": [6762], + "declarations": [ + { + "constant": false, + "id": 6762, + "mutability": "mutable", + "name": "hashValue", + "nameLocation": "3848:9:49", + "nodeType": "VariableDeclaration", + "scope": 6808, + "src": "3840:17:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6761, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3840:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6763, + "nodeType": "VariableDeclarationStatement", + "src": "3840:17:49" + }, + { + "AST": { + "nativeSrc": "3892:78:49", + "nodeType": "YulBlock", + "src": "3892:78:49", + "statements": [ + { + "nativeSrc": "3906:54:49", + "nodeType": "YulAssignment", + "src": "3906:54:49", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3923:2:49", + "nodeType": "YulLiteral", + "src": "3923:2:49", + "type": "", + "value": "96" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "buffer", + "nativeSrc": "3941:6:49", + "nodeType": "YulIdentifier", + "src": "3941:6:49" + }, + { + "kind": "number", + "nativeSrc": "3949:4:49", + "nodeType": "YulLiteral", + "src": "3949:4:49", + "type": "", + "value": "0x22" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3937:3:49", + "nodeType": "YulIdentifier", + "src": "3937:3:49" + }, + "nativeSrc": "3937:17:49", + "nodeType": "YulFunctionCall", + "src": "3937:17:49" + }, + { + "kind": "number", + "nativeSrc": "3956:2:49", + "nodeType": "YulLiteral", + "src": "3956:2:49", + "type": "", + "value": "40" + } + ], + "functionName": { + "name": "keccak256", + "nativeSrc": "3927:9:49", + "nodeType": "YulIdentifier", + "src": "3927:9:49" + }, + "nativeSrc": "3927:32:49", + "nodeType": "YulFunctionCall", + "src": "3927:32:49" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "3919:3:49", + "nodeType": "YulIdentifier", + "src": "3919:3:49" + }, + "nativeSrc": "3919:41:49", + "nodeType": "YulFunctionCall", + "src": "3919:41:49" + }, + "variableNames": [ + { + "name": "hashValue", + "nativeSrc": "3906:9:49", + "nodeType": "YulIdentifier", + "src": "3906:9:49" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 6753, + "isOffset": false, + "isSlot": false, + "src": "3941:6:49", + "valueSize": 1 + }, + { + "declaration": 6762, + "isOffset": false, + "isSlot": false, + "src": "3906:9:49", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 6764, + "nodeType": "InlineAssembly", + "src": "3867:103:49" + }, + { + "body": { + "id": 6801, + "nodeType": "Block", + "src": "4013:291:49", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 6788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6779, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6777, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6775, + "name": "hashValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6762, + "src": "4119:9:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "hexValue": "307866", + "id": 6776, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4131:3:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_15_by_1", + "typeString": "int_const 15" + }, + "value": "0xf" + }, + "src": "4119:15:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "37", + "id": 6778, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4137:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_7_by_1", + "typeString": "int_const 7" + }, + "value": "7" + }, + "src": "4119:19:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 6787, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "baseExpression": { + "id": 6782, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6753, + "src": "4148:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6784, + "indexExpression": { + "id": 6783, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6766, + "src": "4155:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4148:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 6781, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4142:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 6780, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4142:5:49", + "typeDescriptions": {} + } + }, + "id": 6785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4142:16:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "3936", + "id": 6786, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4161:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "value": "96" + }, + "src": "4142:21:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4119:44:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6796, + "nodeType": "IfStatement", + "src": "4115:150:49", + "trueBody": { + "id": 6795, + "nodeType": "Block", + "src": "4165:100:49", + "statements": [ + { + "expression": { + "id": 6793, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 6789, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6753, + "src": "4233:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6791, + "indexExpression": { + "id": 6790, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6766, + "src": "4240:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "4233:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "^=", + "rightHandSide": { + "hexValue": "30783230", + "id": 6792, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4246:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "0x20" + }, + "src": "4233:17:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 6794, + "nodeType": "ExpressionStatement", + "src": "4233:17:49" + } + ] + } + }, + { + "expression": { + "id": 6799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 6797, + "name": "hashValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6762, + "src": "4278:9:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "34", + "id": 6798, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4292:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "4278:15:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6800, + "nodeType": "ExpressionStatement", + "src": "4278:15:49" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6769, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6766, + "src": "4001:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "31", + "id": 6770, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4005:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "4001:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6802, + "initializationExpression": { + "assignments": [6766], + "declarations": [ + { + "constant": false, + "id": 6766, + "mutability": "mutable", + "name": "i", + "nameLocation": "3993:1:49", + "nodeType": "VariableDeclaration", + "scope": 6802, + "src": "3985:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6765, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3985:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6768, + "initialValue": { + "hexValue": "3431", + "id": 6767, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3997:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_41_by_1", + "typeString": "int_const 41" + }, + "value": "41" + }, + "nodeType": "VariableDeclarationStatement", + "src": "3985:14:49" + }, + "isSimpleCounterLoop": false, + "loopExpression": { + "expression": { + "id": 6773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "--", + "prefix": true, + "src": "4008:3:49", + "subExpression": { + "id": 6772, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6766, + "src": "4010:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6774, + "nodeType": "ExpressionStatement", + "src": "4008:3:49" + }, + "nodeType": "ForStatement", + "src": "3980:324:49" + }, + { + "expression": { + "arguments": [ + { + "id": 6805, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6753, + "src": "4327:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6804, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4320:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 6803, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "4320:6:49", + "typeDescriptions": {} + } + }, + "id": 6806, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4320:14:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 6751, + "id": 6807, + "nodeType": "Return", + "src": "4313:21:49" + } + ] + }, + "documentation": { + "id": 6745, + "nodeType": "StructuredDocumentation", + "src": "3448:165:49", + "text": " @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n representation, according to EIP-55." + }, + "id": 6809, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toChecksumHexString", + "nameLocation": "3627:19:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6748, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6747, + "mutability": "mutable", + "name": "addr", + "nameLocation": "3655:4:49", + "nodeType": "VariableDeclaration", + "scope": 6809, + "src": "3647:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 6746, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3647:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3646:14:49" + }, + "returnParameters": { + "id": 6751, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6750, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6809, + "src": "3684:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6749, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "3684:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "3683:15:49" + }, + "scope": 7883, + "src": "3618:723:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6845, + "nodeType": "Block", + "src": "4496:104:49", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 6843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 6821, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6812, + "src": "4519:1:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6820, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4513:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6819, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4513:5:49", + "typeDescriptions": {} + } + }, + "id": 6822, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4513:8:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6823, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4522:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4513:15:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 6826, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6814, + "src": "4538:1:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6825, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4532:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6824, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4532:5:49", + "typeDescriptions": {} + } + }, + "id": 6827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4532:8:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6828, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4541:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4532:15:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4513:34:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 6842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 6833, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6812, + "src": "4567:1:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4561:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6831, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4561:5:49", + "typeDescriptions": {} + } + }, + "id": 6834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4561:8:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6830, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "4551:9:49", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 6835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4551:19:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 6839, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6814, + "src": "4590:1:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6838, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4584:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6837, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4584:5:49", + "typeDescriptions": {} + } + }, + "id": 6840, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4584:8:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 6836, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "4574:9:49", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 6841, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4574:19:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "4551:42:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4513:80:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 6818, + "id": 6844, + "nodeType": "Return", + "src": "4506:87:49" + } + ] + }, + "documentation": { + "id": 6810, + "nodeType": "StructuredDocumentation", + "src": "4347:66:49", + "text": " @dev Returns true if the two strings are equal." + }, + "id": 6846, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "equal", + "nameLocation": "4427:5:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6815, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6812, + "mutability": "mutable", + "name": "a", + "nameLocation": "4447:1:49", + "nodeType": "VariableDeclaration", + "scope": 6846, + "src": "4433:15:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6811, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "4433:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6814, + "mutability": "mutable", + "name": "b", + "nameLocation": "4464:1:49", + "nodeType": "VariableDeclaration", + "scope": 6846, + "src": "4450:15:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6813, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "4450:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "4432:34:49" + }, + "returnParameters": { + "id": 6818, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6817, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6846, + "src": "4490:4:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6816, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4490:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "4489:6:49" + }, + "scope": 7883, + "src": "4418:182:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6864, + "nodeType": "Block", + "src": "4897:64:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6855, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6849, + "src": "4924:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 6856, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4931:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 6859, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6849, + "src": "4940:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6858, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4934:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6857, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4934:5:49", + "typeDescriptions": {} + } + }, + "id": 6860, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4934:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6861, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4947:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4934:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6854, + "name": "parseUint", + "nodeType": "Identifier", + "overloadedDeclarations": [6865, 6896], + "referencedDeclaration": 6896, + "src": "4914:9:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (uint256)" + } + }, + "id": 6862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4914:40:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 6853, + "id": 6863, + "nodeType": "Return", + "src": "4907:47:49" + } + ] + }, + "documentation": { + "id": 6847, + "nodeType": "StructuredDocumentation", + "src": "4606:214:49", + "text": " @dev Parse a decimal string and returns the value as a `uint256`.\n Requirements:\n - The string must be formatted as `[0-9]*`\n - The result must fit into an `uint256` type" + }, + "id": 6865, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseUint", + "nameLocation": "4834:9:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6850, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6849, + "mutability": "mutable", + "name": "input", + "nameLocation": "4858:5:49", + "nodeType": "VariableDeclaration", + "scope": 6865, + "src": "4844:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6848, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "4844:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "4843:21:49" + }, + "returnParameters": { + "id": 6853, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6852, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6865, + "src": "4888:7:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6851, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4888:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4887:9:49" + }, + "scope": 7883, + "src": "4825:136:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6895, + "nodeType": "Block", + "src": "5366:153:49", + "statements": [ + { + "assignments": [6878, 6880], + "declarations": [ + { + "constant": false, + "id": 6878, + "mutability": "mutable", + "name": "success", + "nameLocation": "5382:7:49", + "nodeType": "VariableDeclaration", + "scope": 6895, + "src": "5377:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6877, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5377:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6880, + "mutability": "mutable", + "name": "value", + "nameLocation": "5399:5:49", + "nodeType": "VariableDeclaration", + "scope": 6895, + "src": "5391:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6879, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5391:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6886, + "initialValue": { + "arguments": [ + { + "id": 6882, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6868, + "src": "5421:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 6883, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6870, + "src": "5428:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 6884, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6872, + "src": "5435:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6881, + "name": "tryParseUint", + "nodeType": "Identifier", + "overloadedDeclarations": [6917, 6954], + "referencedDeclaration": 6954, + "src": "5408:12:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 6885, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5408:31:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5376:63:49" + }, + { + "condition": { + "id": 6888, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "5453:8:49", + "subExpression": { + "id": 6887, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6878, + "src": "5454:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6892, + "nodeType": "IfStatement", + "src": "5449:41:49", + "trueBody": { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 6889, + "name": "StringsInvalidChar", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6544, + "src": "5470:18:49", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 6890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5470:20:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 6891, + "nodeType": "RevertStatement", + "src": "5463:27:49" + } + }, + { + "expression": { + "id": 6893, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6880, + "src": "5507:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 6876, + "id": 6894, + "nodeType": "Return", + "src": "5500:12:49" + } + ] + }, + "documentation": { + "id": 6866, + "nodeType": "StructuredDocumentation", + "src": "4967:294:49", + "text": " @dev Variant of {parseUint-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `[0-9]*`\n - The result must fit into an `uint256` type" + }, + "id": 6896, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseUint", + "nameLocation": "5275:9:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6873, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6868, + "mutability": "mutable", + "name": "input", + "nameLocation": "5299:5:49", + "nodeType": "VariableDeclaration", + "scope": 6896, + "src": "5285:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6867, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5285:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6870, + "mutability": "mutable", + "name": "begin", + "nameLocation": "5314:5:49", + "nodeType": "VariableDeclaration", + "scope": 6896, + "src": "5306:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6869, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5306:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6872, + "mutability": "mutable", + "name": "end", + "nameLocation": "5329:3:49", + "nodeType": "VariableDeclaration", + "scope": 6896, + "src": "5321:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6871, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5321:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5284:49:49" + }, + "returnParameters": { + "id": 6876, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6875, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 6896, + "src": "5357:7:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6874, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5357:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5356:9:49" + }, + "scope": 7883, + "src": "5266:253:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6916, + "nodeType": "Block", + "src": "5840:83:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 6907, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6899, + "src": "5886:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 6908, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5893:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 6911, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6899, + "src": "5902:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6910, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5896:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6909, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5896:5:49", + "typeDescriptions": {} + } + }, + "id": 6912, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5896:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6913, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5909:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5896:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6906, + "name": "_tryParseUintUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7024, + "src": "5857:28:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 6914, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5857:59:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "functionReturnParameters": 6905, + "id": 6915, + "nodeType": "Return", + "src": "5850:66:49" + } + ] + }, + "documentation": { + "id": 6897, + "nodeType": "StructuredDocumentation", + "src": "5525:215:49", + "text": " @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.\n NOTE: This function will revert if the result does not fit in a `uint256`." + }, + "id": 6917, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseUint", + "nameLocation": "5754:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6900, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6899, + "mutability": "mutable", + "name": "input", + "nameLocation": "5781:5:49", + "nodeType": "VariableDeclaration", + "scope": 6917, + "src": "5767:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6898, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5767:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "5766:21:49" + }, + "returnParameters": { + "id": 6905, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6902, + "mutability": "mutable", + "name": "success", + "nameLocation": "5816:7:49", + "nodeType": "VariableDeclaration", + "scope": 6917, + "src": "5811:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6901, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5811:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6904, + "mutability": "mutable", + "name": "value", + "nameLocation": "5833:5:49", + "nodeType": "VariableDeclaration", + "scope": 6917, + "src": "5825:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6903, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5825:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5810:29:49" + }, + "scope": 7883, + "src": "5745:178:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 6953, + "nodeType": "Block", + "src": "6325:144:49", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 6941, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6937, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6931, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6924, + "src": "6339:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 6934, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6920, + "src": "6351:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6933, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6345:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6932, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "6345:5:49", + "typeDescriptions": {} + } + }, + "id": 6935, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6345:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 6936, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6358:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "6345:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6339:25:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6940, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6938, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6922, + "src": "6368:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 6939, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6924, + "src": "6376:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6368:11:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "6339:40:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 6946, + "nodeType": "IfStatement", + "src": "6335:63:49", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 6942, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6389:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 6943, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6396:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 6944, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6388:10:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 6930, + "id": 6945, + "nodeType": "Return", + "src": "6381:17:49" + } + }, + { + "expression": { + "arguments": [ + { + "id": 6948, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6920, + "src": "6444:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 6949, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6922, + "src": "6451:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 6950, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6924, + "src": "6458:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6947, + "name": "_tryParseUintUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7024, + "src": "6415:28:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 6951, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6415:47:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "functionReturnParameters": 6930, + "id": 6952, + "nodeType": "Return", + "src": "6408:54:49" + } + ] + }, + "documentation": { + "id": 6918, + "nodeType": "StructuredDocumentation", + "src": "5929:238:49", + "text": " @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n character.\n NOTE: This function will revert if the result does not fit in a `uint256`." + }, + "id": 6954, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseUint", + "nameLocation": "6181:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6925, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6920, + "mutability": "mutable", + "name": "input", + "nameLocation": "6217:5:49", + "nodeType": "VariableDeclaration", + "scope": 6954, + "src": "6203:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6919, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6203:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6922, + "mutability": "mutable", + "name": "begin", + "nameLocation": "6240:5:49", + "nodeType": "VariableDeclaration", + "scope": 6954, + "src": "6232:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6921, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6232:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6924, + "mutability": "mutable", + "name": "end", + "nameLocation": "6263:3:49", + "nodeType": "VariableDeclaration", + "scope": 6954, + "src": "6255:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6923, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6255:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6193:79:49" + }, + "returnParameters": { + "id": 6930, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6927, + "mutability": "mutable", + "name": "success", + "nameLocation": "6301:7:49", + "nodeType": "VariableDeclaration", + "scope": 6954, + "src": "6296:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6926, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "6296:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6929, + "mutability": "mutable", + "name": "value", + "nameLocation": "6318:5:49", + "nodeType": "VariableDeclaration", + "scope": 6954, + "src": "6310:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6928, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6310:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6295:29:49" + }, + "scope": 7883, + "src": "6172:297:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7023, + "nodeType": "Block", + "src": "6872:347:49", + "statements": [ + { + "assignments": [6969], + "declarations": [ + { + "constant": false, + "id": 6969, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "6895:6:49", + "nodeType": "VariableDeclaration", + "scope": 7023, + "src": "6882:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 6968, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "6882:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 6974, + "initialValue": { + "arguments": [ + { + "id": 6972, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6957, + "src": "6910:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 6971, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6904:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 6970, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "6904:5:49", + "typeDescriptions": {} + } + }, + "id": 6973, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6904:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6882:34:49" + }, + { + "assignments": [6976], + "declarations": [ + { + "constant": false, + "id": 6976, + "mutability": "mutable", + "name": "result", + "nameLocation": "6935:6:49", + "nodeType": "VariableDeclaration", + "scope": 7023, + "src": "6927:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6975, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6927:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6978, + "initialValue": { + "hexValue": "30", + "id": 6977, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6944:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "6927:18:49" + }, + { + "body": { + "id": 7017, + "nodeType": "Block", + "src": "6993:189:49", + "statements": [ + { + "assignments": [6990], + "declarations": [ + { + "constant": false, + "id": 6990, + "mutability": "mutable", + "name": "chr", + "nameLocation": "7013:3:49", + "nodeType": "VariableDeclaration", + "scope": 7017, + "src": "7007:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 6989, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "7007:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 7000, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 6995, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6969, + "src": "7062:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 6996, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6980, + "src": "7070:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6994, + "name": "_unsafeReadBytesOffset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7882, + "src": "7039:22:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 6997, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7039:33:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 6993, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7032:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 6992, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "7032:6:49", + "typeDescriptions": {} + } + }, + "id": 6998, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7032:41:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 6991, + "name": "_tryParseChr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7704, + "src": "7019:12:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes1_$returns$_t_uint8_$", + "typeString": "function (bytes1) pure returns (uint8)" + } + }, + "id": 6999, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7019:55:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7007:67:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7003, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7001, + "name": "chr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6990, + "src": "7092:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "39", + "id": 7002, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7098:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_9_by_1", + "typeString": "int_const 9" + }, + "value": "9" + }, + "src": "7092:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7008, + "nodeType": "IfStatement", + "src": "7088:30:49", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7004, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7109:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 7005, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7116:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 7006, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "7108:10:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 6967, + "id": 7007, + "nodeType": "Return", + "src": "7101:17:49" + } + }, + { + "expression": { + "id": 7011, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7009, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6976, + "src": "7132:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "hexValue": "3130", + "id": 7010, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7142:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "src": "7132:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 7012, + "nodeType": "ExpressionStatement", + "src": "7132:12:49" + }, + { + "expression": { + "id": 7015, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7013, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6976, + "src": "7158:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 7014, + "name": "chr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6990, + "src": "7168:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "7158:13:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 7016, + "nodeType": "ExpressionStatement", + "src": "7158:13:49" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 6985, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 6983, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6980, + "src": "6979:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 6984, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6961, + "src": "6983:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6979:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7018, + "initializationExpression": { + "assignments": [6980], + "declarations": [ + { + "constant": false, + "id": 6980, + "mutability": "mutable", + "name": "i", + "nameLocation": "6968:1:49", + "nodeType": "VariableDeclaration", + "scope": 7018, + "src": "6960:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6979, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6960:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 6982, + "initialValue": { + "id": 6981, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6959, + "src": "6972:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6960:17:49" + }, + "isSimpleCounterLoop": true, + "loopExpression": { + "expression": { + "id": 6987, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "6988:3:49", + "subExpression": { + "id": 6986, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6980, + "src": "6990:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 6988, + "nodeType": "ExpressionStatement", + "src": "6988:3:49" + }, + "nodeType": "ForStatement", + "src": "6955:227:49" + }, + { + "expression": { + "components": [ + { + "hexValue": "74727565", + "id": 7019, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7199:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + { + "id": 7020, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6976, + "src": "7205:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 7021, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "7198:14:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "functionReturnParameters": 6967, + "id": 7022, + "nodeType": "Return", + "src": "7191:21:49" + } + ] + }, + "documentation": { + "id": 6955, + "nodeType": "StructuredDocumentation", + "src": "6475:224:49", + "text": " @dev Implementation of {tryParseUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n `begin <= end <= input.length`. Other inputs would result in undefined behavior." + }, + "id": 7024, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_tryParseUintUncheckedBounds", + "nameLocation": "6713:28:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6962, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6957, + "mutability": "mutable", + "name": "input", + "nameLocation": "6765:5:49", + "nodeType": "VariableDeclaration", + "scope": 7024, + "src": "6751:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 6956, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6751:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6959, + "mutability": "mutable", + "name": "begin", + "nameLocation": "6788:5:49", + "nodeType": "VariableDeclaration", + "scope": 7024, + "src": "6780:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6958, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6780:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6961, + "mutability": "mutable", + "name": "end", + "nameLocation": "6811:3:49", + "nodeType": "VariableDeclaration", + "scope": 7024, + "src": "6803:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6960, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6803:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6741:79:49" + }, + "returnParameters": { + "id": 6967, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 6964, + "mutability": "mutable", + "name": "success", + "nameLocation": "6848:7:49", + "nodeType": "VariableDeclaration", + "scope": 7024, + "src": "6843:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 6963, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "6843:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6966, + "mutability": "mutable", + "name": "value", + "nameLocation": "6865:5:49", + "nodeType": "VariableDeclaration", + "scope": 7024, + "src": "6857:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6965, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6857:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6842:29:49" + }, + "scope": 7883, + "src": "6704:515:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 7042, + "nodeType": "Block", + "src": "7516:63:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 7033, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7027, + "src": "7542:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 7034, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7549:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 7037, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7027, + "src": "7558:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7036, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7552:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7035, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "7552:5:49", + "typeDescriptions": {} + } + }, + "id": 7038, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7552:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7039, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7565:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "7552:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7032, + "name": "parseInt", + "nodeType": "Identifier", + "overloadedDeclarations": [7043, 7074], + "referencedDeclaration": 7074, + "src": "7533:8:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_int256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (int256)" + } + }, + "id": 7040, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7533:39:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 7031, + "id": 7041, + "nodeType": "Return", + "src": "7526:46:49" + } + ] + }, + "documentation": { + "id": 7025, + "nodeType": "StructuredDocumentation", + "src": "7225:216:49", + "text": " @dev Parse a decimal string and returns the value as a `int256`.\n Requirements:\n - The string must be formatted as `[-+]?[0-9]*`\n - The result must fit in an `int256` type." + }, + "id": 7043, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseInt", + "nameLocation": "7455:8:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7028, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7027, + "mutability": "mutable", + "name": "input", + "nameLocation": "7478:5:49", + "nodeType": "VariableDeclaration", + "scope": 7043, + "src": "7464:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7026, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "7464:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "7463:21:49" + }, + "returnParameters": { + "id": 7031, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7030, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7043, + "src": "7508:6:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 7029, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "7508:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "7507:8:49" + }, + "scope": 7883, + "src": "7446:133:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7073, + "nodeType": "Block", + "src": "7984:151:49", + "statements": [ + { + "assignments": [7056, 7058], + "declarations": [ + { + "constant": false, + "id": 7056, + "mutability": "mutable", + "name": "success", + "nameLocation": "8000:7:49", + "nodeType": "VariableDeclaration", + "scope": 7073, + "src": "7995:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7055, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7995:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7058, + "mutability": "mutable", + "name": "value", + "nameLocation": "8016:5:49", + "nodeType": "VariableDeclaration", + "scope": 7073, + "src": "8009:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 7057, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "8009:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "id": 7064, + "initialValue": { + "arguments": [ + { + "id": 7060, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7046, + "src": "8037:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 7061, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7048, + "src": "8044:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7062, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7050, + "src": "8051:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7059, + "name": "tryParseInt", + "nodeType": "Identifier", + "overloadedDeclarations": [7095, 7137], + "referencedDeclaration": 7137, + "src": "8025:11:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_int256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,int256)" + } + }, + "id": 7063, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8025:30:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_int256_$", + "typeString": "tuple(bool,int256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7994:61:49" + }, + { + "condition": { + "id": 7066, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "8069:8:49", + "subExpression": { + "id": 7065, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7056, + "src": "8070:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7070, + "nodeType": "IfStatement", + "src": "8065:41:49", + "trueBody": { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 7067, + "name": "StringsInvalidChar", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6544, + "src": "8086:18:49", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 7068, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8086:20:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 7069, + "nodeType": "RevertStatement", + "src": "8079:27:49" + } + }, + { + "expression": { + "id": 7071, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7058, + "src": "8123:5:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 7054, + "id": 7072, + "nodeType": "Return", + "src": "8116:12:49" + } + ] + }, + "documentation": { + "id": 7044, + "nodeType": "StructuredDocumentation", + "src": "7585:296:49", + "text": " @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `[-+]?[0-9]*`\n - The result must fit in an `int256` type." + }, + "id": 7074, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseInt", + "nameLocation": "7895:8:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7051, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7046, + "mutability": "mutable", + "name": "input", + "nameLocation": "7918:5:49", + "nodeType": "VariableDeclaration", + "scope": 7074, + "src": "7904:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7045, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "7904:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7048, + "mutability": "mutable", + "name": "begin", + "nameLocation": "7933:5:49", + "nodeType": "VariableDeclaration", + "scope": 7074, + "src": "7925:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7047, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7925:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7050, + "mutability": "mutable", + "name": "end", + "nameLocation": "7948:3:49", + "nodeType": "VariableDeclaration", + "scope": 7074, + "src": "7940:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7049, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7940:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7903:49:49" + }, + "returnParameters": { + "id": 7054, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7053, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7074, + "src": "7976:6:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 7052, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "7976:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "7975:8:49" + }, + "scope": 7883, + "src": "7886:249:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7094, + "nodeType": "Block", + "src": "8526:82:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 7085, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7077, + "src": "8571:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 7086, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8578:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 7089, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7077, + "src": "8587:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7088, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8581:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7087, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8581:5:49", + "typeDescriptions": {} + } + }, + "id": 7090, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8581:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7091, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8594:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "8581:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7084, + "name": "_tryParseIntUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7258, + "src": "8543:27:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_int256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,int256)" + } + }, + "id": 7092, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8543:58:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_int256_$", + "typeString": "tuple(bool,int256)" + } + }, + "functionReturnParameters": 7083, + "id": 7093, + "nodeType": "Return", + "src": "8536:65:49" + } + ] + }, + "documentation": { + "id": 7075, + "nodeType": "StructuredDocumentation", + "src": "8141:287:49", + "text": " @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if\n the result does not fit in a `int256`.\n NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`." + }, + "id": 7095, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseInt", + "nameLocation": "8442:11:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7078, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7077, + "mutability": "mutable", + "name": "input", + "nameLocation": "8468:5:49", + "nodeType": "VariableDeclaration", + "scope": 7095, + "src": "8454:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7076, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "8454:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "8453:21:49" + }, + "returnParameters": { + "id": 7083, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7080, + "mutability": "mutable", + "name": "success", + "nameLocation": "8503:7:49", + "nodeType": "VariableDeclaration", + "scope": 7095, + "src": "8498:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7079, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8498:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7082, + "mutability": "mutable", + "name": "value", + "nameLocation": "8519:5:49", + "nodeType": "VariableDeclaration", + "scope": 7095, + "src": "8512:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 7081, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "8512:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "8497:28:49" + }, + "scope": 7883, + "src": "8433:175:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "constant": true, + "id": 7100, + "mutability": "constant", + "name": "ABS_MIN_INT256", + "nameLocation": "8639:14:49", + "nodeType": "VariableDeclaration", + "scope": 7883, + "src": "8614:50:49", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7096, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8614:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "commonType": { + "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1", + "typeString": "int_const 5789...(69 digits omitted)...9968" + }, + "id": 7099, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 7097, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8656:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "323535", + "id": 7098, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8661:3:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "255" + }, + "src": "8656:8:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1", + "typeString": "int_const 5789...(69 digits omitted)...9968" + } + }, + "visibility": "private" + }, + { + "body": { + "id": 7136, + "nodeType": "Block", + "src": "9130:143:49", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7124, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7120, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7114, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7107, + "src": "9144:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 7117, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7103, + "src": "9156:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7116, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9150:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7115, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "9150:5:49", + "typeDescriptions": {} + } + }, + "id": 7118, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9150:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7119, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9163:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "9150:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9144:25:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7123, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7121, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7105, + "src": "9173:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 7122, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7107, + "src": "9181:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9173:11:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "9144:40:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7129, + "nodeType": "IfStatement", + "src": "9140:63:49", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7125, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9194:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 7126, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9201:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 7127, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "9193:10:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 7113, + "id": 7128, + "nodeType": "Return", + "src": "9186:17:49" + } + }, + { + "expression": { + "arguments": [ + { + "id": 7131, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7103, + "src": "9248:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 7132, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7105, + "src": "9255:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7133, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7107, + "src": "9262:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7130, + "name": "_tryParseIntUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7258, + "src": "9220:27:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_int256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,int256)" + } + }, + "id": 7134, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9220:46:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_int256_$", + "typeString": "tuple(bool,int256)" + } + }, + "functionReturnParameters": 7113, + "id": 7135, + "nodeType": "Return", + "src": "9213:53:49" + } + ] + }, + "documentation": { + "id": 7101, + "nodeType": "StructuredDocumentation", + "src": "8671:303:49", + "text": " @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid\n character or if the result does not fit in a `int256`.\n NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`." + }, + "id": 7137, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseInt", + "nameLocation": "8988:11:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7108, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7103, + "mutability": "mutable", + "name": "input", + "nameLocation": "9023:5:49", + "nodeType": "VariableDeclaration", + "scope": 7137, + "src": "9009:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7102, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "9009:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7105, + "mutability": "mutable", + "name": "begin", + "nameLocation": "9046:5:49", + "nodeType": "VariableDeclaration", + "scope": 7137, + "src": "9038:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7104, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9038:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7107, + "mutability": "mutable", + "name": "end", + "nameLocation": "9069:3:49", + "nodeType": "VariableDeclaration", + "scope": 7137, + "src": "9061:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7106, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9061:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8999:79:49" + }, + "returnParameters": { + "id": 7113, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7110, + "mutability": "mutable", + "name": "success", + "nameLocation": "9107:7:49", + "nodeType": "VariableDeclaration", + "scope": 7137, + "src": "9102:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7109, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9102:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7112, + "mutability": "mutable", + "name": "value", + "nameLocation": "9123:5:49", + "nodeType": "VariableDeclaration", + "scope": 7137, + "src": "9116:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 7111, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "9116:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "9101:28:49" + }, + "scope": 7883, + "src": "8979:294:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7257, + "nodeType": "Block", + "src": "9673:812:49", + "statements": [ + { + "assignments": [7152], + "declarations": [ + { + "constant": false, + "id": 7152, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "9696:6:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "9683:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7151, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "9683:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 7157, + "initialValue": { + "arguments": [ + { + "id": 7155, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7140, + "src": "9711:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7154, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9705:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7153, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "9705:5:49", + "typeDescriptions": {} + } + }, + "id": 7156, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9705:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9683:34:49" + }, + { + "assignments": [7159], + "declarations": [ + { + "constant": false, + "id": 7159, + "mutability": "mutable", + "name": "sign", + "nameLocation": "9781:4:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "9774:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 7158, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "9774:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + } + ], + "id": 7175, + "initialValue": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7162, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7160, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7142, + "src": "9788:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 7161, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7144, + "src": "9797:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9788:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 7170, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7152, + "src": "9845:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 7171, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7142, + "src": "9853:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7169, + "name": "_unsafeReadBytesOffset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7882, + "src": "9822:22:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 7172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9822:37:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7168, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9815:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 7167, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "9815:6:49", + "typeDescriptions": {} + } + }, + "id": 7173, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9815:45:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "9788:72:49", + "trueExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 7165, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9810:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 7164, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9803:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 7163, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "9803:6:49", + "typeDescriptions": {} + } + }, + "id": 7166, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9803:9:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9774:86:49" + }, + { + "assignments": [7177], + "declarations": [ + { + "constant": false, + "id": 7177, + "mutability": "mutable", + "name": "positiveSign", + "nameLocation": "9946:12:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "9941:17:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7176, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9941:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 7184, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7183, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7178, + "name": "sign", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7159, + "src": "9961:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "2b", + "id": 7181, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9976:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_728b8dbbe730d9acd55e30e768e6a28a04bea0c61b88108287c2c87d79c98bb8", + "typeString": "literal_string \"+\"" + }, + "value": "+" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_728b8dbbe730d9acd55e30e768e6a28a04bea0c61b88108287c2c87d79c98bb8", + "typeString": "literal_string \"+\"" + } + ], + "id": 7180, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9969:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 7179, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "9969:6:49", + "typeDescriptions": {} + } + }, + "id": 7182, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9969:11:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "9961:19:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9941:39:49" + }, + { + "assignments": [7186], + "declarations": [ + { + "constant": false, + "id": 7186, + "mutability": "mutable", + "name": "negativeSign", + "nameLocation": "9995:12:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "9990:17:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7185, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9990:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 7193, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7187, + "name": "sign", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7159, + "src": "10010:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "2d", + "id": 7190, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10025:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561", + "typeString": "literal_string \"-\"" + }, + "value": "-" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561", + "typeString": "literal_string \"-\"" + } + ], + "id": 7189, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10018:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 7188, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "10018:6:49", + "typeDescriptions": {} + } + }, + "id": 7191, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10018:11:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "10010:19:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9990:39:49" + }, + { + "assignments": [7195], + "declarations": [ + { + "constant": false, + "id": 7195, + "mutability": "mutable", + "name": "offset", + "nameLocation": "10047:6:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "10039:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7194, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10039:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7202, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7198, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7196, + "name": "positiveSign", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7177, + "src": "10057:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "id": 7197, + "name": "negativeSign", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7186, + "src": "10073:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "10057:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 7199, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "10056:30:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10087:6:49", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "10056:37:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$attached_to$_t_bool_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 7201, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10056:39:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10039:56:49" + }, + { + "assignments": [7204, 7206], + "declarations": [ + { + "constant": false, + "id": 7204, + "mutability": "mutable", + "name": "absSuccess", + "nameLocation": "10112:10:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "10107:15:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7203, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "10107:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7206, + "mutability": "mutable", + "name": "absValue", + "nameLocation": "10132:8:49", + "nodeType": "VariableDeclaration", + "scope": 7257, + "src": "10124:16:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7205, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10124:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7214, + "initialValue": { + "arguments": [ + { + "id": 7208, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7140, + "src": "10157:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7211, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7209, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7142, + "src": "10164:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 7210, + "name": "offset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7195, + "src": "10172:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10164:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7212, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7144, + "src": "10180:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7207, + "name": "tryParseUint", + "nodeType": "Identifier", + "overloadedDeclarations": [6917, 6954], + "referencedDeclaration": 6954, + "src": "10144:12:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 7213, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10144:40:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10106:78:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7219, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7215, + "name": "absSuccess", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7204, + "src": "10199:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7218, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7216, + "name": "absValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7206, + "src": "10213:8:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 7217, + "name": "ABS_MIN_INT256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7100, + "src": "10224:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10213:25:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "10199:39:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7241, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7237, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7235, + "name": "absSuccess", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7204, + "src": "10341:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "id": 7236, + "name": "negativeSign", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7186, + "src": "10355:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "10341:26:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7240, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7238, + "name": "absValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7206, + "src": "10371:8:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 7239, + "name": "ABS_MIN_INT256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7100, + "src": "10383:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10371:26:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "10341:56:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7251, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10469:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 7252, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10476:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 7253, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "10468:10:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 7150, + "id": 7254, + "nodeType": "Return", + "src": "10461:17:49" + }, + "id": 7255, + "nodeType": "IfStatement", + "src": "10337:141:49", + "trueBody": { + "id": 7250, + "nodeType": "Block", + "src": "10399:56:49", + "statements": [ + { + "expression": { + "components": [ + { + "hexValue": "74727565", + "id": 7242, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10421:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + { + "expression": { + "arguments": [ + { + "id": 7245, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10432:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 7244, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "10432:6:49", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + } + ], + "id": 7243, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "10427:4:49", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 7246, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10427:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_int256", + "typeString": "type(int256)" + } + }, + "id": 7247, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "10440:3:49", + "memberName": "min", + "nodeType": "MemberAccess", + "src": "10427:16:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 7248, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "10420:24:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_int256_$", + "typeString": "tuple(bool,int256)" + } + }, + "functionReturnParameters": 7150, + "id": 7249, + "nodeType": "Return", + "src": "10413:31:49" + } + ] + } + }, + "id": 7256, + "nodeType": "IfStatement", + "src": "10195:283:49", + "trueBody": { + "id": 7234, + "nodeType": "Block", + "src": "10240:91:49", + "statements": [ + { + "expression": { + "components": [ + { + "hexValue": "74727565", + "id": 7220, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10262:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + { + "condition": { + "id": 7221, + "name": "negativeSign", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7186, + "src": "10268:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "arguments": [ + { + "id": 7229, + "name": "absValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7206, + "src": "10310:8:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7228, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10303:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 7227, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "10303:6:49", + "typeDescriptions": {} + } + }, + "id": 7230, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10303:16:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 7231, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "10268:51:49", + "trueExpression": { + "id": 7226, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "-", + "prefix": true, + "src": "10283:17:49", + "subExpression": { + "arguments": [ + { + "id": 7224, + "name": "absValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7206, + "src": "10291:8:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7223, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10284:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 7222, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "10284:6:49", + "typeDescriptions": {} + } + }, + "id": 7225, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10284:16:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 7232, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "10261:59:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_int256_$", + "typeString": "tuple(bool,int256)" + } + }, + "functionReturnParameters": 7150, + "id": 7233, + "nodeType": "Return", + "src": "10254:66:49" + } + ] + } + } + ] + }, + "documentation": { + "id": 7138, + "nodeType": "StructuredDocumentation", + "src": "9279:223:49", + "text": " @dev Implementation of {tryParseInt-string-uint256-uint256} that does not check bounds. Caller should make sure that\n `begin <= end <= input.length`. Other inputs would result in undefined behavior." + }, + "id": 7258, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_tryParseIntUncheckedBounds", + "nameLocation": "9516:27:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7145, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7140, + "mutability": "mutable", + "name": "input", + "nameLocation": "9567:5:49", + "nodeType": "VariableDeclaration", + "scope": 7258, + "src": "9553:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7139, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "9553:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7142, + "mutability": "mutable", + "name": "begin", + "nameLocation": "9590:5:49", + "nodeType": "VariableDeclaration", + "scope": 7258, + "src": "9582:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7141, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9582:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7144, + "mutability": "mutable", + "name": "end", + "nameLocation": "9613:3:49", + "nodeType": "VariableDeclaration", + "scope": 7258, + "src": "9605:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7143, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9605:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9543:79:49" + }, + "returnParameters": { + "id": 7150, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7147, + "mutability": "mutable", + "name": "success", + "nameLocation": "9650:7:49", + "nodeType": "VariableDeclaration", + "scope": 7258, + "src": "9645:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7146, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9645:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7149, + "mutability": "mutable", + "name": "value", + "nameLocation": "9666:5:49", + "nodeType": "VariableDeclaration", + "scope": 7258, + "src": "9659:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 7148, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "9659:6:49", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "9644:28:49" + }, + "scope": 7883, + "src": "9507:978:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 7276, + "nodeType": "Block", + "src": "10830:67:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 7267, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7261, + "src": "10860:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 7268, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10867:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 7271, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7261, + "src": "10876:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7270, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10870:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7269, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "10870:5:49", + "typeDescriptions": {} + } + }, + "id": 7272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10870:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7273, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10883:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "10870:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7266, + "name": "parseHexUint", + "nodeType": "Identifier", + "overloadedDeclarations": [7277, 7308], + "referencedDeclaration": 7308, + "src": "10847:12:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (uint256)" + } + }, + "id": 7274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10847:43:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 7265, + "id": 7275, + "nodeType": "Return", + "src": "10840:50:49" + } + ] + }, + "documentation": { + "id": 7259, + "nodeType": "StructuredDocumentation", + "src": "10491:259:49", + "text": " @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as a `uint256`.\n Requirements:\n - The string must be formatted as `(0x)?[0-9a-fA-F]*`\n - The result must fit in an `uint256` type." + }, + "id": 7277, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseHexUint", + "nameLocation": "10764:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7262, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7261, + "mutability": "mutable", + "name": "input", + "nameLocation": "10791:5:49", + "nodeType": "VariableDeclaration", + "scope": 7277, + "src": "10777:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7260, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "10777:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "10776:21:49" + }, + "returnParameters": { + "id": 7265, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7264, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7277, + "src": "10821:7:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7263, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10821:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10820:9:49" + }, + "scope": 7883, + "src": "10755:142:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7307, + "nodeType": "Block", + "src": "11318:156:49", + "statements": [ + { + "assignments": [7290, 7292], + "declarations": [ + { + "constant": false, + "id": 7290, + "mutability": "mutable", + "name": "success", + "nameLocation": "11334:7:49", + "nodeType": "VariableDeclaration", + "scope": 7307, + "src": "11329:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7289, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "11329:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7292, + "mutability": "mutable", + "name": "value", + "nameLocation": "11351:5:49", + "nodeType": "VariableDeclaration", + "scope": 7307, + "src": "11343:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7291, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11343:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7298, + "initialValue": { + "arguments": [ + { + "id": 7294, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7280, + "src": "11376:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 7295, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7282, + "src": "11383:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7296, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7284, + "src": "11390:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7293, + "name": "tryParseHexUint", + "nodeType": "Identifier", + "overloadedDeclarations": [7329, 7366], + "referencedDeclaration": 7366, + "src": "11360:15:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 7297, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11360:34:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "11328:66:49" + }, + { + "condition": { + "id": 7300, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "11408:8:49", + "subExpression": { + "id": 7299, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7290, + "src": "11409:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7304, + "nodeType": "IfStatement", + "src": "11404:41:49", + "trueBody": { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 7301, + "name": "StringsInvalidChar", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6544, + "src": "11425:18:49", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 7302, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11425:20:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 7303, + "nodeType": "RevertStatement", + "src": "11418:27:49" + } + }, + { + "expression": { + "id": 7305, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7292, + "src": "11462:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 7288, + "id": 7306, + "nodeType": "Return", + "src": "11455:12:49" + } + ] + }, + "documentation": { + "id": 7278, + "nodeType": "StructuredDocumentation", + "src": "10903:307:49", + "text": " @dev Variant of {parseHexUint-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `(0x)?[0-9a-fA-F]*`\n - The result must fit in an `uint256` type." + }, + "id": 7308, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseHexUint", + "nameLocation": "11224:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7285, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7280, + "mutability": "mutable", + "name": "input", + "nameLocation": "11251:5:49", + "nodeType": "VariableDeclaration", + "scope": 7308, + "src": "11237:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7279, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "11237:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7282, + "mutability": "mutable", + "name": "begin", + "nameLocation": "11266:5:49", + "nodeType": "VariableDeclaration", + "scope": 7308, + "src": "11258:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7281, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11258:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7284, + "mutability": "mutable", + "name": "end", + "nameLocation": "11281:3:49", + "nodeType": "VariableDeclaration", + "scope": 7308, + "src": "11273:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7283, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11273:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11236:49:49" + }, + "returnParameters": { + "id": 7288, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7287, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7308, + "src": "11309:7:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7286, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11309:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11308:9:49" + }, + "scope": 7883, + "src": "11215:259:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7328, + "nodeType": "Block", + "src": "11801:86:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 7319, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7311, + "src": "11850:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 7320, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11857:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 7323, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7311, + "src": "11866:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7322, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11860:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7321, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "11860:5:49", + "typeDescriptions": {} + } + }, + "id": 7324, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11860:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7325, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "11873:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "11860:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7318, + "name": "_tryParseHexUintUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7469, + "src": "11818:31:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 7326, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11818:62:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "functionReturnParameters": 7317, + "id": 7327, + "nodeType": "Return", + "src": "11811:69:49" + } + ] + }, + "documentation": { + "id": 7309, + "nodeType": "StructuredDocumentation", + "src": "11480:218:49", + "text": " @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.\n NOTE: This function will revert if the result does not fit in a `uint256`." + }, + "id": 7329, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseHexUint", + "nameLocation": "11712:15:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7312, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7311, + "mutability": "mutable", + "name": "input", + "nameLocation": "11742:5:49", + "nodeType": "VariableDeclaration", + "scope": 7329, + "src": "11728:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7310, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "11728:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "11727:21:49" + }, + "returnParameters": { + "id": 7317, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7314, + "mutability": "mutable", + "name": "success", + "nameLocation": "11777:7:49", + "nodeType": "VariableDeclaration", + "scope": 7329, + "src": "11772:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7313, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "11772:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7316, + "mutability": "mutable", + "name": "value", + "nameLocation": "11794:5:49", + "nodeType": "VariableDeclaration", + "scope": 7329, + "src": "11786:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7315, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11786:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11771:29:49" + }, + "scope": 7883, + "src": "11703:184:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7365, + "nodeType": "Block", + "src": "12295:147:49", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7353, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7349, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7343, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7336, + "src": "12309:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 7346, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7332, + "src": "12321:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7345, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12315:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7344, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "12315:5:49", + "typeDescriptions": {} + } + }, + "id": 7347, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12315:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7348, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12328:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "12315:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "12309:25:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7352, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7350, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7334, + "src": "12338:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 7351, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7336, + "src": "12346:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "12338:11:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "12309:40:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7358, + "nodeType": "IfStatement", + "src": "12305:63:49", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7354, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12359:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 7355, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12366:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 7356, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "12358:10:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 7342, + "id": 7357, + "nodeType": "Return", + "src": "12351:17:49" + } + }, + { + "expression": { + "arguments": [ + { + "id": 7360, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7332, + "src": "12417:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 7361, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7334, + "src": "12424:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7362, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7336, + "src": "12431:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7359, + "name": "_tryParseHexUintUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7469, + "src": "12385:31:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 7363, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12385:50:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "functionReturnParameters": 7342, + "id": 7364, + "nodeType": "Return", + "src": "12378:57:49" + } + ] + }, + "documentation": { + "id": 7330, + "nodeType": "StructuredDocumentation", + "src": "11893:241:49", + "text": " @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an\n invalid character.\n NOTE: This function will revert if the result does not fit in a `uint256`." + }, + "id": 7366, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseHexUint", + "nameLocation": "12148:15:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7337, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7332, + "mutability": "mutable", + "name": "input", + "nameLocation": "12187:5:49", + "nodeType": "VariableDeclaration", + "scope": 7366, + "src": "12173:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7331, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "12173:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7334, + "mutability": "mutable", + "name": "begin", + "nameLocation": "12210:5:49", + "nodeType": "VariableDeclaration", + "scope": 7366, + "src": "12202:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7333, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12202:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7336, + "mutability": "mutable", + "name": "end", + "nameLocation": "12233:3:49", + "nodeType": "VariableDeclaration", + "scope": 7366, + "src": "12225:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7335, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12225:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12163:79:49" + }, + "returnParameters": { + "id": 7342, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7339, + "mutability": "mutable", + "name": "success", + "nameLocation": "12271:7:49", + "nodeType": "VariableDeclaration", + "scope": 7366, + "src": "12266:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7338, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "12266:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7341, + "mutability": "mutable", + "name": "value", + "nameLocation": "12288:5:49", + "nodeType": "VariableDeclaration", + "scope": 7366, + "src": "12280:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7340, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12280:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12265:29:49" + }, + "scope": 7883, + "src": "12139:303:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7468, + "nodeType": "Block", + "src": "12851:881:49", + "statements": [ + { + "assignments": [7381], + "declarations": [ + { + "constant": false, + "id": 7381, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "12874:6:49", + "nodeType": "VariableDeclaration", + "scope": 7468, + "src": "12861:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7380, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "12861:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 7386, + "initialValue": { + "arguments": [ + { + "id": 7384, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7369, + "src": "12889:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7383, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12883:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7382, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "12883:5:49", + "typeDescriptions": {} + } + }, + "id": 7385, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12883:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12861:34:49" + }, + { + "assignments": [7388], + "declarations": [ + { + "constant": false, + "id": 7388, + "mutability": "mutable", + "name": "hasPrefix", + "nameLocation": "12948:9:49", + "nodeType": "VariableDeclaration", + "scope": 7468, + "src": "12943:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7387, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "12943:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 7408, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7407, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7393, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7389, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7373, + "src": "12961:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7390, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7371, + "src": "12967:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 7391, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12975:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "12967:9:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "12961:15:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 7394, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "12960:17:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes2", + "typeString": "bytes2" + }, + "id": 7406, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 7398, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7381, + "src": "13011:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 7399, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7371, + "src": "13019:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7397, + "name": "_unsafeReadBytesOffset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7882, + "src": "12988:22:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 7400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12988:37:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12981:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes2_$", + "typeString": "type(bytes2)" + }, + "typeName": { + "id": 7395, + "name": "bytes2", + "nodeType": "ElementaryTypeName", + "src": "12981:6:49", + "typeDescriptions": {} + } + }, + "id": 7401, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12981:45:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes2", + "typeString": "bytes2" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "3078", + "id": 7404, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13037:4:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837", + "typeString": "literal_string \"0x\"" + }, + "value": "0x" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837", + "typeString": "literal_string \"0x\"" + } + ], + "id": 7403, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13030:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes2_$", + "typeString": "type(bytes2)" + }, + "typeName": { + "id": 7402, + "name": "bytes2", + "nodeType": "ElementaryTypeName", + "src": "13030:6:49", + "typeDescriptions": {} + } + }, + "id": 7405, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13030:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes2", + "typeString": "bytes2" + } + }, + "src": "12981:61:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "12960:82:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12943:99:49" + }, + { + "assignments": [7410], + "declarations": [ + { + "constant": false, + "id": 7410, + "mutability": "mutable", + "name": "offset", + "nameLocation": "13131:6:49", + "nodeType": "VariableDeclaration", + "scope": 7468, + "src": "13123:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7409, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13123:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7416, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7415, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 7411, + "name": "hasPrefix", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7388, + "src": "13140:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7412, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13150:6:49", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "13140:16:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$attached_to$_t_bool_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 7413, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13140:18:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "hexValue": "32", + "id": 7414, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13161:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "13140:22:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13123:39:49" + }, + { + "assignments": [7418], + "declarations": [ + { + "constant": false, + "id": 7418, + "mutability": "mutable", + "name": "result", + "nameLocation": "13181:6:49", + "nodeType": "VariableDeclaration", + "scope": 7468, + "src": "13173:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7417, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13173:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7420, + "initialValue": { + "hexValue": "30", + "id": 7419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13190:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "13173:18:49" + }, + { + "body": { + "id": 7462, + "nodeType": "Block", + "src": "13248:447:49", + "statements": [ + { + "assignments": [7434], + "declarations": [ + { + "constant": false, + "id": 7434, + "mutability": "mutable", + "name": "chr", + "nameLocation": "13268:3:49", + "nodeType": "VariableDeclaration", + "scope": 7462, + "src": "13262:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 7433, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "13262:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 7444, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 7439, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7381, + "src": "13317:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 7440, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7422, + "src": "13325:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7438, + "name": "_unsafeReadBytesOffset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7882, + "src": "13294:22:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 7441, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13294:33:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7437, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13287:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 7436, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "13287:6:49", + "typeDescriptions": {} + } + }, + "id": 7442, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13287:41:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 7435, + "name": "_tryParseChr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7704, + "src": "13274:12:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes1_$returns$_t_uint8_$", + "typeString": "function (bytes1) pure returns (uint8)" + } + }, + "id": 7443, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13274:55:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13262:67:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7447, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7445, + "name": "chr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7434, + "src": "13347:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "3135", + "id": 7446, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13353:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_15_by_1", + "typeString": "int_const 15" + }, + "value": "15" + }, + "src": "13347:8:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7452, + "nodeType": "IfStatement", + "src": "13343:31:49", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7448, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13365:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 7449, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13372:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 7450, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "13364:10:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 7379, + "id": 7451, + "nodeType": "Return", + "src": "13357:17:49" + } + }, + { + "expression": { + "id": 7455, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7453, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7418, + "src": "13388:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "hexValue": "3136", + "id": 7454, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13398:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "13388:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 7456, + "nodeType": "ExpressionStatement", + "src": "13388:12:49" + }, + { + "id": 7461, + "nodeType": "UncheckedBlock", + "src": "13414:271:49", + "statements": [ + { + "expression": { + "id": 7459, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7457, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7418, + "src": "13657:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 7458, + "name": "chr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7434, + "src": "13667:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "13657:13:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 7460, + "nodeType": "ExpressionStatement", + "src": "13657:13:49" + } + ] + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7429, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7427, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7422, + "src": "13234:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 7428, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7373, + "src": "13238:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13234:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7463, + "initializationExpression": { + "assignments": [7422], + "declarations": [ + { + "constant": false, + "id": 7422, + "mutability": "mutable", + "name": "i", + "nameLocation": "13214:1:49", + "nodeType": "VariableDeclaration", + "scope": 7463, + "src": "13206:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7421, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13206:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7426, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7425, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7423, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7371, + "src": "13218:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 7424, + "name": "offset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7410, + "src": "13226:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13218:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13206:26:49" + }, + "isSimpleCounterLoop": true, + "loopExpression": { + "expression": { + "id": 7431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "13243:3:49", + "subExpression": { + "id": 7430, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7422, + "src": "13245:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 7432, + "nodeType": "ExpressionStatement", + "src": "13243:3:49" + }, + "nodeType": "ForStatement", + "src": "13201:494:49" + }, + { + "expression": { + "components": [ + { + "hexValue": "74727565", + "id": 7464, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13712:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + { + "id": 7465, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7418, + "src": "13718:6:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 7466, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "13711:14:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "functionReturnParameters": 7379, + "id": 7467, + "nodeType": "Return", + "src": "13704:21:49" + } + ] + }, + "documentation": { + "id": 7367, + "nodeType": "StructuredDocumentation", + "src": "12448:227:49", + "text": " @dev Implementation of {tryParseHexUint-string-uint256-uint256} that does not check bounds. Caller should make sure that\n `begin <= end <= input.length`. Other inputs would result in undefined behavior." + }, + "id": 7469, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_tryParseHexUintUncheckedBounds", + "nameLocation": "12689:31:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7374, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7369, + "mutability": "mutable", + "name": "input", + "nameLocation": "12744:5:49", + "nodeType": "VariableDeclaration", + "scope": 7469, + "src": "12730:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7368, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "12730:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7371, + "mutability": "mutable", + "name": "begin", + "nameLocation": "12767:5:49", + "nodeType": "VariableDeclaration", + "scope": 7469, + "src": "12759:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7370, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12759:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7373, + "mutability": "mutable", + "name": "end", + "nameLocation": "12790:3:49", + "nodeType": "VariableDeclaration", + "scope": 7469, + "src": "12782:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7372, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12782:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12720:79:49" + }, + "returnParameters": { + "id": 7379, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7376, + "mutability": "mutable", + "name": "success", + "nameLocation": "12827:7:49", + "nodeType": "VariableDeclaration", + "scope": 7469, + "src": "12822:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7375, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "12822:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7378, + "mutability": "mutable", + "name": "value", + "nameLocation": "12844:5:49", + "nodeType": "VariableDeclaration", + "scope": 7469, + "src": "12836:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7377, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12836:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12821:29:49" + }, + "scope": 7883, + "src": "12680:1052:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 7487, + "nodeType": "Block", + "src": "14030:67:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 7478, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7472, + "src": "14060:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 7479, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14067:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 7482, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7472, + "src": "14076:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7481, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14070:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7480, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "14070:5:49", + "typeDescriptions": {} + } + }, + "id": 7483, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14070:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7484, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14083:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "14070:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7477, + "name": "parseAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [7488, 7519], + "referencedDeclaration": 7519, + "src": "14047:12:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_address_$", + "typeString": "function (string memory,uint256,uint256) pure returns (address)" + } + }, + "id": 7485, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14047:43:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 7476, + "id": 7486, + "nodeType": "Return", + "src": "14040:50:49" + } + ] + }, + "documentation": { + "id": 7470, + "nodeType": "StructuredDocumentation", + "src": "13738:212:49", + "text": " @dev Parse a hexadecimal string (with or without \"0x\" prefix), and returns the value as an `address`.\n Requirements:\n - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`" + }, + "id": 7488, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseAddress", + "nameLocation": "13964:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7473, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7472, + "mutability": "mutable", + "name": "input", + "nameLocation": "13991:5:49", + "nodeType": "VariableDeclaration", + "scope": 7488, + "src": "13977:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7471, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "13977:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "13976:21:49" + }, + "returnParameters": { + "id": 7476, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7475, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7488, + "src": "14021:7:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7474, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14021:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "14020:9:49" + }, + "scope": 7883, + "src": "13955:142:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7518, + "nodeType": "Block", + "src": "14470:165:49", + "statements": [ + { + "assignments": [7501, 7503], + "declarations": [ + { + "constant": false, + "id": 7501, + "mutability": "mutable", + "name": "success", + "nameLocation": "14486:7:49", + "nodeType": "VariableDeclaration", + "scope": 7518, + "src": "14481:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7500, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "14481:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7503, + "mutability": "mutable", + "name": "value", + "nameLocation": "14503:5:49", + "nodeType": "VariableDeclaration", + "scope": 7518, + "src": "14495:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7502, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14495:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 7509, + "initialValue": { + "arguments": [ + { + "id": 7505, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7491, + "src": "14528:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 7506, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7493, + "src": "14535:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7507, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7495, + "src": "14542:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7504, + "name": "tryParseAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [7540, 7644], + "referencedDeclaration": 7644, + "src": "14512:15:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_address_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,address)" + } + }, + "id": 7508, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14512:34:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_address_$", + "typeString": "tuple(bool,address)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "14480:66:49" + }, + { + "condition": { + "id": 7511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "14560:8:49", + "subExpression": { + "id": 7510, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7501, + "src": "14561:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7515, + "nodeType": "IfStatement", + "src": "14556:50:49", + "trueBody": { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 7512, + "name": "StringsInvalidAddressFormat", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6547, + "src": "14577:27:49", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 7513, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14577:29:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 7514, + "nodeType": "RevertStatement", + "src": "14570:36:49" + } + }, + { + "expression": { + "id": 7516, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7503, + "src": "14623:5:49", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 7499, + "id": 7517, + "nodeType": "Return", + "src": "14616:12:49" + } + ] + }, + "documentation": { + "id": 7489, + "nodeType": "StructuredDocumentation", + "src": "14103:259:49", + "text": " @dev Variant of {parseAddress-string} that parses a substring of `input` located between position `begin` (included) and\n `end` (excluded).\n Requirements:\n - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`" + }, + "id": 7519, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parseAddress", + "nameLocation": "14376:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7496, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7491, + "mutability": "mutable", + "name": "input", + "nameLocation": "14403:5:49", + "nodeType": "VariableDeclaration", + "scope": 7519, + "src": "14389:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7490, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "14389:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7493, + "mutability": "mutable", + "name": "begin", + "nameLocation": "14418:5:49", + "nodeType": "VariableDeclaration", + "scope": 7519, + "src": "14410:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7492, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14410:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7495, + "mutability": "mutable", + "name": "end", + "nameLocation": "14433:3:49", + "nodeType": "VariableDeclaration", + "scope": 7519, + "src": "14425:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7494, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14425:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "14388:49:49" + }, + "returnParameters": { + "id": 7499, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7498, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7519, + "src": "14461:7:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7497, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14461:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "14460:9:49" + }, + "scope": 7883, + "src": "14367:268:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7539, + "nodeType": "Block", + "src": "14942:70:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 7530, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7522, + "src": "14975:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "hexValue": "30", + "id": 7531, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14982:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "arguments": [ + { + "id": 7534, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7522, + "src": "14991:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7533, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14985:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7532, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "14985:5:49", + "typeDescriptions": {} + } + }, + "id": 7535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14985:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7536, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14998:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "14985:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7529, + "name": "tryParseAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [7540, 7644], + "referencedDeclaration": 7644, + "src": "14959:15:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_address_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,address)" + } + }, + "id": 7537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14959:46:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_address_$", + "typeString": "tuple(bool,address)" + } + }, + "functionReturnParameters": 7528, + "id": 7538, + "nodeType": "Return", + "src": "14952:53:49" + } + ] + }, + "documentation": { + "id": 7520, + "nodeType": "StructuredDocumentation", + "src": "14641:198:49", + "text": " @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly\n formatted address. See {parseAddress-string} requirements." + }, + "id": 7540, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseAddress", + "nameLocation": "14853:15:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7523, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7522, + "mutability": "mutable", + "name": "input", + "nameLocation": "14883:5:49", + "nodeType": "VariableDeclaration", + "scope": 7540, + "src": "14869:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7521, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "14869:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "14868:21:49" + }, + "returnParameters": { + "id": 7528, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7525, + "mutability": "mutable", + "name": "success", + "nameLocation": "14918:7:49", + "nodeType": "VariableDeclaration", + "scope": 7540, + "src": "14913:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7524, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "14913:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7527, + "mutability": "mutable", + "name": "value", + "nameLocation": "14935:5:49", + "nodeType": "VariableDeclaration", + "scope": 7540, + "src": "14927:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7526, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14927:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "14912:29:49" + }, + "scope": 7883, + "src": "14844:168:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7643, + "nodeType": "Block", + "src": "15405:733:49", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7564, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7554, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7547, + "src": "15419:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 7557, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7543, + "src": "15431:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7556, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15425:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7555, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "15425:5:49", + "typeDescriptions": {} + } + }, + "id": 7558, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15425:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15438:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "15425:19:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15419:25:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7563, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7561, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7545, + "src": "15448:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 7562, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7547, + "src": "15456:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15448:11:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "15419:40:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7572, + "nodeType": "IfStatement", + "src": "15415:72:49", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7565, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15469:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 7568, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15484:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 7567, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15476:7:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 7566, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15476:7:49", + "typeDescriptions": {} + } + }, + "id": 7569, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15476:10:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 7570, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "15468:19:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_address_$", + "typeString": "tuple(bool,address)" + } + }, + "functionReturnParameters": 7553, + "id": 7571, + "nodeType": "Return", + "src": "15461:26:49" + } + }, + { + "assignments": [7574], + "declarations": [ + { + "constant": false, + "id": 7574, + "mutability": "mutable", + "name": "hasPrefix", + "nameLocation": "15503:9:49", + "nodeType": "VariableDeclaration", + "scope": 7643, + "src": "15498:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7573, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "15498:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 7597, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7579, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7575, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7547, + "src": "15516:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7578, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7576, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7545, + "src": "15522:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 7577, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15530:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "15522:9:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15516:15:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 7580, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "15515:17:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes2", + "typeString": "bytes2" + }, + "id": 7595, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 7586, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7543, + "src": "15572:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7585, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15566:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7584, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "15566:5:49", + "typeDescriptions": {} + } + }, + "id": 7587, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15566:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 7588, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7545, + "src": "15580:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7583, + "name": "_unsafeReadBytesOffset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7882, + "src": "15543:22:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 7589, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15543:43:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7582, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15536:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes2_$", + "typeString": "type(bytes2)" + }, + "typeName": { + "id": 7581, + "name": "bytes2", + "nodeType": "ElementaryTypeName", + "src": "15536:6:49", + "typeDescriptions": {} + } + }, + "id": 7590, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15536:51:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes2", + "typeString": "bytes2" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "3078", + "id": 7593, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15598:4:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837", + "typeString": "literal_string \"0x\"" + }, + "value": "0x" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_39bef1777deb3dfb14f64b9f81ced092c501fee72f90e93d03bb95ee89df9837", + "typeString": "literal_string \"0x\"" + } + ], + "id": 7592, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15591:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes2_$", + "typeString": "type(bytes2)" + }, + "typeName": { + "id": 7591, + "name": "bytes2", + "nodeType": "ElementaryTypeName", + "src": "15591:6:49", + "typeDescriptions": {} + } + }, + "id": 7594, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15591:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes2", + "typeString": "bytes2" + } + }, + "src": "15536:67:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "15515:88:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15498:105:49" + }, + { + "assignments": [7599], + "declarations": [ + { + "constant": false, + "id": 7599, + "mutability": "mutable", + "name": "expectedLength", + "nameLocation": "15692:14:49", + "nodeType": "VariableDeclaration", + "scope": 7643, + "src": "15684:22:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7598, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15684:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7607, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7606, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3430", + "id": 7600, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15709:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_40_by_1", + "typeString": "int_const 40" + }, + "value": "40" + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 7601, + "name": "hasPrefix", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7574, + "src": "15714:9:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7602, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15724:6:49", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "15714:16:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$attached_to$_t_bool_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 7603, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15714:18:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "hexValue": "32", + "id": 7604, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15735:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "15714:22:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15709:27:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15684:52:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7612, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7610, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7608, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7547, + "src": "15801:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 7609, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7545, + "src": "15807:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15801:11:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 7611, + "name": "expectedLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7599, + "src": "15816:14:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15801:29:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 7641, + "nodeType": "Block", + "src": "16081:51:49", + "statements": [ + { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 7634, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16103:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 7637, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16118:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 7636, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16110:7:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 7635, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16110:7:49", + "typeDescriptions": {} + } + }, + "id": 7638, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16110:10:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 7639, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "16102:19:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_address_$", + "typeString": "tuple(bool,address)" + } + }, + "functionReturnParameters": 7553, + "id": 7640, + "nodeType": "Return", + "src": "16095:26:49" + } + ] + }, + "id": 7642, + "nodeType": "IfStatement", + "src": "15797:335:49", + "trueBody": { + "id": 7633, + "nodeType": "Block", + "src": "15832:243:49", + "statements": [ + { + "assignments": [7614, 7616], + "declarations": [ + { + "constant": false, + "id": 7614, + "mutability": "mutable", + "name": "s", + "nameLocation": "15953:1:49", + "nodeType": "VariableDeclaration", + "scope": 7633, + "src": "15948:6:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7613, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "15948:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7616, + "mutability": "mutable", + "name": "v", + "nameLocation": "15964:1:49", + "nodeType": "VariableDeclaration", + "scope": 7633, + "src": "15956:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7615, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15956:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7622, + "initialValue": { + "arguments": [ + { + "id": 7618, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7543, + "src": "16001:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 7619, + "name": "begin", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7545, + "src": "16008:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 7620, + "name": "end", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7547, + "src": "16015:3:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7617, + "name": "_tryParseHexUintUncheckedBounds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7469, + "src": "15969:31:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (string memory,uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 7621, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15969:50:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15947:72:49" + }, + { + "expression": { + "components": [ + { + "id": 7623, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7614, + "src": "16041:1:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "arguments": [ + { + "id": 7628, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7616, + "src": "16060:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7627, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16052:7:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 7626, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "16052:7:49", + "typeDescriptions": {} + } + }, + "id": 7629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16052:10:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + ], + "id": 7625, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16044:7:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 7624, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16044:7:49", + "typeDescriptions": {} + } + }, + "id": 7630, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16044:19:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 7631, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "16040:24:49", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_address_$", + "typeString": "tuple(bool,address)" + } + }, + "functionReturnParameters": 7553, + "id": 7632, + "nodeType": "Return", + "src": "16033:31:49" + } + ] + } + } + ] + }, + "documentation": { + "id": 7541, + "nodeType": "StructuredDocumentation", + "src": "15018:226:49", + "text": " @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly\n formatted address. See {parseAddress-string-uint256-uint256} requirements." + }, + "id": 7644, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryParseAddress", + "nameLocation": "15258:15:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7548, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7543, + "mutability": "mutable", + "name": "input", + "nameLocation": "15297:5:49", + "nodeType": "VariableDeclaration", + "scope": 7644, + "src": "15283:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7542, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "15283:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7545, + "mutability": "mutable", + "name": "begin", + "nameLocation": "15320:5:49", + "nodeType": "VariableDeclaration", + "scope": 7644, + "src": "15312:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7544, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15312:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7547, + "mutability": "mutable", + "name": "end", + "nameLocation": "15343:3:49", + "nodeType": "VariableDeclaration", + "scope": 7644, + "src": "15335:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7546, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15335:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15273:79:49" + }, + "returnParameters": { + "id": 7553, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7550, + "mutability": "mutable", + "name": "success", + "nameLocation": "15381:7:49", + "nodeType": "VariableDeclaration", + "scope": 7644, + "src": "15376:12:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 7549, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "15376:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7552, + "mutability": "mutable", + "name": "value", + "nameLocation": "15398:5:49", + "nodeType": "VariableDeclaration", + "scope": 7644, + "src": "15390:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7551, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15390:7:49", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "15375:29:49" + }, + "scope": 7883, + "src": "15249:889:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7703, + "nodeType": "Block", + "src": "16207:461:49", + "statements": [ + { + "assignments": [7652], + "declarations": [ + { + "constant": false, + "id": 7652, + "mutability": "mutable", + "name": "value", + "nameLocation": "16223:5:49", + "nodeType": "VariableDeclaration", + "scope": 7703, + "src": "16217:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 7651, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16217:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 7657, + "initialValue": { + "arguments": [ + { + "id": 7655, + "name": "chr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7646, + "src": "16237:3:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 7654, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16231:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 7653, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16231:5:49", + "typeDescriptions": {} + } + }, + "id": 7656, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16231:10:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "16217:24:49" + }, + { + "id": 7700, + "nodeType": "UncheckedBlock", + "src": "16401:238:49", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7664, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7660, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7658, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16429:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "3437", + "id": 7659, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16437:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_47_by_1", + "typeString": "int_const 47" + }, + "value": "47" + }, + "src": "16429:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7661, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16443:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "hexValue": "3538", + "id": 7662, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16451:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_58_by_1", + "typeString": "int_const 58" + }, + "value": "58" + }, + "src": "16443:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "16429:24:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7675, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7671, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7669, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16489:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "3936", + "id": 7670, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16497:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "value": "96" + }, + "src": "16489:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7674, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7672, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16503:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "hexValue": "313033", + "id": 7673, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16511:3:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_103_by_1", + "typeString": "int_const 103" + }, + "value": "103" + }, + "src": "16503:11:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "16489:25:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 7686, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7682, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7680, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16550:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "3634", + "id": 7681, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16558:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "16550:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 7685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7683, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16564:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "hexValue": "3731", + "id": 7684, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16572:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_71_by_1", + "typeString": "int_const 71" + }, + "value": "71" + }, + "src": "16564:10:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "16550:24:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "expression": { + "expression": { + "arguments": [ + { + "id": 7693, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16618:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 7692, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16618:5:49", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + } + ], + "id": 7691, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "16613:4:49", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 7694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16613:11:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint8", + "typeString": "type(uint8)" + } + }, + "id": 7695, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "16625:3:49", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "16613:15:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "functionReturnParameters": 7650, + "id": 7696, + "nodeType": "Return", + "src": "16606:22:49" + }, + "id": 7697, + "nodeType": "IfStatement", + "src": "16546:82:49", + "trueBody": { + "expression": { + "id": 7689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7687, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16576:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "hexValue": "3535", + "id": 7688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16585:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_55_by_1", + "typeString": "int_const 55" + }, + "value": "55" + }, + "src": "16576:11:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "id": 7690, + "nodeType": "ExpressionStatement", + "src": "16576:11:49" + } + }, + "id": 7698, + "nodeType": "IfStatement", + "src": "16485:143:49", + "trueBody": { + "expression": { + "id": 7678, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7676, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16516:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "hexValue": "3837", + "id": 7677, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16525:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_87_by_1", + "typeString": "int_const 87" + }, + "value": "87" + }, + "src": "16516:11:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "id": 7679, + "nodeType": "ExpressionStatement", + "src": "16516:11:49" + } + }, + "id": 7699, + "nodeType": "IfStatement", + "src": "16425:203:49", + "trueBody": { + "expression": { + "id": 7667, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 7665, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16455:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "hexValue": "3438", + "id": 7666, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16464:2:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_48_by_1", + "typeString": "int_const 48" + }, + "value": "48" + }, + "src": "16455:11:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "id": 7668, + "nodeType": "ExpressionStatement", + "src": "16455:11:49" + } + } + ] + }, + { + "expression": { + "id": 7701, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7652, + "src": "16656:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "functionReturnParameters": 7650, + "id": 7702, + "nodeType": "Return", + "src": "16649:12:49" + } + ] + }, + "id": 7704, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_tryParseChr", + "nameLocation": "16153:12:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7647, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7646, + "mutability": "mutable", + "name": "chr", + "nameLocation": "16173:3:49", + "nodeType": "VariableDeclaration", + "scope": 7704, + "src": "16166:10:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 7645, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "16166:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + } + ], + "src": "16165:12:49" + }, + "returnParameters": { + "id": 7650, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7649, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7704, + "src": "16200:5:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 7648, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16200:5:49", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "src": "16199:7:49" + }, + "scope": 7883, + "src": "16144:524:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 7869, + "nodeType": "Block", + "src": "17334:1331:49", + "statements": [ + { + "assignments": [7713], + "declarations": [ + { + "constant": false, + "id": 7713, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "17357:6:49", + "nodeType": "VariableDeclaration", + "scope": 7869, + "src": "17344:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7712, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "17344:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 7718, + "initialValue": { + "arguments": [ + { + "id": 7716, + "name": "input", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7707, + "src": "17372:5:49", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 7715, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17366:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 7714, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "17366:5:49", + "typeDescriptions": {} + } + }, + "id": 7717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17366:12:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17344:34:49" + }, + { + "assignments": [7720], + "declarations": [ + { + "constant": false, + "id": 7720, + "mutability": "mutable", + "name": "output", + "nameLocation": "17401:6:49", + "nodeType": "VariableDeclaration", + "scope": 7869, + "src": "17388:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7719, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "17388:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 7728, + "initialValue": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 7723, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17420:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "expression": { + "id": 7724, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7713, + "src": "17424:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17431:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "17424:13:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17420:17:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7722, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "17410:9:49", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (uint256) pure returns (bytes memory)" + }, + "typeName": { + "id": 7721, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "17414:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + "id": 7727, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17410:28:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17388:50:49" + }, + { + "assignments": [7730], + "declarations": [ + { + "constant": false, + "id": 7730, + "mutability": "mutable", + "name": "outputLength", + "nameLocation": "17479:12:49", + "nodeType": "VariableDeclaration", + "scope": 7869, + "src": "17471:20:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7729, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17471:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7732, + "initialValue": { + "hexValue": "30", + "id": 7731, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17494:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "17471:24:49" + }, + { + "body": { + "id": 7861, + "nodeType": "Block", + "src": "17546:854:49", + "statements": [ + { + "assignments": [7744], + "declarations": [ + { + "constant": false, + "id": 7744, + "mutability": "mutable", + "name": "char", + "nameLocation": "17567:4:49", + "nodeType": "VariableDeclaration", + "scope": 7861, + "src": "17560:11:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 7743, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "17560:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + } + ], + "id": 7752, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 7748, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7713, + "src": "17604:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 7749, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7734, + "src": "17612:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7747, + "name": "_unsafeReadBytesOffset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7882, + "src": "17581:22:49", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 7750, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17581:33:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17574:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes1_$", + "typeString": "type(bytes1)" + }, + "typeName": { + "id": 7745, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "17574:6:49", + "typeDescriptions": {} + } + }, + "id": 7751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17574:41:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17560:55:49" + }, + { + "condition": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7764, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7761, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7753, + "name": "SPECIAL_CHARS_LOOKUP", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6534, + "src": "17635:20:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7759, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 7754, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17659:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "arguments": [ + { + "id": 7757, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "17670:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 7756, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17664:5:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 7755, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "17664:5:49", + "typeDescriptions": {} + } + }, + "id": 7758, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17664:11:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "17659:16:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 7760, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "17658:18:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17635:41:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 7762, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "17634:43:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 7763, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17681:1:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "17634:48:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 7765, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "17633:50:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 7859, + "nodeType": "Block", + "src": "18328:62:49", + "statements": [ + { + "expression": { + "id": 7857, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7852, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "18346:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7855, + "indexExpression": { + "id": 7854, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "18353:14:49", + "subExpression": { + "id": 7853, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "18353:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "18346:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 7856, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "18371:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "18346:29:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7858, + "nodeType": "ExpressionStatement", + "src": "18346:29:49" + } + ] + }, + "id": 7860, + "nodeType": "IfStatement", + "src": "17629:761:49", + "trueBody": { + "id": 7851, + "nodeType": "Block", + "src": "17685:637:49", + "statements": [ + { + "expression": { + "id": 7771, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7766, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "17703:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7769, + "indexExpression": { + "id": 7768, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "17710:14:49", + "subExpression": { + "id": 7767, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "17710:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17703:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "5c", + "id": 7770, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17728:4:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_731553fa98541ade8b78284229adfe09a819380dee9244baac20dd1e0aa24095", + "typeString": "literal_string \"\\\"" + }, + "value": "\\" + }, + "src": "17703:29:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7772, + "nodeType": "ExpressionStatement", + "src": "17703:29:49" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7773, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "17754:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783038", + "id": 7774, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17762:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "0x08" + }, + "src": "17754:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7783, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "17823:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783039", + "id": 7784, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17831:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_9_by_1", + "typeString": "int_const 9" + }, + "value": "0x09" + }, + "src": "17823:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7795, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7793, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "17892:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783061", + "id": 7794, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17900:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "0x0a" + }, + "src": "17892:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7805, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7803, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "17961:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783063", + "id": 7804, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17969:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_12_by_1", + "typeString": "int_const 12" + }, + "value": "0x0c" + }, + "src": "17961:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7813, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "18030:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783064", + "id": 7814, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18038:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_13_by_1", + "typeString": "int_const 13" + }, + "value": "0x0d" + }, + "src": "18030:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7825, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7823, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "18099:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783563", + "id": 7824, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18107:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_92_by_1", + "typeString": "int_const 92" + }, + "value": "0x5c" + }, + "src": "18099:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 7835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7833, + "name": "char", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7744, + "src": "18169:4:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30783232", + "id": 7834, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18177:4:49", + "typeDescriptions": { + "typeIdentifier": "t_rational_34_by_1", + "typeString": "int_const 34" + }, + "value": "0x22" + }, + "src": "18169:12:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7844, + "nodeType": "IfStatement", + "src": "18165:143:49", + "trueBody": { + "id": 7843, + "nodeType": "Block", + "src": "18183:125:49", + "statements": [ + { + "expression": { + "id": 7841, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7836, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "18261:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7839, + "indexExpression": { + "id": 7838, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "18268:14:49", + "subExpression": { + "id": 7837, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "18268:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "18261:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "22", + "id": 7840, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18286:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_6e9f33448a4153023cdaf3eb759f1afdc24aba433a3e18b683f8c04a6eaa69f0", + "typeString": "literal_string \"\"\"" + }, + "value": "\"" + }, + "src": "18261:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7842, + "nodeType": "ExpressionStatement", + "src": "18261:28:49" + } + ] + } + }, + "id": 7845, + "nodeType": "IfStatement", + "src": "18095:213:49", + "trueBody": { + "expression": { + "id": 7831, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7826, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "18113:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7829, + "indexExpression": { + "id": 7828, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "18120:14:49", + "subExpression": { + "id": 7827, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "18120:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "18113:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "5c", + "id": 7830, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18138:4:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_731553fa98541ade8b78284229adfe09a819380dee9244baac20dd1e0aa24095", + "typeString": "literal_string \"\\\"" + }, + "value": "\\" + }, + "src": "18113:29:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7832, + "nodeType": "ExpressionStatement", + "src": "18113:29:49" + } + }, + "id": 7846, + "nodeType": "IfStatement", + "src": "18026:282:49", + "trueBody": { + "expression": { + "id": 7821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7816, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "18044:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7819, + "indexExpression": { + "id": 7818, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "18051:14:49", + "subExpression": { + "id": 7817, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "18051:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "18044:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "72", + "id": 7820, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18069:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_414f72a4d550cad29f17d9d99a4af64b3776ec5538cd440cef0f03fef2e9e010", + "typeString": "literal_string \"r\"" + }, + "value": "r" + }, + "src": "18044:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7822, + "nodeType": "ExpressionStatement", + "src": "18044:28:49" + } + }, + "id": 7847, + "nodeType": "IfStatement", + "src": "17957:351:49", + "trueBody": { + "expression": { + "id": 7811, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7806, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "17975:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7809, + "indexExpression": { + "id": 7808, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "17982:14:49", + "subExpression": { + "id": 7807, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "17982:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17975:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "66", + "id": 7810, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18000:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_d1e8aeb79500496ef3dc2e57ba746a8315d048b7a664a2bf948db4fa91960483", + "typeString": "literal_string \"f\"" + }, + "value": "f" + }, + "src": "17975:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7812, + "nodeType": "ExpressionStatement", + "src": "17975:28:49" + } + }, + "id": 7848, + "nodeType": "IfStatement", + "src": "17888:420:49", + "trueBody": { + "expression": { + "id": 7801, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7796, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "17906:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7799, + "indexExpression": { + "id": 7798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "17913:14:49", + "subExpression": { + "id": 7797, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "17913:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17906:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "6e", + "id": 7800, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17931:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_4b4ecedb4964a40fe416b16c7bd8b46092040ec42ef0aa69e59f09872f105cf3", + "typeString": "literal_string \"n\"" + }, + "value": "n" + }, + "src": "17906:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7802, + "nodeType": "ExpressionStatement", + "src": "17906:28:49" + } + }, + "id": 7849, + "nodeType": "IfStatement", + "src": "17819:489:49", + "trueBody": { + "expression": { + "id": 7791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7786, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "17837:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7789, + "indexExpression": { + "id": 7788, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "17844:14:49", + "subExpression": { + "id": 7787, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "17844:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17837:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "74", + "id": 7790, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17862:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_cac1bb71f0a97c8ac94ca9546b43178a9ad254c7b757ac07433aa6df35cd8089", + "typeString": "literal_string \"t\"" + }, + "value": "t" + }, + "src": "17837:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7792, + "nodeType": "ExpressionStatement", + "src": "17837:28:49" + } + }, + "id": 7850, + "nodeType": "IfStatement", + "src": "17750:558:49", + "trueBody": { + "expression": { + "id": 7781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 7776, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "17768:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7779, + "indexExpression": { + "id": 7778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "17775:14:49", + "subExpression": { + "id": 7777, + "name": "outputLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7730, + "src": "17775:12:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17768:22:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "62", + "id": 7780, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17793:3:49", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_b5553de315e0edf504d9150af82dafa5c4667fa618ed0a6f19c69b41166c5510", + "typeString": "literal_string \"b\"" + }, + "value": "b" + }, + "src": "17768:28:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "id": 7782, + "nodeType": "ExpressionStatement", + "src": "17768:28:49" + } + } + ] + } + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7736, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7734, + "src": "17522:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "expression": { + "id": 7737, + "name": "buffer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7713, + "src": "17526:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7738, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17533:6:49", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "17526:13:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17522:17:49", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 7862, + "initializationExpression": { + "assignments": [7734], + "declarations": [ + { + "constant": false, + "id": 7734, + "mutability": "mutable", + "name": "i", + "nameLocation": "17519:1:49", + "nodeType": "VariableDeclaration", + "scope": 7862, + "src": "17511:9:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7733, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17511:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 7735, + "nodeType": "VariableDeclarationStatement", + "src": "17511:9:49" + }, + "isSimpleCounterLoop": true, + "loopExpression": { + "expression": { + "id": 7741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "17541:3:49", + "subExpression": { + "id": 7740, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7734, + "src": "17543:1:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 7742, + "nodeType": "ExpressionStatement", + "src": "17541:3:49" + }, + "nodeType": "ForStatement", + "src": "17506:894:49" + }, + { + "AST": { + "nativeSrc": "18498:129:49", + "nodeType": "YulBlock", + "src": "18498:129:49", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "output", + "nativeSrc": "18519:6:49", + "nodeType": "YulIdentifier", + "src": "18519:6:49" + }, + { + "name": "outputLength", + "nativeSrc": "18527:12:49", + "nodeType": "YulIdentifier", + "src": "18527:12:49" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18512:6:49", + "nodeType": "YulIdentifier", + "src": "18512:6:49" + }, + "nativeSrc": "18512:28:49", + "nodeType": "YulFunctionCall", + "src": "18512:28:49" + }, + "nativeSrc": "18512:28:49", + "nodeType": "YulExpressionStatement", + "src": "18512:28:49" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18560:4:49", + "nodeType": "YulLiteral", + "src": "18560:4:49", + "type": "", + "value": "0x40" + }, + { + "arguments": [ + { + "name": "output", + "nativeSrc": "18570:6:49", + "nodeType": "YulIdentifier", + "src": "18570:6:49" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18582:1:49", + "nodeType": "YulLiteral", + "src": "18582:1:49", + "type": "", + "value": "5" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18589:1:49", + "nodeType": "YulLiteral", + "src": "18589:1:49", + "type": "", + "value": "5" + }, + { + "arguments": [ + { + "name": "outputLength", + "nativeSrc": "18596:12:49", + "nodeType": "YulIdentifier", + "src": "18596:12:49" + }, + { + "kind": "number", + "nativeSrc": "18610:2:49", + "nodeType": "YulLiteral", + "src": "18610:2:49", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18592:3:49", + "nodeType": "YulIdentifier", + "src": "18592:3:49" + }, + "nativeSrc": "18592:21:49", + "nodeType": "YulFunctionCall", + "src": "18592:21:49" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "18585:3:49", + "nodeType": "YulIdentifier", + "src": "18585:3:49" + }, + "nativeSrc": "18585:29:49", + "nodeType": "YulFunctionCall", + "src": "18585:29:49" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "18578:3:49", + "nodeType": "YulIdentifier", + "src": "18578:3:49" + }, + "nativeSrc": "18578:37:49", + "nodeType": "YulFunctionCall", + "src": "18578:37:49" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18566:3:49", + "nodeType": "YulIdentifier", + "src": "18566:3:49" + }, + "nativeSrc": "18566:50:49", + "nodeType": "YulFunctionCall", + "src": "18566:50:49" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18553:6:49", + "nodeType": "YulIdentifier", + "src": "18553:6:49" + }, + "nativeSrc": "18553:64:49", + "nodeType": "YulFunctionCall", + "src": "18553:64:49" + }, + "nativeSrc": "18553:64:49", + "nodeType": "YulExpressionStatement", + "src": "18553:64:49" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 7720, + "isOffset": false, + "isSlot": false, + "src": "18519:6:49", + "valueSize": 1 + }, + { + "declaration": 7720, + "isOffset": false, + "isSlot": false, + "src": "18570:6:49", + "valueSize": 1 + }, + { + "declaration": 7730, + "isOffset": false, + "isSlot": false, + "src": "18527:12:49", + "valueSize": 1 + }, + { + "declaration": 7730, + "isOffset": false, + "isSlot": false, + "src": "18596:12:49", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 7863, + "nodeType": "InlineAssembly", + "src": "18473:154:49" + }, + { + "expression": { + "arguments": [ + { + "id": 7866, + "name": "output", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7720, + "src": "18651:6:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 7865, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "18644:6:49", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 7864, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "18644:6:49", + "typeDescriptions": {} + } + }, + "id": 7867, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18644:14:49", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 7711, + "id": 7868, + "nodeType": "Return", + "src": "18637:21:49" + } + ] + }, + "documentation": { + "id": 7705, + "nodeType": "StructuredDocumentation", + "src": "16674:576:49", + "text": " @dev Escape special characters in JSON strings. This can be useful to prevent JSON injection in NFT metadata.\n WARNING: This function should only be used in double quoted JSON strings. Single quotes are not escaped.\n NOTE: This function escapes all unicode characters, and not just the ones in ranges defined in section 2.5 of\n RFC-4627 (U+0000 to U+001F, U+0022 and U+005C). ECMAScript's `JSON.parse` does recover escaped unicode\n characters that are not in this range, but other tooling may provide different results." + }, + "id": 7870, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "escapeJSON", + "nameLocation": "17264:10:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7708, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7707, + "mutability": "mutable", + "name": "input", + "nameLocation": "17289:5:49", + "nodeType": "VariableDeclaration", + "scope": 7870, + "src": "17275:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7706, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "17275:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "17274:21:49" + }, + "returnParameters": { + "id": 7711, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7710, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7870, + "src": "17319:13:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 7709, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "17319:6:49", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "17318:15:49" + }, + "scope": 7883, + "src": "17255:1410:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7881, + "nodeType": "Block", + "src": "19050:225:49", + "statements": [ + { + "AST": { + "nativeSrc": "19199:70:49", + "nodeType": "YulBlock", + "src": "19199:70:49", + "statements": [ + { + "nativeSrc": "19213:46:49", + "nodeType": "YulAssignment", + "src": "19213:46:49", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "buffer", + "nativeSrc": "19232:6:49", + "nodeType": "YulIdentifier", + "src": "19232:6:49" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19244:4:49", + "nodeType": "YulLiteral", + "src": "19244:4:49", + "type": "", + "value": "0x20" + }, + { + "name": "offset", + "nativeSrc": "19250:6:49", + "nodeType": "YulIdentifier", + "src": "19250:6:49" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19240:3:49", + "nodeType": "YulIdentifier", + "src": "19240:3:49" + }, + "nativeSrc": "19240:17:49", + "nodeType": "YulFunctionCall", + "src": "19240:17:49" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19228:3:49", + "nodeType": "YulIdentifier", + "src": "19228:3:49" + }, + "nativeSrc": "19228:30:49", + "nodeType": "YulFunctionCall", + "src": "19228:30:49" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "19222:5:49", + "nodeType": "YulIdentifier", + "src": "19222:5:49" + }, + "nativeSrc": "19222:37:49", + "nodeType": "YulFunctionCall", + "src": "19222:37:49" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "19213:5:49", + "nodeType": "YulIdentifier", + "src": "19213:5:49" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 7873, + "isOffset": false, + "isSlot": false, + "src": "19232:6:49", + "valueSize": 1 + }, + { + "declaration": 7875, + "isOffset": false, + "isSlot": false, + "src": "19250:6:49", + "valueSize": 1 + }, + { + "declaration": 7878, + "isOffset": false, + "isSlot": false, + "src": "19213:5:49", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 7880, + "nodeType": "InlineAssembly", + "src": "19174:95:49" + } + ] + }, + "documentation": { + "id": 7871, + "nodeType": "StructuredDocumentation", + "src": "18671:268:49", + "text": " @dev Reads a bytes32 from a bytes array without bounds checking.\n NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the\n assembly block as such would prevent some optimizations." + }, + "id": 7882, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_unsafeReadBytesOffset", + "nameLocation": "18953:22:49", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7876, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7873, + "mutability": "mutable", + "name": "buffer", + "nameLocation": "18989:6:49", + "nodeType": "VariableDeclaration", + "scope": 7882, + "src": "18976:19:49", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7872, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "18976:5:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7875, + "mutability": "mutable", + "name": "offset", + "nameLocation": "19005:6:49", + "nodeType": "VariableDeclaration", + "scope": 7882, + "src": "18997:14:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7874, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18997:7:49", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "18975:37:49" + }, + "returnParameters": { + "id": 7879, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7878, + "mutability": "mutable", + "name": "value", + "nameLocation": "19043:5:49", + "nodeType": "VariableDeclaration", + "scope": 7882, + "src": "19035:13:49", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7877, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "19035:7:49", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "19034:15:49" + }, + "scope": 7883, + "src": "18944:331:49", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + } + ], + "scope": 7884, + "src": "297:18980:49", + "usedErrors": [6541, 6544, 6547], + "usedEvents": [] + } + ], + "src": "101:19177:49" + }, + "id": 49 + }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", + "exportedSymbols": { + "ECDSA": [8231] + }, + "id": 8232, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 7885, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "112:24:50" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ECDSA", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 7886, + "nodeType": "StructuredDocumentation", + "src": "138:205:50", + "text": " @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address." + }, + "fullyImplemented": true, + "id": 8231, + "linearizedBaseContracts": [8231], + "name": "ECDSA", + "nameLocation": "352:5:50", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "ECDSA.RecoverError", + "id": 7891, + "members": [ + { + "id": 7887, + "name": "NoError", + "nameLocation": "392:7:50", + "nodeType": "EnumValue", + "src": "392:7:50" + }, + { + "id": 7888, + "name": "InvalidSignature", + "nameLocation": "409:16:50", + "nodeType": "EnumValue", + "src": "409:16:50" + }, + { + "id": 7889, + "name": "InvalidSignatureLength", + "nameLocation": "435:22:50", + "nodeType": "EnumValue", + "src": "435:22:50" + }, + { + "id": 7890, + "name": "InvalidSignatureS", + "nameLocation": "467:17:50", + "nodeType": "EnumValue", + "src": "467:17:50" + } + ], + "name": "RecoverError", + "nameLocation": "369:12:50", + "nodeType": "EnumDefinition", + "src": "364:126:50" + }, + { + "documentation": { + "id": 7892, + "nodeType": "StructuredDocumentation", + "src": "496:63:50", + "text": " @dev The signature derives the `address(0)`." + }, + "errorSelector": "f645eedf", + "id": 7894, + "name": "ECDSAInvalidSignature", + "nameLocation": "570:21:50", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 7893, + "nodeType": "ParameterList", + "parameters": [], + "src": "591:2:50" + }, + "src": "564:30:50" + }, + { + "documentation": { + "id": 7895, + "nodeType": "StructuredDocumentation", + "src": "600:60:50", + "text": " @dev The signature has an invalid length." + }, + "errorSelector": "fce698f7", + "id": 7899, + "name": "ECDSAInvalidSignatureLength", + "nameLocation": "671:27:50", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 7898, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7897, + "mutability": "mutable", + "name": "length", + "nameLocation": "707:6:50", + "nodeType": "VariableDeclaration", + "scope": 7899, + "src": "699:14:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7896, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "699:7:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "698:16:50" + }, + "src": "665:50:50" + }, + { + "documentation": { + "id": 7900, + "nodeType": "StructuredDocumentation", + "src": "721:85:50", + "text": " @dev The signature has an S value that is in the upper half order." + }, + "errorSelector": "d78bce0c", + "id": 7904, + "name": "ECDSAInvalidSignatureS", + "nameLocation": "817:22:50", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 7903, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7902, + "mutability": "mutable", + "name": "s", + "nameLocation": "848:1:50", + "nodeType": "VariableDeclaration", + "scope": 7904, + "src": "840:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7901, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "840:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "839:11:50" + }, + "src": "811:40:50" + }, + { + "body": { + "id": 7956, + "nodeType": "Block", + "src": "2285:622:50", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 7922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 7919, + "name": "signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7909, + "src": "2299:9:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7920, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2309:6:50", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "2299:16:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "3635", + "id": 7921, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2319:2:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_65_by_1", + "typeString": "int_const 65" + }, + "value": "65" + }, + "src": "2299:22:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 7954, + "nodeType": "Block", + "src": "2793:108:50", + "statements": [ + { + "expression": { + "components": [ + { + "arguments": [ + { + "hexValue": "30", + "id": 7943, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2823:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 7942, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2815:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 7941, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2815:7:50", + "typeDescriptions": {} + } + }, + "id": 7944, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2815:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 7945, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "2827:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 7946, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2840:22:50", + "memberName": "InvalidSignatureLength", + "nodeType": "MemberAccess", + "referencedDeclaration": 7889, + "src": "2827:35:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "arguments": [ + { + "expression": { + "id": 7949, + "name": "signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7909, + "src": "2872:9:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 7950, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2882:6:50", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "2872:16:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 7948, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2864:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 7947, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2864:7:50", + "typeDescriptions": {} + } + }, + "id": 7951, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2864:25:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 7952, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2814:76:50", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "functionReturnParameters": 7918, + "id": 7953, + "nodeType": "Return", + "src": "2807:83:50" + } + ] + }, + "id": 7955, + "nodeType": "IfStatement", + "src": "2295:606:50", + "trueBody": { + "id": 7940, + "nodeType": "Block", + "src": "2323:464:50", + "statements": [ + { + "assignments": [7924], + "declarations": [ + { + "constant": false, + "id": 7924, + "mutability": "mutable", + "name": "r", + "nameLocation": "2345:1:50", + "nodeType": "VariableDeclaration", + "scope": 7940, + "src": "2337:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7923, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2337:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 7925, + "nodeType": "VariableDeclarationStatement", + "src": "2337:9:50" + }, + { + "assignments": [7927], + "declarations": [ + { + "constant": false, + "id": 7927, + "mutability": "mutable", + "name": "s", + "nameLocation": "2368:1:50", + "nodeType": "VariableDeclaration", + "scope": 7940, + "src": "2360:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7926, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2360:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 7928, + "nodeType": "VariableDeclarationStatement", + "src": "2360:9:50" + }, + { + "assignments": [7930], + "declarations": [ + { + "constant": false, + "id": 7930, + "mutability": "mutable", + "name": "v", + "nameLocation": "2389:1:50", + "nodeType": "VariableDeclaration", + "scope": 7940, + "src": "2383:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 7929, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "2383:5:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 7931, + "nodeType": "VariableDeclarationStatement", + "src": "2383:7:50" + }, + { + "AST": { + "nativeSrc": "2560:171:50", + "nodeType": "YulBlock", + "src": "2560:171:50", + "statements": [ + { + "nativeSrc": "2578:32:50", + "nodeType": "YulAssignment", + "src": "2578:32:50", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "signature", + "nativeSrc": "2593:9:50", + "nodeType": "YulIdentifier", + "src": "2593:9:50" + }, + { + "kind": "number", + "nativeSrc": "2604:4:50", + "nodeType": "YulLiteral", + "src": "2604:4:50", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2589:3:50", + "nodeType": "YulIdentifier", + "src": "2589:3:50" + }, + "nativeSrc": "2589:20:50", + "nodeType": "YulFunctionCall", + "src": "2589:20:50" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "2583:5:50", + "nodeType": "YulIdentifier", + "src": "2583:5:50" + }, + "nativeSrc": "2583:27:50", + "nodeType": "YulFunctionCall", + "src": "2583:27:50" + }, + "variableNames": [ + { + "name": "r", + "nativeSrc": "2578:1:50", + "nodeType": "YulIdentifier", + "src": "2578:1:50" + } + ] + }, + { + "nativeSrc": "2627:32:50", + "nodeType": "YulAssignment", + "src": "2627:32:50", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "signature", + "nativeSrc": "2642:9:50", + "nodeType": "YulIdentifier", + "src": "2642:9:50" + }, + { + "kind": "number", + "nativeSrc": "2653:4:50", + "nodeType": "YulLiteral", + "src": "2653:4:50", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2638:3:50", + "nodeType": "YulIdentifier", + "src": "2638:3:50" + }, + "nativeSrc": "2638:20:50", + "nodeType": "YulFunctionCall", + "src": "2638:20:50" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "2632:5:50", + "nodeType": "YulIdentifier", + "src": "2632:5:50" + }, + "nativeSrc": "2632:27:50", + "nodeType": "YulFunctionCall", + "src": "2632:27:50" + }, + "variableNames": [ + { + "name": "s", + "nativeSrc": "2627:1:50", + "nodeType": "YulIdentifier", + "src": "2627:1:50" + } + ] + }, + { + "nativeSrc": "2676:41:50", + "nodeType": "YulAssignment", + "src": "2676:41:50", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2686:1:50", + "nodeType": "YulLiteral", + "src": "2686:1:50", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "signature", + "nativeSrc": "2699:9:50", + "nodeType": "YulIdentifier", + "src": "2699:9:50" + }, + { + "kind": "number", + "nativeSrc": "2710:4:50", + "nodeType": "YulLiteral", + "src": "2710:4:50", + "type": "", + "value": "0x60" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2695:3:50", + "nodeType": "YulIdentifier", + "src": "2695:3:50" + }, + "nativeSrc": "2695:20:50", + "nodeType": "YulFunctionCall", + "src": "2695:20:50" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "2689:5:50", + "nodeType": "YulIdentifier", + "src": "2689:5:50" + }, + "nativeSrc": "2689:27:50", + "nodeType": "YulFunctionCall", + "src": "2689:27:50" + } + ], + "functionName": { + "name": "byte", + "nativeSrc": "2681:4:50", + "nodeType": "YulIdentifier", + "src": "2681:4:50" + }, + "nativeSrc": "2681:36:50", + "nodeType": "YulFunctionCall", + "src": "2681:36:50" + }, + "variableNames": [ + { + "name": "v", + "nativeSrc": "2676:1:50", + "nodeType": "YulIdentifier", + "src": "2676:1:50" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 7924, + "isOffset": false, + "isSlot": false, + "src": "2578:1:50", + "valueSize": 1 + }, + { + "declaration": 7927, + "isOffset": false, + "isSlot": false, + "src": "2627:1:50", + "valueSize": 1 + }, + { + "declaration": 7909, + "isOffset": false, + "isSlot": false, + "src": "2593:9:50", + "valueSize": 1 + }, + { + "declaration": 7909, + "isOffset": false, + "isSlot": false, + "src": "2642:9:50", + "valueSize": 1 + }, + { + "declaration": 7909, + "isOffset": false, + "isSlot": false, + "src": "2699:9:50", + "valueSize": 1 + }, + { + "declaration": 7930, + "isOffset": false, + "isSlot": false, + "src": "2676:1:50", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 7932, + "nodeType": "InlineAssembly", + "src": "2535:196:50" + }, + { + "expression": { + "arguments": [ + { + "id": 7934, + "name": "hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7907, + "src": "2762:4:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 7935, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7930, + "src": "2768:1:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 7936, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7924, + "src": "2771:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 7937, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7927, + "src": "2774:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7933, + "name": "tryRecover", + "nodeType": "Identifier", + "overloadedDeclarations": [7957, 8037, 8145], + "referencedDeclaration": 8145, + "src": "2751:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)" + } + }, + "id": 7938, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2751:25:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "functionReturnParameters": 7918, + "id": 7939, + "nodeType": "Return", + "src": "2744:32:50" + } + ] + } + } + ] + }, + "documentation": { + "id": 7905, + "nodeType": "StructuredDocumentation", + "src": "857:1267:50", + "text": " @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n return address(0) without also returning an error description. Errors are documented using an enum (error type)\n and a bytes32 providing additional information about the error.\n If no error is returned, then the address can be used for verification purposes.\n The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n Documentation for signature generation:\n - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]" + }, + "id": 7957, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryRecover", + "nameLocation": "2138:10:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7910, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7907, + "mutability": "mutable", + "name": "hash", + "nameLocation": "2166:4:50", + "nodeType": "VariableDeclaration", + "scope": 7957, + "src": "2158:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7906, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2158:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7909, + "mutability": "mutable", + "name": "signature", + "nameLocation": "2193:9:50", + "nodeType": "VariableDeclaration", + "scope": 7957, + "src": "2180:22:50", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7908, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2180:5:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2148:60:50" + }, + "returnParameters": { + "id": 7918, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7912, + "mutability": "mutable", + "name": "recovered", + "nameLocation": "2240:9:50", + "nodeType": "VariableDeclaration", + "scope": 7957, + "src": "2232:17:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7911, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2232:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7915, + "mutability": "mutable", + "name": "err", + "nameLocation": "2264:3:50", + "nodeType": "VariableDeclaration", + "scope": 7957, + "src": "2251:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 7914, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 7913, + "name": "RecoverError", + "nameLocations": ["2251:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "2251:12:50" + }, + "referencedDeclaration": 7891, + "src": "2251:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7917, + "mutability": "mutable", + "name": "errArg", + "nameLocation": "2277:6:50", + "nodeType": "VariableDeclaration", + "scope": 7957, + "src": "2269:14:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7916, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2269:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2231:53:50" + }, + "scope": 8231, + "src": "2129:778:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 7986, + "nodeType": "Block", + "src": "3801:168:50", + "statements": [ + { + "assignments": [7968, 7971, 7973], + "declarations": [ + { + "constant": false, + "id": 7968, + "mutability": "mutable", + "name": "recovered", + "nameLocation": "3820:9:50", + "nodeType": "VariableDeclaration", + "scope": 7986, + "src": "3812:17:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7967, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3812:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7971, + "mutability": "mutable", + "name": "error", + "nameLocation": "3844:5:50", + "nodeType": "VariableDeclaration", + "scope": 7986, + "src": "3831:18:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 7970, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 7969, + "name": "RecoverError", + "nameLocations": ["3831:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "3831:12:50" + }, + "referencedDeclaration": 7891, + "src": "3831:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7973, + "mutability": "mutable", + "name": "errorArg", + "nameLocation": "3859:8:50", + "nodeType": "VariableDeclaration", + "scope": 7986, + "src": "3851:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7972, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3851:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 7978, + "initialValue": { + "arguments": [ + { + "id": 7975, + "name": "hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7960, + "src": "3882:4:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 7976, + "name": "signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7962, + "src": "3888:9:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 7974, + "name": "tryRecover", + "nodeType": "Identifier", + "overloadedDeclarations": [7957, 8037, 8145], + "referencedDeclaration": 7957, + "src": "3871:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "function (bytes32,bytes memory) pure returns (address,enum ECDSA.RecoverError,bytes32)" + } + }, + "id": 7977, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3871:27:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3811:87:50" + }, + { + "expression": { + "arguments": [ + { + "id": 7980, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7971, + "src": "3920:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "id": 7981, + "name": "errorArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7973, + "src": "3927:8:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 7979, + "name": "_throwError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8230, + "src": "3908:11:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$7891_$_t_bytes32_$returns$__$", + "typeString": "function (enum ECDSA.RecoverError,bytes32) pure" + } + }, + "id": 7982, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3908:28:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 7983, + "nodeType": "ExpressionStatement", + "src": "3908:28:50" + }, + { + "expression": { + "id": 7984, + "name": "recovered", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7968, + "src": "3953:9:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 7966, + "id": 7985, + "nodeType": "Return", + "src": "3946:16:50" + } + ] + }, + "documentation": { + "id": 7958, + "nodeType": "StructuredDocumentation", + "src": "2913:796:50", + "text": " @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it." + }, + "id": 7987, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recover", + "nameLocation": "3723:7:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7963, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7960, + "mutability": "mutable", + "name": "hash", + "nameLocation": "3739:4:50", + "nodeType": "VariableDeclaration", + "scope": 7987, + "src": "3731:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7959, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3731:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7962, + "mutability": "mutable", + "name": "signature", + "nameLocation": "3758:9:50", + "nodeType": "VariableDeclaration", + "scope": 7987, + "src": "3745:22:50", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 7961, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3745:5:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3730:38:50" + }, + "returnParameters": { + "id": 7966, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7965, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 7987, + "src": "3792:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7964, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3792:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3791:9:50" + }, + "scope": 8231, + "src": "3714:255:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8036, + "nodeType": "Block", + "src": "4348:342:50", + "statements": [ + { + "id": 8035, + "nodeType": "UncheckedBlock", + "src": "4358:326:50", + "statements": [ + { + "assignments": [8005], + "declarations": [ + { + "constant": false, + "id": 8005, + "mutability": "mutable", + "name": "s", + "nameLocation": "4390:1:50", + "nodeType": "VariableDeclaration", + "scope": 8035, + "src": "4382:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8004, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4382:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 8012, + "initialValue": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 8011, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8006, + "name": "vs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7994, + "src": "4394:2:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "arguments": [ + { + "hexValue": "307837666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666", + "id": 8009, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4407:66:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1", + "typeString": "int_const 5789...(69 digits omitted)...9967" + }, + "value": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1", + "typeString": "int_const 5789...(69 digits omitted)...9967" + } + ], + "id": 8008, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4399:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 8007, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4399:7:50", + "typeDescriptions": {} + } + }, + "id": 8010, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4399:75:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "4394:80:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4382:92:50" + }, + { + "assignments": [8014], + "declarations": [ + { + "constant": false, + "id": 8014, + "mutability": "mutable", + "name": "v", + "nameLocation": "4591:1:50", + "nodeType": "VariableDeclaration", + "scope": 8035, + "src": "4585:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 8013, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4585:5:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 8027, + "initialValue": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8022, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8019, + "name": "vs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7994, + "src": "4610:2:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8018, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4602:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 8017, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4602:7:50", + "typeDescriptions": {} + } + }, + "id": 8020, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4602:11:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "323535", + "id": 8021, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4617:3:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "255" + }, + "src": "4602:18:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8023, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4601:20:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "3237", + "id": 8024, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4624:2:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_27_by_1", + "typeString": "int_const 27" + }, + "value": "27" + }, + "src": "4601:25:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8016, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4595:5:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 8015, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4595:5:50", + "typeDescriptions": {} + } + }, + "id": 8026, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4595:32:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4585:42:50" + }, + { + "expression": { + "arguments": [ + { + "id": 8029, + "name": "hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7990, + "src": "4659:4:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8030, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8014, + "src": "4665:1:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 8031, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7992, + "src": "4668:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8032, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8005, + "src": "4671:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8028, + "name": "tryRecover", + "nodeType": "Identifier", + "overloadedDeclarations": [7957, 8037, 8145], + "referencedDeclaration": 8145, + "src": "4648:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)" + } + }, + "id": 8033, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4648:25:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "functionReturnParameters": 8003, + "id": 8034, + "nodeType": "Return", + "src": "4641:32:50" + } + ] + } + ] + }, + "documentation": { + "id": 7988, + "nodeType": "StructuredDocumentation", + "src": "3975:205:50", + "text": " @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n See https://eips.ethereum.org/EIPS/eip-2098[ERC-2098 short signatures]" + }, + "id": 8037, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryRecover", + "nameLocation": "4194:10:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7995, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7990, + "mutability": "mutable", + "name": "hash", + "nameLocation": "4222:4:50", + "nodeType": "VariableDeclaration", + "scope": 8037, + "src": "4214:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7989, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4214:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7992, + "mutability": "mutable", + "name": "r", + "nameLocation": "4244:1:50", + "nodeType": "VariableDeclaration", + "scope": 8037, + "src": "4236:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7991, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4236:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 7994, + "mutability": "mutable", + "name": "vs", + "nameLocation": "4263:2:50", + "nodeType": "VariableDeclaration", + "scope": 8037, + "src": "4255:10:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 7993, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4255:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4204:67:50" + }, + "returnParameters": { + "id": 8003, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7997, + "mutability": "mutable", + "name": "recovered", + "nameLocation": "4303:9:50", + "nodeType": "VariableDeclaration", + "scope": 8037, + "src": "4295:17:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 7996, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4295:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8000, + "mutability": "mutable", + "name": "err", + "nameLocation": "4327:3:50", + "nodeType": "VariableDeclaration", + "scope": 8037, + "src": "4314:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 7999, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 7998, + "name": "RecoverError", + "nameLocations": ["4314:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "4314:12:50" + }, + "referencedDeclaration": 7891, + "src": "4314:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8002, + "mutability": "mutable", + "name": "errArg", + "nameLocation": "4340:6:50", + "nodeType": "VariableDeclaration", + "scope": 8037, + "src": "4332:14:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8001, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4332:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4294:53:50" + }, + "scope": 8231, + "src": "4185:505:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8069, + "nodeType": "Block", + "src": "4903:164:50", + "statements": [ + { + "assignments": [8050, 8053, 8055], + "declarations": [ + { + "constant": false, + "id": 8050, + "mutability": "mutable", + "name": "recovered", + "nameLocation": "4922:9:50", + "nodeType": "VariableDeclaration", + "scope": 8069, + "src": "4914:17:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8049, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4914:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8053, + "mutability": "mutable", + "name": "error", + "nameLocation": "4946:5:50", + "nodeType": "VariableDeclaration", + "scope": 8069, + "src": "4933:18:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 8052, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 8051, + "name": "RecoverError", + "nameLocations": ["4933:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "4933:12:50" + }, + "referencedDeclaration": 7891, + "src": "4933:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8055, + "mutability": "mutable", + "name": "errorArg", + "nameLocation": "4961:8:50", + "nodeType": "VariableDeclaration", + "scope": 8069, + "src": "4953:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8054, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4953:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 8061, + "initialValue": { + "arguments": [ + { + "id": 8057, + "name": "hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8040, + "src": "4984:4:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8058, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8042, + "src": "4990:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8059, + "name": "vs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8044, + "src": "4993:2:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8056, + "name": "tryRecover", + "nodeType": "Identifier", + "overloadedDeclarations": [7957, 8037, 8145], + "referencedDeclaration": 8037, + "src": "4973:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)" + } + }, + "id": 8060, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4973:23:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4913:83:50" + }, + { + "expression": { + "arguments": [ + { + "id": 8063, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8053, + "src": "5018:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "id": 8064, + "name": "errorArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8055, + "src": "5025:8:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8062, + "name": "_throwError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8230, + "src": "5006:11:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$7891_$_t_bytes32_$returns$__$", + "typeString": "function (enum ECDSA.RecoverError,bytes32) pure" + } + }, + "id": 8065, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5006:28:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 8066, + "nodeType": "ExpressionStatement", + "src": "5006:28:50" + }, + { + "expression": { + "id": 8067, + "name": "recovered", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8050, + "src": "5051:9:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 8048, + "id": 8068, + "nodeType": "Return", + "src": "5044:16:50" + } + ] + }, + "documentation": { + "id": 8038, + "nodeType": "StructuredDocumentation", + "src": "4696:116:50", + "text": " @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately." + }, + "id": 8070, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recover", + "nameLocation": "4826:7:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8045, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8040, + "mutability": "mutable", + "name": "hash", + "nameLocation": "4842:4:50", + "nodeType": "VariableDeclaration", + "scope": 8070, + "src": "4834:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8039, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4834:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8042, + "mutability": "mutable", + "name": "r", + "nameLocation": "4856:1:50", + "nodeType": "VariableDeclaration", + "scope": 8070, + "src": "4848:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8041, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4848:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8044, + "mutability": "mutable", + "name": "vs", + "nameLocation": "4867:2:50", + "nodeType": "VariableDeclaration", + "scope": 8070, + "src": "4859:10:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8043, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4859:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4833:37:50" + }, + "returnParameters": { + "id": 8048, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8047, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8070, + "src": "4894:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8046, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4894:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "4893:9:50" + }, + "scope": 8231, + "src": "4817:250:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8144, + "nodeType": "Block", + "src": "5382:1372:50", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8094, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8091, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8079, + "src": "6278:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8090, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6270:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 8089, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6270:7:50", + "typeDescriptions": {} + } + }, + "id": 8092, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6270:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130", + "id": 8093, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6283:66:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1", + "typeString": "int_const 5789...(69 digits omitted)...7168" + }, + "value": "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0" + }, + "src": "6270:79:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8105, + "nodeType": "IfStatement", + "src": "6266:164:50", + "trueBody": { + "id": 8104, + "nodeType": "Block", + "src": "6351:79:50", + "statements": [ + { + "expression": { + "components": [ + { + "arguments": [ + { + "hexValue": "30", + "id": 8097, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6381:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 8096, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6373:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 8095, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6373:7:50", + "typeDescriptions": {} + } + }, + "id": 8098, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6373:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 8099, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "6385:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6398:17:50", + "memberName": "InvalidSignatureS", + "nodeType": "MemberAccess", + "referencedDeclaration": 7890, + "src": "6385:30:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "id": 8101, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8079, + "src": "6417:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 8102, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6372:47:50", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "functionReturnParameters": 8088, + "id": 8103, + "nodeType": "Return", + "src": "6365:54:50" + } + ] + } + }, + { + "assignments": [8107], + "declarations": [ + { + "constant": false, + "id": 8107, + "mutability": "mutable", + "name": "signer", + "nameLocation": "6532:6:50", + "nodeType": "VariableDeclaration", + "scope": 8144, + "src": "6524:14:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8106, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6524:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 8114, + "initialValue": { + "arguments": [ + { + "id": 8109, + "name": "hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8073, + "src": "6551:4:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8110, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8075, + "src": "6557:1:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 8111, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8077, + "src": "6560:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8112, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8079, + "src": "6563:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8108, + "name": "ecrecover", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -6, + "src": "6541:9:50", + "typeDescriptions": { + "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)" + } + }, + "id": 8113, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6541:24:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6524:41:50" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 8120, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8115, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8107, + "src": "6579:6:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 8118, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6597:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 8117, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6589:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 8116, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6589:7:50", + "typeDescriptions": {} + } + }, + "id": 8119, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6589:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "6579:20:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8134, + "nodeType": "IfStatement", + "src": "6575:113:50", + "trueBody": { + "id": 8133, + "nodeType": "Block", + "src": "6601:87:50", + "statements": [ + { + "expression": { + "components": [ + { + "arguments": [ + { + "hexValue": "30", + "id": 8123, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6631:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 8122, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6623:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 8121, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6623:7:50", + "typeDescriptions": {} + } + }, + "id": 8124, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6623:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 8125, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "6635:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8126, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6648:16:50", + "memberName": "InvalidSignature", + "nodeType": "MemberAccess", + "referencedDeclaration": 7888, + "src": "6635:29:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 8129, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6674:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 8128, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6666:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 8127, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6666:7:50", + "typeDescriptions": {} + } + }, + "id": 8130, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6666:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 8131, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6622:55:50", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "functionReturnParameters": 8088, + "id": 8132, + "nodeType": "Return", + "src": "6615:62:50" + } + ] + } + }, + { + "expression": { + "components": [ + { + "id": 8135, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8107, + "src": "6706:6:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 8136, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "6714:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8137, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6727:7:50", + "memberName": "NoError", + "nodeType": "MemberAccess", + "referencedDeclaration": 7887, + "src": "6714:20:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 8140, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6744:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 8139, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6736:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 8138, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6736:7:50", + "typeDescriptions": {} + } + }, + "id": 8141, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6736:10:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 8142, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6705:42:50", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "functionReturnParameters": 8088, + "id": 8143, + "nodeType": "Return", + "src": "6698:49:50" + } + ] + }, + "documentation": { + "id": 8071, + "nodeType": "StructuredDocumentation", + "src": "5073:125:50", + "text": " @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n `r` and `s` signature fields separately." + }, + "id": 8145, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryRecover", + "nameLocation": "5212:10:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8080, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8073, + "mutability": "mutable", + "name": "hash", + "nameLocation": "5240:4:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5232:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8072, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5232:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8075, + "mutability": "mutable", + "name": "v", + "nameLocation": "5260:1:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5254:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 8074, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "5254:5:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8077, + "mutability": "mutable", + "name": "r", + "nameLocation": "5279:1:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5271:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8076, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5271:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8079, + "mutability": "mutable", + "name": "s", + "nameLocation": "5298:1:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5290:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8078, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5290:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5222:83:50" + }, + "returnParameters": { + "id": 8088, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8082, + "mutability": "mutable", + "name": "recovered", + "nameLocation": "5337:9:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5329:17:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8081, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5329:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8085, + "mutability": "mutable", + "name": "err", + "nameLocation": "5361:3:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5348:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 8084, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 8083, + "name": "RecoverError", + "nameLocations": ["5348:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "5348:12:50" + }, + "referencedDeclaration": 7891, + "src": "5348:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8087, + "mutability": "mutable", + "name": "errArg", + "nameLocation": "5374:6:50", + "nodeType": "VariableDeclaration", + "scope": 8145, + "src": "5366:14:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8086, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5366:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5328:53:50" + }, + "scope": 8231, + "src": "5203:1551:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8180, + "nodeType": "Block", + "src": "6981:166:50", + "statements": [ + { + "assignments": [8160, 8163, 8165], + "declarations": [ + { + "constant": false, + "id": 8160, + "mutability": "mutable", + "name": "recovered", + "nameLocation": "7000:9:50", + "nodeType": "VariableDeclaration", + "scope": 8180, + "src": "6992:17:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8159, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6992:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8163, + "mutability": "mutable", + "name": "error", + "nameLocation": "7024:5:50", + "nodeType": "VariableDeclaration", + "scope": 8180, + "src": "7011:18:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 8162, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 8161, + "name": "RecoverError", + "nameLocations": ["7011:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "7011:12:50" + }, + "referencedDeclaration": 7891, + "src": "7011:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8165, + "mutability": "mutable", + "name": "errorArg", + "nameLocation": "7039:8:50", + "nodeType": "VariableDeclaration", + "scope": 8180, + "src": "7031:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8164, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7031:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 8172, + "initialValue": { + "arguments": [ + { + "id": 8167, + "name": "hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8148, + "src": "7062:4:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8168, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8150, + "src": "7068:1:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 8169, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8152, + "src": "7071:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 8170, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8154, + "src": "7074:1:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8166, + "name": "tryRecover", + "nodeType": "Identifier", + "overloadedDeclarations": [7957, 8037, 8145], + "referencedDeclaration": 8145, + "src": "7051:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError,bytes32)" + } + }, + "id": 8171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7051:25:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$7891_$_t_bytes32_$", + "typeString": "tuple(address,enum ECDSA.RecoverError,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6991:85:50" + }, + { + "expression": { + "arguments": [ + { + "id": 8174, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8163, + "src": "7098:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + { + "id": 8175, + "name": "errorArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8165, + "src": "7105:8:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8173, + "name": "_throwError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8230, + "src": "7086:11:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$7891_$_t_bytes32_$returns$__$", + "typeString": "function (enum ECDSA.RecoverError,bytes32) pure" + } + }, + "id": 8176, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7086:28:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 8177, + "nodeType": "ExpressionStatement", + "src": "7086:28:50" + }, + { + "expression": { + "id": 8178, + "name": "recovered", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8160, + "src": "7131:9:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 8158, + "id": 8179, + "nodeType": "Return", + "src": "7124:16:50" + } + ] + }, + "documentation": { + "id": 8146, + "nodeType": "StructuredDocumentation", + "src": "6760:122:50", + "text": " @dev Overload of {ECDSA-recover} that receives the `v`,\n `r` and `s` signature fields separately." + }, + "id": 8181, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recover", + "nameLocation": "6896:7:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8155, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8148, + "mutability": "mutable", + "name": "hash", + "nameLocation": "6912:4:50", + "nodeType": "VariableDeclaration", + "scope": 8181, + "src": "6904:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8147, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6904:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8150, + "mutability": "mutable", + "name": "v", + "nameLocation": "6924:1:50", + "nodeType": "VariableDeclaration", + "scope": 8181, + "src": "6918:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 8149, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "6918:5:50", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8152, + "mutability": "mutable", + "name": "r", + "nameLocation": "6935:1:50", + "nodeType": "VariableDeclaration", + "scope": 8181, + "src": "6927:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8151, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6927:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8154, + "mutability": "mutable", + "name": "s", + "nameLocation": "6946:1:50", + "nodeType": "VariableDeclaration", + "scope": 8181, + "src": "6938:9:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8153, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6938:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "6903:45:50" + }, + "returnParameters": { + "id": 8158, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8157, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8181, + "src": "6972:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8156, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6972:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6971:9:50" + }, + "scope": 8231, + "src": "6887:260:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8229, + "nodeType": "Block", + "src": "7352:460:50", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "id": 8193, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8190, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8185, + "src": "7366:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 8191, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "7375:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8192, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7388:7:50", + "memberName": "NoError", + "nodeType": "MemberAccess", + "referencedDeclaration": 7887, + "src": "7375:20:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "src": "7366:29:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "id": 8199, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8196, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8185, + "src": "7462:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 8197, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "7471:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8198, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7484:16:50", + "memberName": "InvalidSignature", + "nodeType": "MemberAccess", + "referencedDeclaration": 7888, + "src": "7471:29:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "src": "7462:38:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "id": 8207, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8204, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8185, + "src": "7567:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 8205, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "7576:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8206, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7589:22:50", + "memberName": "InvalidSignatureLength", + "nodeType": "MemberAccess", + "referencedDeclaration": 7889, + "src": "7576:35:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "src": "7567:44:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "id": 8219, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8216, + "name": "error", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8185, + "src": "7701:5:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 8217, + "name": "RecoverError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7891, + "src": "7710:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_RecoverError_$7891_$", + "typeString": "type(enum ECDSA.RecoverError)" + } + }, + "id": 8218, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7723:17:50", + "memberName": "InvalidSignatureS", + "nodeType": "MemberAccess", + "referencedDeclaration": 7890, + "src": "7710:30:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "src": "7701:39:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8225, + "nodeType": "IfStatement", + "src": "7697:109:50", + "trueBody": { + "id": 8224, + "nodeType": "Block", + "src": "7742:64:50", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 8221, + "name": "errorArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8187, + "src": "7786:8:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8220, + "name": "ECDSAInvalidSignatureS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7904, + "src": "7763:22:50", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 8222, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7763:32:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 8223, + "nodeType": "RevertStatement", + "src": "7756:39:50" + } + ] + } + }, + "id": 8226, + "nodeType": "IfStatement", + "src": "7563:243:50", + "trueBody": { + "id": 8215, + "nodeType": "Block", + "src": "7613:78:50", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "arguments": [ + { + "id": 8211, + "name": "errorArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8187, + "src": "7670:8:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 8210, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7662:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 8209, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7662:7:50", + "typeDescriptions": {} + } + }, + "id": 8212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7662:17:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8208, + "name": "ECDSAInvalidSignatureLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7899, + "src": "7634:27:50", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256) pure returns (error)" + } + }, + "id": 8213, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7634:46:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 8214, + "nodeType": "RevertStatement", + "src": "7627:53:50" + } + ] + } + }, + "id": 8227, + "nodeType": "IfStatement", + "src": "7458:348:50", + "trueBody": { + "id": 8203, + "nodeType": "Block", + "src": "7502:55:50", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 8200, + "name": "ECDSAInvalidSignature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7894, + "src": "7523:21:50", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 8201, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7523:23:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 8202, + "nodeType": "RevertStatement", + "src": "7516:30:50" + } + ] + } + }, + "id": 8228, + "nodeType": "IfStatement", + "src": "7362:444:50", + "trueBody": { + "id": 8195, + "nodeType": "Block", + "src": "7397:55:50", + "statements": [ + { + "functionReturnParameters": 8189, + "id": 8194, + "nodeType": "Return", + "src": "7411:7:50" + } + ] + } + } + ] + }, + "documentation": { + "id": 8182, + "nodeType": "StructuredDocumentation", + "src": "7153:122:50", + "text": " @dev Optionally reverts with the corresponding custom error according to the `error` argument provided." + }, + "id": 8230, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_throwError", + "nameLocation": "7289:11:50", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8188, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8185, + "mutability": "mutable", + "name": "error", + "nameLocation": "7314:5:50", + "nodeType": "VariableDeclaration", + "scope": 8230, + "src": "7301:18:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + }, + "typeName": { + "id": 8184, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 8183, + "name": "RecoverError", + "nameLocations": ["7301:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 7891, + "src": "7301:12:50" + }, + "referencedDeclaration": 7891, + "src": "7301:12:50", + "typeDescriptions": { + "typeIdentifier": "t_enum$_RecoverError_$7891", + "typeString": "enum ECDSA.RecoverError" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8187, + "mutability": "mutable", + "name": "errorArg", + "nameLocation": "7329:8:50", + "nodeType": "VariableDeclaration", + "scope": 8230, + "src": "7321:16:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8186, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7321:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "7300:38:50" + }, + "returnParameters": { + "id": 8189, + "nodeType": "ParameterList", + "parameters": [], + "src": "7352:0:50" + }, + "scope": 8231, + "src": "7280:532:50", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + } + ], + "scope": 8232, + "src": "344:7470:50", + "usedErrors": [7894, 7899, 7904], + "usedEvents": [] + } + ], + "src": "112:7703:50" + }, + "id": 50 + }, + "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol", + "exportedSymbols": { + "MessageHashUtils": [8317], + "Strings": [7883] + }, + "id": 8318, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 8233, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "123:24:51" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/Strings.sol", + "file": "../Strings.sol", + "id": 8235, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 8318, + "sourceUnit": 7884, + "src": "149:39:51", + "symbolAliases": [ + { + "foreign": { + "id": 8234, + "name": "Strings", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7883, + "src": "157:7:51", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "MessageHashUtils", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 8236, + "nodeType": "StructuredDocumentation", + "src": "190:330:51", + "text": " @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n The library provides methods for generating a hash of a message that conforms to the\n https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n specifications." + }, + "fullyImplemented": true, + "id": 8317, + "linearizedBaseContracts": [8317], + "name": "MessageHashUtils", + "nameLocation": "529:16:51", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 8245, + "nodeType": "Block", + "src": "1339:341:51", + "statements": [ + { + "AST": { + "nativeSrc": "1374:300:51", + "nodeType": "YulBlock", + "src": "1374:300:51", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1395:4:51", + "nodeType": "YulLiteral", + "src": "1395:4:51", + "type": "", + "value": "0x00" + }, + { + "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a3332", + "kind": "string", + "nativeSrc": "1401:34:51", + "nodeType": "YulLiteral", + "src": "1401:34:51", + "type": "", + "value": "\u0019Ethereum Signed Message:\n32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1388:6:51", + "nodeType": "YulIdentifier", + "src": "1388:6:51" + }, + "nativeSrc": "1388:48:51", + "nodeType": "YulFunctionCall", + "src": "1388:48:51" + }, + "nativeSrc": "1388:48:51", + "nodeType": "YulExpressionStatement", + "src": "1388:48:51" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1497:4:51", + "nodeType": "YulLiteral", + "src": "1497:4:51", + "type": "", + "value": "0x1c" + }, + { + "name": "messageHash", + "nativeSrc": "1503:11:51", + "nodeType": "YulIdentifier", + "src": "1503:11:51" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1490:6:51", + "nodeType": "YulIdentifier", + "src": "1490:6:51" + }, + "nativeSrc": "1490:25:51", + "nodeType": "YulFunctionCall", + "src": "1490:25:51" + }, + "nativeSrc": "1490:25:51", + "nodeType": "YulExpressionStatement", + "src": "1490:25:51" + }, + { + "nativeSrc": "1569:31:51", + "nodeType": "YulAssignment", + "src": "1569:31:51", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1589:4:51", + "nodeType": "YulLiteral", + "src": "1589:4:51", + "type": "", + "value": "0x00" + }, + { + "kind": "number", + "nativeSrc": "1595:4:51", + "nodeType": "YulLiteral", + "src": "1595:4:51", + "type": "", + "value": "0x3c" + } + ], + "functionName": { + "name": "keccak256", + "nativeSrc": "1579:9:51", + "nodeType": "YulIdentifier", + "src": "1579:9:51" + }, + "nativeSrc": "1579:21:51", + "nodeType": "YulFunctionCall", + "src": "1579:21:51" + }, + "variableNames": [ + { + "name": "digest", + "nativeSrc": "1569:6:51", + "nodeType": "YulIdentifier", + "src": "1569:6:51" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8242, + "isOffset": false, + "isSlot": false, + "src": "1569:6:51", + "valueSize": 1 + }, + { + "declaration": 8239, + "isOffset": false, + "isSlot": false, + "src": "1503:11:51", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8244, + "nodeType": "InlineAssembly", + "src": "1349:325:51" + } + ] + }, + "documentation": { + "id": 8237, + "nodeType": "StructuredDocumentation", + "src": "552:690:51", + "text": " @dev Returns the keccak256 digest of an ERC-191 signed data with version\n `0x45` (`personal_sign` messages).\n The digest is calculated by prefixing a bytes32 `messageHash` with\n `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n keccak256, although any bytes32 value can be safely used because the final digest will\n be re-hashed.\n See {ECDSA-recover}." + }, + "id": 8246, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toEthSignedMessageHash", + "nameLocation": "1256:22:51", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8240, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8239, + "mutability": "mutable", + "name": "messageHash", + "nameLocation": "1287:11:51", + "nodeType": "VariableDeclaration", + "scope": 8246, + "src": "1279:19:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8238, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1279:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1278:21:51" + }, + "returnParameters": { + "id": 8243, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8242, + "mutability": "mutable", + "name": "digest", + "nameLocation": "1331:6:51", + "nodeType": "VariableDeclaration", + "scope": 8246, + "src": "1323:14:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8241, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1323:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1322:16:51" + }, + "scope": 8317, + "src": "1247:433:51", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8271, + "nodeType": "Block", + "src": "2257:143:51", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a", + "id": 8258, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2309:32:51", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4", + "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\"" + }, + "value": "\u0019Ethereum Signed Message:\n" + }, + { + "arguments": [ + { + "arguments": [ + { + "expression": { + "id": 8263, + "name": "message", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8249, + "src": "2366:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 8264, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2374:6:51", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "2366:14:51", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 8261, + "name": "Strings", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7883, + "src": "2349:7:51", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Strings_$7883_$", + "typeString": "type(library Strings)" + } + }, + "id": 8262, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2357:8:51", + "memberName": "toString", + "nodeType": "MemberAccess", + "referencedDeclaration": 6595, + "src": "2349:16:51", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$", + "typeString": "function (uint256) pure returns (string memory)" + } + }, + "id": 8265, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2349:32:51", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 8260, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2343:5:51", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 8259, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2343:5:51", + "typeDescriptions": {} + } + }, + "id": 8266, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2343:39:51", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 8267, + "name": "message", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8249, + "src": "2384:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4", + "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\"" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 8256, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2296:5:51", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 8255, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2296:5:51", + "typeDescriptions": {} + } + }, + "id": 8257, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2302:6:51", + "memberName": "concat", + "nodeType": "MemberAccess", + "src": "2296:12:51", + "typeDescriptions": { + "typeIdentifier": "t_function_bytesconcat_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 8268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2296:96:51", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 8254, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2286:9:51", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 8269, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2286:107:51", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 8253, + "id": 8270, + "nodeType": "Return", + "src": "2267:126:51" + } + ] + }, + "documentation": { + "id": 8247, + "nodeType": "StructuredDocumentation", + "src": "1686:480:51", + "text": " @dev Returns the keccak256 digest of an ERC-191 signed data with version\n `0x45` (`personal_sign` messages).\n The digest is calculated by prefixing an arbitrary `message` with\n `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n hash signed when using the https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign[`eth_sign`] JSON-RPC method.\n See {ECDSA-recover}." + }, + "id": 8272, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toEthSignedMessageHash", + "nameLocation": "2180:22:51", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8250, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8249, + "mutability": "mutable", + "name": "message", + "nameLocation": "2216:7:51", + "nodeType": "VariableDeclaration", + "scope": 8272, + "src": "2203:20:51", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 8248, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2203:5:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2202:22:51" + }, + "returnParameters": { + "id": 8253, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8252, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8272, + "src": "2248:7:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8251, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2248:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2247:9:51" + }, + "scope": 8317, + "src": "2171:229:51", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8291, + "nodeType": "Block", + "src": "2854:80:51", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "1900", + "id": 8285, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "hexString", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2898:10:51", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_73fd5d154550a4a103564cb191928cd38898034de1b952dc21b290898b4b697a", + "typeString": "literal_string hex\"1900\"" + }, + "value": "\u0019\u0000" + }, + { + "id": 8286, + "name": "validator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8275, + "src": "2910:9:51", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 8287, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8277, + "src": "2921:4:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_73fd5d154550a4a103564cb191928cd38898034de1b952dc21b290898b4b697a", + "typeString": "literal_string hex\"1900\"" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 8283, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "2881:3:51", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 8284, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2885:12:51", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "2881:16:51", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 8288, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2881:45:51", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 8282, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2871:9:51", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 8289, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2871:56:51", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 8281, + "id": 8290, + "nodeType": "Return", + "src": "2864:63:51" + } + ] + }, + "documentation": { + "id": 8273, + "nodeType": "StructuredDocumentation", + "src": "2406:332:51", + "text": " @dev Returns the keccak256 digest of an ERC-191 signed data with version\n `0x00` (data with intended validator).\n The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n `validator` address. Then hashing the result.\n See {ECDSA-recover}." + }, + "id": 8292, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toDataWithIntendedValidatorHash", + "nameLocation": "2752:31:51", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8278, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8275, + "mutability": "mutable", + "name": "validator", + "nameLocation": "2792:9:51", + "nodeType": "VariableDeclaration", + "scope": 8292, + "src": "2784:17:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8274, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2784:7:51", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8277, + "mutability": "mutable", + "name": "data", + "nameLocation": "2816:4:51", + "nodeType": "VariableDeclaration", + "scope": 8292, + "src": "2803:17:51", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 8276, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2803:5:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2783:38:51" + }, + "returnParameters": { + "id": 8281, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8280, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8292, + "src": "2845:7:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8279, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2845:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2844:9:51" + }, + "scope": 8317, + "src": "2743:191:51", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8303, + "nodeType": "Block", + "src": "3216:216:51", + "statements": [ + { + "AST": { + "nativeSrc": "3251:175:51", + "nodeType": "YulBlock", + "src": "3251:175:51", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3272:4:51", + "nodeType": "YulLiteral", + "src": "3272:4:51", + "type": "", + "value": "0x00" + }, + { + "hexValue": "1900", + "kind": "string", + "nativeSrc": "3278:10:51", + "nodeType": "YulLiteral", + "src": "3278:10:51", + "type": "", + "value": "\u0019\u0000" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3265:6:51", + "nodeType": "YulIdentifier", + "src": "3265:6:51" + }, + "nativeSrc": "3265:24:51", + "nodeType": "YulFunctionCall", + "src": "3265:24:51" + }, + "nativeSrc": "3265:24:51", + "nodeType": "YulExpressionStatement", + "src": "3265:24:51" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3309:4:51", + "nodeType": "YulLiteral", + "src": "3309:4:51", + "type": "", + "value": "0x02" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3319:2:51", + "nodeType": "YulLiteral", + "src": "3319:2:51", + "type": "", + "value": "96" + }, + { + "name": "validator", + "nativeSrc": "3323:9:51", + "nodeType": "YulIdentifier", + "src": "3323:9:51" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "3315:3:51", + "nodeType": "YulIdentifier", + "src": "3315:3:51" + }, + "nativeSrc": "3315:18:51", + "nodeType": "YulFunctionCall", + "src": "3315:18:51" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3302:6:51", + "nodeType": "YulIdentifier", + "src": "3302:6:51" + }, + "nativeSrc": "3302:32:51", + "nodeType": "YulFunctionCall", + "src": "3302:32:51" + }, + "nativeSrc": "3302:32:51", + "nodeType": "YulExpressionStatement", + "src": "3302:32:51" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3354:4:51", + "nodeType": "YulLiteral", + "src": "3354:4:51", + "type": "", + "value": "0x16" + }, + { + "name": "messageHash", + "nativeSrc": "3360:11:51", + "nodeType": "YulIdentifier", + "src": "3360:11:51" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3347:6:51", + "nodeType": "YulIdentifier", + "src": "3347:6:51" + }, + "nativeSrc": "3347:25:51", + "nodeType": "YulFunctionCall", + "src": "3347:25:51" + }, + "nativeSrc": "3347:25:51", + "nodeType": "YulExpressionStatement", + "src": "3347:25:51" + }, + { + "nativeSrc": "3385:31:51", + "nodeType": "YulAssignment", + "src": "3385:31:51", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3405:4:51", + "nodeType": "YulLiteral", + "src": "3405:4:51", + "type": "", + "value": "0x00" + }, + { + "kind": "number", + "nativeSrc": "3411:4:51", + "nodeType": "YulLiteral", + "src": "3411:4:51", + "type": "", + "value": "0x36" + } + ], + "functionName": { + "name": "keccak256", + "nativeSrc": "3395:9:51", + "nodeType": "YulIdentifier", + "src": "3395:9:51" + }, + "nativeSrc": "3395:21:51", + "nodeType": "YulFunctionCall", + "src": "3395:21:51" + }, + "variableNames": [ + { + "name": "digest", + "nativeSrc": "3385:6:51", + "nodeType": "YulIdentifier", + "src": "3385:6:51" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8300, + "isOffset": false, + "isSlot": false, + "src": "3385:6:51", + "valueSize": 1 + }, + { + "declaration": 8297, + "isOffset": false, + "isSlot": false, + "src": "3360:11:51", + "valueSize": 1 + }, + { + "declaration": 8295, + "isOffset": false, + "isSlot": false, + "src": "3323:9:51", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8302, + "nodeType": "InlineAssembly", + "src": "3226:200:51" + } + ] + }, + "documentation": { + "id": 8293, + "nodeType": "StructuredDocumentation", + "src": "2940:129:51", + "text": " @dev Variant of {toDataWithIntendedValidatorHash-address-bytes} optimized for cases where `data` is a bytes32." + }, + "id": 8304, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toDataWithIntendedValidatorHash", + "nameLocation": "3083:31:51", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8298, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8295, + "mutability": "mutable", + "name": "validator", + "nameLocation": "3132:9:51", + "nodeType": "VariableDeclaration", + "scope": 8304, + "src": "3124:17:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 8294, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3124:7:51", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8297, + "mutability": "mutable", + "name": "messageHash", + "nameLocation": "3159:11:51", + "nodeType": "VariableDeclaration", + "scope": 8304, + "src": "3151:19:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8296, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3151:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3114:62:51" + }, + "returnParameters": { + "id": 8301, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8300, + "mutability": "mutable", + "name": "digest", + "nameLocation": "3208:6:51", + "nodeType": "VariableDeclaration", + "scope": 8304, + "src": "3200:14:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8299, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3200:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3199:16:51" + }, + "scope": 8317, + "src": "3074:358:51", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8315, + "nodeType": "Block", + "src": "3983:265:51", + "statements": [ + { + "AST": { + "nativeSrc": "4018:224:51", + "nodeType": "YulBlock", + "src": "4018:224:51", + "statements": [ + { + "nativeSrc": "4032:22:51", + "nodeType": "YulVariableDeclaration", + "src": "4032:22:51", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "4049:4:51", + "nodeType": "YulLiteral", + "src": "4049:4:51", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "4043:5:51", + "nodeType": "YulIdentifier", + "src": "4043:5:51" + }, + "nativeSrc": "4043:11:51", + "nodeType": "YulFunctionCall", + "src": "4043:11:51" + }, + "variables": [ + { + "name": "ptr", + "nativeSrc": "4036:3:51", + "nodeType": "YulTypedName", + "src": "4036:3:51", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "4074:3:51", + "nodeType": "YulIdentifier", + "src": "4074:3:51" + }, + { + "hexValue": "1901", + "kind": "string", + "nativeSrc": "4079:10:51", + "nodeType": "YulLiteral", + "src": "4079:10:51", + "type": "", + "value": "\u0019\u0001" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4067:6:51", + "nodeType": "YulIdentifier", + "src": "4067:6:51" + }, + "nativeSrc": "4067:23:51", + "nodeType": "YulFunctionCall", + "src": "4067:23:51" + }, + "nativeSrc": "4067:23:51", + "nodeType": "YulExpressionStatement", + "src": "4067:23:51" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "4114:3:51", + "nodeType": "YulIdentifier", + "src": "4114:3:51" + }, + { + "kind": "number", + "nativeSrc": "4119:4:51", + "nodeType": "YulLiteral", + "src": "4119:4:51", + "type": "", + "value": "0x02" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4110:3:51", + "nodeType": "YulIdentifier", + "src": "4110:3:51" + }, + "nativeSrc": "4110:14:51", + "nodeType": "YulFunctionCall", + "src": "4110:14:51" + }, + { + "name": "domainSeparator", + "nativeSrc": "4126:15:51", + "nodeType": "YulIdentifier", + "src": "4126:15:51" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4103:6:51", + "nodeType": "YulIdentifier", + "src": "4103:6:51" + }, + "nativeSrc": "4103:39:51", + "nodeType": "YulFunctionCall", + "src": "4103:39:51" + }, + "nativeSrc": "4103:39:51", + "nodeType": "YulExpressionStatement", + "src": "4103:39:51" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "4166:3:51", + "nodeType": "YulIdentifier", + "src": "4166:3:51" + }, + { + "kind": "number", + "nativeSrc": "4171:4:51", + "nodeType": "YulLiteral", + "src": "4171:4:51", + "type": "", + "value": "0x22" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4162:3:51", + "nodeType": "YulIdentifier", + "src": "4162:3:51" + }, + "nativeSrc": "4162:14:51", + "nodeType": "YulFunctionCall", + "src": "4162:14:51" + }, + { + "name": "structHash", + "nativeSrc": "4178:10:51", + "nodeType": "YulIdentifier", + "src": "4178:10:51" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4155:6:51", + "nodeType": "YulIdentifier", + "src": "4155:6:51" + }, + "nativeSrc": "4155:34:51", + "nodeType": "YulFunctionCall", + "src": "4155:34:51" + }, + "nativeSrc": "4155:34:51", + "nodeType": "YulExpressionStatement", + "src": "4155:34:51" + }, + { + "nativeSrc": "4202:30:51", + "nodeType": "YulAssignment", + "src": "4202:30:51", + "value": { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "4222:3:51", + "nodeType": "YulIdentifier", + "src": "4222:3:51" + }, + { + "kind": "number", + "nativeSrc": "4227:4:51", + "nodeType": "YulLiteral", + "src": "4227:4:51", + "type": "", + "value": "0x42" + } + ], + "functionName": { + "name": "keccak256", + "nativeSrc": "4212:9:51", + "nodeType": "YulIdentifier", + "src": "4212:9:51" + }, + "nativeSrc": "4212:20:51", + "nodeType": "YulFunctionCall", + "src": "4212:20:51" + }, + "variableNames": [ + { + "name": "digest", + "nativeSrc": "4202:6:51", + "nodeType": "YulIdentifier", + "src": "4202:6:51" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8312, + "isOffset": false, + "isSlot": false, + "src": "4202:6:51", + "valueSize": 1 + }, + { + "declaration": 8307, + "isOffset": false, + "isSlot": false, + "src": "4126:15:51", + "valueSize": 1 + }, + { + "declaration": 8309, + "isOffset": false, + "isSlot": false, + "src": "4178:10:51", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8314, + "nodeType": "InlineAssembly", + "src": "3993:249:51" + } + ] + }, + "documentation": { + "id": 8305, + "nodeType": "StructuredDocumentation", + "src": "3438:431:51", + "text": " @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).\n The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n See {ECDSA-recover}." + }, + "id": 8316, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toTypedDataHash", + "nameLocation": "3883:15:51", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8310, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8307, + "mutability": "mutable", + "name": "domainSeparator", + "nameLocation": "3907:15:51", + "nodeType": "VariableDeclaration", + "scope": 8316, + "src": "3899:23:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8306, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3899:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8309, + "mutability": "mutable", + "name": "structHash", + "nameLocation": "3932:10:51", + "nodeType": "VariableDeclaration", + "scope": 8316, + "src": "3924:18:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8308, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3924:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3898:45:51" + }, + "returnParameters": { + "id": 8313, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8312, + "mutability": "mutable", + "name": "digest", + "nameLocation": "3975:6:51", + "nodeType": "VariableDeclaration", + "scope": 8316, + "src": "3967:14:51", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 8311, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3967:7:51", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3966:16:51" + }, + "scope": 8317, + "src": "3874:374:51", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 8318, + "src": "521:3729:51", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "123:4128:51" + }, + "id": 51 + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/math/Math.sol", + "exportedSymbols": { + "Math": [9938], + "Panic": [6481], + "SafeCast": [11703] + }, + "id": 9939, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 8319, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "103:24:52" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/Panic.sol", + "file": "../Panic.sol", + "id": 8321, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 9939, + "sourceUnit": 6482, + "src": "129:35:52", + "symbolAliases": [ + { + "foreign": { + "id": 8320, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "137:5:52", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/math/SafeCast.sol", + "file": "./SafeCast.sol", + "id": 8323, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 9939, + "sourceUnit": 11704, + "src": "165:40:52", + "symbolAliases": [ + { + "foreign": { + "id": 8322, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "173:8:52", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Math", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 8324, + "nodeType": "StructuredDocumentation", + "src": "207:73:52", + "text": " @dev Standard math utilities missing in the Solidity language." + }, + "fullyImplemented": true, + "id": 9938, + "linearizedBaseContracts": [9938], + "name": "Math", + "nameLocation": "289:4:52", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "Math.Rounding", + "id": 8329, + "members": [ + { + "id": 8325, + "name": "Floor", + "nameLocation": "324:5:52", + "nodeType": "EnumValue", + "src": "324:5:52" + }, + { + "id": 8326, + "name": "Ceil", + "nameLocation": "367:4:52", + "nodeType": "EnumValue", + "src": "367:4:52" + }, + { + "id": 8327, + "name": "Trunc", + "nameLocation": "409:5:52", + "nodeType": "EnumValue", + "src": "409:5:52" + }, + { + "id": 8328, + "name": "Expand", + "nameLocation": "439:6:52", + "nodeType": "EnumValue", + "src": "439:6:52" + } + ], + "name": "Rounding", + "nameLocation": "305:8:52", + "nodeType": "EnumDefinition", + "src": "300:169:52" + }, + { + "body": { + "id": 8342, + "nodeType": "Block", + "src": "731:112:52", + "statements": [ + { + "AST": { + "nativeSrc": "766:71:52", + "nodeType": "YulBlock", + "src": "766:71:52", + "statements": [ + { + "nativeSrc": "780:16:52", + "nodeType": "YulAssignment", + "src": "780:16:52", + "value": { + "arguments": [ + { + "name": "a", + "nativeSrc": "791:1:52", + "nodeType": "YulIdentifier", + "src": "791:1:52" + }, + { + "name": "b", + "nativeSrc": "794:1:52", + "nodeType": "YulIdentifier", + "src": "794:1:52" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "787:3:52", + "nodeType": "YulIdentifier", + "src": "787:3:52" + }, + "nativeSrc": "787:9:52", + "nodeType": "YulFunctionCall", + "src": "787:9:52" + }, + "variableNames": [ + { + "name": "low", + "nativeSrc": "780:3:52", + "nodeType": "YulIdentifier", + "src": "780:3:52" + } + ] + }, + { + "nativeSrc": "809:18:52", + "nodeType": "YulAssignment", + "src": "809:18:52", + "value": { + "arguments": [ + { + "name": "low", + "nativeSrc": "820:3:52", + "nodeType": "YulIdentifier", + "src": "820:3:52" + }, + { + "name": "a", + "nativeSrc": "825:1:52", + "nodeType": "YulIdentifier", + "src": "825:1:52" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "817:2:52", + "nodeType": "YulIdentifier", + "src": "817:2:52" + }, + "nativeSrc": "817:10:52", + "nodeType": "YulFunctionCall", + "src": "817:10:52" + }, + "variableNames": [ + { + "name": "high", + "nativeSrc": "809:4:52", + "nodeType": "YulIdentifier", + "src": "809:4:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8332, + "isOffset": false, + "isSlot": false, + "src": "791:1:52", + "valueSize": 1 + }, + { + "declaration": 8332, + "isOffset": false, + "isSlot": false, + "src": "825:1:52", + "valueSize": 1 + }, + { + "declaration": 8334, + "isOffset": false, + "isSlot": false, + "src": "794:1:52", + "valueSize": 1 + }, + { + "declaration": 8337, + "isOffset": false, + "isSlot": false, + "src": "809:4:52", + "valueSize": 1 + }, + { + "declaration": 8339, + "isOffset": false, + "isSlot": false, + "src": "780:3:52", + "valueSize": 1 + }, + { + "declaration": 8339, + "isOffset": false, + "isSlot": false, + "src": "820:3:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8341, + "nodeType": "InlineAssembly", + "src": "741:96:52" + } + ] + }, + "documentation": { + "id": 8330, + "nodeType": "StructuredDocumentation", + "src": "475:163:52", + "text": " @dev Return the 512-bit addition of two uint256.\n The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low." + }, + "id": 8343, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "add512", + "nameLocation": "652:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8335, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8332, + "mutability": "mutable", + "name": "a", + "nameLocation": "667:1:52", + "nodeType": "VariableDeclaration", + "scope": 8343, + "src": "659:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8331, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "659:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8334, + "mutability": "mutable", + "name": "b", + "nameLocation": "678:1:52", + "nodeType": "VariableDeclaration", + "scope": 8343, + "src": "670:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8333, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "670:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "658:22:52" + }, + "returnParameters": { + "id": 8340, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8337, + "mutability": "mutable", + "name": "high", + "nameLocation": "712:4:52", + "nodeType": "VariableDeclaration", + "scope": 8343, + "src": "704:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8336, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "704:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8339, + "mutability": "mutable", + "name": "low", + "nameLocation": "726:3:52", + "nodeType": "VariableDeclaration", + "scope": 8343, + "src": "718:11:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8338, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "718:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "703:27:52" + }, + "scope": 9938, + "src": "643:200:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8356, + "nodeType": "Block", + "src": "1115:462:52", + "statements": [ + { + "AST": { + "nativeSrc": "1437:134:52", + "nodeType": "YulBlock", + "src": "1437:134:52", + "statements": [ + { + "nativeSrc": "1451:30:52", + "nodeType": "YulVariableDeclaration", + "src": "1451:30:52", + "value": { + "arguments": [ + { + "name": "a", + "nativeSrc": "1468:1:52", + "nodeType": "YulIdentifier", + "src": "1468:1:52" + }, + { + "name": "b", + "nativeSrc": "1471:1:52", + "nodeType": "YulIdentifier", + "src": "1471:1:52" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1478:1:52", + "nodeType": "YulLiteral", + "src": "1478:1:52", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "1474:3:52", + "nodeType": "YulIdentifier", + "src": "1474:3:52" + }, + "nativeSrc": "1474:6:52", + "nodeType": "YulFunctionCall", + "src": "1474:6:52" + } + ], + "functionName": { + "name": "mulmod", + "nativeSrc": "1461:6:52", + "nodeType": "YulIdentifier", + "src": "1461:6:52" + }, + "nativeSrc": "1461:20:52", + "nodeType": "YulFunctionCall", + "src": "1461:20:52" + }, + "variables": [ + { + "name": "mm", + "nativeSrc": "1455:2:52", + "nodeType": "YulTypedName", + "src": "1455:2:52", + "type": "" + } + ] + }, + { + "nativeSrc": "1494:16:52", + "nodeType": "YulAssignment", + "src": "1494:16:52", + "value": { + "arguments": [ + { + "name": "a", + "nativeSrc": "1505:1:52", + "nodeType": "YulIdentifier", + "src": "1505:1:52" + }, + { + "name": "b", + "nativeSrc": "1508:1:52", + "nodeType": "YulIdentifier", + "src": "1508:1:52" + } + ], + "functionName": { + "name": "mul", + "nativeSrc": "1501:3:52", + "nodeType": "YulIdentifier", + "src": "1501:3:52" + }, + "nativeSrc": "1501:9:52", + "nodeType": "YulFunctionCall", + "src": "1501:9:52" + }, + "variableNames": [ + { + "name": "low", + "nativeSrc": "1494:3:52", + "nodeType": "YulIdentifier", + "src": "1494:3:52" + } + ] + }, + { + "nativeSrc": "1523:38:52", + "nodeType": "YulAssignment", + "src": "1523:38:52", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "mm", + "nativeSrc": "1539:2:52", + "nodeType": "YulIdentifier", + "src": "1539:2:52" + }, + { + "name": "low", + "nativeSrc": "1543:3:52", + "nodeType": "YulIdentifier", + "src": "1543:3:52" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1535:3:52", + "nodeType": "YulIdentifier", + "src": "1535:3:52" + }, + "nativeSrc": "1535:12:52", + "nodeType": "YulFunctionCall", + "src": "1535:12:52" + }, + { + "arguments": [ + { + "name": "mm", + "nativeSrc": "1552:2:52", + "nodeType": "YulIdentifier", + "src": "1552:2:52" + }, + { + "name": "low", + "nativeSrc": "1556:3:52", + "nodeType": "YulIdentifier", + "src": "1556:3:52" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "1549:2:52", + "nodeType": "YulIdentifier", + "src": "1549:2:52" + }, + "nativeSrc": "1549:11:52", + "nodeType": "YulFunctionCall", + "src": "1549:11:52" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1531:3:52", + "nodeType": "YulIdentifier", + "src": "1531:3:52" + }, + "nativeSrc": "1531:30:52", + "nodeType": "YulFunctionCall", + "src": "1531:30:52" + }, + "variableNames": [ + { + "name": "high", + "nativeSrc": "1523:4:52", + "nodeType": "YulIdentifier", + "src": "1523:4:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8346, + "isOffset": false, + "isSlot": false, + "src": "1468:1:52", + "valueSize": 1 + }, + { + "declaration": 8346, + "isOffset": false, + "isSlot": false, + "src": "1505:1:52", + "valueSize": 1 + }, + { + "declaration": 8348, + "isOffset": false, + "isSlot": false, + "src": "1471:1:52", + "valueSize": 1 + }, + { + "declaration": 8348, + "isOffset": false, + "isSlot": false, + "src": "1508:1:52", + "valueSize": 1 + }, + { + "declaration": 8351, + "isOffset": false, + "isSlot": false, + "src": "1523:4:52", + "valueSize": 1 + }, + { + "declaration": 8353, + "isOffset": false, + "isSlot": false, + "src": "1494:3:52", + "valueSize": 1 + }, + { + "declaration": 8353, + "isOffset": false, + "isSlot": false, + "src": "1543:3:52", + "valueSize": 1 + }, + { + "declaration": 8353, + "isOffset": false, + "isSlot": false, + "src": "1556:3:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8355, + "nodeType": "InlineAssembly", + "src": "1412:159:52" + } + ] + }, + "documentation": { + "id": 8344, + "nodeType": "StructuredDocumentation", + "src": "849:173:52", + "text": " @dev Return the 512-bit multiplication of two uint256.\n The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low." + }, + "id": 8357, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mul512", + "nameLocation": "1036:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8349, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8346, + "mutability": "mutable", + "name": "a", + "nameLocation": "1051:1:52", + "nodeType": "VariableDeclaration", + "scope": 8357, + "src": "1043:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8345, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1043:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8348, + "mutability": "mutable", + "name": "b", + "nameLocation": "1062:1:52", + "nodeType": "VariableDeclaration", + "scope": 8357, + "src": "1054:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8347, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1054:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1042:22:52" + }, + "returnParameters": { + "id": 8354, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8351, + "mutability": "mutable", + "name": "high", + "nameLocation": "1096:4:52", + "nodeType": "VariableDeclaration", + "scope": 8357, + "src": "1088:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8350, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1088:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8353, + "mutability": "mutable", + "name": "low", + "nameLocation": "1110:3:52", + "nodeType": "VariableDeclaration", + "scope": 8357, + "src": "1102:11:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8352, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1102:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1087:27:52" + }, + "scope": 9938, + "src": "1027:550:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8391, + "nodeType": "Block", + "src": "1784:149:52", + "statements": [ + { + "id": 8390, + "nodeType": "UncheckedBlock", + "src": "1794:133:52", + "statements": [ + { + "assignments": [8370], + "declarations": [ + { + "constant": false, + "id": 8370, + "mutability": "mutable", + "name": "c", + "nameLocation": "1826:1:52", + "nodeType": "VariableDeclaration", + "scope": 8390, + "src": "1818:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8369, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1818:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8374, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8373, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8371, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8360, + "src": "1830:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 8372, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8362, + "src": "1834:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1830:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1818:17:52" + }, + { + "expression": { + "id": 8379, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8375, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8365, + "src": "1849:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8378, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8376, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8370, + "src": "1859:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 8377, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8360, + "src": "1864:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1859:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1849:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8380, + "nodeType": "ExpressionStatement", + "src": "1849:16:52" + }, + { + "expression": { + "id": 8388, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8381, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8367, + "src": "1879:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8387, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8382, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8370, + "src": "1888:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "arguments": [ + { + "id": 8385, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8365, + "src": "1908:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8383, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "1892:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8384, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1901:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "1892:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8386, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1892:24:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1888:28:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1879:37:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8389, + "nodeType": "ExpressionStatement", + "src": "1879:37:52" + } + ] + } + ] + }, + "documentation": { + "id": 8358, + "nodeType": "StructuredDocumentation", + "src": "1583:105:52", + "text": " @dev Returns the addition of two unsigned integers, with a success flag (no overflow)." + }, + "id": 8392, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryAdd", + "nameLocation": "1702:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8363, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8360, + "mutability": "mutable", + "name": "a", + "nameLocation": "1717:1:52", + "nodeType": "VariableDeclaration", + "scope": 8392, + "src": "1709:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8359, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1709:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8362, + "mutability": "mutable", + "name": "b", + "nameLocation": "1728:1:52", + "nodeType": "VariableDeclaration", + "scope": 8392, + "src": "1720:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8361, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1720:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1708:22:52" + }, + "returnParameters": { + "id": 8368, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8365, + "mutability": "mutable", + "name": "success", + "nameLocation": "1759:7:52", + "nodeType": "VariableDeclaration", + "scope": 8392, + "src": "1754:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8364, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1754:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8367, + "mutability": "mutable", + "name": "result", + "nameLocation": "1776:6:52", + "nodeType": "VariableDeclaration", + "scope": 8392, + "src": "1768:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8366, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1768:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1753:30:52" + }, + "scope": 9938, + "src": "1693:240:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8426, + "nodeType": "Block", + "src": "2143:149:52", + "statements": [ + { + "id": 8425, + "nodeType": "UncheckedBlock", + "src": "2153:133:52", + "statements": [ + { + "assignments": [8405], + "declarations": [ + { + "constant": false, + "id": 8405, + "mutability": "mutable", + "name": "c", + "nameLocation": "2185:1:52", + "nodeType": "VariableDeclaration", + "scope": 8425, + "src": "2177:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8404, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2177:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8409, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8408, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8406, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8395, + "src": "2189:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 8407, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8397, + "src": "2193:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2189:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2177:17:52" + }, + { + "expression": { + "id": 8414, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8410, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8400, + "src": "2208:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8413, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8411, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8405, + "src": "2218:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 8412, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8395, + "src": "2223:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2218:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2208:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8415, + "nodeType": "ExpressionStatement", + "src": "2208:16:52" + }, + { + "expression": { + "id": 8423, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8416, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8402, + "src": "2238:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8422, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8417, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8405, + "src": "2247:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "arguments": [ + { + "id": 8420, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8400, + "src": "2267:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8418, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "2251:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8419, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2260:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "2251:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8421, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2251:24:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2247:28:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2238:37:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8424, + "nodeType": "ExpressionStatement", + "src": "2238:37:52" + } + ] + } + ] + }, + "documentation": { + "id": 8393, + "nodeType": "StructuredDocumentation", + "src": "1939:108:52", + "text": " @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow)." + }, + "id": 8427, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "trySub", + "nameLocation": "2061:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8398, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8395, + "mutability": "mutable", + "name": "a", + "nameLocation": "2076:1:52", + "nodeType": "VariableDeclaration", + "scope": 8427, + "src": "2068:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8394, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2068:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8397, + "mutability": "mutable", + "name": "b", + "nameLocation": "2087:1:52", + "nodeType": "VariableDeclaration", + "scope": 8427, + "src": "2079:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8396, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2079:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2067:22:52" + }, + "returnParameters": { + "id": 8403, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8400, + "mutability": "mutable", + "name": "success", + "nameLocation": "2118:7:52", + "nodeType": "VariableDeclaration", + "scope": 8427, + "src": "2113:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8399, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2113:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8402, + "mutability": "mutable", + "name": "result", + "nameLocation": "2135:6:52", + "nodeType": "VariableDeclaration", + "scope": 8427, + "src": "2127:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8401, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2127:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2112:30:52" + }, + "scope": 9938, + "src": "2052:240:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8456, + "nodeType": "Block", + "src": "2505:391:52", + "statements": [ + { + "id": 8455, + "nodeType": "UncheckedBlock", + "src": "2515:375:52", + "statements": [ + { + "assignments": [8440], + "declarations": [ + { + "constant": false, + "id": 8440, + "mutability": "mutable", + "name": "c", + "nameLocation": "2547:1:52", + "nodeType": "VariableDeclaration", + "scope": 8455, + "src": "2539:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8439, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2539:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8444, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8443, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8441, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8430, + "src": "2551:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8442, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8432, + "src": "2555:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2551:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2539:17:52" + }, + { + "AST": { + "nativeSrc": "2595:188:52", + "nodeType": "YulBlock", + "src": "2595:188:52", + "statements": [ + { + "nativeSrc": "2727:42:52", + "nodeType": "YulAssignment", + "src": "2727:42:52", + "value": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "c", + "nativeSrc": "2748:1:52", + "nodeType": "YulIdentifier", + "src": "2748:1:52" + }, + { + "name": "a", + "nativeSrc": "2751:1:52", + "nodeType": "YulIdentifier", + "src": "2751:1:52" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "2744:3:52", + "nodeType": "YulIdentifier", + "src": "2744:3:52" + }, + "nativeSrc": "2744:9:52", + "nodeType": "YulFunctionCall", + "src": "2744:9:52" + }, + { + "name": "b", + "nativeSrc": "2755:1:52", + "nodeType": "YulIdentifier", + "src": "2755:1:52" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "2741:2:52", + "nodeType": "YulIdentifier", + "src": "2741:2:52" + }, + "nativeSrc": "2741:16:52", + "nodeType": "YulFunctionCall", + "src": "2741:16:52" + }, + { + "arguments": [ + { + "name": "a", + "nativeSrc": "2766:1:52", + "nodeType": "YulIdentifier", + "src": "2766:1:52" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "2759:6:52", + "nodeType": "YulIdentifier", + "src": "2759:6:52" + }, + "nativeSrc": "2759:9:52", + "nodeType": "YulFunctionCall", + "src": "2759:9:52" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "2738:2:52", + "nodeType": "YulIdentifier", + "src": "2738:2:52" + }, + "nativeSrc": "2738:31:52", + "nodeType": "YulFunctionCall", + "src": "2738:31:52" + }, + "variableNames": [ + { + "name": "success", + "nativeSrc": "2727:7:52", + "nodeType": "YulIdentifier", + "src": "2727:7:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8430, + "isOffset": false, + "isSlot": false, + "src": "2751:1:52", + "valueSize": 1 + }, + { + "declaration": 8430, + "isOffset": false, + "isSlot": false, + "src": "2766:1:52", + "valueSize": 1 + }, + { + "declaration": 8432, + "isOffset": false, + "isSlot": false, + "src": "2755:1:52", + "valueSize": 1 + }, + { + "declaration": 8440, + "isOffset": false, + "isSlot": false, + "src": "2748:1:52", + "valueSize": 1 + }, + { + "declaration": 8435, + "isOffset": false, + "isSlot": false, + "src": "2727:7:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8445, + "nodeType": "InlineAssembly", + "src": "2570:213:52" + }, + { + "expression": { + "id": 8453, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8446, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8437, + "src": "2842:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8452, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8447, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8440, + "src": "2851:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "arguments": [ + { + "id": 8450, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8435, + "src": "2871:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8448, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "2855:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8449, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2864:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "2855:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8451, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2855:24:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2851:28:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2842:37:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8454, + "nodeType": "ExpressionStatement", + "src": "2842:37:52" + } + ] + } + ] + }, + "documentation": { + "id": 8428, + "nodeType": "StructuredDocumentation", + "src": "2298:111:52", + "text": " @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow)." + }, + "id": 8457, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryMul", + "nameLocation": "2423:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8433, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8430, + "mutability": "mutable", + "name": "a", + "nameLocation": "2438:1:52", + "nodeType": "VariableDeclaration", + "scope": 8457, + "src": "2430:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8429, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2430:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8432, + "mutability": "mutable", + "name": "b", + "nameLocation": "2449:1:52", + "nodeType": "VariableDeclaration", + "scope": 8457, + "src": "2441:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8431, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2441:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2429:22:52" + }, + "returnParameters": { + "id": 8438, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8435, + "mutability": "mutable", + "name": "success", + "nameLocation": "2480:7:52", + "nodeType": "VariableDeclaration", + "scope": 8457, + "src": "2475:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8434, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2475:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8437, + "mutability": "mutable", + "name": "result", + "nameLocation": "2497:6:52", + "nodeType": "VariableDeclaration", + "scope": 8457, + "src": "2489:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8436, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2489:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2474:30:52" + }, + "scope": 9938, + "src": "2414:482:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8477, + "nodeType": "Block", + "src": "3111:231:52", + "statements": [ + { + "id": 8476, + "nodeType": "UncheckedBlock", + "src": "3121:215:52", + "statements": [ + { + "expression": { + "id": 8473, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8469, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8465, + "src": "3145:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8472, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8470, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8462, + "src": "3155:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 8471, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3159:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3155:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3145:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8474, + "nodeType": "ExpressionStatement", + "src": "3145:15:52" + }, + { + "AST": { + "nativeSrc": "3199:127:52", + "nodeType": "YulBlock", + "src": "3199:127:52", + "statements": [ + { + "nativeSrc": "3293:19:52", + "nodeType": "YulAssignment", + "src": "3293:19:52", + "value": { + "arguments": [ + { + "name": "a", + "nativeSrc": "3307:1:52", + "nodeType": "YulIdentifier", + "src": "3307:1:52" + }, + { + "name": "b", + "nativeSrc": "3310:1:52", + "nodeType": "YulIdentifier", + "src": "3310:1:52" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "3303:3:52", + "nodeType": "YulIdentifier", + "src": "3303:3:52" + }, + "nativeSrc": "3303:9:52", + "nodeType": "YulFunctionCall", + "src": "3303:9:52" + }, + "variableNames": [ + { + "name": "result", + "nativeSrc": "3293:6:52", + "nodeType": "YulIdentifier", + "src": "3293:6:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8460, + "isOffset": false, + "isSlot": false, + "src": "3307:1:52", + "valueSize": 1 + }, + { + "declaration": 8462, + "isOffset": false, + "isSlot": false, + "src": "3310:1:52", + "valueSize": 1 + }, + { + "declaration": 8467, + "isOffset": false, + "isSlot": false, + "src": "3293:6:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8475, + "nodeType": "InlineAssembly", + "src": "3174:152:52" + } + ] + } + ] + }, + "documentation": { + "id": 8458, + "nodeType": "StructuredDocumentation", + "src": "2902:113:52", + "text": " @dev Returns the division of two unsigned integers, with a success flag (no division by zero)." + }, + "id": 8478, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryDiv", + "nameLocation": "3029:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8463, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8460, + "mutability": "mutable", + "name": "a", + "nameLocation": "3044:1:52", + "nodeType": "VariableDeclaration", + "scope": 8478, + "src": "3036:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8459, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3036:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8462, + "mutability": "mutable", + "name": "b", + "nameLocation": "3055:1:52", + "nodeType": "VariableDeclaration", + "scope": 8478, + "src": "3047:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8461, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3047:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3035:22:52" + }, + "returnParameters": { + "id": 8468, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8465, + "mutability": "mutable", + "name": "success", + "nameLocation": "3086:7:52", + "nodeType": "VariableDeclaration", + "scope": 8478, + "src": "3081:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8464, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3081:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8467, + "mutability": "mutable", + "name": "result", + "nameLocation": "3103:6:52", + "nodeType": "VariableDeclaration", + "scope": 8478, + "src": "3095:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8466, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3095:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3080:30:52" + }, + "scope": 9938, + "src": "3020:322:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8498, + "nodeType": "Block", + "src": "3567:231:52", + "statements": [ + { + "id": 8497, + "nodeType": "UncheckedBlock", + "src": "3577:215:52", + "statements": [ + { + "expression": { + "id": 8494, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8490, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8486, + "src": "3601:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8493, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8491, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8483, + "src": "3611:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 8492, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3615:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3611:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3601:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8495, + "nodeType": "ExpressionStatement", + "src": "3601:15:52" + }, + { + "AST": { + "nativeSrc": "3655:127:52", + "nodeType": "YulBlock", + "src": "3655:127:52", + "statements": [ + { + "nativeSrc": "3749:19:52", + "nodeType": "YulAssignment", + "src": "3749:19:52", + "value": { + "arguments": [ + { + "name": "a", + "nativeSrc": "3763:1:52", + "nodeType": "YulIdentifier", + "src": "3763:1:52" + }, + { + "name": "b", + "nativeSrc": "3766:1:52", + "nodeType": "YulIdentifier", + "src": "3766:1:52" + } + ], + "functionName": { + "name": "mod", + "nativeSrc": "3759:3:52", + "nodeType": "YulIdentifier", + "src": "3759:3:52" + }, + "nativeSrc": "3759:9:52", + "nodeType": "YulFunctionCall", + "src": "3759:9:52" + }, + "variableNames": [ + { + "name": "result", + "nativeSrc": "3749:6:52", + "nodeType": "YulIdentifier", + "src": "3749:6:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8481, + "isOffset": false, + "isSlot": false, + "src": "3763:1:52", + "valueSize": 1 + }, + { + "declaration": 8483, + "isOffset": false, + "isSlot": false, + "src": "3766:1:52", + "valueSize": 1 + }, + { + "declaration": 8488, + "isOffset": false, + "isSlot": false, + "src": "3749:6:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8496, + "nodeType": "InlineAssembly", + "src": "3630:152:52" + } + ] + } + ] + }, + "documentation": { + "id": 8479, + "nodeType": "StructuredDocumentation", + "src": "3348:123:52", + "text": " @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero)." + }, + "id": 8499, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryMod", + "nameLocation": "3485:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8484, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8481, + "mutability": "mutable", + "name": "a", + "nameLocation": "3500:1:52", + "nodeType": "VariableDeclaration", + "scope": 8499, + "src": "3492:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8480, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3492:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8483, + "mutability": "mutable", + "name": "b", + "nameLocation": "3511:1:52", + "nodeType": "VariableDeclaration", + "scope": 8499, + "src": "3503:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8482, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3503:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3491:22:52" + }, + "returnParameters": { + "id": 8489, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8486, + "mutability": "mutable", + "name": "success", + "nameLocation": "3542:7:52", + "nodeType": "VariableDeclaration", + "scope": 8499, + "src": "3537:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8485, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3537:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8488, + "mutability": "mutable", + "name": "result", + "nameLocation": "3559:6:52", + "nodeType": "VariableDeclaration", + "scope": 8499, + "src": "3551:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8487, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3551:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3536:30:52" + }, + "scope": 9938, + "src": "3476:322:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8528, + "nodeType": "Block", + "src": "3989:122:52", + "statements": [ + { + "assignments": [8510, 8512], + "declarations": [ + { + "constant": false, + "id": 8510, + "mutability": "mutable", + "name": "success", + "nameLocation": "4005:7:52", + "nodeType": "VariableDeclaration", + "scope": 8528, + "src": "4000:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8509, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4000:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8512, + "mutability": "mutable", + "name": "result", + "nameLocation": "4022:6:52", + "nodeType": "VariableDeclaration", + "scope": 8528, + "src": "4014:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8511, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4014:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8517, + "initialValue": { + "arguments": [ + { + "id": 8514, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8502, + "src": "4039:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8515, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8504, + "src": "4042:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8513, + "name": "tryAdd", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8392, + "src": "4032:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 8516, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4032:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3999:45:52" + }, + { + "expression": { + "arguments": [ + { + "id": 8519, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8510, + "src": "4069:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 8520, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8512, + "src": "4078:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "arguments": [ + { + "id": 8523, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4091:7:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 8522, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4091:7:52", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 8521, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "4086:4:52", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 8524, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4086:13:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 8525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4100:3:52", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "4086:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8518, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8606, + "src": "4061:7:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (bool,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4061:43:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8508, + "id": 8527, + "nodeType": "Return", + "src": "4054:50:52" + } + ] + }, + "documentation": { + "id": 8500, + "nodeType": "StructuredDocumentation", + "src": "3804:103:52", + "text": " @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing." + }, + "id": 8529, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "saturatingAdd", + "nameLocation": "3921:13:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8505, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8502, + "mutability": "mutable", + "name": "a", + "nameLocation": "3943:1:52", + "nodeType": "VariableDeclaration", + "scope": 8529, + "src": "3935:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8501, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3935:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8504, + "mutability": "mutable", + "name": "b", + "nameLocation": "3954:1:52", + "nodeType": "VariableDeclaration", + "scope": 8529, + "src": "3946:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8503, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3946:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3934:22:52" + }, + "returnParameters": { + "id": 8508, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8507, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8529, + "src": "3980:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8506, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3980:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3979:9:52" + }, + "scope": 9938, + "src": "3912:199:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8548, + "nodeType": "Block", + "src": "4294:73:52", + "statements": [ + { + "assignments": [null, 8540], + "declarations": [ + null, + { + "constant": false, + "id": 8540, + "mutability": "mutable", + "name": "result", + "nameLocation": "4315:6:52", + "nodeType": "VariableDeclaration", + "scope": 8548, + "src": "4307:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8539, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4307:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8545, + "initialValue": { + "arguments": [ + { + "id": 8542, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8532, + "src": "4332:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8543, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8534, + "src": "4335:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8541, + "name": "trySub", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8427, + "src": "4325:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 8544, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4325:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4304:33:52" + }, + { + "expression": { + "id": 8546, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8540, + "src": "4354:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8538, + "id": 8547, + "nodeType": "Return", + "src": "4347:13:52" + } + ] + }, + "documentation": { + "id": 8530, + "nodeType": "StructuredDocumentation", + "src": "4117:95:52", + "text": " @dev Unsigned saturating subtraction, bounds to zero instead of overflowing." + }, + "id": 8549, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "saturatingSub", + "nameLocation": "4226:13:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8535, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8532, + "mutability": "mutable", + "name": "a", + "nameLocation": "4248:1:52", + "nodeType": "VariableDeclaration", + "scope": 8549, + "src": "4240:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8531, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4240:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8534, + "mutability": "mutable", + "name": "b", + "nameLocation": "4259:1:52", + "nodeType": "VariableDeclaration", + "scope": 8549, + "src": "4251:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8533, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4251:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4239:22:52" + }, + "returnParameters": { + "id": 8538, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8537, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8549, + "src": "4285:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8536, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4285:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4284:9:52" + }, + "scope": 9938, + "src": "4217:150:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8578, + "nodeType": "Block", + "src": "4564:122:52", + "statements": [ + { + "assignments": [8560, 8562], + "declarations": [ + { + "constant": false, + "id": 8560, + "mutability": "mutable", + "name": "success", + "nameLocation": "4580:7:52", + "nodeType": "VariableDeclaration", + "scope": 8578, + "src": "4575:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8559, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4575:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8562, + "mutability": "mutable", + "name": "result", + "nameLocation": "4597:6:52", + "nodeType": "VariableDeclaration", + "scope": 8578, + "src": "4589:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8561, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4589:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8567, + "initialValue": { + "arguments": [ + { + "id": 8564, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8552, + "src": "4614:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8565, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8554, + "src": "4617:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8563, + "name": "tryMul", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8457, + "src": "4607:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (bool,uint256)" + } + }, + "id": 8566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4607:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4574:45:52" + }, + { + "expression": { + "arguments": [ + { + "id": 8569, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8560, + "src": "4644:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 8570, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8562, + "src": "4653:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "arguments": [ + { + "id": 8573, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4666:7:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 8572, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4666:7:52", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 8571, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "4661:4:52", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 8574, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4661:13:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 8575, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4675:3:52", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "4661:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8568, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8606, + "src": "4636:7:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (bool,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8576, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4636:43:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8558, + "id": 8577, + "nodeType": "Return", + "src": "4629:50:52" + } + ] + }, + "documentation": { + "id": 8550, + "nodeType": "StructuredDocumentation", + "src": "4373:109:52", + "text": " @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing." + }, + "id": 8579, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "saturatingMul", + "nameLocation": "4496:13:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8555, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8552, + "mutability": "mutable", + "name": "a", + "nameLocation": "4518:1:52", + "nodeType": "VariableDeclaration", + "scope": 8579, + "src": "4510:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8551, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4510:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8554, + "mutability": "mutable", + "name": "b", + "nameLocation": "4529:1:52", + "nodeType": "VariableDeclaration", + "scope": 8579, + "src": "4521:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8553, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4521:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4509:22:52" + }, + "returnParameters": { + "id": 8558, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8557, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8579, + "src": "4555:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8556, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4555:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4554:9:52" + }, + "scope": 9938, + "src": "4487:199:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8605, + "nodeType": "Block", + "src": "5158:207:52", + "statements": [ + { + "id": 8604, + "nodeType": "UncheckedBlock", + "src": "5168:191:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8602, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8591, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8586, + "src": "5306:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8600, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8594, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8592, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8584, + "src": "5312:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "id": 8593, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8586, + "src": "5316:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5312:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8595, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5311:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "arguments": [ + { + "id": 8598, + "name": "condition", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8582, + "src": "5337:9:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8596, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "5321:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8597, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5330:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "5321:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8599, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5321:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5311:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8601, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5310:38:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5306:42:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8590, + "id": 8603, + "nodeType": "Return", + "src": "5299:49:52" + } + ] + } + ] + }, + "documentation": { + "id": 8580, + "nodeType": "StructuredDocumentation", + "src": "4692:374:52", + "text": " @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n one branch when needed, making this function more expensive." + }, + "id": 8606, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "ternary", + "nameLocation": "5080:7:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8587, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8582, + "mutability": "mutable", + "name": "condition", + "nameLocation": "5093:9:52", + "nodeType": "VariableDeclaration", + "scope": 8606, + "src": "5088:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 8581, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5088:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8584, + "mutability": "mutable", + "name": "a", + "nameLocation": "5112:1:52", + "nodeType": "VariableDeclaration", + "scope": 8606, + "src": "5104:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8583, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5104:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8586, + "mutability": "mutable", + "name": "b", + "nameLocation": "5123:1:52", + "nodeType": "VariableDeclaration", + "scope": 8606, + "src": "5115:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8585, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5115:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5087:38:52" + }, + "returnParameters": { + "id": 8590, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8589, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8606, + "src": "5149:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8588, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5149:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5148:9:52" + }, + "scope": 9938, + "src": "5071:294:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8624, + "nodeType": "Block", + "src": "5502:44:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8619, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8617, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8609, + "src": "5527:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 8618, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8611, + "src": "5531:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5527:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 8620, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8609, + "src": "5534:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8621, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8611, + "src": "5537:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8616, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8606, + "src": "5519:7:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (bool,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5519:20:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8615, + "id": 8623, + "nodeType": "Return", + "src": "5512:27:52" + } + ] + }, + "documentation": { + "id": 8607, + "nodeType": "StructuredDocumentation", + "src": "5371:59:52", + "text": " @dev Returns the largest of two numbers." + }, + "id": 8625, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "max", + "nameLocation": "5444:3:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8612, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8609, + "mutability": "mutable", + "name": "a", + "nameLocation": "5456:1:52", + "nodeType": "VariableDeclaration", + "scope": 8625, + "src": "5448:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8608, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5448:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8611, + "mutability": "mutable", + "name": "b", + "nameLocation": "5467:1:52", + "nodeType": "VariableDeclaration", + "scope": 8625, + "src": "5459:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8610, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5459:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5447:22:52" + }, + "returnParameters": { + "id": 8615, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8614, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8625, + "src": "5493:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8613, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5493:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5492:9:52" + }, + "scope": 9938, + "src": "5435:111:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8643, + "nodeType": "Block", + "src": "5684:44:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8638, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8636, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8628, + "src": "5709:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 8637, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8630, + "src": "5713:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5709:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 8639, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8628, + "src": "5716:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8640, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8630, + "src": "5719:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8635, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8606, + "src": "5701:7:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (bool,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5701:20:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8634, + "id": 8642, + "nodeType": "Return", + "src": "5694:27:52" + } + ] + }, + "documentation": { + "id": 8626, + "nodeType": "StructuredDocumentation", + "src": "5552:60:52", + "text": " @dev Returns the smallest of two numbers." + }, + "id": 8644, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "min", + "nameLocation": "5626:3:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8631, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8628, + "mutability": "mutable", + "name": "a", + "nameLocation": "5638:1:52", + "nodeType": "VariableDeclaration", + "scope": 8644, + "src": "5630:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8627, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5630:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8630, + "mutability": "mutable", + "name": "b", + "nameLocation": "5649:1:52", + "nodeType": "VariableDeclaration", + "scope": 8644, + "src": "5641:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8629, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5641:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5629:22:52" + }, + "returnParameters": { + "id": 8634, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8633, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8644, + "src": "5675:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8632, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5675:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5674:9:52" + }, + "scope": 9938, + "src": "5617:111:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8666, + "nodeType": "Block", + "src": "5912:82:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8664, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8656, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8654, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8647, + "src": "5967:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "id": 8655, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8649, + "src": "5971:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5967:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8657, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5966:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8660, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8658, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8647, + "src": "5977:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "id": 8659, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8649, + "src": "5981:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5977:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8661, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5976:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "hexValue": "32", + "id": 8662, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5986:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "5976:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5966:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8653, + "id": 8665, + "nodeType": "Return", + "src": "5959:28:52" + } + ] + }, + "documentation": { + "id": 8645, + "nodeType": "StructuredDocumentation", + "src": "5734:102:52", + "text": " @dev Returns the average of two numbers. The result is rounded towards\n zero." + }, + "id": 8667, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "average", + "nameLocation": "5850:7:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8650, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8647, + "mutability": "mutable", + "name": "a", + "nameLocation": "5866:1:52", + "nodeType": "VariableDeclaration", + "scope": 8667, + "src": "5858:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8646, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5858:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8649, + "mutability": "mutable", + "name": "b", + "nameLocation": "5877:1:52", + "nodeType": "VariableDeclaration", + "scope": 8667, + "src": "5869:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8648, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5869:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5857:22:52" + }, + "returnParameters": { + "id": 8653, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8652, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8667, + "src": "5903:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8651, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5903:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5902:9:52" + }, + "scope": 9938, + "src": "5841:153:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8707, + "nodeType": "Block", + "src": "6286:633:52", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8679, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8677, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8672, + "src": "6300:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 8678, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6305:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "6300:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8688, + "nodeType": "IfStatement", + "src": "6296:150:52", + "trueBody": { + "id": 8687, + "nodeType": "Block", + "src": "6308:138:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 8683, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "6412:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8684, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6418:16:52", + "memberName": "DIVISION_BY_ZERO", + "nodeType": "MemberAccess", + "referencedDeclaration": 6448, + "src": "6412:22:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 8680, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "6400:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8682, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6406:5:52", + "memberName": "panic", + "nodeType": "MemberAccess", + "referencedDeclaration": 6480, + "src": "6400:11:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 8685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6400:35:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 8686, + "nodeType": "ExpressionStatement", + "src": "6400:35:52" + } + ] + } + }, + { + "id": 8706, + "nodeType": "UncheckedBlock", + "src": "6829:84:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8693, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8691, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8670, + "src": "6876:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 8692, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6880:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "6876:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8689, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "6860:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6869:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "6860:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8694, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6860:22:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8697, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8695, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8670, + "src": "6887:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "hexValue": "31", + "id": 8696, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6891:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "6887:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8698, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6886:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 8699, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8672, + "src": "6896:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6886:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 8701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6900:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "6886:15:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8703, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6885:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6860:42:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8676, + "id": 8705, + "nodeType": "Return", + "src": "6853:49:52" + } + ] + } + ] + }, + "documentation": { + "id": 8668, + "nodeType": "StructuredDocumentation", + "src": "6000:210:52", + "text": " @dev Returns the ceiling of the division of two numbers.\n This differs from standard division with `/` in that it rounds towards infinity instead\n of rounding towards zero." + }, + "id": 8708, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "ceilDiv", + "nameLocation": "6224:7:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8673, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8670, + "mutability": "mutable", + "name": "a", + "nameLocation": "6240:1:52", + "nodeType": "VariableDeclaration", + "scope": 8708, + "src": "6232:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8669, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6232:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8672, + "mutability": "mutable", + "name": "b", + "nameLocation": "6251:1:52", + "nodeType": "VariableDeclaration", + "scope": 8708, + "src": "6243:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8671, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6243:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6231:22:52" + }, + "returnParameters": { + "id": 8676, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8675, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8708, + "src": "6277:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8674, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6277:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6276:9:52" + }, + "scope": 9938, + "src": "6215:704:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8843, + "nodeType": "Block", + "src": "7340:3585:52", + "statements": [ + { + "id": 8842, + "nodeType": "UncheckedBlock", + "src": "7350:3569:52", + "statements": [ + { + "assignments": [8721, 8723], + "declarations": [ + { + "constant": false, + "id": 8721, + "mutability": "mutable", + "name": "high", + "nameLocation": "7383:4:52", + "nodeType": "VariableDeclaration", + "scope": 8842, + "src": "7375:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8720, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7375:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8723, + "mutability": "mutable", + "name": "low", + "nameLocation": "7397:3:52", + "nodeType": "VariableDeclaration", + "scope": 8842, + "src": "7389:11:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8722, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7389:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8728, + "initialValue": { + "arguments": [ + { + "id": 8725, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8711, + "src": "7411:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8726, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8713, + "src": "7414:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8724, + "name": "mul512", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8357, + "src": "7404:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256,uint256)" + } + }, + "id": 8727, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7404:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7374:42:52" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8731, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8729, + "name": "high", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8721, + "src": "7498:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 8730, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7506:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7498:9:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8737, + "nodeType": "IfStatement", + "src": "7494:365:52", + "trueBody": { + "id": 8736, + "nodeType": "Block", + "src": "7509:350:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8732, + "name": "low", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8723, + "src": "7827:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 8733, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "7833:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7827:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8719, + "id": 8735, + "nodeType": "Return", + "src": "7820:24:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8740, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8738, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "7969:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 8739, + "name": "high", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8721, + "src": "7984:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7969:19:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8756, + "nodeType": "IfStatement", + "src": "7965:142:52", + "trueBody": { + "id": 8755, + "nodeType": "Block", + "src": "7990:117:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8745, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "8028:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 8746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8043:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "8028:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "expression": { + "id": 8748, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "8046:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8749, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8052:16:52", + "memberName": "DIVISION_BY_ZERO", + "nodeType": "MemberAccess", + "referencedDeclaration": 6448, + "src": "8046:22:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 8750, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "8070:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8751, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8076:14:52", + "memberName": "UNDER_OVERFLOW", + "nodeType": "MemberAccess", + "referencedDeclaration": 6444, + "src": "8070:20:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8744, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8606, + "src": "8020:7:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (bool,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8020:71:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 8741, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "8008:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8743, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8014:5:52", + "memberName": "panic", + "nodeType": "MemberAccess", + "referencedDeclaration": 6480, + "src": "8008:11:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 8753, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8008:84:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 8754, + "nodeType": "ExpressionStatement", + "src": "8008:84:52" + } + ] + } + }, + { + "assignments": [8758], + "declarations": [ + { + "constant": false, + "id": 8758, + "mutability": "mutable", + "name": "remainder", + "nameLocation": "8367:9:52", + "nodeType": "VariableDeclaration", + "scope": 8842, + "src": "8359:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8757, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8359:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8759, + "nodeType": "VariableDeclarationStatement", + "src": "8359:17:52" + }, + { + "AST": { + "nativeSrc": "8415:283:52", + "nodeType": "YulBlock", + "src": "8415:283:52", + "statements": [ + { + "nativeSrc": "8484:38:52", + "nodeType": "YulAssignment", + "src": "8484:38:52", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "8504:1:52", + "nodeType": "YulIdentifier", + "src": "8504:1:52" + }, + { + "name": "y", + "nativeSrc": "8507:1:52", + "nodeType": "YulIdentifier", + "src": "8507:1:52" + }, + { + "name": "denominator", + "nativeSrc": "8510:11:52", + "nodeType": "YulIdentifier", + "src": "8510:11:52" + } + ], + "functionName": { + "name": "mulmod", + "nativeSrc": "8497:6:52", + "nodeType": "YulIdentifier", + "src": "8497:6:52" + }, + "nativeSrc": "8497:25:52", + "nodeType": "YulFunctionCall", + "src": "8497:25:52" + }, + "variableNames": [ + { + "name": "remainder", + "nativeSrc": "8484:9:52", + "nodeType": "YulIdentifier", + "src": "8484:9:52" + } + ] + }, + { + "nativeSrc": "8604:37:52", + "nodeType": "YulAssignment", + "src": "8604:37:52", + "value": { + "arguments": [ + { + "name": "high", + "nativeSrc": "8616:4:52", + "nodeType": "YulIdentifier", + "src": "8616:4:52" + }, + { + "arguments": [ + { + "name": "remainder", + "nativeSrc": "8625:9:52", + "nodeType": "YulIdentifier", + "src": "8625:9:52" + }, + { + "name": "low", + "nativeSrc": "8636:3:52", + "nodeType": "YulIdentifier", + "src": "8636:3:52" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "8622:2:52", + "nodeType": "YulIdentifier", + "src": "8622:2:52" + }, + "nativeSrc": "8622:18:52", + "nodeType": "YulFunctionCall", + "src": "8622:18:52" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "8612:3:52", + "nodeType": "YulIdentifier", + "src": "8612:3:52" + }, + "nativeSrc": "8612:29:52", + "nodeType": "YulFunctionCall", + "src": "8612:29:52" + }, + "variableNames": [ + { + "name": "high", + "nativeSrc": "8604:4:52", + "nodeType": "YulIdentifier", + "src": "8604:4:52" + } + ] + }, + { + "nativeSrc": "8658:26:52", + "nodeType": "YulAssignment", + "src": "8658:26:52", + "value": { + "arguments": [ + { + "name": "low", + "nativeSrc": "8669:3:52", + "nodeType": "YulIdentifier", + "src": "8669:3:52" + }, + { + "name": "remainder", + "nativeSrc": "8674:9:52", + "nodeType": "YulIdentifier", + "src": "8674:9:52" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "8665:3:52", + "nodeType": "YulIdentifier", + "src": "8665:3:52" + }, + "nativeSrc": "8665:19:52", + "nodeType": "YulFunctionCall", + "src": "8665:19:52" + }, + "variableNames": [ + { + "name": "low", + "nativeSrc": "8658:3:52", + "nodeType": "YulIdentifier", + "src": "8658:3:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8715, + "isOffset": false, + "isSlot": false, + "src": "8510:11:52", + "valueSize": 1 + }, + { + "declaration": 8721, + "isOffset": false, + "isSlot": false, + "src": "8604:4:52", + "valueSize": 1 + }, + { + "declaration": 8721, + "isOffset": false, + "isSlot": false, + "src": "8616:4:52", + "valueSize": 1 + }, + { + "declaration": 8723, + "isOffset": false, + "isSlot": false, + "src": "8636:3:52", + "valueSize": 1 + }, + { + "declaration": 8723, + "isOffset": false, + "isSlot": false, + "src": "8658:3:52", + "valueSize": 1 + }, + { + "declaration": 8723, + "isOffset": false, + "isSlot": false, + "src": "8669:3:52", + "valueSize": 1 + }, + { + "declaration": 8758, + "isOffset": false, + "isSlot": false, + "src": "8484:9:52", + "valueSize": 1 + }, + { + "declaration": 8758, + "isOffset": false, + "isSlot": false, + "src": "8625:9:52", + "valueSize": 1 + }, + { + "declaration": 8758, + "isOffset": false, + "isSlot": false, + "src": "8674:9:52", + "valueSize": 1 + }, + { + "declaration": 8711, + "isOffset": false, + "isSlot": false, + "src": "8504:1:52", + "valueSize": 1 + }, + { + "declaration": 8713, + "isOffset": false, + "isSlot": false, + "src": "8507:1:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8760, + "nodeType": "InlineAssembly", + "src": "8390:308:52" + }, + { + "assignments": [8762], + "declarations": [ + { + "constant": false, + "id": 8762, + "mutability": "mutable", + "name": "twos", + "nameLocation": "8910:4:52", + "nodeType": "VariableDeclaration", + "scope": 8842, + "src": "8902:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8761, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8902:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8769, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8768, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8763, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "8917:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8766, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "30", + "id": 8764, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8932:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 8765, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "8936:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8932:15:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8767, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "8931:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8917:31:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8902:46:52" + }, + { + "AST": { + "nativeSrc": "8987:359:52", + "nodeType": "YulBlock", + "src": "8987:359:52", + "statements": [ + { + "nativeSrc": "9052:37:52", + "nodeType": "YulAssignment", + "src": "9052:37:52", + "value": { + "arguments": [ + { + "name": "denominator", + "nativeSrc": "9071:11:52", + "nodeType": "YulIdentifier", + "src": "9071:11:52" + }, + { + "name": "twos", + "nativeSrc": "9084:4:52", + "nodeType": "YulIdentifier", + "src": "9084:4:52" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "9067:3:52", + "nodeType": "YulIdentifier", + "src": "9067:3:52" + }, + "nativeSrc": "9067:22:52", + "nodeType": "YulFunctionCall", + "src": "9067:22:52" + }, + "variableNames": [ + { + "name": "denominator", + "nativeSrc": "9052:11:52", + "nodeType": "YulIdentifier", + "src": "9052:11:52" + } + ] + }, + { + "nativeSrc": "9153:21:52", + "nodeType": "YulAssignment", + "src": "9153:21:52", + "value": { + "arguments": [ + { + "name": "low", + "nativeSrc": "9164:3:52", + "nodeType": "YulIdentifier", + "src": "9164:3:52" + }, + { + "name": "twos", + "nativeSrc": "9169:4:52", + "nodeType": "YulIdentifier", + "src": "9169:4:52" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "9160:3:52", + "nodeType": "YulIdentifier", + "src": "9160:3:52" + }, + "nativeSrc": "9160:14:52", + "nodeType": "YulFunctionCall", + "src": "9160:14:52" + }, + "variableNames": [ + { + "name": "low", + "nativeSrc": "9153:3:52", + "nodeType": "YulIdentifier", + "src": "9153:3:52" + } + ] + }, + { + "nativeSrc": "9293:39:52", + "nodeType": "YulAssignment", + "src": "9293:39:52", + "value": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9313:1:52", + "nodeType": "YulLiteral", + "src": "9313:1:52", + "type": "", + "value": "0" + }, + { + "name": "twos", + "nativeSrc": "9316:4:52", + "nodeType": "YulIdentifier", + "src": "9316:4:52" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9309:3:52", + "nodeType": "YulIdentifier", + "src": "9309:3:52" + }, + "nativeSrc": "9309:12:52", + "nodeType": "YulFunctionCall", + "src": "9309:12:52" + }, + { + "name": "twos", + "nativeSrc": "9323:4:52", + "nodeType": "YulIdentifier", + "src": "9323:4:52" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "9305:3:52", + "nodeType": "YulIdentifier", + "src": "9305:3:52" + }, + "nativeSrc": "9305:23:52", + "nodeType": "YulFunctionCall", + "src": "9305:23:52" + }, + { + "kind": "number", + "nativeSrc": "9330:1:52", + "nodeType": "YulLiteral", + "src": "9330:1:52", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9301:3:52", + "nodeType": "YulIdentifier", + "src": "9301:3:52" + }, + "nativeSrc": "9301:31:52", + "nodeType": "YulFunctionCall", + "src": "9301:31:52" + }, + "variableNames": [ + { + "name": "twos", + "nativeSrc": "9293:4:52", + "nodeType": "YulIdentifier", + "src": "9293:4:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 8715, + "isOffset": false, + "isSlot": false, + "src": "9052:11:52", + "valueSize": 1 + }, + { + "declaration": 8715, + "isOffset": false, + "isSlot": false, + "src": "9071:11:52", + "valueSize": 1 + }, + { + "declaration": 8723, + "isOffset": false, + "isSlot": false, + "src": "9153:3:52", + "valueSize": 1 + }, + { + "declaration": 8723, + "isOffset": false, + "isSlot": false, + "src": "9164:3:52", + "valueSize": 1 + }, + { + "declaration": 8762, + "isOffset": false, + "isSlot": false, + "src": "9084:4:52", + "valueSize": 1 + }, + { + "declaration": 8762, + "isOffset": false, + "isSlot": false, + "src": "9169:4:52", + "valueSize": 1 + }, + { + "declaration": 8762, + "isOffset": false, + "isSlot": false, + "src": "9293:4:52", + "valueSize": 1 + }, + { + "declaration": 8762, + "isOffset": false, + "isSlot": false, + "src": "9316:4:52", + "valueSize": 1 + }, + { + "declaration": 8762, + "isOffset": false, + "isSlot": false, + "src": "9323:4:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 8770, + "nodeType": "InlineAssembly", + "src": "8962:384:52" + }, + { + "expression": { + "id": 8775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8771, + "name": "low", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8723, + "src": "9409:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8774, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8772, + "name": "high", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8721, + "src": "9416:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8773, + "name": "twos", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8762, + "src": "9423:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9416:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9409:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8776, + "nodeType": "ExpressionStatement", + "src": "9409:18:52" + }, + { + "assignments": [8778], + "declarations": [ + { + "constant": false, + "id": 8778, + "mutability": "mutable", + "name": "inverse", + "nameLocation": "9770:7:52", + "nodeType": "VariableDeclaration", + "scope": 8842, + "src": "9762:15:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8777, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9762:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8785, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8784, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "33", + "id": 8779, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9781:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8780, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "9785:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9781:15:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8782, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "9780:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "hexValue": "32", + "id": 8783, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9800:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "9780:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9762:39:52" + }, + { + "expression": { + "id": 8792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8786, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10018:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 8787, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10029:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8790, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8788, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "10033:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8789, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10047:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10033:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10029:25:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10018:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8793, + "nodeType": "ExpressionStatement", + "src": "10018:36:52" + }, + { + "expression": { + "id": 8800, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8794, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10088:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 8795, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10099:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8796, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "10103:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8797, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10117:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10103:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10099:25:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10088:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8801, + "nodeType": "ExpressionStatement", + "src": "10088:36:52" + }, + { + "expression": { + "id": 8808, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8802, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10160:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8807, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 8803, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10171:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8806, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8804, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "10175:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8805, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10189:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10175:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10171:25:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10160:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8809, + "nodeType": "ExpressionStatement", + "src": "10160:36:52" + }, + { + "expression": { + "id": 8816, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8810, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10231:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 8811, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10242:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8814, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8812, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "10246:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8813, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10260:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10246:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10242:25:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10231:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8817, + "nodeType": "ExpressionStatement", + "src": "10231:36:52" + }, + { + "expression": { + "id": 8824, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8818, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10304:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8823, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 8819, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10315:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8822, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8820, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "10319:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8821, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10333:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10319:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10315:25:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10304:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8825, + "nodeType": "ExpressionStatement", + "src": "10304:36:52" + }, + { + "expression": { + "id": 8832, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8826, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10378:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "*=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8831, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "32", + "id": 8827, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10389:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8830, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8828, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8715, + "src": "10393:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8829, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10407:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10393:21:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10389:25:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10378:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8833, + "nodeType": "ExpressionStatement", + "src": "10378:36:52" + }, + { + "expression": { + "id": 8838, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 8834, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8718, + "src": "10859:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8837, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8835, + "name": "low", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8723, + "src": "10868:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 8836, + "name": "inverse", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8778, + "src": "10874:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10868:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10859:22:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 8839, + "nodeType": "ExpressionStatement", + "src": "10859:22:52" + }, + { + "expression": { + "id": 8840, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8718, + "src": "10902:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8719, + "id": 8841, + "nodeType": "Return", + "src": "10895:13:52" + } + ] + } + ] + }, + "documentation": { + "id": 8709, + "nodeType": "StructuredDocumentation", + "src": "6925:312:52", + "text": " @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n denominator == 0.\n Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n Uniswap Labs also under MIT license." + }, + "id": 8844, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mulDiv", + "nameLocation": "7251:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8716, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8711, + "mutability": "mutable", + "name": "x", + "nameLocation": "7266:1:52", + "nodeType": "VariableDeclaration", + "scope": 8844, + "src": "7258:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8710, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7258:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8713, + "mutability": "mutable", + "name": "y", + "nameLocation": "7277:1:52", + "nodeType": "VariableDeclaration", + "scope": 8844, + "src": "7269:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8712, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7269:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8715, + "mutability": "mutable", + "name": "denominator", + "nameLocation": "7288:11:52", + "nodeType": "VariableDeclaration", + "scope": 8844, + "src": "7280:19:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8714, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7280:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7257:43:52" + }, + "returnParameters": { + "id": 8719, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8718, + "mutability": "mutable", + "name": "result", + "nameLocation": "7332:6:52", + "nodeType": "VariableDeclaration", + "scope": 8844, + "src": "7324:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8717, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7324:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7323:16:52" + }, + "scope": 9938, + "src": "7242:3683:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8880, + "nodeType": "Block", + "src": "11164:128:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8878, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8860, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8847, + "src": "11188:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8861, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8849, + "src": "11191:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8862, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8851, + "src": "11194:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8859, + "name": "mulDiv", + "nodeType": "Identifier", + "overloadedDeclarations": [8844, 8881], + "referencedDeclaration": 8844, + "src": "11181:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8863, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11181:25:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 8876, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8867, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8854, + "src": "11242:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 8866, + "name": "unsignedRoundsUp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9937, + "src": "11225:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_Rounding_$8329_$returns$_t_bool_$", + "typeString": "function (enum Math.Rounding) pure returns (bool)" + } + }, + "id": 8868, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11225:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8875, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8870, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8847, + "src": "11262:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8871, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8849, + "src": "11265:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8872, + "name": "denominator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8851, + "src": "11268:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8869, + "name": "mulmod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -16, + "src": "11255:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8873, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11255:25:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 8874, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11283:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "11255:29:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "11225:59:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8864, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "11209:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8865, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "11218:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "11209:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8877, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11209:76:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11181:104:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8858, + "id": 8879, + "nodeType": "Return", + "src": "11174:111:52" + } + ] + }, + "documentation": { + "id": 8845, + "nodeType": "StructuredDocumentation", + "src": "10931:118:52", + "text": " @dev Calculates x * y / denominator with full precision, following the selected rounding direction." + }, + "id": 8881, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mulDiv", + "nameLocation": "11063:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8855, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8847, + "mutability": "mutable", + "name": "x", + "nameLocation": "11078:1:52", + "nodeType": "VariableDeclaration", + "scope": 8881, + "src": "11070:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8846, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11070:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8849, + "mutability": "mutable", + "name": "y", + "nameLocation": "11089:1:52", + "nodeType": "VariableDeclaration", + "scope": 8881, + "src": "11081:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8848, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11081:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8851, + "mutability": "mutable", + "name": "denominator", + "nameLocation": "11100:11:52", + "nodeType": "VariableDeclaration", + "scope": 8881, + "src": "11092:19:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8850, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11092:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8854, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "11122:8:52", + "nodeType": "VariableDeclaration", + "scope": 8881, + "src": "11113:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 8853, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 8852, + "name": "Rounding", + "nameLocations": ["11113:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "11113:8:52" + }, + "referencedDeclaration": 8329, + "src": "11113:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "11069:62:52" + }, + "returnParameters": { + "id": 8858, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8857, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8881, + "src": "11155:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8856, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11155:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11154:9:52" + }, + "scope": 9938, + "src": "11054:238:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8930, + "nodeType": "Block", + "src": "11500:245:52", + "statements": [ + { + "id": 8929, + "nodeType": "UncheckedBlock", + "src": "11510:229:52", + "statements": [ + { + "assignments": [8894, 8896], + "declarations": [ + { + "constant": false, + "id": 8894, + "mutability": "mutable", + "name": "high", + "nameLocation": "11543:4:52", + "nodeType": "VariableDeclaration", + "scope": 8929, + "src": "11535:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8893, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11535:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8896, + "mutability": "mutable", + "name": "low", + "nameLocation": "11557:3:52", + "nodeType": "VariableDeclaration", + "scope": 8929, + "src": "11549:11:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8895, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11549:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8901, + "initialValue": { + "arguments": [ + { + "id": 8898, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8884, + "src": "11571:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8899, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8886, + "src": "11574:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8897, + "name": "mul512", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8357, + "src": "11564:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256,uint256)" + } + }, + "id": 8900, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11564:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "11534:42:52" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8906, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8902, + "name": "high", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8894, + "src": "11594:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8905, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 8903, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11602:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "id": 8904, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8888, + "src": "11607:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "11602:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11594:14:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8915, + "nodeType": "IfStatement", + "src": "11590:86:52", + "trueBody": { + "id": 8914, + "nodeType": "Block", + "src": "11610:66:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 8910, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "11640:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8911, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "11646:14:52", + "memberName": "UNDER_OVERFLOW", + "nodeType": "MemberAccess", + "referencedDeclaration": 6444, + "src": "11640:20:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 8907, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "11628:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 8909, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "11634:5:52", + "memberName": "panic", + "nodeType": "MemberAccess", + "referencedDeclaration": 6480, + "src": "11628:11:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 8912, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11628:33:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 8913, + "nodeType": "ExpressionStatement", + "src": "11628:33:52" + } + ] + } + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8921, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8916, + "name": "high", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8894, + "src": "11697:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + }, + "id": 8919, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "323536", + "id": 8917, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11706:3:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + }, + "value": "256" + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 8918, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8888, + "src": "11712:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "11706:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + } + ], + "id": 8920, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "11705:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "src": "11697:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8922, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "11696:19:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8925, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8923, + "name": "low", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8896, + "src": "11719:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 8924, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8888, + "src": "11726:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "11719:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 8926, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "11718:10:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11696:32:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8892, + "id": 8928, + "nodeType": "Return", + "src": "11689:39:52" + } + ] + } + ] + }, + "documentation": { + "id": 8882, + "nodeType": "StructuredDocumentation", + "src": "11298:111:52", + "text": " @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256." + }, + "id": 8931, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mulShr", + "nameLocation": "11423:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8889, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8884, + "mutability": "mutable", + "name": "x", + "nameLocation": "11438:1:52", + "nodeType": "VariableDeclaration", + "scope": 8931, + "src": "11430:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8883, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11430:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8886, + "mutability": "mutable", + "name": "y", + "nameLocation": "11449:1:52", + "nodeType": "VariableDeclaration", + "scope": 8931, + "src": "11441:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8885, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11441:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8888, + "mutability": "mutable", + "name": "n", + "nameLocation": "11458:1:52", + "nodeType": "VariableDeclaration", + "scope": 8931, + "src": "11452:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 8887, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "11452:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "src": "11429:31:52" + }, + "returnParameters": { + "id": 8892, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8891, + "mutability": "mutable", + "name": "result", + "nameLocation": "11492:6:52", + "nodeType": "VariableDeclaration", + "scope": 8931, + "src": "11484:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8890, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11484:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11483:16:52" + }, + "scope": 9938, + "src": "11414:331:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 8969, + "nodeType": "Block", + "src": "11963:113:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8967, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8947, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8934, + "src": "11987:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8948, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8936, + "src": "11990:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8949, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8938, + "src": "11993:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 8946, + "name": "mulShr", + "nodeType": "Identifier", + "overloadedDeclarations": [8931, 8970], + "referencedDeclaration": 8931, + "src": "11980:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint8_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256,uint8) pure returns (uint256)" + } + }, + "id": 8950, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11980:15:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 8965, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8954, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8941, + "src": "12031:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 8953, + "name": "unsignedRoundsUp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9937, + "src": "12014:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_Rounding_$8329_$returns$_t_bool_$", + "typeString": "function (enum Math.Rounding) pure returns (bool)" + } + }, + "id": 8955, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12014:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8964, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 8957, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8934, + "src": "12051:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 8958, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8936, + "src": "12054:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8961, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 8959, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12057:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "id": 8960, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8938, + "src": "12062:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "12057:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 8956, + "name": "mulmod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -16, + "src": "12044:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 8962, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12044:20:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 8963, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12067:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "12044:24:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "12014:54:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 8951, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "11998:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 8952, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12007:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "11998:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 8966, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11998:71:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11980:89:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8945, + "id": 8968, + "nodeType": "Return", + "src": "11973:96:52" + } + ] + }, + "documentation": { + "id": 8932, + "nodeType": "StructuredDocumentation", + "src": "11751:109:52", + "text": " @dev Calculates x * y >> n with full precision, following the selected rounding direction." + }, + "id": 8970, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mulShr", + "nameLocation": "11874:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8942, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8934, + "mutability": "mutable", + "name": "x", + "nameLocation": "11889:1:52", + "nodeType": "VariableDeclaration", + "scope": 8970, + "src": "11881:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8933, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11881:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8936, + "mutability": "mutable", + "name": "y", + "nameLocation": "11900:1:52", + "nodeType": "VariableDeclaration", + "scope": 8970, + "src": "11892:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8935, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11892:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8938, + "mutability": "mutable", + "name": "n", + "nameLocation": "11909:1:52", + "nodeType": "VariableDeclaration", + "scope": 8970, + "src": "11903:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 8937, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "11903:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8941, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "11921:8:52", + "nodeType": "VariableDeclaration", + "scope": 8970, + "src": "11912:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 8940, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 8939, + "name": "Rounding", + "nameLocations": ["11912:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "11912:8:52" + }, + "referencedDeclaration": 8329, + "src": "11912:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "11880:50:52" + }, + "returnParameters": { + "id": 8945, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8944, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 8970, + "src": "11954:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8943, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11954:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11953:9:52" + }, + "scope": 9938, + "src": "11865:211:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9066, + "nodeType": "Block", + "src": "12710:1849:52", + "statements": [ + { + "id": 9065, + "nodeType": "UncheckedBlock", + "src": "12720:1833:52", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8982, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8980, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8975, + "src": "12748:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 8981, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12753:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "12748:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 8985, + "nodeType": "IfStatement", + "src": "12744:20:52", + "trueBody": { + "expression": { + "hexValue": "30", + "id": 8983, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12763:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 8979, + "id": 8984, + "nodeType": "Return", + "src": "12756:8:52" + } + }, + { + "assignments": [8987], + "declarations": [ + { + "constant": false, + "id": 8987, + "mutability": "mutable", + "name": "remainder", + "nameLocation": "13243:9:52", + "nodeType": "VariableDeclaration", + "scope": 9065, + "src": "13235:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8986, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13235:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8991, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 8990, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 8988, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8973, + "src": "13255:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "%", + "rightExpression": { + "id": 8989, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8975, + "src": "13259:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13255:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13235:25:52" + }, + { + "assignments": [8993], + "declarations": [ + { + "constant": false, + "id": 8993, + "mutability": "mutable", + "name": "gcd", + "nameLocation": "13282:3:52", + "nodeType": "VariableDeclaration", + "scope": 9065, + "src": "13274:11:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8992, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13274:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 8995, + "initialValue": { + "id": 8994, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8975, + "src": "13288:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13274:15:52" + }, + { + "assignments": [8997], + "declarations": [ + { + "constant": false, + "id": 8997, + "mutability": "mutable", + "name": "x", + "nameLocation": "13432:1:52", + "nodeType": "VariableDeclaration", + "scope": 9065, + "src": "13425:8:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 8996, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "13425:6:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "id": 8999, + "initialValue": { + "hexValue": "30", + "id": 8998, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13436:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "13425:12:52" + }, + { + "assignments": [9001], + "declarations": [ + { + "constant": false, + "id": 9001, + "mutability": "mutable", + "name": "y", + "nameLocation": "13458:1:52", + "nodeType": "VariableDeclaration", + "scope": 9065, + "src": "13451:8:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 9000, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "13451:6:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "id": 9003, + "initialValue": { + "hexValue": "31", + "id": 9002, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13462:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "VariableDeclarationStatement", + "src": "13451:12:52" + }, + { + "body": { + "id": 9040, + "nodeType": "Block", + "src": "13501:882:52", + "statements": [ + { + "assignments": [9008], + "declarations": [ + { + "constant": false, + "id": 9008, + "mutability": "mutable", + "name": "quotient", + "nameLocation": "13527:8:52", + "nodeType": "VariableDeclaration", + "scope": 9040, + "src": "13519:16:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9007, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13519:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9012, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9011, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9009, + "name": "gcd", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8993, + "src": "13538:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9010, + "name": "remainder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8987, + "src": "13544:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13538:15:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13519:34:52" + }, + { + "expression": { + "id": 9023, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 9013, + "name": "gcd", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8993, + "src": "13573:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 9014, + "name": "remainder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8987, + "src": "13578:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9015, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "13572:16:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "components": [ + { + "id": 9016, + "name": "remainder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8987, + "src": "13678:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9021, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9017, + "name": "gcd", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8993, + "src": "13923:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9020, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9018, + "name": "remainder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8987, + "src": "13929:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 9019, + "name": "quotient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9008, + "src": "13941:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13929:20:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13923:26:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9022, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "13591:376:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "src": "13572:395:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 9024, + "nodeType": "ExpressionStatement", + "src": "13572:395:52" + }, + { + "expression": { + "id": 9038, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 9025, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8997, + "src": "13987:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + { + "id": 9026, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9001, + "src": "13990:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 9027, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "13986:6:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_int256_$_t_int256_$", + "typeString": "tuple(int256,int256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "components": [ + { + "id": 9028, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9001, + "src": "14072:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 9036, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9029, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8997, + "src": "14326:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 9035, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9030, + "name": "y", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9001, + "src": "14330:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "arguments": [ + { + "id": 9033, + "name": "quotient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9008, + "src": "14341:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9032, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14334:6:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 9031, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "14334:6:52", + "typeDescriptions": {} + } + }, + "id": 9034, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14334:16:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "14330:20:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "14326:24:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 9037, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "13995:373:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_int256_$_t_int256_$", + "typeString": "tuple(int256,int256)" + } + }, + "src": "13986:382:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 9039, + "nodeType": "ExpressionStatement", + "src": "13986:382:52" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9006, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9004, + "name": "remainder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8987, + "src": "13485:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 9005, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13498:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "13485:14:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9041, + "nodeType": "WhileStatement", + "src": "13478:905:52" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9044, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9042, + "name": "gcd", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8993, + "src": "14401:3:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "31", + "id": 9043, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14408:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "14401:8:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9047, + "nodeType": "IfStatement", + "src": "14397:22:52", + "trueBody": { + "expression": { + "hexValue": "30", + "id": 9045, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14418:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 8979, + "id": 9046, + "nodeType": "Return", + "src": "14411:8:52" + } + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 9051, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9049, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8997, + "src": "14470:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "hexValue": "30", + "id": 9050, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14474:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "14470:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9058, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9052, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8975, + "src": "14477:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "arguments": [ + { + "id": 9056, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "-", + "prefix": true, + "src": "14489:2:52", + "subExpression": { + "id": 9055, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8997, + "src": "14490:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 9054, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14481:7:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 9053, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14481:7:52", + "typeDescriptions": {} + } + }, + "id": 9057, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14481:11:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "14477:15:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 9061, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8997, + "src": "14502:1:52", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 9060, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14494:7:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 9059, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14494:7:52", + "typeDescriptions": {} + } + }, + "id": 9062, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14494:10:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9048, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8606, + "src": "14462:7:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (bool,uint256,uint256) pure returns (uint256)" + } + }, + "id": 9063, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14462:43:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 8979, + "id": 9064, + "nodeType": "Return", + "src": "14455:50:52" + } + ] + } + ] + }, + "documentation": { + "id": 8971, + "nodeType": "StructuredDocumentation", + "src": "12082:553:52", + "text": " @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n If the input value is not inversible, 0 is returned.\n NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}." + }, + "id": 9067, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "invMod", + "nameLocation": "12649:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8976, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8973, + "mutability": "mutable", + "name": "a", + "nameLocation": "12664:1:52", + "nodeType": "VariableDeclaration", + "scope": 9067, + "src": "12656:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8972, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12656:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 8975, + "mutability": "mutable", + "name": "n", + "nameLocation": "12675:1:52", + "nodeType": "VariableDeclaration", + "scope": 9067, + "src": "12667:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8974, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12667:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12655:22:52" + }, + "returnParameters": { + "id": 8979, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8978, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9067, + "src": "12701:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8977, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12701:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12700:9:52" + }, + "scope": 9938, + "src": "12640:1919:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9087, + "nodeType": "Block", + "src": "15159:82:52", + "statements": [ + { + "id": 9086, + "nodeType": "UncheckedBlock", + "src": "15169:66:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 9079, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9070, + "src": "15212:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9082, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9080, + "name": "p", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9072, + "src": "15215:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "hexValue": "32", + "id": 9081, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15219:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "15215:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 9083, + "name": "p", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9072, + "src": "15222:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 9077, + "name": "Math", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9938, + "src": "15200:4:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Math_$9938_$", + "typeString": "type(library Math)" + } + }, + "id": 9078, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15205:6:52", + "memberName": "modExp", + "nodeType": "MemberAccess", + "referencedDeclaration": 9124, + "src": "15200:11:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) view returns (uint256)" + } + }, + "id": 9084, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15200:24:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9076, + "id": 9085, + "nodeType": "Return", + "src": "15193:31:52" + } + ] + } + ] + }, + "documentation": { + "id": 9068, + "nodeType": "StructuredDocumentation", + "src": "14565:514:52", + "text": " @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n NOTE: this function does NOT check that `p` is a prime greater than `2`." + }, + "id": 9088, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "invModPrime", + "nameLocation": "15093:11:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9073, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9070, + "mutability": "mutable", + "name": "a", + "nameLocation": "15113:1:52", + "nodeType": "VariableDeclaration", + "scope": 9088, + "src": "15105:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9069, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15105:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9072, + "mutability": "mutable", + "name": "p", + "nameLocation": "15124:1:52", + "nodeType": "VariableDeclaration", + "scope": 9088, + "src": "15116:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9071, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15116:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15104:22:52" + }, + "returnParameters": { + "id": 9076, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9075, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9088, + "src": "15150:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9074, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15150:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15149:9:52" + }, + "scope": 9938, + "src": "15084:157:52", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9123, + "nodeType": "Block", + "src": "16011:174:52", + "statements": [ + { + "assignments": [9101, 9103], + "declarations": [ + { + "constant": false, + "id": 9101, + "mutability": "mutable", + "name": "success", + "nameLocation": "16027:7:52", + "nodeType": "VariableDeclaration", + "scope": 9123, + "src": "16022:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 9100, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "16022:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9103, + "mutability": "mutable", + "name": "result", + "nameLocation": "16044:6:52", + "nodeType": "VariableDeclaration", + "scope": 9123, + "src": "16036:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9102, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16036:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9109, + "initialValue": { + "arguments": [ + { + "id": 9105, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9091, + "src": "16064:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 9106, + "name": "e", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9093, + "src": "16067:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 9107, + "name": "m", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9095, + "src": "16070:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9104, + "name": "tryModExp", + "nodeType": "Identifier", + "overloadedDeclarations": [9148, 9230], + "referencedDeclaration": 9148, + "src": "16054:9:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_bool_$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) view returns (bool,uint256)" + } + }, + "id": 9108, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16054:18:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$", + "typeString": "tuple(bool,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "16021:51:52" + }, + { + "condition": { + "id": 9111, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "16086:8:52", + "subExpression": { + "id": 9110, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9101, + "src": "16087:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9120, + "nodeType": "IfStatement", + "src": "16082:74:52", + "trueBody": { + "id": 9119, + "nodeType": "Block", + "src": "16096:60:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 9115, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "16122:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 9116, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "16128:16:52", + "memberName": "DIVISION_BY_ZERO", + "nodeType": "MemberAccess", + "referencedDeclaration": 6448, + "src": "16122:22:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 9112, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "16110:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 9114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16116:5:52", + "memberName": "panic", + "nodeType": "MemberAccess", + "referencedDeclaration": 6480, + "src": "16110:11:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 9117, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16110:35:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 9118, + "nodeType": "ExpressionStatement", + "src": "16110:35:52" + } + ] + } + }, + { + "expression": { + "id": 9121, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9103, + "src": "16172:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9099, + "id": 9122, + "nodeType": "Return", + "src": "16165:13:52" + } + ] + }, + "documentation": { + "id": 9089, + "nodeType": "StructuredDocumentation", + "src": "15247:678:52", + "text": " @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n Requirements:\n - modulus can't be zero\n - underlying staticcall to precompile must succeed\n IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n sure the chain you're using it on supports the precompiled contract for modular exponentiation\n at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n interpreted as 0." + }, + "id": 9124, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "modExp", + "nameLocation": "15939:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9096, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9091, + "mutability": "mutable", + "name": "b", + "nameLocation": "15954:1:52", + "nodeType": "VariableDeclaration", + "scope": 9124, + "src": "15946:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9090, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15946:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9093, + "mutability": "mutable", + "name": "e", + "nameLocation": "15965:1:52", + "nodeType": "VariableDeclaration", + "scope": 9124, + "src": "15957:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9092, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15957:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9095, + "mutability": "mutable", + "name": "m", + "nameLocation": "15976:1:52", + "nodeType": "VariableDeclaration", + "scope": 9124, + "src": "15968:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9094, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15968:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15945:33:52" + }, + "returnParameters": { + "id": 9099, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9098, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9124, + "src": "16002:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9097, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16002:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16001:9:52" + }, + "scope": 9938, + "src": "15930:255:52", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9147, + "nodeType": "Block", + "src": "17039:1493:52", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9140, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9138, + "name": "m", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9131, + "src": "17053:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 9139, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17058:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "17053:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9145, + "nodeType": "IfStatement", + "src": "17049:29:52", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 9141, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17069:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "hexValue": "30", + "id": 9142, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17076:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "id": 9143, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "17068:10:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$", + "typeString": "tuple(bool,int_const 0)" + } + }, + "functionReturnParameters": 9137, + "id": 9144, + "nodeType": "Return", + "src": "17061:17:52" + } + }, + { + "AST": { + "nativeSrc": "17113:1413:52", + "nodeType": "YulBlock", + "src": "17113:1413:52", + "statements": [ + { + "nativeSrc": "17127:22:52", + "nodeType": "YulVariableDeclaration", + "src": "17127:22:52", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17144:4:52", + "nodeType": "YulLiteral", + "src": "17144:4:52", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "17138:5:52", + "nodeType": "YulIdentifier", + "src": "17138:5:52" + }, + "nativeSrc": "17138:11:52", + "nodeType": "YulFunctionCall", + "src": "17138:11:52" + }, + "variables": [ + { + "name": "ptr", + "nativeSrc": "17131:3:52", + "nodeType": "YulTypedName", + "src": "17131:3:52", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "18057:3:52", + "nodeType": "YulIdentifier", + "src": "18057:3:52" + }, + { + "kind": "number", + "nativeSrc": "18062:4:52", + "nodeType": "YulLiteral", + "src": "18062:4:52", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18050:6:52", + "nodeType": "YulIdentifier", + "src": "18050:6:52" + }, + "nativeSrc": "18050:17:52", + "nodeType": "YulFunctionCall", + "src": "18050:17:52" + }, + "nativeSrc": "18050:17:52", + "nodeType": "YulExpressionStatement", + "src": "18050:17:52" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "18091:3:52", + "nodeType": "YulIdentifier", + "src": "18091:3:52" + }, + { + "kind": "number", + "nativeSrc": "18096:4:52", + "nodeType": "YulLiteral", + "src": "18096:4:52", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18087:3:52", + "nodeType": "YulIdentifier", + "src": "18087:3:52" + }, + "nativeSrc": "18087:14:52", + "nodeType": "YulFunctionCall", + "src": "18087:14:52" + }, + { + "kind": "number", + "nativeSrc": "18103:4:52", + "nodeType": "YulLiteral", + "src": "18103:4:52", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18080:6:52", + "nodeType": "YulIdentifier", + "src": "18080:6:52" + }, + "nativeSrc": "18080:28:52", + "nodeType": "YulFunctionCall", + "src": "18080:28:52" + }, + "nativeSrc": "18080:28:52", + "nodeType": "YulExpressionStatement", + "src": "18080:28:52" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "18132:3:52", + "nodeType": "YulIdentifier", + "src": "18132:3:52" + }, + { + "kind": "number", + "nativeSrc": "18137:4:52", + "nodeType": "YulLiteral", + "src": "18137:4:52", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18128:3:52", + "nodeType": "YulIdentifier", + "src": "18128:3:52" + }, + "nativeSrc": "18128:14:52", + "nodeType": "YulFunctionCall", + "src": "18128:14:52" + }, + { + "kind": "number", + "nativeSrc": "18144:4:52", + "nodeType": "YulLiteral", + "src": "18144:4:52", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18121:6:52", + "nodeType": "YulIdentifier", + "src": "18121:6:52" + }, + "nativeSrc": "18121:28:52", + "nodeType": "YulFunctionCall", + "src": "18121:28:52" + }, + "nativeSrc": "18121:28:52", + "nodeType": "YulExpressionStatement", + "src": "18121:28:52" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "18173:3:52", + "nodeType": "YulIdentifier", + "src": "18173:3:52" + }, + { + "kind": "number", + "nativeSrc": "18178:4:52", + "nodeType": "YulLiteral", + "src": "18178:4:52", + "type": "", + "value": "0x60" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18169:3:52", + "nodeType": "YulIdentifier", + "src": "18169:3:52" + }, + "nativeSrc": "18169:14:52", + "nodeType": "YulFunctionCall", + "src": "18169:14:52" + }, + { + "name": "b", + "nativeSrc": "18185:1:52", + "nodeType": "YulIdentifier", + "src": "18185:1:52" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18162:6:52", + "nodeType": "YulIdentifier", + "src": "18162:6:52" + }, + "nativeSrc": "18162:25:52", + "nodeType": "YulFunctionCall", + "src": "18162:25:52" + }, + "nativeSrc": "18162:25:52", + "nodeType": "YulExpressionStatement", + "src": "18162:25:52" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "18211:3:52", + "nodeType": "YulIdentifier", + "src": "18211:3:52" + }, + { + "kind": "number", + "nativeSrc": "18216:4:52", + "nodeType": "YulLiteral", + "src": "18216:4:52", + "type": "", + "value": "0x80" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18207:3:52", + "nodeType": "YulIdentifier", + "src": "18207:3:52" + }, + "nativeSrc": "18207:14:52", + "nodeType": "YulFunctionCall", + "src": "18207:14:52" + }, + { + "name": "e", + "nativeSrc": "18223:1:52", + "nodeType": "YulIdentifier", + "src": "18223:1:52" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18200:6:52", + "nodeType": "YulIdentifier", + "src": "18200:6:52" + }, + "nativeSrc": "18200:25:52", + "nodeType": "YulFunctionCall", + "src": "18200:25:52" + }, + "nativeSrc": "18200:25:52", + "nodeType": "YulExpressionStatement", + "src": "18200:25:52" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "ptr", + "nativeSrc": "18249:3:52", + "nodeType": "YulIdentifier", + "src": "18249:3:52" + }, + { + "kind": "number", + "nativeSrc": "18254:4:52", + "nodeType": "YulLiteral", + "src": "18254:4:52", + "type": "", + "value": "0xa0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18245:3:52", + "nodeType": "YulIdentifier", + "src": "18245:3:52" + }, + "nativeSrc": "18245:14:52", + "nodeType": "YulFunctionCall", + "src": "18245:14:52" + }, + { + "name": "m", + "nativeSrc": "18261:1:52", + "nodeType": "YulIdentifier", + "src": "18261:1:52" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18238:6:52", + "nodeType": "YulIdentifier", + "src": "18238:6:52" + }, + "nativeSrc": "18238:25:52", + "nodeType": "YulFunctionCall", + "src": "18238:25:52" + }, + "nativeSrc": "18238:25:52", + "nodeType": "YulExpressionStatement", + "src": "18238:25:52" + }, + { + "nativeSrc": "18425:57:52", + "nodeType": "YulAssignment", + "src": "18425:57:52", + "value": { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "gas", + "nativeSrc": "18447:3:52", + "nodeType": "YulIdentifier", + "src": "18447:3:52" + }, + "nativeSrc": "18447:5:52", + "nodeType": "YulFunctionCall", + "src": "18447:5:52" + }, + { + "kind": "number", + "nativeSrc": "18454:4:52", + "nodeType": "YulLiteral", + "src": "18454:4:52", + "type": "", + "value": "0x05" + }, + { + "name": "ptr", + "nativeSrc": "18460:3:52", + "nodeType": "YulIdentifier", + "src": "18460:3:52" + }, + { + "kind": "number", + "nativeSrc": "18465:4:52", + "nodeType": "YulLiteral", + "src": "18465:4:52", + "type": "", + "value": "0xc0" + }, + { + "kind": "number", + "nativeSrc": "18471:4:52", + "nodeType": "YulLiteral", + "src": "18471:4:52", + "type": "", + "value": "0x00" + }, + { + "kind": "number", + "nativeSrc": "18477:4:52", + "nodeType": "YulLiteral", + "src": "18477:4:52", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "staticcall", + "nativeSrc": "18436:10:52", + "nodeType": "YulIdentifier", + "src": "18436:10:52" + }, + "nativeSrc": "18436:46:52", + "nodeType": "YulFunctionCall", + "src": "18436:46:52" + }, + "variableNames": [ + { + "name": "success", + "nativeSrc": "18425:7:52", + "nodeType": "YulIdentifier", + "src": "18425:7:52" + } + ] + }, + { + "nativeSrc": "18495:21:52", + "nodeType": "YulAssignment", + "src": "18495:21:52", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18511:4:52", + "nodeType": "YulLiteral", + "src": "18511:4:52", + "type": "", + "value": "0x00" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "18505:5:52", + "nodeType": "YulIdentifier", + "src": "18505:5:52" + }, + "nativeSrc": "18505:11:52", + "nodeType": "YulFunctionCall", + "src": "18505:11:52" + }, + "variableNames": [ + { + "name": "result", + "nativeSrc": "18495:6:52", + "nodeType": "YulIdentifier", + "src": "18495:6:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 9127, + "isOffset": false, + "isSlot": false, + "src": "18185:1:52", + "valueSize": 1 + }, + { + "declaration": 9129, + "isOffset": false, + "isSlot": false, + "src": "18223:1:52", + "valueSize": 1 + }, + { + "declaration": 9131, + "isOffset": false, + "isSlot": false, + "src": "18261:1:52", + "valueSize": 1 + }, + { + "declaration": 9136, + "isOffset": false, + "isSlot": false, + "src": "18495:6:52", + "valueSize": 1 + }, + { + "declaration": 9134, + "isOffset": false, + "isSlot": false, + "src": "18425:7:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 9146, + "nodeType": "InlineAssembly", + "src": "17088:1438:52" + } + ] + }, + "documentation": { + "id": 9125, + "nodeType": "StructuredDocumentation", + "src": "16191:738:52", + "text": " @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n to operate modulo 0 or if the underlying precompile reverted.\n IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n of a revert, but the result may be incorrectly interpreted as 0." + }, + "id": 9148, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryModExp", + "nameLocation": "16943:9:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9132, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9127, + "mutability": "mutable", + "name": "b", + "nameLocation": "16961:1:52", + "nodeType": "VariableDeclaration", + "scope": 9148, + "src": "16953:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9126, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16953:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9129, + "mutability": "mutable", + "name": "e", + "nameLocation": "16972:1:52", + "nodeType": "VariableDeclaration", + "scope": 9148, + "src": "16964:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9128, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16964:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9131, + "mutability": "mutable", + "name": "m", + "nameLocation": "16983:1:52", + "nodeType": "VariableDeclaration", + "scope": 9148, + "src": "16975:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9130, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16975:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16952:33:52" + }, + "returnParameters": { + "id": 9137, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9134, + "mutability": "mutable", + "name": "success", + "nameLocation": "17014:7:52", + "nodeType": "VariableDeclaration", + "scope": 9148, + "src": "17009:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 9133, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "17009:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9136, + "mutability": "mutable", + "name": "result", + "nameLocation": "17031:6:52", + "nodeType": "VariableDeclaration", + "scope": 9148, + "src": "17023:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9135, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17023:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "17008:30:52" + }, + "scope": 9938, + "src": "16934:1598:52", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9183, + "nodeType": "Block", + "src": "18729:179:52", + "statements": [ + { + "assignments": [9161, 9163], + "declarations": [ + { + "constant": false, + "id": 9161, + "mutability": "mutable", + "name": "success", + "nameLocation": "18745:7:52", + "nodeType": "VariableDeclaration", + "scope": 9183, + "src": "18740:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 9160, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "18740:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9163, + "mutability": "mutable", + "name": "result", + "nameLocation": "18767:6:52", + "nodeType": "VariableDeclaration", + "scope": 9183, + "src": "18754:19:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9162, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "18754:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 9169, + "initialValue": { + "arguments": [ + { + "id": 9165, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9151, + "src": "18787:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 9166, + "name": "e", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9153, + "src": "18790:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 9167, + "name": "m", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9155, + "src": "18793:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 9164, + "name": "tryModExp", + "nodeType": "Identifier", + "overloadedDeclarations": [9148, 9230], + "referencedDeclaration": 9230, + "src": "18777:9:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory,bytes memory,bytes memory) view returns (bool,bytes memory)" + } + }, + "id": 9168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18777:18:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "18739:56:52" + }, + { + "condition": { + "id": 9171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "18809:8:52", + "subExpression": { + "id": 9170, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9161, + "src": "18810:7:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9180, + "nodeType": "IfStatement", + "src": "18805:74:52", + "trueBody": { + "id": 9179, + "nodeType": "Block", + "src": "18819:60:52", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 9175, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "18845:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 9176, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "18851:16:52", + "memberName": "DIVISION_BY_ZERO", + "nodeType": "MemberAccess", + "referencedDeclaration": 6448, + "src": "18845:22:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 9172, + "name": "Panic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6481, + "src": "18833:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Panic_$6481_$", + "typeString": "type(library Panic)" + } + }, + "id": 9174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18839:5:52", + "memberName": "panic", + "nodeType": "MemberAccess", + "referencedDeclaration": 6480, + "src": "18833:11:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 9177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18833:35:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 9178, + "nodeType": "ExpressionStatement", + "src": "18833:35:52" + } + ] + } + }, + { + "expression": { + "id": 9181, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9163, + "src": "18895:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 9159, + "id": 9182, + "nodeType": "Return", + "src": "18888:13:52" + } + ] + }, + "documentation": { + "id": 9149, + "nodeType": "StructuredDocumentation", + "src": "18538:85:52", + "text": " @dev Variant of {modExp} that supports inputs of arbitrary length." + }, + "id": 9184, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "modExp", + "nameLocation": "18637:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9156, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9151, + "mutability": "mutable", + "name": "b", + "nameLocation": "18657:1:52", + "nodeType": "VariableDeclaration", + "scope": 9184, + "src": "18644:14:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9150, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "18644:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9153, + "mutability": "mutable", + "name": "e", + "nameLocation": "18673:1:52", + "nodeType": "VariableDeclaration", + "scope": 9184, + "src": "18660:14:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9152, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "18660:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9155, + "mutability": "mutable", + "name": "m", + "nameLocation": "18689:1:52", + "nodeType": "VariableDeclaration", + "scope": 9184, + "src": "18676:14:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9154, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "18676:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "18643:48:52" + }, + "returnParameters": { + "id": 9159, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9158, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9184, + "src": "18715:12:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9157, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "18715:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "18714:14:52" + }, + "scope": 9938, + "src": "18628:280:52", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9229, + "nodeType": "Block", + "src": "19162:771:52", + "statements": [ + { + "condition": { + "arguments": [ + { + "id": 9199, + "name": "m", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9191, + "src": "19187:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 9198, + "name": "_zeroBytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9263, + "src": "19176:10:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_bool_$", + "typeString": "function (bytes memory) pure returns (bool)" + } + }, + "id": 9200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19176:13:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9208, + "nodeType": "IfStatement", + "src": "19172:47:52", + "trueBody": { + "expression": { + "components": [ + { + "hexValue": "66616c7365", + "id": 9201, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "19199:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 9204, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "19216:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 9203, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "19206:9:52", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (uint256) pure returns (bytes memory)" + }, + "typeName": { + "id": 9202, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "19210:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + "id": 9205, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19206:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "id": 9206, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "19198:21:52", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "functionReturnParameters": 9197, + "id": 9207, + "nodeType": "Return", + "src": "19191:28:52" + } + }, + { + "assignments": [9210], + "declarations": [ + { + "constant": false, + "id": 9210, + "mutability": "mutable", + "name": "mLen", + "nameLocation": "19238:4:52", + "nodeType": "VariableDeclaration", + "scope": 9229, + "src": "19230:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9209, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "19230:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9213, + "initialValue": { + "expression": { + "id": 9211, + "name": "m", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9191, + "src": "19245:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 9212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19247:6:52", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "19245:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "19230:23:52" + }, + { + "expression": { + "id": 9226, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9214, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9196, + "src": "19335:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 9217, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9187, + "src": "19361:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 9218, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19363:6:52", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "19361:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 9219, + "name": "e", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9189, + "src": "19371:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 9220, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19373:6:52", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "19371:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 9221, + "name": "mLen", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9210, + "src": "19381:4:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 9222, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9187, + "src": "19387:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 9223, + "name": "e", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9189, + "src": "19390:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 9224, + "name": "m", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9191, + "src": "19393:1:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 9215, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "19344:3:52", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 9216, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "19348:12:52", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "19344:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 9225, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19344:51:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "src": "19335:60:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 9227, + "nodeType": "ExpressionStatement", + "src": "19335:60:52" + }, + { + "AST": { + "nativeSrc": "19431:496:52", + "nodeType": "YulBlock", + "src": "19431:496:52", + "statements": [ + { + "nativeSrc": "19445:32:52", + "nodeType": "YulVariableDeclaration", + "src": "19445:32:52", + "value": { + "arguments": [ + { + "name": "result", + "nativeSrc": "19464:6:52", + "nodeType": "YulIdentifier", + "src": "19464:6:52" + }, + { + "kind": "number", + "nativeSrc": "19472:4:52", + "nodeType": "YulLiteral", + "src": "19472:4:52", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19460:3:52", + "nodeType": "YulIdentifier", + "src": "19460:3:52" + }, + "nativeSrc": "19460:17:52", + "nodeType": "YulFunctionCall", + "src": "19460:17:52" + }, + "variables": [ + { + "name": "dataPtr", + "nativeSrc": "19449:7:52", + "nodeType": "YulTypedName", + "src": "19449:7:52", + "type": "" + } + ] + }, + { + "nativeSrc": "19567:73:52", + "nodeType": "YulAssignment", + "src": "19567:73:52", + "value": { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "gas", + "nativeSrc": "19589:3:52", + "nodeType": "YulIdentifier", + "src": "19589:3:52" + }, + "nativeSrc": "19589:5:52", + "nodeType": "YulFunctionCall", + "src": "19589:5:52" + }, + { + "kind": "number", + "nativeSrc": "19596:4:52", + "nodeType": "YulLiteral", + "src": "19596:4:52", + "type": "", + "value": "0x05" + }, + { + "name": "dataPtr", + "nativeSrc": "19602:7:52", + "nodeType": "YulIdentifier", + "src": "19602:7:52" + }, + { + "arguments": [ + { + "name": "result", + "nativeSrc": "19617:6:52", + "nodeType": "YulIdentifier", + "src": "19617:6:52" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "19611:5:52", + "nodeType": "YulIdentifier", + "src": "19611:5:52" + }, + "nativeSrc": "19611:13:52", + "nodeType": "YulFunctionCall", + "src": "19611:13:52" + }, + { + "name": "dataPtr", + "nativeSrc": "19626:7:52", + "nodeType": "YulIdentifier", + "src": "19626:7:52" + }, + { + "name": "mLen", + "nativeSrc": "19635:4:52", + "nodeType": "YulIdentifier", + "src": "19635:4:52" + } + ], + "functionName": { + "name": "staticcall", + "nativeSrc": "19578:10:52", + "nodeType": "YulIdentifier", + "src": "19578:10:52" + }, + "nativeSrc": "19578:62:52", + "nodeType": "YulFunctionCall", + "src": "19578:62:52" + }, + "variableNames": [ + { + "name": "success", + "nativeSrc": "19567:7:52", + "nodeType": "YulIdentifier", + "src": "19567:7:52" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "result", + "nativeSrc": "19796:6:52", + "nodeType": "YulIdentifier", + "src": "19796:6:52" + }, + { + "name": "mLen", + "nativeSrc": "19804:4:52", + "nodeType": "YulIdentifier", + "src": "19804:4:52" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19789:6:52", + "nodeType": "YulIdentifier", + "src": "19789:6:52" + }, + "nativeSrc": "19789:20:52", + "nodeType": "YulFunctionCall", + "src": "19789:20:52" + }, + "nativeSrc": "19789:20:52", + "nodeType": "YulExpressionStatement", + "src": "19789:20:52" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19892:4:52", + "nodeType": "YulLiteral", + "src": "19892:4:52", + "type": "", + "value": "0x40" + }, + { + "arguments": [ + { + "name": "dataPtr", + "nativeSrc": "19902:7:52", + "nodeType": "YulIdentifier", + "src": "19902:7:52" + }, + { + "name": "mLen", + "nativeSrc": "19911:4:52", + "nodeType": "YulIdentifier", + "src": "19911:4:52" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19898:3:52", + "nodeType": "YulIdentifier", + "src": "19898:3:52" + }, + "nativeSrc": "19898:18:52", + "nodeType": "YulFunctionCall", + "src": "19898:18:52" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19885:6:52", + "nodeType": "YulIdentifier", + "src": "19885:6:52" + }, + "nativeSrc": "19885:32:52", + "nodeType": "YulFunctionCall", + "src": "19885:32:52" + }, + "nativeSrc": "19885:32:52", + "nodeType": "YulExpressionStatement", + "src": "19885:32:52" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 9210, + "isOffset": false, + "isSlot": false, + "src": "19635:4:52", + "valueSize": 1 + }, + { + "declaration": 9210, + "isOffset": false, + "isSlot": false, + "src": "19804:4:52", + "valueSize": 1 + }, + { + "declaration": 9210, + "isOffset": false, + "isSlot": false, + "src": "19911:4:52", + "valueSize": 1 + }, + { + "declaration": 9196, + "isOffset": false, + "isSlot": false, + "src": "19464:6:52", + "valueSize": 1 + }, + { + "declaration": 9196, + "isOffset": false, + "isSlot": false, + "src": "19617:6:52", + "valueSize": 1 + }, + { + "declaration": 9196, + "isOffset": false, + "isSlot": false, + "src": "19796:6:52", + "valueSize": 1 + }, + { + "declaration": 9194, + "isOffset": false, + "isSlot": false, + "src": "19567:7:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 9228, + "nodeType": "InlineAssembly", + "src": "19406:521:52" + } + ] + }, + "documentation": { + "id": 9185, + "nodeType": "StructuredDocumentation", + "src": "18914:88:52", + "text": " @dev Variant of {tryModExp} that supports inputs of arbitrary length." + }, + "id": 9230, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "tryModExp", + "nameLocation": "19016:9:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9192, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9187, + "mutability": "mutable", + "name": "b", + "nameLocation": "19048:1:52", + "nodeType": "VariableDeclaration", + "scope": 9230, + "src": "19035:14:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9186, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "19035:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9189, + "mutability": "mutable", + "name": "e", + "nameLocation": "19072:1:52", + "nodeType": "VariableDeclaration", + "scope": 9230, + "src": "19059:14:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9188, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "19059:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9191, + "mutability": "mutable", + "name": "m", + "nameLocation": "19096:1:52", + "nodeType": "VariableDeclaration", + "scope": 9230, + "src": "19083:14:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9190, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "19083:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "19025:78:52" + }, + "returnParameters": { + "id": 9197, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9194, + "mutability": "mutable", + "name": "success", + "nameLocation": "19132:7:52", + "nodeType": "VariableDeclaration", + "scope": 9230, + "src": "19127:12:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 9193, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "19127:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9196, + "mutability": "mutable", + "name": "result", + "nameLocation": "19154:6:52", + "nodeType": "VariableDeclaration", + "scope": 9230, + "src": "19141:19:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9195, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "19141:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "19126:35:52" + }, + "scope": 9938, + "src": "19007:926:52", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9262, + "nodeType": "Block", + "src": "20088:176:52", + "statements": [ + { + "body": { + "id": 9258, + "nodeType": "Block", + "src": "20145:92:52", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 9253, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 9249, + "name": "byteArray", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9233, + "src": "20163:9:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 9251, + "indexExpression": { + "id": 9250, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9239, + "src": "20173:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "20163:12:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 9252, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20179:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "20163:17:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9257, + "nodeType": "IfStatement", + "src": "20159:68:52", + "trueBody": { + "id": 9256, + "nodeType": "Block", + "src": "20182:45:52", + "statements": [ + { + "expression": { + "hexValue": "66616c7365", + "id": 9254, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20207:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "functionReturnParameters": 9237, + "id": 9255, + "nodeType": "Return", + "src": "20200:12:52" + } + ] + } + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9242, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9239, + "src": "20118:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "expression": { + "id": 9243, + "name": "byteArray", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9233, + "src": "20122:9:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 9244, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20132:6:52", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "20122:16:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "20118:20:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9259, + "initializationExpression": { + "assignments": [9239], + "declarations": [ + { + "constant": false, + "id": 9239, + "mutability": "mutable", + "name": "i", + "nameLocation": "20111:1:52", + "nodeType": "VariableDeclaration", + "scope": 9259, + "src": "20103:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9238, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20103:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9241, + "initialValue": { + "hexValue": "30", + "id": 9240, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20115:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "20103:13:52" + }, + "isSimpleCounterLoop": true, + "loopExpression": { + "expression": { + "id": 9247, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "20140:3:52", + "subExpression": { + "id": 9246, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9239, + "src": "20142:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9248, + "nodeType": "ExpressionStatement", + "src": "20140:3:52" + }, + "nodeType": "ForStatement", + "src": "20098:139:52" + }, + { + "expression": { + "hexValue": "74727565", + "id": 9260, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20253:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 9237, + "id": 9261, + "nodeType": "Return", + "src": "20246:11:52" + } + ] + }, + "documentation": { + "id": 9231, + "nodeType": "StructuredDocumentation", + "src": "19939:72:52", + "text": " @dev Returns whether the provided byte array is zero." + }, + "id": 9263, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_zeroBytes", + "nameLocation": "20025:10:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9234, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9233, + "mutability": "mutable", + "name": "byteArray", + "nameLocation": "20049:9:52", + "nodeType": "VariableDeclaration", + "scope": 9263, + "src": "20036:22:52", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 9232, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "20036:5:52", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "20035:24:52" + }, + "returnParameters": { + "id": 9237, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9236, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9263, + "src": "20082:4:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 9235, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "20082:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "20081:6:52" + }, + "scope": 9938, + "src": "20016:248:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 9481, + "nodeType": "Block", + "src": "20624:5124:52", + "statements": [ + { + "id": 9480, + "nodeType": "UncheckedBlock", + "src": "20634:5108:52", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9273, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9271, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "20728:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "hexValue": "31", + "id": 9272, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20733:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "20728:6:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9277, + "nodeType": "IfStatement", + "src": "20724:53:52", + "trueBody": { + "id": 9276, + "nodeType": "Block", + "src": "20736:41:52", + "statements": [ + { + "expression": { + "id": 9274, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "20761:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9270, + "id": 9275, + "nodeType": "Return", + "src": "20754:8:52" + } + ] + } + }, + { + "assignments": [9279], + "declarations": [ + { + "constant": false, + "id": 9279, + "mutability": "mutable", + "name": "aa", + "nameLocation": "21712:2:52", + "nodeType": "VariableDeclaration", + "scope": 9480, + "src": "21704:10:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9278, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21704:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9281, + "initialValue": { + "id": 9280, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "21717:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21704:14:52" + }, + { + "assignments": [9283], + "declarations": [ + { + "constant": false, + "id": 9283, + "mutability": "mutable", + "name": "xn", + "nameLocation": "21740:2:52", + "nodeType": "VariableDeclaration", + "scope": 9480, + "src": "21732:10:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9282, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21732:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9285, + "initialValue": { + "hexValue": "31", + "id": 9284, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21745:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "VariableDeclarationStatement", + "src": "21732:14:52" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9286, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "21765:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_340282366920938463463374607431768211456_by_1", + "typeString": "int_const 3402...(31 digits omitted)...1456" + }, + "id": 9289, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9287, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21772:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "313238", + "id": 9288, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21777:3:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_128_by_1", + "typeString": "int_const 128" + }, + "value": "128" + }, + "src": "21772:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_340282366920938463463374607431768211456_by_1", + "typeString": "int_const 3402...(31 digits omitted)...1456" + } + } + ], + "id": 9290, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "21771:10:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_340282366920938463463374607431768211456_by_1", + "typeString": "int_const 3402...(31 digits omitted)...1456" + } + }, + "src": "21765:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9301, + "nodeType": "IfStatement", + "src": "21761:92:52", + "trueBody": { + "id": 9300, + "nodeType": "Block", + "src": "21783:70:52", + "statements": [ + { + "expression": { + "id": 9294, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9292, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "21801:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "313238", + "id": 9293, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21808:3:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_128_by_1", + "typeString": "int_const 128" + }, + "value": "128" + }, + "src": "21801:10:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9295, + "nodeType": "ExpressionStatement", + "src": "21801:10:52" + }, + { + "expression": { + "id": 9298, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9296, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "21829:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "3634", + "id": 9297, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21836:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "21829:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9299, + "nodeType": "ExpressionStatement", + "src": "21829:9:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9307, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9302, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "21870:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_18446744073709551616_by_1", + "typeString": "int_const 18446744073709551616" + }, + "id": 9305, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9303, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21877:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "3634", + "id": 9304, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21882:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "21877:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_18446744073709551616_by_1", + "typeString": "int_const 18446744073709551616" + } + } + ], + "id": 9306, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "21876:9:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_18446744073709551616_by_1", + "typeString": "int_const 18446744073709551616" + } + }, + "src": "21870:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9317, + "nodeType": "IfStatement", + "src": "21866:90:52", + "trueBody": { + "id": 9316, + "nodeType": "Block", + "src": "21887:69:52", + "statements": [ + { + "expression": { + "id": 9310, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9308, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "21905:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "3634", + "id": 9309, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21912:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "21905:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9311, + "nodeType": "ExpressionStatement", + "src": "21905:9:52" + }, + { + "expression": { + "id": 9314, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9312, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "21932:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "3332", + "id": 9313, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21939:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "21932:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9315, + "nodeType": "ExpressionStatement", + "src": "21932:9:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9323, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9318, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "21973:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_4294967296_by_1", + "typeString": "int_const 4294967296" + }, + "id": 9321, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9319, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21980:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "3332", + "id": 9320, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21985:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "21980:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4294967296_by_1", + "typeString": "int_const 4294967296" + } + } + ], + "id": 9322, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "21979:9:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4294967296_by_1", + "typeString": "int_const 4294967296" + } + }, + "src": "21973:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9333, + "nodeType": "IfStatement", + "src": "21969:90:52", + "trueBody": { + "id": 9332, + "nodeType": "Block", + "src": "21990:69:52", + "statements": [ + { + "expression": { + "id": 9326, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9324, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22008:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "3332", + "id": 9325, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22015:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "22008:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9327, + "nodeType": "ExpressionStatement", + "src": "22008:9:52" + }, + { + "expression": { + "id": 9330, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9328, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22035:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "3136", + "id": 9329, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22042:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "22035:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9331, + "nodeType": "ExpressionStatement", + "src": "22035:9:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9339, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9334, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22076:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_65536_by_1", + "typeString": "int_const 65536" + }, + "id": 9337, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9335, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22083:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "3136", + "id": 9336, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22088:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "22083:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_65536_by_1", + "typeString": "int_const 65536" + } + } + ], + "id": 9338, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "22082:9:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_65536_by_1", + "typeString": "int_const 65536" + } + }, + "src": "22076:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9349, + "nodeType": "IfStatement", + "src": "22072:89:52", + "trueBody": { + "id": 9348, + "nodeType": "Block", + "src": "22093:68:52", + "statements": [ + { + "expression": { + "id": 9342, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9340, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22111:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "3136", + "id": 9341, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22118:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "22111:9:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9343, + "nodeType": "ExpressionStatement", + "src": "22111:9:52" + }, + { + "expression": { + "id": 9346, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9344, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22138:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "38", + "id": 9345, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22145:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + "src": "22138:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9347, + "nodeType": "ExpressionStatement", + "src": "22138:8:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9355, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9350, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22178:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + }, + "id": 9353, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9351, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22185:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "38", + "id": 9352, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22190:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + "src": "22185:6:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + } + } + ], + "id": 9354, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "22184:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + } + }, + "src": "22178:14:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9365, + "nodeType": "IfStatement", + "src": "22174:87:52", + "trueBody": { + "id": 9364, + "nodeType": "Block", + "src": "22194:67:52", + "statements": [ + { + "expression": { + "id": 9358, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9356, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22212:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "38", + "id": 9357, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22219:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + "src": "22212:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9359, + "nodeType": "ExpressionStatement", + "src": "22212:8:52" + }, + { + "expression": { + "id": 9362, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9360, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22238:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "34", + "id": 9361, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22245:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "22238:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9363, + "nodeType": "ExpressionStatement", + "src": "22238:8:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9366, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22278:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "id": 9369, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9367, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22285:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "34", + "id": 9368, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22290:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "22285:6:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + } + } + ], + "id": 9370, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "22284:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + } + }, + "src": "22278:14:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9381, + "nodeType": "IfStatement", + "src": "22274:87:52", + "trueBody": { + "id": 9380, + "nodeType": "Block", + "src": "22294:67:52", + "statements": [ + { + "expression": { + "id": 9374, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9372, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22312:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": ">>=", + "rightHandSide": { + "hexValue": "34", + "id": 9373, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22319:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "22312:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9375, + "nodeType": "ExpressionStatement", + "src": "22312:8:52" + }, + { + "expression": { + "id": 9378, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9376, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22338:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "32", + "id": 9377, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22345:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "22338:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9379, + "nodeType": "ExpressionStatement", + "src": "22338:8:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9387, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9382, + "name": "aa", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9279, + "src": "22378:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "id": 9385, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9383, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22385:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "32", + "id": 9384, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22390:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "22385:6:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + } + } + ], + "id": 9386, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "22384:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + } + }, + "src": "22378:14:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9393, + "nodeType": "IfStatement", + "src": "22374:61:52", + "trueBody": { + "id": 9392, + "nodeType": "Block", + "src": "22394:41:52", + "statements": [ + { + "expression": { + "id": 9390, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9388, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22412:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "<<=", + "rightHandSide": { + "hexValue": "31", + "id": 9389, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22419:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "22412:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9391, + "nodeType": "ExpressionStatement", + "src": "22412:8:52" + } + ] + } + }, + { + "expression": { + "id": 9401, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9394, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22855:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9397, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "33", + "id": 9395, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22861:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 9396, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "22865:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22861:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9398, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "22860:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22872:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "22860:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22855:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9402, + "nodeType": "ExpressionStatement", + "src": "22855:18:52" + }, + { + "expression": { + "id": 9412, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9403, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24760:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9411, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9408, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9404, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24766:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9407, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9405, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "24771:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9406, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24775:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24771:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24766:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9409, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "24765:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9410, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "24782:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "24765:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24760:23:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9413, + "nodeType": "ExpressionStatement", + "src": "24760:23:52" + }, + { + "expression": { + "id": 9423, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9414, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24869:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9422, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9419, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9415, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24875:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9418, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9416, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "24880:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9417, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24884:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24880:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24875:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9420, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "24874:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "24891:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "24874:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24869:23:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9424, + "nodeType": "ExpressionStatement", + "src": "24869:23:52" + }, + { + "expression": { + "id": 9434, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9425, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24980:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9433, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9430, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9426, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24986:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9429, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9427, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "24991:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9428, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "24995:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24991:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24986:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9431, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "24985:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9432, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25002:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "24985:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "24980:23:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9435, + "nodeType": "ExpressionStatement", + "src": "24980:23:52" + }, + { + "expression": { + "id": 9445, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9436, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25089:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9444, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9441, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9437, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25095:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9440, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9438, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "25100:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9439, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25104:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25100:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25095:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9442, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "25094:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9443, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25111:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "25094:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25089:23:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9446, + "nodeType": "ExpressionStatement", + "src": "25089:23:52" + }, + { + "expression": { + "id": 9456, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9447, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25199:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9455, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9452, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9448, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25205:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9451, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9449, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "25210:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9450, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25214:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25210:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25205:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9453, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "25204:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9454, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25221:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "25204:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25199:23:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9457, + "nodeType": "ExpressionStatement", + "src": "25199:23:52" + }, + { + "expression": { + "id": 9467, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9458, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25309:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9466, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9459, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25315:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9462, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9460, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "25320:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9461, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25324:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25320:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25315:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9464, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "25314:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 9465, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25331:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "25314:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25309:23:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9468, + "nodeType": "ExpressionStatement", + "src": "25309:23:52" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9478, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9469, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25698:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9476, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9472, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25719:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9475, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9473, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9266, + "src": "25724:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "id": 9474, + "name": "xn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9283, + "src": "25728:2:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25724:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25719:11:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9470, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "25703:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9471, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "25712:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "25703:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9477, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25703:28:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25698:33:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9270, + "id": 9479, + "nodeType": "Return", + "src": "25691:40:52" + } + ] + } + ] + }, + "documentation": { + "id": 9264, + "nodeType": "StructuredDocumentation", + "src": "20270:292:52", + "text": " @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n towards zero.\n This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n using integer operations." + }, + "id": 9482, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sqrt", + "nameLocation": "20576:4:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9267, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9266, + "mutability": "mutable", + "name": "a", + "nameLocation": "20589:1:52", + "nodeType": "VariableDeclaration", + "scope": 9482, + "src": "20581:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9265, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20581:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "20580:11:52" + }, + "returnParameters": { + "id": 9270, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9269, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9482, + "src": "20615:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9268, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20615:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "20614:9:52" + }, + "scope": 9938, + "src": "20567:5181:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9515, + "nodeType": "Block", + "src": "25921:171:52", + "statements": [ + { + "id": 9514, + "nodeType": "UncheckedBlock", + "src": "25931:155:52", + "statements": [ + { + "assignments": [9494], + "declarations": [ + { + "constant": false, + "id": 9494, + "mutability": "mutable", + "name": "result", + "nameLocation": "25963:6:52", + "nodeType": "VariableDeclaration", + "scope": 9514, + "src": "25955:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9493, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "25955:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9498, + "initialValue": { + "arguments": [ + { + "id": 9496, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9485, + "src": "25977:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9495, + "name": "sqrt", + "nodeType": "Identifier", + "overloadedDeclarations": [9482, 9516], + "referencedDeclaration": 9482, + "src": "25972:4:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 9497, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25972:7:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "25955:24:52" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9512, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9499, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9494, + "src": "26000:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 9510, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 9503, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9488, + "src": "26042:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 9502, + "name": "unsignedRoundsUp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9937, + "src": "26025:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_Rounding_$8329_$returns$_t_bool_$", + "typeString": "function (enum Math.Rounding) pure returns (bool)" + } + }, + "id": 9504, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26025:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9507, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9505, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9494, + "src": "26055:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 9506, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9494, + "src": "26064:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26055:15:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 9508, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9485, + "src": "26073:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26055:19:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "26025:49:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9500, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26009:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26018:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26009:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26009:66:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26000:75:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9492, + "id": 9513, + "nodeType": "Return", + "src": "25993:82:52" + } + ] + } + ] + }, + "documentation": { + "id": 9483, + "nodeType": "StructuredDocumentation", + "src": "25754:86:52", + "text": " @dev Calculates sqrt(a), following the selected rounding direction." + }, + "id": 9516, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sqrt", + "nameLocation": "25854:4:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9489, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9485, + "mutability": "mutable", + "name": "a", + "nameLocation": "25867:1:52", + "nodeType": "VariableDeclaration", + "scope": 9516, + "src": "25859:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9484, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "25859:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9488, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "25879:8:52", + "nodeType": "VariableDeclaration", + "scope": 9516, + "src": "25870:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 9487, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 9486, + "name": "Rounding", + "nameLocations": ["25870:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "25870:8:52" + }, + "referencedDeclaration": 8329, + "src": "25870:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "25858:30:52" + }, + "returnParameters": { + "id": 9492, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9491, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9516, + "src": "25912:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9490, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "25912:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "25911:9:52" + }, + "scope": 9938, + "src": "25845:247:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9606, + "nodeType": "Block", + "src": "26281:2334:52", + "statements": [ + { + "expression": { + "id": 9533, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9524, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26363:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9527, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9519, + "src": "26383:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30786666666666666666666666666666666666666666666666666666666666666666", + "id": 9528, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26387:34:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_340282366920938463463374607431768211455_by_1", + "typeString": "int_const 3402...(31 digits omitted)...1455" + }, + "value": "0xffffffffffffffffffffffffffffffff" + }, + "src": "26383:38:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9525, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26367:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26376:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26367:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9530, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26367:55:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "37", + "id": 9531, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26426:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_7_by_1", + "typeString": "int_const 7" + }, + "value": "7" + }, + "src": "26367:60:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26363:64:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9534, + "nodeType": "ExpressionStatement", + "src": "26363:64:52" + }, + { + "expression": { + "id": 9547, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9535, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26503:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9546, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9543, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9540, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9538, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9519, + "src": "26525:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9539, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26530:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26525:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9541, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "26524:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307866666666666666666666666666666666", + "id": 9542, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26535:18:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_18446744073709551615_by_1", + "typeString": "int_const 18446744073709551615" + }, + "value": "0xffffffffffffffff" + }, + "src": "26524:29:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9536, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26508:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26517:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26508:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9544, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26508:46:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "36", + "id": 9545, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26558:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_6_by_1", + "typeString": "int_const 6" + }, + "value": "6" + }, + "src": "26508:51:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26503:56:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9548, + "nodeType": "ExpressionStatement", + "src": "26503:56:52" + }, + { + "expression": { + "id": 9561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9549, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26634:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9557, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9554, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9552, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9519, + "src": "26656:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9553, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26661:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26656:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9555, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "26655:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30786666666666666666", + "id": 9556, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26666:10:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4294967295_by_1", + "typeString": "int_const 4294967295" + }, + "value": "0xffffffff" + }, + "src": "26655:21:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9550, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26639:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9551, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26648:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26639:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9558, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26639:38:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "35", + "id": 9559, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26681:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + }, + "value": "5" + }, + "src": "26639:43:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26634:48:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9562, + "nodeType": "ExpressionStatement", + "src": "26634:48:52" + }, + { + "expression": { + "id": 9575, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9563, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26757:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9574, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9571, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9568, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9566, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9519, + "src": "26779:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9567, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26784:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26779:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9569, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "26778:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307866666666", + "id": 9570, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26789:6:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_65535_by_1", + "typeString": "int_const 65535" + }, + "value": "0xffff" + }, + "src": "26778:17:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9564, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26762:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9565, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26771:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26762:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9572, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26762:34:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "34", + "id": 9573, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26800:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "26762:39:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26757:44:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9576, + "nodeType": "ExpressionStatement", + "src": "26757:44:52" + }, + { + "expression": { + "id": 9589, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9577, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26874:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9588, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9585, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9582, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9580, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9519, + "src": "26896:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9581, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26901:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26896:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9583, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "26895:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30786666", + "id": 9584, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26906:4:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "0xff" + }, + "src": "26895:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9578, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26879:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9579, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26888:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26879:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9586, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26879:32:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "33", + "id": 9587, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26915:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "src": "26879:37:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26874:42:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9590, + "nodeType": "ExpressionStatement", + "src": "26874:42:52" + }, + { + "expression": { + "id": 9603, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9591, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "26988:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9602, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9599, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9594, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9519, + "src": "27010:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9595, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9522, + "src": "27015:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "27010:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9597, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "27009:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307866", + "id": 9598, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "27020:3:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_15_by_1", + "typeString": "int_const 15" + }, + "value": "0xf" + }, + "src": "27009:14:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9592, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "26993:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9593, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "27002:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "26993:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9600, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26993:31:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "32", + "id": 9601, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "27028:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "26993:36:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "26988:41:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9604, + "nodeType": "ExpressionStatement", + "src": "26988:41:52" + }, + { + "AST": { + "nativeSrc": "28490:119:52", + "nodeType": "YulBlock", + "src": "28490:119:52", + "statements": [ + { + "nativeSrc": "28504:95:52", + "nodeType": "YulAssignment", + "src": "28504:95:52", + "value": { + "arguments": [ + { + "name": "r", + "nativeSrc": "28512:1:52", + "nodeType": "YulIdentifier", + "src": "28512:1:52" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "r", + "nativeSrc": "28524:1:52", + "nodeType": "YulIdentifier", + "src": "28524:1:52" + }, + { + "name": "x", + "nativeSrc": "28527:1:52", + "nodeType": "YulIdentifier", + "src": "28527:1:52" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "28520:3:52", + "nodeType": "YulIdentifier", + "src": "28520:3:52" + }, + "nativeSrc": "28520:9:52", + "nodeType": "YulFunctionCall", + "src": "28520:9:52" + }, + { + "kind": "number", + "nativeSrc": "28531:66:52", + "nodeType": "YulLiteral", + "src": "28531:66:52", + "type": "", + "value": "0x0000010102020202030303030303030300000000000000000000000000000000" + } + ], + "functionName": { + "name": "byte", + "nativeSrc": "28515:4:52", + "nodeType": "YulIdentifier", + "src": "28515:4:52" + }, + "nativeSrc": "28515:83:52", + "nodeType": "YulFunctionCall", + "src": "28515:83:52" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "28509:2:52", + "nodeType": "YulIdentifier", + "src": "28509:2:52" + }, + "nativeSrc": "28509:90:52", + "nodeType": "YulFunctionCall", + "src": "28509:90:52" + }, + "variableNames": [ + { + "name": "r", + "nativeSrc": "28504:1:52", + "nodeType": "YulIdentifier", + "src": "28504:1:52" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 9522, + "isOffset": false, + "isSlot": false, + "src": "28504:1:52", + "valueSize": 1 + }, + { + "declaration": 9522, + "isOffset": false, + "isSlot": false, + "src": "28512:1:52", + "valueSize": 1 + }, + { + "declaration": 9522, + "isOffset": false, + "isSlot": false, + "src": "28524:1:52", + "valueSize": 1 + }, + { + "declaration": 9519, + "isOffset": false, + "isSlot": false, + "src": "28527:1:52", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 9605, + "nodeType": "InlineAssembly", + "src": "28465:144:52" + } + ] + }, + "documentation": { + "id": 9517, + "nodeType": "StructuredDocumentation", + "src": "26098:119:52", + "text": " @dev Return the log in base 2 of a positive value rounded towards zero.\n Returns 0 if given 0." + }, + "id": 9607, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "log2", + "nameLocation": "26231:4:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9520, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9519, + "mutability": "mutable", + "name": "x", + "nameLocation": "26244:1:52", + "nodeType": "VariableDeclaration", + "scope": 9607, + "src": "26236:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9518, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "26236:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "26235:11:52" + }, + "returnParameters": { + "id": 9523, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9522, + "mutability": "mutable", + "name": "r", + "nameLocation": "26278:1:52", + "nodeType": "VariableDeclaration", + "scope": 9607, + "src": "26270:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9521, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "26270:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "26269:11:52" + }, + "scope": 9938, + "src": "26222:2393:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9640, + "nodeType": "Block", + "src": "28848:175:52", + "statements": [ + { + "id": 9639, + "nodeType": "UncheckedBlock", + "src": "28858:159:52", + "statements": [ + { + "assignments": [9619], + "declarations": [ + { + "constant": false, + "id": 9619, + "mutability": "mutable", + "name": "result", + "nameLocation": "28890:6:52", + "nodeType": "VariableDeclaration", + "scope": 9639, + "src": "28882:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9618, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "28882:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9623, + "initialValue": { + "arguments": [ + { + "id": 9621, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9610, + "src": "28904:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9620, + "name": "log2", + "nodeType": "Identifier", + "overloadedDeclarations": [9607, 9641], + "referencedDeclaration": 9607, + "src": "28899:4:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 9622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28899:11:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "28882:28:52" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9637, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9624, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9619, + "src": "28931:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 9635, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 9628, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9613, + "src": "28973:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 9627, + "name": "unsignedRoundsUp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9937, + "src": "28956:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_Rounding_$8329_$returns$_t_bool_$", + "typeString": "function (enum Math.Rounding) pure returns (bool)" + } + }, + "id": 9629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28956:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9632, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9630, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "28986:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "id": 9631, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9619, + "src": "28991:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "28986:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 9633, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9610, + "src": "29000:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "28986:19:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "28956:49:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9625, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "28940:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9626, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "28949:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "28940:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9636, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28940:66:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "28931:75:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9617, + "id": 9638, + "nodeType": "Return", + "src": "28924:82:52" + } + ] + } + ] + }, + "documentation": { + "id": 9608, + "nodeType": "StructuredDocumentation", + "src": "28621:142:52", + "text": " @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n Returns 0 if given 0." + }, + "id": 9641, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "log2", + "nameLocation": "28777:4:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9614, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9610, + "mutability": "mutable", + "name": "value", + "nameLocation": "28790:5:52", + "nodeType": "VariableDeclaration", + "scope": 9641, + "src": "28782:13:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9609, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "28782:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9613, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "28806:8:52", + "nodeType": "VariableDeclaration", + "scope": 9641, + "src": "28797:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 9612, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 9611, + "name": "Rounding", + "nameLocations": ["28797:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "28797:8:52" + }, + "referencedDeclaration": 8329, + "src": "28797:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "28781:34:52" + }, + "returnParameters": { + "id": 9617, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9616, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9641, + "src": "28839:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9615, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "28839:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "28838:9:52" + }, + "scope": 9938, + "src": "28768:255:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9769, + "nodeType": "Block", + "src": "29216:854:52", + "statements": [ + { + "assignments": [9650], + "declarations": [ + { + "constant": false, + "id": 9650, + "mutability": "mutable", + "name": "result", + "nameLocation": "29234:6:52", + "nodeType": "VariableDeclaration", + "scope": 9769, + "src": "29226:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9649, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "29226:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9652, + "initialValue": { + "hexValue": "30", + "id": 9651, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29243:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "29226:18:52" + }, + { + "id": 9766, + "nodeType": "UncheckedBlock", + "src": "29254:787:52", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9653, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29282:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(57 digits omitted)...0000" + }, + "id": 9656, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9654, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29291:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "3634", + "id": 9655, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29297:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "29291:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(57 digits omitted)...0000" + } + }, + "src": "29282:17:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9669, + "nodeType": "IfStatement", + "src": "29278:103:52", + "trueBody": { + "id": 9668, + "nodeType": "Block", + "src": "29301:80:52", + "statements": [ + { + "expression": { + "id": 9662, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9658, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29319:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(57 digits omitted)...0000" + }, + "id": 9661, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9659, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29328:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "3634", + "id": 9660, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29334:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "29328:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000000000000000000000000000000000000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(57 digits omitted)...0000" + } + }, + "src": "29319:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9663, + "nodeType": "ExpressionStatement", + "src": "29319:17:52" + }, + { + "expression": { + "id": 9666, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9664, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "29354:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "3634", + "id": 9665, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29364:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + "src": "29354:12:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9667, + "nodeType": "ExpressionStatement", + "src": "29354:12:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9674, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9670, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29398:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_100000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(25 digits omitted)...0000" + }, + "id": 9673, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9671, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29407:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "3332", + "id": 9672, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29413:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "29407:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_100000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(25 digits omitted)...0000" + } + }, + "src": "29398:17:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9686, + "nodeType": "IfStatement", + "src": "29394:103:52", + "trueBody": { + "id": 9685, + "nodeType": "Block", + "src": "29417:80:52", + "statements": [ + { + "expression": { + "id": 9679, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9675, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29435:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_rational_100000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(25 digits omitted)...0000" + }, + "id": 9678, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9676, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29444:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "3332", + "id": 9677, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29450:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "29444:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_100000000000000000000000000000000_by_1", + "typeString": "int_const 1000...(25 digits omitted)...0000" + } + }, + "src": "29435:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9680, + "nodeType": "ExpressionStatement", + "src": "29435:17:52" + }, + { + "expression": { + "id": 9683, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9681, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "29470:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "3332", + "id": 9682, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29480:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "29470:12:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9684, + "nodeType": "ExpressionStatement", + "src": "29470:12:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9691, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9687, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29514:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_10000000000000000_by_1", + "typeString": "int_const 10000000000000000" + }, + "id": 9690, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29523:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "3136", + "id": 9689, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29529:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "29523:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000000000000000_by_1", + "typeString": "int_const 10000000000000000" + } + }, + "src": "29514:17:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9703, + "nodeType": "IfStatement", + "src": "29510:103:52", + "trueBody": { + "id": 9702, + "nodeType": "Block", + "src": "29533:80:52", + "statements": [ + { + "expression": { + "id": 9696, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9692, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29551:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_rational_10000000000000000_by_1", + "typeString": "int_const 10000000000000000" + }, + "id": 9695, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9693, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29560:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "3136", + "id": 9694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29566:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "29560:8:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000000000000000_by_1", + "typeString": "int_const 10000000000000000" + } + }, + "src": "29551:17:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9697, + "nodeType": "ExpressionStatement", + "src": "29551:17:52" + }, + { + "expression": { + "id": 9700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9698, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "29586:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "3136", + "id": 9699, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29596:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + "src": "29586:12:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9701, + "nodeType": "ExpressionStatement", + "src": "29586:12:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9708, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9704, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29630:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_100000000_by_1", + "typeString": "int_const 100000000" + }, + "id": 9707, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9705, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29639:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "38", + "id": 9706, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29645:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + "src": "29639:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_100000000_by_1", + "typeString": "int_const 100000000" + } + }, + "src": "29630:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9720, + "nodeType": "IfStatement", + "src": "29626:100:52", + "trueBody": { + "id": 9719, + "nodeType": "Block", + "src": "29648:78:52", + "statements": [ + { + "expression": { + "id": 9713, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9709, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29666:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_rational_100000000_by_1", + "typeString": "int_const 100000000" + }, + "id": 9712, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9710, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29675:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "38", + "id": 9711, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29681:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + "src": "29675:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_100000000_by_1", + "typeString": "int_const 100000000" + } + }, + "src": "29666:16:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9714, + "nodeType": "ExpressionStatement", + "src": "29666:16:52" + }, + { + "expression": { + "id": 9717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9715, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "29700:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "38", + "id": 9716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29710:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + "src": "29700:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9718, + "nodeType": "ExpressionStatement", + "src": "29700:11:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9721, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29743:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + }, + "id": 9724, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9722, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29752:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "34", + "id": 9723, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29758:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "29752:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + } + }, + "src": "29743:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9737, + "nodeType": "IfStatement", + "src": "29739:100:52", + "trueBody": { + "id": 9736, + "nodeType": "Block", + "src": "29761:78:52", + "statements": [ + { + "expression": { + "id": 9730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9726, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29779:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + }, + "id": 9729, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9727, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29788:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "34", + "id": 9728, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29794:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "29788:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + } + }, + "src": "29779:16:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9731, + "nodeType": "ExpressionStatement", + "src": "29779:16:52" + }, + { + "expression": { + "id": 9734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9732, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "29813:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "34", + "id": 9733, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29823:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "29813:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9735, + "nodeType": "ExpressionStatement", + "src": "29813:11:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9738, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29856:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_100_by_1", + "typeString": "int_const 100" + }, + "id": 9741, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9739, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29865:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "32", + "id": 9740, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29871:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "29865:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_100_by_1", + "typeString": "int_const 100" + } + }, + "src": "29856:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9754, + "nodeType": "IfStatement", + "src": "29852:100:52", + "trueBody": { + "id": 9753, + "nodeType": "Block", + "src": "29874:78:52", + "statements": [ + { + "expression": { + "id": 9747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9743, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29892:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "/=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_rational_100_by_1", + "typeString": "int_const 100" + }, + "id": 9746, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9744, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29901:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "32", + "id": 9745, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29907:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "29901:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_100_by_1", + "typeString": "int_const 100" + } + }, + "src": "29892:16:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9748, + "nodeType": "ExpressionStatement", + "src": "29892:16:52" + }, + { + "expression": { + "id": 9751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9749, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "29926:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "32", + "id": 9750, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29936:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "29926:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9752, + "nodeType": "ExpressionStatement", + "src": "29926:11:52" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9759, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9755, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9644, + "src": "29969:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "id": 9758, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9756, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29978:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "hexValue": "31", + "id": 9757, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29984:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "29978:7:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + } + }, + "src": "29969:16:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9765, + "nodeType": "IfStatement", + "src": "29965:66:52", + "trueBody": { + "id": 9764, + "nodeType": "Block", + "src": "29987:44:52", + "statements": [ + { + "expression": { + "id": 9762, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9760, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "30005:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "hexValue": "31", + "id": 9761, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "30015:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "30005:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9763, + "nodeType": "ExpressionStatement", + "src": "30005:11:52" + } + ] + } + } + ] + }, + { + "expression": { + "id": 9767, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9650, + "src": "30057:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9648, + "id": 9768, + "nodeType": "Return", + "src": "30050:13:52" + } + ] + }, + "documentation": { + "id": 9642, + "nodeType": "StructuredDocumentation", + "src": "29029:120:52", + "text": " @dev Return the log in base 10 of a positive value rounded towards zero.\n Returns 0 if given 0." + }, + "id": 9770, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "log10", + "nameLocation": "29163:5:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9645, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9644, + "mutability": "mutable", + "name": "value", + "nameLocation": "29177:5:52", + "nodeType": "VariableDeclaration", + "scope": 9770, + "src": "29169:13:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9643, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "29169:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "29168:15:52" + }, + "returnParameters": { + "id": 9648, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9647, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9770, + "src": "29207:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9646, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "29207:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "29206:9:52" + }, + "scope": 9938, + "src": "29154:916:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9803, + "nodeType": "Block", + "src": "30305:177:52", + "statements": [ + { + "id": 9802, + "nodeType": "UncheckedBlock", + "src": "30315:161:52", + "statements": [ + { + "assignments": [9782], + "declarations": [ + { + "constant": false, + "id": 9782, + "mutability": "mutable", + "name": "result", + "nameLocation": "30347:6:52", + "nodeType": "VariableDeclaration", + "scope": 9802, + "src": "30339:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9781, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "30339:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9786, + "initialValue": { + "arguments": [ + { + "id": 9784, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9773, + "src": "30362:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9783, + "name": "log10", + "nodeType": "Identifier", + "overloadedDeclarations": [9770, 9804], + "referencedDeclaration": 9770, + "src": "30356:5:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 9785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30356:12:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "30339:29:52" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9800, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9787, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9782, + "src": "30389:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 9798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 9791, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9776, + "src": "30431:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 9790, + "name": "unsignedRoundsUp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9937, + "src": "30414:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_Rounding_$8329_$returns$_t_bool_$", + "typeString": "function (enum Math.Rounding) pure returns (bool)" + } + }, + "id": 9792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30414:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9797, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9795, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "3130", + "id": 9793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "30444:2:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "id": 9794, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9782, + "src": "30450:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "30444:12:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 9796, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9773, + "src": "30459:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "30444:20:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "30414:50:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9788, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "30398:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "30407:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "30398:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30398:67:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "30389:76:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9780, + "id": 9801, + "nodeType": "Return", + "src": "30382:83:52" + } + ] + } + ] + }, + "documentation": { + "id": 9771, + "nodeType": "StructuredDocumentation", + "src": "30076:143:52", + "text": " @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n Returns 0 if given 0." + }, + "id": 9804, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "log10", + "nameLocation": "30233:5:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9777, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9773, + "mutability": "mutable", + "name": "value", + "nameLocation": "30247:5:52", + "nodeType": "VariableDeclaration", + "scope": 9804, + "src": "30239:13:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9772, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "30239:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9776, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "30263:8:52", + "nodeType": "VariableDeclaration", + "scope": 9804, + "src": "30254:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 9775, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 9774, + "name": "Rounding", + "nameLocations": ["30254:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "30254:8:52" + }, + "referencedDeclaration": 8329, + "src": "30254:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "30238:34:52" + }, + "returnParameters": { + "id": 9780, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9779, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9804, + "src": "30296:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9778, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "30296:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "30295:9:52" + }, + "scope": 9938, + "src": "30224:258:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9880, + "nodeType": "Block", + "src": "30800:675:52", + "statements": [ + { + "expression": { + "id": 9821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9812, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "30882:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9820, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9817, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9815, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9807, + "src": "30902:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30786666666666666666666666666666666666666666666666666666666666666666", + "id": 9816, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "30906:34:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_340282366920938463463374607431768211455_by_1", + "typeString": "int_const 3402...(31 digits omitted)...1455" + }, + "value": "0xffffffffffffffffffffffffffffffff" + }, + "src": "30902:38:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9813, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "30886:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9814, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "30895:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "30886:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9818, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30886:55:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "37", + "id": 9819, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "30945:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_7_by_1", + "typeString": "int_const 7" + }, + "value": "7" + }, + "src": "30886:60:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "30882:64:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9822, + "nodeType": "ExpressionStatement", + "src": "30882:64:52" + }, + { + "expression": { + "id": 9835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9823, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31022:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9831, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9828, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9826, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9807, + "src": "31044:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9827, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31049:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31044:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9829, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "31043:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307866666666666666666666666666666666", + "id": 9830, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31054:18:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_18446744073709551615_by_1", + "typeString": "int_const 18446744073709551615" + }, + "value": "0xffffffffffffffff" + }, + "src": "31043:29:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9824, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "31027:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9825, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "31036:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "31027:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9832, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31027:46:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "36", + "id": 9833, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31077:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_6_by_1", + "typeString": "int_const 6" + }, + "value": "6" + }, + "src": "31027:51:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31022:56:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9836, + "nodeType": "ExpressionStatement", + "src": "31022:56:52" + }, + { + "expression": { + "id": 9849, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9837, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31153:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9848, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9845, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9840, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9807, + "src": "31175:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9841, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31180:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31175:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9843, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "31174:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30786666666666666666", + "id": 9844, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31185:10:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4294967295_by_1", + "typeString": "int_const 4294967295" + }, + "value": "0xffffffff" + }, + "src": "31174:21:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9838, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "31158:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9839, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "31167:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "31158:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9846, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31158:38:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "35", + "id": 9847, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31200:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + }, + "value": "5" + }, + "src": "31158:43:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31153:48:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9850, + "nodeType": "ExpressionStatement", + "src": "31153:48:52" + }, + { + "expression": { + "id": 9863, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 9851, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31276:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "|=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9859, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9856, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9854, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9807, + "src": "31298:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9855, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31303:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31298:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9857, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "31297:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307866666666", + "id": 9858, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31308:6:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_65535_by_1", + "typeString": "int_const 65535" + }, + "value": "0xffff" + }, + "src": "31297:17:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9852, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "31281:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9853, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "31290:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "31281:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9860, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31281:34:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "34", + "id": 9861, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31319:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "31281:39:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31276:44:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9864, + "nodeType": "ExpressionStatement", + "src": "31276:44:52" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9878, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9867, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9865, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31426:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "33", + "id": 9866, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31431:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "src": "31426:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9868, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "31425:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9876, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9873, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9871, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9807, + "src": "31453:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 9872, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9810, + "src": "31458:1:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31453:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9874, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "31452:8:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30786666", + "id": 9875, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31463:4:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "0xff" + }, + "src": "31452:15:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9869, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "31436:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9870, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "31445:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "31436:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9877, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31436:32:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31425:43:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9811, + "id": 9879, + "nodeType": "Return", + "src": "31418:50:52" + } + ] + }, + "documentation": { + "id": 9805, + "nodeType": "StructuredDocumentation", + "src": "30488:246:52", + "text": " @dev Return the log in base 256 of a positive value rounded towards zero.\n Returns 0 if given 0.\n Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string." + }, + "id": 9881, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "log256", + "nameLocation": "30748:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9808, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9807, + "mutability": "mutable", + "name": "x", + "nameLocation": "30763:1:52", + "nodeType": "VariableDeclaration", + "scope": 9881, + "src": "30755:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9806, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "30755:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "30754:11:52" + }, + "returnParameters": { + "id": 9811, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9810, + "mutability": "mutable", + "name": "r", + "nameLocation": "30797:1:52", + "nodeType": "VariableDeclaration", + "scope": 9881, + "src": "30789:9:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9809, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "30789:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "30788:11:52" + }, + "scope": 9938, + "src": "30739:736:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9917, + "nodeType": "Block", + "src": "31712:184:52", + "statements": [ + { + "id": 9916, + "nodeType": "UncheckedBlock", + "src": "31722:168:52", + "statements": [ + { + "assignments": [9893], + "declarations": [ + { + "constant": false, + "id": 9893, + "mutability": "mutable", + "name": "result", + "nameLocation": "31754:6:52", + "nodeType": "VariableDeclaration", + "scope": 9916, + "src": "31746:14:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9892, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "31746:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 9897, + "initialValue": { + "arguments": [ + { + "id": 9895, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9884, + "src": "31770:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9894, + "name": "log256", + "nodeType": "Identifier", + "overloadedDeclarations": [9881, 9918], + "referencedDeclaration": 9881, + "src": "31763:6:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 9896, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31763:13:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "31746:30:52" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9914, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9898, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9893, + "src": "31797:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 9912, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 9902, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9887, + "src": "31839:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 9901, + "name": "unsignedRoundsUp", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9937, + "src": "31822:16:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_enum$_Rounding_$8329_$returns$_t_bool_$", + "typeString": "function (enum Math.Rounding) pure returns (bool)" + } + }, + "id": 9903, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31822:26:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9911, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9909, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "hexValue": "31", + "id": 9904, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31852:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9907, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9905, + "name": "result", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9893, + "src": "31858:6:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "33", + "id": 9906, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31868:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "src": "31858:11:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 9908, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "31857:13:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31852:18:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 9910, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9884, + "src": "31873:5:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31852:26:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "31822:56:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 9899, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "31806:8:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 9900, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "31815:6:52", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "31806:15:52", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 9913, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31806:73:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "31797:82:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9891, + "id": 9915, + "nodeType": "Return", + "src": "31790:89:52" + } + ] + } + ] + }, + "documentation": { + "id": 9882, + "nodeType": "StructuredDocumentation", + "src": "31481:144:52", + "text": " @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n Returns 0 if given 0." + }, + "id": 9918, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "log256", + "nameLocation": "31639:6:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9888, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9884, + "mutability": "mutable", + "name": "value", + "nameLocation": "31654:5:52", + "nodeType": "VariableDeclaration", + "scope": 9918, + "src": "31646:13:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9883, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "31646:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9887, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "31670:8:52", + "nodeType": "VariableDeclaration", + "scope": 9918, + "src": "31661:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 9886, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 9885, + "name": "Rounding", + "nameLocations": ["31661:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "31661:8:52" + }, + "referencedDeclaration": 8329, + "src": "31661:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "31645:34:52" + }, + "returnParameters": { + "id": 9891, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9890, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9918, + "src": "31703:7:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9889, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "31703:7:52", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "31702:9:52" + }, + "scope": 9938, + "src": "31630:266:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 9936, + "nodeType": "Block", + "src": "32094:48:52", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 9934, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 9932, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 9929, + "name": "rounding", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9922, + "src": "32117:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + ], + "id": 9928, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "32111:5:52", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 9927, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "32111:5:52", + "typeDescriptions": {} + } + }, + "id": 9930, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "32111:15:52", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "%", + "rightExpression": { + "hexValue": "32", + "id": 9931, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "32129:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "32111:19:52", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "31", + "id": 9933, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "32134:1:52", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "32111:24:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 9926, + "id": 9935, + "nodeType": "Return", + "src": "32104:31:52" + } + ] + }, + "documentation": { + "id": 9919, + "nodeType": "StructuredDocumentation", + "src": "31902:113:52", + "text": " @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers." + }, + "id": 9937, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "unsignedRoundsUp", + "nameLocation": "32029:16:52", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9923, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9922, + "mutability": "mutable", + "name": "rounding", + "nameLocation": "32055:8:52", + "nodeType": "VariableDeclaration", + "scope": 9937, + "src": "32046:17:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + }, + "typeName": { + "id": 9921, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 9920, + "name": "Rounding", + "nameLocations": ["32046:8:52"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 8329, + "src": "32046:8:52" + }, + "referencedDeclaration": 8329, + "src": "32046:8:52", + "typeDescriptions": { + "typeIdentifier": "t_enum$_Rounding_$8329", + "typeString": "enum Math.Rounding" + } + }, + "visibility": "internal" + } + ], + "src": "32045:19:52" + }, + "returnParameters": { + "id": 9926, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9925, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9937, + "src": "32088:4:52", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 9924, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "32088:4:52", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "32087:6:52" + }, + "scope": 9938, + "src": "32020:122:52", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 9939, + "src": "281:31863:52", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "103:32042:52" + }, + "id": 52 + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/math/SafeCast.sol", + "exportedSymbols": { + "SafeCast": [11703] + }, + "id": 11704, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 9940, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "192:24:53" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SafeCast", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 9941, + "nodeType": "StructuredDocumentation", + "src": "218:550:53", + "text": " @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n checks.\n Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n easily result in undesired exploitation or bugs, since developers usually\n assume that overflows raise errors. `SafeCast` restores this intuition by\n reverting the transaction when such an operation overflows.\n Using this library instead of the unchecked operations eliminates an entire\n class of bugs, so it's recommended to use it always." + }, + "fullyImplemented": true, + "id": 11703, + "linearizedBaseContracts": [11703], + "name": "SafeCast", + "nameLocation": "777:8:53", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 9942, + "nodeType": "StructuredDocumentation", + "src": "792:68:53", + "text": " @dev Value doesn't fit in an uint of `bits` size." + }, + "errorSelector": "6dfcc650", + "id": 9948, + "name": "SafeCastOverflowedUintDowncast", + "nameLocation": "871:30:53", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 9947, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9944, + "mutability": "mutable", + "name": "bits", + "nameLocation": "908:4:53", + "nodeType": "VariableDeclaration", + "scope": 9948, + "src": "902:10:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 9943, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "902:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9946, + "mutability": "mutable", + "name": "value", + "nameLocation": "922:5:53", + "nodeType": "VariableDeclaration", + "scope": 9948, + "src": "914:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9945, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "914:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "901:27:53" + }, + "src": "865:64:53" + }, + { + "documentation": { + "id": 9949, + "nodeType": "StructuredDocumentation", + "src": "935:75:53", + "text": " @dev An int value doesn't fit in an uint of `bits` size." + }, + "errorSelector": "a8ce4432", + "id": 9953, + "name": "SafeCastOverflowedIntToUint", + "nameLocation": "1021:27:53", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 9952, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9951, + "mutability": "mutable", + "name": "value", + "nameLocation": "1056:5:53", + "nodeType": "VariableDeclaration", + "scope": 9953, + "src": "1049:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 9950, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1049:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1048:14:53" + }, + "src": "1015:48:53" + }, + { + "documentation": { + "id": 9954, + "nodeType": "StructuredDocumentation", + "src": "1069:67:53", + "text": " @dev Value doesn't fit in an int of `bits` size." + }, + "errorSelector": "327269a7", + "id": 9960, + "name": "SafeCastOverflowedIntDowncast", + "nameLocation": "1147:29:53", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 9959, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9956, + "mutability": "mutable", + "name": "bits", + "nameLocation": "1183:4:53", + "nodeType": "VariableDeclaration", + "scope": 9960, + "src": "1177:10:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 9955, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "1177:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9958, + "mutability": "mutable", + "name": "value", + "nameLocation": "1196:5:53", + "nodeType": "VariableDeclaration", + "scope": 9960, + "src": "1189:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 9957, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1189:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1176:26:53" + }, + "src": "1141:62:53" + }, + { + "documentation": { + "id": 9961, + "nodeType": "StructuredDocumentation", + "src": "1209:75:53", + "text": " @dev An uint value doesn't fit in an int of `bits` size." + }, + "errorSelector": "24775e06", + "id": 9965, + "name": "SafeCastOverflowedUintToInt", + "nameLocation": "1295:27:53", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 9964, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9963, + "mutability": "mutable", + "name": "value", + "nameLocation": "1331:5:53", + "nodeType": "VariableDeclaration", + "scope": 9965, + "src": "1323:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9962, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1323:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1322:15:53" + }, + "src": "1289:49:53" + }, + { + "body": { + "id": 9992, + "nodeType": "Block", + "src": "1695:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 9979, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 9973, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9968, + "src": "1709:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 9976, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1722:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint248_$", + "typeString": "type(uint248)" + }, + "typeName": { + "id": 9975, + "name": "uint248", + "nodeType": "ElementaryTypeName", + "src": "1722:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint248_$", + "typeString": "type(uint248)" + } + ], + "id": 9974, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "1717:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 9977, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1717:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint248", + "typeString": "type(uint248)" + } + }, + "id": 9978, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1731:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "1717:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint248", + "typeString": "uint248" + } + }, + "src": "1709:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 9986, + "nodeType": "IfStatement", + "src": "1705:105:53", + "trueBody": { + "id": 9985, + "nodeType": "Block", + "src": "1736:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323438", + "id": 9981, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1788:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_248_by_1", + "typeString": "int_const 248" + }, + "value": "248" + }, + { + "id": 9982, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9968, + "src": "1793:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_248_by_1", + "typeString": "int_const 248" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9980, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "1757:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 9983, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1757:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 9984, + "nodeType": "RevertStatement", + "src": "1750:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 9989, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9968, + "src": "1834:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 9988, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1826:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint248_$", + "typeString": "type(uint248)" + }, + "typeName": { + "id": 9987, + "name": "uint248", + "nodeType": "ElementaryTypeName", + "src": "1826:7:53", + "typeDescriptions": {} + } + }, + "id": 9990, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1826:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint248", + "typeString": "uint248" + } + }, + "functionReturnParameters": 9972, + "id": 9991, + "nodeType": "Return", + "src": "1819:21:53" + } + ] + }, + "documentation": { + "id": 9966, + "nodeType": "StructuredDocumentation", + "src": "1344:280:53", + "text": " @dev Returns the downcasted uint248 from uint256, reverting on\n overflow (when the input is greater than largest uint248).\n Counterpart to Solidity's `uint248` operator.\n Requirements:\n - input must fit into 248 bits" + }, + "id": 9993, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint248", + "nameLocation": "1638:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9969, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9968, + "mutability": "mutable", + "name": "value", + "nameLocation": "1656:5:53", + "nodeType": "VariableDeclaration", + "scope": 9993, + "src": "1648:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9967, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1648:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1647:15:53" + }, + "returnParameters": { + "id": 9972, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9971, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 9993, + "src": "1686:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint248", + "typeString": "uint248" + }, + "typeName": { + "id": 9970, + "name": "uint248", + "nodeType": "ElementaryTypeName", + "src": "1686:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint248", + "typeString": "uint248" + } + }, + "visibility": "internal" + } + ], + "src": "1685:9:53" + }, + "scope": 11703, + "src": "1629:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10020, + "nodeType": "Block", + "src": "2204:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10007, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10001, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9996, + "src": "2218:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10004, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2231:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint240_$", + "typeString": "type(uint240)" + }, + "typeName": { + "id": 10003, + "name": "uint240", + "nodeType": "ElementaryTypeName", + "src": "2231:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint240_$", + "typeString": "type(uint240)" + } + ], + "id": 10002, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2226:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10005, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2226:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint240", + "typeString": "type(uint240)" + } + }, + "id": 10006, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2240:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "2226:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint240", + "typeString": "uint240" + } + }, + "src": "2218:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10014, + "nodeType": "IfStatement", + "src": "2214:105:53", + "trueBody": { + "id": 10013, + "nodeType": "Block", + "src": "2245:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323430", + "id": 10009, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2297:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_240_by_1", + "typeString": "int_const 240" + }, + "value": "240" + }, + { + "id": 10010, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9996, + "src": "2302:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_240_by_1", + "typeString": "int_const 240" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10008, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "2266:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10011, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2266:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10012, + "nodeType": "RevertStatement", + "src": "2259:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10017, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9996, + "src": "2343:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10016, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2335:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint240_$", + "typeString": "type(uint240)" + }, + "typeName": { + "id": 10015, + "name": "uint240", + "nodeType": "ElementaryTypeName", + "src": "2335:7:53", + "typeDescriptions": {} + } + }, + "id": 10018, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2335:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint240", + "typeString": "uint240" + } + }, + "functionReturnParameters": 10000, + "id": 10019, + "nodeType": "Return", + "src": "2328:21:53" + } + ] + }, + "documentation": { + "id": 9994, + "nodeType": "StructuredDocumentation", + "src": "1853:280:53", + "text": " @dev Returns the downcasted uint240 from uint256, reverting on\n overflow (when the input is greater than largest uint240).\n Counterpart to Solidity's `uint240` operator.\n Requirements:\n - input must fit into 240 bits" + }, + "id": 10021, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint240", + "nameLocation": "2147:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 9997, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9996, + "mutability": "mutable", + "name": "value", + "nameLocation": "2165:5:53", + "nodeType": "VariableDeclaration", + "scope": 10021, + "src": "2157:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 9995, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2157:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2156:15:53" + }, + "returnParameters": { + "id": 10000, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9999, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10021, + "src": "2195:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint240", + "typeString": "uint240" + }, + "typeName": { + "id": 9998, + "name": "uint240", + "nodeType": "ElementaryTypeName", + "src": "2195:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint240", + "typeString": "uint240" + } + }, + "visibility": "internal" + } + ], + "src": "2194:9:53" + }, + "scope": 11703, + "src": "2138:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10048, + "nodeType": "Block", + "src": "2713:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10035, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10029, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10024, + "src": "2727:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10032, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2740:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint232_$", + "typeString": "type(uint232)" + }, + "typeName": { + "id": 10031, + "name": "uint232", + "nodeType": "ElementaryTypeName", + "src": "2740:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint232_$", + "typeString": "type(uint232)" + } + ], + "id": 10030, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2735:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10033, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2735:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint232", + "typeString": "type(uint232)" + } + }, + "id": 10034, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2749:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "2735:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint232", + "typeString": "uint232" + } + }, + "src": "2727:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10042, + "nodeType": "IfStatement", + "src": "2723:105:53", + "trueBody": { + "id": 10041, + "nodeType": "Block", + "src": "2754:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323332", + "id": 10037, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2806:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_232_by_1", + "typeString": "int_const 232" + }, + "value": "232" + }, + { + "id": 10038, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10024, + "src": "2811:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_232_by_1", + "typeString": "int_const 232" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10036, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "2775:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10039, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2775:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10040, + "nodeType": "RevertStatement", + "src": "2768:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10045, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10024, + "src": "2852:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10044, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2844:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint232_$", + "typeString": "type(uint232)" + }, + "typeName": { + "id": 10043, + "name": "uint232", + "nodeType": "ElementaryTypeName", + "src": "2844:7:53", + "typeDescriptions": {} + } + }, + "id": 10046, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2844:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint232", + "typeString": "uint232" + } + }, + "functionReturnParameters": 10028, + "id": 10047, + "nodeType": "Return", + "src": "2837:21:53" + } + ] + }, + "documentation": { + "id": 10022, + "nodeType": "StructuredDocumentation", + "src": "2362:280:53", + "text": " @dev Returns the downcasted uint232 from uint256, reverting on\n overflow (when the input is greater than largest uint232).\n Counterpart to Solidity's `uint232` operator.\n Requirements:\n - input must fit into 232 bits" + }, + "id": 10049, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint232", + "nameLocation": "2656:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10025, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10024, + "mutability": "mutable", + "name": "value", + "nameLocation": "2674:5:53", + "nodeType": "VariableDeclaration", + "scope": 10049, + "src": "2666:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10023, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2666:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2665:15:53" + }, + "returnParameters": { + "id": 10028, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10027, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10049, + "src": "2704:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint232", + "typeString": "uint232" + }, + "typeName": { + "id": 10026, + "name": "uint232", + "nodeType": "ElementaryTypeName", + "src": "2704:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint232", + "typeString": "uint232" + } + }, + "visibility": "internal" + } + ], + "src": "2703:9:53" + }, + "scope": 11703, + "src": "2647:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10076, + "nodeType": "Block", + "src": "3222:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10063, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10057, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10052, + "src": "3236:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10060, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3249:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint224_$", + "typeString": "type(uint224)" + }, + "typeName": { + "id": 10059, + "name": "uint224", + "nodeType": "ElementaryTypeName", + "src": "3249:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint224_$", + "typeString": "type(uint224)" + } + ], + "id": 10058, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "3244:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10061, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3244:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint224", + "typeString": "type(uint224)" + } + }, + "id": 10062, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3258:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "3244:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint224", + "typeString": "uint224" + } + }, + "src": "3236:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10070, + "nodeType": "IfStatement", + "src": "3232:105:53", + "trueBody": { + "id": 10069, + "nodeType": "Block", + "src": "3263:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323234", + "id": 10065, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3315:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_224_by_1", + "typeString": "int_const 224" + }, + "value": "224" + }, + { + "id": 10066, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10052, + "src": "3320:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_224_by_1", + "typeString": "int_const 224" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10064, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "3284:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10067, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3284:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10068, + "nodeType": "RevertStatement", + "src": "3277:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10073, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10052, + "src": "3361:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10072, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3353:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint224_$", + "typeString": "type(uint224)" + }, + "typeName": { + "id": 10071, + "name": "uint224", + "nodeType": "ElementaryTypeName", + "src": "3353:7:53", + "typeDescriptions": {} + } + }, + "id": 10074, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3353:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint224", + "typeString": "uint224" + } + }, + "functionReturnParameters": 10056, + "id": 10075, + "nodeType": "Return", + "src": "3346:21:53" + } + ] + }, + "documentation": { + "id": 10050, + "nodeType": "StructuredDocumentation", + "src": "2871:280:53", + "text": " @dev Returns the downcasted uint224 from uint256, reverting on\n overflow (when the input is greater than largest uint224).\n Counterpart to Solidity's `uint224` operator.\n Requirements:\n - input must fit into 224 bits" + }, + "id": 10077, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint224", + "nameLocation": "3165:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10053, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10052, + "mutability": "mutable", + "name": "value", + "nameLocation": "3183:5:53", + "nodeType": "VariableDeclaration", + "scope": 10077, + "src": "3175:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10051, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3175:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3174:15:53" + }, + "returnParameters": { + "id": 10056, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10055, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10077, + "src": "3213:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint224", + "typeString": "uint224" + }, + "typeName": { + "id": 10054, + "name": "uint224", + "nodeType": "ElementaryTypeName", + "src": "3213:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint224", + "typeString": "uint224" + } + }, + "visibility": "internal" + } + ], + "src": "3212:9:53" + }, + "scope": 11703, + "src": "3156:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10104, + "nodeType": "Block", + "src": "3731:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10091, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10085, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10080, + "src": "3745:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10088, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3758:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint216_$", + "typeString": "type(uint216)" + }, + "typeName": { + "id": 10087, + "name": "uint216", + "nodeType": "ElementaryTypeName", + "src": "3758:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint216_$", + "typeString": "type(uint216)" + } + ], + "id": 10086, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "3753:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10089, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3753:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint216", + "typeString": "type(uint216)" + } + }, + "id": 10090, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3767:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "3753:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint216", + "typeString": "uint216" + } + }, + "src": "3745:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10098, + "nodeType": "IfStatement", + "src": "3741:105:53", + "trueBody": { + "id": 10097, + "nodeType": "Block", + "src": "3772:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323136", + "id": 10093, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3824:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_216_by_1", + "typeString": "int_const 216" + }, + "value": "216" + }, + { + "id": 10094, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10080, + "src": "3829:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_216_by_1", + "typeString": "int_const 216" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10092, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "3793:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10095, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3793:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10096, + "nodeType": "RevertStatement", + "src": "3786:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10101, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10080, + "src": "3870:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3862:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint216_$", + "typeString": "type(uint216)" + }, + "typeName": { + "id": 10099, + "name": "uint216", + "nodeType": "ElementaryTypeName", + "src": "3862:7:53", + "typeDescriptions": {} + } + }, + "id": 10102, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3862:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint216", + "typeString": "uint216" + } + }, + "functionReturnParameters": 10084, + "id": 10103, + "nodeType": "Return", + "src": "3855:21:53" + } + ] + }, + "documentation": { + "id": 10078, + "nodeType": "StructuredDocumentation", + "src": "3380:280:53", + "text": " @dev Returns the downcasted uint216 from uint256, reverting on\n overflow (when the input is greater than largest uint216).\n Counterpart to Solidity's `uint216` operator.\n Requirements:\n - input must fit into 216 bits" + }, + "id": 10105, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint216", + "nameLocation": "3674:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10081, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10080, + "mutability": "mutable", + "name": "value", + "nameLocation": "3692:5:53", + "nodeType": "VariableDeclaration", + "scope": 10105, + "src": "3684:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10079, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3684:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3683:15:53" + }, + "returnParameters": { + "id": 10084, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10083, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10105, + "src": "3722:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint216", + "typeString": "uint216" + }, + "typeName": { + "id": 10082, + "name": "uint216", + "nodeType": "ElementaryTypeName", + "src": "3722:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint216", + "typeString": "uint216" + } + }, + "visibility": "internal" + } + ], + "src": "3721:9:53" + }, + "scope": 11703, + "src": "3665:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10132, + "nodeType": "Block", + "src": "4240:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10119, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10113, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10108, + "src": "4254:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10116, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4267:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint208_$", + "typeString": "type(uint208)" + }, + "typeName": { + "id": 10115, + "name": "uint208", + "nodeType": "ElementaryTypeName", + "src": "4267:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint208_$", + "typeString": "type(uint208)" + } + ], + "id": 10114, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "4262:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10117, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4262:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint208", + "typeString": "type(uint208)" + } + }, + "id": 10118, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4276:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "4262:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint208", + "typeString": "uint208" + } + }, + "src": "4254:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10126, + "nodeType": "IfStatement", + "src": "4250:105:53", + "trueBody": { + "id": 10125, + "nodeType": "Block", + "src": "4281:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323038", + "id": 10121, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4333:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_208_by_1", + "typeString": "int_const 208" + }, + "value": "208" + }, + { + "id": 10122, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10108, + "src": "4338:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_208_by_1", + "typeString": "int_const 208" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10120, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "4302:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10123, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4302:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10124, + "nodeType": "RevertStatement", + "src": "4295:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10129, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10108, + "src": "4379:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10128, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4371:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint208_$", + "typeString": "type(uint208)" + }, + "typeName": { + "id": 10127, + "name": "uint208", + "nodeType": "ElementaryTypeName", + "src": "4371:7:53", + "typeDescriptions": {} + } + }, + "id": 10130, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4371:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint208", + "typeString": "uint208" + } + }, + "functionReturnParameters": 10112, + "id": 10131, + "nodeType": "Return", + "src": "4364:21:53" + } + ] + }, + "documentation": { + "id": 10106, + "nodeType": "StructuredDocumentation", + "src": "3889:280:53", + "text": " @dev Returns the downcasted uint208 from uint256, reverting on\n overflow (when the input is greater than largest uint208).\n Counterpart to Solidity's `uint208` operator.\n Requirements:\n - input must fit into 208 bits" + }, + "id": 10133, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint208", + "nameLocation": "4183:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10109, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10108, + "mutability": "mutable", + "name": "value", + "nameLocation": "4201:5:53", + "nodeType": "VariableDeclaration", + "scope": 10133, + "src": "4193:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10107, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4193:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4192:15:53" + }, + "returnParameters": { + "id": 10112, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10111, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10133, + "src": "4231:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint208", + "typeString": "uint208" + }, + "typeName": { + "id": 10110, + "name": "uint208", + "nodeType": "ElementaryTypeName", + "src": "4231:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint208", + "typeString": "uint208" + } + }, + "visibility": "internal" + } + ], + "src": "4230:9:53" + }, + "scope": 11703, + "src": "4174:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10160, + "nodeType": "Block", + "src": "4749:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10147, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10141, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10136, + "src": "4763:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10144, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4776:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint200_$", + "typeString": "type(uint200)" + }, + "typeName": { + "id": 10143, + "name": "uint200", + "nodeType": "ElementaryTypeName", + "src": "4776:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint200_$", + "typeString": "type(uint200)" + } + ], + "id": 10142, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "4771:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10145, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4771:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint200", + "typeString": "type(uint200)" + } + }, + "id": 10146, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4785:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "4771:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint200", + "typeString": "uint200" + } + }, + "src": "4763:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10154, + "nodeType": "IfStatement", + "src": "4759:105:53", + "trueBody": { + "id": 10153, + "nodeType": "Block", + "src": "4790:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323030", + "id": 10149, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4842:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_200_by_1", + "typeString": "int_const 200" + }, + "value": "200" + }, + { + "id": 10150, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10136, + "src": "4847:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_200_by_1", + "typeString": "int_const 200" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10148, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "4811:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10151, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4811:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10152, + "nodeType": "RevertStatement", + "src": "4804:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10157, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10136, + "src": "4888:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10156, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4880:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint200_$", + "typeString": "type(uint200)" + }, + "typeName": { + "id": 10155, + "name": "uint200", + "nodeType": "ElementaryTypeName", + "src": "4880:7:53", + "typeDescriptions": {} + } + }, + "id": 10158, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4880:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint200", + "typeString": "uint200" + } + }, + "functionReturnParameters": 10140, + "id": 10159, + "nodeType": "Return", + "src": "4873:21:53" + } + ] + }, + "documentation": { + "id": 10134, + "nodeType": "StructuredDocumentation", + "src": "4398:280:53", + "text": " @dev Returns the downcasted uint200 from uint256, reverting on\n overflow (when the input is greater than largest uint200).\n Counterpart to Solidity's `uint200` operator.\n Requirements:\n - input must fit into 200 bits" + }, + "id": 10161, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint200", + "nameLocation": "4692:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10137, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10136, + "mutability": "mutable", + "name": "value", + "nameLocation": "4710:5:53", + "nodeType": "VariableDeclaration", + "scope": 10161, + "src": "4702:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10135, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4702:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4701:15:53" + }, + "returnParameters": { + "id": 10140, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10139, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10161, + "src": "4740:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint200", + "typeString": "uint200" + }, + "typeName": { + "id": 10138, + "name": "uint200", + "nodeType": "ElementaryTypeName", + "src": "4740:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint200", + "typeString": "uint200" + } + }, + "visibility": "internal" + } + ], + "src": "4739:9:53" + }, + "scope": 11703, + "src": "4683:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10188, + "nodeType": "Block", + "src": "5258:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10169, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10164, + "src": "5272:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10172, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5285:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint192_$", + "typeString": "type(uint192)" + }, + "typeName": { + "id": 10171, + "name": "uint192", + "nodeType": "ElementaryTypeName", + "src": "5285:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint192_$", + "typeString": "type(uint192)" + } + ], + "id": 10170, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "5280:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10173, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5280:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint192", + "typeString": "type(uint192)" + } + }, + "id": 10174, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "5294:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "5280:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint192", + "typeString": "uint192" + } + }, + "src": "5272:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10182, + "nodeType": "IfStatement", + "src": "5268:105:53", + "trueBody": { + "id": 10181, + "nodeType": "Block", + "src": "5299:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313932", + "id": 10177, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5351:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_192_by_1", + "typeString": "int_const 192" + }, + "value": "192" + }, + { + "id": 10178, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10164, + "src": "5356:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_192_by_1", + "typeString": "int_const 192" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10176, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "5320:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10179, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5320:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10180, + "nodeType": "RevertStatement", + "src": "5313:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10185, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10164, + "src": "5397:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10184, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5389:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint192_$", + "typeString": "type(uint192)" + }, + "typeName": { + "id": 10183, + "name": "uint192", + "nodeType": "ElementaryTypeName", + "src": "5389:7:53", + "typeDescriptions": {} + } + }, + "id": 10186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5389:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint192", + "typeString": "uint192" + } + }, + "functionReturnParameters": 10168, + "id": 10187, + "nodeType": "Return", + "src": "5382:21:53" + } + ] + }, + "documentation": { + "id": 10162, + "nodeType": "StructuredDocumentation", + "src": "4907:280:53", + "text": " @dev Returns the downcasted uint192 from uint256, reverting on\n overflow (when the input is greater than largest uint192).\n Counterpart to Solidity's `uint192` operator.\n Requirements:\n - input must fit into 192 bits" + }, + "id": 10189, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint192", + "nameLocation": "5201:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10165, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10164, + "mutability": "mutable", + "name": "value", + "nameLocation": "5219:5:53", + "nodeType": "VariableDeclaration", + "scope": 10189, + "src": "5211:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10163, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5211:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5210:15:53" + }, + "returnParameters": { + "id": 10168, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10167, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10189, + "src": "5249:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint192", + "typeString": "uint192" + }, + "typeName": { + "id": 10166, + "name": "uint192", + "nodeType": "ElementaryTypeName", + "src": "5249:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint192", + "typeString": "uint192" + } + }, + "visibility": "internal" + } + ], + "src": "5248:9:53" + }, + "scope": 11703, + "src": "5192:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10216, + "nodeType": "Block", + "src": "5767:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10203, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10197, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10192, + "src": "5781:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10200, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5794:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint184_$", + "typeString": "type(uint184)" + }, + "typeName": { + "id": 10199, + "name": "uint184", + "nodeType": "ElementaryTypeName", + "src": "5794:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint184_$", + "typeString": "type(uint184)" + } + ], + "id": 10198, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "5789:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10201, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5789:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint184", + "typeString": "type(uint184)" + } + }, + "id": 10202, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "5803:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "5789:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint184", + "typeString": "uint184" + } + }, + "src": "5781:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10210, + "nodeType": "IfStatement", + "src": "5777:105:53", + "trueBody": { + "id": 10209, + "nodeType": "Block", + "src": "5808:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313834", + "id": 10205, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5860:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_184_by_1", + "typeString": "int_const 184" + }, + "value": "184" + }, + { + "id": 10206, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10192, + "src": "5865:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_184_by_1", + "typeString": "int_const 184" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10204, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "5829:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10207, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5829:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10208, + "nodeType": "RevertStatement", + "src": "5822:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10213, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10192, + "src": "5906:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10212, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5898:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint184_$", + "typeString": "type(uint184)" + }, + "typeName": { + "id": 10211, + "name": "uint184", + "nodeType": "ElementaryTypeName", + "src": "5898:7:53", + "typeDescriptions": {} + } + }, + "id": 10214, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5898:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint184", + "typeString": "uint184" + } + }, + "functionReturnParameters": 10196, + "id": 10215, + "nodeType": "Return", + "src": "5891:21:53" + } + ] + }, + "documentation": { + "id": 10190, + "nodeType": "StructuredDocumentation", + "src": "5416:280:53", + "text": " @dev Returns the downcasted uint184 from uint256, reverting on\n overflow (when the input is greater than largest uint184).\n Counterpart to Solidity's `uint184` operator.\n Requirements:\n - input must fit into 184 bits" + }, + "id": 10217, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint184", + "nameLocation": "5710:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10193, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10192, + "mutability": "mutable", + "name": "value", + "nameLocation": "5728:5:53", + "nodeType": "VariableDeclaration", + "scope": 10217, + "src": "5720:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10191, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5720:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5719:15:53" + }, + "returnParameters": { + "id": 10196, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10195, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10217, + "src": "5758:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint184", + "typeString": "uint184" + }, + "typeName": { + "id": 10194, + "name": "uint184", + "nodeType": "ElementaryTypeName", + "src": "5758:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint184", + "typeString": "uint184" + } + }, + "visibility": "internal" + } + ], + "src": "5757:9:53" + }, + "scope": 11703, + "src": "5701:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10244, + "nodeType": "Block", + "src": "6276:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10231, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10225, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10220, + "src": "6290:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10228, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6303:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint176_$", + "typeString": "type(uint176)" + }, + "typeName": { + "id": 10227, + "name": "uint176", + "nodeType": "ElementaryTypeName", + "src": "6303:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint176_$", + "typeString": "type(uint176)" + } + ], + "id": 10226, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "6298:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10229, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6298:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint176", + "typeString": "type(uint176)" + } + }, + "id": 10230, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6312:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "6298:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint176", + "typeString": "uint176" + } + }, + "src": "6290:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10238, + "nodeType": "IfStatement", + "src": "6286:105:53", + "trueBody": { + "id": 10237, + "nodeType": "Block", + "src": "6317:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313736", + "id": 10233, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6369:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_176_by_1", + "typeString": "int_const 176" + }, + "value": "176" + }, + { + "id": 10234, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10220, + "src": "6374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_176_by_1", + "typeString": "int_const 176" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10232, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "6338:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6338:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10236, + "nodeType": "RevertStatement", + "src": "6331:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10241, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10220, + "src": "6415:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10240, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6407:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint176_$", + "typeString": "type(uint176)" + }, + "typeName": { + "id": 10239, + "name": "uint176", + "nodeType": "ElementaryTypeName", + "src": "6407:7:53", + "typeDescriptions": {} + } + }, + "id": 10242, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6407:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint176", + "typeString": "uint176" + } + }, + "functionReturnParameters": 10224, + "id": 10243, + "nodeType": "Return", + "src": "6400:21:53" + } + ] + }, + "documentation": { + "id": 10218, + "nodeType": "StructuredDocumentation", + "src": "5925:280:53", + "text": " @dev Returns the downcasted uint176 from uint256, reverting on\n overflow (when the input is greater than largest uint176).\n Counterpart to Solidity's `uint176` operator.\n Requirements:\n - input must fit into 176 bits" + }, + "id": 10245, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint176", + "nameLocation": "6219:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10221, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10220, + "mutability": "mutable", + "name": "value", + "nameLocation": "6237:5:53", + "nodeType": "VariableDeclaration", + "scope": 10245, + "src": "6229:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10219, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6229:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6228:15:53" + }, + "returnParameters": { + "id": 10224, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10223, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10245, + "src": "6267:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint176", + "typeString": "uint176" + }, + "typeName": { + "id": 10222, + "name": "uint176", + "nodeType": "ElementaryTypeName", + "src": "6267:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint176", + "typeString": "uint176" + } + }, + "visibility": "internal" + } + ], + "src": "6266:9:53" + }, + "scope": 11703, + "src": "6210:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10272, + "nodeType": "Block", + "src": "6785:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10253, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10248, + "src": "6799:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10256, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6812:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint168_$", + "typeString": "type(uint168)" + }, + "typeName": { + "id": 10255, + "name": "uint168", + "nodeType": "ElementaryTypeName", + "src": "6812:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint168_$", + "typeString": "type(uint168)" + } + ], + "id": 10254, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "6807:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10257, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6807:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint168", + "typeString": "type(uint168)" + } + }, + "id": 10258, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6821:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "6807:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint168", + "typeString": "uint168" + } + }, + "src": "6799:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10266, + "nodeType": "IfStatement", + "src": "6795:105:53", + "trueBody": { + "id": 10265, + "nodeType": "Block", + "src": "6826:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313638", + "id": 10261, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6878:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_168_by_1", + "typeString": "int_const 168" + }, + "value": "168" + }, + { + "id": 10262, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10248, + "src": "6883:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_168_by_1", + "typeString": "int_const 168" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10260, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "6847:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10263, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6847:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10264, + "nodeType": "RevertStatement", + "src": "6840:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10269, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10248, + "src": "6924:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10268, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6916:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint168_$", + "typeString": "type(uint168)" + }, + "typeName": { + "id": 10267, + "name": "uint168", + "nodeType": "ElementaryTypeName", + "src": "6916:7:53", + "typeDescriptions": {} + } + }, + "id": 10270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6916:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint168", + "typeString": "uint168" + } + }, + "functionReturnParameters": 10252, + "id": 10271, + "nodeType": "Return", + "src": "6909:21:53" + } + ] + }, + "documentation": { + "id": 10246, + "nodeType": "StructuredDocumentation", + "src": "6434:280:53", + "text": " @dev Returns the downcasted uint168 from uint256, reverting on\n overflow (when the input is greater than largest uint168).\n Counterpart to Solidity's `uint168` operator.\n Requirements:\n - input must fit into 168 bits" + }, + "id": 10273, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint168", + "nameLocation": "6728:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10249, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10248, + "mutability": "mutable", + "name": "value", + "nameLocation": "6746:5:53", + "nodeType": "VariableDeclaration", + "scope": 10273, + "src": "6738:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10247, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6738:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6737:15:53" + }, + "returnParameters": { + "id": 10252, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10251, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10273, + "src": "6776:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint168", + "typeString": "uint168" + }, + "typeName": { + "id": 10250, + "name": "uint168", + "nodeType": "ElementaryTypeName", + "src": "6776:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint168", + "typeString": "uint168" + } + }, + "visibility": "internal" + } + ], + "src": "6775:9:53" + }, + "scope": 11703, + "src": "6719:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10300, + "nodeType": "Block", + "src": "7294:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10287, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10281, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10276, + "src": "7308:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10284, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7321:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 10283, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "7321:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + } + ], + "id": 10282, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "7316:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10285, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7316:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint160", + "typeString": "type(uint160)" + } + }, + "id": 10286, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7330:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "7316:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + }, + "src": "7308:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10294, + "nodeType": "IfStatement", + "src": "7304:105:53", + "trueBody": { + "id": 10293, + "nodeType": "Block", + "src": "7335:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313630", + "id": 10289, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7387:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_160_by_1", + "typeString": "int_const 160" + }, + "value": "160" + }, + { + "id": 10290, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10276, + "src": "7392:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_160_by_1", + "typeString": "int_const 160" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10288, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "7356:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7356:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10292, + "nodeType": "RevertStatement", + "src": "7349:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10297, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10276, + "src": "7433:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10296, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7425:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 10295, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "7425:7:53", + "typeDescriptions": {} + } + }, + "id": 10298, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7425:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + }, + "functionReturnParameters": 10280, + "id": 10299, + "nodeType": "Return", + "src": "7418:21:53" + } + ] + }, + "documentation": { + "id": 10274, + "nodeType": "StructuredDocumentation", + "src": "6943:280:53", + "text": " @dev Returns the downcasted uint160 from uint256, reverting on\n overflow (when the input is greater than largest uint160).\n Counterpart to Solidity's `uint160` operator.\n Requirements:\n - input must fit into 160 bits" + }, + "id": 10301, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint160", + "nameLocation": "7237:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10277, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10276, + "mutability": "mutable", + "name": "value", + "nameLocation": "7255:5:53", + "nodeType": "VariableDeclaration", + "scope": 10301, + "src": "7247:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10275, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7247:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7246:15:53" + }, + "returnParameters": { + "id": 10280, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10279, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10301, + "src": "7285:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + }, + "typeName": { + "id": 10278, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "7285:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + }, + "visibility": "internal" + } + ], + "src": "7284:9:53" + }, + "scope": 11703, + "src": "7228:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10328, + "nodeType": "Block", + "src": "7803:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10309, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10304, + "src": "7817:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10312, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7830:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint152_$", + "typeString": "type(uint152)" + }, + "typeName": { + "id": 10311, + "name": "uint152", + "nodeType": "ElementaryTypeName", + "src": "7830:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint152_$", + "typeString": "type(uint152)" + } + ], + "id": 10310, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "7825:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10313, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7825:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint152", + "typeString": "type(uint152)" + } + }, + "id": 10314, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7839:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "7825:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint152", + "typeString": "uint152" + } + }, + "src": "7817:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10322, + "nodeType": "IfStatement", + "src": "7813:105:53", + "trueBody": { + "id": 10321, + "nodeType": "Block", + "src": "7844:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313532", + "id": 10317, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7896:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_152_by_1", + "typeString": "int_const 152" + }, + "value": "152" + }, + { + "id": 10318, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10304, + "src": "7901:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_152_by_1", + "typeString": "int_const 152" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10316, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "7865:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10319, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7865:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10320, + "nodeType": "RevertStatement", + "src": "7858:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10325, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10304, + "src": "7942:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10324, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7934:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint152_$", + "typeString": "type(uint152)" + }, + "typeName": { + "id": 10323, + "name": "uint152", + "nodeType": "ElementaryTypeName", + "src": "7934:7:53", + "typeDescriptions": {} + } + }, + "id": 10326, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7934:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint152", + "typeString": "uint152" + } + }, + "functionReturnParameters": 10308, + "id": 10327, + "nodeType": "Return", + "src": "7927:21:53" + } + ] + }, + "documentation": { + "id": 10302, + "nodeType": "StructuredDocumentation", + "src": "7452:280:53", + "text": " @dev Returns the downcasted uint152 from uint256, reverting on\n overflow (when the input is greater than largest uint152).\n Counterpart to Solidity's `uint152` operator.\n Requirements:\n - input must fit into 152 bits" + }, + "id": 10329, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint152", + "nameLocation": "7746:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10305, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10304, + "mutability": "mutable", + "name": "value", + "nameLocation": "7764:5:53", + "nodeType": "VariableDeclaration", + "scope": 10329, + "src": "7756:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10303, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7756:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7755:15:53" + }, + "returnParameters": { + "id": 10308, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10307, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10329, + "src": "7794:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint152", + "typeString": "uint152" + }, + "typeName": { + "id": 10306, + "name": "uint152", + "nodeType": "ElementaryTypeName", + "src": "7794:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint152", + "typeString": "uint152" + } + }, + "visibility": "internal" + } + ], + "src": "7793:9:53" + }, + "scope": 11703, + "src": "7737:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10356, + "nodeType": "Block", + "src": "8312:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10337, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10332, + "src": "8326:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10340, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8339:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint144_$", + "typeString": "type(uint144)" + }, + "typeName": { + "id": 10339, + "name": "uint144", + "nodeType": "ElementaryTypeName", + "src": "8339:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint144_$", + "typeString": "type(uint144)" + } + ], + "id": 10338, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "8334:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10341, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8334:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint144", + "typeString": "type(uint144)" + } + }, + "id": 10342, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8348:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "8334:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint144", + "typeString": "uint144" + } + }, + "src": "8326:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10350, + "nodeType": "IfStatement", + "src": "8322:105:53", + "trueBody": { + "id": 10349, + "nodeType": "Block", + "src": "8353:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313434", + "id": 10345, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8405:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_144_by_1", + "typeString": "int_const 144" + }, + "value": "144" + }, + { + "id": 10346, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10332, + "src": "8410:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_144_by_1", + "typeString": "int_const 144" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10344, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "8374:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10347, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8374:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10348, + "nodeType": "RevertStatement", + "src": "8367:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10353, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10332, + "src": "8451:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10352, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8443:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint144_$", + "typeString": "type(uint144)" + }, + "typeName": { + "id": 10351, + "name": "uint144", + "nodeType": "ElementaryTypeName", + "src": "8443:7:53", + "typeDescriptions": {} + } + }, + "id": 10354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8443:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint144", + "typeString": "uint144" + } + }, + "functionReturnParameters": 10336, + "id": 10355, + "nodeType": "Return", + "src": "8436:21:53" + } + ] + }, + "documentation": { + "id": 10330, + "nodeType": "StructuredDocumentation", + "src": "7961:280:53", + "text": " @dev Returns the downcasted uint144 from uint256, reverting on\n overflow (when the input is greater than largest uint144).\n Counterpart to Solidity's `uint144` operator.\n Requirements:\n - input must fit into 144 bits" + }, + "id": 10357, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint144", + "nameLocation": "8255:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10333, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10332, + "mutability": "mutable", + "name": "value", + "nameLocation": "8273:5:53", + "nodeType": "VariableDeclaration", + "scope": 10357, + "src": "8265:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10331, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8265:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8264:15:53" + }, + "returnParameters": { + "id": 10336, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10335, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10357, + "src": "8303:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint144", + "typeString": "uint144" + }, + "typeName": { + "id": 10334, + "name": "uint144", + "nodeType": "ElementaryTypeName", + "src": "8303:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint144", + "typeString": "uint144" + } + }, + "visibility": "internal" + } + ], + "src": "8302:9:53" + }, + "scope": 11703, + "src": "8246:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10384, + "nodeType": "Block", + "src": "8821:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10365, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10360, + "src": "8835:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10368, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8848:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint136_$", + "typeString": "type(uint136)" + }, + "typeName": { + "id": 10367, + "name": "uint136", + "nodeType": "ElementaryTypeName", + "src": "8848:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint136_$", + "typeString": "type(uint136)" + } + ], + "id": 10366, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "8843:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10369, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8843:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint136", + "typeString": "type(uint136)" + } + }, + "id": 10370, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8857:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "8843:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint136", + "typeString": "uint136" + } + }, + "src": "8835:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10378, + "nodeType": "IfStatement", + "src": "8831:105:53", + "trueBody": { + "id": 10377, + "nodeType": "Block", + "src": "8862:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313336", + "id": 10373, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8914:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_136_by_1", + "typeString": "int_const 136" + }, + "value": "136" + }, + { + "id": 10374, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10360, + "src": "8919:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_136_by_1", + "typeString": "int_const 136" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10372, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "8883:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8883:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10376, + "nodeType": "RevertStatement", + "src": "8876:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10381, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10360, + "src": "8960:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10380, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8952:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint136_$", + "typeString": "type(uint136)" + }, + "typeName": { + "id": 10379, + "name": "uint136", + "nodeType": "ElementaryTypeName", + "src": "8952:7:53", + "typeDescriptions": {} + } + }, + "id": 10382, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8952:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint136", + "typeString": "uint136" + } + }, + "functionReturnParameters": 10364, + "id": 10383, + "nodeType": "Return", + "src": "8945:21:53" + } + ] + }, + "documentation": { + "id": 10358, + "nodeType": "StructuredDocumentation", + "src": "8470:280:53", + "text": " @dev Returns the downcasted uint136 from uint256, reverting on\n overflow (when the input is greater than largest uint136).\n Counterpart to Solidity's `uint136` operator.\n Requirements:\n - input must fit into 136 bits" + }, + "id": 10385, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint136", + "nameLocation": "8764:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10361, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10360, + "mutability": "mutable", + "name": "value", + "nameLocation": "8782:5:53", + "nodeType": "VariableDeclaration", + "scope": 10385, + "src": "8774:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10359, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8774:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8773:15:53" + }, + "returnParameters": { + "id": 10364, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10363, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10385, + "src": "8812:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint136", + "typeString": "uint136" + }, + "typeName": { + "id": 10362, + "name": "uint136", + "nodeType": "ElementaryTypeName", + "src": "8812:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint136", + "typeString": "uint136" + } + }, + "visibility": "internal" + } + ], + "src": "8811:9:53" + }, + "scope": 11703, + "src": "8755:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10412, + "nodeType": "Block", + "src": "9330:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10399, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10393, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10388, + "src": "9344:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9357:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint128_$", + "typeString": "type(uint128)" + }, + "typeName": { + "id": 10395, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "9357:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint128_$", + "typeString": "type(uint128)" + } + ], + "id": 10394, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "9352:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10397, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9352:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint128", + "typeString": "type(uint128)" + } + }, + "id": 10398, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "9366:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "9352:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "src": "9344:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10406, + "nodeType": "IfStatement", + "src": "9340:105:53", + "trueBody": { + "id": 10405, + "nodeType": "Block", + "src": "9371:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313238", + "id": 10401, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9423:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_128_by_1", + "typeString": "int_const 128" + }, + "value": "128" + }, + { + "id": 10402, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10388, + "src": "9428:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_128_by_1", + "typeString": "int_const 128" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10400, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "9392:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10403, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9392:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10404, + "nodeType": "RevertStatement", + "src": "9385:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10409, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10388, + "src": "9469:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10408, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9461:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint128_$", + "typeString": "type(uint128)" + }, + "typeName": { + "id": 10407, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "9461:7:53", + "typeDescriptions": {} + } + }, + "id": 10410, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9461:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "functionReturnParameters": 10392, + "id": 10411, + "nodeType": "Return", + "src": "9454:21:53" + } + ] + }, + "documentation": { + "id": 10386, + "nodeType": "StructuredDocumentation", + "src": "8979:280:53", + "text": " @dev Returns the downcasted uint128 from uint256, reverting on\n overflow (when the input is greater than largest uint128).\n Counterpart to Solidity's `uint128` operator.\n Requirements:\n - input must fit into 128 bits" + }, + "id": 10413, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint128", + "nameLocation": "9273:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10389, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10388, + "mutability": "mutable", + "name": "value", + "nameLocation": "9291:5:53", + "nodeType": "VariableDeclaration", + "scope": 10413, + "src": "9283:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10387, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9283:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9282:15:53" + }, + "returnParameters": { + "id": 10392, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10391, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10413, + "src": "9321:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + }, + "typeName": { + "id": 10390, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "9321:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "visibility": "internal" + } + ], + "src": "9320:9:53" + }, + "scope": 11703, + "src": "9264:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10440, + "nodeType": "Block", + "src": "9839:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10421, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10416, + "src": "9853:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10424, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9866:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint120_$", + "typeString": "type(uint120)" + }, + "typeName": { + "id": 10423, + "name": "uint120", + "nodeType": "ElementaryTypeName", + "src": "9866:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint120_$", + "typeString": "type(uint120)" + } + ], + "id": 10422, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "9861:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10425, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9861:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint120", + "typeString": "type(uint120)" + } + }, + "id": 10426, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "9875:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "9861:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint120", + "typeString": "uint120" + } + }, + "src": "9853:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10434, + "nodeType": "IfStatement", + "src": "9849:105:53", + "trueBody": { + "id": 10433, + "nodeType": "Block", + "src": "9880:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313230", + "id": 10429, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9932:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_120_by_1", + "typeString": "int_const 120" + }, + "value": "120" + }, + { + "id": 10430, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10416, + "src": "9937:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_120_by_1", + "typeString": "int_const 120" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10428, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "9901:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9901:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10432, + "nodeType": "RevertStatement", + "src": "9894:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10437, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10416, + "src": "9978:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10436, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9970:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint120_$", + "typeString": "type(uint120)" + }, + "typeName": { + "id": 10435, + "name": "uint120", + "nodeType": "ElementaryTypeName", + "src": "9970:7:53", + "typeDescriptions": {} + } + }, + "id": 10438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9970:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint120", + "typeString": "uint120" + } + }, + "functionReturnParameters": 10420, + "id": 10439, + "nodeType": "Return", + "src": "9963:21:53" + } + ] + }, + "documentation": { + "id": 10414, + "nodeType": "StructuredDocumentation", + "src": "9488:280:53", + "text": " @dev Returns the downcasted uint120 from uint256, reverting on\n overflow (when the input is greater than largest uint120).\n Counterpart to Solidity's `uint120` operator.\n Requirements:\n - input must fit into 120 bits" + }, + "id": 10441, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint120", + "nameLocation": "9782:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10417, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10416, + "mutability": "mutable", + "name": "value", + "nameLocation": "9800:5:53", + "nodeType": "VariableDeclaration", + "scope": 10441, + "src": "9792:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10415, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9792:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9791:15:53" + }, + "returnParameters": { + "id": 10420, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10419, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10441, + "src": "9830:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint120", + "typeString": "uint120" + }, + "typeName": { + "id": 10418, + "name": "uint120", + "nodeType": "ElementaryTypeName", + "src": "9830:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint120", + "typeString": "uint120" + } + }, + "visibility": "internal" + } + ], + "src": "9829:9:53" + }, + "scope": 11703, + "src": "9773:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10468, + "nodeType": "Block", + "src": "10348:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10455, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10449, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10444, + "src": "10362:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10452, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10375:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint112_$", + "typeString": "type(uint112)" + }, + "typeName": { + "id": 10451, + "name": "uint112", + "nodeType": "ElementaryTypeName", + "src": "10375:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint112_$", + "typeString": "type(uint112)" + } + ], + "id": 10450, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "10370:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10370:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint112", + "typeString": "type(uint112)" + } + }, + "id": 10454, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "10384:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "10370:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint112", + "typeString": "uint112" + } + }, + "src": "10362:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10462, + "nodeType": "IfStatement", + "src": "10358:105:53", + "trueBody": { + "id": 10461, + "nodeType": "Block", + "src": "10389:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313132", + "id": 10457, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10441:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_112_by_1", + "typeString": "int_const 112" + }, + "value": "112" + }, + { + "id": 10458, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10444, + "src": "10446:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_112_by_1", + "typeString": "int_const 112" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10456, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "10410:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10459, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10410:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10460, + "nodeType": "RevertStatement", + "src": "10403:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10465, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10444, + "src": "10487:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10464, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10479:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint112_$", + "typeString": "type(uint112)" + }, + "typeName": { + "id": 10463, + "name": "uint112", + "nodeType": "ElementaryTypeName", + "src": "10479:7:53", + "typeDescriptions": {} + } + }, + "id": 10466, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10479:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint112", + "typeString": "uint112" + } + }, + "functionReturnParameters": 10448, + "id": 10467, + "nodeType": "Return", + "src": "10472:21:53" + } + ] + }, + "documentation": { + "id": 10442, + "nodeType": "StructuredDocumentation", + "src": "9997:280:53", + "text": " @dev Returns the downcasted uint112 from uint256, reverting on\n overflow (when the input is greater than largest uint112).\n Counterpart to Solidity's `uint112` operator.\n Requirements:\n - input must fit into 112 bits" + }, + "id": 10469, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint112", + "nameLocation": "10291:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10445, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10444, + "mutability": "mutable", + "name": "value", + "nameLocation": "10309:5:53", + "nodeType": "VariableDeclaration", + "scope": 10469, + "src": "10301:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10443, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10301:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10300:15:53" + }, + "returnParameters": { + "id": 10448, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10447, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10469, + "src": "10339:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint112", + "typeString": "uint112" + }, + "typeName": { + "id": 10446, + "name": "uint112", + "nodeType": "ElementaryTypeName", + "src": "10339:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint112", + "typeString": "uint112" + } + }, + "visibility": "internal" + } + ], + "src": "10338:9:53" + }, + "scope": 11703, + "src": "10282:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10496, + "nodeType": "Block", + "src": "10857:152:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10483, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10477, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10472, + "src": "10871:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10480, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10884:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint104_$", + "typeString": "type(uint104)" + }, + "typeName": { + "id": 10479, + "name": "uint104", + "nodeType": "ElementaryTypeName", + "src": "10884:7:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint104_$", + "typeString": "type(uint104)" + } + ], + "id": 10478, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "10879:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10481, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10879:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint104", + "typeString": "type(uint104)" + } + }, + "id": 10482, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "10893:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "10879:17:53", + "typeDescriptions": { + "typeIdentifier": "t_uint104", + "typeString": "uint104" + } + }, + "src": "10871:25:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10490, + "nodeType": "IfStatement", + "src": "10867:105:53", + "trueBody": { + "id": 10489, + "nodeType": "Block", + "src": "10898:74:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313034", + "id": 10485, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10950:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_104_by_1", + "typeString": "int_const 104" + }, + "value": "104" + }, + { + "id": 10486, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10472, + "src": "10955:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_104_by_1", + "typeString": "int_const 104" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10484, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "10919:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10487, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10919:42:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10488, + "nodeType": "RevertStatement", + "src": "10912:49:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10493, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10472, + "src": "10996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10492, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10988:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint104_$", + "typeString": "type(uint104)" + }, + "typeName": { + "id": 10491, + "name": "uint104", + "nodeType": "ElementaryTypeName", + "src": "10988:7:53", + "typeDescriptions": {} + } + }, + "id": 10494, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10988:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint104", + "typeString": "uint104" + } + }, + "functionReturnParameters": 10476, + "id": 10495, + "nodeType": "Return", + "src": "10981:21:53" + } + ] + }, + "documentation": { + "id": 10470, + "nodeType": "StructuredDocumentation", + "src": "10506:280:53", + "text": " @dev Returns the downcasted uint104 from uint256, reverting on\n overflow (when the input is greater than largest uint104).\n Counterpart to Solidity's `uint104` operator.\n Requirements:\n - input must fit into 104 bits" + }, + "id": 10497, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint104", + "nameLocation": "10800:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10473, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10472, + "mutability": "mutable", + "name": "value", + "nameLocation": "10818:5:53", + "nodeType": "VariableDeclaration", + "scope": 10497, + "src": "10810:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10471, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10810:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10809:15:53" + }, + "returnParameters": { + "id": 10476, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10475, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10497, + "src": "10848:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint104", + "typeString": "uint104" + }, + "typeName": { + "id": 10474, + "name": "uint104", + "nodeType": "ElementaryTypeName", + "src": "10848:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint104", + "typeString": "uint104" + } + }, + "visibility": "internal" + } + ], + "src": "10847:9:53" + }, + "scope": 11703, + "src": "10791:218:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10524, + "nodeType": "Block", + "src": "11360:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10505, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10500, + "src": "11374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10508, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11387:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint96_$", + "typeString": "type(uint96)" + }, + "typeName": { + "id": 10507, + "name": "uint96", + "nodeType": "ElementaryTypeName", + "src": "11387:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint96_$", + "typeString": "type(uint96)" + } + ], + "id": 10506, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "11382:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10509, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11382:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint96", + "typeString": "type(uint96)" + } + }, + "id": 10510, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "11395:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "11382:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + }, + "src": "11374:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10518, + "nodeType": "IfStatement", + "src": "11370:103:53", + "trueBody": { + "id": 10517, + "nodeType": "Block", + "src": "11400:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3936", + "id": 10513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11452:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "value": "96" + }, + { + "id": 10514, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10500, + "src": "11456:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10512, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "11421:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10515, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11421:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10516, + "nodeType": "RevertStatement", + "src": "11414:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10521, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10500, + "src": "11496:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10520, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11489:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint96_$", + "typeString": "type(uint96)" + }, + "typeName": { + "id": 10519, + "name": "uint96", + "nodeType": "ElementaryTypeName", + "src": "11489:6:53", + "typeDescriptions": {} + } + }, + "id": 10522, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11489:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + }, + "functionReturnParameters": 10504, + "id": 10523, + "nodeType": "Return", + "src": "11482:20:53" + } + ] + }, + "documentation": { + "id": 10498, + "nodeType": "StructuredDocumentation", + "src": "11015:276:53", + "text": " @dev Returns the downcasted uint96 from uint256, reverting on\n overflow (when the input is greater than largest uint96).\n Counterpart to Solidity's `uint96` operator.\n Requirements:\n - input must fit into 96 bits" + }, + "id": 10525, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint96", + "nameLocation": "11305:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10501, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10500, + "mutability": "mutable", + "name": "value", + "nameLocation": "11322:5:53", + "nodeType": "VariableDeclaration", + "scope": 10525, + "src": "11314:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10499, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11314:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11313:15:53" + }, + "returnParameters": { + "id": 10504, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10503, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10525, + "src": "11352:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + }, + "typeName": { + "id": 10502, + "name": "uint96", + "nodeType": "ElementaryTypeName", + "src": "11352:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + }, + "visibility": "internal" + } + ], + "src": "11351:8:53" + }, + "scope": 11703, + "src": "11296:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10552, + "nodeType": "Block", + "src": "11860:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10539, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10533, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10528, + "src": "11874:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10536, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11887:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint88_$", + "typeString": "type(uint88)" + }, + "typeName": { + "id": 10535, + "name": "uint88", + "nodeType": "ElementaryTypeName", + "src": "11887:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint88_$", + "typeString": "type(uint88)" + } + ], + "id": 10534, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "11882:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10537, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11882:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint88", + "typeString": "type(uint88)" + } + }, + "id": 10538, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "11895:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "11882:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint88", + "typeString": "uint88" + } + }, + "src": "11874:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10546, + "nodeType": "IfStatement", + "src": "11870:103:53", + "trueBody": { + "id": 10545, + "nodeType": "Block", + "src": "11900:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3838", + "id": 10541, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11952:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_88_by_1", + "typeString": "int_const 88" + }, + "value": "88" + }, + { + "id": 10542, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10528, + "src": "11956:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_88_by_1", + "typeString": "int_const 88" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10540, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "11921:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10543, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11921:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10544, + "nodeType": "RevertStatement", + "src": "11914:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10549, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10528, + "src": "11996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10548, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11989:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint88_$", + "typeString": "type(uint88)" + }, + "typeName": { + "id": 10547, + "name": "uint88", + "nodeType": "ElementaryTypeName", + "src": "11989:6:53", + "typeDescriptions": {} + } + }, + "id": 10550, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11989:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint88", + "typeString": "uint88" + } + }, + "functionReturnParameters": 10532, + "id": 10551, + "nodeType": "Return", + "src": "11982:20:53" + } + ] + }, + "documentation": { + "id": 10526, + "nodeType": "StructuredDocumentation", + "src": "11515:276:53", + "text": " @dev Returns the downcasted uint88 from uint256, reverting on\n overflow (when the input is greater than largest uint88).\n Counterpart to Solidity's `uint88` operator.\n Requirements:\n - input must fit into 88 bits" + }, + "id": 10553, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint88", + "nameLocation": "11805:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10529, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10528, + "mutability": "mutable", + "name": "value", + "nameLocation": "11822:5:53", + "nodeType": "VariableDeclaration", + "scope": 10553, + "src": "11814:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10527, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11814:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11813:15:53" + }, + "returnParameters": { + "id": 10532, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10531, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10553, + "src": "11852:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint88", + "typeString": "uint88" + }, + "typeName": { + "id": 10530, + "name": "uint88", + "nodeType": "ElementaryTypeName", + "src": "11852:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint88", + "typeString": "uint88" + } + }, + "visibility": "internal" + } + ], + "src": "11851:8:53" + }, + "scope": 11703, + "src": "11796:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10580, + "nodeType": "Block", + "src": "12360:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10567, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10561, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10556, + "src": "12374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10564, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12387:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint80_$", + "typeString": "type(uint80)" + }, + "typeName": { + "id": 10563, + "name": "uint80", + "nodeType": "ElementaryTypeName", + "src": "12387:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint80_$", + "typeString": "type(uint80)" + } + ], + "id": 10562, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "12382:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10565, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12382:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint80", + "typeString": "type(uint80)" + } + }, + "id": 10566, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "12395:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "12382:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint80", + "typeString": "uint80" + } + }, + "src": "12374:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10574, + "nodeType": "IfStatement", + "src": "12370:103:53", + "trueBody": { + "id": 10573, + "nodeType": "Block", + "src": "12400:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3830", + "id": 10569, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12452:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_80_by_1", + "typeString": "int_const 80" + }, + "value": "80" + }, + { + "id": 10570, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10556, + "src": "12456:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_80_by_1", + "typeString": "int_const 80" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10568, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "12421:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10571, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12421:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10572, + "nodeType": "RevertStatement", + "src": "12414:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10577, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10556, + "src": "12496:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10576, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12489:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint80_$", + "typeString": "type(uint80)" + }, + "typeName": { + "id": 10575, + "name": "uint80", + "nodeType": "ElementaryTypeName", + "src": "12489:6:53", + "typeDescriptions": {} + } + }, + "id": 10578, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12489:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint80", + "typeString": "uint80" + } + }, + "functionReturnParameters": 10560, + "id": 10579, + "nodeType": "Return", + "src": "12482:20:53" + } + ] + }, + "documentation": { + "id": 10554, + "nodeType": "StructuredDocumentation", + "src": "12015:276:53", + "text": " @dev Returns the downcasted uint80 from uint256, reverting on\n overflow (when the input is greater than largest uint80).\n Counterpart to Solidity's `uint80` operator.\n Requirements:\n - input must fit into 80 bits" + }, + "id": 10581, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint80", + "nameLocation": "12305:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10557, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10556, + "mutability": "mutable", + "name": "value", + "nameLocation": "12322:5:53", + "nodeType": "VariableDeclaration", + "scope": 10581, + "src": "12314:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10555, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12314:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12313:15:53" + }, + "returnParameters": { + "id": 10560, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10559, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10581, + "src": "12352:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint80", + "typeString": "uint80" + }, + "typeName": { + "id": 10558, + "name": "uint80", + "nodeType": "ElementaryTypeName", + "src": "12352:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint80", + "typeString": "uint80" + } + }, + "visibility": "internal" + } + ], + "src": "12351:8:53" + }, + "scope": 11703, + "src": "12296:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10608, + "nodeType": "Block", + "src": "12860:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10595, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10589, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10584, + "src": "12874:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10592, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12887:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint72_$", + "typeString": "type(uint72)" + }, + "typeName": { + "id": 10591, + "name": "uint72", + "nodeType": "ElementaryTypeName", + "src": "12887:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint72_$", + "typeString": "type(uint72)" + } + ], + "id": 10590, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "12882:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10593, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12882:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint72", + "typeString": "type(uint72)" + } + }, + "id": 10594, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "12895:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "12882:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint72", + "typeString": "uint72" + } + }, + "src": "12874:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10602, + "nodeType": "IfStatement", + "src": "12870:103:53", + "trueBody": { + "id": 10601, + "nodeType": "Block", + "src": "12900:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3732", + "id": 10597, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12952:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_72_by_1", + "typeString": "int_const 72" + }, + "value": "72" + }, + { + "id": 10598, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10584, + "src": "12956:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_72_by_1", + "typeString": "int_const 72" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10596, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "12921:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10599, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12921:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10600, + "nodeType": "RevertStatement", + "src": "12914:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10605, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10584, + "src": "12996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10604, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12989:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint72_$", + "typeString": "type(uint72)" + }, + "typeName": { + "id": 10603, + "name": "uint72", + "nodeType": "ElementaryTypeName", + "src": "12989:6:53", + "typeDescriptions": {} + } + }, + "id": 10606, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12989:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint72", + "typeString": "uint72" + } + }, + "functionReturnParameters": 10588, + "id": 10607, + "nodeType": "Return", + "src": "12982:20:53" + } + ] + }, + "documentation": { + "id": 10582, + "nodeType": "StructuredDocumentation", + "src": "12515:276:53", + "text": " @dev Returns the downcasted uint72 from uint256, reverting on\n overflow (when the input is greater than largest uint72).\n Counterpart to Solidity's `uint72` operator.\n Requirements:\n - input must fit into 72 bits" + }, + "id": 10609, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint72", + "nameLocation": "12805:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10585, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10584, + "mutability": "mutable", + "name": "value", + "nameLocation": "12822:5:53", + "nodeType": "VariableDeclaration", + "scope": 10609, + "src": "12814:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10583, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12814:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12813:15:53" + }, + "returnParameters": { + "id": 10588, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10587, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10609, + "src": "12852:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint72", + "typeString": "uint72" + }, + "typeName": { + "id": 10586, + "name": "uint72", + "nodeType": "ElementaryTypeName", + "src": "12852:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint72", + "typeString": "uint72" + } + }, + "visibility": "internal" + } + ], + "src": "12851:8:53" + }, + "scope": 11703, + "src": "12796:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10636, + "nodeType": "Block", + "src": "13360:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10623, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10617, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10612, + "src": "13374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10620, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13387:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 10619, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "13387:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + } + ], + "id": 10618, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "13382:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10621, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13382:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint64", + "typeString": "type(uint64)" + } + }, + "id": 10622, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "13395:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "13382:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "13374:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10630, + "nodeType": "IfStatement", + "src": "13370:103:53", + "trueBody": { + "id": 10629, + "nodeType": "Block", + "src": "13400:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3634", + "id": 10625, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13452:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + { + "id": 10626, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10612, + "src": "13456:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10624, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "13421:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10627, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13421:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10628, + "nodeType": "RevertStatement", + "src": "13414:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10633, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10612, + "src": "13496:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10632, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13489:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint64_$", + "typeString": "type(uint64)" + }, + "typeName": { + "id": 10631, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "13489:6:53", + "typeDescriptions": {} + } + }, + "id": 10634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13489:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "functionReturnParameters": 10616, + "id": 10635, + "nodeType": "Return", + "src": "13482:20:53" + } + ] + }, + "documentation": { + "id": 10610, + "nodeType": "StructuredDocumentation", + "src": "13015:276:53", + "text": " @dev Returns the downcasted uint64 from uint256, reverting on\n overflow (when the input is greater than largest uint64).\n Counterpart to Solidity's `uint64` operator.\n Requirements:\n - input must fit into 64 bits" + }, + "id": 10637, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint64", + "nameLocation": "13305:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10613, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10612, + "mutability": "mutable", + "name": "value", + "nameLocation": "13322:5:53", + "nodeType": "VariableDeclaration", + "scope": 10637, + "src": "13314:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10611, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13314:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "13313:15:53" + }, + "returnParameters": { + "id": 10616, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10615, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10637, + "src": "13352:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 10614, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "13352:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "13351:8:53" + }, + "scope": 11703, + "src": "13296:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10664, + "nodeType": "Block", + "src": "13860:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10651, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10645, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10640, + "src": "13874:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10648, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13887:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint56_$", + "typeString": "type(uint56)" + }, + "typeName": { + "id": 10647, + "name": "uint56", + "nodeType": "ElementaryTypeName", + "src": "13887:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint56_$", + "typeString": "type(uint56)" + } + ], + "id": 10646, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "13882:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10649, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13882:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint56", + "typeString": "type(uint56)" + } + }, + "id": 10650, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "13895:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "13882:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint56", + "typeString": "uint56" + } + }, + "src": "13874:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10658, + "nodeType": "IfStatement", + "src": "13870:103:53", + "trueBody": { + "id": 10657, + "nodeType": "Block", + "src": "13900:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3536", + "id": 10653, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13952:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_56_by_1", + "typeString": "int_const 56" + }, + "value": "56" + }, + { + "id": 10654, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10640, + "src": "13956:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_56_by_1", + "typeString": "int_const 56" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10652, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "13921:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10655, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13921:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10656, + "nodeType": "RevertStatement", + "src": "13914:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10661, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10640, + "src": "13996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10660, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13989:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint56_$", + "typeString": "type(uint56)" + }, + "typeName": { + "id": 10659, + "name": "uint56", + "nodeType": "ElementaryTypeName", + "src": "13989:6:53", + "typeDescriptions": {} + } + }, + "id": 10662, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13989:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint56", + "typeString": "uint56" + } + }, + "functionReturnParameters": 10644, + "id": 10663, + "nodeType": "Return", + "src": "13982:20:53" + } + ] + }, + "documentation": { + "id": 10638, + "nodeType": "StructuredDocumentation", + "src": "13515:276:53", + "text": " @dev Returns the downcasted uint56 from uint256, reverting on\n overflow (when the input is greater than largest uint56).\n Counterpart to Solidity's `uint56` operator.\n Requirements:\n - input must fit into 56 bits" + }, + "id": 10665, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint56", + "nameLocation": "13805:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10641, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10640, + "mutability": "mutable", + "name": "value", + "nameLocation": "13822:5:53", + "nodeType": "VariableDeclaration", + "scope": 10665, + "src": "13814:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10639, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13814:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "13813:15:53" + }, + "returnParameters": { + "id": 10644, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10643, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10665, + "src": "13852:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint56", + "typeString": "uint56" + }, + "typeName": { + "id": 10642, + "name": "uint56", + "nodeType": "ElementaryTypeName", + "src": "13852:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint56", + "typeString": "uint56" + } + }, + "visibility": "internal" + } + ], + "src": "13851:8:53" + }, + "scope": 11703, + "src": "13796:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10692, + "nodeType": "Block", + "src": "14360:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10679, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10673, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10668, + "src": "14374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10676, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14387:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint48_$", + "typeString": "type(uint48)" + }, + "typeName": { + "id": 10675, + "name": "uint48", + "nodeType": "ElementaryTypeName", + "src": "14387:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint48_$", + "typeString": "type(uint48)" + } + ], + "id": 10674, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "14382:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10677, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14382:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint48", + "typeString": "type(uint48)" + } + }, + "id": 10678, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "14395:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "14382:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint48", + "typeString": "uint48" + } + }, + "src": "14374:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10686, + "nodeType": "IfStatement", + "src": "14370:103:53", + "trueBody": { + "id": 10685, + "nodeType": "Block", + "src": "14400:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3438", + "id": 10681, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14452:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_48_by_1", + "typeString": "int_const 48" + }, + "value": "48" + }, + { + "id": 10682, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10668, + "src": "14456:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_48_by_1", + "typeString": "int_const 48" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10680, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "14421:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10683, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14421:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10684, + "nodeType": "RevertStatement", + "src": "14414:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10689, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10668, + "src": "14496:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10688, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14489:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint48_$", + "typeString": "type(uint48)" + }, + "typeName": { + "id": 10687, + "name": "uint48", + "nodeType": "ElementaryTypeName", + "src": "14489:6:53", + "typeDescriptions": {} + } + }, + "id": 10690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14489:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint48", + "typeString": "uint48" + } + }, + "functionReturnParameters": 10672, + "id": 10691, + "nodeType": "Return", + "src": "14482:20:53" + } + ] + }, + "documentation": { + "id": 10666, + "nodeType": "StructuredDocumentation", + "src": "14015:276:53", + "text": " @dev Returns the downcasted uint48 from uint256, reverting on\n overflow (when the input is greater than largest uint48).\n Counterpart to Solidity's `uint48` operator.\n Requirements:\n - input must fit into 48 bits" + }, + "id": 10693, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint48", + "nameLocation": "14305:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10669, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10668, + "mutability": "mutable", + "name": "value", + "nameLocation": "14322:5:53", + "nodeType": "VariableDeclaration", + "scope": 10693, + "src": "14314:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10667, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14314:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "14313:15:53" + }, + "returnParameters": { + "id": 10672, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10671, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10693, + "src": "14352:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint48", + "typeString": "uint48" + }, + "typeName": { + "id": 10670, + "name": "uint48", + "nodeType": "ElementaryTypeName", + "src": "14352:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint48", + "typeString": "uint48" + } + }, + "visibility": "internal" + } + ], + "src": "14351:8:53" + }, + "scope": 11703, + "src": "14296:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10720, + "nodeType": "Block", + "src": "14860:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10701, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10696, + "src": "14874:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10704, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14887:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint40_$", + "typeString": "type(uint40)" + }, + "typeName": { + "id": 10703, + "name": "uint40", + "nodeType": "ElementaryTypeName", + "src": "14887:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint40_$", + "typeString": "type(uint40)" + } + ], + "id": 10702, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "14882:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10705, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14882:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint40", + "typeString": "type(uint40)" + } + }, + "id": 10706, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "14895:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "14882:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint40", + "typeString": "uint40" + } + }, + "src": "14874:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10714, + "nodeType": "IfStatement", + "src": "14870:103:53", + "trueBody": { + "id": 10713, + "nodeType": "Block", + "src": "14900:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3430", + "id": 10709, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14952:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_40_by_1", + "typeString": "int_const 40" + }, + "value": "40" + }, + { + "id": 10710, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10696, + "src": "14956:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_40_by_1", + "typeString": "int_const 40" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10708, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "14921:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14921:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10712, + "nodeType": "RevertStatement", + "src": "14914:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10717, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10696, + "src": "14996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14989:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint40_$", + "typeString": "type(uint40)" + }, + "typeName": { + "id": 10715, + "name": "uint40", + "nodeType": "ElementaryTypeName", + "src": "14989:6:53", + "typeDescriptions": {} + } + }, + "id": 10718, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14989:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint40", + "typeString": "uint40" + } + }, + "functionReturnParameters": 10700, + "id": 10719, + "nodeType": "Return", + "src": "14982:20:53" + } + ] + }, + "documentation": { + "id": 10694, + "nodeType": "StructuredDocumentation", + "src": "14515:276:53", + "text": " @dev Returns the downcasted uint40 from uint256, reverting on\n overflow (when the input is greater than largest uint40).\n Counterpart to Solidity's `uint40` operator.\n Requirements:\n - input must fit into 40 bits" + }, + "id": 10721, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint40", + "nameLocation": "14805:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10697, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10696, + "mutability": "mutable", + "name": "value", + "nameLocation": "14822:5:53", + "nodeType": "VariableDeclaration", + "scope": 10721, + "src": "14814:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10695, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14814:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "14813:15:53" + }, + "returnParameters": { + "id": 10700, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10699, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10721, + "src": "14852:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint40", + "typeString": "uint40" + }, + "typeName": { + "id": 10698, + "name": "uint40", + "nodeType": "ElementaryTypeName", + "src": "14852:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint40", + "typeString": "uint40" + } + }, + "visibility": "internal" + } + ], + "src": "14851:8:53" + }, + "scope": 11703, + "src": "14796:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10748, + "nodeType": "Block", + "src": "15360:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10735, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10729, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10724, + "src": "15374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10732, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15387:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + }, + "typeName": { + "id": 10731, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "15387:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + } + ], + "id": 10730, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "15382:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10733, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15382:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint32", + "typeString": "type(uint32)" + } + }, + "id": 10734, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "15395:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "15382:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "15374:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10742, + "nodeType": "IfStatement", + "src": "15370:103:53", + "trueBody": { + "id": 10741, + "nodeType": "Block", + "src": "15400:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3332", + "id": 10737, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15452:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + { + "id": 10738, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10724, + "src": "15456:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10736, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "15421:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15421:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10740, + "nodeType": "RevertStatement", + "src": "15414:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10745, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10724, + "src": "15496:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10744, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15489:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint32_$", + "typeString": "type(uint32)" + }, + "typeName": { + "id": 10743, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "15489:6:53", + "typeDescriptions": {} + } + }, + "id": 10746, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15489:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "functionReturnParameters": 10728, + "id": 10747, + "nodeType": "Return", + "src": "15482:20:53" + } + ] + }, + "documentation": { + "id": 10722, + "nodeType": "StructuredDocumentation", + "src": "15015:276:53", + "text": " @dev Returns the downcasted uint32 from uint256, reverting on\n overflow (when the input is greater than largest uint32).\n Counterpart to Solidity's `uint32` operator.\n Requirements:\n - input must fit into 32 bits" + }, + "id": 10749, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint32", + "nameLocation": "15305:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10725, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10724, + "mutability": "mutable", + "name": "value", + "nameLocation": "15322:5:53", + "nodeType": "VariableDeclaration", + "scope": 10749, + "src": "15314:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10723, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15314:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15313:15:53" + }, + "returnParameters": { + "id": 10728, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10727, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10749, + "src": "15352:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 10726, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "15352:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "15351:8:53" + }, + "scope": 11703, + "src": "15296:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10776, + "nodeType": "Block", + "src": "15860:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10763, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10757, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10752, + "src": "15874:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10760, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15887:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint24_$", + "typeString": "type(uint24)" + }, + "typeName": { + "id": 10759, + "name": "uint24", + "nodeType": "ElementaryTypeName", + "src": "15887:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint24_$", + "typeString": "type(uint24)" + } + ], + "id": 10758, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "15882:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10761, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15882:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint24", + "typeString": "type(uint24)" + } + }, + "id": 10762, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "15895:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "15882:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint24", + "typeString": "uint24" + } + }, + "src": "15874:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10770, + "nodeType": "IfStatement", + "src": "15870:103:53", + "trueBody": { + "id": 10769, + "nodeType": "Block", + "src": "15900:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3234", + "id": 10765, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15952:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_24_by_1", + "typeString": "int_const 24" + }, + "value": "24" + }, + { + "id": 10766, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10752, + "src": "15956:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_24_by_1", + "typeString": "int_const 24" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10764, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "15921:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10767, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15921:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10768, + "nodeType": "RevertStatement", + "src": "15914:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10773, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10752, + "src": "15996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10772, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15989:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint24_$", + "typeString": "type(uint24)" + }, + "typeName": { + "id": 10771, + "name": "uint24", + "nodeType": "ElementaryTypeName", + "src": "15989:6:53", + "typeDescriptions": {} + } + }, + "id": 10774, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15989:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint24", + "typeString": "uint24" + } + }, + "functionReturnParameters": 10756, + "id": 10775, + "nodeType": "Return", + "src": "15982:20:53" + } + ] + }, + "documentation": { + "id": 10750, + "nodeType": "StructuredDocumentation", + "src": "15515:276:53", + "text": " @dev Returns the downcasted uint24 from uint256, reverting on\n overflow (when the input is greater than largest uint24).\n Counterpart to Solidity's `uint24` operator.\n Requirements:\n - input must fit into 24 bits" + }, + "id": 10777, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint24", + "nameLocation": "15805:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10753, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10752, + "mutability": "mutable", + "name": "value", + "nameLocation": "15822:5:53", + "nodeType": "VariableDeclaration", + "scope": 10777, + "src": "15814:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10751, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15814:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15813:15:53" + }, + "returnParameters": { + "id": 10756, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10755, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10777, + "src": "15852:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint24", + "typeString": "uint24" + }, + "typeName": { + "id": 10754, + "name": "uint24", + "nodeType": "ElementaryTypeName", + "src": "15852:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint24", + "typeString": "uint24" + } + }, + "visibility": "internal" + } + ], + "src": "15851:8:53" + }, + "scope": 11703, + "src": "15796:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10804, + "nodeType": "Block", + "src": "16360:149:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10785, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10780, + "src": "16374:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10788, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16387:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint16_$", + "typeString": "type(uint16)" + }, + "typeName": { + "id": 10787, + "name": "uint16", + "nodeType": "ElementaryTypeName", + "src": "16387:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint16_$", + "typeString": "type(uint16)" + } + ], + "id": 10786, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "16382:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10789, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16382:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint16", + "typeString": "type(uint16)" + } + }, + "id": 10790, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "16395:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "16382:16:53", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "src": "16374:24:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10798, + "nodeType": "IfStatement", + "src": "16370:103:53", + "trueBody": { + "id": 10797, + "nodeType": "Block", + "src": "16400:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3136", + "id": 10793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16452:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + { + "id": 10794, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10780, + "src": "16456:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10792, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "16421:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10795, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16421:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10796, + "nodeType": "RevertStatement", + "src": "16414:48:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10801, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10780, + "src": "16496:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10800, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16489:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint16_$", + "typeString": "type(uint16)" + }, + "typeName": { + "id": 10799, + "name": "uint16", + "nodeType": "ElementaryTypeName", + "src": "16489:6:53", + "typeDescriptions": {} + } + }, + "id": 10802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16489:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "functionReturnParameters": 10784, + "id": 10803, + "nodeType": "Return", + "src": "16482:20:53" + } + ] + }, + "documentation": { + "id": 10778, + "nodeType": "StructuredDocumentation", + "src": "16015:276:53", + "text": " @dev Returns the downcasted uint16 from uint256, reverting on\n overflow (when the input is greater than largest uint16).\n Counterpart to Solidity's `uint16` operator.\n Requirements:\n - input must fit into 16 bits" + }, + "id": 10805, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint16", + "nameLocation": "16305:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10781, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10780, + "mutability": "mutable", + "name": "value", + "nameLocation": "16322:5:53", + "nodeType": "VariableDeclaration", + "scope": 10805, + "src": "16314:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10779, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16314:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16313:15:53" + }, + "returnParameters": { + "id": 10784, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10783, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10805, + "src": "16352:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + }, + "typeName": { + "id": 10782, + "name": "uint16", + "nodeType": "ElementaryTypeName", + "src": "16352:6:53", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "visibility": "internal" + } + ], + "src": "16351:8:53" + }, + "scope": 11703, + "src": "16296:213:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10832, + "nodeType": "Block", + "src": "16854:146:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10819, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10813, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10808, + "src": "16868:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 10816, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16881:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 10815, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16881:5:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + } + ], + "id": 10814, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "16876:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 10817, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16876:11:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint8", + "typeString": "type(uint8)" + } + }, + "id": 10818, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "16888:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "16876:15:53", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "16868:23:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10826, + "nodeType": "IfStatement", + "src": "16864:101:53", + "trueBody": { + "id": 10825, + "nodeType": "Block", + "src": "16893:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "38", + "id": 10821, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16945:1:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + { + "id": 10822, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10808, + "src": "16948:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10820, + "name": "SafeCastOverflowedUintDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9948, + "src": "16914:30:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint8,uint256) pure returns (error)" + } + }, + "id": 10823, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16914:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10824, + "nodeType": "RevertStatement", + "src": "16907:47:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10829, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10808, + "src": "16987:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 10828, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16981:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 10827, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16981:5:53", + "typeDescriptions": {} + } + }, + "id": 10830, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16981:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "functionReturnParameters": 10812, + "id": 10831, + "nodeType": "Return", + "src": "16974:19:53" + } + ] + }, + "documentation": { + "id": 10806, + "nodeType": "StructuredDocumentation", + "src": "16515:272:53", + "text": " @dev Returns the downcasted uint8 from uint256, reverting on\n overflow (when the input is greater than largest uint8).\n Counterpart to Solidity's `uint8` operator.\n Requirements:\n - input must fit into 8 bits" + }, + "id": 10833, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint8", + "nameLocation": "16801:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10809, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10808, + "mutability": "mutable", + "name": "value", + "nameLocation": "16817:5:53", + "nodeType": "VariableDeclaration", + "scope": 10833, + "src": "16809:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10807, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16809:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16808:15:53" + }, + "returnParameters": { + "id": 10812, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10811, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10833, + "src": "16847:5:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 10810, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "16847:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "src": "16846:7:53" + }, + "scope": 11703, + "src": "16792:208:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10855, + "nodeType": "Block", + "src": "17236:128:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 10843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10841, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10836, + "src": "17250:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "hexValue": "30", + "id": 10842, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17258:1:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "17250:9:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10849, + "nodeType": "IfStatement", + "src": "17246:81:53", + "trueBody": { + "id": 10848, + "nodeType": "Block", + "src": "17261:66:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 10845, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10836, + "src": "17310:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10844, + "name": "SafeCastOverflowedIntToUint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9953, + "src": "17282:27:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_int256_$returns$_t_error_$", + "typeString": "function (int256) pure returns (error)" + } + }, + "id": 10846, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17282:34:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10847, + "nodeType": "RevertStatement", + "src": "17275:41:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 10852, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10836, + "src": "17351:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10851, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17343:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 10850, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17343:7:53", + "typeDescriptions": {} + } + }, + "id": 10853, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17343:14:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 10840, + "id": 10854, + "nodeType": "Return", + "src": "17336:21:53" + } + ] + }, + "documentation": { + "id": 10834, + "nodeType": "StructuredDocumentation", + "src": "17006:160:53", + "text": " @dev Converts a signed int256 into an unsigned uint256.\n Requirements:\n - input must be greater than or equal to 0." + }, + "id": 10856, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint256", + "nameLocation": "17180:9:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10837, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10836, + "mutability": "mutable", + "name": "value", + "nameLocation": "17197:5:53", + "nodeType": "VariableDeclaration", + "scope": 10856, + "src": "17190:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10835, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "17190:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "17189:14:53" + }, + "returnParameters": { + "id": 10840, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10839, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 10856, + "src": "17227:7:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10838, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17227:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "17226:9:53" + }, + "scope": 11703, + "src": "17171:193:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10881, + "nodeType": "Block", + "src": "17761:150:53", + "statements": [ + { + "expression": { + "id": 10869, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 10864, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10862, + "src": "17771:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int248", + "typeString": "int248" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 10867, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10859, + "src": "17791:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10866, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17784:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int248_$", + "typeString": "type(int248)" + }, + "typeName": { + "id": 10865, + "name": "int248", + "nodeType": "ElementaryTypeName", + "src": "17784:6:53", + "typeDescriptions": {} + } + }, + "id": 10868, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17784:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int248", + "typeString": "int248" + } + }, + "src": "17771:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int248", + "typeString": "int248" + } + }, + "id": 10870, + "nodeType": "ExpressionStatement", + "src": "17771:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 10873, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10871, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10862, + "src": "17811:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int248", + "typeString": "int248" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 10872, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10859, + "src": "17825:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "17811:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10880, + "nodeType": "IfStatement", + "src": "17807:98:53", + "trueBody": { + "id": 10879, + "nodeType": "Block", + "src": "17832:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323438", + "id": 10875, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17883:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_248_by_1", + "typeString": "int_const 248" + }, + "value": "248" + }, + { + "id": 10876, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10859, + "src": "17888:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_248_by_1", + "typeString": "int_const 248" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10874, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "17853:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 10877, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17853:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10878, + "nodeType": "RevertStatement", + "src": "17846:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 10857, + "nodeType": "StructuredDocumentation", + "src": "17370:312:53", + "text": " @dev Returns the downcasted int248 from int256, reverting on\n overflow (when the input is less than smallest int248 or\n greater than largest int248).\n Counterpart to Solidity's `int248` operator.\n Requirements:\n - input must fit into 248 bits" + }, + "id": 10882, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt248", + "nameLocation": "17696:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10860, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10859, + "mutability": "mutable", + "name": "value", + "nameLocation": "17712:5:53", + "nodeType": "VariableDeclaration", + "scope": 10882, + "src": "17705:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10858, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "17705:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "17704:14:53" + }, + "returnParameters": { + "id": 10863, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10862, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "17749:10:53", + "nodeType": "VariableDeclaration", + "scope": 10882, + "src": "17742:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int248", + "typeString": "int248" + }, + "typeName": { + "id": 10861, + "name": "int248", + "nodeType": "ElementaryTypeName", + "src": "17742:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int248", + "typeString": "int248" + } + }, + "visibility": "internal" + } + ], + "src": "17741:19:53" + }, + "scope": 11703, + "src": "17687:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10907, + "nodeType": "Block", + "src": "18308:150:53", + "statements": [ + { + "expression": { + "id": 10895, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 10890, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10888, + "src": "18318:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int240", + "typeString": "int240" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 10893, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10885, + "src": "18338:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10892, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "18331:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int240_$", + "typeString": "type(int240)" + }, + "typeName": { + "id": 10891, + "name": "int240", + "nodeType": "ElementaryTypeName", + "src": "18331:6:53", + "typeDescriptions": {} + } + }, + "id": 10894, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18331:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int240", + "typeString": "int240" + } + }, + "src": "18318:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int240", + "typeString": "int240" + } + }, + "id": 10896, + "nodeType": "ExpressionStatement", + "src": "18318:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 10899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10897, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10888, + "src": "18358:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int240", + "typeString": "int240" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 10898, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10885, + "src": "18372:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "18358:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10906, + "nodeType": "IfStatement", + "src": "18354:98:53", + "trueBody": { + "id": 10905, + "nodeType": "Block", + "src": "18379:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323430", + "id": 10901, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18430:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_240_by_1", + "typeString": "int_const 240" + }, + "value": "240" + }, + { + "id": 10902, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10885, + "src": "18435:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_240_by_1", + "typeString": "int_const 240" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10900, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "18400:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 10903, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18400:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10904, + "nodeType": "RevertStatement", + "src": "18393:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 10883, + "nodeType": "StructuredDocumentation", + "src": "17917:312:53", + "text": " @dev Returns the downcasted int240 from int256, reverting on\n overflow (when the input is less than smallest int240 or\n greater than largest int240).\n Counterpart to Solidity's `int240` operator.\n Requirements:\n - input must fit into 240 bits" + }, + "id": 10908, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt240", + "nameLocation": "18243:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10886, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10885, + "mutability": "mutable", + "name": "value", + "nameLocation": "18259:5:53", + "nodeType": "VariableDeclaration", + "scope": 10908, + "src": "18252:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10884, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "18252:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "18251:14:53" + }, + "returnParameters": { + "id": 10889, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10888, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "18296:10:53", + "nodeType": "VariableDeclaration", + "scope": 10908, + "src": "18289:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int240", + "typeString": "int240" + }, + "typeName": { + "id": 10887, + "name": "int240", + "nodeType": "ElementaryTypeName", + "src": "18289:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int240", + "typeString": "int240" + } + }, + "visibility": "internal" + } + ], + "src": "18288:19:53" + }, + "scope": 11703, + "src": "18234:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10933, + "nodeType": "Block", + "src": "18855:150:53", + "statements": [ + { + "expression": { + "id": 10921, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 10916, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10914, + "src": "18865:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int232", + "typeString": "int232" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 10919, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10911, + "src": "18885:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10918, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "18878:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int232_$", + "typeString": "type(int232)" + }, + "typeName": { + "id": 10917, + "name": "int232", + "nodeType": "ElementaryTypeName", + "src": "18878:6:53", + "typeDescriptions": {} + } + }, + "id": 10920, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18878:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int232", + "typeString": "int232" + } + }, + "src": "18865:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int232", + "typeString": "int232" + } + }, + "id": 10922, + "nodeType": "ExpressionStatement", + "src": "18865:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 10925, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10923, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10914, + "src": "18905:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int232", + "typeString": "int232" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 10924, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10911, + "src": "18919:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "18905:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10932, + "nodeType": "IfStatement", + "src": "18901:98:53", + "trueBody": { + "id": 10931, + "nodeType": "Block", + "src": "18926:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323332", + "id": 10927, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18977:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_232_by_1", + "typeString": "int_const 232" + }, + "value": "232" + }, + { + "id": 10928, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10911, + "src": "18982:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_232_by_1", + "typeString": "int_const 232" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10926, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "18947:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 10929, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18947:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10930, + "nodeType": "RevertStatement", + "src": "18940:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 10909, + "nodeType": "StructuredDocumentation", + "src": "18464:312:53", + "text": " @dev Returns the downcasted int232 from int256, reverting on\n overflow (when the input is less than smallest int232 or\n greater than largest int232).\n Counterpart to Solidity's `int232` operator.\n Requirements:\n - input must fit into 232 bits" + }, + "id": 10934, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt232", + "nameLocation": "18790:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10912, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10911, + "mutability": "mutable", + "name": "value", + "nameLocation": "18806:5:53", + "nodeType": "VariableDeclaration", + "scope": 10934, + "src": "18799:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10910, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "18799:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "18798:14:53" + }, + "returnParameters": { + "id": 10915, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10914, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "18843:10:53", + "nodeType": "VariableDeclaration", + "scope": 10934, + "src": "18836:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int232", + "typeString": "int232" + }, + "typeName": { + "id": 10913, + "name": "int232", + "nodeType": "ElementaryTypeName", + "src": "18836:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int232", + "typeString": "int232" + } + }, + "visibility": "internal" + } + ], + "src": "18835:19:53" + }, + "scope": 11703, + "src": "18781:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10959, + "nodeType": "Block", + "src": "19402:150:53", + "statements": [ + { + "expression": { + "id": 10947, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 10942, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10940, + "src": "19412:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int224", + "typeString": "int224" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 10945, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10937, + "src": "19432:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10944, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "19425:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int224_$", + "typeString": "type(int224)" + }, + "typeName": { + "id": 10943, + "name": "int224", + "nodeType": "ElementaryTypeName", + "src": "19425:6:53", + "typeDescriptions": {} + } + }, + "id": 10946, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19425:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int224", + "typeString": "int224" + } + }, + "src": "19412:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int224", + "typeString": "int224" + } + }, + "id": 10948, + "nodeType": "ExpressionStatement", + "src": "19412:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 10951, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10949, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10940, + "src": "19452:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int224", + "typeString": "int224" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 10950, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10937, + "src": "19466:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "19452:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10958, + "nodeType": "IfStatement", + "src": "19448:98:53", + "trueBody": { + "id": 10957, + "nodeType": "Block", + "src": "19473:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323234", + "id": 10953, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "19524:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_224_by_1", + "typeString": "int_const 224" + }, + "value": "224" + }, + { + "id": 10954, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10937, + "src": "19529:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_224_by_1", + "typeString": "int_const 224" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10952, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "19494:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 10955, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19494:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10956, + "nodeType": "RevertStatement", + "src": "19487:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 10935, + "nodeType": "StructuredDocumentation", + "src": "19011:312:53", + "text": " @dev Returns the downcasted int224 from int256, reverting on\n overflow (when the input is less than smallest int224 or\n greater than largest int224).\n Counterpart to Solidity's `int224` operator.\n Requirements:\n - input must fit into 224 bits" + }, + "id": 10960, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt224", + "nameLocation": "19337:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10938, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10937, + "mutability": "mutable", + "name": "value", + "nameLocation": "19353:5:53", + "nodeType": "VariableDeclaration", + "scope": 10960, + "src": "19346:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10936, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "19346:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "19345:14:53" + }, + "returnParameters": { + "id": 10941, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10940, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "19390:10:53", + "nodeType": "VariableDeclaration", + "scope": 10960, + "src": "19383:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int224", + "typeString": "int224" + }, + "typeName": { + "id": 10939, + "name": "int224", + "nodeType": "ElementaryTypeName", + "src": "19383:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int224", + "typeString": "int224" + } + }, + "visibility": "internal" + } + ], + "src": "19382:19:53" + }, + "scope": 11703, + "src": "19328:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 10985, + "nodeType": "Block", + "src": "19949:150:53", + "statements": [ + { + "expression": { + "id": 10973, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 10968, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10966, + "src": "19959:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int216", + "typeString": "int216" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 10971, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10963, + "src": "19979:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10970, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "19972:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int216_$", + "typeString": "type(int216)" + }, + "typeName": { + "id": 10969, + "name": "int216", + "nodeType": "ElementaryTypeName", + "src": "19972:6:53", + "typeDescriptions": {} + } + }, + "id": 10972, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19972:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int216", + "typeString": "int216" + } + }, + "src": "19959:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int216", + "typeString": "int216" + } + }, + "id": 10974, + "nodeType": "ExpressionStatement", + "src": "19959:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 10977, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10975, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10966, + "src": "19999:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int216", + "typeString": "int216" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 10976, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10963, + "src": "20013:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "19999:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 10984, + "nodeType": "IfStatement", + "src": "19995:98:53", + "trueBody": { + "id": 10983, + "nodeType": "Block", + "src": "20020:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323136", + "id": 10979, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20071:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_216_by_1", + "typeString": "int_const 216" + }, + "value": "216" + }, + { + "id": 10980, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10963, + "src": "20076:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_216_by_1", + "typeString": "int_const 216" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10978, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "20041:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 10981, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20041:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 10982, + "nodeType": "RevertStatement", + "src": "20034:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 10961, + "nodeType": "StructuredDocumentation", + "src": "19558:312:53", + "text": " @dev Returns the downcasted int216 from int256, reverting on\n overflow (when the input is less than smallest int216 or\n greater than largest int216).\n Counterpart to Solidity's `int216` operator.\n Requirements:\n - input must fit into 216 bits" + }, + "id": 10986, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt216", + "nameLocation": "19884:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10964, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10963, + "mutability": "mutable", + "name": "value", + "nameLocation": "19900:5:53", + "nodeType": "VariableDeclaration", + "scope": 10986, + "src": "19893:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10962, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "19893:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "19892:14:53" + }, + "returnParameters": { + "id": 10967, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10966, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "19937:10:53", + "nodeType": "VariableDeclaration", + "scope": 10986, + "src": "19930:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int216", + "typeString": "int216" + }, + "typeName": { + "id": 10965, + "name": "int216", + "nodeType": "ElementaryTypeName", + "src": "19930:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int216", + "typeString": "int216" + } + }, + "visibility": "internal" + } + ], + "src": "19929:19:53" + }, + "scope": 11703, + "src": "19875:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11011, + "nodeType": "Block", + "src": "20496:150:53", + "statements": [ + { + "expression": { + "id": 10999, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 10994, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10992, + "src": "20506:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int208", + "typeString": "int208" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 10997, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10989, + "src": "20526:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 10996, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "20519:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int208_$", + "typeString": "type(int208)" + }, + "typeName": { + "id": 10995, + "name": "int208", + "nodeType": "ElementaryTypeName", + "src": "20519:6:53", + "typeDescriptions": {} + } + }, + "id": 10998, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20519:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int208", + "typeString": "int208" + } + }, + "src": "20506:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int208", + "typeString": "int208" + } + }, + "id": 11000, + "nodeType": "ExpressionStatement", + "src": "20506:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11003, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11001, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10992, + "src": "20546:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int208", + "typeString": "int208" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11002, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10989, + "src": "20560:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "20546:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11010, + "nodeType": "IfStatement", + "src": "20542:98:53", + "trueBody": { + "id": 11009, + "nodeType": "Block", + "src": "20567:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323038", + "id": 11005, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "20618:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_208_by_1", + "typeString": "int_const 208" + }, + "value": "208" + }, + { + "id": 11006, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10989, + "src": "20623:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_208_by_1", + "typeString": "int_const 208" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11004, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "20588:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11007, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20588:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11008, + "nodeType": "RevertStatement", + "src": "20581:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 10987, + "nodeType": "StructuredDocumentation", + "src": "20105:312:53", + "text": " @dev Returns the downcasted int208 from int256, reverting on\n overflow (when the input is less than smallest int208 or\n greater than largest int208).\n Counterpart to Solidity's `int208` operator.\n Requirements:\n - input must fit into 208 bits" + }, + "id": 11012, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt208", + "nameLocation": "20431:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 10990, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10989, + "mutability": "mutable", + "name": "value", + "nameLocation": "20447:5:53", + "nodeType": "VariableDeclaration", + "scope": 11012, + "src": "20440:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 10988, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "20440:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "20439:14:53" + }, + "returnParameters": { + "id": 10993, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10992, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "20484:10:53", + "nodeType": "VariableDeclaration", + "scope": 11012, + "src": "20477:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int208", + "typeString": "int208" + }, + "typeName": { + "id": 10991, + "name": "int208", + "nodeType": "ElementaryTypeName", + "src": "20477:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int208", + "typeString": "int208" + } + }, + "visibility": "internal" + } + ], + "src": "20476:19:53" + }, + "scope": 11703, + "src": "20422:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11037, + "nodeType": "Block", + "src": "21043:150:53", + "statements": [ + { + "expression": { + "id": 11025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11020, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11018, + "src": "21053:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int200", + "typeString": "int200" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11023, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11015, + "src": "21073:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11022, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21066:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int200_$", + "typeString": "type(int200)" + }, + "typeName": { + "id": 11021, + "name": "int200", + "nodeType": "ElementaryTypeName", + "src": "21066:6:53", + "typeDescriptions": {} + } + }, + "id": 11024, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21066:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int200", + "typeString": "int200" + } + }, + "src": "21053:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int200", + "typeString": "int200" + } + }, + "id": 11026, + "nodeType": "ExpressionStatement", + "src": "21053:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11029, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11027, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11018, + "src": "21093:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int200", + "typeString": "int200" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11028, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11015, + "src": "21107:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "21093:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11036, + "nodeType": "IfStatement", + "src": "21089:98:53", + "trueBody": { + "id": 11035, + "nodeType": "Block", + "src": "21114:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "323030", + "id": 11031, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21165:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_200_by_1", + "typeString": "int_const 200" + }, + "value": "200" + }, + { + "id": 11032, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11015, + "src": "21170:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_200_by_1", + "typeString": "int_const 200" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11030, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "21135:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11033, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21135:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11034, + "nodeType": "RevertStatement", + "src": "21128:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11013, + "nodeType": "StructuredDocumentation", + "src": "20652:312:53", + "text": " @dev Returns the downcasted int200 from int256, reverting on\n overflow (when the input is less than smallest int200 or\n greater than largest int200).\n Counterpart to Solidity's `int200` operator.\n Requirements:\n - input must fit into 200 bits" + }, + "id": 11038, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt200", + "nameLocation": "20978:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11016, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11015, + "mutability": "mutable", + "name": "value", + "nameLocation": "20994:5:53", + "nodeType": "VariableDeclaration", + "scope": 11038, + "src": "20987:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11014, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "20987:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "20986:14:53" + }, + "returnParameters": { + "id": 11019, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11018, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "21031:10:53", + "nodeType": "VariableDeclaration", + "scope": 11038, + "src": "21024:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int200", + "typeString": "int200" + }, + "typeName": { + "id": 11017, + "name": "int200", + "nodeType": "ElementaryTypeName", + "src": "21024:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int200", + "typeString": "int200" + } + }, + "visibility": "internal" + } + ], + "src": "21023:19:53" + }, + "scope": 11703, + "src": "20969:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11063, + "nodeType": "Block", + "src": "21590:150:53", + "statements": [ + { + "expression": { + "id": 11051, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11046, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11044, + "src": "21600:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int192", + "typeString": "int192" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11049, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11041, + "src": "21620:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11048, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21613:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int192_$", + "typeString": "type(int192)" + }, + "typeName": { + "id": 11047, + "name": "int192", + "nodeType": "ElementaryTypeName", + "src": "21613:6:53", + "typeDescriptions": {} + } + }, + "id": 11050, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21613:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int192", + "typeString": "int192" + } + }, + "src": "21600:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int192", + "typeString": "int192" + } + }, + "id": 11052, + "nodeType": "ExpressionStatement", + "src": "21600:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11055, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11053, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11044, + "src": "21640:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int192", + "typeString": "int192" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11054, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11041, + "src": "21654:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "21640:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11062, + "nodeType": "IfStatement", + "src": "21636:98:53", + "trueBody": { + "id": 11061, + "nodeType": "Block", + "src": "21661:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313932", + "id": 11057, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21712:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_192_by_1", + "typeString": "int_const 192" + }, + "value": "192" + }, + { + "id": 11058, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11041, + "src": "21717:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_192_by_1", + "typeString": "int_const 192" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11056, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "21682:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11059, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21682:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11060, + "nodeType": "RevertStatement", + "src": "21675:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11039, + "nodeType": "StructuredDocumentation", + "src": "21199:312:53", + "text": " @dev Returns the downcasted int192 from int256, reverting on\n overflow (when the input is less than smallest int192 or\n greater than largest int192).\n Counterpart to Solidity's `int192` operator.\n Requirements:\n - input must fit into 192 bits" + }, + "id": 11064, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt192", + "nameLocation": "21525:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11042, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11041, + "mutability": "mutable", + "name": "value", + "nameLocation": "21541:5:53", + "nodeType": "VariableDeclaration", + "scope": 11064, + "src": "21534:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11040, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "21534:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "21533:14:53" + }, + "returnParameters": { + "id": 11045, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11044, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "21578:10:53", + "nodeType": "VariableDeclaration", + "scope": 11064, + "src": "21571:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int192", + "typeString": "int192" + }, + "typeName": { + "id": 11043, + "name": "int192", + "nodeType": "ElementaryTypeName", + "src": "21571:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int192", + "typeString": "int192" + } + }, + "visibility": "internal" + } + ], + "src": "21570:19:53" + }, + "scope": 11703, + "src": "21516:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11089, + "nodeType": "Block", + "src": "22137:150:53", + "statements": [ + { + "expression": { + "id": 11077, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11072, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11070, + "src": "22147:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int184", + "typeString": "int184" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11075, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11067, + "src": "22167:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11074, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "22160:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int184_$", + "typeString": "type(int184)" + }, + "typeName": { + "id": 11073, + "name": "int184", + "nodeType": "ElementaryTypeName", + "src": "22160:6:53", + "typeDescriptions": {} + } + }, + "id": 11076, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22160:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int184", + "typeString": "int184" + } + }, + "src": "22147:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int184", + "typeString": "int184" + } + }, + "id": 11078, + "nodeType": "ExpressionStatement", + "src": "22147:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11081, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11079, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11070, + "src": "22187:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int184", + "typeString": "int184" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11080, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11067, + "src": "22201:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "22187:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11088, + "nodeType": "IfStatement", + "src": "22183:98:53", + "trueBody": { + "id": 11087, + "nodeType": "Block", + "src": "22208:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313834", + "id": 11083, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22259:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_184_by_1", + "typeString": "int_const 184" + }, + "value": "184" + }, + { + "id": 11084, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11067, + "src": "22264:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_184_by_1", + "typeString": "int_const 184" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11082, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "22229:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11085, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22229:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11086, + "nodeType": "RevertStatement", + "src": "22222:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11065, + "nodeType": "StructuredDocumentation", + "src": "21746:312:53", + "text": " @dev Returns the downcasted int184 from int256, reverting on\n overflow (when the input is less than smallest int184 or\n greater than largest int184).\n Counterpart to Solidity's `int184` operator.\n Requirements:\n - input must fit into 184 bits" + }, + "id": 11090, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt184", + "nameLocation": "22072:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11068, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11067, + "mutability": "mutable", + "name": "value", + "nameLocation": "22088:5:53", + "nodeType": "VariableDeclaration", + "scope": 11090, + "src": "22081:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11066, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "22081:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "22080:14:53" + }, + "returnParameters": { + "id": 11071, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11070, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "22125:10:53", + "nodeType": "VariableDeclaration", + "scope": 11090, + "src": "22118:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int184", + "typeString": "int184" + }, + "typeName": { + "id": 11069, + "name": "int184", + "nodeType": "ElementaryTypeName", + "src": "22118:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int184", + "typeString": "int184" + } + }, + "visibility": "internal" + } + ], + "src": "22117:19:53" + }, + "scope": 11703, + "src": "22063:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11115, + "nodeType": "Block", + "src": "22684:150:53", + "statements": [ + { + "expression": { + "id": 11103, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11098, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11096, + "src": "22694:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int176", + "typeString": "int176" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11101, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11093, + "src": "22714:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "22707:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int176_$", + "typeString": "type(int176)" + }, + "typeName": { + "id": 11099, + "name": "int176", + "nodeType": "ElementaryTypeName", + "src": "22707:6:53", + "typeDescriptions": {} + } + }, + "id": 11102, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22707:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int176", + "typeString": "int176" + } + }, + "src": "22694:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int176", + "typeString": "int176" + } + }, + "id": 11104, + "nodeType": "ExpressionStatement", + "src": "22694:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11107, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11105, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11096, + "src": "22734:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int176", + "typeString": "int176" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11106, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11093, + "src": "22748:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "22734:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11114, + "nodeType": "IfStatement", + "src": "22730:98:53", + "trueBody": { + "id": 11113, + "nodeType": "Block", + "src": "22755:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313736", + "id": 11109, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22806:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_176_by_1", + "typeString": "int_const 176" + }, + "value": "176" + }, + { + "id": 11110, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11093, + "src": "22811:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_176_by_1", + "typeString": "int_const 176" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11108, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "22776:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11111, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22776:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11112, + "nodeType": "RevertStatement", + "src": "22769:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11091, + "nodeType": "StructuredDocumentation", + "src": "22293:312:53", + "text": " @dev Returns the downcasted int176 from int256, reverting on\n overflow (when the input is less than smallest int176 or\n greater than largest int176).\n Counterpart to Solidity's `int176` operator.\n Requirements:\n - input must fit into 176 bits" + }, + "id": 11116, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt176", + "nameLocation": "22619:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11094, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11093, + "mutability": "mutable", + "name": "value", + "nameLocation": "22635:5:53", + "nodeType": "VariableDeclaration", + "scope": 11116, + "src": "22628:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11092, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "22628:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "22627:14:53" + }, + "returnParameters": { + "id": 11097, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11096, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "22672:10:53", + "nodeType": "VariableDeclaration", + "scope": 11116, + "src": "22665:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int176", + "typeString": "int176" + }, + "typeName": { + "id": 11095, + "name": "int176", + "nodeType": "ElementaryTypeName", + "src": "22665:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int176", + "typeString": "int176" + } + }, + "visibility": "internal" + } + ], + "src": "22664:19:53" + }, + "scope": 11703, + "src": "22610:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11141, + "nodeType": "Block", + "src": "23231:150:53", + "statements": [ + { + "expression": { + "id": 11129, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11124, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11122, + "src": "23241:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int168", + "typeString": "int168" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11127, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11119, + "src": "23261:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11126, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "23254:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int168_$", + "typeString": "type(int168)" + }, + "typeName": { + "id": 11125, + "name": "int168", + "nodeType": "ElementaryTypeName", + "src": "23254:6:53", + "typeDescriptions": {} + } + }, + "id": 11128, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23254:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int168", + "typeString": "int168" + } + }, + "src": "23241:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int168", + "typeString": "int168" + } + }, + "id": 11130, + "nodeType": "ExpressionStatement", + "src": "23241:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11133, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11131, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11122, + "src": "23281:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int168", + "typeString": "int168" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11132, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11119, + "src": "23295:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "23281:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11140, + "nodeType": "IfStatement", + "src": "23277:98:53", + "trueBody": { + "id": 11139, + "nodeType": "Block", + "src": "23302:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313638", + "id": 11135, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "23353:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_168_by_1", + "typeString": "int_const 168" + }, + "value": "168" + }, + { + "id": 11136, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11119, + "src": "23358:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_168_by_1", + "typeString": "int_const 168" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11134, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "23323:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23323:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11138, + "nodeType": "RevertStatement", + "src": "23316:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11117, + "nodeType": "StructuredDocumentation", + "src": "22840:312:53", + "text": " @dev Returns the downcasted int168 from int256, reverting on\n overflow (when the input is less than smallest int168 or\n greater than largest int168).\n Counterpart to Solidity's `int168` operator.\n Requirements:\n - input must fit into 168 bits" + }, + "id": 11142, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt168", + "nameLocation": "23166:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11120, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11119, + "mutability": "mutable", + "name": "value", + "nameLocation": "23182:5:53", + "nodeType": "VariableDeclaration", + "scope": 11142, + "src": "23175:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11118, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "23175:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "23174:14:53" + }, + "returnParameters": { + "id": 11123, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11122, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "23219:10:53", + "nodeType": "VariableDeclaration", + "scope": 11142, + "src": "23212:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int168", + "typeString": "int168" + }, + "typeName": { + "id": 11121, + "name": "int168", + "nodeType": "ElementaryTypeName", + "src": "23212:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int168", + "typeString": "int168" + } + }, + "visibility": "internal" + } + ], + "src": "23211:19:53" + }, + "scope": 11703, + "src": "23157:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11167, + "nodeType": "Block", + "src": "23778:150:53", + "statements": [ + { + "expression": { + "id": 11155, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11150, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11148, + "src": "23788:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int160", + "typeString": "int160" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11153, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11145, + "src": "23808:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11152, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "23801:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int160_$", + "typeString": "type(int160)" + }, + "typeName": { + "id": 11151, + "name": "int160", + "nodeType": "ElementaryTypeName", + "src": "23801:6:53", + "typeDescriptions": {} + } + }, + "id": 11154, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23801:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int160", + "typeString": "int160" + } + }, + "src": "23788:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int160", + "typeString": "int160" + } + }, + "id": 11156, + "nodeType": "ExpressionStatement", + "src": "23788:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11159, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11157, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11148, + "src": "23828:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int160", + "typeString": "int160" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11158, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11145, + "src": "23842:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "23828:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11166, + "nodeType": "IfStatement", + "src": "23824:98:53", + "trueBody": { + "id": 11165, + "nodeType": "Block", + "src": "23849:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313630", + "id": 11161, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "23900:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_160_by_1", + "typeString": "int_const 160" + }, + "value": "160" + }, + { + "id": 11162, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11145, + "src": "23905:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_160_by_1", + "typeString": "int_const 160" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11160, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "23870:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11163, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23870:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11164, + "nodeType": "RevertStatement", + "src": "23863:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11143, + "nodeType": "StructuredDocumentation", + "src": "23387:312:53", + "text": " @dev Returns the downcasted int160 from int256, reverting on\n overflow (when the input is less than smallest int160 or\n greater than largest int160).\n Counterpart to Solidity's `int160` operator.\n Requirements:\n - input must fit into 160 bits" + }, + "id": 11168, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt160", + "nameLocation": "23713:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11146, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11145, + "mutability": "mutable", + "name": "value", + "nameLocation": "23729:5:53", + "nodeType": "VariableDeclaration", + "scope": 11168, + "src": "23722:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11144, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "23722:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "23721:14:53" + }, + "returnParameters": { + "id": 11149, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11148, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "23766:10:53", + "nodeType": "VariableDeclaration", + "scope": 11168, + "src": "23759:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int160", + "typeString": "int160" + }, + "typeName": { + "id": 11147, + "name": "int160", + "nodeType": "ElementaryTypeName", + "src": "23759:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int160", + "typeString": "int160" + } + }, + "visibility": "internal" + } + ], + "src": "23758:19:53" + }, + "scope": 11703, + "src": "23704:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11193, + "nodeType": "Block", + "src": "24325:150:53", + "statements": [ + { + "expression": { + "id": 11181, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11176, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11174, + "src": "24335:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int152", + "typeString": "int152" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11179, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11171, + "src": "24355:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11178, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "24348:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int152_$", + "typeString": "type(int152)" + }, + "typeName": { + "id": 11177, + "name": "int152", + "nodeType": "ElementaryTypeName", + "src": "24348:6:53", + "typeDescriptions": {} + } + }, + "id": 11180, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24348:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int152", + "typeString": "int152" + } + }, + "src": "24335:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int152", + "typeString": "int152" + } + }, + "id": 11182, + "nodeType": "ExpressionStatement", + "src": "24335:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11185, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11183, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11174, + "src": "24375:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int152", + "typeString": "int152" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11184, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11171, + "src": "24389:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "24375:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11192, + "nodeType": "IfStatement", + "src": "24371:98:53", + "trueBody": { + "id": 11191, + "nodeType": "Block", + "src": "24396:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313532", + "id": 11187, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "24447:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_152_by_1", + "typeString": "int_const 152" + }, + "value": "152" + }, + { + "id": 11188, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11171, + "src": "24452:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_152_by_1", + "typeString": "int_const 152" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11186, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "24417:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11189, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24417:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11190, + "nodeType": "RevertStatement", + "src": "24410:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11169, + "nodeType": "StructuredDocumentation", + "src": "23934:312:53", + "text": " @dev Returns the downcasted int152 from int256, reverting on\n overflow (when the input is less than smallest int152 or\n greater than largest int152).\n Counterpart to Solidity's `int152` operator.\n Requirements:\n - input must fit into 152 bits" + }, + "id": 11194, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt152", + "nameLocation": "24260:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11172, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11171, + "mutability": "mutable", + "name": "value", + "nameLocation": "24276:5:53", + "nodeType": "VariableDeclaration", + "scope": 11194, + "src": "24269:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11170, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "24269:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "24268:14:53" + }, + "returnParameters": { + "id": 11175, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11174, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "24313:10:53", + "nodeType": "VariableDeclaration", + "scope": 11194, + "src": "24306:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int152", + "typeString": "int152" + }, + "typeName": { + "id": 11173, + "name": "int152", + "nodeType": "ElementaryTypeName", + "src": "24306:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int152", + "typeString": "int152" + } + }, + "visibility": "internal" + } + ], + "src": "24305:19:53" + }, + "scope": 11703, + "src": "24251:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11219, + "nodeType": "Block", + "src": "24872:150:53", + "statements": [ + { + "expression": { + "id": 11207, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11202, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11200, + "src": "24882:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int144", + "typeString": "int144" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11205, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11197, + "src": "24902:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11204, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "24895:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int144_$", + "typeString": "type(int144)" + }, + "typeName": { + "id": 11203, + "name": "int144", + "nodeType": "ElementaryTypeName", + "src": "24895:6:53", + "typeDescriptions": {} + } + }, + "id": 11206, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24895:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int144", + "typeString": "int144" + } + }, + "src": "24882:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int144", + "typeString": "int144" + } + }, + "id": 11208, + "nodeType": "ExpressionStatement", + "src": "24882:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11211, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11209, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11200, + "src": "24922:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int144", + "typeString": "int144" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11210, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11197, + "src": "24936:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "24922:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11218, + "nodeType": "IfStatement", + "src": "24918:98:53", + "trueBody": { + "id": 11217, + "nodeType": "Block", + "src": "24943:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313434", + "id": 11213, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "24994:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_144_by_1", + "typeString": "int_const 144" + }, + "value": "144" + }, + { + "id": 11214, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11197, + "src": "24999:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_144_by_1", + "typeString": "int_const 144" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11212, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "24964:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11215, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24964:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11216, + "nodeType": "RevertStatement", + "src": "24957:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11195, + "nodeType": "StructuredDocumentation", + "src": "24481:312:53", + "text": " @dev Returns the downcasted int144 from int256, reverting on\n overflow (when the input is less than smallest int144 or\n greater than largest int144).\n Counterpart to Solidity's `int144` operator.\n Requirements:\n - input must fit into 144 bits" + }, + "id": 11220, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt144", + "nameLocation": "24807:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11198, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11197, + "mutability": "mutable", + "name": "value", + "nameLocation": "24823:5:53", + "nodeType": "VariableDeclaration", + "scope": 11220, + "src": "24816:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11196, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "24816:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "24815:14:53" + }, + "returnParameters": { + "id": 11201, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11200, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "24860:10:53", + "nodeType": "VariableDeclaration", + "scope": 11220, + "src": "24853:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int144", + "typeString": "int144" + }, + "typeName": { + "id": 11199, + "name": "int144", + "nodeType": "ElementaryTypeName", + "src": "24853:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int144", + "typeString": "int144" + } + }, + "visibility": "internal" + } + ], + "src": "24852:19:53" + }, + "scope": 11703, + "src": "24798:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11245, + "nodeType": "Block", + "src": "25419:150:53", + "statements": [ + { + "expression": { + "id": 11233, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11228, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11226, + "src": "25429:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int136", + "typeString": "int136" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11231, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11223, + "src": "25449:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11230, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "25442:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int136_$", + "typeString": "type(int136)" + }, + "typeName": { + "id": 11229, + "name": "int136", + "nodeType": "ElementaryTypeName", + "src": "25442:6:53", + "typeDescriptions": {} + } + }, + "id": 11232, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25442:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int136", + "typeString": "int136" + } + }, + "src": "25429:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int136", + "typeString": "int136" + } + }, + "id": 11234, + "nodeType": "ExpressionStatement", + "src": "25429:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11237, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11235, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11226, + "src": "25469:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int136", + "typeString": "int136" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11236, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11223, + "src": "25483:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "25469:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11244, + "nodeType": "IfStatement", + "src": "25465:98:53", + "trueBody": { + "id": 11243, + "nodeType": "Block", + "src": "25490:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313336", + "id": 11239, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25541:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_136_by_1", + "typeString": "int_const 136" + }, + "value": "136" + }, + { + "id": 11240, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11223, + "src": "25546:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_136_by_1", + "typeString": "int_const 136" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11238, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "25511:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11241, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25511:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11242, + "nodeType": "RevertStatement", + "src": "25504:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11221, + "nodeType": "StructuredDocumentation", + "src": "25028:312:53", + "text": " @dev Returns the downcasted int136 from int256, reverting on\n overflow (when the input is less than smallest int136 or\n greater than largest int136).\n Counterpart to Solidity's `int136` operator.\n Requirements:\n - input must fit into 136 bits" + }, + "id": 11246, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt136", + "nameLocation": "25354:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11224, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11223, + "mutability": "mutable", + "name": "value", + "nameLocation": "25370:5:53", + "nodeType": "VariableDeclaration", + "scope": 11246, + "src": "25363:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11222, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "25363:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "25362:14:53" + }, + "returnParameters": { + "id": 11227, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11226, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "25407:10:53", + "nodeType": "VariableDeclaration", + "scope": 11246, + "src": "25400:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int136", + "typeString": "int136" + }, + "typeName": { + "id": 11225, + "name": "int136", + "nodeType": "ElementaryTypeName", + "src": "25400:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int136", + "typeString": "int136" + } + }, + "visibility": "internal" + } + ], + "src": "25399:19:53" + }, + "scope": 11703, + "src": "25345:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11271, + "nodeType": "Block", + "src": "25966:150:53", + "statements": [ + { + "expression": { + "id": 11259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11254, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11252, + "src": "25976:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int128", + "typeString": "int128" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11257, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11249, + "src": "25996:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11256, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "25989:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int128_$", + "typeString": "type(int128)" + }, + "typeName": { + "id": 11255, + "name": "int128", + "nodeType": "ElementaryTypeName", + "src": "25989:6:53", + "typeDescriptions": {} + } + }, + "id": 11258, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25989:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int128", + "typeString": "int128" + } + }, + "src": "25976:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int128", + "typeString": "int128" + } + }, + "id": 11260, + "nodeType": "ExpressionStatement", + "src": "25976:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11263, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11261, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11252, + "src": "26016:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int128", + "typeString": "int128" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11262, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11249, + "src": "26030:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "26016:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11270, + "nodeType": "IfStatement", + "src": "26012:98:53", + "trueBody": { + "id": 11269, + "nodeType": "Block", + "src": "26037:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313238", + "id": 11265, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26088:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_128_by_1", + "typeString": "int_const 128" + }, + "value": "128" + }, + { + "id": 11266, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11249, + "src": "26093:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_128_by_1", + "typeString": "int_const 128" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11264, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "26058:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11267, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26058:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11268, + "nodeType": "RevertStatement", + "src": "26051:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11247, + "nodeType": "StructuredDocumentation", + "src": "25575:312:53", + "text": " @dev Returns the downcasted int128 from int256, reverting on\n overflow (when the input is less than smallest int128 or\n greater than largest int128).\n Counterpart to Solidity's `int128` operator.\n Requirements:\n - input must fit into 128 bits" + }, + "id": 11272, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt128", + "nameLocation": "25901:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11250, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11249, + "mutability": "mutable", + "name": "value", + "nameLocation": "25917:5:53", + "nodeType": "VariableDeclaration", + "scope": 11272, + "src": "25910:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11248, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "25910:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "25909:14:53" + }, + "returnParameters": { + "id": 11253, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11252, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "25954:10:53", + "nodeType": "VariableDeclaration", + "scope": 11272, + "src": "25947:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int128", + "typeString": "int128" + }, + "typeName": { + "id": 11251, + "name": "int128", + "nodeType": "ElementaryTypeName", + "src": "25947:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int128", + "typeString": "int128" + } + }, + "visibility": "internal" + } + ], + "src": "25946:19:53" + }, + "scope": 11703, + "src": "25892:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11297, + "nodeType": "Block", + "src": "26513:150:53", + "statements": [ + { + "expression": { + "id": 11285, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11280, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11278, + "src": "26523:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int120", + "typeString": "int120" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11283, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11275, + "src": "26543:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11282, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "26536:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int120_$", + "typeString": "type(int120)" + }, + "typeName": { + "id": 11281, + "name": "int120", + "nodeType": "ElementaryTypeName", + "src": "26536:6:53", + "typeDescriptions": {} + } + }, + "id": 11284, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26536:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int120", + "typeString": "int120" + } + }, + "src": "26523:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int120", + "typeString": "int120" + } + }, + "id": 11286, + "nodeType": "ExpressionStatement", + "src": "26523:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11289, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11287, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11278, + "src": "26563:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int120", + "typeString": "int120" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11288, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11275, + "src": "26577:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "26563:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11296, + "nodeType": "IfStatement", + "src": "26559:98:53", + "trueBody": { + "id": 11295, + "nodeType": "Block", + "src": "26584:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313230", + "id": 11291, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26635:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_120_by_1", + "typeString": "int_const 120" + }, + "value": "120" + }, + { + "id": 11292, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11275, + "src": "26640:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_120_by_1", + "typeString": "int_const 120" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11290, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "26605:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11293, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26605:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11294, + "nodeType": "RevertStatement", + "src": "26598:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11273, + "nodeType": "StructuredDocumentation", + "src": "26122:312:53", + "text": " @dev Returns the downcasted int120 from int256, reverting on\n overflow (when the input is less than smallest int120 or\n greater than largest int120).\n Counterpart to Solidity's `int120` operator.\n Requirements:\n - input must fit into 120 bits" + }, + "id": 11298, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt120", + "nameLocation": "26448:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11276, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11275, + "mutability": "mutable", + "name": "value", + "nameLocation": "26464:5:53", + "nodeType": "VariableDeclaration", + "scope": 11298, + "src": "26457:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11274, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "26457:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "26456:14:53" + }, + "returnParameters": { + "id": 11279, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11278, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "26501:10:53", + "nodeType": "VariableDeclaration", + "scope": 11298, + "src": "26494:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int120", + "typeString": "int120" + }, + "typeName": { + "id": 11277, + "name": "int120", + "nodeType": "ElementaryTypeName", + "src": "26494:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int120", + "typeString": "int120" + } + }, + "visibility": "internal" + } + ], + "src": "26493:19:53" + }, + "scope": 11703, + "src": "26439:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11323, + "nodeType": "Block", + "src": "27060:150:53", + "statements": [ + { + "expression": { + "id": 11311, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11306, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11304, + "src": "27070:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int112", + "typeString": "int112" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11309, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11301, + "src": "27090:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11308, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "27083:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int112_$", + "typeString": "type(int112)" + }, + "typeName": { + "id": 11307, + "name": "int112", + "nodeType": "ElementaryTypeName", + "src": "27083:6:53", + "typeDescriptions": {} + } + }, + "id": 11310, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27083:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int112", + "typeString": "int112" + } + }, + "src": "27070:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int112", + "typeString": "int112" + } + }, + "id": 11312, + "nodeType": "ExpressionStatement", + "src": "27070:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11313, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11304, + "src": "27110:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int112", + "typeString": "int112" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11314, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11301, + "src": "27124:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "27110:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11322, + "nodeType": "IfStatement", + "src": "27106:98:53", + "trueBody": { + "id": 11321, + "nodeType": "Block", + "src": "27131:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313132", + "id": 11317, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "27182:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_112_by_1", + "typeString": "int_const 112" + }, + "value": "112" + }, + { + "id": 11318, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11301, + "src": "27187:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_112_by_1", + "typeString": "int_const 112" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11316, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "27152:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11319, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27152:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11320, + "nodeType": "RevertStatement", + "src": "27145:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11299, + "nodeType": "StructuredDocumentation", + "src": "26669:312:53", + "text": " @dev Returns the downcasted int112 from int256, reverting on\n overflow (when the input is less than smallest int112 or\n greater than largest int112).\n Counterpart to Solidity's `int112` operator.\n Requirements:\n - input must fit into 112 bits" + }, + "id": 11324, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt112", + "nameLocation": "26995:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11302, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11301, + "mutability": "mutable", + "name": "value", + "nameLocation": "27011:5:53", + "nodeType": "VariableDeclaration", + "scope": 11324, + "src": "27004:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11300, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "27004:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "27003:14:53" + }, + "returnParameters": { + "id": 11305, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11304, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "27048:10:53", + "nodeType": "VariableDeclaration", + "scope": 11324, + "src": "27041:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int112", + "typeString": "int112" + }, + "typeName": { + "id": 11303, + "name": "int112", + "nodeType": "ElementaryTypeName", + "src": "27041:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int112", + "typeString": "int112" + } + }, + "visibility": "internal" + } + ], + "src": "27040:19:53" + }, + "scope": 11703, + "src": "26986:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11349, + "nodeType": "Block", + "src": "27607:150:53", + "statements": [ + { + "expression": { + "id": 11337, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11332, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11330, + "src": "27617:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int104", + "typeString": "int104" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11335, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11327, + "src": "27637:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11334, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "27630:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int104_$", + "typeString": "type(int104)" + }, + "typeName": { + "id": 11333, + "name": "int104", + "nodeType": "ElementaryTypeName", + "src": "27630:6:53", + "typeDescriptions": {} + } + }, + "id": 11336, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27630:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int104", + "typeString": "int104" + } + }, + "src": "27617:26:53", + "typeDescriptions": { + "typeIdentifier": "t_int104", + "typeString": "int104" + } + }, + "id": 11338, + "nodeType": "ExpressionStatement", + "src": "27617:26:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11341, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11339, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11330, + "src": "27657:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int104", + "typeString": "int104" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11340, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11327, + "src": "27671:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "27657:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11348, + "nodeType": "IfStatement", + "src": "27653:98:53", + "trueBody": { + "id": 11347, + "nodeType": "Block", + "src": "27678:73:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "313034", + "id": 11343, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "27729:3:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_104_by_1", + "typeString": "int_const 104" + }, + "value": "104" + }, + { + "id": 11344, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11327, + "src": "27734:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_104_by_1", + "typeString": "int_const 104" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11342, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "27699:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11345, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27699:41:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11346, + "nodeType": "RevertStatement", + "src": "27692:48:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11325, + "nodeType": "StructuredDocumentation", + "src": "27216:312:53", + "text": " @dev Returns the downcasted int104 from int256, reverting on\n overflow (when the input is less than smallest int104 or\n greater than largest int104).\n Counterpart to Solidity's `int104` operator.\n Requirements:\n - input must fit into 104 bits" + }, + "id": 11350, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt104", + "nameLocation": "27542:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11328, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11327, + "mutability": "mutable", + "name": "value", + "nameLocation": "27558:5:53", + "nodeType": "VariableDeclaration", + "scope": 11350, + "src": "27551:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11326, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "27551:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "27550:14:53" + }, + "returnParameters": { + "id": 11331, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11330, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "27595:10:53", + "nodeType": "VariableDeclaration", + "scope": 11350, + "src": "27588:17:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int104", + "typeString": "int104" + }, + "typeName": { + "id": 11329, + "name": "int104", + "nodeType": "ElementaryTypeName", + "src": "27588:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int104", + "typeString": "int104" + } + }, + "visibility": "internal" + } + ], + "src": "27587:19:53" + }, + "scope": 11703, + "src": "27533:224:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11375, + "nodeType": "Block", + "src": "28147:148:53", + "statements": [ + { + "expression": { + "id": 11363, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11358, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11356, + "src": "28157:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int96", + "typeString": "int96" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11361, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11353, + "src": "28176:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11360, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "28170:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int96_$", + "typeString": "type(int96)" + }, + "typeName": { + "id": 11359, + "name": "int96", + "nodeType": "ElementaryTypeName", + "src": "28170:5:53", + "typeDescriptions": {} + } + }, + "id": 11362, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28170:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int96", + "typeString": "int96" + } + }, + "src": "28157:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int96", + "typeString": "int96" + } + }, + "id": 11364, + "nodeType": "ExpressionStatement", + "src": "28157:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11367, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11365, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11356, + "src": "28196:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int96", + "typeString": "int96" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11366, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11353, + "src": "28210:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "28196:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11374, + "nodeType": "IfStatement", + "src": "28192:97:53", + "trueBody": { + "id": 11373, + "nodeType": "Block", + "src": "28217:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3936", + "id": 11369, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "28268:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "value": "96" + }, + { + "id": 11370, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11353, + "src": "28272:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11368, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "28238:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28238:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11372, + "nodeType": "RevertStatement", + "src": "28231:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11351, + "nodeType": "StructuredDocumentation", + "src": "27763:307:53", + "text": " @dev Returns the downcasted int96 from int256, reverting on\n overflow (when the input is less than smallest int96 or\n greater than largest int96).\n Counterpart to Solidity's `int96` operator.\n Requirements:\n - input must fit into 96 bits" + }, + "id": 11376, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt96", + "nameLocation": "28084:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11354, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11353, + "mutability": "mutable", + "name": "value", + "nameLocation": "28099:5:53", + "nodeType": "VariableDeclaration", + "scope": 11376, + "src": "28092:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11352, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "28092:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "28091:14:53" + }, + "returnParameters": { + "id": 11357, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11356, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "28135:10:53", + "nodeType": "VariableDeclaration", + "scope": 11376, + "src": "28129:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int96", + "typeString": "int96" + }, + "typeName": { + "id": 11355, + "name": "int96", + "nodeType": "ElementaryTypeName", + "src": "28129:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int96", + "typeString": "int96" + } + }, + "visibility": "internal" + } + ], + "src": "28128:18:53" + }, + "scope": 11703, + "src": "28075:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11401, + "nodeType": "Block", + "src": "28685:148:53", + "statements": [ + { + "expression": { + "id": 11389, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11384, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11382, + "src": "28695:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int88", + "typeString": "int88" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11387, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11379, + "src": "28714:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11386, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "28708:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int88_$", + "typeString": "type(int88)" + }, + "typeName": { + "id": 11385, + "name": "int88", + "nodeType": "ElementaryTypeName", + "src": "28708:5:53", + "typeDescriptions": {} + } + }, + "id": 11388, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28708:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int88", + "typeString": "int88" + } + }, + "src": "28695:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int88", + "typeString": "int88" + } + }, + "id": 11390, + "nodeType": "ExpressionStatement", + "src": "28695:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11393, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11391, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11382, + "src": "28734:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int88", + "typeString": "int88" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11392, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11379, + "src": "28748:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "28734:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11400, + "nodeType": "IfStatement", + "src": "28730:97:53", + "trueBody": { + "id": 11399, + "nodeType": "Block", + "src": "28755:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3838", + "id": 11395, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "28806:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_88_by_1", + "typeString": "int_const 88" + }, + "value": "88" + }, + { + "id": 11396, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11379, + "src": "28810:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_88_by_1", + "typeString": "int_const 88" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11394, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "28776:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11397, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "28776:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11398, + "nodeType": "RevertStatement", + "src": "28769:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11377, + "nodeType": "StructuredDocumentation", + "src": "28301:307:53", + "text": " @dev Returns the downcasted int88 from int256, reverting on\n overflow (when the input is less than smallest int88 or\n greater than largest int88).\n Counterpart to Solidity's `int88` operator.\n Requirements:\n - input must fit into 88 bits" + }, + "id": 11402, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt88", + "nameLocation": "28622:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11380, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11379, + "mutability": "mutable", + "name": "value", + "nameLocation": "28637:5:53", + "nodeType": "VariableDeclaration", + "scope": 11402, + "src": "28630:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11378, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "28630:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "28629:14:53" + }, + "returnParameters": { + "id": 11383, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11382, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "28673:10:53", + "nodeType": "VariableDeclaration", + "scope": 11402, + "src": "28667:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int88", + "typeString": "int88" + }, + "typeName": { + "id": 11381, + "name": "int88", + "nodeType": "ElementaryTypeName", + "src": "28667:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int88", + "typeString": "int88" + } + }, + "visibility": "internal" + } + ], + "src": "28666:18:53" + }, + "scope": 11703, + "src": "28613:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11427, + "nodeType": "Block", + "src": "29223:148:53", + "statements": [ + { + "expression": { + "id": 11415, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11410, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11408, + "src": "29233:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int80", + "typeString": "int80" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11413, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11405, + "src": "29252:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11412, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "29246:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int80_$", + "typeString": "type(int80)" + }, + "typeName": { + "id": 11411, + "name": "int80", + "nodeType": "ElementaryTypeName", + "src": "29246:5:53", + "typeDescriptions": {} + } + }, + "id": 11414, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "29246:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int80", + "typeString": "int80" + } + }, + "src": "29233:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int80", + "typeString": "int80" + } + }, + "id": 11416, + "nodeType": "ExpressionStatement", + "src": "29233:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11419, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11417, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11408, + "src": "29272:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int80", + "typeString": "int80" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11418, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11405, + "src": "29286:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "29272:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11426, + "nodeType": "IfStatement", + "src": "29268:97:53", + "trueBody": { + "id": 11425, + "nodeType": "Block", + "src": "29293:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3830", + "id": 11421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29344:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_80_by_1", + "typeString": "int_const 80" + }, + "value": "80" + }, + { + "id": 11422, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11405, + "src": "29348:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_80_by_1", + "typeString": "int_const 80" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11420, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "29314:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11423, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "29314:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11424, + "nodeType": "RevertStatement", + "src": "29307:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11403, + "nodeType": "StructuredDocumentation", + "src": "28839:307:53", + "text": " @dev Returns the downcasted int80 from int256, reverting on\n overflow (when the input is less than smallest int80 or\n greater than largest int80).\n Counterpart to Solidity's `int80` operator.\n Requirements:\n - input must fit into 80 bits" + }, + "id": 11428, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt80", + "nameLocation": "29160:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11406, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11405, + "mutability": "mutable", + "name": "value", + "nameLocation": "29175:5:53", + "nodeType": "VariableDeclaration", + "scope": 11428, + "src": "29168:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11404, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "29168:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "29167:14:53" + }, + "returnParameters": { + "id": 11409, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11408, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "29211:10:53", + "nodeType": "VariableDeclaration", + "scope": 11428, + "src": "29205:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int80", + "typeString": "int80" + }, + "typeName": { + "id": 11407, + "name": "int80", + "nodeType": "ElementaryTypeName", + "src": "29205:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int80", + "typeString": "int80" + } + }, + "visibility": "internal" + } + ], + "src": "29204:18:53" + }, + "scope": 11703, + "src": "29151:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11453, + "nodeType": "Block", + "src": "29761:148:53", + "statements": [ + { + "expression": { + "id": 11441, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11436, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11434, + "src": "29771:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int72", + "typeString": "int72" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11439, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11431, + "src": "29790:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11438, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "29784:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int72_$", + "typeString": "type(int72)" + }, + "typeName": { + "id": 11437, + "name": "int72", + "nodeType": "ElementaryTypeName", + "src": "29784:5:53", + "typeDescriptions": {} + } + }, + "id": 11440, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "29784:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int72", + "typeString": "int72" + } + }, + "src": "29771:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int72", + "typeString": "int72" + } + }, + "id": 11442, + "nodeType": "ExpressionStatement", + "src": "29771:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11445, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11443, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11434, + "src": "29810:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int72", + "typeString": "int72" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11444, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11431, + "src": "29824:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "29810:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11452, + "nodeType": "IfStatement", + "src": "29806:97:53", + "trueBody": { + "id": 11451, + "nodeType": "Block", + "src": "29831:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3732", + "id": 11447, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "29882:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_72_by_1", + "typeString": "int_const 72" + }, + "value": "72" + }, + { + "id": 11448, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11431, + "src": "29886:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_72_by_1", + "typeString": "int_const 72" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11446, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "29852:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11449, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "29852:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11450, + "nodeType": "RevertStatement", + "src": "29845:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11429, + "nodeType": "StructuredDocumentation", + "src": "29377:307:53", + "text": " @dev Returns the downcasted int72 from int256, reverting on\n overflow (when the input is less than smallest int72 or\n greater than largest int72).\n Counterpart to Solidity's `int72` operator.\n Requirements:\n - input must fit into 72 bits" + }, + "id": 11454, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt72", + "nameLocation": "29698:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11432, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11431, + "mutability": "mutable", + "name": "value", + "nameLocation": "29713:5:53", + "nodeType": "VariableDeclaration", + "scope": 11454, + "src": "29706:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11430, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "29706:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "29705:14:53" + }, + "returnParameters": { + "id": 11435, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11434, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "29749:10:53", + "nodeType": "VariableDeclaration", + "scope": 11454, + "src": "29743:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int72", + "typeString": "int72" + }, + "typeName": { + "id": 11433, + "name": "int72", + "nodeType": "ElementaryTypeName", + "src": "29743:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int72", + "typeString": "int72" + } + }, + "visibility": "internal" + } + ], + "src": "29742:18:53" + }, + "scope": 11703, + "src": "29689:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11479, + "nodeType": "Block", + "src": "30299:148:53", + "statements": [ + { + "expression": { + "id": 11467, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11462, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11460, + "src": "30309:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int64", + "typeString": "int64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11465, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11457, + "src": "30328:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11464, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "30322:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int64_$", + "typeString": "type(int64)" + }, + "typeName": { + "id": 11463, + "name": "int64", + "nodeType": "ElementaryTypeName", + "src": "30322:5:53", + "typeDescriptions": {} + } + }, + "id": 11466, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30322:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int64", + "typeString": "int64" + } + }, + "src": "30309:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int64", + "typeString": "int64" + } + }, + "id": 11468, + "nodeType": "ExpressionStatement", + "src": "30309:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11471, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11469, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11460, + "src": "30348:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int64", + "typeString": "int64" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11470, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11457, + "src": "30362:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "30348:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11478, + "nodeType": "IfStatement", + "src": "30344:97:53", + "trueBody": { + "id": 11477, + "nodeType": "Block", + "src": "30369:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3634", + "id": 11473, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "30420:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + }, + { + "id": 11474, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11457, + "src": "30424:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11472, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "30390:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11475, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30390:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11476, + "nodeType": "RevertStatement", + "src": "30383:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11455, + "nodeType": "StructuredDocumentation", + "src": "29915:307:53", + "text": " @dev Returns the downcasted int64 from int256, reverting on\n overflow (when the input is less than smallest int64 or\n greater than largest int64).\n Counterpart to Solidity's `int64` operator.\n Requirements:\n - input must fit into 64 bits" + }, + "id": 11480, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt64", + "nameLocation": "30236:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11458, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11457, + "mutability": "mutable", + "name": "value", + "nameLocation": "30251:5:53", + "nodeType": "VariableDeclaration", + "scope": 11480, + "src": "30244:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11456, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "30244:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "30243:14:53" + }, + "returnParameters": { + "id": 11461, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11460, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "30287:10:53", + "nodeType": "VariableDeclaration", + "scope": 11480, + "src": "30281:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int64", + "typeString": "int64" + }, + "typeName": { + "id": 11459, + "name": "int64", + "nodeType": "ElementaryTypeName", + "src": "30281:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int64", + "typeString": "int64" + } + }, + "visibility": "internal" + } + ], + "src": "30280:18:53" + }, + "scope": 11703, + "src": "30227:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11505, + "nodeType": "Block", + "src": "30837:148:53", + "statements": [ + { + "expression": { + "id": 11493, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11488, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11486, + "src": "30847:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int56", + "typeString": "int56" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11491, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11483, + "src": "30866:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11490, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "30860:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int56_$", + "typeString": "type(int56)" + }, + "typeName": { + "id": 11489, + "name": "int56", + "nodeType": "ElementaryTypeName", + "src": "30860:5:53", + "typeDescriptions": {} + } + }, + "id": 11492, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30860:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int56", + "typeString": "int56" + } + }, + "src": "30847:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int56", + "typeString": "int56" + } + }, + "id": 11494, + "nodeType": "ExpressionStatement", + "src": "30847:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11497, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11495, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11486, + "src": "30886:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int56", + "typeString": "int56" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11496, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11483, + "src": "30900:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "30886:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11504, + "nodeType": "IfStatement", + "src": "30882:97:53", + "trueBody": { + "id": 11503, + "nodeType": "Block", + "src": "30907:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3536", + "id": 11499, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "30958:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_56_by_1", + "typeString": "int_const 56" + }, + "value": "56" + }, + { + "id": 11500, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11483, + "src": "30962:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_56_by_1", + "typeString": "int_const 56" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11498, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "30928:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "30928:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11502, + "nodeType": "RevertStatement", + "src": "30921:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11481, + "nodeType": "StructuredDocumentation", + "src": "30453:307:53", + "text": " @dev Returns the downcasted int56 from int256, reverting on\n overflow (when the input is less than smallest int56 or\n greater than largest int56).\n Counterpart to Solidity's `int56` operator.\n Requirements:\n - input must fit into 56 bits" + }, + "id": 11506, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt56", + "nameLocation": "30774:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11484, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11483, + "mutability": "mutable", + "name": "value", + "nameLocation": "30789:5:53", + "nodeType": "VariableDeclaration", + "scope": 11506, + "src": "30782:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11482, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "30782:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "30781:14:53" + }, + "returnParameters": { + "id": 11487, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11486, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "30825:10:53", + "nodeType": "VariableDeclaration", + "scope": 11506, + "src": "30819:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int56", + "typeString": "int56" + }, + "typeName": { + "id": 11485, + "name": "int56", + "nodeType": "ElementaryTypeName", + "src": "30819:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int56", + "typeString": "int56" + } + }, + "visibility": "internal" + } + ], + "src": "30818:18:53" + }, + "scope": 11703, + "src": "30765:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11531, + "nodeType": "Block", + "src": "31375:148:53", + "statements": [ + { + "expression": { + "id": 11519, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11514, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11512, + "src": "31385:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int48", + "typeString": "int48" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11517, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11509, + "src": "31404:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11516, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "31398:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int48_$", + "typeString": "type(int48)" + }, + "typeName": { + "id": 11515, + "name": "int48", + "nodeType": "ElementaryTypeName", + "src": "31398:5:53", + "typeDescriptions": {} + } + }, + "id": 11518, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31398:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int48", + "typeString": "int48" + } + }, + "src": "31385:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int48", + "typeString": "int48" + } + }, + "id": 11520, + "nodeType": "ExpressionStatement", + "src": "31385:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11523, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11521, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11512, + "src": "31424:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int48", + "typeString": "int48" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11522, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11509, + "src": "31438:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "31424:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11530, + "nodeType": "IfStatement", + "src": "31420:97:53", + "trueBody": { + "id": 11529, + "nodeType": "Block", + "src": "31445:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3438", + "id": 11525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "31496:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_48_by_1", + "typeString": "int_const 48" + }, + "value": "48" + }, + { + "id": 11526, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11509, + "src": "31500:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_48_by_1", + "typeString": "int_const 48" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11524, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "31466:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11527, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31466:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11528, + "nodeType": "RevertStatement", + "src": "31459:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11507, + "nodeType": "StructuredDocumentation", + "src": "30991:307:53", + "text": " @dev Returns the downcasted int48 from int256, reverting on\n overflow (when the input is less than smallest int48 or\n greater than largest int48).\n Counterpart to Solidity's `int48` operator.\n Requirements:\n - input must fit into 48 bits" + }, + "id": 11532, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt48", + "nameLocation": "31312:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11510, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11509, + "mutability": "mutable", + "name": "value", + "nameLocation": "31327:5:53", + "nodeType": "VariableDeclaration", + "scope": 11532, + "src": "31320:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11508, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "31320:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "31319:14:53" + }, + "returnParameters": { + "id": 11513, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11512, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "31363:10:53", + "nodeType": "VariableDeclaration", + "scope": 11532, + "src": "31357:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int48", + "typeString": "int48" + }, + "typeName": { + "id": 11511, + "name": "int48", + "nodeType": "ElementaryTypeName", + "src": "31357:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int48", + "typeString": "int48" + } + }, + "visibility": "internal" + } + ], + "src": "31356:18:53" + }, + "scope": 11703, + "src": "31303:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11557, + "nodeType": "Block", + "src": "31913:148:53", + "statements": [ + { + "expression": { + "id": 11545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11540, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11538, + "src": "31923:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int40", + "typeString": "int40" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11543, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11535, + "src": "31942:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11542, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "31936:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int40_$", + "typeString": "type(int40)" + }, + "typeName": { + "id": 11541, + "name": "int40", + "nodeType": "ElementaryTypeName", + "src": "31936:5:53", + "typeDescriptions": {} + } + }, + "id": 11544, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "31936:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int40", + "typeString": "int40" + } + }, + "src": "31923:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int40", + "typeString": "int40" + } + }, + "id": 11546, + "nodeType": "ExpressionStatement", + "src": "31923:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11549, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11547, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11538, + "src": "31962:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int40", + "typeString": "int40" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11548, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11535, + "src": "31976:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "31962:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11556, + "nodeType": "IfStatement", + "src": "31958:97:53", + "trueBody": { + "id": 11555, + "nodeType": "Block", + "src": "31983:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3430", + "id": 11551, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "32034:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_40_by_1", + "typeString": "int_const 40" + }, + "value": "40" + }, + { + "id": 11552, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11535, + "src": "32038:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_40_by_1", + "typeString": "int_const 40" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11550, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "32004:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11553, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "32004:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11554, + "nodeType": "RevertStatement", + "src": "31997:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11533, + "nodeType": "StructuredDocumentation", + "src": "31529:307:53", + "text": " @dev Returns the downcasted int40 from int256, reverting on\n overflow (when the input is less than smallest int40 or\n greater than largest int40).\n Counterpart to Solidity's `int40` operator.\n Requirements:\n - input must fit into 40 bits" + }, + "id": 11558, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt40", + "nameLocation": "31850:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11536, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11535, + "mutability": "mutable", + "name": "value", + "nameLocation": "31865:5:53", + "nodeType": "VariableDeclaration", + "scope": 11558, + "src": "31858:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11534, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "31858:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "31857:14:53" + }, + "returnParameters": { + "id": 11539, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11538, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "31901:10:53", + "nodeType": "VariableDeclaration", + "scope": 11558, + "src": "31895:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int40", + "typeString": "int40" + }, + "typeName": { + "id": 11537, + "name": "int40", + "nodeType": "ElementaryTypeName", + "src": "31895:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int40", + "typeString": "int40" + } + }, + "visibility": "internal" + } + ], + "src": "31894:18:53" + }, + "scope": 11703, + "src": "31841:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11583, + "nodeType": "Block", + "src": "32451:148:53", + "statements": [ + { + "expression": { + "id": 11571, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11566, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11564, + "src": "32461:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int32", + "typeString": "int32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11569, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11561, + "src": "32480:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11568, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "32474:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int32_$", + "typeString": "type(int32)" + }, + "typeName": { + "id": 11567, + "name": "int32", + "nodeType": "ElementaryTypeName", + "src": "32474:5:53", + "typeDescriptions": {} + } + }, + "id": 11570, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "32474:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int32", + "typeString": "int32" + } + }, + "src": "32461:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int32", + "typeString": "int32" + } + }, + "id": 11572, + "nodeType": "ExpressionStatement", + "src": "32461:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11575, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11573, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11564, + "src": "32500:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int32", + "typeString": "int32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11574, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11561, + "src": "32514:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "32500:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11582, + "nodeType": "IfStatement", + "src": "32496:97:53", + "trueBody": { + "id": 11581, + "nodeType": "Block", + "src": "32521:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3332", + "id": 11577, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "32572:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + { + "id": 11578, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11561, + "src": "32576:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11576, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "32542:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11579, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "32542:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11580, + "nodeType": "RevertStatement", + "src": "32535:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11559, + "nodeType": "StructuredDocumentation", + "src": "32067:307:53", + "text": " @dev Returns the downcasted int32 from int256, reverting on\n overflow (when the input is less than smallest int32 or\n greater than largest int32).\n Counterpart to Solidity's `int32` operator.\n Requirements:\n - input must fit into 32 bits" + }, + "id": 11584, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt32", + "nameLocation": "32388:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11562, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11561, + "mutability": "mutable", + "name": "value", + "nameLocation": "32403:5:53", + "nodeType": "VariableDeclaration", + "scope": 11584, + "src": "32396:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11560, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "32396:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "32395:14:53" + }, + "returnParameters": { + "id": 11565, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11564, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "32439:10:53", + "nodeType": "VariableDeclaration", + "scope": 11584, + "src": "32433:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int32", + "typeString": "int32" + }, + "typeName": { + "id": 11563, + "name": "int32", + "nodeType": "ElementaryTypeName", + "src": "32433:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int32", + "typeString": "int32" + } + }, + "visibility": "internal" + } + ], + "src": "32432:18:53" + }, + "scope": 11703, + "src": "32379:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11609, + "nodeType": "Block", + "src": "32989:148:53", + "statements": [ + { + "expression": { + "id": 11597, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11592, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11590, + "src": "32999:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int24", + "typeString": "int24" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11595, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11587, + "src": "33018:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11594, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "33012:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int24_$", + "typeString": "type(int24)" + }, + "typeName": { + "id": 11593, + "name": "int24", + "nodeType": "ElementaryTypeName", + "src": "33012:5:53", + "typeDescriptions": {} + } + }, + "id": 11596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "33012:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int24", + "typeString": "int24" + } + }, + "src": "32999:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int24", + "typeString": "int24" + } + }, + "id": 11598, + "nodeType": "ExpressionStatement", + "src": "32999:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11601, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11599, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11590, + "src": "33038:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int24", + "typeString": "int24" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11600, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11587, + "src": "33052:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "33038:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11608, + "nodeType": "IfStatement", + "src": "33034:97:53", + "trueBody": { + "id": 11607, + "nodeType": "Block", + "src": "33059:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3234", + "id": 11603, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "33110:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_24_by_1", + "typeString": "int_const 24" + }, + "value": "24" + }, + { + "id": 11604, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11587, + "src": "33114:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_24_by_1", + "typeString": "int_const 24" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11602, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "33080:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "33080:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11606, + "nodeType": "RevertStatement", + "src": "33073:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11585, + "nodeType": "StructuredDocumentation", + "src": "32605:307:53", + "text": " @dev Returns the downcasted int24 from int256, reverting on\n overflow (when the input is less than smallest int24 or\n greater than largest int24).\n Counterpart to Solidity's `int24` operator.\n Requirements:\n - input must fit into 24 bits" + }, + "id": 11610, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt24", + "nameLocation": "32926:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11588, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11587, + "mutability": "mutable", + "name": "value", + "nameLocation": "32941:5:53", + "nodeType": "VariableDeclaration", + "scope": 11610, + "src": "32934:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11586, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "32934:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "32933:14:53" + }, + "returnParameters": { + "id": 11591, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11590, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "32977:10:53", + "nodeType": "VariableDeclaration", + "scope": 11610, + "src": "32971:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int24", + "typeString": "int24" + }, + "typeName": { + "id": 11589, + "name": "int24", + "nodeType": "ElementaryTypeName", + "src": "32971:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int24", + "typeString": "int24" + } + }, + "visibility": "internal" + } + ], + "src": "32970:18:53" + }, + "scope": 11703, + "src": "32917:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11635, + "nodeType": "Block", + "src": "33527:148:53", + "statements": [ + { + "expression": { + "id": 11623, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11618, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11616, + "src": "33537:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int16", + "typeString": "int16" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11621, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11613, + "src": "33556:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11620, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "33550:5:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int16_$", + "typeString": "type(int16)" + }, + "typeName": { + "id": 11619, + "name": "int16", + "nodeType": "ElementaryTypeName", + "src": "33550:5:53", + "typeDescriptions": {} + } + }, + "id": 11622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "33550:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int16", + "typeString": "int16" + } + }, + "src": "33537:25:53", + "typeDescriptions": { + "typeIdentifier": "t_int16", + "typeString": "int16" + } + }, + "id": 11624, + "nodeType": "ExpressionStatement", + "src": "33537:25:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11627, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11625, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11616, + "src": "33576:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int16", + "typeString": "int16" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11626, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11613, + "src": "33590:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "33576:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11634, + "nodeType": "IfStatement", + "src": "33572:97:53", + "trueBody": { + "id": 11633, + "nodeType": "Block", + "src": "33597:72:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "3136", + "id": 11629, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "33648:2:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + "value": "16" + }, + { + "id": 11630, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11613, + "src": "33652:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_16_by_1", + "typeString": "int_const 16" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11628, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "33618:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11631, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "33618:40:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11632, + "nodeType": "RevertStatement", + "src": "33611:47:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11611, + "nodeType": "StructuredDocumentation", + "src": "33143:307:53", + "text": " @dev Returns the downcasted int16 from int256, reverting on\n overflow (when the input is less than smallest int16 or\n greater than largest int16).\n Counterpart to Solidity's `int16` operator.\n Requirements:\n - input must fit into 16 bits" + }, + "id": 11636, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt16", + "nameLocation": "33464:7:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11614, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11613, + "mutability": "mutable", + "name": "value", + "nameLocation": "33479:5:53", + "nodeType": "VariableDeclaration", + "scope": 11636, + "src": "33472:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11612, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "33472:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "33471:14:53" + }, + "returnParameters": { + "id": 11617, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11616, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "33515:10:53", + "nodeType": "VariableDeclaration", + "scope": 11636, + "src": "33509:16:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int16", + "typeString": "int16" + }, + "typeName": { + "id": 11615, + "name": "int16", + "nodeType": "ElementaryTypeName", + "src": "33509:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int16", + "typeString": "int16" + } + }, + "visibility": "internal" + } + ], + "src": "33508:18:53" + }, + "scope": 11703, + "src": "33455:220:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11661, + "nodeType": "Block", + "src": "34058:146:53", + "statements": [ + { + "expression": { + "id": 11649, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 11644, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11642, + "src": "34068:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int8", + "typeString": "int8" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 11647, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11639, + "src": "34086:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11646, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "34081:4:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int8_$", + "typeString": "type(int8)" + }, + "typeName": { + "id": 11645, + "name": "int8", + "nodeType": "ElementaryTypeName", + "src": "34081:4:53", + "typeDescriptions": {} + } + }, + "id": 11648, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "34081:11:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int8", + "typeString": "int8" + } + }, + "src": "34068:24:53", + "typeDescriptions": { + "typeIdentifier": "t_int8", + "typeString": "int8" + } + }, + "id": 11650, + "nodeType": "ExpressionStatement", + "src": "34068:24:53" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11653, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11651, + "name": "downcasted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11642, + "src": "34106:10:53", + "typeDescriptions": { + "typeIdentifier": "t_int8", + "typeString": "int8" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 11652, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11639, + "src": "34120:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "34106:19:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11660, + "nodeType": "IfStatement", + "src": "34102:96:53", + "trueBody": { + "id": 11659, + "nodeType": "Block", + "src": "34127:71:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "hexValue": "38", + "id": 11655, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "34178:1:53", + "typeDescriptions": { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + "value": "8" + }, + { + "id": 11656, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11639, + "src": "34181:5:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_8_by_1", + "typeString": "int_const 8" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11654, + "name": "SafeCastOverflowedIntDowncast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9960, + "src": "34148:29:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint8_$_t_int256_$returns$_t_error_$", + "typeString": "function (uint8,int256) pure returns (error)" + } + }, + "id": 11657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "34148:39:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11658, + "nodeType": "RevertStatement", + "src": "34141:46:53" + } + ] + } + } + ] + }, + "documentation": { + "id": 11637, + "nodeType": "StructuredDocumentation", + "src": "33681:302:53", + "text": " @dev Returns the downcasted int8 from int256, reverting on\n overflow (when the input is less than smallest int8 or\n greater than largest int8).\n Counterpart to Solidity's `int8` operator.\n Requirements:\n - input must fit into 8 bits" + }, + "id": 11662, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt8", + "nameLocation": "33997:6:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11640, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11639, + "mutability": "mutable", + "name": "value", + "nameLocation": "34011:5:53", + "nodeType": "VariableDeclaration", + "scope": 11662, + "src": "34004:12:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11638, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "34004:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "34003:14:53" + }, + "returnParameters": { + "id": 11643, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11642, + "mutability": "mutable", + "name": "downcasted", + "nameLocation": "34046:10:53", + "nodeType": "VariableDeclaration", + "scope": 11662, + "src": "34041:15:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int8", + "typeString": "int8" + }, + "typeName": { + "id": 11641, + "name": "int8", + "nodeType": "ElementaryTypeName", + "src": "34041:4:53", + "typeDescriptions": { + "typeIdentifier": "t_int8", + "typeString": "int8" + } + }, + "visibility": "internal" + } + ], + "src": "34040:17:53" + }, + "scope": 11703, + "src": "33988:216:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11691, + "nodeType": "Block", + "src": "34444:250:53", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 11679, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11670, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11665, + "src": "34557:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 11675, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "34578:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 11674, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "34578:6:53", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + } + ], + "id": 11673, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "34573:4:53", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 11676, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "34573:12:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_int256", + "typeString": "type(int256)" + } + }, + "id": 11677, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "34586:3:53", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "34573:16:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11672, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "34565:7:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 11671, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "34565:7:53", + "typeDescriptions": {} + } + }, + "id": 11678, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "34565:25:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "34557:33:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 11685, + "nodeType": "IfStatement", + "src": "34553:105:53", + "trueBody": { + "id": 11684, + "nodeType": "Block", + "src": "34592:66:53", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 11681, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11665, + "src": "34641:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 11680, + "name": "SafeCastOverflowedUintToInt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9965, + "src": "34613:27:53", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256) pure returns (error)" + } + }, + "id": 11682, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "34613:34:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 11683, + "nodeType": "RevertStatement", + "src": "34606:41:53" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 11688, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11665, + "src": "34681:5:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 11687, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "34674:6:53", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 11686, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "34674:6:53", + "typeDescriptions": {} + } + }, + "id": 11689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "34674:13:53", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 11669, + "id": 11690, + "nodeType": "Return", + "src": "34667:20:53" + } + ] + }, + "documentation": { + "id": 11663, + "nodeType": "StructuredDocumentation", + "src": "34210:165:53", + "text": " @dev Converts an unsigned uint256 into a signed int256.\n Requirements:\n - input must be less than or equal to maxInt256." + }, + "id": 11692, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toInt256", + "nameLocation": "34389:8:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11666, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11665, + "mutability": "mutable", + "name": "value", + "nameLocation": "34406:5:53", + "nodeType": "VariableDeclaration", + "scope": 11692, + "src": "34398:13:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 11664, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "34398:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "34397:15:53" + }, + "returnParameters": { + "id": 11669, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11668, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 11692, + "src": "34436:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11667, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "34436:6:53", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "34435:8:53" + }, + "scope": 11703, + "src": "34380:314:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11701, + "nodeType": "Block", + "src": "34853:87:53", + "statements": [ + { + "AST": { + "nativeSrc": "34888:46:53", + "nodeType": "YulBlock", + "src": "34888:46:53", + "statements": [ + { + "nativeSrc": "34902:22:53", + "nodeType": "YulAssignment", + "src": "34902:22:53", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "b", + "nativeSrc": "34921:1:53", + "nodeType": "YulIdentifier", + "src": "34921:1:53" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "34914:6:53", + "nodeType": "YulIdentifier", + "src": "34914:6:53" + }, + "nativeSrc": "34914:9:53", + "nodeType": "YulFunctionCall", + "src": "34914:9:53" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "34907:6:53", + "nodeType": "YulIdentifier", + "src": "34907:6:53" + }, + "nativeSrc": "34907:17:53", + "nodeType": "YulFunctionCall", + "src": "34907:17:53" + }, + "variableNames": [ + { + "name": "u", + "nativeSrc": "34902:1:53", + "nodeType": "YulIdentifier", + "src": "34902:1:53" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 11695, + "isOffset": false, + "isSlot": false, + "src": "34921:1:53", + "valueSize": 1 + }, + { + "declaration": 11698, + "isOffset": false, + "isSlot": false, + "src": "34902:1:53", + "valueSize": 1 + } + ], + "flags": ["memory-safe"], + "id": 11700, + "nodeType": "InlineAssembly", + "src": "34863:71:53" + } + ] + }, + "documentation": { + "id": 11693, + "nodeType": "StructuredDocumentation", + "src": "34700:90:53", + "text": " @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump." + }, + "id": 11702, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUint", + "nameLocation": "34804:6:53", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11696, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11695, + "mutability": "mutable", + "name": "b", + "nameLocation": "34816:1:53", + "nodeType": "VariableDeclaration", + "scope": 11702, + "src": "34811:6:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 11694, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "34811:4:53", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "34810:8:53" + }, + "returnParameters": { + "id": 11699, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11698, + "mutability": "mutable", + "name": "u", + "nameLocation": "34850:1:53", + "nodeType": "VariableDeclaration", + "scope": 11702, + "src": "34842:9:53", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 11697, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "34842:7:53", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "34841:11:53" + }, + "scope": 11703, + "src": "34795:145:53", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 11704, + "src": "769:34173:53", + "usedErrors": [9948, 9953, 9960, 9965], + "usedEvents": [] + } + ], + "src": "192:34751:53" + }, + "id": 53 + }, + "@openzeppelin/contracts/utils/math/SignedMath.sol": { + "ast": { + "absolutePath": "@openzeppelin/contracts/utils/math/SignedMath.sol", + "exportedSymbols": { + "SafeCast": [11703], + "SignedMath": [11847] + }, + "id": 11848, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 11705, + "literals": ["solidity", "^", "0.8", ".20"], + "nodeType": "PragmaDirective", + "src": "109:24:54" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/math/SafeCast.sol", + "file": "./SafeCast.sol", + "id": 11707, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 11848, + "sourceUnit": 11704, + "src": "135:40:54", + "symbolAliases": [ + { + "foreign": { + "id": 11706, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "143:8:54", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SignedMath", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 11708, + "nodeType": "StructuredDocumentation", + "src": "177:80:54", + "text": " @dev Standard signed math utilities missing in the Solidity language." + }, + "fullyImplemented": true, + "id": 11847, + "linearizedBaseContracts": [11847], + "name": "SignedMath", + "nameLocation": "266:10:54", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 11737, + "nodeType": "Block", + "src": "746:215:54", + "statements": [ + { + "id": 11736, + "nodeType": "UncheckedBlock", + "src": "756:199:54", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11720, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11715, + "src": "894:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11721, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11713, + "src": "900:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "id": 11722, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11715, + "src": "904:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "900:5:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11724, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "899:7:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 11729, + "name": "condition", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11711, + "src": "932:9:54", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "expression": { + "id": 11727, + "name": "SafeCast", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11703, + "src": "916:8:54", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SafeCast_$11703_$", + "typeString": "type(library SafeCast)" + } + }, + "id": 11728, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "925:6:54", + "memberName": "toUint", + "nodeType": "MemberAccess", + "referencedDeclaration": 11702, + "src": "916:15:54", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$returns$_t_uint256_$", + "typeString": "function (bool) pure returns (uint256)" + } + }, + "id": 11730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "916:26:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 11726, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "909:6:54", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 11725, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "909:6:54", + "typeDescriptions": {} + } + }, + "id": 11731, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "909:34:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "899:44:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11733, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "898:46:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "894:50:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 11719, + "id": 11735, + "nodeType": "Return", + "src": "887:57:54" + } + ] + } + ] + }, + "documentation": { + "id": 11709, + "nodeType": "StructuredDocumentation", + "src": "283:374:54", + "text": " @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n one branch when needed, making this function more expensive." + }, + "id": 11738, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "ternary", + "nameLocation": "671:7:54", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11716, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11711, + "mutability": "mutable", + "name": "condition", + "nameLocation": "684:9:54", + "nodeType": "VariableDeclaration", + "scope": 11738, + "src": "679:14:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 11710, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "679:4:54", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11713, + "mutability": "mutable", + "name": "a", + "nameLocation": "702:1:54", + "nodeType": "VariableDeclaration", + "scope": 11738, + "src": "695:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11712, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "695:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11715, + "mutability": "mutable", + "name": "b", + "nameLocation": "712:1:54", + "nodeType": "VariableDeclaration", + "scope": 11738, + "src": "705:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11714, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "705:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "678:36:54" + }, + "returnParameters": { + "id": 11719, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11718, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 11738, + "src": "738:6:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11717, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "738:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "737:8:54" + }, + "scope": 11847, + "src": "662:299:54", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11756, + "nodeType": "Block", + "src": "1102:44:54", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11749, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11741, + "src": "1127:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 11750, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11743, + "src": "1131:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1127:5:54", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 11752, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11741, + "src": "1134:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + { + "id": 11753, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11743, + "src": "1137:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11748, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11738, + "src": "1119:7:54", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_int256_$_t_int256_$returns$_t_int256_$", + "typeString": "function (bool,int256,int256) pure returns (int256)" + } + }, + "id": 11754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1119:20:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 11747, + "id": 11755, + "nodeType": "Return", + "src": "1112:27:54" + } + ] + }, + "documentation": { + "id": 11739, + "nodeType": "StructuredDocumentation", + "src": "967:66:54", + "text": " @dev Returns the largest of two signed numbers." + }, + "id": 11757, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "max", + "nameLocation": "1047:3:54", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11744, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11741, + "mutability": "mutable", + "name": "a", + "nameLocation": "1058:1:54", + "nodeType": "VariableDeclaration", + "scope": 11757, + "src": "1051:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11740, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1051:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11743, + "mutability": "mutable", + "name": "b", + "nameLocation": "1068:1:54", + "nodeType": "VariableDeclaration", + "scope": 11757, + "src": "1061:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11742, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1061:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1050:20:54" + }, + "returnParameters": { + "id": 11747, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11746, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 11757, + "src": "1094:6:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11745, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1094:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1093:8:54" + }, + "scope": 11847, + "src": "1038:108:54", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11775, + "nodeType": "Block", + "src": "1288:44:54", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11770, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11768, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11760, + "src": "1313:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 11769, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11762, + "src": "1317:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1313:5:54", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 11771, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11760, + "src": "1320:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + { + "id": 11772, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11762, + "src": "1323:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11767, + "name": "ternary", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11738, + "src": "1305:7:54", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_int256_$_t_int256_$returns$_t_int256_$", + "typeString": "function (bool,int256,int256) pure returns (int256)" + } + }, + "id": 11773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1305:20:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 11766, + "id": 11774, + "nodeType": "Return", + "src": "1298:27:54" + } + ] + }, + "documentation": { + "id": 11758, + "nodeType": "StructuredDocumentation", + "src": "1152:67:54", + "text": " @dev Returns the smallest of two signed numbers." + }, + "id": 11776, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "min", + "nameLocation": "1233:3:54", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11763, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11760, + "mutability": "mutable", + "name": "a", + "nameLocation": "1244:1:54", + "nodeType": "VariableDeclaration", + "scope": 11776, + "src": "1237:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11759, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1237:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11762, + "mutability": "mutable", + "name": "b", + "nameLocation": "1254:1:54", + "nodeType": "VariableDeclaration", + "scope": 11776, + "src": "1247:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11761, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1247:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1236:20:54" + }, + "returnParameters": { + "id": 11766, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11765, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 11776, + "src": "1280:6:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11764, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1280:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1279:8:54" + }, + "scope": 11847, + "src": "1224:108:54", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11819, + "nodeType": "Block", + "src": "1537:162:54", + "statements": [ + { + "assignments": [11787], + "declarations": [ + { + "constant": false, + "id": 11787, + "mutability": "mutable", + "name": "x", + "nameLocation": "1606:1:54", + "nodeType": "VariableDeclaration", + "scope": 11819, + "src": "1599:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11786, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1599:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "id": 11800, + "initialValue": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11790, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11788, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11779, + "src": "1611:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "id": 11789, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11781, + "src": "1615:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1611:5:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11791, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1610:7:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11797, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11792, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11779, + "src": "1622:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "id": 11793, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11781, + "src": "1626:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1622:5:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11795, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1621:7:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "31", + "id": 11796, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1632:1:54", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "1621:12:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11798, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1620:14:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1610:24:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1599:35:54" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11817, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11801, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11787, + "src": "1651:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 11809, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 11806, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11787, + "src": "1671:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11805, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1663:7:54", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 11804, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1663:7:54", + "typeDescriptions": {} + } + }, + "id": 11807, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1663:10:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "323535", + "id": 11808, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1677:3:54", + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "255" + }, + "src": "1663:17:54", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 11803, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1656:6:54", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 11802, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1656:6:54", + "typeDescriptions": {} + } + }, + "id": 11810, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1656:25:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11813, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11811, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11779, + "src": "1685:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "id": 11812, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11781, + "src": "1689:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1685:5:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11814, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1684:7:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1656:35:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11816, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1655:37:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1651:41:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 11785, + "id": 11818, + "nodeType": "Return", + "src": "1644:48:54" + } + ] + }, + "documentation": { + "id": 11777, + "nodeType": "StructuredDocumentation", + "src": "1338:126:54", + "text": " @dev Returns the average of two signed numbers without overflow.\n The result is rounded towards zero." + }, + "id": 11820, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "average", + "nameLocation": "1478:7:54", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11782, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11779, + "mutability": "mutable", + "name": "a", + "nameLocation": "1493:1:54", + "nodeType": "VariableDeclaration", + "scope": 11820, + "src": "1486:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11778, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1486:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11781, + "mutability": "mutable", + "name": "b", + "nameLocation": "1503:1:54", + "nodeType": "VariableDeclaration", + "scope": 11820, + "src": "1496:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11780, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1496:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1485:20:54" + }, + "returnParameters": { + "id": 11785, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11784, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 11820, + "src": "1529:6:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11783, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1529:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1528:8:54" + }, + "scope": 11847, + "src": "1469:230:54", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11845, + "nodeType": "Block", + "src": "1843:767:54", + "statements": [ + { + "id": 11844, + "nodeType": "UncheckedBlock", + "src": "1853:751:54", + "statements": [ + { + "assignments": [11829], + "declarations": [ + { + "constant": false, + "id": 11829, + "mutability": "mutable", + "name": "mask", + "nameLocation": "2424:4:54", + "nodeType": "VariableDeclaration", + "scope": 11844, + "src": "2417:11:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11828, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2417:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "id": 11833, + "initialValue": { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11832, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11830, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11823, + "src": "2431:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "hexValue": "323535", + "id": 11831, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2436:3:54", + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "255" + }, + "src": "2431:8:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2417:22:54" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11841, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 11838, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 11836, + "name": "n", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11823, + "src": "2576:1:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 11837, + "name": "mask", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11829, + "src": "2580:4:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2576:8:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 11839, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2575:10:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "^", + "rightExpression": { + "id": 11840, + "name": "mask", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11829, + "src": "2588:4:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2575:17:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 11835, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2567:7:54", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 11834, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2567:7:54", + "typeDescriptions": {} + } + }, + "id": 11842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2567:26:54", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 11827, + "id": 11843, + "nodeType": "Return", + "src": "2560:33:54" + } + ] + } + ] + }, + "documentation": { + "id": 11821, + "nodeType": "StructuredDocumentation", + "src": "1705:78:54", + "text": " @dev Returns the absolute unsigned value of a signed value." + }, + "id": 11846, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "abs", + "nameLocation": "1797:3:54", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11824, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11823, + "mutability": "mutable", + "name": "n", + "nameLocation": "1808:1:54", + "nodeType": "VariableDeclaration", + "scope": 11846, + "src": "1801:8:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 11822, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1801:6:54", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "visibility": "internal" + } + ], + "src": "1800:10:54" + }, + "returnParameters": { + "id": 11827, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11826, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 11846, + "src": "1834:7:54", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 11825, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1834:7:54", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1833:9:54" + }, + "scope": 11847, + "src": "1788:822:54", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 11848, + "src": "258:2354:54", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "109:2504:54" + }, + "id": 54 + }, + "contracts/DisputeManager.sol": { + "ast": { + "absolutePath": "contracts/DisputeManager.sol", + "exportedSymbols": { + "Allocation": [16033], + "Attestation": [16290], + "AttestationManager": [17555], + "DisputeManager": [13542], + "DisputeManagerV1Storage": [13575], + "GraphDirectory": [4928], + "IDisputeManager": [15373], + "IGraphToken": [758], + "IHorizonStaking": [2625], + "ISubgraphService": [15634], + "Initializable": [5391], + "MathUtils": [4445], + "OwnableUpgradeable": [5123], + "PPMMath": [4539], + "TokenUtils": [840] + }, + "id": 13543, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 11849, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:55" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "file": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "id": 11851, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 759, + "src": "70:87:55", + "symbolAliases": [ + { + "foreign": { + "id": 11850, + "name": "IGraphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 758, + "src": "79:11:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "id": 11853, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 2626, + "src": "158:98:55", + "symbolAliases": [ + { + "foreign": { + "id": 11852, + "name": "IHorizonStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2625, + "src": "167:15:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/IDisputeManager.sol", + "file": "./interfaces/IDisputeManager.sol", + "id": 11855, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 15374, + "src": "257:67:55", + "symbolAliases": [ + { + "foreign": { + "id": 11854, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "266:15:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/ISubgraphService.sol", + "file": "./interfaces/ISubgraphService.sol", + "id": 11857, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 15635, + "src": "325:69:55", + "symbolAliases": [ + { + "foreign": { + "id": 11856, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "334:16:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "file": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "id": 11859, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 841, + "src": "396:85:55", + "symbolAliases": [ + { + "foreign": { + "id": 11858, + "name": "TokenUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 840, + "src": "405:10:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "file": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "id": 11861, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 4540, + "src": "482:81:55", + "symbolAliases": [ + { + "foreign": { + "id": 11860, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "491:7:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/MathUtils.sol", + "file": "@graphprotocol/horizon/contracts/libraries/MathUtils.sol", + "id": 11863, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 4446, + "src": "564:85:55", + "symbolAliases": [ + { + "foreign": { + "id": 11862, + "name": "MathUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4445, + "src": "573:9:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/Allocation.sol", + "file": "./libraries/Allocation.sol", + "id": 11865, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 16034, + "src": "650:56:55", + "symbolAliases": [ + { + "foreign": { + "id": 11864, + "name": "Allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16033, + "src": "659:10:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/Attestation.sol", + "file": "./libraries/Attestation.sol", + "id": 11867, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 16291, + "src": "707:58:55", + "symbolAliases": [ + { + "foreign": { + "id": 11866, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "716:11:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", + "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", + "id": 11869, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 5124, + "src": "767:103:55", + "symbolAliases": [ + { + "foreign": { + "id": 11868, + "name": "OwnableUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5123, + "src": "776:18:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "id": 11871, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 5392, + "src": "871:98:55", + "symbolAliases": [ + { + "foreign": { + "id": 11870, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "880:13:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "file": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "id": 11873, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 4929, + "src": "970:95:55", + "symbolAliases": [ + { + "foreign": { + "id": 11872, + "name": "GraphDirectory", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4928, + "src": "979:14:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/DisputeManagerStorage.sol", + "file": "./DisputeManagerStorage.sol", + "id": 11875, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 13576, + "src": "1066:70:55", + "symbolAliases": [ + { + "foreign": { + "id": 11874, + "name": "DisputeManagerV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13575, + "src": "1075:23:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/utilities/AttestationManager.sol", + "file": "./utilities/AttestationManager.sol", + "id": 11877, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13543, + "sourceUnit": 17556, + "src": "1137:72:55", + "symbolAliases": [ + { + "foreign": { + "id": 11876, + "name": "AttestationManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17555, + "src": "1146:18:55", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 11879, + "name": "Initializable", + "nameLocations": ["2354:13:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "2354:13:55" + }, + "id": 11880, + "nodeType": "InheritanceSpecifier", + "src": "2354:13:55" + }, + { + "baseName": { + "id": 11881, + "name": "OwnableUpgradeable", + "nameLocations": ["2373:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5123, + "src": "2373:18:55" + }, + "id": 11882, + "nodeType": "InheritanceSpecifier", + "src": "2373:18:55" + }, + { + "baseName": { + "id": 11883, + "name": "GraphDirectory", + "nameLocations": ["2397:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4928, + "src": "2397:14:55" + }, + "id": 11884, + "nodeType": "InheritanceSpecifier", + "src": "2397:14:55" + }, + { + "baseName": { + "id": 11885, + "name": "AttestationManager", + "nameLocations": ["2417:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17555, + "src": "2417:18:55" + }, + "id": 11886, + "nodeType": "InheritanceSpecifier", + "src": "2417:18:55" + }, + { + "baseName": { + "id": 11887, + "name": "DisputeManagerV1Storage", + "nameLocations": ["2441:23:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 13575, + "src": "2441:23:55" + }, + "id": 11888, + "nodeType": "InheritanceSpecifier", + "src": "2441:23:55" + }, + { + "baseName": { + "id": 11889, + "name": "IDisputeManager", + "nameLocations": ["2470:15:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15373, + "src": "2470:15:55" + }, + "id": 11890, + "nodeType": "InheritanceSpecifier", + "src": "2470:15:55" + } + ], + "canonicalName": "DisputeManager", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 11878, + "nodeType": "StructuredDocumentation", + "src": "1211:1111:55", + "text": " @title DisputeManager\n @notice Provides a way to permissionlessly create disputes for incorrect behavior in the Subgraph Service.\n There are two types of disputes that can be created: Query disputes and Indexing disputes.\n Query Disputes:\n Graph nodes receive queries and return responses with signed receipts called attestations.\n An attestation can be disputed if the consumer thinks the query response was invalid.\n Indexers use the derived private key for an allocation to sign attestations.\n Indexing Disputes:\n Indexers periodically present a Proof of Indexing (POI) to prove they are indexing a subgraph.\n The Subgraph Service contract emits that proof which includes the POI. Any fisherman can dispute the\n validity of a POI by submitting a dispute to this contract along with a deposit.\n Arbitration:\n Disputes can only be accepted, rejected or drawn by the arbitrator role that can be delegated\n to a EOA or DAO.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 13542, + "linearizedBaseContracts": [13542, 15373, 13575, 17555, 17567, 4928, 5123, 5437, 5391], + "name": "DisputeManager", + "nameLocation": "2332:14:55", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 11894, + "libraryName": { + "id": 11891, + "name": "TokenUtils", + "nameLocations": ["2498:10:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 840, + "src": "2498:10:55" + }, + "nodeType": "UsingForDirective", + "src": "2492:33:55", + "typeName": { + "id": 11893, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 11892, + "name": "IGraphToken", + "nameLocations": ["2513:11:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "2513:11:55" + }, + "referencedDeclaration": 758, + "src": "2513:11:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + } + }, + { + "global": false, + "id": 11897, + "libraryName": { + "id": 11895, + "name": "PPMMath", + "nameLocations": ["2536:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4539, + "src": "2536:7:55" + }, + "nodeType": "UsingForDirective", + "src": "2530:26:55", + "typeName": { + "id": 11896, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2548:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "constant": true, + "documentation": { + "id": 11898, + "nodeType": "StructuredDocumentation", + "src": "2586:57:55", + "text": "@notice Maximum value for fisherman reward cut in PPM" + }, + "functionSelector": "17337b46", + "id": 11901, + "mutability": "constant", + "name": "MAX_FISHERMAN_REWARD_CUT", + "nameLocation": "2671:24:55", + "nodeType": "VariableDeclaration", + "scope": 13542, + "src": "2648:56:55", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 11899, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2648:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "value": { + "hexValue": "353030303030", + "id": 11900, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2698:6:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_500000_by_1", + "typeString": "int_const 500000" + }, + "value": "500000" + }, + "visibility": "public" + }, + { + "constant": true, + "documentation": { + "id": 11902, + "nodeType": "StructuredDocumentation", + "src": "2718:45:55", + "text": "@notice Minimum value for dispute deposit" + }, + "functionSelector": "cc2d55cd", + "id": 11905, + "mutability": "constant", + "name": "MIN_DISPUTE_DEPOSIT", + "nameLocation": "2792:19:55", + "nodeType": "VariableDeclaration", + "scope": 13542, + "src": "2768:50:55", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 11903, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2768:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "31653138", + "id": 11904, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2814:4:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_1000000000000000000_by_1", + "typeString": "int_const 1000000000000000000" + }, + "value": "1e18" + }, + "visibility": "public" + }, + { + "body": { + "id": 11918, + "nodeType": "Block", + "src": "2954:92:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 11912, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 11909, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2972:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 11910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2976:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2972:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 11911, + "name": "arbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13556, + "src": "2986:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2972:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 11913, + "name": "DisputeManagerNotArbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15080, + "src": "2998:27:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 11914, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2998:29:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 11908, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2964:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 11915, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2964:64:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 11916, + "nodeType": "ExpressionStatement", + "src": "2964:64:55" + }, + { + "id": 11917, + "nodeType": "PlaceholderStatement", + "src": "3038:1:55" + } + ] + }, + "documentation": { + "id": 11906, + "nodeType": "StructuredDocumentation", + "src": "2858:65:55", + "text": " @notice Check if the caller is the arbitrator." + }, + "id": 11919, + "name": "onlyArbitrator", + "nameLocation": "2937:14:55", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 11907, + "nodeType": "ParameterList", + "parameters": [], + "src": "2951:2:55" + }, + "src": "2928:118:55", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11951, + "nodeType": "Block", + "src": "3213:286:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 11926, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11922, + "src": "3248:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 11925, + "name": "isDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12801, + "src": "3231:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32) view returns (bool)" + } + }, + "id": 11927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3231:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 11929, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11922, + "src": "3289:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 11928, + "name": "DisputeManagerInvalidDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15097, + "src": "3260:28:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 11930, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3260:39:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 11924, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3223:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 11931, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3223:77:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 11932, + "nodeType": "ExpressionStatement", + "src": "3223:77:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + "id": 11941, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "baseExpression": { + "id": 11934, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "3331:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 11936, + "indexExpression": { + "id": 11935, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11922, + "src": "3340:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3331:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 11937, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3351:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "3331:26:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "expression": { + "id": 11938, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "3361:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 11939, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3377:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "3361:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 11940, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3391:7:55", + "memberName": "Pending", + "nodeType": "MemberAccess", + "referencedDeclaration": 14919, + "src": "3361:37:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "src": "3331:67:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "baseExpression": { + "id": 11943, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "3444:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 11945, + "indexExpression": { + "id": 11944, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11922, + "src": "3453:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3444:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 11946, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3464:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "3444:26:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + ], + "id": 11942, + "name": "DisputeManagerDisputeNotPending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15125, + "src": "3412:31:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_enum$_DisputeStatus_$14921_$returns$_t_error_$", + "typeString": "function (enum IDisputeManager.DisputeStatus) pure returns (error)" + } + }, + "id": 11947, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3412:59:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 11933, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3310:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 11948, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3310:171:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 11949, + "nodeType": "ExpressionStatement", + "src": "3310:171:55" + }, + { + "id": 11950, + "nodeType": "PlaceholderStatement", + "src": "3491:1:55" + } + ] + }, + "documentation": { + "id": 11920, + "nodeType": "StructuredDocumentation", + "src": "3052:109:55", + "text": " @notice Check if the dispute exists and is pending.\n @param disputeId The dispute Id" + }, + "id": 11952, + "name": "onlyPendingDispute", + "nameLocation": "3175:18:55", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 11923, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11922, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "3202:9:55", + "nodeType": "VariableDeclaration", + "scope": 11952, + "src": "3194:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 11921, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3194:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3193:19:55" + }, + "src": "3166:333:55", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11979, + "nodeType": "Block", + "src": "3670:197:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 11959, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11955, + "src": "3705:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 11958, + "name": "isDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12801, + "src": "3688:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32) view returns (bool)" + } + }, + "id": 11960, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3688:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 11962, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11955, + "src": "3746:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 11961, + "name": "DisputeManagerInvalidDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15097, + "src": "3717:28:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 11963, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3717:39:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 11957, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3680:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 11964, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3680:77:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 11965, + "nodeType": "ExpressionStatement", + "src": "3680:77:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 11973, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 11967, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3775:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 11968, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3779:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "3775:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "baseExpression": { + "id": 11969, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "3789:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 11971, + "indexExpression": { + "id": 11970, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11955, + "src": "3798:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3789:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 11972, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3809:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "3789:29:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3775:43:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 11974, + "name": "DisputeManagerNotFisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15083, + "src": "3820:26:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 11975, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3820:28:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 11966, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3767:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 11976, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3767:82:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 11977, + "nodeType": "ExpressionStatement", + "src": "3767:82:55" + }, + { + "id": 11978, + "nodeType": "PlaceholderStatement", + "src": "3859:1:55" + } + ] + }, + "documentation": { + "id": 11953, + "nodeType": "StructuredDocumentation", + "src": "3505:118:55", + "text": " @notice Check if the caller is the fisherman of the dispute.\n @param disputeId The dispute Id" + }, + "id": 11980, + "name": "onlyFisherman", + "nameLocation": "3637:13:55", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 11956, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11955, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "3659:9:55", + "nodeType": "VariableDeclaration", + "scope": 11980, + "src": "3651:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 11954, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3651:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3650:19:55" + }, + "src": "3628:239:55", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 11992, + "nodeType": "Block", + "src": "4035:39:55", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 11989, + "name": "_disableInitializers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5345, + "src": "4045:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 11990, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4045:22:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 11991, + "nodeType": "ExpressionStatement", + "src": "4045:22:55" + } + ] + }, + "documentation": { + "id": 11981, + "nodeType": "StructuredDocumentation", + "src": "3873:98:55", + "text": " @notice Contract constructor\n @param controller Address of the controller" + }, + "id": 11993, + "implemented": true, + "kind": "constructor", + "modifiers": [ + { + "arguments": [ + { + "id": 11986, + "name": "controller", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11983, + "src": "4023:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 11987, + "kind": "baseConstructorSpecifier", + "modifierName": { + "id": 11985, + "name": "GraphDirectory", + "nameLocations": ["4008:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4928, + "src": "4008:14:55" + }, + "nodeType": "ModifierInvocation", + "src": "4008:26:55" + } + ], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 11984, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11983, + "mutability": "mutable", + "name": "controller", + "nameLocation": "3996:10:55", + "nodeType": "VariableDeclaration", + "scope": 11993, + "src": "3988:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 11982, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3988:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3987:20:55" + }, + "returnParameters": { + "id": 11988, + "nodeType": "ParameterList", + "parameters": [], + "src": "4035:0:55" + }, + "scope": 13542, + "src": "3976:98:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "baseFunctions": [15196], + "body": { + "id": 12039, + "nodeType": "Block", + "src": "4356:299:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12013, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11996, + "src": "4381:5:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12012, + "name": "__Ownable_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4983, + "src": "4366:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 12014, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4366:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12015, + "nodeType": "ExpressionStatement", + "src": "4366:21:55" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12016, + "name": "__AttestationManager_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17454, + "src": "4397:25:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 12017, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4397:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12018, + "nodeType": "ExpressionStatement", + "src": "4397:27:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12020, + "name": "arbitrator_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11998, + "src": "4450:11:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12019, + "name": "_setArbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13346, + "src": "4435:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 12021, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4435:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12022, + "nodeType": "ExpressionStatement", + "src": "4435:27:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12024, + "name": "disputePeriod_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12000, + "src": "4490:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 12023, + "name": "_setDisputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13369, + "src": "4472:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint64_$returns$__$", + "typeString": "function (uint64)" + } + }, + "id": 12025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4472:33:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12026, + "nodeType": "ExpressionStatement", + "src": "4472:33:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12028, + "name": "disputeDeposit_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12002, + "src": "4534:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12027, + "name": "_setDisputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13393, + "src": "4515:18:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 12029, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4515:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12030, + "nodeType": "ExpressionStatement", + "src": "4515:35:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12032, + "name": "fishermanRewardCut_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12004, + "src": "4583:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 12031, + "name": "_setFishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13417, + "src": "4560:22:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 12033, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4560:43:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12034, + "nodeType": "ExpressionStatement", + "src": "4560:43:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12036, + "name": "maxSlashingCut_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12006, + "src": "4632:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 12035, + "name": "_setMaxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13442, + "src": "4613:18:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 12037, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4613:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12038, + "nodeType": "ExpressionStatement", + "src": "4613:35:55" + } + ] + }, + "documentation": { + "id": 11994, + "nodeType": "StructuredDocumentation", + "src": "4080:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "0bc7344b", + "id": 12040, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12010, + "kind": "modifierInvocation", + "modifierName": { + "id": 12009, + "name": "initializer", + "nameLocations": ["4344:11:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5231, + "src": "4344:11:55" + }, + "nodeType": "ModifierInvocation", + "src": "4344:11:55" + } + ], + "name": "initialize", + "nameLocation": "4125:10:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12008, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "4335:8:55" + }, + "parameters": { + "id": 12007, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11996, + "mutability": "mutable", + "name": "owner", + "nameLocation": "4153:5:55", + "nodeType": "VariableDeclaration", + "scope": 12040, + "src": "4145:13:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 11995, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4145:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11998, + "mutability": "mutable", + "name": "arbitrator_", + "nameLocation": "4176:11:55", + "nodeType": "VariableDeclaration", + "scope": 12040, + "src": "4168:19:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 11997, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4168:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12000, + "mutability": "mutable", + "name": "disputePeriod_", + "nameLocation": "4204:14:55", + "nodeType": "VariableDeclaration", + "scope": 12040, + "src": "4197:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 11999, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "4197:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12002, + "mutability": "mutable", + "name": "disputeDeposit_", + "nameLocation": "4236:15:55", + "nodeType": "VariableDeclaration", + "scope": 12040, + "src": "4228:23:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12001, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4228:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12004, + "mutability": "mutable", + "name": "fishermanRewardCut_", + "nameLocation": "4268:19:55", + "nodeType": "VariableDeclaration", + "scope": 12040, + "src": "4261:26:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 12003, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "4261:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12006, + "mutability": "mutable", + "name": "maxSlashingCut_", + "nameLocation": "4304:15:55", + "nodeType": "VariableDeclaration", + "scope": 12040, + "src": "4297:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 12005, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "4297:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "4135:190:55" + }, + "returnParameters": { + "id": 12011, + "nodeType": "ParameterList", + "parameters": [], + "src": "4356:0:55" + }, + "scope": 13542, + "src": "4116:539:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15262], + "body": { + "id": 12067, + "nodeType": "Block", + "src": "4799:234:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12054, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "4870:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 12055, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4874:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "4870:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12056, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "4882:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12051, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "4845:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 12052, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4845:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 12053, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4859:10:55", + "memberName": "pullTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 792, + "src": "4845:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 12057, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4845:52:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12058, + "nodeType": "ExpressionStatement", + "src": "4845:52:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12060, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "4980:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 12061, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4984:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "4980:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12062, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "4992:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12063, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12043, + "src": "5008:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12064, + "name": "poi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12045, + "src": "5022:3:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12059, + "name": "_createIndexingDisputeWithAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13065, + "src": "4943:36:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (address,uint256,address,bytes32) returns (bytes32)" + } + }, + "id": 12065, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4943:83:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 12050, + "id": 12066, + "nodeType": "Return", + "src": "4936:90:55" + } + ] + }, + "documentation": { + "id": 12041, + "nodeType": "StructuredDocumentation", + "src": "4661:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "4bc5839a", + "id": 12068, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "createIndexingDispute", + "nameLocation": "4706:21:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12047, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "4772:8:55" + }, + "parameters": { + "id": 12046, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12043, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "4736:12:55", + "nodeType": "VariableDeclaration", + "scope": 12068, + "src": "4728:20:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12042, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4728:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12045, + "mutability": "mutable", + "name": "poi", + "nameLocation": "4758:3:55", + "nodeType": "VariableDeclaration", + "scope": 12068, + "src": "4750:11:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12044, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4750:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4727:35:55" + }, + "returnParameters": { + "id": 12050, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12049, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12068, + "src": "4790:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12048, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4790:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "4789:9:55" + }, + "scope": 13542, + "src": "4697:336:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15240], + "body": { + "id": 12096, + "nodeType": "Block", + "src": "5171:356:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12080, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "5242:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 12081, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5246:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "5242:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12082, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "5254:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12077, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "5217:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 12078, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5217:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 12079, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5231:10:55", + "memberName": "pullTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 792, + "src": "5217:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 12083, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5217:52:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12084, + "nodeType": "ExpressionStatement", + "src": "5217:52:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12086, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "5379:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 12087, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5383:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "5379:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12088, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "5407:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 12091, + "name": "attestationData", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12071, + "src": "5457:15:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 12089, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "5439:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Attestation_$16290_$", + "typeString": "type(library Attestation)" + } + }, + "id": 12090, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5451:5:55", + "memberName": "parse", + "nodeType": "MemberAccess", + "referencedDeclaration": 16223, + "src": "5439:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_struct$_State_$16058_memory_ptr_$", + "typeString": "function (bytes memory) pure returns (struct Attestation.State memory)" + } + }, + "id": 12092, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5439:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + { + "id": 12093, + "name": "attestationData", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12071, + "src": "5491:15:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 12085, + "name": "_createQueryDisputeWithAttestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12923, + "src": "5327:34:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_struct$_State_$16058_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (address,uint256,struct Attestation.State memory,bytes memory) returns (bytes32)" + } + }, + "id": 12094, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5327:193:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 12076, + "id": 12095, + "nodeType": "Return", + "src": "5308:212:55" + } + ] + }, + "documentation": { + "id": 12069, + "nodeType": "StructuredDocumentation", + "src": "5039:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "c50a77b1", + "id": 12097, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "createQueryDispute", + "nameLocation": "5084:18:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12073, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "5144:8:55" + }, + "parameters": { + "id": 12072, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12071, + "mutability": "mutable", + "name": "attestationData", + "nameLocation": "5118:15:55", + "nodeType": "VariableDeclaration", + "scope": 12097, + "src": "5103:30:55", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 12070, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5103:5:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5102:32:55" + }, + "returnParameters": { + "id": 12076, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12075, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12097, + "src": "5162:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12074, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5162:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5161:9:55" + }, + "scope": 13542, + "src": "5075:452:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15252], + "body": { + "id": 12210, + "nodeType": "Block", + "src": "5738:1563:55", + "statements": [ + { + "assignments": [12111], + "declarations": [ + { + "constant": false, + "id": 12111, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "5756:9:55", + "nodeType": "VariableDeclaration", + "scope": 12210, + "src": "5748:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12110, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5748:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 12114, + "initialValue": { + "expression": { + "id": 12112, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "5768:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 12113, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5772:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "5768:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5748:30:55" + }, + { + "assignments": [12119], + "declarations": [ + { + "constant": false, + "id": 12119, + "mutability": "mutable", + "name": "attestation1", + "nameLocation": "5848:12:55", + "nodeType": "VariableDeclaration", + "scope": 12210, + "src": "5823:37:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 12118, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12117, + "name": "Attestation.State", + "nameLocations": ["5823:11:55", "5835:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "5823:17:55" + }, + "referencedDeclaration": 16058, + "src": "5823:17:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "id": 12124, + "initialValue": { + "arguments": [ + { + "id": 12122, + "name": "attestationData1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12100, + "src": "5881:16:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 12120, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "5863:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Attestation_$16290_$", + "typeString": "type(library Attestation)" + } + }, + "id": 12121, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5875:5:55", + "memberName": "parse", + "nodeType": "MemberAccess", + "referencedDeclaration": 16223, + "src": "5863:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_struct$_State_$16058_memory_ptr_$", + "typeString": "function (bytes memory) pure returns (struct Attestation.State memory)" + } + }, + "id": 12123, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5863:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5823:75:55" + }, + { + "assignments": [12129], + "declarations": [ + { + "constant": false, + "id": 12129, + "mutability": "mutable", + "name": "attestation2", + "nameLocation": "5933:12:55", + "nodeType": "VariableDeclaration", + "scope": 12210, + "src": "5908:37:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 12128, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12127, + "name": "Attestation.State", + "nameLocations": ["5908:11:55", "5920:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "5908:17:55" + }, + "referencedDeclaration": 16058, + "src": "5908:17:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "id": 12134, + "initialValue": { + "arguments": [ + { + "id": 12132, + "name": "attestationData2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12102, + "src": "5966:16:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 12130, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "5948:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Attestation_$16290_$", + "typeString": "type(library Attestation)" + } + }, + "id": 12131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5960:5:55", + "memberName": "parse", + "nodeType": "MemberAccess", + "referencedDeclaration": 16223, + "src": "5948:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_struct$_State_$16058_memory_ptr_$", + "typeString": "function (bytes memory) pure returns (struct Attestation.State memory)" + } + }, + "id": 12133, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5948:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5908:75:55" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 12138, + "name": "attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12119, + "src": "6092:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + { + "id": 12139, + "name": "attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12129, + "src": "6106:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + }, + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + ], + "expression": { + "id": 12136, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "6065:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Attestation_$16290_$", + "typeString": "type(library Attestation)" + } + }, + "id": 12137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6077:14:55", + "memberName": "areConflicting", + "nodeType": "MemberAccess", + "referencedDeclaration": 16153, + "src": "6065:26:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$16058_memory_ptr_$_t_struct$_State_$16058_memory_ptr_$returns$_t_bool_$", + "typeString": "function (struct Attestation.State memory,struct Attestation.State memory) pure returns (bool)" + } + }, + "id": 12140, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6065:54:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 12142, + "name": "attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12119, + "src": "6191:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12143, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6204:10:55", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16047, + "src": "6191:23:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12144, + "name": "attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12119, + "src": "6232:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12145, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6245:11:55", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16049, + "src": "6232:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12146, + "name": "attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12119, + "src": "6274:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12147, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6287:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "6274:33:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12148, + "name": "attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12129, + "src": "6325:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12149, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6338:10:55", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16047, + "src": "6325:23:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12150, + "name": "attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12129, + "src": "6366:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12151, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6379:11:55", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16049, + "src": "6366:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12152, + "name": "attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12129, + "src": "6408:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12153, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6421:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "6408:33:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12141, + "name": "DisputeManagerNonConflictingAttestations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15177, + "src": "6133:40:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32,bytes32,bytes32,bytes32,bytes32,bytes32) pure returns (error)" + } + }, + "id": 12154, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6133:322:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12135, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "6044:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12155, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6044:421:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12156, + "nodeType": "ExpressionStatement", + "src": "6044:421:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12160, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "6537:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 12161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6541:6:55", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "6537:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12162, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "6549:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12157, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "6512:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 12158, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6512:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 12159, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6526:10:55", + "memberName": "pullTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 792, + "src": "6512:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 12163, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6512:52:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12164, + "nodeType": "ExpressionStatement", + "src": "6512:52:55" + }, + { + "assignments": [12166], + "declarations": [ + { + "constant": false, + "id": 12166, + "mutability": "mutable", + "name": "dId1", + "nameLocation": "6674:4:55", + "nodeType": "VariableDeclaration", + "scope": 12210, + "src": "6666:12:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12165, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6666:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 12175, + "initialValue": { + "arguments": [ + { + "id": 12168, + "name": "fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12111, + "src": "6729:9:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 12169, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "6752:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "hexValue": "32", + "id": 12170, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6769:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "6752:18:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12172, + "name": "attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12119, + "src": "6784:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + { + "id": 12173, + "name": "attestationData1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12100, + "src": "6810:16:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 12167, + "name": "_createQueryDisputeWithAttestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12923, + "src": "6681:34:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_struct$_State_$16058_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (address,uint256,struct Attestation.State memory,bytes memory) returns (bytes32)" + } + }, + "id": 12174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6681:155:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6666:170:55" + }, + { + "assignments": [12177], + "declarations": [ + { + "constant": false, + "id": 12177, + "mutability": "mutable", + "name": "dId2", + "nameLocation": "6854:4:55", + "nodeType": "VariableDeclaration", + "scope": 12210, + "src": "6846:12:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12176, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6846:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 12186, + "initialValue": { + "arguments": [ + { + "id": 12179, + "name": "fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12111, + "src": "6909:9:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12182, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 12180, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "6932:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "hexValue": "32", + "id": 12181, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6949:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "6932:18:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12183, + "name": "attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12129, + "src": "6964:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + { + "id": 12184, + "name": "attestationData2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12102, + "src": "6990:16:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 12178, + "name": "_createQueryDisputeWithAttestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12923, + "src": "6861:34:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_struct$_State_$16058_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (address,uint256,struct Attestation.State memory,bytes memory) returns (bytes32)" + } + }, + "id": 12185, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6861:155:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6846:170:55" + }, + { + "expression": { + "id": 12192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "baseExpression": { + "id": 12187, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "7079:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12189, + "indexExpression": { + "id": 12188, + "name": "dId1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12166, + "src": "7088:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7079:14:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 12190, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "7094:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "7079:31:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 12191, + "name": "dId2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12177, + "src": "7113:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "7079:38:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 12193, + "nodeType": "ExpressionStatement", + "src": "7079:38:55" + }, + { + "expression": { + "id": 12199, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "baseExpression": { + "id": 12194, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "7127:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12196, + "indexExpression": { + "id": 12195, + "name": "dId2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12177, + "src": "7136:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7127:14:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 12197, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "7142:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "7127:31:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 12198, + "name": "dId1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12166, + "src": "7161:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "7127:38:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 12200, + "nodeType": "ExpressionStatement", + "src": "7127:38:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 12202, + "name": "dId1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12166, + "src": "7253:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12203, + "name": "dId2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12177, + "src": "7259:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12201, + "name": "DisputeLinked", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15066, + "src": "7239:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_bytes32_$returns$__$", + "typeString": "function (bytes32,bytes32)" + } + }, + "id": 12204, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7239:25:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12205, + "nodeType": "EmitStatement", + "src": "7234:30:55" + }, + { + "expression": { + "components": [ + { + "id": 12206, + "name": "dId1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12166, + "src": "7283:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12207, + "name": "dId2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12177, + "src": "7289:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12208, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "7282:12:55", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_bytes32_$", + "typeString": "tuple(bytes32,bytes32)" + } + }, + "functionReturnParameters": 12109, + "id": 12209, + "nodeType": "Return", + "src": "7275:19:55" + } + ] + }, + "documentation": { + "id": 12098, + "nodeType": "StructuredDocumentation", + "src": "5533:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "c894222e", + "id": 12211, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "createQueryDisputeConflict", + "nameLocation": "5578:26:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12104, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "5702:8:55" + }, + "parameters": { + "id": 12103, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12100, + "mutability": "mutable", + "name": "attestationData1", + "nameLocation": "5629:16:55", + "nodeType": "VariableDeclaration", + "scope": 12211, + "src": "5614:31:55", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 12099, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5614:5:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12102, + "mutability": "mutable", + "name": "attestationData2", + "nameLocation": "5670:16:55", + "nodeType": "VariableDeclaration", + "scope": 12211, + "src": "5655:31:55", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 12101, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5655:5:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5604:88:55" + }, + "returnParameters": { + "id": 12109, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12106, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12211, + "src": "5720:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12105, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5720:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12108, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12211, + "src": "5729:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12107, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5729:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5719:18:55" + }, + "scope": 13542, + "src": "5569:1732:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15276], + "body": { + "id": 12324, + "nodeType": "Block", + "src": "7555:1148:55", + "statements": [ + { + "assignments": [12229], + "declarations": [ + { + "constant": false, + "id": 12229, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "7603:9:55", + "nodeType": "VariableDeclaration", + "scope": 12324, + "src": "7595:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12228, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7595:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 12237, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 12233, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12214, + "src": "7642:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "6c6567616379", + "id": 12234, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7656:8:55", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_b7ccb6878fbded310d2d05350bca9c84568ecb568d4b626c83e0508c3193ce89", + "typeString": "literal_string \"legacy\"" + }, + "value": "legacy" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_stringliteral_b7ccb6878fbded310d2d05350bca9c84568ecb568d4b626c83e0508c3193ce89", + "typeString": "literal_string \"legacy\"" + } + ], + "expression": { + "id": 12231, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "7625:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 12232, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7629:12:55", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "7625:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 12235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7625:40:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 12230, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "7615:9:55", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 12236, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7615:51:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7595:71:55" + }, + { + "assignments": [12239], + "declarations": [ + { + "constant": false, + "id": 12239, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "7738:7:55", + "nodeType": "VariableDeclaration", + "scope": 12324, + "src": "7730:15:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12238, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7730:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 12246, + "initialValue": { + "expression": { + "arguments": [ + { + "id": 12243, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12214, + "src": "7778:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12240, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "7748:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 12241, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7748:15:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 12242, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7764:13:55", + "memberName": "getAllocation", + "nodeType": "MemberAccess", + "referencedDeclaration": 3196, + "src": "7748:29:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_struct$_Allocation_$3073_memory_ptr_$", + "typeString": "function (address) view external returns (struct IHorizonStakingExtension.Allocation memory)" + } + }, + "id": 12244, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7748:43:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Allocation_$3073_memory_ptr", + "typeString": "struct IHorizonStakingExtension.Allocation memory" + } + }, + "id": 12245, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7792:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 3056, + "src": "7748:51:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7730:69:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 12253, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 12248, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12239, + "src": "7817:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 12251, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7836:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 12250, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7828:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 12249, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7828:7:55", + "typeDescriptions": {} + } + }, + "id": 12252, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7828:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "7817:21:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12255, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12214, + "src": "7870:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12254, + "name": "DisputeManagerIndexerNotFound", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15155, + "src": "7840:29:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 12256, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7840:43:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12247, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "7809:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12257, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7809:75:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12258, + "nodeType": "ExpressionStatement", + "src": "7809:75:55" + }, + { + "expression": { + "id": 12280, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 12259, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "7920:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12261, + "indexExpression": { + "id": 12260, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12229, + "src": "7929:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "7920:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 12263, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12239, + "src": "7963:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12264, + "name": "fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12216, + "src": "7984:9:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "30", + "id": 12265, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8007:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "hexValue": "30", + "id": 12266, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8022:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "id": 12267, + "name": "DisputeType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14913, + "src": "8037:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeType_$14913_$", + "typeString": "type(enum IDisputeManager.DisputeType)" + } + }, + "id": 12268, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8049:13:55", + "memberName": "LegacyDispute", + "nodeType": "MemberAccess", + "referencedDeclaration": 14912, + "src": "8037:25:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + } + }, + { + "expression": { + "expression": { + "id": 12269, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "8076:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 12270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8092:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "8076:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 12271, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8106:8:55", + "memberName": "Accepted", + "nodeType": "MemberAccess", + "referencedDeclaration": 14916, + "src": "8076:38:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + { + "expression": { + "id": 12272, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "8128:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 12273, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8134:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "8128:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12277, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 12274, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "8157:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 12275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8163:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "8157:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 12276, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13559, + "src": "8175:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "8157:31:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "30", + "id": 12278, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8202:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + }, + { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 12262, + "name": "Dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14943, + "src": "7942:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_Dispute_$14943_storage_ptr_$", + "typeString": "type(struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7942:271:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_memory_ptr", + "typeString": "struct IDisputeManager.Dispute memory" + } + }, + "src": "7920:293:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 12281, + "nodeType": "ExpressionStatement", + "src": "7920:293:55" + }, + { + "assignments": [12284], + "declarations": [ + { + "constant": false, + "id": 12284, + "mutability": "mutable", + "name": "subgraphService_", + "nameLocation": "8270:16:55", + "nodeType": "VariableDeclaration", + "scope": 12324, + "src": "8253:33:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 12283, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12282, + "name": "ISubgraphService", + "nameLocations": ["8253:16:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "8253:16:55" + }, + "referencedDeclaration": 15634, + "src": "8253:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "internal" + } + ], + "id": 12287, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12285, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "8289:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 12286, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8289:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8253:57:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12291, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12239, + "src": "8343:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 12294, + "name": "tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12218, + "src": "8363:11:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12295, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12220, + "src": "8376:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 12292, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "8352:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 12293, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8356:6:55", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "8352:10:55", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 12296, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8352:38:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 12288, + "name": "subgraphService_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12284, + "src": "8320:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "id": 12290, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8337:5:55", + "memberName": "slash", + "nodeType": "MemberAccess", + "referencedDeclaration": 1526, + "src": "8320:22:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (address,bytes memory) external" + } + }, + "id": 12297, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8320:71:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12298, + "nodeType": "ExpressionStatement", + "src": "8320:71:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12302, + "name": "fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12216, + "src": "8459:9:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12303, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12220, + "src": "8470:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12299, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "8434:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 12300, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8434:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 12301, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8448:10:55", + "memberName": "pushTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 818, + "src": "8434:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 12304, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8434:50:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12305, + "nodeType": "ExpressionStatement", + "src": "8434:50:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 12307, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12229, + "src": "8521:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12308, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12239, + "src": "8532:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12309, + "name": "fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12216, + "src": "8541:9:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12310, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12214, + "src": "8552:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12311, + "name": "tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12218, + "src": "8566:11:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12312, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12220, + "src": "8579:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12306, + "name": "LegacyDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15026, + "src": "8500:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,address,uint256,uint256)" + } + }, + "id": 12313, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8500:93:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12314, + "nodeType": "EmitStatement", + "src": "8495:98:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 12316, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12229, + "src": "8624:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12317, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12239, + "src": "8635:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12318, + "name": "fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12216, + "src": "8644:9:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12319, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12220, + "src": "8655:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12315, + "name": "DisputeAccepted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15037, + "src": "8608:15:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256)" + } + }, + "id": 12320, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8608:61:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12321, + "nodeType": "EmitStatement", + "src": "8603:66:55" + }, + { + "expression": { + "id": 12322, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12229, + "src": "8687:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 12227, + "id": 12323, + "nodeType": "Return", + "src": "8680:16:55" + } + ] + }, + "documentation": { + "id": 12212, + "nodeType": "StructuredDocumentation", + "src": "7307:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "8d4e9008", + "id": 12325, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12224, + "kind": "modifierInvocation", + "modifierName": { + "id": 12223, + "name": "onlyArbitrator", + "nameLocations": ["7522:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11919, + "src": "7522:14:55" + }, + "nodeType": "ModifierInvocation", + "src": "7522:14:55" + } + ], + "name": "createAndAcceptLegacyDispute", + "nameLocation": "7352:28:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12222, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "7513:8:55" + }, + "parameters": { + "id": 12221, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12214, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "7398:12:55", + "nodeType": "VariableDeclaration", + "scope": 12325, + "src": "7390:20:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12213, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7390:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12216, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "7428:9:55", + "nodeType": "VariableDeclaration", + "scope": 12325, + "src": "7420:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12215, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7420:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12218, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "7455:11:55", + "nodeType": "VariableDeclaration", + "scope": 12325, + "src": "7447:19:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12217, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7447:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12220, + "mutability": "mutable", + "name": "tokensRewards", + "nameLocation": "7484:13:55", + "nodeType": "VariableDeclaration", + "scope": 12325, + "src": "7476:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12219, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7476:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7380:123:55" + }, + "returnParameters": { + "id": 12227, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12226, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12325, + "src": "7546:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12225, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7546:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "7545:9:55" + }, + "scope": 13542, + "src": "7343:1360:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15284], + "body": { + "id": 12364, + "nodeType": "Block", + "src": "8893:224:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12345, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "8911:42:55", + "subExpression": { + "arguments": [ + { + "baseExpression": { + "id": 12341, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "8933:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12343, + "indexExpression": { + "id": 12342, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12328, + "src": "8942:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8933:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + ], + "id": 12340, + "name": "_isDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13512, + "src": "8912:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Dispute_$14943_storage_ptr_$returns$_t_bool_$", + "typeString": "function (struct IDisputeManager.Dispute storage pointer) view returns (bool)" + } + }, + "id": 12344, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8912:41:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12347, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12328, + "src": "8987:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12346, + "name": "DisputeManagerDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15138, + "src": "8955:31:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 12348, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8955:42:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12339, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "8903:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12349, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8903:95:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12350, + "nodeType": "ExpressionStatement", + "src": "8903:95:55" + }, + { + "assignments": [12353], + "declarations": [ + { + "constant": false, + "id": 12353, + "mutability": "mutable", + "name": "dispute", + "nameLocation": "9024:7:55", + "nodeType": "VariableDeclaration", + "scope": 12364, + "src": "9008:23:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 12352, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12351, + "name": "Dispute", + "nameLocations": ["9008:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "9008:7:55" + }, + "referencedDeclaration": 14943, + "src": "9008:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "id": 12357, + "initialValue": { + "baseExpression": { + "id": 12354, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "9034:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12356, + "indexExpression": { + "id": 12355, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12328, + "src": "9043:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9034:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9008:45:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12359, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12328, + "src": "9078:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12360, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12353, + "src": "9089:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + { + "id": 12361, + "name": "tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12330, + "src": "9098:11:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12358, + "name": "_acceptDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13118, + "src": "9063:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer,uint256)" + } + }, + "id": 12362, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9063:47:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12363, + "nodeType": "ExpressionStatement", + "src": "9063:47:55" + } + ] + }, + "documentation": { + "id": 12326, + "nodeType": "StructuredDocumentation", + "src": "8709:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "050b17ad", + "id": 12365, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12334, + "kind": "modifierInvocation", + "modifierName": { + "id": 12333, + "name": "onlyArbitrator", + "nameLocations": ["8848:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11919, + "src": "8848:14:55" + }, + "nodeType": "ModifierInvocation", + "src": "8848:14:55" + }, + { + "arguments": [ + { + "id": 12336, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12328, + "src": "8882:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12337, + "kind": "modifierInvocation", + "modifierName": { + "id": 12335, + "name": "onlyPendingDispute", + "nameLocations": ["8863:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11952, + "src": "8863:18:55" + }, + "nodeType": "ModifierInvocation", + "src": "8863:29:55" + } + ], + "name": "acceptDispute", + "nameLocation": "8754:13:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12332, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "8839:8:55" + }, + "parameters": { + "id": 12331, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12328, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "8785:9:55", + "nodeType": "VariableDeclaration", + "scope": 12365, + "src": "8777:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12327, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8777:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12330, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "8812:11:55", + "nodeType": "VariableDeclaration", + "scope": 12365, + "src": "8804:19:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12329, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8804:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8767:62:55" + }, + "returnParameters": { + "id": 12338, + "nodeType": "ParameterList", + "parameters": [], + "src": "8893:0:55" + }, + "scope": 13542, + "src": "8745:372:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15296], + "body": { + "id": 12430, + "nodeType": "Block", + "src": "9389:491:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "baseExpression": { + "id": 12385, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "9428:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12387, + "indexExpression": { + "id": 12386, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12368, + "src": "9437:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9428:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + ], + "id": 12384, + "name": "_isDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13512, + "src": "9407:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Dispute_$14943_storage_ptr_$returns$_t_bool_$", + "typeString": "function (struct IDisputeManager.Dispute storage pointer) view returns (bool)" + } + }, + "id": 12388, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9407:41:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12390, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12368, + "src": "9485:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12389, + "name": "DisputeManagerDisputeNotInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15143, + "src": "9450:34:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 12391, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9450:45:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12383, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "9399:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9399:97:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12393, + "nodeType": "ExpressionStatement", + "src": "9399:97:55" + }, + { + "assignments": [12396], + "declarations": [ + { + "constant": false, + "id": 12396, + "mutability": "mutable", + "name": "dispute", + "nameLocation": "9522:7:55", + "nodeType": "VariableDeclaration", + "scope": 12430, + "src": "9506:23:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 12395, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12394, + "name": "Dispute", + "nameLocations": ["9506:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "9506:7:55" + }, + "referencedDeclaration": 14943, + "src": "9506:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "id": 12400, + "initialValue": { + "baseExpression": { + "id": 12397, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "9532:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12399, + "indexExpression": { + "id": 12398, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12368, + "src": "9541:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9532:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9506:45:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12402, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12368, + "src": "9576:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12403, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12396, + "src": "9587:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + { + "id": 12404, + "name": "tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12370, + "src": "9596:11:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12401, + "name": "_acceptDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13118, + "src": "9561:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer,uint256)" + } + }, + "id": 12405, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9561:47:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12406, + "nodeType": "ExpressionStatement", + "src": "9561:47:55" + }, + { + "condition": { + "id": 12407, + "name": "acceptDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12372, + "src": "9623:23:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 12428, + "nodeType": "Block", + "src": "9775:99:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12420, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12396, + "src": "9802:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12421, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9810:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "9802:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 12422, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "9828:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12425, + "indexExpression": { + "expression": { + "id": 12423, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12396, + "src": "9837:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12424, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9845:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "9837:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9828:34:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + ], + "id": 12419, + "name": "_drawDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13190, + "src": "9789:12:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12426, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9789:74:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12427, + "nodeType": "ExpressionStatement", + "src": "9789:74:55" + } + ] + }, + "id": 12429, + "nodeType": "IfStatement", + "src": "9619:255:55", + "trueBody": { + "id": 12418, + "nodeType": "Block", + "src": "9648:121:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12409, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12396, + "src": "9677:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12410, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9685:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "9677:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 12411, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "9703:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12414, + "indexExpression": { + "expression": { + "id": 12412, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12396, + "src": "9712:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12413, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9720:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "9712:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9703:34:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + { + "id": 12415, + "name": "tokensSlashRelated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12374, + "src": "9739:18:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12408, + "name": "_acceptDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13118, + "src": "9662:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer,uint256)" + } + }, + "id": 12416, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9662:96:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12417, + "nodeType": "ExpressionStatement", + "src": "9662:96:55" + } + ] + } + } + ] + }, + "documentation": { + "id": 12366, + "nodeType": "StructuredDocumentation", + "src": "9123:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "b0e2f7e9", + "id": 12431, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12378, + "kind": "modifierInvocation", + "modifierName": { + "id": 12377, + "name": "onlyArbitrator", + "nameLocations": ["9344:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11919, + "src": "9344:14:55" + }, + "nodeType": "ModifierInvocation", + "src": "9344:14:55" + }, + { + "arguments": [ + { + "id": 12380, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12368, + "src": "9378:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12381, + "kind": "modifierInvocation", + "modifierName": { + "id": 12379, + "name": "onlyPendingDispute", + "nameLocations": ["9359:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11952, + "src": "9359:18:55" + }, + "nodeType": "ModifierInvocation", + "src": "9359:29:55" + } + ], + "name": "acceptDisputeConflict", + "nameLocation": "9168:21:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12376, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "9335:8:55" + }, + "parameters": { + "id": 12375, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12368, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "9207:9:55", + "nodeType": "VariableDeclaration", + "scope": 12431, + "src": "9199:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12367, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "9199:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12370, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "9234:11:55", + "nodeType": "VariableDeclaration", + "scope": 12431, + "src": "9226:19:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12369, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9226:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12372, + "mutability": "mutable", + "name": "acceptDisputeInConflict", + "nameLocation": "9260:23:55", + "nodeType": "VariableDeclaration", + "scope": 12431, + "src": "9255:28:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 12371, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9255:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12374, + "mutability": "mutable", + "name": "tokensSlashRelated", + "nameLocation": "9301:18:55", + "nodeType": "VariableDeclaration", + "scope": 12431, + "src": "9293:26:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12373, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9293:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9189:136:55" + }, + "returnParameters": { + "id": 12382, + "nodeType": "ParameterList", + "parameters": [], + "src": "9389:0:55" + }, + "scope": 13542, + "src": "9159:721:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15302], + "body": { + "id": 12465, + "nodeType": "Block", + "src": "10027:199:55", + "statements": [ + { + "assignments": [12445], + "declarations": [ + { + "constant": false, + "id": 12445, + "mutability": "mutable", + "name": "dispute", + "nameLocation": "10053:7:55", + "nodeType": "VariableDeclaration", + "scope": 12465, + "src": "10037:23:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 12444, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12443, + "name": "Dispute", + "nameLocations": ["10037:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "10037:7:55" + }, + "referencedDeclaration": 14943, + "src": "10037:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "id": 12449, + "initialValue": { + "baseExpression": { + "id": 12446, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "10063:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12448, + "indexExpression": { + "id": 12447, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12434, + "src": "10072:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10063:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10037:45:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "10100:30:55", + "subExpression": { + "arguments": [ + { + "id": 12452, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12445, + "src": "10122:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + ], + "id": 12451, + "name": "_isDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13512, + "src": "10101:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Dispute_$14943_storage_ptr_$returns$_t_bool_$", + "typeString": "function (struct IDisputeManager.Dispute storage pointer) view returns (bool)" + } + }, + "id": 12453, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10101:29:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12456, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12434, + "src": "10164:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12455, + "name": "DisputeManagerDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15138, + "src": "10132:31:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 12457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10132:42:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12450, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "10092:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12458, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10092:83:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12459, + "nodeType": "ExpressionStatement", + "src": "10092:83:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12461, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12434, + "src": "10200:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12462, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12445, + "src": "10211:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + ], + "id": 12460, + "name": "_rejectDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13153, + "src": "10185:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10185:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12464, + "nodeType": "ExpressionStatement", + "src": "10185:34:55" + } + ] + }, + "documentation": { + "id": 12432, + "nodeType": "StructuredDocumentation", + "src": "9886:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "36167e03", + "id": 12466, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12438, + "kind": "modifierInvocation", + "modifierName": { + "id": 12437, + "name": "onlyArbitrator", + "nameLocations": ["9982:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11919, + "src": "9982:14:55" + }, + "nodeType": "ModifierInvocation", + "src": "9982:14:55" + }, + { + "arguments": [ + { + "id": 12440, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12434, + "src": "10016:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12441, + "kind": "modifierInvocation", + "modifierName": { + "id": 12439, + "name": "onlyPendingDispute", + "nameLocations": ["9997:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11952, + "src": "9997:18:55" + }, + "nodeType": "ModifierInvocation", + "src": "9997:29:55" + } + ], + "name": "rejectDispute", + "nameLocation": "9931:13:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12436, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "9973:8:55" + }, + "parameters": { + "id": 12435, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12434, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "9953:9:55", + "nodeType": "VariableDeclaration", + "scope": 12466, + "src": "9945:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12433, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "9945:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "9944:19:55" + }, + "returnParameters": { + "id": 12442, + "nodeType": "ParameterList", + "parameters": [], + "src": "10027:0:55" + }, + "scope": 13542, + "src": "9922:304:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15308], + "body": { + "id": 12504, + "nodeType": "Block", + "src": "10371:248:55", + "statements": [ + { + "assignments": [12480], + "declarations": [ + { + "constant": false, + "id": 12480, + "mutability": "mutable", + "name": "dispute", + "nameLocation": "10397:7:55", + "nodeType": "VariableDeclaration", + "scope": 12504, + "src": "10381:23:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 12479, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12478, + "name": "Dispute", + "nameLocations": ["10381:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "10381:7:55" + }, + "referencedDeclaration": 14943, + "src": "10381:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "id": 12484, + "initialValue": { + "baseExpression": { + "id": 12481, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "10407:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12483, + "indexExpression": { + "id": 12482, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12469, + "src": "10416:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10407:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10381:45:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12486, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12469, + "src": "10449:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12487, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12480, + "src": "10460:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + ], + "id": 12485, + "name": "_drawDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13190, + "src": "10436:12:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12488, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10436:32:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12489, + "nodeType": "ExpressionStatement", + "src": "10436:32:55" + }, + { + "condition": { + "arguments": [ + { + "id": 12491, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12480, + "src": "10504:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + ], + "id": 12490, + "name": "_isDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13512, + "src": "10483:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Dispute_$14943_storage_ptr_$returns$_t_bool_$", + "typeString": "function (struct IDisputeManager.Dispute storage pointer) view returns (bool)" + } + }, + "id": 12492, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10483:29:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 12503, + "nodeType": "IfStatement", + "src": "10479:134:55", + "trueBody": { + "id": 12502, + "nodeType": "Block", + "src": "10514:99:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12494, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12480, + "src": "10541:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12495, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10549:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "10541:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 12496, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "10567:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12499, + "indexExpression": { + "expression": { + "id": 12497, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12480, + "src": "10576:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12498, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10584:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "10576:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10567:34:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + ], + "id": 12493, + "name": "_drawDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13190, + "src": "10528:12:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12500, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10528:74:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12501, + "nodeType": "ExpressionStatement", + "src": "10528:74:55" + } + ] + } + } + ] + }, + "documentation": { + "id": 12467, + "nodeType": "StructuredDocumentation", + "src": "10232:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "9334ea52", + "id": 12505, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12473, + "kind": "modifierInvocation", + "modifierName": { + "id": 12472, + "name": "onlyArbitrator", + "nameLocations": ["10326:14:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11919, + "src": "10326:14:55" + }, + "nodeType": "ModifierInvocation", + "src": "10326:14:55" + }, + { + "arguments": [ + { + "id": 12475, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12469, + "src": "10360:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12476, + "kind": "modifierInvocation", + "modifierName": { + "id": 12474, + "name": "onlyPendingDispute", + "nameLocations": ["10341:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11952, + "src": "10341:18:55" + }, + "nodeType": "ModifierInvocation", + "src": "10341:29:55" + } + ], + "name": "drawDispute", + "nameLocation": "10277:11:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12471, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "10317:8:55" + }, + "parameters": { + "id": 12470, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12469, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "10297:9:55", + "nodeType": "VariableDeclaration", + "scope": 12505, + "src": "10289:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12468, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10289:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "10288:19:55" + }, + "returnParameters": { + "id": 12477, + "nodeType": "ParameterList", + "parameters": [], + "src": "10371:0:55" + }, + "scope": 13542, + "src": "10268:351:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15314], + "body": { + "id": 12554, + "nodeType": "Block", + "src": "10776:402:55", + "statements": [ + { + "assignments": [12520], + "declarations": [ + { + "constant": false, + "id": 12520, + "mutability": "mutable", + "name": "dispute", + "nameLocation": "10802:7:55", + "nodeType": "VariableDeclaration", + "scope": 12554, + "src": "10786:23:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 12519, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12518, + "name": "Dispute", + "nameLocations": ["10786:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "10786:7:55" + }, + "referencedDeclaration": 14943, + "src": "10786:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "id": 12524, + "initialValue": { + "baseExpression": { + "id": 12521, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "10812:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12523, + "indexExpression": { + "id": 12522, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12508, + "src": "10821:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10812:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10786:45:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12530, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 12526, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12520, + "src": "10898:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12527, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10906:13:55", + "memberName": "cancellableAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 14940, + "src": "10898:21:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "expression": { + "id": 12528, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "10923:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 12529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10929:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "10923:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10898:40:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12531, + "name": "DisputeManagerDisputePeriodNotFinished", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15133, + "src": "10940:38:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 12532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10940:40:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12525, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "10890:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12533, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10890:91:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12534, + "nodeType": "ExpressionStatement", + "src": "10890:91:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12536, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12508, + "src": "11006:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12537, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12520, + "src": "11017:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + ], + "id": 12535, + "name": "_cancelDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13227, + "src": "10991:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12538, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "10991:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12539, + "nodeType": "ExpressionStatement", + "src": "10991:34:55" + }, + { + "condition": { + "arguments": [ + { + "id": 12541, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12520, + "src": "11061:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + ], + "id": 12540, + "name": "_isDisputeInConflict", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13512, + "src": "11040:20:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Dispute_$14943_storage_ptr_$returns$_t_bool_$", + "typeString": "function (struct IDisputeManager.Dispute storage pointer) view returns (bool)" + } + }, + "id": 12542, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11040:29:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 12553, + "nodeType": "IfStatement", + "src": "11036:136:55", + "trueBody": { + "id": 12552, + "nodeType": "Block", + "src": "11071:101:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 12544, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12520, + "src": "11100:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12545, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "11108:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "11100:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 12546, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "11126:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12549, + "indexExpression": { + "expression": { + "id": 12547, + "name": "dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12520, + "src": "11135:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 12548, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "11143:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "11135:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "11126:34:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + ], + "id": 12543, + "name": "_cancelDispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13227, + "src": "11085:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_struct$_Dispute_$14943_storage_ptr_$returns$__$", + "typeString": "function (bytes32,struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12550, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11085:76:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12551, + "nodeType": "ExpressionStatement", + "src": "11085:76:55" + } + ] + } + } + ] + }, + "documentation": { + "id": 12506, + "nodeType": "StructuredDocumentation", + "src": "10625:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "1792f194", + "id": 12555, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 12512, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12508, + "src": "10735:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12513, + "kind": "modifierInvocation", + "modifierName": { + "id": 12511, + "name": "onlyFisherman", + "nameLocations": ["10721:13:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11980, + "src": "10721:13:55" + }, + "nodeType": "ModifierInvocation", + "src": "10721:24:55" + }, + { + "arguments": [ + { + "id": 12515, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12508, + "src": "10765:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 12516, + "kind": "modifierInvocation", + "modifierName": { + "id": 12514, + "name": "onlyPendingDispute", + "nameLocations": ["10746:18:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 11952, + "src": "10746:18:55" + }, + "nodeType": "ModifierInvocation", + "src": "10746:29:55" + } + ], + "name": "cancelDispute", + "nameLocation": "10670:13:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12510, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "10712:8:55" + }, + "parameters": { + "id": 12509, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12508, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "10692:9:55", + "nodeType": "VariableDeclaration", + "scope": 12555, + "src": "10684:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12507, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10684:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "10683:19:55" + }, + "returnParameters": { + "id": 12517, + "nodeType": "ParameterList", + "parameters": [], + "src": "10776:0:55" + }, + "scope": 13542, + "src": "10661:517:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15208], + "body": { + "id": 12568, + "nodeType": "Block", + "src": "11291:43:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12565, + "name": "arbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12558, + "src": "11316:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12564, + "name": "_setArbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13346, + "src": "11301:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 12566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11301:26:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12567, + "nodeType": "ExpressionStatement", + "src": "11301:26:55" + } + ] + }, + "documentation": { + "id": 12556, + "nodeType": "StructuredDocumentation", + "src": "11184:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "b0eefabe", + "id": 12569, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12562, + "kind": "modifierInvocation", + "modifierName": { + "id": 12561, + "name": "onlyOwner", + "nameLocations": ["11281:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "11281:9:55" + }, + "nodeType": "ModifierInvocation", + "src": "11281:9:55" + } + ], + "name": "setArbitrator", + "nameLocation": "11229:13:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12560, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "11272:8:55" + }, + "parameters": { + "id": 12559, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12558, + "mutability": "mutable", + "name": "arbitrator", + "nameLocation": "11251:10:55", + "nodeType": "VariableDeclaration", + "scope": 12569, + "src": "11243:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12557, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11243:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "11242:20:55" + }, + "returnParameters": { + "id": 12563, + "nodeType": "ParameterList", + "parameters": [], + "src": "11291:0:55" + }, + "scope": 13542, + "src": "11220:114:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15202], + "body": { + "id": 12582, + "nodeType": "Block", + "src": "11452:49:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12579, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12572, + "src": "11480:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 12578, + "name": "_setDisputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13369, + "src": "11462:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint64_$returns$__$", + "typeString": "function (uint64)" + } + }, + "id": 12580, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11462:32:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12581, + "nodeType": "ExpressionStatement", + "src": "11462:32:55" + } + ] + }, + "documentation": { + "id": 12570, + "nodeType": "StructuredDocumentation", + "src": "11340:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "d76f62d1", + "id": 12583, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12576, + "kind": "modifierInvocation", + "modifierName": { + "id": 12575, + "name": "onlyOwner", + "nameLocations": ["11442:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "11442:9:55" + }, + "nodeType": "ModifierInvocation", + "src": "11442:9:55" + } + ], + "name": "setDisputePeriod", + "nameLocation": "11385:16:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12574, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "11433:8:55" + }, + "parameters": { + "id": 12573, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12572, + "mutability": "mutable", + "name": "disputePeriod", + "nameLocation": "11409:13:55", + "nodeType": "VariableDeclaration", + "scope": 12583, + "src": "11402:20:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 12571, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "11402:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "11401:22:55" + }, + "returnParameters": { + "id": 12577, + "nodeType": "ParameterList", + "parameters": [], + "src": "11452:0:55" + }, + "scope": 13542, + "src": "11376:125:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15214], + "body": { + "id": 12596, + "nodeType": "Block", + "src": "11622:51:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12593, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12586, + "src": "11651:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12592, + "name": "_setDisputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13393, + "src": "11632:18:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 12594, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11632:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12595, + "nodeType": "ExpressionStatement", + "src": "11632:34:55" + } + ] + }, + "documentation": { + "id": 12584, + "nodeType": "StructuredDocumentation", + "src": "11507:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "16972978", + "id": 12597, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12590, + "kind": "modifierInvocation", + "modifierName": { + "id": 12589, + "name": "onlyOwner", + "nameLocations": ["11612:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "11612:9:55" + }, + "nodeType": "ModifierInvocation", + "src": "11612:9:55" + } + ], + "name": "setDisputeDeposit", + "nameLocation": "11552:17:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12588, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "11603:8:55" + }, + "parameters": { + "id": 12587, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12586, + "mutability": "mutable", + "name": "disputeDeposit", + "nameLocation": "11578:14:55", + "nodeType": "VariableDeclaration", + "scope": 12597, + "src": "11570:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12585, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11570:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11569:24:55" + }, + "returnParameters": { + "id": 12591, + "nodeType": "ParameterList", + "parameters": [], + "src": "11622:0:55" + }, + "scope": 13542, + "src": "11543:130:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15220], + "body": { + "id": 12610, + "nodeType": "Block", + "src": "11802:60:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12607, + "name": "fishermanRewardCut_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12600, + "src": "11835:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 12606, + "name": "_setFishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13417, + "src": "11812:22:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 12608, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11812:43:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12609, + "nodeType": "ExpressionStatement", + "src": "11812:43:55" + } + ] + }, + "documentation": { + "id": 12598, + "nodeType": "StructuredDocumentation", + "src": "11679:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "76c993ae", + "id": 12611, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12604, + "kind": "modifierInvocation", + "modifierName": { + "id": 12603, + "name": "onlyOwner", + "nameLocations": ["11792:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "11792:9:55" + }, + "nodeType": "ModifierInvocation", + "src": "11792:9:55" + } + ], + "name": "setFishermanRewardCut", + "nameLocation": "11724:21:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12602, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "11783:8:55" + }, + "parameters": { + "id": 12601, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12600, + "mutability": "mutable", + "name": "fishermanRewardCut_", + "nameLocation": "11753:19:55", + "nodeType": "VariableDeclaration", + "scope": 12611, + "src": "11746:26:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 12599, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "11746:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "11745:28:55" + }, + "returnParameters": { + "id": 12605, + "nodeType": "ParameterList", + "parameters": [], + "src": "11802:0:55" + }, + "scope": 13542, + "src": "11715:147:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15226], + "body": { + "id": 12624, + "nodeType": "Block", + "src": "11983:52:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12621, + "name": "maxSlashingCut_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12614, + "src": "12012:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 12620, + "name": "_setMaxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13442, + "src": "11993:18:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 12622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11993:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12623, + "nodeType": "ExpressionStatement", + "src": "11993:35:55" + } + ] + }, + "documentation": { + "id": 12612, + "nodeType": "StructuredDocumentation", + "src": "11868:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "9f81a7cf", + "id": 12625, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12618, + "kind": "modifierInvocation", + "modifierName": { + "id": 12617, + "name": "onlyOwner", + "nameLocations": ["11973:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "11973:9:55" + }, + "nodeType": "ModifierInvocation", + "src": "11973:9:55" + } + ], + "name": "setMaxSlashingCut", + "nameLocation": "11913:17:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12616, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "11964:8:55" + }, + "parameters": { + "id": 12615, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12614, + "mutability": "mutable", + "name": "maxSlashingCut_", + "nameLocation": "11938:15:55", + "nodeType": "VariableDeclaration", + "scope": 12625, + "src": "11931:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 12613, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "11931:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "11930:24:55" + }, + "returnParameters": { + "id": 12619, + "nodeType": "ParameterList", + "parameters": [], + "src": "11983:0:55" + }, + "scope": 13542, + "src": "11904:131:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15232], + "body": { + "id": 12638, + "nodeType": "Block", + "src": "12159:54:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12635, + "name": "subgraphService_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12628, + "src": "12189:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12634, + "name": "_setSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13470, + "src": "12169:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 12636, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12169:37:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12637, + "nodeType": "ExpressionStatement", + "src": "12169:37:55" + } + ] + }, + "documentation": { + "id": 12626, + "nodeType": "StructuredDocumentation", + "src": "12041:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "93a90a1e", + "id": 12639, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 12632, + "kind": "modifierInvocation", + "modifierName": { + "id": 12631, + "name": "onlyOwner", + "nameLocations": ["12149:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "12149:9:55" + }, + "nodeType": "ModifierInvocation", + "src": "12149:9:55" + } + ], + "name": "setSubgraphService", + "nameLocation": "12086:18:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12630, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "12140:8:55" + }, + "parameters": { + "id": 12629, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12628, + "mutability": "mutable", + "name": "subgraphService_", + "nameLocation": "12113:16:55", + "nodeType": "VariableDeclaration", + "scope": 12639, + "src": "12105:24:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12627, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12105:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12104:26:55" + }, + "returnParameters": { + "id": 12633, + "nodeType": "ParameterList", + "parameters": [], + "src": "12159:0:55" + }, + "scope": 13542, + "src": "12077:136:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15343], + "body": { + "id": 12653, + "nodeType": "Block", + "src": "12357:47:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12650, + "name": "receipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12643, + "src": "12389:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_calldata_ptr", + "typeString": "struct Attestation.Receipt calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Receipt_$16044_calldata_ptr", + "typeString": "struct Attestation.Receipt calldata" + } + ], + "id": 12649, + "name": "_encodeReceipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17554, + "src": "12374:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Receipt_$16044_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (struct Attestation.Receipt memory) view returns (bytes32)" + } + }, + "id": 12651, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12374:23:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 12648, + "id": 12652, + "nodeType": "Return", + "src": "12367:30:55" + } + ] + }, + "documentation": { + "id": 12640, + "nodeType": "StructuredDocumentation", + "src": "12219:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "6369df6b", + "id": 12654, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "encodeReceipt", + "nameLocation": "12264:13:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12645, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "12330:8:55" + }, + "parameters": { + "id": 12644, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12643, + "mutability": "mutable", + "name": "receipt", + "nameLocation": "12307:7:55", + "nodeType": "VariableDeclaration", + "scope": 12654, + "src": "12278:36:55", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_calldata_ptr", + "typeString": "struct Attestation.Receipt" + }, + "typeName": { + "id": 12642, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12641, + "name": "Attestation.Receipt", + "nameLocations": ["12278:11:55", "12290:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16044, + "src": "12278:19:55" + }, + "referencedDeclaration": 16044, + "src": "12278:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_storage_ptr", + "typeString": "struct Attestation.Receipt" + } + }, + "visibility": "internal" + } + ], + "src": "12277:38:55" + }, + "returnParameters": { + "id": 12648, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12647, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12654, + "src": "12348:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12646, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12348:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "12347:9:55" + }, + "scope": 13542, + "src": "12255:149:55", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15320], + "body": { + "id": 12663, + "nodeType": "Block", + "src": "12519:42:55", + "statements": [ + { + "expression": { + "id": 12661, + "name": "fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13565, + "src": "12536:18:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "functionReturnParameters": 12660, + "id": 12662, + "nodeType": "Return", + "src": "12529:25:55" + } + ] + }, + "documentation": { + "id": 12655, + "nodeType": "StructuredDocumentation", + "src": "12410:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "bb2a2b47", + "id": 12664, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getFishermanRewardCut", + "nameLocation": "12455:21:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12657, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "12493:8:55" + }, + "parameters": { + "id": 12656, + "nodeType": "ParameterList", + "parameters": [], + "src": "12476:2:55" + }, + "returnParameters": { + "id": 12660, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12659, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12664, + "src": "12511:6:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 12658, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "12511:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "12510:8:55" + }, + "scope": 13542, + "src": "12446:115:55", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15326], + "body": { + "id": 12673, + "nodeType": "Block", + "src": "12671:37:55", + "statements": [ + { + "expression": { + "id": 12671, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13559, + "src": "12688:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "functionReturnParameters": 12670, + "id": 12672, + "nodeType": "Return", + "src": "12681:20:55" + } + ] + }, + "documentation": { + "id": 12665, + "nodeType": "StructuredDocumentation", + "src": "12567:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "5aea0ec4", + "id": 12674, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getDisputePeriod", + "nameLocation": "12612:16:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12667, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "12645:8:55" + }, + "parameters": { + "id": 12666, + "nodeType": "ParameterList", + "parameters": [], + "src": "12628:2:55" + }, + "returnParameters": { + "id": 12670, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12669, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12674, + "src": "12663:6:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 12668, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "12663:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "12662:8:55" + }, + "scope": 13542, + "src": "12603:105:55", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15360], + "body": { + "id": 12705, + "nodeType": "Block", + "src": "12834:226:55", + "statements": [ + { + "assignments": [12687], + "declarations": [ + { + "constant": false, + "id": 12687, + "mutability": "mutable", + "name": "provision", + "nameLocation": "12877:9:55", + "nodeType": "VariableDeclaration", + "scope": 12705, + "src": "12844:42:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 12686, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12685, + "name": "IHorizonStaking.Provision", + "nameLocations": ["12844:15:55", "12860:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "12844:25:55" + }, + "referencedDeclaration": 3962, + "src": "12844:25:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 12698, + "initialValue": { + "arguments": [ + { + "id": 12691, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12677, + "src": "12931:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12694, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "12960:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 12695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12960:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + ], + "id": 12693, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12952:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 12692, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12952:7:55", + "typeDescriptions": {} + } + }, + "id": 12696, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12952:30:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12688, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "12889:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 12689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12889:15:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 12690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12905:12:55", + "memberName": "getProvision", + "nodeType": "MemberAccess", + "referencedDeclaration": 2950, + "src": "12889:28:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 12697, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12889:103:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12844:148:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12700, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12677, + "src": "13027:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 12701, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12687, + "src": "13036:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 12702, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13046:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "13036:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12699, + "name": "_getStakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13541, + "src": "13009:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (address,uint256) view returns (uint256)" + } + }, + "id": 12703, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13009:44:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 12682, + "id": 12704, + "nodeType": "Return", + "src": "13002:51:55" + } + ] + }, + "documentation": { + "id": 12675, + "nodeType": "StructuredDocumentation", + "src": "12714:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "c133b429", + "id": 12706, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getStakeSnapshot", + "nameLocation": "12759:16:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12679, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "12807:8:55" + }, + "parameters": { + "id": 12678, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12677, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "12784:7:55", + "nodeType": "VariableDeclaration", + "scope": 12706, + "src": "12776:15:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12676, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12776:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12775:17:55" + }, + "returnParameters": { + "id": 12682, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12681, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12706, + "src": "12825:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12680, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12825:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12824:9:55" + }, + "scope": 13542, + "src": "12750:310:55", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15372], + "body": { + "id": 12725, + "nodeType": "Block", + "src": "13280:78:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 12721, + "name": "attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12710, + "src": "13324:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_calldata_ptr", + "typeString": "struct Attestation.State calldata" + } + }, + { + "id": 12722, + "name": "attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12713, + "src": "13338:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_calldata_ptr", + "typeString": "struct Attestation.State calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_State_$16058_calldata_ptr", + "typeString": "struct Attestation.State calldata" + }, + { + "typeIdentifier": "t_struct$_State_$16058_calldata_ptr", + "typeString": "struct Attestation.State calldata" + } + ], + "expression": { + "id": 12719, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "13297:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Attestation_$16290_$", + "typeString": "type(library Attestation)" + } + }, + "id": 12720, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13309:14:55", + "memberName": "areConflicting", + "nodeType": "MemberAccess", + "referencedDeclaration": 16153, + "src": "13297:26:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$16058_memory_ptr_$_t_struct$_State_$16058_memory_ptr_$returns$_t_bool_$", + "typeString": "function (struct Attestation.State memory,struct Attestation.State memory) pure returns (bool)" + } + }, + "id": 12723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13297:54:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 12718, + "id": 12724, + "nodeType": "Return", + "src": "13290:61:55" + } + ] + }, + "documentation": { + "id": 12707, + "nodeType": "StructuredDocumentation", + "src": "13066:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "d36fc9d4", + "id": 12726, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "areConflictingAttestations", + "nameLocation": "13111:26:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12715, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "13256:8:55" + }, + "parameters": { + "id": 12714, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12710, + "mutability": "mutable", + "name": "attestation1", + "nameLocation": "13174:12:55", + "nodeType": "VariableDeclaration", + "scope": 12726, + "src": "13147:39:55", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_calldata_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 12709, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12708, + "name": "Attestation.State", + "nameLocations": ["13147:11:55", "13159:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "13147:17:55" + }, + "referencedDeclaration": 16058, + "src": "13147:17:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12713, + "mutability": "mutable", + "name": "attestation2", + "nameLocation": "13223:12:55", + "nodeType": "VariableDeclaration", + "scope": 12726, + "src": "13196:39:55", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_calldata_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 12712, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12711, + "name": "Attestation.State", + "nameLocations": ["13196:11:55", "13208:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "13196:17:55" + }, + "referencedDeclaration": 16058, + "src": "13196:17:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "13137:104:55" + }, + "returnParameters": { + "id": 12718, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12717, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12726, + "src": "13274:4:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 12716, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "13274:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "13273:6:55" + }, + "scope": 13542, + "src": "13102:256:55", + "stateMutability": "pure", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15352], + "body": { + "id": 12782, + "nodeType": "Block", + "src": "13499:574:55", + "statements": [ + { + "assignments": [12736], + "declarations": [ + { + "constant": false, + "id": 12736, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "13589:12:55", + "nodeType": "VariableDeclaration", + "scope": 12782, + "src": "13581:20:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12735, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13581:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 12740, + "initialValue": { + "arguments": [ + { + "id": 12738, + "name": "attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12730, + "src": "13619:11:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + ], + "id": 12737, + "name": "_recoverSigner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17524, + "src": "13604:14:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_State_$16058_memory_ptr_$returns$_t_address_$", + "typeString": "function (struct Attestation.State memory) view returns (address)" + } + }, + "id": 12739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13604:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13581:50:55" + }, + { + "assignments": [12745], + "declarations": [ + { + "constant": false, + "id": 12745, + "mutability": "mutable", + "name": "alloc", + "nameLocation": "13666:5:55", + "nodeType": "VariableDeclaration", + "scope": 12782, + "src": "13642:29:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 12744, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12743, + "name": "Allocation.State", + "nameLocations": ["13642:10:55", "13653:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "13642:16:55" + }, + "referencedDeclaration": 15663, + "src": "13642:16:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 12751, + "initialValue": { + "arguments": [ + { + "id": 12749, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12736, + "src": "13710:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12746, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "13674:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 12747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13674:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "id": 12748, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13696:13:55", + "memberName": "getAllocation", + "nodeType": "MemberAccess", + "referencedDeclaration": 15588, + "src": "13674:35:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (address) view external returns (struct Allocation.State memory)" + } + }, + "id": 12750, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13674:49:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13642:81:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 12759, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 12753, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12745, + "src": "13741:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 12754, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13747:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "13741:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 12757, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13766:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 12756, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13758:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 12755, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13758:7:55", + "typeDescriptions": {} + } + }, + "id": 12758, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13758:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "13741:27:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12761, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12736, + "src": "13800:12:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12760, + "name": "DisputeManagerIndexerNotFound", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15155, + "src": "13770:29:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 12762, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13770:43:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12752, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "13733:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12763, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13733:81:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12764, + "nodeType": "ExpressionStatement", + "src": "13733:81:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 12770, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 12766, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12745, + "src": "13845:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 12767, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13851:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "13845:26:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 12768, + "name": "attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12730, + "src": "13875:11:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12769, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13887:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "13875:32:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "13845:62:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 12772, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12745, + "src": "13965:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 12773, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13971:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "13965:26:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12774, + "name": "attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12730, + "src": "13993:11:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12775, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14005:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "13993:32:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12771, + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15162, + "src": "13921:43:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32,bytes32) pure returns (error)" + } + }, + "id": 12776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13921:105:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12765, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "13824:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12777, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13824:212:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12778, + "nodeType": "ExpressionStatement", + "src": "13824:212:55" + }, + { + "expression": { + "expression": { + "id": 12779, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12745, + "src": "14053:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 12780, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14059:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "14053:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 12734, + "id": 12781, + "nodeType": "Return", + "src": "14046:20:55" + } + ] + }, + "documentation": { + "id": 12727, + "nodeType": "StructuredDocumentation", + "src": "13364:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "c9747f51", + "id": 12783, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getAttestationIndexer", + "nameLocation": "13409:21:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 12731, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12730, + "mutability": "mutable", + "name": "attestation", + "nameLocation": "13456:11:55", + "nodeType": "VariableDeclaration", + "scope": 12783, + "src": "13431:36:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 12729, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12728, + "name": "Attestation.State", + "nameLocations": ["13431:11:55", "13443:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "13431:17:55" + }, + "referencedDeclaration": 16058, + "src": "13431:17:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "13430:38:55" + }, + "returnParameters": { + "id": 12734, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12733, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12783, + "src": "13490:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12732, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13490:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "13489:9:55" + }, + "scope": 13542, + "src": "13400:673:55", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "baseFunctions": [15334], + "body": { + "id": 12800, + "nodeType": "Block", + "src": "14196:72:55", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + "id": 12798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "baseExpression": { + "id": 12792, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "14213:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12794, + "indexExpression": { + "id": 12793, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12786, + "src": "14222:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "14213:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 12795, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14233:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "14213:26:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "expression": { + "id": 12796, + "name": "DisputeStatus", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14921, + "src": "14243:13:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 12797, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "14257:4:55", + "memberName": "Null", + "nodeType": "MemberAccess", + "referencedDeclaration": 14915, + "src": "14243:18:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "src": "14213:48:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 12791, + "id": 12799, + "nodeType": "Return", + "src": "14206:55:55" + } + ] + }, + "documentation": { + "id": 12784, + "nodeType": "StructuredDocumentation", + "src": "14079:31:55", + "text": "@inheritdoc IDisputeManager" + }, + "functionSelector": "be41f384", + "id": 12801, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isDisputeCreated", + "nameLocation": "14124:16:55", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 12788, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "14172:8:55" + }, + "parameters": { + "id": 12787, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12786, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "14149:9:55", + "nodeType": "VariableDeclaration", + "scope": 12801, + "src": "14141:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12785, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "14141:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "14140:19:55" + }, + "returnParameters": { + "id": 12791, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12790, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12801, + "src": "14190:4:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 12789, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "14190:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "14189:6:55" + }, + "scope": 13542, + "src": "14115:153:55", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 12922, + "nodeType": "Block", + "src": "15030:1622:55", + "statements": [ + { + "assignments": [12817], + "declarations": [ + { + "constant": false, + "id": 12817, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "15103:7:55", + "nodeType": "VariableDeclaration", + "scope": 12922, + "src": "15095:15:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12816, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15095:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 12821, + "initialValue": { + "arguments": [ + { + "id": 12819, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12809, + "src": "15135:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + ], + "id": 12818, + "name": "getAttestationIndexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12783, + "src": "15113:21:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_State_$16058_memory_ptr_$returns$_t_address_$", + "typeString": "function (struct Attestation.State memory) view returns (address)" + } + }, + "id": 12820, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15113:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15095:53:55" + }, + { + "assignments": [12826], + "declarations": [ + { + "constant": false, + "id": 12826, + "mutability": "mutable", + "name": "provision", + "nameLocation": "15229:9:55", + "nodeType": "VariableDeclaration", + "scope": 12922, + "src": "15196:42:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 12825, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12824, + "name": "IHorizonStaking.Provision", + "nameLocations": ["15196:15:55", "15212:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "15196:25:55" + }, + "referencedDeclaration": 3962, + "src": "15196:25:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 12837, + "initialValue": { + "arguments": [ + { + "id": 12830, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12817, + "src": "15283:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12833, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "15312:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 12834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15312:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + ], + "id": 12832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "15304:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 12831, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15304:7:55", + "typeDescriptions": {} + } + }, + "id": 12835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15304:30:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12827, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "15241:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 12828, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15241:15:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 12829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15257:12:55", + "memberName": "getProvision", + "nodeType": "MemberAccess", + "referencedDeclaration": 2950, + "src": "15241:28:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 12836, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15241:103:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15196:148:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 12839, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12826, + "src": "15362:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 12840, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15372:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "15362:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 12841, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15382:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "15362:21:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12843, + "name": "DisputeManagerZeroTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15092, + "src": "15385:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 12844, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15385:26:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12838, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "15354:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12845, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15354:58:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12846, + "nodeType": "ExpressionStatement", + "src": "15354:58:55" + }, + { + "assignments": [12848], + "declarations": [ + { + "constant": false, + "id": 12848, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "15461:9:55", + "nodeType": "VariableDeclaration", + "scope": 12922, + "src": "15453:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12847, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "15453:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 12862, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "expression": { + "id": 12852, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12809, + "src": "15530:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12853, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15543:10:55", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16047, + "src": "15530:23:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12854, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12809, + "src": "15571:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12855, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15584:11:55", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16049, + "src": "15571:24:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 12856, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12809, + "src": "15613:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12857, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15626:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "15613:33:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12858, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12817, + "src": "15664:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12859, + "name": "_fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12804, + "src": "15689:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 12850, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "15496:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 12851, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "15500:12:55", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "15496:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 12860, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15496:217:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 12849, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "15473:9:55", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 12861, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15473:250:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15453:270:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12867, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "15780:28:55", + "subExpression": { + "arguments": [ + { + "id": 12865, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12848, + "src": "15798:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12864, + "name": "isDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12801, + "src": "15781:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32) view returns (bool)" + } + }, + "id": 12866, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15781:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12869, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12848, + "src": "15846:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12868, + "name": "DisputeManagerDisputeAlreadyCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15130, + "src": "15810:35:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 12870, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15810:46:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12863, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "15772:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12871, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15772:85:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12872, + "nodeType": "ExpressionStatement", + "src": "15772:85:55" + }, + { + "assignments": [12874], + "declarations": [ + { + "constant": false, + "id": 12874, + "mutability": "mutable", + "name": "stakeSnapshot", + "nameLocation": "15901:13:55", + "nodeType": "VariableDeclaration", + "scope": 12922, + "src": "15893:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12873, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15893:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 12880, + "initialValue": { + "arguments": [ + { + "id": 12876, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12817, + "src": "15935:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 12877, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12826, + "src": "15944:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 12878, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15954:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "15944:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12875, + "name": "_getStakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13541, + "src": "15917:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (address,uint256) view returns (uint256)" + } + }, + "id": 12879, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15917:44:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15893:68:55" + }, + { + "assignments": [12882], + "declarations": [ + { + "constant": false, + "id": 12882, + "mutability": "mutable", + "name": "cancellableAt", + "nameLocation": "15979:13:55", + "nodeType": "VariableDeclaration", + "scope": 12922, + "src": "15971:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12881, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15971:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 12887, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12886, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 12883, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "15995:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 12884, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16001:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "15995:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 12885, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13559, + "src": "16013:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "15995:31:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "15971:55:55" + }, + { + "expression": { + "id": 12906, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 12888, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "16036:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 12890, + "indexExpression": { + "id": 12889, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12848, + "src": "16045:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "16036:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 12892, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12817, + "src": "16079:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12893, + "name": "_fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12804, + "src": "16100:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12894, + "name": "_deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12806, + "src": "16124:8:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "30", + "id": 12895, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "16146:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "id": 12896, + "name": "DisputeType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14913, + "src": "16184:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeType_$14913_$", + "typeString": "type(enum IDisputeManager.DisputeType)" + } + }, + "id": 12897, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "16196:12:55", + "memberName": "QueryDispute", + "nodeType": "MemberAccess", + "referencedDeclaration": 14911, + "src": "16184:24:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + } + }, + { + "expression": { + "expression": { + "id": 12898, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "16222:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 12899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16238:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "16222:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 12900, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "16252:7:55", + "memberName": "Pending", + "nodeType": "MemberAccess", + "referencedDeclaration": 14919, + "src": "16222:37:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + { + "expression": { + "id": 12901, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "16273:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 12902, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16279:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "16273:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12903, + "name": "cancellableAt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12882, + "src": "16302:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12904, + "name": "stakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12874, + "src": "16329:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + }, + { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12891, + "name": "Dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14943, + "src": "16058:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_Dispute_$14943_storage_ptr_$", + "typeString": "type(struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 12905, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16058:294:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_memory_ptr", + "typeString": "struct IDisputeManager.Dispute memory" + } + }, + "src": "16036:316:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 12907, + "nodeType": "ExpressionStatement", + "src": "16036:316:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 12909, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12848, + "src": "16401:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12910, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12817, + "src": "16424:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12911, + "name": "_fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12804, + "src": "16445:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12912, + "name": "_deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12806, + "src": "16469:8:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 12913, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12809, + "src": "16491:12:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 12914, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16504:20:55", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "16491:33:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 12915, + "name": "_attestationData", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12811, + "src": "16538:16:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 12916, + "name": "cancellableAt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12882, + "src": "16568:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 12917, + "name": "stakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12874, + "src": "16595:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 12908, + "name": "QueryDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14992, + "src": "16368:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$_t_bytes32_$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256,bytes32,bytes memory,uint256,uint256)" + } + }, + "id": 12918, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16368:250:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12919, + "nodeType": "EmitStatement", + "src": "16363:255:55" + }, + { + "expression": { + "id": 12920, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12848, + "src": "16636:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 12815, + "id": 12921, + "nodeType": "Return", + "src": "16629:16:55" + } + ] + }, + "documentation": { + "id": 12802, + "nodeType": "StructuredDocumentation", + "src": "14274:535:55", + "text": " @notice Create a query dispute passing the parsed attestation.\n To be used in createQueryDispute() and createQueryDisputeConflict()\n to avoid calling parseAttestation() multiple times\n `attestationData` is only passed to be emitted\n @param _fisherman Creator of dispute\n @param _deposit Amount of tokens staked as deposit\n @param _attestation Attestation struct parsed from bytes\n @param _attestationData Attestation bytes submitted by the fisherman\n @return DisputeId" + }, + "id": 12923, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_createQueryDisputeWithAttestation", + "nameLocation": "14823:34:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 12812, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12804, + "mutability": "mutable", + "name": "_fisherman", + "nameLocation": "14875:10:55", + "nodeType": "VariableDeclaration", + "scope": 12923, + "src": "14867:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12803, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14867:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12806, + "mutability": "mutable", + "name": "_deposit", + "nameLocation": "14903:8:55", + "nodeType": "VariableDeclaration", + "scope": 12923, + "src": "14895:16:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12805, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14895:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12809, + "mutability": "mutable", + "name": "_attestation", + "nameLocation": "14946:12:55", + "nodeType": "VariableDeclaration", + "scope": 12923, + "src": "14921:37:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 12808, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12807, + "name": "Attestation.State", + "nameLocations": ["14921:11:55", "14933:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "14921:17:55" + }, + "referencedDeclaration": 16058, + "src": "14921:17:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12811, + "mutability": "mutable", + "name": "_attestationData", + "nameLocation": "14981:16:55", + "nodeType": "VariableDeclaration", + "scope": 12923, + "src": "14968:29:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 12810, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "14968:5:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "14857:146:55" + }, + "returnParameters": { + "id": 12815, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12814, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 12923, + "src": "15021:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12813, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "15021:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "15020:9:55" + }, + "scope": 13542, + "src": "14814:1838:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13064, + "nodeType": "Block", + "src": "17155:1565:55", + "statements": [ + { + "assignments": [12938], + "declarations": [ + { + "constant": false, + "id": 12938, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "17203:9:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "17195:17:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12937, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "17195:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 12946, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 12942, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12930, + "src": "17242:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 12943, + "name": "_poi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12932, + "src": "17257:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 12940, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "17225:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 12941, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "17229:12:55", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "17225:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 12944, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17225:37:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 12939, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "17215:9:55", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 12945, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17215:48:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17195:68:55" + }, + { + "expression": { + "arguments": [ + { + "id": 12951, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "17340:28:55", + "subExpression": { + "arguments": [ + { + "id": 12949, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12938, + "src": "17358:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12948, + "name": "isDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12801, + "src": "17341:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32) view returns (bool)" + } + }, + "id": 12950, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17341:27:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12953, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12938, + "src": "17406:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 12952, + "name": "DisputeManagerDisputeAlreadyCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15130, + "src": "17370:35:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 12954, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17370:46:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12947, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "17332:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12955, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17332:85:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12956, + "nodeType": "ExpressionStatement", + "src": "17332:85:55" + }, + { + "assignments": [12959], + "declarations": [ + { + "constant": false, + "id": 12959, + "mutability": "mutable", + "name": "subgraphService_", + "nameLocation": "17478:16:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "17461:33:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 12958, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12957, + "name": "ISubgraphService", + "nameLocations": ["17461:16:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "17461:16:55" + }, + "referencedDeclaration": 15634, + "src": "17461:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "internal" + } + ], + "id": 12962, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12960, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "17497:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 12961, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17497:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17461:57:55" + }, + { + "assignments": [12967], + "declarations": [ + { + "constant": false, + "id": 12967, + "mutability": "mutable", + "name": "alloc", + "nameLocation": "17552:5:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "17528:29:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 12966, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12965, + "name": "Allocation.State", + "nameLocations": ["17528:10:55", "17539:5:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "17528:16:55" + }, + "referencedDeclaration": 15663, + "src": "17528:16:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 12972, + "initialValue": { + "arguments": [ + { + "id": 12970, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12930, + "src": "17591:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 12968, + "name": "subgraphService_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12959, + "src": "17560:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "id": 12969, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17577:13:55", + "memberName": "getAllocation", + "nodeType": "MemberAccess", + "referencedDeclaration": 15588, + "src": "17560:30:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (address) view external returns (struct Allocation.State memory)" + } + }, + "id": 12971, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17560:45:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17528:77:55" + }, + { + "assignments": [12974], + "declarations": [ + { + "constant": false, + "id": 12974, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "17623:7:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "17615:15:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12973, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17615:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 12977, + "initialValue": { + "expression": { + "id": 12975, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12967, + "src": "17633:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 12976, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17639:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "17633:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17615:31:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 12984, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 12979, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12974, + "src": "17664:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 12982, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17683:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 12981, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17675:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 12980, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17675:7:55", + "typeDescriptions": {} + } + }, + "id": 12983, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17675:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "17664:21:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 12986, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12930, + "src": "17717:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 12985, + "name": "DisputeManagerIndexerNotFound", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15155, + "src": "17687:29:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 12987, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17687:44:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 12978, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "17656:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 12988, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17656:76:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12989, + "nodeType": "ExpressionStatement", + "src": "17656:76:55" + }, + { + "assignments": [12994], + "declarations": [ + { + "constant": false, + "id": 12994, + "mutability": "mutable", + "name": "provision", + "nameLocation": "17818:9:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "17785:42:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 12993, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 12992, + "name": "IHorizonStaking.Provision", + "nameLocations": ["17785:15:55", "17801:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "17785:25:55" + }, + "referencedDeclaration": 3962, + "src": "17785:25:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 13004, + "initialValue": { + "arguments": [ + { + "id": 12998, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12974, + "src": "17859:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 13001, + "name": "subgraphService_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12959, + "src": "17876:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + ], + "id": 13000, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17868:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 12999, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17868:7:55", + "typeDescriptions": {} + } + }, + "id": 13002, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17868:25:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 12995, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "17830:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 12996, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17830:15:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 12997, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17846:12:55", + "memberName": "getProvision", + "nodeType": "MemberAccess", + "referencedDeclaration": 2950, + "src": "17830:28:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 13003, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17830:64:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17785:109:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13009, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 13006, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12994, + "src": "17912:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 13007, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17922:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "17912:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 13008, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17932:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "17912:21:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13010, + "name": "DisputeManagerZeroTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15092, + "src": "17935:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13011, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17935:26:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13005, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "17904:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13012, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17904:58:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13013, + "nodeType": "ExpressionStatement", + "src": "17904:58:55" + }, + { + "assignments": [13015], + "declarations": [ + { + "constant": false, + "id": 13015, + "mutability": "mutable", + "name": "stakeSnapshot", + "nameLocation": "18006:13:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "17998:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13014, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17998:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13021, + "initialValue": { + "arguments": [ + { + "id": 13017, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12974, + "src": "18040:7:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13018, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12994, + "src": "18049:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 13019, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18059:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "18049:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13016, + "name": "_getStakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13541, + "src": "18022:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (address,uint256) view returns (uint256)" + } + }, + "id": 13020, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18022:44:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17998:68:55" + }, + { + "assignments": [13023], + "declarations": [ + { + "constant": false, + "id": 13023, + "mutability": "mutable", + "name": "cancellableAt", + "nameLocation": "18084:13:55", + "nodeType": "VariableDeclaration", + "scope": 13064, + "src": "18076:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13022, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18076:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13028, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13027, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 13024, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "18100:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 13025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18106:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "18100:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 13026, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13559, + "src": "18118:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "18100:31:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "18076:55:55" + }, + { + "expression": { + "id": 13048, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 13029, + "name": "disputes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13574, + "src": "18141:8:55", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute storage ref)" + } + }, + "id": 13031, + "indexExpression": { + "id": 13030, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12938, + "src": "18150:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "18141:19:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 13033, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12967, + "src": "18184:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 13034, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18190:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "18184:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13035, + "name": "_fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12926, + "src": "18211:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13036, + "name": "_deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12928, + "src": "18235:8:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "30", + "id": 13037, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "18257:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "expression": { + "id": 13038, + "name": "DisputeType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14913, + "src": "18272:11:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeType_$14913_$", + "typeString": "type(enum IDisputeManager.DisputeType)" + } + }, + "id": 13039, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "18284:15:55", + "memberName": "IndexingDispute", + "nodeType": "MemberAccess", + "referencedDeclaration": 14910, + "src": "18272:27:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + } + }, + { + "expression": { + "expression": { + "id": 13040, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "18313:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 13041, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18329:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "18313:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 13042, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "18343:7:55", + "memberName": "Pending", + "nodeType": "MemberAccess", + "referencedDeclaration": 14919, + "src": "18313:37:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + { + "expression": { + "id": 13043, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "18364:5:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 13044, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18370:9:55", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "18364:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13045, + "name": "cancellableAt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13023, + "src": "18393:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13046, + "name": "stakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13015, + "src": "18420:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + }, + { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13032, + "name": "Dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14943, + "src": "18163:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_Dispute_$14943_storage_ptr_$", + "typeString": "type(struct IDisputeManager.Dispute storage pointer)" + } + }, + "id": 13047, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18163:280:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_memory_ptr", + "typeString": "struct IDisputeManager.Dispute memory" + } + }, + "src": "18141:302:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage", + "typeString": "struct IDisputeManager.Dispute storage ref" + } + }, + "id": 13049, + "nodeType": "ExpressionStatement", + "src": "18141:302:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13051, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12938, + "src": "18495:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 13052, + "name": "alloc", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12967, + "src": "18518:5:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 13053, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18524:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "18518:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13054, + "name": "_fisherman", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12926, + "src": "18545:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13055, + "name": "_deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12928, + "src": "18569:8:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13056, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12930, + "src": "18591:13:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13057, + "name": "_poi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12932, + "src": "18618:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 13058, + "name": "stakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13015, + "src": "18636:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13059, + "name": "cancellableAt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13023, + "src": "18663:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13050, + "name": "IndexingDisputeCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15011, + "src": "18459:22:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256,address,bytes32,uint256,uint256)" + } + }, + "id": 13060, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18459:227:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13061, + "nodeType": "EmitStatement", + "src": "18454:232:55" + }, + { + "expression": { + "id": 13062, + "name": "disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 12938, + "src": "18704:9:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 12936, + "id": 13063, + "nodeType": "Return", + "src": "18697:16:55" + } + ] + }, + "documentation": { + "id": 12924, + "nodeType": "StructuredDocumentation", + "src": "16658:307:55", + "text": " @notice Create indexing dispute internal function.\n @param _fisherman The fisherman creating the dispute\n @param _deposit Amount of tokens staked as deposit\n @param _allocationId Allocation disputed\n @param _poi The POI being disputed\n @return The dispute id" + }, + "id": 13065, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_createIndexingDisputeWithAllocation", + "nameLocation": "16979:36:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 12933, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12926, + "mutability": "mutable", + "name": "_fisherman", + "nameLocation": "17033:10:55", + "nodeType": "VariableDeclaration", + "scope": 13065, + "src": "17025:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12925, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17025:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12928, + "mutability": "mutable", + "name": "_deposit", + "nameLocation": "17061:8:55", + "nodeType": "VariableDeclaration", + "scope": 13065, + "src": "17053:16:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12927, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17053:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12930, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "17087:13:55", + "nodeType": "VariableDeclaration", + "scope": 13065, + "src": "17079:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 12929, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17079:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 12932, + "mutability": "mutable", + "name": "_poi", + "nameLocation": "17118:4:55", + "nodeType": "VariableDeclaration", + "scope": 13065, + "src": "17110:12:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12931, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "17110:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "17015:113:55" + }, + "returnParameters": { + "id": 12936, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 12935, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 13065, + "src": "17146:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 12934, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "17146:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "17145:9:55" + }, + "scope": 13542, + "src": "16970:1750:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13117, + "nodeType": "Block", + "src": "19017:384:55", + "statements": [ + { + "assignments": [13077], + "declarations": [ + { + "constant": false, + "id": 13077, + "mutability": "mutable", + "name": "tokensToReward", + "nameLocation": "19035:14:55", + "nodeType": "VariableDeclaration", + "scope": 13117, + "src": "19027:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13076, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "19027:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13085, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 13079, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19066:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13080, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19075:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 14924, + "src": "19066:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13081, + "name": "_tokensSlashed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13073, + "src": "19084:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 13082, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19100:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13083, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19109:13:55", + "memberName": "stakeSnapshot", + "nodeType": "MemberAccess", + "referencedDeclaration": 14942, + "src": "19100:22:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13078, + "name": "_slashIndexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13320, + "src": "19052:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (address,uint256,uint256) returns (uint256)" + } + }, + "id": 13084, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19052:71:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "19027:96:55" + }, + { + "expression": { + "id": 13092, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 13086, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19133:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13088, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "19142:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "19133:15:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "expression": { + "id": 13089, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "19151:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 13090, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19167:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "19151:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 13091, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "19181:8:55", + "memberName": "Accepted", + "nodeType": "MemberAccess", + "referencedDeclaration": 14916, + "src": "19151:38:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "src": "19133:56:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "id": 13093, + "nodeType": "ExpressionStatement", + "src": "19133:56:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 13097, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19224:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13098, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19233:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "19224:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13102, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13099, + "name": "tokensToReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13077, + "src": "19244:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "expression": { + "id": 13100, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19261:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13101, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19270:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "19261:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "19244:33:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13094, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "19199:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 13095, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19199:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 13096, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19213:10:55", + "memberName": "pushTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 818, + "src": "19199:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 13103, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19199:79:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13104, + "nodeType": "ExpressionStatement", + "src": "19199:79:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13106, + "name": "_disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13068, + "src": "19310:10:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 13107, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19322:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13108, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19331:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 14924, + "src": "19322:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13109, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19340:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13110, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19349:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "19340:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 13111, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13071, + "src": "19360:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13112, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19369:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "19360:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 13113, + "name": "tokensToReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13077, + "src": "19379:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "19360:33:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13105, + "name": "DisputeAccepted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15037, + "src": "19294:15:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256)" + } + }, + "id": 13115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19294:100:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13116, + "nodeType": "EmitStatement", + "src": "19289:105:55" + } + ] + }, + "documentation": { + "id": 13066, + "nodeType": "StructuredDocumentation", + "src": "18726:184:55", + "text": " @notice Accept a dispute\n @param _disputeId The id of the dispute\n @param _dispute The dispute\n @param _tokensSlashed The amount of tokens to slash" + }, + "id": 13118, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_acceptDispute", + "nameLocation": "18924:14:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13074, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13068, + "mutability": "mutable", + "name": "_disputeId", + "nameLocation": "18947:10:55", + "nodeType": "VariableDeclaration", + "scope": 13118, + "src": "18939:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 13067, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "18939:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13071, + "mutability": "mutable", + "name": "_dispute", + "nameLocation": "18975:8:55", + "nodeType": "VariableDeclaration", + "scope": 13118, + "src": "18959:24:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 13070, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13069, + "name": "Dispute", + "nameLocations": ["18959:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "18959:7:55" + }, + "referencedDeclaration": 14943, + "src": "18959:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13073, + "mutability": "mutable", + "name": "_tokensSlashed", + "nameLocation": "18993:14:55", + "nodeType": "VariableDeclaration", + "scope": 13118, + "src": "18985:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13072, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18985:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "18938:70:55" + }, + "returnParameters": { + "id": 13075, + "nodeType": "ParameterList", + "parameters": [], + "src": "19017:0:55" + }, + "scope": 13542, + "src": "18915:486:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13152, + "nodeType": "Block", + "src": "19615:224:55", + "statements": [ + { + "expression": { + "id": 13133, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 13127, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13124, + "src": "19625:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13129, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "19634:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "19625:15:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "expression": { + "id": 13130, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "19643:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 13131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19659:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "19643:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 13132, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "19673:8:55", + "memberName": "Rejected", + "nodeType": "MemberAccess", + "referencedDeclaration": 14917, + "src": "19643:38:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "src": "19625:56:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "id": 13134, + "nodeType": "ExpressionStatement", + "src": "19625:56:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 13138, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13124, + "src": "19716:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13139, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19725:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "19716:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13135, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "19691:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 13136, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19691:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 13137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19705:10:55", + "memberName": "burnTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 839, + "src": "19691:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,uint256)" + } + }, + "id": 13140, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19691:42:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13141, + "nodeType": "ExpressionStatement", + "src": "19691:42:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13143, + "name": "_disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13121, + "src": "19765:10:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 13144, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13124, + "src": "19777:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13145, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19786:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 14924, + "src": "19777:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13146, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13124, + "src": "19795:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13147, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19804:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "19795:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13148, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13124, + "src": "19815:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13149, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19824:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "19815:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13142, + "name": "DisputeRejected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15048, + "src": "19749:15:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256)" + } + }, + "id": 13150, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19749:83:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13151, + "nodeType": "EmitStatement", + "src": "19744:88:55" + } + ] + }, + "documentation": { + "id": 13119, + "nodeType": "StructuredDocumentation", + "src": "19407:125:55", + "text": " @notice Reject a dispute\n @param _disputeId The id of the dispute\n @param _dispute The dispute" + }, + "id": 13153, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_rejectDispute", + "nameLocation": "19546:14:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13125, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13121, + "mutability": "mutable", + "name": "_disputeId", + "nameLocation": "19569:10:55", + "nodeType": "VariableDeclaration", + "scope": 13153, + "src": "19561:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 13120, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "19561:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13124, + "mutability": "mutable", + "name": "_dispute", + "nameLocation": "19597:8:55", + "nodeType": "VariableDeclaration", + "scope": 13153, + "src": "19581:24:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 13123, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13122, + "name": "Dispute", + "nameLocations": ["19581:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "19581:7:55" + }, + "referencedDeclaration": 14943, + "src": "19581:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "src": "19560:46:55" + }, + "returnParameters": { + "id": 13126, + "nodeType": "ParameterList", + "parameters": [], + "src": "19615:0:55" + }, + "scope": 13542, + "src": "19537:302:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13189, + "nodeType": "Block", + "src": "20049:238:55", + "statements": [ + { + "expression": { + "id": 13168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 13162, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13159, + "src": "20059:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13164, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "20068:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "20059:15:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "expression": { + "id": 13165, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "20077:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 13166, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20093:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "20077:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 13167, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "20107:5:55", + "memberName": "Drawn", + "nodeType": "MemberAccess", + "referencedDeclaration": 14918, + "src": "20077:35:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "src": "20059:53:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "id": 13169, + "nodeType": "ExpressionStatement", + "src": "20059:53:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 13173, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13159, + "src": "20147:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13174, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20156:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "20147:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13175, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13159, + "src": "20167:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13176, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20176:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "20167:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13170, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "20122:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 13171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20122:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 13172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20136:10:55", + "memberName": "pushTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 818, + "src": "20122:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 13177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20122:62:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13178, + "nodeType": "ExpressionStatement", + "src": "20122:62:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13180, + "name": "_disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13156, + "src": "20213:10:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 13181, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13159, + "src": "20225:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13182, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20234:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 14924, + "src": "20225:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13183, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13159, + "src": "20243:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13184, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20252:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "20243:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13185, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13159, + "src": "20263:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13186, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20272:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "20263:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13179, + "name": "DisputeDrawn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15059, + "src": "20200:12:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256)" + } + }, + "id": 13187, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20200:80:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13188, + "nodeType": "EmitStatement", + "src": "20195:85:55" + } + ] + }, + "documentation": { + "id": 13154, + "nodeType": "StructuredDocumentation", + "src": "19845:123:55", + "text": " @notice Draw a dispute\n @param _disputeId The id of the dispute\n @param _dispute The dispute" + }, + "id": 13190, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_drawDispute", + "nameLocation": "19982:12:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13160, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13156, + "mutability": "mutable", + "name": "_disputeId", + "nameLocation": "20003:10:55", + "nodeType": "VariableDeclaration", + "scope": 13190, + "src": "19995:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 13155, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "19995:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13159, + "mutability": "mutable", + "name": "_dispute", + "nameLocation": "20031:8:55", + "nodeType": "VariableDeclaration", + "scope": 13190, + "src": "20015:24:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 13158, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13157, + "name": "Dispute", + "nameLocations": ["20015:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "20015:7:55" + }, + "referencedDeclaration": 14943, + "src": "20015:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "src": "19994:46:55" + }, + "returnParameters": { + "id": 13161, + "nodeType": "ParameterList", + "parameters": [], + "src": "20049:0:55" + }, + "scope": 13542, + "src": "19973:314:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13226, + "nodeType": "Block", + "src": "20501:246:55", + "statements": [ + { + "expression": { + "id": 13205, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 13199, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13196, + "src": "20511:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13201, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "20520:6:55", + "memberName": "status", + "nodeType": "MemberAccess", + "referencedDeclaration": 14936, + "src": "20511:15:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "expression": { + "id": 13202, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "20529:15:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 13203, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20545:13:55", + "memberName": "DisputeStatus", + "nodeType": "MemberAccess", + "referencedDeclaration": 14921, + "src": "20529:29:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_DisputeStatus_$14921_$", + "typeString": "type(enum IDisputeManager.DisputeStatus)" + } + }, + "id": 13204, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "20559:9:55", + "memberName": "Cancelled", + "nodeType": "MemberAccess", + "referencedDeclaration": 14920, + "src": "20529:39:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "src": "20511:57:55", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "id": 13206, + "nodeType": "ExpressionStatement", + "src": "20511:57:55" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 13210, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13196, + "src": "20603:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13211, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20612:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "20603:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13212, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13196, + "src": "20623:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13213, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20632:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "20623:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13207, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "20578:11:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 13208, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20578:13:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 13209, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20592:10:55", + "memberName": "pushTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 818, + "src": "20578:24:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 13214, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20578:62:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13215, + "nodeType": "ExpressionStatement", + "src": "20578:62:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13217, + "name": "_disputeId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13193, + "src": "20673:10:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 13218, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13196, + "src": "20685:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13219, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20694:7:55", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 14924, + "src": "20685:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13220, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13196, + "src": "20703:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13221, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20712:9:55", + "memberName": "fisherman", + "nodeType": "MemberAccess", + "referencedDeclaration": 14926, + "src": "20703:18:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 13222, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13196, + "src": "20723:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13223, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20732:7:55", + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 14928, + "src": "20723:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13216, + "name": "DisputeCancelled", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15077, + "src": "20656:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,address,address,uint256)" + } + }, + "id": 13224, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20656:84:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13225, + "nodeType": "EmitStatement", + "src": "20651:89:55" + } + ] + }, + "documentation": { + "id": 13191, + "nodeType": "StructuredDocumentation", + "src": "20293:125:55", + "text": " @notice Cancel a dispute\n @param _disputeId The id of the dispute\n @param _dispute The dispute" + }, + "id": 13227, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_cancelDispute", + "nameLocation": "20432:14:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13197, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13193, + "mutability": "mutable", + "name": "_disputeId", + "nameLocation": "20455:10:55", + "nodeType": "VariableDeclaration", + "scope": 13227, + "src": "20447:18:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 13192, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "20447:7:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13196, + "mutability": "mutable", + "name": "_dispute", + "nameLocation": "20483:8:55", + "nodeType": "VariableDeclaration", + "scope": 13227, + "src": "20467:24:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 13195, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13194, + "name": "Dispute", + "nameLocations": ["20467:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "20467:7:55" + }, + "referencedDeclaration": 14943, + "src": "20467:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "src": "20446:46:55" + }, + "returnParameters": { + "id": 13198, + "nodeType": "ParameterList", + "parameters": [], + "src": "20501:0:55" + }, + "scope": 13542, + "src": "20423:324:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13319, + "nodeType": "Block", + "src": "21378:1390:55", + "statements": [ + { + "assignments": [13241], + "declarations": [ + { + "constant": false, + "id": 13241, + "mutability": "mutable", + "name": "subgraphService_", + "nameLocation": "21405:16:55", + "nodeType": "VariableDeclaration", + "scope": 13319, + "src": "21388:33:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 13240, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13239, + "name": "ISubgraphService", + "nameLocations": ["21388:16:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "21388:16:55" + }, + "referencedDeclaration": 15634, + "src": "21388:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "internal" + } + ], + "id": 13244, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13242, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "21424:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 13243, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21424:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21388:57:55" + }, + { + "assignments": [13249], + "declarations": [ + { + "constant": false, + "id": 13249, + "mutability": "mutable", + "name": "provision", + "nameLocation": "21533:9:55", + "nodeType": "VariableDeclaration", + "scope": 13319, + "src": "21500:42:55", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + }, + "typeName": { + "id": 13248, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13247, + "name": "IHorizonStaking.Provision", + "nameLocations": ["21500:15:55", "21516:9:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3962, + "src": "21500:25:55" + }, + "referencedDeclaration": 3962, + "src": "21500:25:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_storage_ptr", + "typeString": "struct IHorizonStakingTypes.Provision" + } + }, + "visibility": "internal" + } + ], + "id": 13259, + "initialValue": { + "arguments": [ + { + "id": 13253, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13230, + "src": "21574:8:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 13256, + "name": "subgraphService_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13241, + "src": "21592:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + ], + "id": 13255, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21584:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13254, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21584:7:55", + "typeDescriptions": {} + } + }, + "id": 13257, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21584:25:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13250, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "21545:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 13251, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21545:15:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 13252, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21561:12:55", + "memberName": "getProvision", + "nodeType": "MemberAccess", + "referencedDeclaration": 2950, + "src": "21545:28:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_Provision_$3962_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.Provision memory)" + } + }, + "id": 13258, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21545:65:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21500:110:55" + }, + { + "assignments": [13261], + "declarations": [ + { + "constant": false, + "id": 13261, + "mutability": "mutable", + "name": "maxTokensSlash", + "nameLocation": "21678:14:55", + "nodeType": "VariableDeclaration", + "scope": 13319, + "src": "21670:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13260, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21670:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13266, + "initialValue": { + "arguments": [ + { + "id": 13264, + "name": "maxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13568, + "src": "21723:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 13262, + "name": "_tokensStakeSnapshot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13234, + "src": "21695:20:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 13263, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21716:6:55", + "memberName": "mulPPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4496, + "src": "21695:27:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$attached_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 13265, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21695:43:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21670:68:55" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 13274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13268, + "name": "_tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13232, + "src": "21769:12:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 13269, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21785:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "21769:17:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13273, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13271, + "name": "_tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13232, + "src": "21790:12:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 13272, + "name": "maxTokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13261, + "src": "21806:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "21790:30:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "21769:51:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 13276, + "name": "_tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13232, + "src": "21867:12:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13277, + "name": "maxTokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13261, + "src": "21881:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13275, + "name": "DisputeManagerInvalidTokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15119, + "src": "21834:32:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 13278, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21834:62:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13267, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "21748:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21748:158:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13280, + "nodeType": "ExpressionStatement", + "src": "21748:158:55" + }, + { + "assignments": [13282], + "declarations": [ + { + "constant": false, + "id": 13282, + "mutability": "mutable", + "name": "maxRewardableTokens", + "nameLocation": "22414:19:55", + "nodeType": "VariableDeclaration", + "scope": 13319, + "src": "22406:27:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13281, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "22406:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13289, + "initialValue": { + "arguments": [ + { + "id": 13285, + "name": "_tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13232, + "src": "22450:12:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 13286, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13249, + "src": "22464:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 13287, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22474:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3943, + "src": "22464:16:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 13283, + "name": "MathUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4445, + "src": "22436:9:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_MathUtils_$4445_$", + "typeString": "type(library MathUtils)" + } + }, + "id": 13284, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22446:3:55", + "memberName": "min", + "nodeType": "MemberAccess", + "referencedDeclaration": 4423, + "src": "22436:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 13288, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22436:45:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "22406:75:55" + }, + { + "assignments": [13291], + "declarations": [ + { + "constant": false, + "id": 13291, + "mutability": "mutable", + "name": "effectiveCut", + "nameLocation": "22499:12:55", + "nodeType": "VariableDeclaration", + "scope": 13319, + "src": "22491:20:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13290, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "22491:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13298, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 13294, + "name": "provision", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13249, + "src": "22528:9:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Provision_$3962_memory_ptr", + "typeString": "struct IHorizonStakingTypes.Provision memory" + } + }, + "id": 13295, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22538:14:55", + "memberName": "maxVerifierCut", + "nodeType": "MemberAccess", + "referencedDeclaration": 3949, + "src": "22528:24:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 13296, + "name": "fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13565, + "src": "22554:18:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 13292, + "name": "MathUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4445, + "src": "22514:9:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_MathUtils_$4445_$", + "typeString": "type(library MathUtils)" + } + }, + "id": 13293, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22524:3:55", + "memberName": "min", + "nodeType": "MemberAccess", + "referencedDeclaration": 4423, + "src": "22514:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 13297, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22514:59:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "22491:82:55" + }, + { + "assignments": [13300], + "declarations": [ + { + "constant": false, + "id": 13300, + "mutability": "mutable", + "name": "tokensRewards", + "nameLocation": "22591:13:55", + "nodeType": "VariableDeclaration", + "scope": 13319, + "src": "22583:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13299, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "22583:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13305, + "initialValue": { + "arguments": [ + { + "id": 13303, + "name": "maxRewardableTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13282, + "src": "22627:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 13301, + "name": "effectiveCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13291, + "src": "22607:12:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 13302, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22620:6:55", + "memberName": "mulPPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4496, + "src": "22607:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$attached_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 13304, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22607:40:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "22583:64:55" + }, + { + "expression": { + "arguments": [ + { + "id": 13309, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13230, + "src": "22681:8:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 13312, + "name": "_tokensSlash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13232, + "src": "22702:12:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13313, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13300, + "src": "22716:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 13310, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "22691:3:55", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 13311, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "22695:6:55", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "22691:10:55", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 13314, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22691:39:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 13306, + "name": "subgraphService_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13241, + "src": "22658:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "id": 13308, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22675:5:55", + "memberName": "slash", + "nodeType": "MemberAccess", + "referencedDeclaration": 1526, + "src": "22658:22:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (address,bytes memory) external" + } + }, + "id": 13315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22658:73:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13316, + "nodeType": "ExpressionStatement", + "src": "22658:73:55" + }, + { + "expression": { + "id": 13317, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13300, + "src": "22748:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 13238, + "id": 13318, + "nodeType": "Return", + "src": "22741:20:55" + } + ] + }, + "documentation": { + "id": 13228, + "nodeType": "StructuredDocumentation", + "src": "20753:471:55", + "text": " @notice Make the subgraph service contract slash the indexer and reward the fisherman.\n Give the fisherman a reward equal to the fishermanRewardCut of slashed amount\n @param _indexer Address of the indexer\n @param _tokensSlash Amount of tokens to slash from the indexer\n @param _tokensStakeSnapshot Snapshot of the indexer's stake at the time of the dispute creation\n @return The amount of tokens rewarded to the fisherman" + }, + "id": 13320, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_slashIndexer", + "nameLocation": "21238:13:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13235, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13230, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "21269:8:55", + "nodeType": "VariableDeclaration", + "scope": 13320, + "src": "21261:16:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13229, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21261:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13232, + "mutability": "mutable", + "name": "_tokensSlash", + "nameLocation": "21295:12:55", + "nodeType": "VariableDeclaration", + "scope": 13320, + "src": "21287:20:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13231, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21287:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13234, + "mutability": "mutable", + "name": "_tokensStakeSnapshot", + "nameLocation": "21325:20:55", + "nodeType": "VariableDeclaration", + "scope": 13320, + "src": "21317:28:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13233, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21317:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "21251:100:55" + }, + "returnParameters": { + "id": 13238, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13237, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 13320, + "src": "21369:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13236, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21369:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "21368:9:55" + }, + "scope": 13542, + "src": "21229:1539:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13345, + "nodeType": "Block", + "src": "23012:162:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 13332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13327, + "name": "_arbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13323, + "src": "23030:11:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 13330, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "23053:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 13329, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "23045:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13328, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "23045:7:55", + "typeDescriptions": {} + } + }, + "id": 13331, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23045:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "23030:25:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13333, + "name": "DisputeManagerInvalidZeroAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15086, + "src": "23057:32:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13334, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23057:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13326, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "23022:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13335, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23022:70:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13336, + "nodeType": "ExpressionStatement", + "src": "23022:70:55" + }, + { + "expression": { + "id": 13339, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 13337, + "name": "arbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13556, + "src": "23102:10:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 13338, + "name": "_arbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13323, + "src": "23115:11:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "23102:24:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 13340, + "nodeType": "ExpressionStatement", + "src": "23102:24:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13342, + "name": "_arbitrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13323, + "src": "23155:11:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13341, + "name": "ArbitratorSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14948, + "src": "23141:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 13343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23141:26:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13344, + "nodeType": "EmitStatement", + "src": "23136:31:55" + } + ] + }, + "documentation": { + "id": 13321, + "nodeType": "StructuredDocumentation", + "src": "22774:180:55", + "text": " @notice Set the arbitrator address.\n @dev Update the arbitrator to `_arbitrator`\n @param _arbitrator The address of the arbitration contract or party" + }, + "id": 13346, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setArbitrator", + "nameLocation": "22968:14:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13324, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13323, + "mutability": "mutable", + "name": "_arbitrator", + "nameLocation": "22991:11:55", + "nodeType": "VariableDeclaration", + "scope": 13346, + "src": "22983:19:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13322, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "22983:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "22982:21:55" + }, + "returnParameters": { + "id": 13325, + "nodeType": "ParameterList", + "parameters": [], + "src": "23012:0:55" + }, + "scope": 13542, + "src": "22959:215:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13368, + "nodeType": "Block", + "src": "23417:167:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 13355, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13353, + "name": "_disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13349, + "src": "23435:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 13354, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "23453:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "23435:19:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13356, + "name": "DisputeManagerDisputePeriodZero", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15089, + "src": "23456:31:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13357, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23456:33:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13352, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "23427:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13358, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23427:63:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13359, + "nodeType": "ExpressionStatement", + "src": "23427:63:55" + }, + { + "expression": { + "id": 13362, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 13360, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13559, + "src": "23500:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 13361, + "name": "_disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13349, + "src": "23516:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "23500:30:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 13363, + "nodeType": "ExpressionStatement", + "src": "23500:30:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13365, + "name": "_disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13349, + "src": "23562:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "id": 13364, + "name": "DisputePeriodSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14953, + "src": "23545:16:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint64_$returns$__$", + "typeString": "function (uint64)" + } + }, + "id": 13366, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23545:32:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13367, + "nodeType": "EmitStatement", + "src": "23540:37:55" + } + ] + }, + "documentation": { + "id": 13347, + "nodeType": "StructuredDocumentation", + "src": "23180:174:55", + "text": " @notice Set the dispute period.\n @dev Update the dispute period to `_disputePeriod` in seconds\n @param _disputePeriod Dispute period in seconds" + }, + "id": 13369, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setDisputePeriod", + "nameLocation": "23368:17:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13350, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13349, + "mutability": "mutable", + "name": "_disputePeriod", + "nameLocation": "23393:14:55", + "nodeType": "VariableDeclaration", + "scope": 13369, + "src": "23386:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 13348, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "23386:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "23385:23:55" + }, + "returnParameters": { + "id": 13351, + "nodeType": "ParameterList", + "parameters": [], + "src": "23417:0:55" + }, + "scope": 13542, + "src": "23359:225:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13392, + "nodeType": "Block", + "src": "23875:209:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13378, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13376, + "name": "_disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13372, + "src": "23893:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 13377, + "name": "MIN_DISPUTE_DEPOSIT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11905, + "src": "23912:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "23893:38:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 13380, + "name": "_disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13372, + "src": "23969:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13379, + "name": "DisputeManagerInvalidDisputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15102, + "src": "23933:35:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256) pure returns (error)" + } + }, + "id": 13381, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23933:52:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13375, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "23885:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13382, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23885:101:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13383, + "nodeType": "ExpressionStatement", + "src": "23885:101:55" + }, + { + "expression": { + "id": 13386, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 13384, + "name": "disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13562, + "src": "23996:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 13385, + "name": "_disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13372, + "src": "24013:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "23996:32:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 13387, + "nodeType": "ExpressionStatement", + "src": "23996:32:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13389, + "name": "_disputeDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13372, + "src": "24061:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13388, + "name": "DisputeDepositSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14958, + "src": "24043:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 13390, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24043:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13391, + "nodeType": "EmitStatement", + "src": "24038:39:55" + } + ] + }, + "documentation": { + "id": 13370, + "nodeType": "StructuredDocumentation", + "src": "23590:219:55", + "text": " @notice Set the dispute deposit required to create a dispute.\n @dev Update the dispute deposit to `_disputeDeposit` Graph Tokens\n @param _disputeDeposit The dispute deposit in Graph Tokens" + }, + "id": 13393, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setDisputeDeposit", + "nameLocation": "23823:18:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13373, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13372, + "mutability": "mutable", + "name": "_disputeDeposit", + "nameLocation": "23850:15:55", + "nodeType": "VariableDeclaration", + "scope": 13393, + "src": "23842:23:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13371, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "23842:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "23841:25:55" + }, + "returnParameters": { + "id": 13374, + "nodeType": "ParameterList", + "parameters": [], + "src": "23875:0:55" + }, + "scope": 13542, + "src": "23814:270:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13416, + "nodeType": "Block", + "src": "24380:273:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "id": 13402, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13400, + "name": "_fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13396, + "src": "24411:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "id": 13401, + "name": "MAX_FISHERMAN_REWARD_CUT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11901, + "src": "24434:24:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "24411:47:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 13404, + "name": "_fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13396, + "src": "24509:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 13403, + "name": "DisputeManagerInvalidFishermanReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15107, + "src": "24472:36:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint32_$returns$_t_error_$", + "typeString": "function (uint32) pure returns (error)" + } + }, + "id": 13405, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24472:57:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13399, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "24390:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13406, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24390:149:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13407, + "nodeType": "ExpressionStatement", + "src": "24390:149:55" + }, + { + "expression": { + "id": 13410, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 13408, + "name": "fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13565, + "src": "24549:18:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 13409, + "name": "_fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13396, + "src": "24570:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "24549:40:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "id": 13411, + "nodeType": "ExpressionStatement", + "src": "24549:40:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13413, + "name": "_fishermanRewardCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13396, + "src": "24626:19:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 13412, + "name": "FishermanRewardCutSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14968, + "src": "24604:21:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 13414, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24604:42:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13415, + "nodeType": "EmitStatement", + "src": "24599:47:55" + } + ] + }, + "documentation": { + "id": 13394, + "nodeType": "StructuredDocumentation", + "src": "24090:217:55", + "text": " @notice Set the reward cut that the fisherman gets when slashing occurs.\n @dev Update the reward cut to `_fishermanRewardCut`\n @param _fishermanRewardCut The fisherman reward cut, in PPM" + }, + "id": 13417, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setFishermanRewardCut", + "nameLocation": "24321:22:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13397, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13396, + "mutability": "mutable", + "name": "_fishermanRewardCut", + "nameLocation": "24351:19:55", + "nodeType": "VariableDeclaration", + "scope": 13417, + "src": "24344:26:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 13395, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "24344:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "24343:28:55" + }, + "returnParameters": { + "id": 13398, + "nodeType": "ParameterList", + "parameters": [], + "src": "24380:0:55" + }, + "scope": 13542, + "src": "24312:341:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13441, + "nodeType": "Block", + "src": "24865:205:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 13426, + "name": "_maxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13420, + "src": "24902:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 13424, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "24883:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_PPMMath_$4539_$", + "typeString": "type(library PPMMath)" + } + }, + "id": 13425, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "24891:10:55", + "memberName": "isValidPPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4538, + "src": "24883:18:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_bool_$", + "typeString": "function (uint256) pure returns (bool)" + } + }, + "id": 13427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24883:35:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 13429, + "name": "_maxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13420, + "src": "24956:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 13428, + "name": "DisputeManagerInvalidMaxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15112, + "src": "24920:35:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint32_$returns$_t_error_$", + "typeString": "function (uint32) pure returns (error)" + } + }, + "id": 13430, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24920:52:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13423, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "24875:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13431, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24875:98:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13432, + "nodeType": "ExpressionStatement", + "src": "24875:98:55" + }, + { + "expression": { + "id": 13435, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 13433, + "name": "maxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13568, + "src": "24983:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 13434, + "name": "_maxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13420, + "src": "25000:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "24983:32:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "id": 13436, + "nodeType": "ExpressionStatement", + "src": "24983:32:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13438, + "name": "maxSlashingCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13568, + "src": "25048:14:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 13437, + "name": "MaxSlashingCutSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14963, + "src": "25030:17:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 13439, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25030:33:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13440, + "nodeType": "EmitStatement", + "src": "25025:38:55" + } + ] + }, + "documentation": { + "id": 13418, + "nodeType": "StructuredDocumentation", + "src": "24659:141:55", + "text": " @notice Set the maximum cut that can be used for slashing indexers.\n @param _maxSlashingCut Max slashing cut, in PPM" + }, + "id": 13442, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setMaxSlashingCut", + "nameLocation": "24814:18:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13421, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13420, + "mutability": "mutable", + "name": "_maxSlashingCut", + "nameLocation": "24840:15:55", + "nodeType": "VariableDeclaration", + "scope": 13442, + "src": "24833:22:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 13419, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "24833:6:55", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "24832:24:55" + }, + "returnParameters": { + "id": 13422, + "nodeType": "ParameterList", + "parameters": [], + "src": "24865:0:55" + }, + "scope": 13542, + "src": "24805:265:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13469, + "nodeType": "Block", + "src": "25342:205:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 13454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13449, + "name": "_subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13445, + "src": "25360:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 13452, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25388:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 13451, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "25380:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13450, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25380:7:55", + "typeDescriptions": {} + } + }, + "id": 13453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25380:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "25360:30:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13455, + "name": "DisputeManagerInvalidZeroAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15086, + "src": "25392:32:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13456, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25392:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13448, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "25352:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13457, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25352:75:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13458, + "nodeType": "ExpressionStatement", + "src": "25352:75:55" + }, + { + "expression": { + "id": 13463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 13459, + "name": "subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13553, + "src": "25437:15:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 13461, + "name": "_subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13445, + "src": "25472:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13460, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "25455:16:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ISubgraphService_$15634_$", + "typeString": "type(contract ISubgraphService)" + } + }, + "id": 13462, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25455:34:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "src": "25437:52:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "id": 13464, + "nodeType": "ExpressionStatement", + "src": "25437:52:55" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13466, + "name": "_subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13445, + "src": "25523:16:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13465, + "name": "SubgraphServiceSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14973, + "src": "25504:18:55", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 13467, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25504:36:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13468, + "nodeType": "EmitStatement", + "src": "25499:41:55" + } + ] + }, + "documentation": { + "id": 13443, + "nodeType": "StructuredDocumentation", + "src": "25076:198:55", + "text": " @notice Set the subgraph service address.\n @dev Update the subgraph service to `_subgraphService`\n @param _subgraphService The address of the subgraph service contract" + }, + "id": 13470, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setSubgraphService", + "nameLocation": "25288:19:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13446, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13445, + "mutability": "mutable", + "name": "_subgraphService", + "nameLocation": "25316:16:55", + "nodeType": "VariableDeclaration", + "scope": 13470, + "src": "25308:24:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13444, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25308:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "25307:26:55" + }, + "returnParameters": { + "id": 13447, + "nodeType": "ParameterList", + "parameters": [], + "src": "25342:0:55" + }, + "scope": 13542, + "src": "25279:268:55", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13493, + "nodeType": "Block", + "src": "25798:135:55", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 13486, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 13480, + "name": "subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13553, + "src": "25824:15:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + ], + "id": 13479, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "25816:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13478, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25816:7:55", + "typeDescriptions": {} + } + }, + "id": 13481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25816:24:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 13484, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25852:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 13483, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "25844:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13482, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "25844:7:55", + "typeDescriptions": {} + } + }, + "id": 13485, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25844:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "25816:38:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13487, + "name": "DisputeManagerSubgraphServiceNotSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15180, + "src": "25856:35:55", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13488, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25856:37:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13477, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "25808:7:55", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13489, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25808:86:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13490, + "nodeType": "ExpressionStatement", + "src": "25808:86:55" + }, + { + "expression": { + "id": 13491, + "name": "subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13553, + "src": "25911:15:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "functionReturnParameters": 13476, + "id": 13492, + "nodeType": "Return", + "src": "25904:22:55" + } + ] + }, + "documentation": { + "id": 13471, + "nodeType": "StructuredDocumentation", + "src": "25553:169:55", + "text": " @notice Get the address of the subgraph service\n @dev Will revert if the subgraph service is not set\n @return The subgraph service address" + }, + "id": 13494, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getSubgraphService", + "nameLocation": "25736:19:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13472, + "nodeType": "ParameterList", + "parameters": [], + "src": "25755:2:55" + }, + "returnParameters": { + "id": 13476, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13475, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 13494, + "src": "25780:16:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 13474, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13473, + "name": "ISubgraphService", + "nameLocations": ["25780:16:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "25780:16:55" + }, + "referencedDeclaration": 15634, + "src": "25780:16:55", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "internal" + } + ], + "src": "25779:18:55" + }, + "scope": 13542, + "src": "25727:206:55", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13511, + "nodeType": "Block", + "src": "26206:63:55", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 13509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 13503, + "name": "_dispute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13498, + "src": "26223:8:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute storage pointer" + } + }, + "id": 13504, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "26232:16:55", + "memberName": "relatedDisputeId", + "nodeType": "MemberAccess", + "referencedDeclaration": 14930, + "src": "26223:25:55", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 13507, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "26260:1:55", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 13506, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "26252:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 13505, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "26252:7:55", + "typeDescriptions": {} + } + }, + "id": 13508, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "26252:10:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "26223:39:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 13502, + "id": 13510, + "nodeType": "Return", + "src": "26216:46:55" + } + ] + }, + "documentation": { + "id": 13495, + "nodeType": "StructuredDocumentation", + "src": "25939:178:55", + "text": " @notice Returns whether the dispute is for a conflicting attestation or not.\n @param _dispute Dispute\n @return True conflicting attestation dispute" + }, + "id": 13512, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_isDisputeInConflict", + "nameLocation": "26131:20:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13499, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13498, + "mutability": "mutable", + "name": "_dispute", + "nameLocation": "26168:8:55", + "nodeType": "VariableDeclaration", + "scope": 13512, + "src": "26152:24:55", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + }, + "typeName": { + "id": 13497, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13496, + "name": "Dispute", + "nameLocations": ["26152:7:55"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "26152:7:55" + }, + "referencedDeclaration": 14943, + "src": "26152:7:55", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + }, + "visibility": "internal" + } + ], + "src": "26151:26:55" + }, + "returnParameters": { + "id": 13502, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13501, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 13512, + "src": "26200:4:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 13500, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "26200:4:55", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "26199:6:55" + }, + "scope": 13542, + "src": "26122:147:55", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 13540, + "nodeType": "Block", + "src": "27164:173:55", + "statements": [ + { + "assignments": [13523], + "declarations": [ + { + "constant": false, + "id": 13523, + "mutability": "mutable", + "name": "delegatorsStake", + "nameLocation": "27182:15:55", + "nodeType": "VariableDeclaration", + "scope": 13540, + "src": "27174:23:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13522, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "27174:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 13535, + "initialValue": { + "expression": { + "arguments": [ + { + "id": 13527, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13515, + "src": "27234:8:55", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13530, + "name": "_getSubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13494, + "src": "27252:19:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ISubgraphService_$15634_$", + "typeString": "function () view returns (contract ISubgraphService)" + } + }, + "id": 13531, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27252:21:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + ], + "id": 13529, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "27244:7:55", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13528, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "27244:7:55", + "typeDescriptions": {} + } + }, + "id": 13532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27244:30:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13524, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "27200:13:55", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 13525, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27200:15:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 13526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "27216:17:55", + "memberName": "getDelegationPool", + "nodeType": "MemberAccess", + "referencedDeclaration": 2913, + "src": "27200:33:55", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_DelegationPool_$3992_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.DelegationPool memory)" + } + }, + "id": 13533, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "27200:75:55", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_memory_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool memory" + } + }, + "id": 13534, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "27276:6:55", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 3983, + "src": "27200:82:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "27174:108:55" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13538, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13536, + "name": "_indexerStake", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13517, + "src": "27299:13:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 13537, + "name": "delegatorsStake", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13523, + "src": "27315:15:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "27299:31:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 13521, + "id": 13539, + "nodeType": "Return", + "src": "27292:38:55" + } + ] + }, + "documentation": { + "id": 13513, + "nodeType": "StructuredDocumentation", + "src": "26275:785:55", + "text": " @notice Get the total stake snapshot for and indexer.\n @dev A few considerations:\n - We include both indexer and delegators stake.\n - Thawing stake is not excluded from the snapshot.\n - Delegators stake is capped at the delegation ratio to prevent delegators from inflating the snapshot\n to increase the indexer slash amount.\n Note that the snapshot can be inflated by delegators front-running the dispute creation with a delegation\n to the indexer. Given the snapshot is a cap, the dispute outcome is uncertain and considering the cost of capital\n and slashing risk, this is not a concern.\n @param _indexer Indexer address\n @param _indexerStake Indexer's stake\n @return Total stake snapshot" + }, + "id": 13541, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getStakeSnapshot", + "nameLocation": "27074:17:55", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13518, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13515, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "27100:8:55", + "nodeType": "VariableDeclaration", + "scope": 13541, + "src": "27092:16:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13514, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "27092:7:55", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13517, + "mutability": "mutable", + "name": "_indexerStake", + "nameLocation": "27118:13:55", + "nodeType": "VariableDeclaration", + "scope": 13541, + "src": "27110:21:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13516, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "27110:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "27091:41:55" + }, + "returnParameters": { + "id": 13521, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13520, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 13541, + "src": "27155:7:55", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13519, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "27155:7:55", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "27154:9:55" + }, + "scope": 13542, + "src": "27065:272:55", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 13543, + "src": "2323:25016:55", + "usedErrors": [ + 4464, 4655, 4959, 4964, 5140, 5143, 7894, 7899, 7904, 15080, 15083, 15086, 15089, 15092, 15097, 15102, + 15107, 15112, 15119, 15125, 15130, 15133, 15138, 15143, 15150, 15155, 15162, 15177, 15180, 16121 + ], + "usedEvents": [ + 4650, 4970, 5148, 14948, 14953, 14958, 14963, 14968, 14973, 14992, 15011, 15026, 15037, 15048, 15059, + 15066, 15077 + ] + } + ], + "src": "45:27295:55" + }, + "id": 55 + }, + "contracts/DisputeManagerStorage.sol": { + "ast": { + "absolutePath": "contracts/DisputeManagerStorage.sol", + "exportedSymbols": { + "DisputeManagerV1Storage": [13575], + "IDisputeManager": [15373], + "ISubgraphService": [15634] + }, + "id": 13576, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 13544, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:56" + }, + { + "absolutePath": "contracts/interfaces/IDisputeManager.sol", + "file": "./interfaces/IDisputeManager.sol", + "id": 13546, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13576, + "sourceUnit": 15374, + "src": "71:67:56", + "symbolAliases": [ + { + "foreign": { + "id": 13545, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "80:15:56", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/ISubgraphService.sol", + "file": "./interfaces/ISubgraphService.sol", + "id": 13548, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 13576, + "sourceUnit": 15635, + "src": "139:69:56", + "symbolAliases": [ + { + "foreign": { + "id": 13547, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "148:16:56", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "DisputeManagerV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 13549, + "nodeType": "StructuredDocumentation", + "src": "210:270:56", + "text": " @title DisputeManagerStorage\n @notice This contract holds all the storage variables for the Dispute Manager contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 13575, + "linearizedBaseContracts": [13575], + "name": "DisputeManagerV1Storage", + "nameLocation": "499:23:56", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 13550, + "nodeType": "StructuredDocumentation", + "src": "529:49:56", + "text": "@notice The Subgraph Service contract address" + }, + "functionSelector": "26058249", + "id": 13553, + "mutability": "mutable", + "name": "subgraphService", + "nameLocation": "607:15:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "583:39:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 13552, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13551, + "name": "ISubgraphService", + "nameLocations": ["583:16:56"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "583:16:56" + }, + "referencedDeclaration": 15634, + "src": "583:16:56", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 13554, + "nodeType": "StructuredDocumentation", + "src": "629:71:56", + "text": "@notice The arbitrator is solely in control of arbitrating disputes" + }, + "functionSelector": "6cc6cde1", + "id": 13556, + "mutability": "mutable", + "name": "arbitrator", + "nameLocation": "720:10:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "705:25:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13555, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "705:7:56", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 13557, + "nodeType": "StructuredDocumentation", + "src": "737:37:56", + "text": "@notice dispute period in seconds" + }, + "functionSelector": "5bf31d4d", + "id": 13559, + "mutability": "mutable", + "name": "disputePeriod", + "nameLocation": "793:13:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "779:27:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 13558, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "779:6:56", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 13560, + "nodeType": "StructuredDocumentation", + "src": "813:48:56", + "text": "@notice Deposit required to create a Dispute" + }, + "functionSelector": "29e03ff1", + "id": 13562, + "mutability": "mutable", + "name": "disputeDeposit", + "nameLocation": "881:14:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "866:29:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13561, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "866:7:56", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 13563, + "nodeType": "StructuredDocumentation", + "src": "902:113:56", + "text": "@notice Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute. In PPM." + }, + "functionSelector": "902a4938", + "id": 13565, + "mutability": "mutable", + "name": "fishermanRewardCut", + "nameLocation": "1034:18:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "1020:32:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 13564, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1020:6:56", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 13566, + "nodeType": "StructuredDocumentation", + "src": "1059:89:56", + "text": "@notice Maximum percentage of indexer stake that can be slashed on a dispute. In PPM." + }, + "functionSelector": "0533e1ba", + "id": 13568, + "mutability": "mutable", + "name": "maxSlashingCut", + "nameLocation": "1167:14:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "1153:28:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 13567, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1153:6:56", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 13569, + "nodeType": "StructuredDocumentation", + "src": "1188:36:56", + "text": "@notice List of disputes created" + }, + "functionSelector": "11be1997", + "id": 13574, + "mutability": "mutable", + "name": "disputes", + "nameLocation": "1298:8:56", + "nodeType": "VariableDeclaration", + "scope": 13575, + "src": "1229:77:56", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute)" + }, + "typeName": { + "id": 13573, + "keyName": "disputeId", + "keyNameLocation": "1245:9:56", + "keyType": { + "id": 13570, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1237:7:56", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Mapping", + "src": "1229:61:56", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_Dispute_$14943_storage_$", + "typeString": "mapping(bytes32 => struct IDisputeManager.Dispute)" + }, + "valueName": "dispute", + "valueNameLocation": "1282:7:56", + "valueType": { + "id": 13572, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13571, + "name": "IDisputeManager.Dispute", + "nameLocations": ["1258:15:56", "1274:7:56"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14943, + "src": "1258:23:56" + }, + "referencedDeclaration": 14943, + "src": "1258:23:56", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Dispute_$14943_storage_ptr", + "typeString": "struct IDisputeManager.Dispute" + } + } + }, + "visibility": "public" + } + ], + "scope": 13576, + "src": "481:828:56", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "46:1264:56" + }, + "id": 56 + }, + "contracts/SubgraphService.sol": { + "ast": { + "absolutePath": "contracts/SubgraphService.sol", + "exportedSymbols": { + "Allocation": [16033], + "AllocationManager": [17363], + "DataService": [936], + "DataServiceFees": [1278], + "DataServicePausableUpgradeable": [1425], + "Directory": [17720], + "IDataService": [1557], + "IGraphPayments": [2489], + "IGraphTallyCollector": [2605], + "IGraphToken": [758], + "IRewardsIssuer": [561], + "ISubgraphService": [15634], + "Initializable": [5391], + "LegacyAllocation": [16462], + "MulticallUpgradeable": [5540], + "OwnableUpgradeable": [5123], + "PPMMath": [4539], + "SubgraphService": [14879], + "SubgraphServiceV1Storage": [14902], + "TokenUtils": [840] + }, + "id": 14880, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 13577, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:57" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "id": 13579, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 2490, + "src": "70:96:57", + "symbolAliases": [ + { + "foreign": { + "id": 13578, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "79:14:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "file": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "id": 13581, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 759, + "src": "167:87:57", + "symbolAliases": [ + { + "foreign": { + "id": 13580, + "name": "IGraphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 758, + "src": "176:11:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol", + "id": 13583, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 2606, + "src": "255:108:57", + "symbolAliases": [ + { + "foreign": { + "id": 13582, + "name": "IGraphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2605, + "src": "264:20:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol", + "file": "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol", + "id": 13585, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 562, + "src": "364:95:57", + "symbolAliases": [ + { + "foreign": { + "id": 13584, + "name": "IRewardsIssuer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 561, + "src": "373:14:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol", + "file": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol", + "id": 13587, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 1558, + "src": "460:105:57", + "symbolAliases": [ + { + "foreign": { + "id": 13586, + "name": "IDataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "469:12:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/ISubgraphService.sol", + "file": "./interfaces/ISubgraphService.sol", + "id": 13589, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 15635, + "src": "566:69:57", + "symbolAliases": [ + { + "foreign": { + "id": 13588, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "575:16:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", + "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", + "id": 13591, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 5124, + "src": "637:103:57", + "symbolAliases": [ + { + "foreign": { + "id": 13590, + "name": "OwnableUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5123, + "src": "646:18:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol", + "file": "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol", + "id": 13593, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 5541, + "src": "741:106:57", + "symbolAliases": [ + { + "foreign": { + "id": 13592, + "name": "MulticallUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5540, + "src": "750:20:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "id": 13595, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 5392, + "src": "848:98:57", + "symbolAliases": [ + { + "foreign": { + "id": 13594, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "857:13:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol", + "file": "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol", + "id": 13597, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 1426, + "src": "947:141:57", + "symbolAliases": [ + { + "foreign": { + "id": 13596, + "name": "DataServicePausableUpgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1425, + "src": "956:30:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/DataService.sol", + "file": "@graphprotocol/horizon/contracts/data-service/DataService.sol", + "id": 13599, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 937, + "src": "1089:92:57", + "symbolAliases": [ + { + "foreign": { + "id": 13598, + "name": "DataService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 936, + "src": "1098:11:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol", + "file": "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol", + "id": 13601, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 1279, + "src": "1182:111:57", + "symbolAliases": [ + { + "foreign": { + "id": 13600, + "name": "DataServiceFees", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1278, + "src": "1191:15:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/utilities/Directory.sol", + "file": "./utilities/Directory.sol", + "id": 13603, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 17721, + "src": "1294:54:57", + "symbolAliases": [ + { + "foreign": { + "id": 13602, + "name": "Directory", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17720, + "src": "1303:9:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/utilities/AllocationManager.sol", + "file": "./utilities/AllocationManager.sol", + "id": 13605, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 17364, + "src": "1349:70:57", + "symbolAliases": [ + { + "foreign": { + "id": 13604, + "name": "AllocationManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17363, + "src": "1358:17:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/SubgraphServiceStorage.sol", + "file": "./SubgraphServiceStorage.sol", + "id": 13607, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 14903, + "src": "1420:72:57", + "symbolAliases": [ + { + "foreign": { + "id": 13606, + "name": "SubgraphServiceV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14902, + "src": "1429:24:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "file": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "id": 13609, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 841, + "src": "1494:85:57", + "symbolAliases": [ + { + "foreign": { + "id": 13608, + "name": "TokenUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 840, + "src": "1503:10:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "file": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "id": 13611, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 4540, + "src": "1580:81:57", + "symbolAliases": [ + { + "foreign": { + "id": 13610, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "1589:7:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/Allocation.sol", + "file": "./libraries/Allocation.sol", + "id": 13613, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 16034, + "src": "1662:56:57", + "symbolAliases": [ + { + "foreign": { + "id": 13612, + "name": "Allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16033, + "src": "1671:10:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/LegacyAllocation.sol", + "file": "./libraries/LegacyAllocation.sol", + "id": 13615, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14880, + "sourceUnit": 16463, + "src": "1719:68:57", + "symbolAliases": [ + { + "foreign": { + "id": 13614, + "name": "LegacyAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16462, + "src": "1728:16:57", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 13617, + "name": "Initializable", + "nameLocations": ["2004:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "2004:13:57" + }, + "id": 13618, + "nodeType": "InheritanceSpecifier", + "src": "2004:13:57" + }, + { + "baseName": { + "id": 13619, + "name": "OwnableUpgradeable", + "nameLocations": ["2023:18:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5123, + "src": "2023:18:57" + }, + "id": 13620, + "nodeType": "InheritanceSpecifier", + "src": "2023:18:57" + }, + { + "baseName": { + "id": 13621, + "name": "MulticallUpgradeable", + "nameLocations": ["2047:20:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5540, + "src": "2047:20:57" + }, + "id": 13622, + "nodeType": "InheritanceSpecifier", + "src": "2047:20:57" + }, + { + "baseName": { + "id": 13623, + "name": "DataService", + "nameLocations": ["2073:11:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 936, + "src": "2073:11:57" + }, + "id": 13624, + "nodeType": "InheritanceSpecifier", + "src": "2073:11:57" + }, + { + "baseName": { + "id": 13625, + "name": "DataServicePausableUpgradeable", + "nameLocations": ["2090:30:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1425, + "src": "2090:30:57" + }, + "id": 13626, + "nodeType": "InheritanceSpecifier", + "src": "2090:30:57" + }, + { + "baseName": { + "id": 13627, + "name": "DataServiceFees", + "nameLocations": ["2126:15:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1278, + "src": "2126:15:57" + }, + "id": 13628, + "nodeType": "InheritanceSpecifier", + "src": "2126:15:57" + }, + { + "baseName": { + "id": 13629, + "name": "Directory", + "nameLocations": ["2147:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17720, + "src": "2147:9:57" + }, + "id": 13630, + "nodeType": "InheritanceSpecifier", + "src": "2147:9:57" + }, + { + "baseName": { + "id": 13631, + "name": "AllocationManager", + "nameLocations": ["2162:17:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17363, + "src": "2162:17:57" + }, + "id": 13632, + "nodeType": "InheritanceSpecifier", + "src": "2162:17:57" + }, + { + "baseName": { + "id": 13633, + "name": "SubgraphServiceV1Storage", + "nameLocations": ["2185:24:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14902, + "src": "2185:24:57" + }, + "id": 13634, + "nodeType": "InheritanceSpecifier", + "src": "2185:24:57" + }, + { + "baseName": { + "id": 13635, + "name": "IRewardsIssuer", + "nameLocations": ["2215:14:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 561, + "src": "2215:14:57" + }, + "id": 13636, + "nodeType": "InheritanceSpecifier", + "src": "2215:14:57" + }, + { + "baseName": { + "id": 13637, + "name": "ISubgraphService", + "nameLocations": ["2235:16:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "2235:16:57" + }, + "id": 13638, + "nodeType": "InheritanceSpecifier", + "src": "2235:16:57" + } + ], + "canonicalName": "SubgraphService", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 13616, + "nodeType": "StructuredDocumentation", + "src": "1789:182:57", + "text": " @title SubgraphService contract\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 14879, + "internalFunctionIDs": { + "1199": 1, + "1211": 2, + "1254": 3 + }, + "linearizedBaseContracts": [ + 14879, 15634, 561, 14902, 17363, 17401, 17720, 1278, 1620, 1308, 1425, 1655, 936, 1557, 945, 2395, 2425, + 4928, 6044, 6069, 5700, 5540, 5123, 5437, 5391 + ], + "name": "SubgraphService", + "nameLocation": "1981:15:57", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 13641, + "libraryName": { + "id": 13639, + "name": "PPMMath", + "nameLocations": ["2264:7:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4539, + "src": "2264:7:57" + }, + "nodeType": "UsingForDirective", + "src": "2258:26:57", + "typeName": { + "id": 13640, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2276:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "global": false, + "id": 13647, + "libraryName": { + "id": 13642, + "name": "Allocation", + "nameLocations": ["2295:10:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16033, + "src": "2295:10:57" + }, + "nodeType": "UsingForDirective", + "src": "2289:58:57", + "typeName": { + "id": 13646, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 13643, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2318:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "2310:36:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 13645, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13644, + "name": "Allocation.State", + "nameLocations": ["2329:10:57", "2340:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "2329:16:57" + }, + "referencedDeclaration": 15663, + "src": "2329:16:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + } + }, + { + "global": false, + "id": 13651, + "libraryName": { + "id": 13648, + "name": "Allocation", + "nameLocations": ["2358:10:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16033, + "src": "2358:10:57" + }, + "nodeType": "UsingForDirective", + "src": "2352:38:57", + "typeName": { + "id": 13650, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13649, + "name": "Allocation.State", + "nameLocations": ["2373:10:57", "2384:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "2373:16:57" + }, + "referencedDeclaration": 15663, + "src": "2373:16:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + { + "global": false, + "id": 13655, + "libraryName": { + "id": 13652, + "name": "TokenUtils", + "nameLocations": ["2401:10:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 840, + "src": "2401:10:57" + }, + "nodeType": "UsingForDirective", + "src": "2395:33:57", + "typeName": { + "id": 13654, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13653, + "name": "IGraphToken", + "nameLocations": ["2416:11:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "2416:11:57" + }, + "referencedDeclaration": 758, + "src": "2416:11:57", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + } + }, + { + "body": { + "id": 13673, + "nodeType": "Block", + "src": "2599:118:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13666, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "baseExpression": { + "id": 13661, + "name": "indexers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14890, + "src": "2617:8:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Indexer_$15394_storage_$", + "typeString": "mapping(address => struct ISubgraphService.Indexer storage ref)" + } + }, + "id": 13663, + "indexExpression": { + "id": 13662, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13658, + "src": "2626:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2617:17:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Indexer_$15394_storage", + "typeString": "struct ISubgraphService.Indexer storage ref" + } + }, + "id": 13664, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2635:12:57", + "memberName": "registeredAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15389, + "src": "2617:30:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 13665, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2651:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2617:35:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 13668, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13658, + "src": "2690:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13667, + "name": "SubgraphServiceIndexerNotRegistered", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15445, + "src": "2654:35:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 13669, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2654:44:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13660, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2609:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2609:90:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13671, + "nodeType": "ExpressionStatement", + "src": "2609:90:57" + }, + { + "id": 13672, + "nodeType": "PlaceholderStatement", + "src": "2709:1:57" + } + ] + }, + "documentation": { + "id": 13656, + "nodeType": "StructuredDocumentation", + "src": "2434:112:57", + "text": " @notice Checks that an indexer is registered\n @param indexer The address of the indexer" + }, + "id": 13674, + "name": "onlyRegisteredIndexer", + "nameLocation": "2560:21:57", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 13659, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13658, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "2590:7:57", + "nodeType": "VariableDeclaration", + "scope": 13674, + "src": "2582:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13657, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2582:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2581:17:57" + }, + "src": "2551:166:57", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 13701, + "nodeType": "Block", + "src": "3421:39:57", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13698, + "name": "_disableInitializers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5345, + "src": "3431:20:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 13699, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3431:22:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13700, + "nodeType": "ExpressionStatement", + "src": "3431:22:57" + } + ] + }, + "documentation": { + "id": 13675, + "nodeType": "StructuredDocumentation", + "src": "2723:446:57", + "text": " @notice Constructor for the SubgraphService contract\n @dev DataService and Directory constructors set a bunch of immutable variables\n @param graphController The address of the Graph Controller contract\n @param disputeManager The address of the DisputeManager contract\n @param graphTallyCollector The address of the GraphTallyCollector contract\n @param curation The address of the Curation contract" + }, + "id": 13702, + "implemented": true, + "kind": "constructor", + "modifiers": [ + { + "arguments": [ + { + "id": 13686, + "name": "graphController", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13677, + "src": "3332:15:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13687, + "kind": "baseConstructorSpecifier", + "modifierName": { + "id": 13685, + "name": "DataService", + "nameLocations": ["3320:11:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 936, + "src": "3320:11:57" + }, + "nodeType": "ModifierInvocation", + "src": "3320:28:57" + }, + { + "arguments": [ + { + "arguments": [ + { + "id": 13691, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "3367:4:57", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SubgraphService_$14879", + "typeString": "contract SubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SubgraphService_$14879", + "typeString": "contract SubgraphService" + } + ], + "id": 13690, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3359:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13689, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3359:7:57", + "typeDescriptions": {} + } + }, + "id": 13692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3359:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13693, + "name": "disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13679, + "src": "3374:14:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13694, + "name": "graphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13681, + "src": "3390:19:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13695, + "name": "curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13683, + "src": "3411:8:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13696, + "kind": "baseConstructorSpecifier", + "modifierName": { + "id": 13688, + "name": "Directory", + "nameLocations": ["3349:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17720, + "src": "3349:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "3349:71:57" + } + ], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13684, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13677, + "mutability": "mutable", + "name": "graphController", + "nameLocation": "3203:15:57", + "nodeType": "VariableDeclaration", + "scope": 13702, + "src": "3195:23:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13676, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3195:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13679, + "mutability": "mutable", + "name": "disputeManager", + "nameLocation": "3236:14:57", + "nodeType": "VariableDeclaration", + "scope": 13702, + "src": "3228:22:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13678, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3228:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13681, + "mutability": "mutable", + "name": "graphTallyCollector", + "nameLocation": "3268:19:57", + "nodeType": "VariableDeclaration", + "scope": 13702, + "src": "3260:27:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13680, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3260:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13683, + "mutability": "mutable", + "name": "curation", + "nameLocation": "3305:8:57", + "nodeType": "VariableDeclaration", + "scope": 13702, + "src": "3297:16:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13682, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3297:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3185:134:57" + }, + "returnParameters": { + "id": 13697, + "nodeType": "ParameterList", + "parameters": [], + "src": "3421:0:57" + }, + "scope": 14879, + "src": "3174:286:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "baseFunctions": [15509], + "body": { + "id": 13751, + "nodeType": "Block", + "src": "3687:374:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 13717, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13705, + "src": "3712:5:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13716, + "name": "__Ownable_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4983, + "src": "3697:14:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 13718, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3697:21:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13719, + "nodeType": "ExpressionStatement", + "src": "3697:21:57" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13720, + "name": "__Multicall_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5456, + "src": "3728:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 13721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3728:18:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13722, + "nodeType": "ExpressionStatement", + "src": "3728:18:57" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13723, + "name": "__DataService_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 928, + "src": "3756:18:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 13724, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3756:20:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13725, + "nodeType": "ExpressionStatement", + "src": "3756:20:57" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13726, + "name": "__DataServicePausable_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1384, + "src": "3786:26:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 13727, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3786:28:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13728, + "nodeType": "ExpressionStatement", + "src": "3786:28:57" + }, + { + "expression": { + "arguments": [ + { + "hexValue": "537562677261706853657276696365", + "id": 13730, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3849:17:57", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_de968410163c85e985eeb4fbd7957aae2a5a7499745e7a8f1fd22402a4e5c8b0", + "typeString": "literal_string \"SubgraphService\"" + }, + "value": "SubgraphService" + }, + { + "hexValue": "312e30", + "id": 13731, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3868:5:57", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_e6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b3", + "typeString": "literal_string \"1.0\"" + }, + "value": "1.0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_de968410163c85e985eeb4fbd7957aae2a5a7499745e7a8f1fd22402a4e5c8b0", + "typeString": "literal_string \"SubgraphService\"" + }, + { + "typeIdentifier": "t_stringliteral_e6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b3", + "typeString": "literal_string \"1.0\"" + } + ], + "id": 13729, + "name": "__AllocationManager_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16649, + "src": "3824:24:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory,string memory)" + } + }, + "id": 13732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3824:50:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13733, + "nodeType": "ExpressionStatement", + "src": "3824:50:57" + }, + { + "expression": { + "arguments": [ + { + "id": 13735, + "name": "minimumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13707, + "src": "3910:22:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "arguments": [ + { + "id": 13738, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3939:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 13737, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3939:7:57", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 13736, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "3934:4:57", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 13739, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3934:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 13740, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3948:3:57", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "3934:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13734, + "name": "_setProvisionTokensRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2089, + "src": "3885:24:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 13741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3885:67:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13742, + "nodeType": "ExpressionStatement", + "src": "3885:67:57" + }, + { + "expression": { + "arguments": [ + { + "id": 13744, + "name": "maximumDelegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13709, + "src": "3982:22:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 13743, + "name": "_setDelegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2057, + "src": "3962:19:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 13745, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3962:43:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13746, + "nodeType": "ExpressionStatement", + "src": "3962:43:57" + }, + { + "expression": { + "arguments": [ + { + "id": 13748, + "name": "stakeToFeesRatio_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13711, + "src": "4036:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 13747, + "name": "_setStakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14855, + "src": "4015:20:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 13749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4015:39:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13750, + "nodeType": "ExpressionStatement", + "src": "4015:39:57" + } + ] + }, + "documentation": { + "id": 13703, + "nodeType": "StructuredDocumentation", + "src": "3466:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "c84a5ef3", + "id": 13752, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 13714, + "kind": "modifierInvocation", + "modifierName": { + "id": 13713, + "name": "initializer", + "nameLocations": ["3675:11:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5231, + "src": "3675:11:57" + }, + "nodeType": "ModifierInvocation", + "src": "3675:11:57" + } + ], + "name": "initialize", + "nameLocation": "3512:10:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 13712, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13705, + "mutability": "mutable", + "name": "owner", + "nameLocation": "3540:5:57", + "nodeType": "VariableDeclaration", + "scope": 13752, + "src": "3532:13:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13704, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3532:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13707, + "mutability": "mutable", + "name": "minimumProvisionTokens", + "nameLocation": "3563:22:57", + "nodeType": "VariableDeclaration", + "scope": 13752, + "src": "3555:30:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13706, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3555:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13709, + "mutability": "mutable", + "name": "maximumDelegationRatio", + "nameLocation": "3602:22:57", + "nodeType": "VariableDeclaration", + "scope": 13752, + "src": "3595:29:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 13708, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "3595:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13711, + "mutability": "mutable", + "name": "stakeToFeesRatio_", + "nameLocation": "3642:17:57", + "nodeType": "VariableDeclaration", + "scope": 13752, + "src": "3634:25:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13710, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3634:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3522:143:57" + }, + "returnParameters": { + "id": 13715, + "nodeType": "ParameterList", + "parameters": [], + "src": "3687:0:57" + }, + "scope": 14879, + "src": "3503:558:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1481], + "body": { + "id": 13851, + "nodeType": "Block", + "src": "4979:726:57", + "statements": [ + { + "assignments": [13770, 13772, 13774], + "declarations": [ + { + "constant": false, + "id": 13770, + "mutability": "mutable", + "name": "url", + "nameLocation": "5004:3:57", + "nodeType": "VariableDeclaration", + "scope": 13851, + "src": "4990:17:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 13769, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "4990:6:57", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13772, + "mutability": "mutable", + "name": "geohash", + "nameLocation": "5023:7:57", + "nodeType": "VariableDeclaration", + "scope": 13851, + "src": "5009:21:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 13771, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5009:6:57", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13774, + "mutability": "mutable", + "name": "paymentsDestination_", + "nameLocation": "5040:20:57", + "nodeType": "VariableDeclaration", + "scope": 13851, + "src": "5032:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13773, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5032:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 13786, + "initialValue": { + "arguments": [ + { + "id": 13777, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13757, + "src": "5088:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "components": [ + { + "id": 13779, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5107:6:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 13778, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5107:6:57", + "typeDescriptions": {} + } + }, + { + "id": 13781, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5115:6:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 13780, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "5115:6:57", + "typeDescriptions": {} + } + }, + { + "id": 13783, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5123:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13782, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5123:7:57", + "typeDescriptions": {} + } + } + ], + "id": 13784, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5106:25:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_string_storage_ptr_$_$_t_type$_t_string_storage_ptr_$_$_t_type$_t_address_$_$", + "typeString": "tuple(type(string storage pointer),type(string storage pointer),type(address))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_string_storage_ptr_$_$_t_type$_t_string_storage_ptr_$_$_t_type$_t_address_$_$", + "typeString": "tuple(type(string storage pointer),type(string storage pointer),type(address))" + } + ], + "expression": { + "id": 13775, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "5064:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 13776, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "5068:6:57", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "5064:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 13785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5064:77:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_address_payable_$", + "typeString": "tuple(string memory,string memory,address payable)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4989:152:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 13790, + "name": "url", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13770, + "src": "5166:3:57", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 13789, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5160:5:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 13788, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5160:5:57", + "typeDescriptions": {} + } + }, + "id": 13791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5160:10:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 13792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5171:6:57", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5160:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 13793, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5180:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5160:21:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13795, + "name": "SubgraphServiceEmptyUrl", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15434, + "src": "5183:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5183:25:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13787, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5152:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13797, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5152:57:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13798, + "nodeType": "ExpressionStatement", + "src": "5152:57:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13806, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 13802, + "name": "geohash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13772, + "src": "5233:7:57", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 13801, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5227:5:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 13800, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5227:5:57", + "typeDescriptions": {} + } + }, + "id": 13803, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5227:14:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 13804, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5242:6:57", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5227:21:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 13805, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5251:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5227:25:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13807, + "name": "SubgraphServiceEmptyGeohash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15437, + "src": "5254:27:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13808, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5254:29:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13799, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5219:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13809, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5219:65:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13810, + "nodeType": "ExpressionStatement", + "src": "5219:65:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 13817, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "baseExpression": { + "id": 13812, + "name": "indexers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14890, + "src": "5302:8:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Indexer_$15394_storage_$", + "typeString": "mapping(address => struct ISubgraphService.Indexer storage ref)" + } + }, + "id": 13814, + "indexExpression": { + "id": 13813, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13755, + "src": "5311:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5302:17:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Indexer_$15394_storage", + "typeString": "struct ISubgraphService.Indexer storage ref" + } + }, + "id": 13815, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5320:12:57", + "memberName": "registeredAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15389, + "src": "5302:30:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 13816, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5336:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5302:35:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13818, + "name": "SubgraphServiceIndexerAlreadyRegistered", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15440, + "src": "5339:39:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 13819, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5339:41:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13811, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5294:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13820, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5294:87:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13821, + "nodeType": "ExpressionStatement", + "src": "5294:87:57" + }, + { + "expression": { + "id": 13831, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 13822, + "name": "indexers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14890, + "src": "5424:8:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Indexer_$15394_storage_$", + "typeString": "mapping(address => struct ISubgraphService.Indexer storage ref)" + } + }, + "id": 13824, + "indexExpression": { + "id": 13823, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13755, + "src": "5433:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5424:17:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Indexer_$15394_storage", + "typeString": "struct ISubgraphService.Indexer storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 13826, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "5468:5:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 13827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5474:9:57", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "5468:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13828, + "name": "url", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13770, + "src": "5490:3:57", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 13829, + "name": "geohash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13772, + "src": "5504:7:57", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 13825, + "name": "Indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15394, + "src": "5444:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_Indexer_$15394_storage_ptr_$", + "typeString": "type(struct ISubgraphService.Indexer storage pointer)" + } + }, + "id": 13830, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": ["5454:12:57", "5485:3:57", "5495:7:57"], + "names": ["registeredAt", "url", "geoHash"], + "nodeType": "FunctionCall", + "src": "5444:70:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Indexer_$15394_memory_ptr", + "typeString": "struct ISubgraphService.Indexer memory" + } + }, + "src": "5424:90:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Indexer_$15394_storage", + "typeString": "struct ISubgraphService.Indexer storage ref" + } + }, + "id": 13832, + "nodeType": "ExpressionStatement", + "src": "5424:90:57" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 13838, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 13833, + "name": "paymentsDestination_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13774, + "src": "5528:20:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 13836, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5560:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 13835, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5552:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13834, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5552:7:57", + "typeDescriptions": {} + } + }, + "id": 13837, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5552:10:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "5528:34:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 13845, + "nodeType": "IfStatement", + "src": "5524:119:57", + "trueBody": { + "id": 13844, + "nodeType": "Block", + "src": "5564:79:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 13840, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13755, + "src": "5602:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13841, + "name": "paymentsDestination_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13774, + "src": "5611:20:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13839, + "name": "_setPaymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14832, + "src": "5578:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address)" + } + }, + "id": 13842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5578:54:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13843, + "nodeType": "ExpressionStatement", + "src": "5578:54:57" + } + ] + } + }, + { + "eventCall": { + "arguments": [ + { + "id": 13847, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13755, + "src": "5684:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13848, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13757, + "src": "5693:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 13846, + "name": "ServiceProviderRegistered", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1437, + "src": "5658:25:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (address,bytes memory)" + } + }, + "id": 13849, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5658:40:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13850, + "nodeType": "EmitStatement", + "src": "5653:45:57" + } + ] + }, + "documentation": { + "id": 13753, + "nodeType": "StructuredDocumentation", + "src": "4772:28:57", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "24b8fbf6", + "id": 13852, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 13761, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13755, + "src": "4928:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13762, + "kind": "modifierInvocation", + "modifierName": { + "id": 13760, + "name": "onlyAuthorizedForProvision", + "nameLocations": ["4901:26:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1963, + "src": "4901:26:57" + }, + "nodeType": "ModifierInvocation", + "src": "4901:35:57" + }, + { + "arguments": [ + { + "id": 13764, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13755, + "src": "4956:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13765, + "kind": "modifierInvocation", + "modifierName": { + "id": 13763, + "name": "onlyValidProvision", + "nameLocations": ["4937:18:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1988, + "src": "4937:18:57" + }, + "nodeType": "ModifierInvocation", + "src": "4937:27:57" + }, + { + "id": 13767, + "kind": "modifierInvocation", + "modifierName": { + "id": 13766, + "name": "whenNotPaused", + "nameLocations": ["4965:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "4965:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "4965:13:57" + } + ], + "name": "register", + "nameLocation": "4814:8:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 13759, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "4892:8:57" + }, + "parameters": { + "id": 13758, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13755, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "4840:7:57", + "nodeType": "VariableDeclaration", + "scope": 13852, + "src": "4832:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13754, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4832:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13757, + "mutability": "mutable", + "name": "data", + "nameLocation": "4872:4:57", + "nodeType": "VariableDeclaration", + "scope": 13852, + "src": "4857:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13756, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4857:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4822:60:57" + }, + "returnParameters": { + "id": 13768, + "nodeType": "ParameterList", + "parameters": [], + "src": "4979:0:57" + }, + "scope": 14879, + "src": "4805:900:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1489], + "body": { + "id": 13874, + "nodeType": "Block", + "src": "6490:110:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 13867, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13855, + "src": "6527:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13866, + "name": "_acceptProvisionParameters", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2042, + "src": "6500:26:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 13868, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6500:35:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13869, + "nodeType": "ExpressionStatement", + "src": "6500:35:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13871, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13855, + "src": "6585:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13870, + "name": "ProvisionPendingParametersAccepted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1442, + "src": "6550:34:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 13872, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6550:43:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13873, + "nodeType": "EmitStatement", + "src": "6545:48:57" + } + ] + }, + "documentation": { + "id": 13853, + "nodeType": "StructuredDocumentation", + "src": "6292:28:57", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "ce0fc0cc", + "id": 13875, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 13861, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13855, + "src": "6467:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13862, + "kind": "modifierInvocation", + "modifierName": { + "id": 13860, + "name": "onlyAuthorizedForProvision", + "nameLocations": ["6440:26:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1963, + "src": "6440:26:57" + }, + "nodeType": "ModifierInvocation", + "src": "6440:35:57" + }, + { + "id": 13864, + "kind": "modifierInvocation", + "modifierName": { + "id": 13863, + "name": "whenNotPaused", + "nameLocations": ["6476:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "6476:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "6476:13:57" + } + ], + "name": "acceptProvisionPendingParameters", + "nameLocation": "6334:32:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 13859, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "6431:8:57" + }, + "parameters": { + "id": 13858, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13855, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "6384:7:57", + "nodeType": "VariableDeclaration", + "scope": 13875, + "src": "6376:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13854, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6376:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13857, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 13875, + "src": "6401:14:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13856, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "6401:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "6366:55:57" + }, + "returnParameters": { + "id": 13865, + "nodeType": "ParameterList", + "parameters": [], + "src": "6490:0:57" + }, + "scope": 14879, + "src": "6325:275:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1497], + "body": { + "id": 13931, + "nodeType": "Block", + "src": "8058:355:57", + "statements": [ + { + "assignments": [13896, 13898, 13900, 13902], + "declarations": [ + { + "constant": false, + "id": 13896, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "8077:20:57", + "nodeType": "VariableDeclaration", + "scope": 13931, + "src": "8069:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 13895, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8069:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13898, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "8107:6:57", + "nodeType": "VariableDeclaration", + "scope": 13931, + "src": "8099:14:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 13897, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8099:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13900, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "8123:12:57", + "nodeType": "VariableDeclaration", + "scope": 13931, + "src": "8115:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13899, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8115:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13902, + "mutability": "mutable", + "name": "allocationProof", + "nameLocation": "8150:15:57", + "nodeType": "VariableDeclaration", + "scope": 13931, + "src": "8137:28:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13901, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8137:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 13916, + "initialValue": { + "arguments": [ + { + "id": 13905, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13880, + "src": "8193:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "components": [ + { + "id": 13907, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8212:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 13906, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8212:7:57", + "typeDescriptions": {} + } + }, + { + "id": 13909, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8221:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 13908, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8221:7:57", + "typeDescriptions": {} + } + }, + { + "id": 13911, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8230:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13910, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8230:7:57", + "typeDescriptions": {} + } + }, + { + "id": 13913, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8239:5:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 13912, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8239:5:57", + "typeDescriptions": {} + } + } + ], + "id": 13914, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "8211:34:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_bytes32_$_$_t_type$_t_uint256_$_$_t_type$_t_address_$_$_t_type$_t_bytes_storage_ptr_$_$", + "typeString": "tuple(type(bytes32),type(uint256),type(address),type(bytes storage pointer))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_bytes32_$_$_t_type$_t_uint256_$_$_t_type$_t_address_$_$_t_type$_t_bytes_storage_ptr_$_$", + "typeString": "tuple(type(bytes32),type(uint256),type(address),type(bytes storage pointer))" + } + ], + "expression": { + "id": 13903, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "8169:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 13904, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "8173:6:57", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "8169:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 13915, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8169:86:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_uint256_$_t_address_payable_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bytes32,uint256,address payable,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8068:187:57" + }, + { + "expression": { + "arguments": [ + { + "id": 13918, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13878, + "src": "8275:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13919, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13900, + "src": "8284:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13920, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13896, + "src": "8298:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 13921, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13898, + "src": "8320:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 13922, + "name": "allocationProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13902, + "src": "8328:15:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 13923, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "8345:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 13917, + "name": "_allocate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16781, + "src": "8265:9:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint32_$returns$__$", + "typeString": "function (address,address,bytes32,uint256,bytes memory,uint32)" + } + }, + "id": 13924, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8265:97:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13925, + "nodeType": "ExpressionStatement", + "src": "8265:97:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13927, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13878, + "src": "8392:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13928, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13880, + "src": "8401:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 13926, + "name": "ServiceStarted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1449, + "src": "8377:14:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (address,bytes memory)" + } + }, + "id": 13929, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8377:29:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13930, + "nodeType": "EmitStatement", + "src": "8372:34:57" + } + ] + }, + "documentation": { + "id": 13876, + "nodeType": "StructuredDocumentation", + "src": "7764:28:57", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "dedf6726", + "id": 13932, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 13884, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13878, + "src": "7948:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13885, + "kind": "modifierInvocation", + "modifierName": { + "id": 13883, + "name": "onlyAuthorizedForProvision", + "nameLocations": ["7921:26:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1963, + "src": "7921:26:57" + }, + "nodeType": "ModifierInvocation", + "src": "7921:35:57" + }, + { + "arguments": [ + { + "id": 13887, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13878, + "src": "7984:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13888, + "kind": "modifierInvocation", + "modifierName": { + "id": 13886, + "name": "onlyValidProvision", + "nameLocations": ["7965:18:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1988, + "src": "7965:18:57" + }, + "nodeType": "ModifierInvocation", + "src": "7965:27:57" + }, + { + "arguments": [ + { + "id": 13890, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13878, + "src": "8023:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13891, + "kind": "modifierInvocation", + "modifierName": { + "id": 13889, + "name": "onlyRegisteredIndexer", + "nameLocations": ["8001:21:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 13674, + "src": "8001:21:57" + }, + "nodeType": "ModifierInvocation", + "src": "8001:30:57" + }, + { + "id": 13893, + "kind": "modifierInvocation", + "modifierName": { + "id": 13892, + "name": "whenNotPaused", + "nameLocations": ["8040:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "8040:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "8040:13:57" + } + ], + "name": "startService", + "nameLocation": "7806:12:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 13882, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "7904:8:57" + }, + "parameters": { + "id": 13881, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13878, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "7836:7:57", + "nodeType": "VariableDeclaration", + "scope": 13932, + "src": "7828:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13877, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7828:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13880, + "mutability": "mutable", + "name": "data", + "nameLocation": "7868:4:57", + "nodeType": "VariableDeclaration", + "scope": 13932, + "src": "7853:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13879, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "7853:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "7818:60:57" + }, + "returnParameters": { + "id": 13894, + "nodeType": "ParameterList", + "parameters": [], + "src": "8058:0:57" + }, + "scope": 14879, + "src": "7797:616:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1505], + "body": { + "id": 13983, + "nodeType": "Block", + "src": "9664:323:57", + "statements": [ + { + "assignments": [13950], + "declarations": [ + { + "constant": false, + "id": 13950, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "9682:12:57", + "nodeType": "VariableDeclaration", + "scope": 13983, + "src": "9674:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13949, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9674:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 13958, + "initialValue": { + "arguments": [ + { + "id": 13953, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13937, + "src": "9708:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "components": [ + { + "id": 13955, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9715:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 13954, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9715:7:57", + "typeDescriptions": {} + } + } + ], + "id": 13956, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "9714:9:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + } + ], + "expression": { + "id": 13951, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "9697:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 13952, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "9701:6:57", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "9697:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 13957, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9697:27:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9674:50:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 13966, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 13962, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13950, + "src": "9772:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 13960, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "9755:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 13961, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9768:3:57", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "9755:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 13963, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9755:30:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 13964, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9786:7:57", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "9755:38:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 13965, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13935, + "src": "9797:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "9755:49:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 13968, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13935, + "src": "9857:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13969, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13950, + "src": "9866:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 13967, + "name": "SubgraphServiceAllocationNotAuthorized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15472, + "src": "9818:38:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 13970, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9818:61:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 13959, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "9734:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 13971, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9734:155:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13972, + "nodeType": "ExpressionStatement", + "src": "9734:155:57" + }, + { + "expression": { + "arguments": [ + { + "id": 13974, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13950, + "src": "9916:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "66616c7365", + "id": 13975, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9930:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 13973, + "name": "_closeAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17273, + "src": "9899:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$", + "typeString": "function (address,bool)" + } + }, + "id": 13976, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9899:37:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13977, + "nodeType": "ExpressionStatement", + "src": "9899:37:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 13979, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13935, + "src": "9966:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 13980, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13937, + "src": "9975:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 13978, + "name": "ServiceStopped", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1456, + "src": "9951:14:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (address,bytes memory)" + } + }, + "id": 13981, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9951:29:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 13982, + "nodeType": "EmitStatement", + "src": "9946:34:57" + } + ] + }, + "documentation": { + "id": 13933, + "nodeType": "StructuredDocumentation", + "src": "9451:28:57", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "8180083b", + "id": 13984, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 13941, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13935, + "src": "9610:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13942, + "kind": "modifierInvocation", + "modifierName": { + "id": 13940, + "name": "onlyAuthorizedForProvision", + "nameLocations": ["9583:26:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1963, + "src": "9583:26:57" + }, + "nodeType": "ModifierInvocation", + "src": "9583:35:57" + }, + { + "arguments": [ + { + "id": 13944, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13935, + "src": "9641:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13945, + "kind": "modifierInvocation", + "modifierName": { + "id": 13943, + "name": "onlyRegisteredIndexer", + "nameLocations": ["9619:21:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 13674, + "src": "9619:21:57" + }, + "nodeType": "ModifierInvocation", + "src": "9619:30:57" + }, + { + "id": 13947, + "kind": "modifierInvocation", + "modifierName": { + "id": 13946, + "name": "whenNotPaused", + "nameLocations": ["9650:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "9650:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "9650:13:57" + } + ], + "name": "stopService", + "nameLocation": "9493:11:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 13939, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "9574:8:57" + }, + "parameters": { + "id": 13938, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13935, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "9522:7:57", + "nodeType": "VariableDeclaration", + "scope": 13984, + "src": "9514:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13934, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9514:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13937, + "mutability": "mutable", + "name": "data", + "nameLocation": "9554:4:57", + "nodeType": "VariableDeclaration", + "scope": 13984, + "src": "9539:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13936, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "9539:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "9504:60:57" + }, + "returnParameters": { + "id": 13948, + "nodeType": "ParameterList", + "parameters": [], + "src": "9664:0:57" + }, + "scope": 14879, + "src": "9484:503:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1518], + "body": { + "id": 14054, + "nodeType": "Block", + "src": "11826:536:57", + "statements": [ + { + "assignments": [14010], + "declarations": [ + { + "constant": false, + "id": 14010, + "mutability": "mutable", + "name": "paymentCollected", + "nameLocation": "11844:16:57", + "nodeType": "VariableDeclaration", + "scope": 14054, + "src": "11836:24:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14009, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11836:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14012, + "initialValue": { + "hexValue": "30", + "id": 14011, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11863:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "11836:28:57" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "id": 14017, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14013, + "name": "paymentType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13990, + "src": "11879:11:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "expression": { + "id": 14014, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "11894:14:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphPayments_$2489_$", + "typeString": "type(contract IGraphPayments)" + } + }, + "id": 14015, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "11909:12:57", + "memberName": "PaymentTypes", + "nodeType": "MemberAccess", + "referencedDeclaration": 2433, + "src": "11894:27:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_PaymentTypes_$2433_$", + "typeString": "type(enum IGraphPayments.PaymentTypes)" + } + }, + "id": 14016, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "11922:8:57", + "memberName": "QueryFee", + "nodeType": "MemberAccess", + "referencedDeclaration": 2430, + "src": "11894:36:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "src": "11879:51:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "id": 14030, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14026, + "name": "paymentType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13990, + "src": "12018:11:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "expression": { + "id": 14027, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "12033:14:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphPayments_$2489_$", + "typeString": "type(contract IGraphPayments)" + } + }, + "id": 14028, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12048:12:57", + "memberName": "PaymentTypes", + "nodeType": "MemberAccess", + "referencedDeclaration": 2433, + "src": "12033:27:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_PaymentTypes_$2433_$", + "typeString": "type(enum IGraphPayments.PaymentTypes)" + } + }, + "id": 14029, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "12061:15:57", + "memberName": "IndexingRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 2432, + "src": "12033:43:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "src": "12018:58:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 14043, + "nodeType": "Block", + "src": "12166:78:57", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 14040, + "name": "paymentType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13990, + "src": "12221:11:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + ], + "id": 14039, + "name": "SubgraphServiceInvalidPaymentType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15451, + "src": "12187:33:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_enum$_PaymentTypes_$2433_$returns$_t_error_$", + "typeString": "function (enum IGraphPayments.PaymentTypes) pure returns (error)" + } + }, + "id": 14041, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12187:46:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + }, + "id": 14042, + "nodeType": "RevertStatement", + "src": "12180:53:57" + } + ] + }, + "id": 14044, + "nodeType": "IfStatement", + "src": "12014:230:57", + "trueBody": { + "id": 14038, + "nodeType": "Block", + "src": "12078:82:57", + "statements": [ + { + "expression": { + "id": 14036, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14031, + "name": "paymentCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14010, + "src": "12092:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 14033, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13987, + "src": "12135:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14034, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13992, + "src": "12144:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 14032, + "name": "_collectIndexingRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14812, + "src": "12111:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_calldata_ptr_$returns$_t_uint256_$", + "typeString": "function (address,bytes calldata) returns (uint256)" + } + }, + "id": 14035, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12111:38:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "12092:57:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14037, + "nodeType": "ExpressionStatement", + "src": "12092:57:57" + } + ] + } + }, + "id": 14045, + "nodeType": "IfStatement", + "src": "11875:369:57", + "trueBody": { + "id": 14025, + "nodeType": "Block", + "src": "11932:76:57", + "statements": [ + { + "expression": { + "id": 14023, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14018, + "name": "paymentCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14010, + "src": "11946:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 14020, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13987, + "src": "11983:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14021, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13992, + "src": "11992:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 14019, + "name": "_collectQueryFees", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14759, + "src": "11965:17:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_calldata_ptr_$returns$_t_uint256_$", + "typeString": "function (address,bytes calldata) returns (uint256)" + } + }, + "id": 14022, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "11965:32:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11946:51:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14024, + "nodeType": "ExpressionStatement", + "src": "11946:51:57" + } + ] + } + }, + { + "eventCall": { + "arguments": [ + { + "id": 14047, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13987, + "src": "12283:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14048, + "name": "paymentType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13990, + "src": "12292:11:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + { + "id": 14049, + "name": "paymentCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14010, + "src": "12305:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14046, + "name": "ServicePaymentCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1466, + "src": "12259:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_enum$_PaymentTypes_$2433_$_t_uint256_$returns$__$", + "typeString": "function (address,enum IGraphPayments.PaymentTypes,uint256)" + } + }, + "id": 14050, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12259:63:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14051, + "nodeType": "EmitStatement", + "src": "12254:68:57" + }, + { + "expression": { + "id": 14052, + "name": "paymentCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14010, + "src": "12339:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 14008, + "id": 14053, + "nodeType": "Return", + "src": "12332:23:57" + } + ] + }, + "documentation": { + "id": 13985, + "nodeType": "StructuredDocumentation", + "src": "11462:28:57", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "b15d2a2c", + "id": 14055, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 13996, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13987, + "src": "11690:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 13997, + "kind": "modifierInvocation", + "modifierName": { + "id": 13995, + "name": "onlyAuthorizedForProvision", + "nameLocations": ["11663:26:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1963, + "src": "11663:26:57" + }, + "nodeType": "ModifierInvocation", + "src": "11663:35:57" + }, + { + "arguments": [ + { + "id": 13999, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13987, + "src": "11726:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 14000, + "kind": "modifierInvocation", + "modifierName": { + "id": 13998, + "name": "onlyValidProvision", + "nameLocations": ["11707:18:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1988, + "src": "11707:18:57" + }, + "nodeType": "ModifierInvocation", + "src": "11707:27:57" + }, + { + "arguments": [ + { + "id": 14002, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13987, + "src": "11765:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 14003, + "kind": "modifierInvocation", + "modifierName": { + "id": 14001, + "name": "onlyRegisteredIndexer", + "nameLocations": ["11743:21:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 13674, + "src": "11743:21:57" + }, + "nodeType": "ModifierInvocation", + "src": "11743:30:57" + }, + { + "id": 14005, + "kind": "modifierInvocation", + "modifierName": { + "id": 14004, + "name": "whenNotPaused", + "nameLocations": ["11782:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "11782:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "11782:13:57" + } + ], + "name": "collect", + "nameLocation": "11504:7:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 13994, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "11646:8:57" + }, + "parameters": { + "id": 13993, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13987, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "11529:7:57", + "nodeType": "VariableDeclaration", + "scope": 14055, + "src": "11521:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 13986, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11521:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13990, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "11574:11:57", + "nodeType": "VariableDeclaration", + "scope": 14055, + "src": "11546:39:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 13989, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 13988, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["11546:14:57", "11561:12:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "11546:27:57" + }, + "referencedDeclaration": 2433, + "src": "11546:27:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 13992, + "mutability": "mutable", + "name": "data", + "nameLocation": "11610:4:57", + "nodeType": "VariableDeclaration", + "scope": 14055, + "src": "11595:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 13991, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "11595:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "11511:109:57" + }, + "returnParameters": { + "id": 14008, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14007, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14055, + "src": "11813:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14006, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11813:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "11812:9:57" + }, + "scope": 14879, + "src": "11495:867:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [1526], + "body": { + "id": 14098, + "nodeType": "Block", + "src": "12693:226:57", + "statements": [ + { + "assignments": [14067, 14069], + "declarations": [ + { + "constant": false, + "id": 14067, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "12712:6:57", + "nodeType": "VariableDeclaration", + "scope": 14098, + "src": "12704:14:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14066, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12704:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14069, + "mutability": "mutable", + "name": "reward", + "nameLocation": "12728:6:57", + "nodeType": "VariableDeclaration", + "scope": 14098, + "src": "12720:14:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14068, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12720:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14079, + "initialValue": { + "arguments": [ + { + "id": 14072, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14060, + "src": "12749:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "components": [ + { + "id": 14074, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12756:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 14073, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12756:7:57", + "typeDescriptions": {} + } + }, + { + "id": 14076, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12765:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 14075, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12765:7:57", + "typeDescriptions": {} + } + } + ], + "id": 14077, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "12755:18:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$", + "typeString": "tuple(type(uint256),type(uint256))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$", + "typeString": "tuple(type(uint256),type(uint256))" + } + ], + "expression": { + "id": 14070, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "12738:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 14071, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "12742:6:57", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "12738:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 14078, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12738:36:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12703:71:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14083, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14058, + "src": "12806:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14084, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14067, + "src": "12815:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 14085, + "name": "reward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14069, + "src": "12823:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14088, + "name": "_disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17699, + "src": "12839:15:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IDisputeManager_$15373_$", + "typeString": "function () view returns (contract IDisputeManager)" + } + }, + "id": 14089, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12839:17:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + ], + "id": 14087, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12831:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14086, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12831:7:57", + "typeDescriptions": {} + } + }, + "id": 14090, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12831:26:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14080, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "12784:13:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 14081, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12784:15:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 14082, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12800:5:57", + "memberName": "slash", + "nodeType": "MemberAccess", + "referencedDeclaration": 3862, + "src": "12784:21:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_address_$returns$__$", + "typeString": "function (address,uint256,uint256,address) external" + } + }, + "id": 14091, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12784:74:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14092, + "nodeType": "ExpressionStatement", + "src": "12784:74:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 14094, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14058, + "src": "12896:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14095, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14067, + "src": "12905:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14093, + "name": "ServiceProviderSlashed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1473, + "src": "12873:22:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 14096, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12873:39:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14097, + "nodeType": "EmitStatement", + "src": "12868:44:57" + } + ] + }, + "documentation": { + "id": 14056, + "nodeType": "StructuredDocumentation", + "src": "12570:28:57", + "text": "@inheritdoc IDataService" + }, + "functionSelector": "cb8347fe", + "id": 14099, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14064, + "kind": "modifierInvocation", + "modifierName": { + "id": 14063, + "name": "onlyDisputeManager", + "nameLocations": ["12674:18:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17635, + "src": "12674:18:57" + }, + "nodeType": "ModifierInvocation", + "src": "12674:18:57" + } + ], + "name": "slash", + "nameLocation": "12612:5:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14062, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "12665:8:57" + }, + "parameters": { + "id": 14061, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14058, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "12626:7:57", + "nodeType": "VariableDeclaration", + "scope": 14099, + "src": "12618:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14057, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12618:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14060, + "mutability": "mutable", + "name": "data", + "nameLocation": "12650:4:57", + "nodeType": "VariableDeclaration", + "scope": 14099, + "src": "12635:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 14059, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "12635:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "12617:38:57" + }, + "returnParameters": { + "id": 14065, + "nodeType": "ParameterList", + "parameters": [], + "src": "12693:0:57" + }, + "scope": 14879, + "src": "12603:316:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15515], + "body": { + "id": 14143, + "nodeType": "Block", + "src": "13046:339:57", + "statements": [ + { + "assignments": [14112], + "declarations": [ + { + "constant": false, + "id": 14112, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "13080:10:57", + "nodeType": "VariableDeclaration", + "scope": 14143, + "src": "13056:34:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 14111, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14110, + "name": "Allocation.State", + "nameLocations": ["13056:10:57", "13067:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "13056:16:57" + }, + "referencedDeclaration": 15663, + "src": "13056:16:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 14117, + "initialValue": { + "arguments": [ + { + "id": 14115, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14102, + "src": "13110:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 14113, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "13093:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 14114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13106:3:57", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "13093:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 14116, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13093:30:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13056:67:57" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 14121, + "name": "maxPOIStaleness", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17390, + "src": "13160:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 14119, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14112, + "src": "13141:10:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14120, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13152:7:57", + "memberName": "isStale", + "nodeType": "MemberAccess", + "referencedDeclaration": 15946, + "src": "13141:18:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_State_$15663_memory_ptr_$_t_uint256_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory,uint256) view returns (bool)" + } + }, + "id": 14122, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13141:35:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14124, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14102, + "src": "13220:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14123, + "name": "SubgraphServiceCannotForceCloseAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15484, + "src": "13178:41:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 14125, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13178:55:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14118, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "13133:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14126, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13133:101:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14127, + "nodeType": "ExpressionStatement", + "src": "13133:101:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14132, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "13252:26:57", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 14129, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14112, + "src": "13253:10:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14130, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13264:12:57", + "memberName": "isAltruistic", + "nodeType": "MemberAccess", + "referencedDeclaration": 15999, + "src": "13253:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 14131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13253:25:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14134, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14102, + "src": "13318:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14133, + "name": "SubgraphServiceAllocationIsAltruistic", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15489, + "src": "13280:37:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 14135, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13280:51:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14128, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "13244:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14136, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13244:88:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14137, + "nodeType": "ExpressionStatement", + "src": "13244:88:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14139, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14102, + "src": "13359:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "74727565", + "id": 14140, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13373:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 14138, + "name": "_closeAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17273, + "src": "13342:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$", + "typeString": "function (address,bool)" + } + }, + "id": 14141, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13342:36:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14142, + "nodeType": "ExpressionStatement", + "src": "13342:36:57" + } + ] + }, + "documentation": { + "id": 14100, + "nodeType": "StructuredDocumentation", + "src": "12925:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "ec9c218d", + "id": 14144, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14106, + "kind": "modifierInvocation", + "modifierName": { + "id": 14105, + "name": "whenNotPaused", + "nameLocations": ["13032:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "13032:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "13032:13:57" + } + ], + "name": "closeStaleAllocation", + "nameLocation": "12971:20:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14104, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "13023:8:57" + }, + "parameters": { + "id": 14103, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14102, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "13000:12:57", + "nodeType": "VariableDeclaration", + "scope": 14144, + "src": "12992:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14101, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12992:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12991:22:57" + }, + "returnParameters": { + "id": 14107, + "nodeType": "ParameterList", + "parameters": [], + "src": "13046:0:57" + }, + "scope": 14879, + "src": "12962:423:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15525], + "body": { + "id": 14185, + "nodeType": "Block", + "src": "13701:239:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 14172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 14168, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14149, + "src": "13749:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 14166, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "13732:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 14167, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13745:3:57", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "13732:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 14169, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13732:30:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14170, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13763:7:57", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "13732:38:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 14171, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14147, + "src": "13774:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "13732:49:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14174, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14147, + "src": "13834:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14175, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14149, + "src": "13843:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14173, + "name": "SubgraphServiceAllocationNotAuthorized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15472, + "src": "13795:38:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 14176, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13795:61:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14165, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "13711:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13711:155:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14178, + "nodeType": "ExpressionStatement", + "src": "13711:155:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14180, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14149, + "src": "13894:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14181, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14151, + "src": "13908:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 14182, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "13916:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 14179, + "name": "_resizeAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17203, + "src": "13876:17:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint32_$returns$__$", + "typeString": "function (address,uint256,uint32)" + } + }, + "id": 14183, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13876:57:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14184, + "nodeType": "ExpressionStatement", + "src": "13876:57:57" + } + ] + }, + "documentation": { + "id": 14145, + "nodeType": "StructuredDocumentation", + "src": "13391:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "81e777a7", + "id": 14186, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": [ + { + "id": 14154, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14147, + "src": "13591:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 14155, + "kind": "modifierInvocation", + "modifierName": { + "id": 14153, + "name": "onlyAuthorizedForProvision", + "nameLocations": ["13564:26:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1963, + "src": "13564:26:57" + }, + "nodeType": "ModifierInvocation", + "src": "13564:35:57" + }, + { + "arguments": [ + { + "id": 14157, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14147, + "src": "13627:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 14158, + "kind": "modifierInvocation", + "modifierName": { + "id": 14156, + "name": "onlyValidProvision", + "nameLocations": ["13608:18:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1988, + "src": "13608:18:57" + }, + "nodeType": "ModifierInvocation", + "src": "13608:27:57" + }, + { + "arguments": [ + { + "id": 14160, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14147, + "src": "13666:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "id": 14161, + "kind": "modifierInvocation", + "modifierName": { + "id": 14159, + "name": "onlyRegisteredIndexer", + "nameLocations": ["13644:21:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 13674, + "src": "13644:21:57" + }, + "nodeType": "ModifierInvocation", + "src": "13644:30:57" + }, + { + "id": 14163, + "kind": "modifierInvocation", + "modifierName": { + "id": 14162, + "name": "whenNotPaused", + "nameLocations": ["13683:13:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5590, + "src": "13683:13:57" + }, + "nodeType": "ModifierInvocation", + "src": "13683:13:57" + } + ], + "name": "resizeAllocation", + "nameLocation": "13437:16:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14152, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14147, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "13471:7:57", + "nodeType": "VariableDeclaration", + "scope": 14186, + "src": "13463:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14146, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13463:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14149, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "13496:12:57", + "nodeType": "VariableDeclaration", + "scope": 14186, + "src": "13488:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14148, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13488:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14151, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "13526:6:57", + "nodeType": "VariableDeclaration", + "scope": 14186, + "src": "13518:14:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14150, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13518:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "13453:85:57" + }, + "returnParameters": { + "id": 14164, + "nodeType": "ParameterList", + "parameters": [], + "src": "13701:0:57" + }, + "scope": 14879, + "src": "13428:512:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15535], + "body": { + "id": 14205, + "nodeType": "Block", + "src": "14143:86:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14200, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14189, + "src": "14178:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14201, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14191, + "src": "14187:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14202, + "name": "subgraphDeploymentID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14193, + "src": "14201:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 14199, + "name": "_migrateLegacyAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16681, + "src": "14153:24:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_bytes32_$returns$__$", + "typeString": "function (address,address,bytes32)" + } + }, + "id": 14203, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14153:69:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14204, + "nodeType": "ExpressionStatement", + "src": "14153:69:57" + } + ] + }, + "documentation": { + "id": 14187, + "nodeType": "StructuredDocumentation", + "src": "13946:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "7dfe6d28", + "id": 14206, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14197, + "kind": "modifierInvocation", + "modifierName": { + "id": 14196, + "name": "onlyOwner", + "nameLocations": ["14133:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "14133:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "14133:9:57" + } + ], + "name": "migrateLegacyAllocation", + "nameLocation": "13992:23:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14195, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "14124:8:57" + }, + "parameters": { + "id": 14194, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14189, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "14033:7:57", + "nodeType": "VariableDeclaration", + "scope": 14206, + "src": "14025:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14188, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14025:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14191, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "14058:12:57", + "nodeType": "VariableDeclaration", + "scope": 14206, + "src": "14050:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14190, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14050:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14193, + "mutability": "mutable", + "name": "subgraphDeploymentID", + "nameLocation": "14088:20:57", + "nodeType": "VariableDeclaration", + "scope": 14206, + "src": "14080:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14192, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "14080:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "14015:99:57" + }, + "returnParameters": { + "id": 14198, + "nodeType": "ParameterList", + "parameters": [], + "src": "14143:0:57" + }, + "scope": 14879, + "src": "13983:246:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15543], + "body": { + "id": 14222, + "nodeType": "Block", + "src": "14363:58:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14218, + "name": "pauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14209, + "src": "14391:13:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14219, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14211, + "src": "14406:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 14217, + "name": "_setPauseGuardian", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1424, + "src": "14373:17:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$", + "typeString": "function (address,bool)" + } + }, + "id": 14220, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14373:41:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14221, + "nodeType": "ExpressionStatement", + "src": "14373:41:57" + } + ] + }, + "documentation": { + "id": 14207, + "nodeType": "StructuredDocumentation", + "src": "14235:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "35577962", + "id": 14223, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14215, + "kind": "modifierInvocation", + "modifierName": { + "id": 14214, + "name": "onlyOwner", + "nameLocations": ["14353:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "14353:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "14353:9:57" + } + ], + "name": "setPauseGuardian", + "nameLocation": "14281:16:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14213, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "14344:8:57" + }, + "parameters": { + "id": 14212, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14209, + "mutability": "mutable", + "name": "pauseGuardian", + "nameLocation": "14306:13:57", + "nodeType": "VariableDeclaration", + "scope": 14223, + "src": "14298:21:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14208, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14298:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14211, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "14326:7:57", + "nodeType": "VariableDeclaration", + "scope": 14223, + "src": "14321:12:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 14210, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "14321:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "14297:37:57" + }, + "returnParameters": { + "id": 14216, + "nodeType": "ParameterList", + "parameters": [], + "src": "14363:0:57" + }, + "scope": 14879, + "src": "14272:149:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15579], + "body": { + "id": 14236, + "nodeType": "Block", + "src": "14544:74:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 14231, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "14578:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 14232, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14582:6:57", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "14578:10:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14233, + "name": "paymentsDestination_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14226, + "src": "14590:20:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14230, + "name": "_setPaymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14832, + "src": "14554:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address)" + } + }, + "id": 14234, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14554:57:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14235, + "nodeType": "ExpressionStatement", + "src": "14554:57:57" + } + ] + }, + "documentation": { + "id": 14224, + "nodeType": "StructuredDocumentation", + "src": "14427:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "6ccec5b8", + "id": 14237, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "setPaymentsDestination", + "nameLocation": "14473:22:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14228, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "14535:8:57" + }, + "parameters": { + "id": 14227, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14226, + "mutability": "mutable", + "name": "paymentsDestination_", + "nameLocation": "14504:20:57", + "nodeType": "VariableDeclaration", + "scope": 14237, + "src": "14496:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14225, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14496:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "14495:30:57" + }, + "returnParameters": { + "id": 14229, + "nodeType": "ParameterList", + "parameters": [], + "src": "14544:0:57" + }, + "scope": 14879, + "src": "14464:154:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15549], + "body": { + "id": 14251, + "nodeType": "Block", + "src": "14756:95:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14247, + "name": "minimumProvisionTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14240, + "src": "14791:22:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 14248, + "name": "DEFAULT_MAX_PROVISION_TOKENS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1873, + "src": "14815:28:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14246, + "name": "_setProvisionTokensRange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2089, + "src": "14766:24:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 14249, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14766:78:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14250, + "nodeType": "ExpressionStatement", + "src": "14766:78:57" + } + ] + }, + "documentation": { + "id": 14238, + "nodeType": "StructuredDocumentation", + "src": "14624:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "832bc923", + "id": 14252, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14244, + "kind": "modifierInvocation", + "modifierName": { + "id": 14243, + "name": "onlyOwner", + "nameLocations": ["14746:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "14746:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "14746:9:57" + } + ], + "name": "setMinimumProvisionTokens", + "nameLocation": "14670:25:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14242, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "14737:8:57" + }, + "parameters": { + "id": 14241, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14240, + "mutability": "mutable", + "name": "minimumProvisionTokens", + "nameLocation": "14704:22:57", + "nodeType": "VariableDeclaration", + "scope": 14252, + "src": "14696:30:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14239, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14696:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "14695:32:57" + }, + "returnParameters": { + "id": 14245, + "nodeType": "ParameterList", + "parameters": [], + "src": "14756:0:57" + }, + "scope": 14879, + "src": "14661:190:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15555], + "body": { + "id": 14265, + "nodeType": "Block", + "src": "14974:53:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14262, + "name": "delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14255, + "src": "15004:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 14261, + "name": "_setDelegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2057, + "src": "14984:19:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$", + "typeString": "function (uint32)" + } + }, + "id": 14263, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14984:36:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14264, + "nodeType": "ExpressionStatement", + "src": "14984:36:57" + } + ] + }, + "documentation": { + "id": 14253, + "nodeType": "StructuredDocumentation", + "src": "14857:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "1dd42f60", + "id": 14266, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14259, + "kind": "modifierInvocation", + "modifierName": { + "id": 14258, + "name": "onlyOwner", + "nameLocations": ["14964:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "14964:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "14964:9:57" + } + ], + "name": "setDelegationRatio", + "nameLocation": "14903:18:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14257, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "14955:8:57" + }, + "parameters": { + "id": 14256, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14255, + "mutability": "mutable", + "name": "delegationRatio", + "nameLocation": "14929:15:57", + "nodeType": "VariableDeclaration", + "scope": 14266, + "src": "14922:22:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 14254, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "14922:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "14921:24:57" + }, + "returnParameters": { + "id": 14260, + "nodeType": "ParameterList", + "parameters": [], + "src": "14974:0:57" + }, + "scope": 14879, + "src": "14894:133:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15561], + "body": { + "id": 14279, + "nodeType": "Block", + "src": "15154:56:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14276, + "name": "stakeToFeesRatio_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14269, + "src": "15185:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14275, + "name": "_setStakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14855, + "src": "15164:20:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 14277, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15164:39:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14278, + "nodeType": "ExpressionStatement", + "src": "15164:39:57" + } + ] + }, + "documentation": { + "id": 14267, + "nodeType": "StructuredDocumentation", + "src": "15033:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "e6f50054", + "id": 14280, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14273, + "kind": "modifierInvocation", + "modifierName": { + "id": 14272, + "name": "onlyOwner", + "nameLocations": ["15144:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "15144:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "15144:9:57" + } + ], + "name": "setStakeToFeesRatio", + "nameLocation": "15079:19:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14271, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "15135:8:57" + }, + "parameters": { + "id": 14270, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14269, + "mutability": "mutable", + "name": "stakeToFeesRatio_", + "nameLocation": "15107:17:57", + "nodeType": "VariableDeclaration", + "scope": 14280, + "src": "15099:25:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14268, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15099:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15098:27:57" + }, + "returnParameters": { + "id": 14274, + "nodeType": "ParameterList", + "parameters": [], + "src": "15154:0:57" + }, + "scope": 14879, + "src": "15070:140:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15567], + "body": { + "id": 14293, + "nodeType": "Block", + "src": "15335:54:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14290, + "name": "maxPOIStaleness_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14283, + "src": "15365:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14289, + "name": "_setMaxPOIStaleness", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17288, + "src": "15345:19:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 14291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15345:37:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14292, + "nodeType": "ExpressionStatement", + "src": "15345:37:57" + } + ] + }, + "documentation": { + "id": 14281, + "nodeType": "StructuredDocumentation", + "src": "15216:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "7aa31bce", + "id": 14294, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14287, + "kind": "modifierInvocation", + "modifierName": { + "id": 14286, + "name": "onlyOwner", + "nameLocations": ["15325:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "15325:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "15325:9:57" + } + ], + "name": "setMaxPOIStaleness", + "nameLocation": "15262:18:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14285, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "15316:8:57" + }, + "parameters": { + "id": 14284, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14283, + "mutability": "mutable", + "name": "maxPOIStaleness_", + "nameLocation": "15289:16:57", + "nodeType": "VariableDeclaration", + "scope": 14294, + "src": "15281:24:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14282, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15281:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15280:26:57" + }, + "returnParameters": { + "id": 14288, + "nodeType": "ParameterList", + "parameters": [], + "src": "15335:0:57" + }, + "scope": 14879, + "src": "15253:136:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15573], + "body": { + "id": 14321, + "nodeType": "Block", + "src": "15505:186:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 14306, + "name": "curationCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14297, + "src": "15542:11:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 14304, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "15523:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_PPMMath_$4539_$", + "typeString": "type(library PPMMath)" + } + }, + "id": 14305, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15531:10:57", + "memberName": "isValidPPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4538, + "src": "15523:18:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_bool_$", + "typeString": "function (uint256) pure returns (bool)" + } + }, + "id": 14307, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15523:31:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14309, + "name": "curationCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14297, + "src": "15590:11:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14308, + "name": "SubgraphServiceInvalidCurationCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15431, + "src": "15556:33:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256) pure returns (error)" + } + }, + "id": 14310, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15556:46:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14303, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "15515:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14311, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15515:88:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14312, + "nodeType": "ExpressionStatement", + "src": "15515:88:57" + }, + { + "expression": { + "id": 14315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14313, + "name": "curationFeesCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14896, + "src": "15613:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 14314, + "name": "curationCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14297, + "src": "15631:11:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "15613:29:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14316, + "nodeType": "ExpressionStatement", + "src": "15613:29:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 14318, + "name": "curationCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14297, + "src": "15672:11:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14317, + "name": "CurationCutSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15426, + "src": "15657:14:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 14319, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15657:27:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14320, + "nodeType": "EmitStatement", + "src": "15652:32:57" + } + ] + }, + "documentation": { + "id": 14295, + "nodeType": "StructuredDocumentation", + "src": "15395:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "7e89bac3", + "id": 14322, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 14301, + "kind": "modifierInvocation", + "modifierName": { + "id": 14300, + "name": "onlyOwner", + "nameLocations": ["15495:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5018, + "src": "15495:9:57" + }, + "nodeType": "ModifierInvocation", + "src": "15495:9:57" + } + ], + "name": "setCurationCut", + "nameLocation": "15441:14:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14299, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "15486:8:57" + }, + "parameters": { + "id": 14298, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14297, + "mutability": "mutable", + "name": "curationCut", + "nameLocation": "15464:11:57", + "nodeType": "VariableDeclaration", + "scope": 14322, + "src": "15456:19:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14296, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "15456:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "15455:21:57" + }, + "returnParameters": { + "id": 14302, + "nodeType": "ParameterList", + "parameters": [], + "src": "15505:0:57" + }, + "scope": 14879, + "src": "15432:259:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15588], + "body": { + "id": 14336, + "nodeType": "Block", + "src": "15836:50:57", + "statements": [ + { + "expression": { + "baseExpression": { + "id": 14332, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "15853:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 14334, + "indexExpression": { + "id": 14333, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14325, + "src": "15866:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "15853:26:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "functionReturnParameters": 14331, + "id": 14335, + "nodeType": "Return", + "src": "15846:33:57" + } + ] + }, + "documentation": { + "id": 14323, + "nodeType": "StructuredDocumentation", + "src": "15697:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "0e022923", + "id": 14337, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getAllocation", + "nameLocation": "15743:13:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14327, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "15793:8:57" + }, + "parameters": { + "id": 14326, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14325, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "15765:12:57", + "nodeType": "VariableDeclaration", + "scope": 14337, + "src": "15757:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14324, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15757:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "15756:22:57" + }, + "returnParameters": { + "id": 14331, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14330, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14337, + "src": "15811:23:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 14329, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14328, + "name": "Allocation.State", + "nameLocations": ["15811:10:57", "15822:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "15811:16:57" + }, + "referencedDeclaration": 15663, + "src": "15811:16:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "15810:25:57" + }, + "scope": 14879, + "src": "15734:152:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [552], + "body": { + "id": 14380, + "nodeType": "Block", + "src": "16073:300:57", + "statements": [ + { + "assignments": [14360], + "declarations": [ + { + "constant": false, + "id": 14360, + "mutability": "mutable", + "name": "allo", + "nameLocation": "16107:4:57", + "nodeType": "VariableDeclaration", + "scope": 14380, + "src": "16083:28:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 14359, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14358, + "name": "Allocation.State", + "nameLocations": ["16083:10:57", "16094:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "16083:16:57" + }, + "referencedDeclaration": 15663, + "src": "16083:16:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 14364, + "initialValue": { + "baseExpression": { + "id": 14361, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "16114:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 14363, + "indexExpression": { + "id": 14362, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14340, + "src": "16127:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "16114:26:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "16083:57:57" + }, + { + "expression": { + "components": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 14365, + "name": "allo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14360, + "src": "16171:4:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14366, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16176:6:57", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "16171:11:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 14367, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16171:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "expression": { + "id": 14368, + "name": "allo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14360, + "src": "16198:4:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14369, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16203:7:57", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "16198:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 14370, + "name": "allo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14360, + "src": "16224:4:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14371, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16229:20:57", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "16224:25:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 14372, + "name": "allo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14360, + "src": "16263:4:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14373, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16268:6:57", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "16263:11:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 14374, + "name": "allo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14360, + "src": "16288:4:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14375, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16293:27:57", + "memberName": "accRewardsPerAllocatedToken", + "nodeType": "MemberAccess", + "referencedDeclaration": 15658, + "src": "16288:32:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 14376, + "name": "allo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14360, + "src": "16334:4:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14377, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16339:17:57", + "memberName": "accRewardsPending", + "nodeType": "MemberAccess", + "referencedDeclaration": 15660, + "src": "16334:22:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 14378, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "16157:209:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$_t_uint256_$", + "typeString": "tuple(bool,address,bytes32,uint256,uint256,uint256)" + } + }, + "functionReturnParameters": 14355, + "id": 14379, + "nodeType": "Return", + "src": "16150:216:57" + } + ] + }, + "documentation": { + "id": 14338, + "nodeType": "StructuredDocumentation", + "src": "15892:30:57", + "text": "@inheritdoc IRewardsIssuer" + }, + "functionSelector": "55c85269", + "id": 14381, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getAllocationData", + "nameLocation": "15936:17:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14342, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "16004:8:57" + }, + "parameters": { + "id": 14341, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14340, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "15971:12:57", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "15963:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14339, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "15963:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "15953:36:57" + }, + "returnParameters": { + "id": 14355, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14344, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "16022:4:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 14343, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "16022:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14346, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "16028:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14345, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16028:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14348, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "16037:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14347, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "16037:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14350, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "16046:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14349, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16046:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14352, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "16055:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14351, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16055:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14354, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14381, + "src": "16064:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14353, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16064:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16021:51:57" + }, + "scope": 14879, + "src": "15927:446:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [560], + "body": { + "id": 14394, + "nodeType": "Block", + "src": "16521:70:57", + "statements": [ + { + "expression": { + "baseExpression": { + "id": 14390, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "16538:24:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 14392, + "indexExpression": { + "id": 14391, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14384, + "src": "16563:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "16538:46:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 14389, + "id": 14393, + "nodeType": "Return", + "src": "16531:53:57" + } + ] + }, + "documentation": { + "id": 14382, + "nodeType": "StructuredDocumentation", + "src": "16379:30:57", + "text": "@inheritdoc IRewardsIssuer" + }, + "functionSelector": "e2e1e8e9", + "id": 14395, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getSubgraphAllocatedTokens", + "nameLocation": "16423:26:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14386, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "16494:8:57" + }, + "parameters": { + "id": 14385, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14384, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "16458:20:57", + "nodeType": "VariableDeclaration", + "scope": 14395, + "src": "16450:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14383, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "16450:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "16449:30:57" + }, + "returnParameters": { + "id": 14389, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14388, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14395, + "src": "16512:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14387, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16512:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "16511:9:57" + }, + "scope": 14879, + "src": "16414:177:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15597], + "body": { + "id": 14409, + "nodeType": "Block", + "src": "16748:56:57", + "statements": [ + { + "expression": { + "baseExpression": { + "id": 14405, + "name": "_legacyAllocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17382, + "src": "16765:18:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 14407, + "indexExpression": { + "id": 14406, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14398, + "src": "16784:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "16765:32:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage", + "typeString": "struct LegacyAllocation.State storage ref" + } + }, + "functionReturnParameters": 14404, + "id": 14408, + "nodeType": "Return", + "src": "16758:39:57" + } + ] + }, + "documentation": { + "id": 14396, + "nodeType": "StructuredDocumentation", + "src": "16597:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "6d9a3951", + "id": 14410, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getLegacyAllocation", + "nameLocation": "16643:19:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14400, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "16699:8:57" + }, + "parameters": { + "id": 14399, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14398, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "16671:12:57", + "nodeType": "VariableDeclaration", + "scope": 14410, + "src": "16663:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14397, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16663:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "16662:22:57" + }, + "returnParameters": { + "id": 14404, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14403, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14410, + "src": "16717:29:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_memory_ptr", + "typeString": "struct LegacyAllocation.State" + }, + "typeName": { + "id": 14402, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14401, + "name": "LegacyAllocation.State", + "nameLocations": ["16717:16:57", "16734:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "16717:22:57" + }, + "referencedDeclaration": 16305, + "src": "16717:22:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "16716:31:57" + }, + "scope": 14879, + "src": "16634:170:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15621], + "body": { + "id": 14423, + "nodeType": "Block", + "src": "16917:50:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14419, + "name": "_disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17699, + "src": "16942:15:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IDisputeManager_$15373_$", + "typeString": "function () view returns (contract IDisputeManager)" + } + }, + "id": 14420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16942:17:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + ], + "id": 14418, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "16934:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14417, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16934:7:57", + "typeDescriptions": {} + } + }, + "id": 14421, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16934:26:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 14416, + "id": 14422, + "nodeType": "Return", + "src": "16927:33:57" + } + ] + }, + "documentation": { + "id": 14411, + "nodeType": "StructuredDocumentation", + "src": "16810:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "db9bee46", + "id": 14424, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getDisputeManager", + "nameLocation": "16856:17:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14413, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "16890:8:57" + }, + "parameters": { + "id": 14412, + "nodeType": "ParameterList", + "parameters": [], + "src": "16873:2:57" + }, + "returnParameters": { + "id": 14416, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14415, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14424, + "src": "16908:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14414, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16908:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "16907:9:57" + }, + "scope": 14879, + "src": "16847:120:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15627], + "body": { + "id": 14437, + "nodeType": "Block", + "src": "17085:55:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14433, + "name": "_graphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17709, + "src": "17110:20:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphTallyCollector_$2605_$", + "typeString": "function () view returns (contract IGraphTallyCollector)" + } + }, + "id": 14434, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17110:22:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + ], + "id": 14432, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17102:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14431, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17102:7:57", + "typeDescriptions": {} + } + }, + "id": 14435, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17102:31:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 14430, + "id": 14436, + "nodeType": "Return", + "src": "17095:38:57" + } + ] + }, + "documentation": { + "id": 14425, + "nodeType": "StructuredDocumentation", + "src": "16973:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "ebf6ddaf", + "id": 14438, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getGraphTallyCollector", + "nameLocation": "17019:22:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14427, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "17058:8:57" + }, + "parameters": { + "id": 14426, + "nodeType": "ParameterList", + "parameters": [], + "src": "17041:2:57" + }, + "returnParameters": { + "id": 14430, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14429, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14438, + "src": "17076:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14428, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17076:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "17075:9:57" + }, + "scope": 14879, + "src": "17010:130:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15633], + "body": { + "id": 14451, + "nodeType": "Block", + "src": "17247:44:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14447, + "name": "_curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17719, + "src": "17272:9:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ICuration_$165_$", + "typeString": "function () view returns (contract ICuration)" + } + }, + "id": 14448, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17272:11:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + ], + "id": 14446, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "17264:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14445, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17264:7:57", + "typeDescriptions": {} + } + }, + "id": 14449, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17264:20:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 14444, + "id": 14450, + "nodeType": "Return", + "src": "17257:27:57" + } + ] + }, + "documentation": { + "id": 14439, + "nodeType": "StructuredDocumentation", + "src": "17146:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "c0f47497", + "id": 14452, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getCuration", + "nameLocation": "17192:11:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14441, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "17220:8:57" + }, + "parameters": { + "id": 14440, + "nodeType": "ParameterList", + "parameters": [], + "src": "17203:2:57" + }, + "returnParameters": { + "id": 14444, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14443, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14452, + "src": "17238:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14442, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17238:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "17237:9:57" + }, + "scope": 14879, + "src": "17183:108:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15607], + "body": { + "id": 14468, + "nodeType": "Block", + "src": "17445:69:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14464, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14455, + "src": "17485:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14465, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14457, + "src": "17494:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14463, + "name": "_encodeAllocationProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17310, + "src": "17462:22:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bytes32_$", + "typeString": "function (address,address) view returns (bytes32)" + } + }, + "id": 14466, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17462:45:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 14462, + "id": 14467, + "nodeType": "Return", + "src": "17455:52:57" + } + ] + }, + "documentation": { + "id": 14453, + "nodeType": "StructuredDocumentation", + "src": "17297:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "ce56c98b", + "id": 14469, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "encodeAllocationProof", + "nameLocation": "17343:21:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14459, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "17418:8:57" + }, + "parameters": { + "id": 14458, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14455, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "17373:7:57", + "nodeType": "VariableDeclaration", + "scope": 14469, + "src": "17365:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14454, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17365:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14457, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "17390:12:57", + "nodeType": "VariableDeclaration", + "scope": 14469, + "src": "17382:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14456, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17382:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "17364:39:57" + }, + "returnParameters": { + "id": 14462, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14461, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14469, + "src": "17436:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14460, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "17436:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "17435:9:57" + }, + "scope": 14879, + "src": "17334:180:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [15615], + "body": { + "id": 14483, + "nodeType": "Block", + "src": "17637:67:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14479, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14472, + "src": "17671:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14480, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "17680:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 14478, + "name": "_isOverAllocated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17330, + "src": "17654:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint32_$returns$_t_bool_$", + "typeString": "function (address,uint32) view returns (bool)" + } + }, + "id": 14481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17654:43:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 14477, + "id": 14482, + "nodeType": "Return", + "src": "17647:50:57" + } + ] + }, + "documentation": { + "id": 14470, + "nodeType": "StructuredDocumentation", + "src": "17520:32:57", + "text": "@inheritdoc ISubgraphService" + }, + "functionSelector": "ba38f67d", + "id": 14484, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isOverAllocated", + "nameLocation": "17566:15:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14474, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "17613:8:57" + }, + "parameters": { + "id": 14473, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14472, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "17590:7:57", + "nodeType": "VariableDeclaration", + "scope": 14484, + "src": "17582:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14471, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17582:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "17581:17:57" + }, + "returnParameters": { + "id": 14477, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14476, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14484, + "src": "17631:4:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 14475, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "17631:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "17630:6:57" + }, + "scope": 14879, + "src": "17557:147:57", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [2317], + "body": { + "id": 14504, + "nodeType": "Block", + "src": "18254:123:57", + "statements": [ + { + "assignments": [14494], + "declarations": [ + { + "constant": false, + "id": 14494, + "mutability": "mutable", + "name": "disputePeriod", + "nameLocation": "18271:13:57", + "nodeType": "VariableDeclaration", + "scope": 14504, + "src": "18264:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 14493, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "18264:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "id": 14499, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14495, + "name": "_disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17699, + "src": "18287:15:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IDisputeManager_$15373_$", + "typeString": "function () view returns (contract IDisputeManager)" + } + }, + "id": 14496, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18287:17:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "id": 14497, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18305:16:57", + "memberName": "getDisputePeriod", + "nodeType": "MemberAccess", + "referencedDeclaration": 15326, + "src": "18287:34:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint64_$", + "typeString": "function () view external returns (uint64)" + } + }, + "id": 14498, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18287:36:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "18264:59:57" + }, + { + "expression": { + "components": [ + { + "id": 14500, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14494, + "src": "18341:13:57", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "id": 14501, + "name": "disputePeriod", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14494, + "src": "18356:13:57", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "id": 14502, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "18340:30:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint64_$_t_uint64_$", + "typeString": "tuple(uint64,uint64)" + } + }, + "functionReturnParameters": 14492, + "id": 14503, + "nodeType": "Return", + "src": "18333:37:57" + } + ] + }, + "documentation": { + "id": 14485, + "nodeType": "StructuredDocumentation", + "src": "17754:413:57", + "text": " @notice Getter for the accepted thawing period range for provisions\n The accepted range is just the dispute period defined by {DisputeManager-getDisputePeriod}\n @dev This override ensures {ProvisionManager} uses the thawing period from the {DisputeManager}\n @return The minimum thawing period - the dispute period\n @return The maximum thawing period - the dispute period" + }, + "id": 14505, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getThawingPeriodRange", + "nameLocation": "18181:22:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14487, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "18220:8:57" + }, + "parameters": { + "id": 14486, + "nodeType": "ParameterList", + "parameters": [], + "src": "18203:2:57" + }, + "returnParameters": { + "id": 14492, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14489, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14505, + "src": "18238:6:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 14488, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "18238:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14491, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14505, + "src": "18246:6:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 14490, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "18246:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "18237:16:57" + }, + "scope": 14879, + "src": "18172:205:57", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "baseFunctions": [2330], + "body": { + "id": 14521, + "nodeType": "Block", + "src": "18718:93:57", + "statements": [ + { + "expression": { + "components": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14514, + "name": "_disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17699, + "src": "18736:15:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IDisputeManager_$15373_$", + "typeString": "function () view returns (contract IDisputeManager)" + } + }, + "id": 14515, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18736:17:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "id": 14516, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18754:21:57", + "memberName": "getFishermanRewardCut", + "nodeType": "MemberAccess", + "referencedDeclaration": 15320, + "src": "18736:39:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint32_$", + "typeString": "function () view external returns (uint32)" + } + }, + "id": 14517, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18736:41:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "id": 14518, + "name": "DEFAULT_MAX_VERIFIER_CUT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1841, + "src": "18779:24:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "id": 14519, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "18735:69:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint32_$_t_uint32_$", + "typeString": "tuple(uint32,uint32)" + } + }, + "functionReturnParameters": 14513, + "id": 14520, + "nodeType": "Return", + "src": "18728:76:57" + } + ] + }, + "documentation": { + "id": 14506, + "nodeType": "StructuredDocumentation", + "src": "18383:250:57", + "text": " @notice Getter for the accepted verifier cut range for provisions\n @return The minimum verifier cut which is defined by the fisherman reward cut {DisputeManager-getFishermanRewardCut}\n @return The maximum is 100% in PPM" + }, + "id": 14522, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_getVerifierCutRange", + "nameLocation": "18647:20:57", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 14508, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "18684:8:57" + }, + "parameters": { + "id": 14507, + "nodeType": "ParameterList", + "parameters": [], + "src": "18667:2:57" + }, + "returnParameters": { + "id": 14513, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14510, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14522, + "src": "18702:6:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 14509, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "18702:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14512, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14522, + "src": "18710:6:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 14511, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "18710:6:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "18701:16:57" + }, + "scope": 14879, + "src": "18638:173:57", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 14758, + "nodeType": "Block", + "src": "20565:2975:57", + "statements": [ + { + "assignments": [14536, 14538], + "declarations": [ + { + "constant": false, + "id": 14536, + "mutability": "mutable", + "name": "signedRav", + "nameLocation": "20614:9:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "20576:47:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV" + }, + "typeName": { + "id": 14535, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14534, + "name": "IGraphTallyCollector.SignedRAV", + "nameLocations": ["20576:20:57", "20597:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2525, + "src": "20576:30:57" + }, + "referencedDeclaration": 2525, + "src": "20576:30:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_storage_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14538, + "mutability": "mutable", + "name": "tokensToCollect", + "nameLocation": "20633:15:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "20625:23:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14537, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20625:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14548, + "initialValue": { + "arguments": [ + { + "id": 14541, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14527, + "src": "20676:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "components": [ + { + "expression": { + "id": 14542, + "name": "IGraphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2605, + "src": "20695:20:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphTallyCollector_$2605_$", + "typeString": "type(contract IGraphTallyCollector)" + } + }, + "id": 14543, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20716:9:57", + "memberName": "SignedRAV", + "nodeType": "MemberAccess", + "referencedDeclaration": 2525, + "src": "20695:30:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_SignedRAV_$2525_storage_ptr_$", + "typeString": "type(struct IGraphTallyCollector.SignedRAV storage pointer)" + } + }, + { + "id": 14545, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "20727:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 14544, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20727:7:57", + "typeDescriptions": {} + } + } + ], + "id": 14546, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "20694:41:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_struct$_SignedRAV_$2525_storage_ptr_$_$_t_type$_t_uint256_$_$", + "typeString": "tuple(type(struct IGraphTallyCollector.SignedRAV storage pointer),type(uint256))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_struct$_SignedRAV_$2525_storage_ptr_$_$_t_type$_t_uint256_$_$", + "typeString": "tuple(type(struct IGraphTallyCollector.SignedRAV storage pointer),type(uint256))" + } + ], + "expression": { + "id": 14539, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "20652:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 14540, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "20656:6:57", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "20652:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 14547, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20652:93:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_struct$_SignedRAV_$2525_memory_ptr_$_t_uint256_$", + "typeString": "tuple(struct IGraphTallyCollector.SignedRAV memory,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "20575:170:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 14554, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "expression": { + "id": 14550, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "20776:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14551, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20786:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "20776:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14552, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20790:15:57", + "memberName": "serviceProvider", + "nodeType": "MemberAccess", + "referencedDeclaration": 2509, + "src": "20776:29:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 14553, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "20809:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "20776:40:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "expression": { + "id": 14556, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "20861:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14557, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20871:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "20861:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14558, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20875:15:57", + "memberName": "serviceProvider", + "nodeType": "MemberAccess", + "referencedDeclaration": 2509, + "src": "20861:29:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14559, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "20892:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14555, + "name": "SubgraphServiceIndexerMismatch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15465, + "src": "20830:30:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 14560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20830:70:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14549, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "20755:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20755:155:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14562, + "nodeType": "ExpressionStatement", + "src": "20755:155:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14575, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "expression": { + "expression": { + "id": 14566, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "21122:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14567, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21132:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "21122:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14568, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21136:12:57", + "memberName": "collectionId", + "nodeType": "MemberAccess", + "referencedDeclaration": 2505, + "src": "21122:26:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 14565, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21114:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 14564, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21114:7:57", + "typeDescriptions": {} + } + }, + "id": 14569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21114:35:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 14572, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21158:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 14571, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "21158:7:57", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + } + ], + "id": 14570, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "21153:4:57", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 14573, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21153:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint160", + "typeString": "type(uint160)" + } + }, + "id": 14574, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "21167:3:57", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "21153:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + }, + "src": "21114:56:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "expression": { + "id": 14577, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "21219:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14578, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21229:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "21219:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14579, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21233:12:57", + "memberName": "collectionId", + "nodeType": "MemberAccess", + "referencedDeclaration": 2505, + "src": "21219:26:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 14576, + "name": "SubgraphServiceInvalidCollectionId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15497, + "src": "21184:34:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$returns$_t_error_$", + "typeString": "function (bytes32) pure returns (error)" + } + }, + "id": 14580, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21184:62:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14563, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "21093:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14581, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21093:163:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14582, + "nodeType": "ExpressionStatement", + "src": "21093:163:57" + }, + { + "assignments": [14584], + "declarations": [ + { + "constant": false, + "id": 14584, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "21274:12:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "21266:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14583, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21266:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 14597, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "expression": { + "expression": { + "id": 14591, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "21313:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14592, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21323:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "21313:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14593, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21327:12:57", + "memberName": "collectionId", + "nodeType": "MemberAccess", + "referencedDeclaration": 2505, + "src": "21313:26:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 14590, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21305:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 14589, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21305:7:57", + "typeDescriptions": {} + } + }, + "id": 14594, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21305:35:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14588, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21297:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 14587, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "21297:7:57", + "typeDescriptions": {} + } + }, + "id": 14595, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21297:44:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + ], + "id": 14586, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21289:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14585, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21289:7:57", + "typeDescriptions": {} + } + }, + "id": 14596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21289:53:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21266:76:57" + }, + { + "assignments": [14602], + "declarations": [ + { + "constant": false, + "id": 14602, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "21376:10:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "21352:34:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 14601, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14600, + "name": "Allocation.State", + "nameLocations": ["21352:10:57", "21363:5:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "21352:16:57" + }, + "referencedDeclaration": 15663, + "src": "21352:16:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 14607, + "initialValue": { + "arguments": [ + { + "id": 14605, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14584, + "src": "21406:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 14603, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "21389:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 14604, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21402:3:57", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "21389:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 14606, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21389:30:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21352:67:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 14612, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 14609, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14602, + "src": "21523:10:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14610, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21534:7:57", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "21523:18:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 14611, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "21545:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "21523:29:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14614, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "21580:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 14615, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14602, + "src": "21589:10:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14616, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21600:7:57", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "21589:18:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14613, + "name": "SubgraphServiceInvalidRAV", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15479, + "src": "21554:25:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 14617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21554:54:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14608, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "21515:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14618, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21515:94:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14619, + "nodeType": "ExpressionStatement", + "src": "21515:94:57" + }, + { + "assignments": [14621], + "declarations": [ + { + "constant": false, + "id": 14621, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "21627:20:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "21619:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14620, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "21619:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 14624, + "initialValue": { + "expression": { + "id": 14622, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14602, + "src": "21650:10:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14623, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21661:20:57", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "21650:31:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21619:62:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14626, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "21746:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "30", + "id": 14627, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "21755:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 14625, + "name": "_releaseStake", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1121, + "src": "21732:13:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 14628, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21732:25:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14629, + "nodeType": "ExpressionStatement", + "src": "21732:25:57" + }, + { + "assignments": [14631], + "declarations": [ + { + "constant": false, + "id": 14631, + "mutability": "mutable", + "name": "tokensCollected", + "nameLocation": "21871:15:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "21863:23:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14630, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21863:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14632, + "nodeType": "VariableDeclarationStatement", + "src": "21863:23:57" + }, + { + "assignments": [14634], + "declarations": [ + { + "constant": false, + "id": 14634, + "mutability": "mutable", + "name": "tokensCurators", + "nameLocation": "21904:14:57", + "nodeType": "VariableDeclaration", + "scope": 14758, + "src": "21896:22:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14633, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21896:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14635, + "nodeType": "VariableDeclarationStatement", + "src": "21896:22:57" + }, + { + "id": 14696, + "nodeType": "Block", + "src": "21928:623:57", + "statements": [ + { + "assignments": [14637], + "declarations": [ + { + "constant": false, + "id": 14637, + "mutability": "mutable", + "name": "balanceBefore", + "nameLocation": "21950:13:57", + "nodeType": "VariableDeclaration", + "scope": 14696, + "src": "21942:21:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14636, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "21942:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14646, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 14643, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "21998:4:57", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SubgraphService_$14879", + "typeString": "contract SubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SubgraphService_$14879", + "typeString": "contract SubgraphService" + } + ], + "id": 14642, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "21990:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14641, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21990:7:57", + "typeDescriptions": {} + } + }, + "id": 14644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21990:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14638, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "21966:11:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 14639, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21966:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 14640, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21980:9:57", + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 6104, + "src": "21966:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 14645, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21966:38:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21942:62:57" + }, + { + "expression": { + "id": 14667, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14647, + "name": "tokensCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14631, + "src": "22019:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "expression": { + "id": 14651, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "22085:14:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphPayments_$2489_$", + "typeString": "type(contract IGraphPayments)" + } + }, + "id": 14652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22100:12:57", + "memberName": "PaymentTypes", + "nodeType": "MemberAccess", + "referencedDeclaration": 2433, + "src": "22085:27:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_PaymentTypes_$2433_$", + "typeString": "type(enum IGraphPayments.PaymentTypes)" + } + }, + "id": 14653, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "22113:8:57", + "memberName": "QueryFee", + "nodeType": "MemberAccess", + "referencedDeclaration": 2430, + "src": "22085:36:57", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + { + "arguments": [ + { + "id": 14655, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "22161:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + { + "condition": { + "arguments": [ + { + "id": 14659, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14621, + "src": "22194:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14656, + "name": "_curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17719, + "src": "22172:9:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ICuration_$165_$", + "typeString": "function () view returns (contract ICuration)" + } + }, + "id": 14657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22172:11:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "id": 14658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22184:9:57", + "memberName": "isCurated", + "nodeType": "MemberAccess", + "referencedDeclaration": 110, + "src": "22172:21:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32) view external returns (bool)" + } + }, + "id": 14660, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22172:43:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "30", + "id": 14662, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22236:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 14663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "22172:65:57", + "trueExpression": { + "id": 14661, + "name": "curationFeesCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14896, + "src": "22218:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14654, + "name": "_encodeGraphTallyData", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14878, + "src": "22139:21:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_SignedRAV_$2525_memory_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (struct IGraphTallyCollector.SignedRAV memory,uint256) view returns (bytes memory)" + } + }, + "id": 14664, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22139:99:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 14665, + "name": "tokensToCollect", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14538, + "src": "22256:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14648, + "name": "_graphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17709, + "src": "22037:20:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphTallyCollector_$2605_$", + "typeString": "function () view returns (contract IGraphTallyCollector)" + } + }, + "id": 14649, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22037:22:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "id": 14650, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22060:7:57", + "memberName": "collect", + "nodeType": "MemberAccess", + "referencedDeclaration": 2586, + "src": "22037:30:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_enum$_PaymentTypes_$2433_$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (enum IGraphPayments.PaymentTypes,bytes memory,uint256) external returns (uint256)" + } + }, + "id": 14666, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22037:248:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22019:266:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14668, + "nodeType": "ExpressionStatement", + "src": "22019:266:57" + }, + { + "assignments": [14670], + "declarations": [ + { + "constant": false, + "id": 14670, + "mutability": "mutable", + "name": "balanceAfter", + "nameLocation": "22308:12:57", + "nodeType": "VariableDeclaration", + "scope": 14696, + "src": "22300:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14669, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "22300:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 14679, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 14676, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "22355:4:57", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SubgraphService_$14879", + "typeString": "contract SubgraphService" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SubgraphService_$14879", + "typeString": "contract SubgraphService" + } + ], + "id": 14675, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "22347:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14674, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "22347:7:57", + "typeDescriptions": {} + } + }, + "id": 14677, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22347:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14671, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "22323:11:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 14672, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22323:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 14673, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22337:9:57", + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 6104, + "src": "22323:23:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 14678, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22323:38:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "22300:61:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14683, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14681, + "name": "balanceAfter", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14670, + "src": "22383:12:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 14682, + "name": "balanceBefore", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14637, + "src": "22399:13:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22383:29:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14685, + "name": "balanceBefore", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14637, + "src": "22452:13:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 14686, + "name": "balanceAfter", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14670, + "src": "22467:12:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14684, + "name": "SubgraphServiceInconsistentCollection", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15458, + "src": "22414:37:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 14687, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22414:66:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14680, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "22375:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14688, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22375:106:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14689, + "nodeType": "ExpressionStatement", + "src": "22375:106:57" + }, + { + "expression": { + "id": 14694, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14690, + "name": "tokensCurators", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14634, + "src": "22495:14:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14693, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14691, + "name": "balanceAfter", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14670, + "src": "22512:12:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 14692, + "name": "balanceBefore", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14637, + "src": "22527:13:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22512:28:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22495:45:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14695, + "nodeType": "ExpressionStatement", + "src": "22495:45:57" + } + ] + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14699, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14697, + "name": "tokensCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14631, + "src": "22565:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 14698, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22583:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "22565:19:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 14744, + "nodeType": "IfStatement", + "src": "22561:726:57", + "trueBody": { + "id": 14743, + "nodeType": "Block", + "src": "22586:701:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14701, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "22684:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14704, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14702, + "name": "tokensCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14631, + "src": "22709:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "id": 14703, + "name": "stakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14893, + "src": "22727:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "22709:34:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 14705, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "22761:5:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 14706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22767:9:57", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "22761:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14707, + "name": "_disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17699, + "src": "22779:15:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IDisputeManager_$15373_$", + "typeString": "function () view returns (contract IDisputeManager)" + } + }, + "id": 14708, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22779:17:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "id": 14709, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "22797:16:57", + "memberName": "getDisputePeriod", + "nodeType": "MemberAccess", + "referencedDeclaration": 15326, + "src": "22779:34:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint64_$", + "typeString": "function () view external returns (uint64)" + } + }, + "id": 14710, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22779:36:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "22761:54:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14700, + "name": "_lockStake", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1074, + "src": "22656:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256,uint256)" + } + }, + "id": 14712, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22656:173:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14713, + "nodeType": "ExpressionStatement", + "src": "22656:173:57" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14716, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14714, + "name": "tokensCurators", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14634, + "src": "22848:14:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 14715, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "22865:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "22848:18:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 14742, + "nodeType": "IfStatement", + "src": "22844:433:57", + "trueBody": { + "id": 14741, + "nodeType": "Block", + "src": "22868:409:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14720, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14621, + "src": "23023:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14717, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "22977:20:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 14718, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22977:22:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 14719, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "23000:22:57", + "memberName": "onSubgraphSignalUpdate", + "nodeType": "MemberAccess", + "referencedDeclaration": 670, + "src": "22977:45:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$returns$_t_uint256_$", + "typeString": "function (bytes32) external returns (uint256)" + } + }, + "id": 14721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "22977:67:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14722, + "nodeType": "ExpressionStatement", + "src": "22977:67:57" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14728, + "name": "_curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17719, + "src": "23158:9:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ICuration_$165_$", + "typeString": "function () view returns (contract ICuration)" + } + }, + "id": 14729, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23158:11:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + ], + "id": 14727, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "23150:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14726, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "23150:7:57", + "typeDescriptions": {} + } + }, + "id": 14730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23150:20:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14731, + "name": "tokensCurators", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14634, + "src": "23172:14:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14723, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "23125:11:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 14724, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23125:13:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 14725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "23139:10:57", + "memberName": "pushTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 818, + "src": "23125:24:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 14732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23125:62:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14733, + "nodeType": "ExpressionStatement", + "src": "23125:62:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14737, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14621, + "src": "23225:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 14738, + "name": "tokensCurators", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14634, + "src": "23247:14:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14734, + "name": "_curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17719, + "src": "23205:9:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_ICuration_$165_$", + "typeString": "function () view returns (contract ICuration)" + } + }, + "id": 14735, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23205:11:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "id": 14736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "23217:7:57", + "memberName": "collect", + "nodeType": "MemberAccess", + "referencedDeclaration": 102, + "src": "23205:19:57", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,uint256) external" + } + }, + "id": 14739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23205:57:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14740, + "nodeType": "ExpressionStatement", + "src": "23205:57:57" + } + ] + } + } + ] + } + }, + { + "eventCall": { + "arguments": [ + { + "id": 14746, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14525, + "src": "23334:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "expression": { + "id": 14747, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14536, + "src": "23355:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14748, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "23365:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "23355:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14749, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "23369:5:57", + "memberName": "payer", + "nodeType": "MemberAccess", + "referencedDeclaration": 2507, + "src": "23355:19:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14750, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14584, + "src": "23388:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14751, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14621, + "src": "23414:20:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 14752, + "name": "tokensCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14631, + "src": "23448:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 14753, + "name": "tokensCurators", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14634, + "src": "23477:14:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14745, + "name": "QueryFeesCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15409, + "src": "23302:18:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,address,bytes32,uint256,uint256)" + } + }, + "id": 14754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "23302:199:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14755, + "nodeType": "EmitStatement", + "src": "23297:204:57" + }, + { + "expression": { + "id": 14756, + "name": "tokensCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14631, + "src": "23518:15:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 14531, + "id": 14757, + "nodeType": "Return", + "src": "23511:22:57" + } + ] + }, + "documentation": { + "id": 14523, + "nodeType": "StructuredDocumentation", + "src": "18817:1652:57", + "text": " @notice Collect query fees\n Stake equal to the amount being collected times the `stakeToFeesRatio` is locked into a stake claim.\n This claim can be released at a later stage once expired.\n It's important to note that before collecting this function will attempt to release any expired stake claims.\n This could lead to an out of gas error if there are too many expired claims. In that case, the indexer will need to\n manually release the claims, see {IDataServiceFees-releaseStake}, before attempting to collect again.\n @dev This function is the equivalent of the legacy `collect` function for query fees.\n @dev Uses the {GraphTallyCollector} to collect payment from Graph Horizon payments protocol.\n Fees are distributed to service provider and delegators by {GraphPayments}, though curators\n share is distributed by this function.\n Query fees can be collected on closed allocations.\n Requirements:\n - Indexer must have enough available tokens to lock as economic security for fees\n Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\n Emits a {StakeClaimLocked} event.\n Emits a {QueryFeesCollected} event.\n @param indexer The address of the indexer\n @param data Encoded data:\n - IGraphTallyCollector.SignedRAV `signedRav`: The signed RAV\n - uint256 `tokensToCollect`: The amount of tokens to collect. Allows partially collecting a RAV. If 0, the entire RAV will\n be collected.\n @return The amount of fees collected" + }, + "id": 14759, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_collectQueryFees", + "nameLocation": "20483:17:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14528, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14525, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "20509:7:57", + "nodeType": "VariableDeclaration", + "scope": 14759, + "src": "20501:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14524, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "20501:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14527, + "mutability": "mutable", + "name": "data", + "nameLocation": "20533:4:57", + "nodeType": "VariableDeclaration", + "scope": 14759, + "src": "20518:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 14526, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "20518:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "20500:38:57" + }, + "returnParameters": { + "id": 14531, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14530, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14759, + "src": "20556:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14529, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20556:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "20555:9:57" + }, + "scope": 14879, + "src": "20474:3066:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 14811, + "nodeType": "Block", + "src": "24074:401:57", + "statements": [ + { + "assignments": [14770, 14772, 14774], + "declarations": [ + { + "constant": false, + "id": 14770, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "24093:12:57", + "nodeType": "VariableDeclaration", + "scope": 14811, + "src": "24085:20:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14769, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "24085:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14772, + "mutability": "mutable", + "name": "poi_", + "nameLocation": "24115:4:57", + "nodeType": "VariableDeclaration", + "scope": 14811, + "src": "24107:12:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14771, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "24107:7:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14774, + "mutability": "mutable", + "name": "poiMetadata_", + "nameLocation": "24134:12:57", + "nodeType": "VariableDeclaration", + "scope": 14811, + "src": "24121:25:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 14773, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "24121:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "id": 14786, + "initialValue": { + "arguments": [ + { + "id": 14777, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14764, + "src": "24161:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "components": [ + { + "id": 14779, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "24168:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 14778, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "24168:7:57", + "typeDescriptions": {} + } + }, + { + "id": 14781, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "24177:7:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 14780, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "24177:7:57", + "typeDescriptions": {} + } + }, + { + "id": 14783, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "24186:5:57", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", + "typeString": "type(bytes storage pointer)" + }, + "typeName": { + "id": 14782, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "24186:5:57", + "typeDescriptions": {} + } + } + ], + "id": 14784, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "24167:25:57", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_bytes32_$_$_t_type$_t_bytes_storage_ptr_$_$", + "typeString": "tuple(type(address),type(bytes32),type(bytes storage pointer))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_bytes32_$_$_t_type$_t_bytes_storage_ptr_$_$", + "typeString": "tuple(type(address),type(bytes32),type(bytes storage pointer))" + } + ], + "expression": { + "id": 14775, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "24150:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 14776, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "24154:6:57", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "24150:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 14785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24150:43:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_address_payable_$_t_bytes32_$_t_bytes_memory_ptr_$", + "typeString": "tuple(address payable,bytes32,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "24084:109:57" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 14794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "arguments": [ + { + "id": 14790, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14770, + "src": "24241:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 14788, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "24224:12:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 14789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "24237:3:57", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "24224:16:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 14791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24224:30:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 14792, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "24255:7:57", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "24224:38:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 14793, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14762, + "src": "24266:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "24224:49:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 14796, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14762, + "src": "24326:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14797, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14770, + "src": "24335:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14795, + "name": "SubgraphServiceAllocationNotAuthorized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15472, + "src": "24287:38:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 14798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24287:61:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14787, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "24203:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24203:155:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14800, + "nodeType": "ExpressionStatement", + "src": "24203:155:57" + }, + { + "expression": { + "arguments": [ + { + "id": 14802, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14770, + "src": "24387:12:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14803, + "name": "poi_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14772, + "src": "24401:4:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 14804, + "name": "poiMetadata_", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14774, + "src": "24407:12:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 14805, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "24421:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + { + "baseExpression": { + "id": 14806, + "name": "paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14901, + "src": "24439:19:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_address_$", + "typeString": "mapping(address => address)" + } + }, + "id": 14808, + "indexExpression": { + "id": 14807, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14762, + "src": "24459:7:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "24439:28:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14801, + "name": "_presentPOI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17044, + "src": "24375:11:57", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes32_$_t_bytes_memory_ptr_$_t_uint32_$_t_address_$returns$_t_uint256_$", + "typeString": "function (address,bytes32,bytes memory,uint32,address) returns (uint256)" + } + }, + "id": 14809, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24375:93:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 14768, + "id": 14810, + "nodeType": "Return", + "src": "24368:100:57" + } + ] + }, + "documentation": { + "id": 14760, + "nodeType": "StructuredDocumentation", + "src": "23546:426:57", + "text": " @notice Collect indexing rewards\n @param indexer The address of the indexer\n @param data Encoded data:\n - address `allocationId`: The id of the allocation\n - bytes32 `poi`: The POI being presented\n - bytes `poiMetadata`: The metadata associated with the POI. See {AllocationManager-_presentPOI} for more details.\n @return The amount of indexing rewards collected" + }, + "id": 14812, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_collectIndexingRewards", + "nameLocation": "23986:23:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14765, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14762, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "24018:7:57", + "nodeType": "VariableDeclaration", + "scope": 14812, + "src": "24010:15:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14761, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "24010:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14764, + "mutability": "mutable", + "name": "data", + "nameLocation": "24042:4:57", + "nodeType": "VariableDeclaration", + "scope": 14812, + "src": "24027:19:57", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 14763, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "24027:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "24009:38:57" + }, + "returnParameters": { + "id": 14768, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14767, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14812, + "src": "24065:7:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14766, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "24065:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "24064:9:57" + }, + "scope": 14879, + "src": "23977:498:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 14831, + "nodeType": "Block", + "src": "24845:138:57", + "statements": [ + { + "expression": { + "id": 14824, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 14820, + "name": "paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14901, + "src": "24855:19:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_address_$", + "typeString": "mapping(address => address)" + } + }, + "id": 14822, + "indexExpression": { + "id": 14821, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14815, + "src": "24875:8:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "24855:29:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 14823, + "name": "_paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14817, + "src": "24887:20:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "24855:52:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 14825, + "nodeType": "ExpressionStatement", + "src": "24855:52:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 14827, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14815, + "src": "24945:8:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 14828, + "name": "_paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14817, + "src": "24955:20:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 14826, + "name": "PaymentsDestinationSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15416, + "src": "24922:22:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address)" + } + }, + "id": 14829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "24922:54:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14830, + "nodeType": "EmitStatement", + "src": "24917:59:57" + } + ] + }, + "documentation": { + "id": 14813, + "nodeType": "StructuredDocumentation", + "src": "24481:269:57", + "text": " @notice Sets the payments destination for an indexer to receive payments\n @dev Emits a {PaymentsDestinationSet} event\n @param _indexer The address of the indexer\n @param _paymentsDestination The address where payments should be sent" + }, + "id": 14832, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setPaymentsDestination", + "nameLocation": "24764:23:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14818, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14815, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "24796:8:57", + "nodeType": "VariableDeclaration", + "scope": 14832, + "src": "24788:16:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14814, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "24788:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14817, + "mutability": "mutable", + "name": "_paymentsDestination", + "nameLocation": "24814:20:57", + "nodeType": "VariableDeclaration", + "scope": 14832, + "src": "24806:28:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14816, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "24806:7:57", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "24787:48:57" + }, + "returnParameters": { + "id": 14819, + "nodeType": "ParameterList", + "parameters": [], + "src": "24845:0:57" + }, + "scope": 14879, + "src": "24755:228:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 14854, + "nodeType": "Block", + "src": "25170:193:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 14841, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 14839, + "name": "_stakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14835, + "src": "25188:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 14840, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "25209:1:57", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "25188:22:57", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 14842, + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15492, + "src": "25212:42:57", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 14843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25212:44:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 14838, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "25180:7:57", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 14844, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25180:77:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14845, + "nodeType": "ExpressionStatement", + "src": "25180:77:57" + }, + { + "expression": { + "id": 14848, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14846, + "name": "stakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14893, + "src": "25267:16:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 14847, + "name": "_stakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14835, + "src": "25286:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "25267:36:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 14849, + "nodeType": "ExpressionStatement", + "src": "25267:36:57" + }, + { + "eventCall": { + "arguments": [ + { + "id": 14851, + "name": "_stakeToFeesRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14835, + "src": "25338:17:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 14850, + "name": "StakeToFeesRatioSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15421, + "src": "25318:19:57", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 14852, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25318:38:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 14853, + "nodeType": "EmitStatement", + "src": "25313:43:57" + } + ] + }, + "documentation": { + "id": 14833, + "nodeType": "StructuredDocumentation", + "src": "24989:111:57", + "text": " @notice Set the stake to fees ratio.\n @param _stakeToFeesRatio The stake to fees ratio" + }, + "id": 14855, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setStakeToFeesRatio", + "nameLocation": "25114:20:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14836, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14835, + "mutability": "mutable", + "name": "_stakeToFeesRatio", + "nameLocation": "25143:17:57", + "nodeType": "VariableDeclaration", + "scope": 14855, + "src": "25135:25:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14834, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "25135:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "25134:27:57" + }, + "returnParameters": { + "id": 14837, + "nodeType": "ParameterList", + "parameters": [], + "src": "25170:0:57" + }, + "scope": 14879, + "src": "25105:258:57", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 14877, + "nodeType": "Block", + "src": "25798:110:57", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 14868, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14859, + "src": "25826:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + { + "id": 14869, + "name": "curationCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14861, + "src": "25837:11:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "baseExpression": { + "id": 14870, + "name": "paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14901, + "src": "25850:19:57", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_address_$", + "typeString": "mapping(address => address)" + } + }, + "id": 14874, + "indexExpression": { + "expression": { + "expression": { + "id": 14871, + "name": "signedRav", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 14859, + "src": "25870:9:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + } + }, + "id": 14872, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "25880:3:57", + "memberName": "rav", + "nodeType": "MemberAccess", + "referencedDeclaration": 2522, + "src": "25870:13:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_ReceiptAggregateVoucher_$2518_memory_ptr", + "typeString": "struct IGraphTallyCollector.ReceiptAggregateVoucher memory" + } + }, + "id": 14873, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "25884:15:57", + "memberName": "serviceProvider", + "nodeType": "MemberAccess", + "referencedDeclaration": 2509, + "src": "25870:29:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "25850:50:57", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 14866, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "25815:3:57", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 14867, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "25819:6:57", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "25815:10:57", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 14875, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "25815:86:57", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "functionReturnParameters": 14865, + "id": 14876, + "nodeType": "Return", + "src": "25808:93:57" + } + ] + }, + "documentation": { + "id": 14856, + "nodeType": "StructuredDocumentation", + "src": "25369:265:57", + "text": " @notice Encodes the data for the GraphTallyCollector\n @dev The purpose of this function is just to avoid stack too deep errors\n @param signedRav The signed RAV\n @param curationCut The curation cut\n @return The encoded data" + }, + "id": 14878, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_encodeGraphTallyData", + "nameLocation": "25648:21:57", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14862, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14859, + "mutability": "mutable", + "name": "signedRav", + "nameLocation": "25717:9:57", + "nodeType": "VariableDeclaration", + "scope": 14878, + "src": "25679:47:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_memory_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV" + }, + "typeName": { + "id": 14858, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14857, + "name": "IGraphTallyCollector.SignedRAV", + "nameLocations": ["25679:20:57", "25700:9:57"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2525, + "src": "25679:30:57" + }, + "referencedDeclaration": 2525, + "src": "25679:30:57", + "typeDescriptions": { + "typeIdentifier": "t_struct$_SignedRAV_$2525_storage_ptr", + "typeString": "struct IGraphTallyCollector.SignedRAV" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14861, + "mutability": "mutable", + "name": "curationCut", + "nameLocation": "25744:11:57", + "nodeType": "VariableDeclaration", + "scope": 14878, + "src": "25736:19:57", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14860, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "25736:7:57", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "25669:92:57" + }, + "returnParameters": { + "id": 14865, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14864, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 14878, + "src": "25784:12:57", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 14863, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "25784:5:57", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "25783:14:57" + }, + "scope": 14879, + "src": "25639:269:57", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 14880, + "src": "1972:23938:57", + "usedErrors": [ + 1610, 1613, 1639, 1646, 1667, 1918, 1925, 1932, 1937, 4104, 4107, 4110, 4113, 4464, 4655, 4959, 4964, + 5140, 5143, 5579, 5582, 6157, 6420, 7894, 7899, 7904, 15431, 15434, 15437, 15440, 15445, 15451, 15458, + 15465, 15472, 15479, 15484, 15489, 15492, 15497, 15668, 15673, 15680, 16310, 16615, 16618, 16623, 16630, + 17612 + ], + "usedEvents": [ + 1437, 1442, 1449, 1456, 1466, 1473, 1585, 1596, 1605, 1634, 1888, 1893, 1900, 1907, 4650, 4970, 5148, + 5571, 5576, 6049, 15409, 15416, 15421, 15426, 16547, 16568, 16581, 16594, 16603, 16608, 17605 + ] + } + ], + "src": "45:25866:57" + }, + "id": 57 + }, + "contracts/SubgraphServiceStorage.sol": { + "ast": { + "absolutePath": "contracts/SubgraphServiceStorage.sol", + "exportedSymbols": { + "ISubgraphService": [15634], + "SubgraphServiceV1Storage": [14902] + }, + "id": 14903, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 14881, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:58" + }, + { + "absolutePath": "contracts/interfaces/ISubgraphService.sol", + "file": "./interfaces/ISubgraphService.sol", + "id": 14883, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 14903, + "sourceUnit": 15635, + "src": "70:69:58", + "symbolAliases": [ + { + "foreign": { + "id": 14882, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "79:16:58", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "SubgraphServiceV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 14884, + "nodeType": "StructuredDocumentation", + "src": "141:272:58", + "text": " @title SubgraphServiceStorage\n @notice This contract holds all the storage variables for the Subgraph Service contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 14902, + "linearizedBaseContracts": [14902], + "name": "SubgraphServiceV1Storage", + "nameLocation": "432:24:58", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 14885, + "nodeType": "StructuredDocumentation", + "src": "463:60:58", + "text": "@notice Service providers registered in the data service" + }, + "functionSelector": "4f793cdc", + "id": 14890, + "mutability": "mutable", + "name": "indexers", + "nameLocation": "596:8:58", + "nodeType": "VariableDeclaration", + "scope": 14902, + "src": "528:76:58", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Indexer_$15394_storage_$", + "typeString": "mapping(address => struct ISubgraphService.Indexer)" + }, + "typeName": { + "id": 14889, + "keyName": "indexer", + "keyNameLocation": "544:7:58", + "keyType": { + "id": 14886, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "536:7:58", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "528:60:58", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Indexer_$15394_storage_$", + "typeString": "mapping(address => struct ISubgraphService.Indexer)" + }, + "valueName": "details", + "valueNameLocation": "580:7:58", + "valueType": { + "id": 14888, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14887, + "name": "ISubgraphService.Indexer", + "nameLocations": ["555:16:58", "572:7:58"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15394, + "src": "555:24:58" + }, + "referencedDeclaration": 15394, + "src": "555:24:58", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Indexer_$15394_storage_ptr", + "typeString": "struct ISubgraphService.Indexer" + } + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 14891, + "nodeType": "StructuredDocumentation", + "src": "611:67:58", + "text": "@notice Multiplier for how many tokens back collected query fees" + }, + "functionSelector": "d07a7a84", + "id": 14893, + "mutability": "mutable", + "name": "stakeToFeesRatio", + "nameLocation": "698:16:58", + "nodeType": "VariableDeclaration", + "scope": 14902, + "src": "683:31:58", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14892, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "683:7:58", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 14894, + "nodeType": "StructuredDocumentation", + "src": "721:66:58", + "text": "@notice The cut curators take from query fee payments. In PPM." + }, + "functionSelector": "138dea08", + "id": 14896, + "mutability": "mutable", + "name": "curationFeesCut", + "nameLocation": "807:15:58", + "nodeType": "VariableDeclaration", + "scope": 14902, + "src": "792:30:58", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14895, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "792:7:58", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 14897, + "nodeType": "StructuredDocumentation", + "src": "829:43:58", + "text": "@notice Destination of indexer payments" + }, + "functionSelector": "07e736d8", + "id": 14901, + "mutability": "mutable", + "name": "paymentsDestination", + "nameLocation": "932:19:58", + "nodeType": "VariableDeclaration", + "scope": 14902, + "src": "877:74:58", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_address_$", + "typeString": "mapping(address => address)" + }, + "typeName": { + "id": 14900, + "keyName": "indexer", + "keyNameLocation": "893:7:58", + "keyType": { + "id": 14898, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "885:7:58", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "877:47:58", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_address_$", + "typeString": "mapping(address => address)" + }, + "valueName": "destination", + "valueNameLocation": "912:11:58", + "valueType": { + "id": 14899, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "904:7:58", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + }, + "visibility": "public" + } + ], + "scope": 14903, + "src": "414:540:58", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:910:58" + }, + "id": 58 + }, + "contracts/interfaces/IDisputeManager.sol": { + "ast": { + "absolutePath": "contracts/interfaces/IDisputeManager.sol", + "exportedSymbols": { + "Attestation": [16290], + "IDisputeManager": [15373] + }, + "id": 15374, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 14904, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "46:23:59" + }, + { + "absolutePath": "contracts/libraries/Attestation.sol", + "file": "../libraries/Attestation.sol", + "id": 14906, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 15374, + "sourceUnit": 16291, + "src": "71:59:59", + "symbolAliases": [ + { + "foreign": { + "id": 14905, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "80:11:59", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IDisputeManager", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 14907, + "nodeType": "StructuredDocumentation", + "src": "132:230:59", + "text": " @title IDisputeManager\n @notice Interface for the {Dispute Manager} contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 15373, + "linearizedBaseContracts": [15373], + "name": "IDisputeManager", + "nameLocation": "373:15:59", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "IDisputeManager.DisputeType", + "documentation": { + "id": 14908, + "nodeType": "StructuredDocumentation", + "src": "395:49:59", + "text": "@notice Types of disputes that can be created" + }, + "id": 14913, + "members": [ + { + "id": 14909, + "name": "Null", + "nameLocation": "476:4:59", + "nodeType": "EnumValue", + "src": "476:4:59" + }, + { + "id": 14910, + "name": "IndexingDispute", + "nameLocation": "490:15:59", + "nodeType": "EnumValue", + "src": "490:15:59" + }, + { + "id": 14911, + "name": "QueryDispute", + "nameLocation": "515:12:59", + "nodeType": "EnumValue", + "src": "515:12:59" + }, + { + "id": 14912, + "name": "LegacyDispute", + "nameLocation": "537:13:59", + "nodeType": "EnumValue", + "src": "537:13:59" + } + ], + "name": "DisputeType", + "nameLocation": "454:11:59", + "nodeType": "EnumDefinition", + "src": "449:107:59" + }, + { + "canonicalName": "IDisputeManager.DisputeStatus", + "documentation": { + "id": 14914, + "nodeType": "StructuredDocumentation", + "src": "562:31:59", + "text": "@notice Status of a dispute" + }, + "id": 14921, + "members": [ + { + "id": 14915, + "name": "Null", + "nameLocation": "627:4:59", + "nodeType": "EnumValue", + "src": "627:4:59" + }, + { + "id": 14916, + "name": "Accepted", + "nameLocation": "641:8:59", + "nodeType": "EnumValue", + "src": "641:8:59" + }, + { + "id": 14917, + "name": "Rejected", + "nameLocation": "659:8:59", + "nodeType": "EnumValue", + "src": "659:8:59" + }, + { + "id": 14918, + "name": "Drawn", + "nameLocation": "677:5:59", + "nodeType": "EnumValue", + "src": "677:5:59" + }, + { + "id": 14919, + "name": "Pending", + "nameLocation": "692:7:59", + "nodeType": "EnumValue", + "src": "692:7:59" + }, + { + "id": 14920, + "name": "Cancelled", + "nameLocation": "709:9:59", + "nodeType": "EnumValue", + "src": "709:9:59" + } + ], + "name": "DisputeStatus", + "nameLocation": "603:13:59", + "nodeType": "EnumDefinition", + "src": "598:126:59" + }, + { + "canonicalName": "IDisputeManager.Dispute", + "documentation": { + "id": 14922, + "nodeType": "StructuredDocumentation", + "src": "730:724:59", + "text": " @notice Dispute details\n @param indexer The indexer that is being disputed\n @param fisherman The fisherman that created the dispute\n @param deposit The amount of tokens deposited by the fisherman\n @param relatedDisputeId The link to a related dispute, used when creating dispute via conflicting attestations\n @param disputeType The type of dispute\n @param status The status of the dispute\n @param createdAt The timestamp when the dispute was created\n @param cancellableAt The timestamp when the dispute can be cancelled\n @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute (includes delegation up to the delegation ratio)" + }, + "id": 14943, + "members": [ + { + "constant": false, + "id": 14924, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "1492:7:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1484:15:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14923, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1484:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14926, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "1517:9:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1509:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14925, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1509:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14928, + "mutability": "mutable", + "name": "deposit", + "nameLocation": "1544:7:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1536:15:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14927, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1536:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14930, + "mutability": "mutable", + "name": "relatedDisputeId", + "nameLocation": "1569:16:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1561:24:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14929, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1561:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14933, + "mutability": "mutable", + "name": "disputeType", + "nameLocation": "1607:11:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1595:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + }, + "typeName": { + "id": 14932, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14931, + "name": "DisputeType", + "nameLocations": ["1595:11:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14913, + "src": "1595:11:59" + }, + "referencedDeclaration": 14913, + "src": "1595:11:59", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeType_$14913", + "typeString": "enum IDisputeManager.DisputeType" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14936, + "mutability": "mutable", + "name": "status", + "nameLocation": "1642:6:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1628:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + "typeName": { + "id": 14935, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 14934, + "name": "DisputeStatus", + "nameLocations": ["1628:13:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14921, + "src": "1628:13:59" + }, + "referencedDeclaration": 14921, + "src": "1628:13:59", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14938, + "mutability": "mutable", + "name": "createdAt", + "nameLocation": "1666:9:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1658:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14937, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1658:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14940, + "mutability": "mutable", + "name": "cancellableAt", + "nameLocation": "1693:13:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1685:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14939, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1685:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14942, + "mutability": "mutable", + "name": "stakeSnapshot", + "nameLocation": "1724:13:59", + "nodeType": "VariableDeclaration", + "scope": 14943, + "src": "1716:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14941, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1716:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "Dispute", + "nameLocation": "1466:7:59", + "nodeType": "StructDefinition", + "scope": 15373, + "src": "1459:285:59", + "visibility": "public" + }, + { + "anonymous": false, + "documentation": { + "id": 14944, + "nodeType": "StructuredDocumentation", + "src": "1750:114:59", + "text": " @notice Emitted when arbitrator is set.\n @param arbitrator The address of the arbitrator." + }, + "eventSelector": "51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e", + "id": 14948, + "name": "ArbitratorSet", + "nameLocation": "1875:13:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14947, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14946, + "indexed": true, + "mutability": "mutable", + "name": "arbitrator", + "nameLocation": "1905:10:59", + "nodeType": "VariableDeclaration", + "scope": 14948, + "src": "1889:26:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14945, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1889:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1888:28:59" + }, + "src": "1869:48:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14949, + "nodeType": "StructuredDocumentation", + "src": "1923:121:59", + "text": " @notice Emitted when dispute period is set.\n @param disputePeriod The dispute period in seconds." + }, + "eventSelector": "310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e6", + "id": 14953, + "name": "DisputePeriodSet", + "nameLocation": "2055:16:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14952, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14951, + "indexed": false, + "mutability": "mutable", + "name": "disputePeriod", + "nameLocation": "2079:13:59", + "nodeType": "VariableDeclaration", + "scope": 14953, + "src": "2072:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 14950, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "2072:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "2071:22:59" + }, + "src": "2049:45:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14954, + "nodeType": "StructuredDocumentation", + "src": "2100:142:59", + "text": " @notice Emitted when dispute deposit is set.\n @param disputeDeposit The dispute deposit required to create a dispute." + }, + "eventSelector": "97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f8", + "id": 14958, + "name": "DisputeDepositSet", + "nameLocation": "2253:17:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14957, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14956, + "indexed": false, + "mutability": "mutable", + "name": "disputeDeposit", + "nameLocation": "2279:14:59", + "nodeType": "VariableDeclaration", + "scope": 14958, + "src": "2271:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14955, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2271:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2270:24:59" + }, + "src": "2247:48:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14959, + "nodeType": "StructuredDocumentation", + "src": "2301:135:59", + "text": " @notice Emitted when max slashing cut is set.\n @param maxSlashingCut The maximum slashing cut that can be set." + }, + "eventSelector": "7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d680502", + "id": 14963, + "name": "MaxSlashingCutSet", + "nameLocation": "2447:17:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14962, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14961, + "indexed": false, + "mutability": "mutable", + "name": "maxSlashingCut", + "nameLocation": "2472:14:59", + "nodeType": "VariableDeclaration", + "scope": 14963, + "src": "2465:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 14960, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2465:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "2464:23:59" + }, + "src": "2441:47:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14964, + "nodeType": "StructuredDocumentation", + "src": "2494:127:59", + "text": " @notice Emitted when fisherman reward cut is set.\n @param fishermanRewardCut The fisherman reward cut." + }, + "eventSelector": "c573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab", + "id": 14968, + "name": "FishermanRewardCutSet", + "nameLocation": "2632:21:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14967, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14966, + "indexed": false, + "mutability": "mutable", + "name": "fishermanRewardCut", + "nameLocation": "2661:18:59", + "nodeType": "VariableDeclaration", + "scope": 14968, + "src": "2654:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 14965, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "2654:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "2653:27:59" + }, + "src": "2626:55:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14969, + "nodeType": "StructuredDocumentation", + "src": "2687:131:59", + "text": " @notice Emitted when subgraph service is set.\n @param subgraphService The address of the subgraph service." + }, + "eventSelector": "81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c7", + "id": 14973, + "name": "SubgraphServiceSet", + "nameLocation": "2829:18:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14972, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14971, + "indexed": true, + "mutability": "mutable", + "name": "subgraphService", + "nameLocation": "2864:15:59", + "nodeType": "VariableDeclaration", + "scope": 14973, + "src": "2848:31:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14970, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2848:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2847:33:59" + }, + "src": "2823:58:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14974, + "nodeType": "StructuredDocumentation", + "src": "2887:694:59", + "text": " @dev Emitted when a query dispute is created for `subgraphDeploymentId` and `indexer`\n by `fisherman`.\n The event emits the amount of `tokens` deposited by the fisherman and `attestation` submitted.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address\n @param tokens The amount of tokens deposited by the fisherman\n @param subgraphDeploymentId The subgraph deployment id\n @param attestation The attestation\n @param cancellableAt The timestamp when the dispute can be cancelled\n @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute" + }, + "eventSelector": "fb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b35", + "id": 14992, + "name": "QueryDisputeCreated", + "nameLocation": "3592:19:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 14991, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14976, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "3637:9:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3621:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14975, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3621:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14978, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "3672:7:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3656:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14977, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3656:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14980, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "3705:9:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3689:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14979, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3689:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14982, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "3732:6:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3724:14:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14981, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3724:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14984, + "indexed": false, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "3756:20:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3748:28:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14983, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3748:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14986, + "indexed": false, + "mutability": "mutable", + "name": "attestation", + "nameLocation": "3792:11:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3786:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 14985, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3786:5:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14988, + "indexed": false, + "mutability": "mutable", + "name": "stakeSnapshot", + "nameLocation": "3821:13:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3813:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14987, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3813:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14990, + "indexed": false, + "mutability": "mutable", + "name": "cancellableAt", + "nameLocation": "3852:13:59", + "nodeType": "VariableDeclaration", + "scope": 14992, + "src": "3844:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 14989, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3844:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3611:260:59" + }, + "src": "3586:286:59" + }, + { + "anonymous": false, + "documentation": { + "id": 14993, + "nodeType": "StructuredDocumentation", + "src": "3878:629:59", + "text": " @dev Emitted when an indexing dispute is created for `allocationId` and `indexer`\n by `fisherman`.\n The event emits the amount of `tokens` deposited by the fisherman.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address\n @param tokens The amount of tokens deposited by the fisherman\n @param allocationId The allocation id\n @param poi The POI\n @param stakeSnapshot The stake snapshot of the indexer at the time of the dispute\n @param cancellableAt The timestamp when the dispute can be cancelled" + }, + "eventSelector": "8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b", + "id": 15011, + "name": "IndexingDisputeCreated", + "nameLocation": "4518:22:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15010, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14995, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "4566:9:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4550:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 14994, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4550:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14997, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "4601:7:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4585:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14996, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4585:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 14999, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "4634:9:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4618:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 14998, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4618:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15001, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "4661:6:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4653:14:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15000, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4653:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15003, + "indexed": false, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "4685:12:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4677:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15002, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4677:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15005, + "indexed": false, + "mutability": "mutable", + "name": "poi", + "nameLocation": "4715:3:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4707:11:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15004, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4707:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15007, + "indexed": false, + "mutability": "mutable", + "name": "stakeSnapshot", + "nameLocation": "4736:13:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4728:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15006, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4728:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15009, + "indexed": false, + "mutability": "mutable", + "name": "cancellableAt", + "nameLocation": "4767:13:59", + "nodeType": "VariableDeclaration", + "scope": 15011, + "src": "4759:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15008, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4759:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4540:246:59" + }, + "src": "4512:275:59" + }, + { + "anonymous": false, + "documentation": { + "id": 15012, + "nodeType": "StructuredDocumentation", + "src": "4793:538:59", + "text": " @dev Emitted when a legacy dispute is created for `allocationId` and `fisherman`.\n The event emits the amount of `tokensSlash` to slash and `tokensRewards` to reward the fisherman.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address to be credited with the rewards\n @param allocationId The allocation id\n @param tokensSlash The amount of tokens to slash\n @param tokensRewards The amount of tokens to reward the fisherman" + }, + "eventSelector": "587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed031", + "id": 15026, + "name": "LegacyDisputeCreated", + "nameLocation": "5342:20:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15025, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15014, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "5388:9:59", + "nodeType": "VariableDeclaration", + "scope": 15026, + "src": "5372:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15013, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5372:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15016, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "5423:7:59", + "nodeType": "VariableDeclaration", + "scope": 15026, + "src": "5407:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15015, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5407:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15018, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "5456:9:59", + "nodeType": "VariableDeclaration", + "scope": 15026, + "src": "5440:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15017, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5440:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15020, + "indexed": false, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5483:12:59", + "nodeType": "VariableDeclaration", + "scope": 15026, + "src": "5475:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15019, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5475:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15022, + "indexed": false, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "5513:11:59", + "nodeType": "VariableDeclaration", + "scope": 15026, + "src": "5505:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15021, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5505:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15024, + "indexed": false, + "mutability": "mutable", + "name": "tokensRewards", + "nameLocation": "5542:13:59", + "nodeType": "VariableDeclaration", + "scope": 15026, + "src": "5534:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15023, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5534:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5362:199:59" + }, + "src": "5336:226:59" + }, + { + "anonymous": false, + "documentation": { + "id": 15027, + "nodeType": "StructuredDocumentation", + "src": "5568:427:59", + "text": " @dev Emitted when arbitrator accepts a `disputeId` to `indexer` created by `fisherman`.\n The event emits the amount `tokens` transferred to the fisherman, the deposit plus reward.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address\n @param tokens The amount of tokens transferred to the fisherman, the deposit plus reward" + }, + "eventSelector": "6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4", + "id": 15037, + "name": "DisputeAccepted", + "nameLocation": "6006:15:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15036, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15029, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "6047:9:59", + "nodeType": "VariableDeclaration", + "scope": 15037, + "src": "6031:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15028, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6031:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15031, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "6082:7:59", + "nodeType": "VariableDeclaration", + "scope": 15037, + "src": "6066:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15030, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6066:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15033, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "6115:9:59", + "nodeType": "VariableDeclaration", + "scope": 15037, + "src": "6099:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15032, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6099:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15035, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6142:6:59", + "nodeType": "VariableDeclaration", + "scope": 15037, + "src": "6134:14:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15034, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6134:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6021:133:59" + }, + "src": "6000:155:59" + }, + { + "anonymous": false, + "documentation": { + "id": 15038, + "nodeType": "StructuredDocumentation", + "src": "6161:388:59", + "text": " @dev Emitted when arbitrator rejects a `disputeId` for `indexer` created by `fisherman`.\n The event emits the amount `tokens` burned from the fisherman deposit.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address\n @param tokens The amount of tokens burned from the fisherman deposit" + }, + "eventSelector": "2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d", + "id": 15048, + "name": "DisputeRejected", + "nameLocation": "6560:15:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15047, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15040, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "6601:9:59", + "nodeType": "VariableDeclaration", + "scope": 15048, + "src": "6585:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15039, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6585:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15042, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "6636:7:59", + "nodeType": "VariableDeclaration", + "scope": 15048, + "src": "6620:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15041, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6620:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15044, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "6669:9:59", + "nodeType": "VariableDeclaration", + "scope": 15048, + "src": "6653:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15043, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6653:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15046, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6696:6:59", + "nodeType": "VariableDeclaration", + "scope": 15048, + "src": "6688:14:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15045, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6688:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6575:133:59" + }, + "src": "6554:155:59" + }, + { + "anonymous": false, + "documentation": { + "id": 15049, + "nodeType": "StructuredDocumentation", + "src": "6715:403:59", + "text": " @dev Emitted when arbitrator draw a `disputeId` for `indexer` created by `fisherman`.\n The event emits the amount `tokens` used as deposit and returned to the fisherman.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address\n @param tokens The amount of tokens returned to the fisherman - the deposit" + }, + "eventSelector": "f0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b7", + "id": 15059, + "name": "DisputeDrawn", + "nameLocation": "7129:12:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15058, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15051, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "7158:9:59", + "nodeType": "VariableDeclaration", + "scope": 15059, + "src": "7142:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15050, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7142:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15053, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "7185:7:59", + "nodeType": "VariableDeclaration", + "scope": 15059, + "src": "7169:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15052, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7169:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15055, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "7210:9:59", + "nodeType": "VariableDeclaration", + "scope": 15059, + "src": "7194:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15054, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7194:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15057, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "7229:6:59", + "nodeType": "VariableDeclaration", + "scope": 15059, + "src": "7221:14:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15056, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7221:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "7141:95:59" + }, + "src": "7123:114:59" + }, + { + "anonymous": false, + "documentation": { + "id": 15060, + "nodeType": "StructuredDocumentation", + "src": "7243:293:59", + "text": " @dev Emitted when two disputes are in conflict to link them.\n This event will be emitted after each DisputeCreated event is emitted\n for each of the individual disputes.\n @param disputeId1 The first dispute id\n @param disputeId2 The second dispute id" + }, + "eventSelector": "fec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba81407", + "id": 15066, + "name": "DisputeLinked", + "nameLocation": "7547:13:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15065, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15062, + "indexed": true, + "mutability": "mutable", + "name": "disputeId1", + "nameLocation": "7577:10:59", + "nodeType": "VariableDeclaration", + "scope": 15066, + "src": "7561:26:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15061, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7561:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15064, + "indexed": true, + "mutability": "mutable", + "name": "disputeId2", + "nameLocation": "7605:10:59", + "nodeType": "VariableDeclaration", + "scope": 15066, + "src": "7589:26:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15063, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7589:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "7560:56:59" + }, + "src": "7541:76:59" + }, + { + "anonymous": false, + "documentation": { + "id": 15067, + "nodeType": "StructuredDocumentation", + "src": "7623:356:59", + "text": " @dev Emitted when a dispute is cancelled by the fisherman.\n The event emits the amount `tokens` returned to the fisherman.\n @param disputeId The dispute id\n @param indexer The indexer address\n @param fisherman The fisherman address\n @param tokens The amount of tokens returned to the fisherman - the deposit" + }, + "eventSelector": "223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2", + "id": 15077, + "name": "DisputeCancelled", + "nameLocation": "7990:16:59", + "nodeType": "EventDefinition", + "parameters": { + "id": 15076, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15069, + "indexed": true, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "8032:9:59", + "nodeType": "VariableDeclaration", + "scope": 15077, + "src": "8016:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15068, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8016:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15071, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "8067:7:59", + "nodeType": "VariableDeclaration", + "scope": 15077, + "src": "8051:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15070, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8051:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15073, + "indexed": true, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "8100:9:59", + "nodeType": "VariableDeclaration", + "scope": 15077, + "src": "8084:25:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15072, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8084:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15075, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "8127:6:59", + "nodeType": "VariableDeclaration", + "scope": 15077, + "src": "8119:14:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15074, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8119:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8006:133:59" + }, + "src": "7984:156:59" + }, + { + "documentation": { + "id": 15078, + "nodeType": "StructuredDocumentation", + "src": "8167:71:59", + "text": " @notice Thrown when the caller is not the arbitrator" + }, + "errorSelector": "a8baf3bb", + "id": 15080, + "name": "DisputeManagerNotArbitrator", + "nameLocation": "8249:27:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15079, + "nodeType": "ParameterList", + "parameters": [], + "src": "8276:2:59" + }, + "src": "8243:36:59" + }, + { + "documentation": { + "id": 15081, + "nodeType": "StructuredDocumentation", + "src": "8285:70:59", + "text": " @notice Thrown when the caller is not the fisherman" + }, + "errorSelector": "82c00550", + "id": 15083, + "name": "DisputeManagerNotFisherman", + "nameLocation": "8366:26:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15082, + "nodeType": "ParameterList", + "parameters": [], + "src": "8392:2:59" + }, + "src": "8360:35:59" + }, + { + "documentation": { + "id": 15084, + "nodeType": "StructuredDocumentation", + "src": "8401:70:59", + "text": " @notice Thrown when the address is the zero address" + }, + "errorSelector": "c2d78882", + "id": 15086, + "name": "DisputeManagerInvalidZeroAddress", + "nameLocation": "8482:32:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15085, + "nodeType": "ParameterList", + "parameters": [], + "src": "8514:2:59" + }, + "src": "8476:41:59" + }, + { + "documentation": { + "id": 15087, + "nodeType": "StructuredDocumentation", + "src": "8523:65:59", + "text": " @notice Thrown when the dispute period is zero" + }, + "errorSelector": "c4411f11", + "id": 15089, + "name": "DisputeManagerDisputePeriodZero", + "nameLocation": "8599:31:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15088, + "nodeType": "ParameterList", + "parameters": [], + "src": "8630:2:59" + }, + "src": "8593:40:59" + }, + { + "documentation": { + "id": 15090, + "nodeType": "StructuredDocumentation", + "src": "8639:91:59", + "text": " @notice Thrown when the indexer being disputed has no provisioned tokens" + }, + "errorSelector": "60fdfb6e", + "id": 15092, + "name": "DisputeManagerZeroTokens", + "nameLocation": "8741:24:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15091, + "nodeType": "ParameterList", + "parameters": [], + "src": "8765:2:59" + }, + "src": "8735:33:59" + }, + { + "documentation": { + "id": 15093, + "nodeType": "StructuredDocumentation", + "src": "8774:103:59", + "text": " @notice Thrown when the dispute id is invalid\n @param disputeId The dispute id" + }, + "errorSelector": "5280eef4", + "id": 15097, + "name": "DisputeManagerInvalidDispute", + "nameLocation": "8888:28:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15096, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15095, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "8925:9:59", + "nodeType": "VariableDeclaration", + "scope": 15097, + "src": "8917:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15094, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8917:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "8916:19:59" + }, + "src": "8882:54:59" + }, + { + "documentation": { + "id": 15098, + "nodeType": "StructuredDocumentation", + "src": "8942:158:59", + "text": " @notice Thrown when the dispute deposit is invalid - less than the minimum dispute deposit\n @param disputeDeposit The dispute deposit" + }, + "errorSelector": "033f4e05", + "id": 15102, + "name": "DisputeManagerInvalidDisputeDeposit", + "nameLocation": "9111:35:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15101, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15100, + "mutability": "mutable", + "name": "disputeDeposit", + "nameLocation": "9155:14:59", + "nodeType": "VariableDeclaration", + "scope": 15102, + "src": "9147:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15099, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9147:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9146:24:59" + }, + "src": "9105:66:59" + }, + { + "documentation": { + "id": 15103, + "nodeType": "StructuredDocumentation", + "src": "9177:117:59", + "text": " @notice Thrown when the fisherman reward cut is invalid\n @param cut The fisherman reward cut" + }, + "errorSelector": "865ccc86", + "id": 15107, + "name": "DisputeManagerInvalidFishermanReward", + "nameLocation": "9305:36:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15106, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15105, + "mutability": "mutable", + "name": "cut", + "nameLocation": "9349:3:59", + "nodeType": "VariableDeclaration", + "scope": 15107, + "src": "9342:10:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15104, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "9342:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "9341:12:59" + }, + "src": "9299:55:59" + }, + { + "documentation": { + "id": 15108, + "nodeType": "StructuredDocumentation", + "src": "9360:120:59", + "text": " @notice Thrown when the max slashing cut is invalid\n @param maxSlashingCut The max slashing cut" + }, + "errorSelector": "9d26e9f6", + "id": 15112, + "name": "DisputeManagerInvalidMaxSlashingCut", + "nameLocation": "9491:35:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15111, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15110, + "mutability": "mutable", + "name": "maxSlashingCut", + "nameLocation": "9534:14:59", + "nodeType": "VariableDeclaration", + "scope": 15112, + "src": "9527:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15109, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "9527:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "9526:23:59" + }, + "src": "9485:65:59" + }, + { + "documentation": { + "id": 15113, + "nodeType": "StructuredDocumentation", + "src": "9556:159:59", + "text": " @notice Thrown when the tokens slash is invalid\n @param tokensSlash The tokens slash\n @param maxTokensSlash The max tokens slash" + }, + "errorSelector": "cc6b7c41", + "id": 15119, + "name": "DisputeManagerInvalidTokensSlash", + "nameLocation": "9726:32:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15118, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15115, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "9767:11:59", + "nodeType": "VariableDeclaration", + "scope": 15119, + "src": "9759:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15114, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9759:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15117, + "mutability": "mutable", + "name": "maxTokensSlash", + "nameLocation": "9788:14:59", + "nodeType": "VariableDeclaration", + "scope": 15119, + "src": "9780:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15116, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9780:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9758:45:59" + }, + "src": "9720:84:59" + }, + { + "documentation": { + "id": 15120, + "nodeType": "StructuredDocumentation", + "src": "9810:112:59", + "text": " @notice Thrown when the dispute is not pending\n @param status The status of the dispute" + }, + "errorSelector": "51b9503c", + "id": 15125, + "name": "DisputeManagerDisputeNotPending", + "nameLocation": "9933:31:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15124, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15123, + "mutability": "mutable", + "name": "status", + "nameLocation": "9995:6:59", + "nodeType": "VariableDeclaration", + "scope": 15125, + "src": "9965:36:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + }, + "typeName": { + "id": 15122, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15121, + "name": "IDisputeManager.DisputeStatus", + "nameLocations": ["9965:15:59", "9981:13:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 14921, + "src": "9965:29:59" + }, + "referencedDeclaration": 14921, + "src": "9965:29:59", + "typeDescriptions": { + "typeIdentifier": "t_enum$_DisputeStatus_$14921", + "typeString": "enum IDisputeManager.DisputeStatus" + } + }, + "visibility": "internal" + } + ], + "src": "9964:38:59" + }, + "src": "9927:76:59" + }, + { + "documentation": { + "id": 15126, + "nodeType": "StructuredDocumentation", + "src": "10009:108:59", + "text": " @notice Thrown when the dispute is already created\n @param disputeId The dispute id" + }, + "errorSelector": "249447e2", + "id": 15130, + "name": "DisputeManagerDisputeAlreadyCreated", + "nameLocation": "10128:35:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15129, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15128, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "10172:9:59", + "nodeType": "VariableDeclaration", + "scope": 15130, + "src": "10164:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15127, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10164:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "10163:19:59" + }, + "src": "10122:61:59" + }, + { + "documentation": { + "id": 15131, + "nodeType": "StructuredDocumentation", + "src": "10189:73:59", + "text": " @notice Thrown when the dispute period is not finished" + }, + "errorSelector": "3aeea7aa", + "id": 15133, + "name": "DisputeManagerDisputePeriodNotFinished", + "nameLocation": "10273:38:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15132, + "nodeType": "ParameterList", + "parameters": [], + "src": "10311:2:59" + }, + "src": "10267:47:59" + }, + { + "documentation": { + "id": 15134, + "nodeType": "StructuredDocumentation", + "src": "10320:104:59", + "text": " @notice Thrown when the dispute is in conflict\n @param disputeId The dispute id" + }, + "errorSelector": "64d0c32b", + "id": 15138, + "name": "DisputeManagerDisputeInConflict", + "nameLocation": "10435:31:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15137, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15136, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "10475:9:59", + "nodeType": "VariableDeclaration", + "scope": 15138, + "src": "10467:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15135, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10467:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "10466:19:59" + }, + "src": "10429:57:59" + }, + { + "documentation": { + "id": 15139, + "nodeType": "StructuredDocumentation", + "src": "10492:108:59", + "text": " @notice Thrown when the dispute is not in conflict\n @param disputeId The dispute id" + }, + "errorSelector": "ff29d3f9", + "id": 15143, + "name": "DisputeManagerDisputeNotInConflict", + "nameLocation": "10611:34:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15142, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15141, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "10654:9:59", + "nodeType": "VariableDeclaration", + "scope": 15143, + "src": "10646:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15140, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10646:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "10645:19:59" + }, + "src": "10605:60:59" + }, + { + "documentation": { + "id": 15144, + "nodeType": "StructuredDocumentation", + "src": "10671:160:59", + "text": " @notice Thrown when the dispute must be accepted\n @param disputeId The dispute id\n @param relatedDisputeId The related dispute id" + }, + "errorSelector": "826e2b26", + "id": 15150, + "name": "DisputeManagerMustAcceptRelatedDispute", + "nameLocation": "10842:38:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15149, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15146, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "10889:9:59", + "nodeType": "VariableDeclaration", + "scope": 15150, + "src": "10881:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15145, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10881:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15148, + "mutability": "mutable", + "name": "relatedDisputeId", + "nameLocation": "10908:16:59", + "nodeType": "VariableDeclaration", + "scope": 15150, + "src": "10900:24:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15147, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "10900:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "10880:45:59" + }, + "src": "10836:90:59" + }, + { + "documentation": { + "id": 15151, + "nodeType": "StructuredDocumentation", + "src": "10932:108:59", + "text": " @notice Thrown when the indexer is not found\n @param allocationId The allocation id" + }, + "errorSelector": "d1e2762c", + "id": 15155, + "name": "DisputeManagerIndexerNotFound", + "nameLocation": "11051:29:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15154, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15153, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "11089:12:59", + "nodeType": "VariableDeclaration", + "scope": 15155, + "src": "11081:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15152, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11081:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "11080:22:59" + }, + "src": "11045:58:59" + }, + { + "documentation": { + "id": 15156, + "nodeType": "StructuredDocumentation", + "src": "11109:255:59", + "text": " @notice Thrown when the subgraph deployment is not matching\n @param subgraphDeploymentId1 The subgraph deployment id of the first attestation\n @param subgraphDeploymentId2 The subgraph deployment id of the second attestation" + }, + "errorSelector": "28933f94", + "id": 15162, + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "nameLocation": "11375:43:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15161, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15158, + "mutability": "mutable", + "name": "subgraphDeploymentId1", + "nameLocation": "11427:21:59", + "nodeType": "VariableDeclaration", + "scope": 15162, + "src": "11419:29:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15157, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "11419:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15160, + "mutability": "mutable", + "name": "subgraphDeploymentId2", + "nameLocation": "11458:21:59", + "nodeType": "VariableDeclaration", + "scope": 15162, + "src": "11450:29:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15159, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "11450:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "11418:62:59" + }, + "src": "11369:112:59" + }, + { + "documentation": { + "id": 15163, + "nodeType": "StructuredDocumentation", + "src": "11487:526:59", + "text": " @notice Thrown when the attestations are not conflicting\n @param requestCID1 The request CID of the first attestation\n @param responseCID1 The response CID of the first attestation\n @param subgraphDeploymentId1 The subgraph deployment id of the first attestation\n @param requestCID2 The request CID of the second attestation\n @param responseCID2 The response CID of the second attestation\n @param subgraphDeploymentId2 The subgraph deployment id of the second attestation" + }, + "errorSelector": "d574a52e", + "id": 15177, + "name": "DisputeManagerNonConflictingAttestations", + "nameLocation": "12024:40:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15176, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15165, + "mutability": "mutable", + "name": "requestCID1", + "nameLocation": "12082:11:59", + "nodeType": "VariableDeclaration", + "scope": 15177, + "src": "12074:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15164, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12074:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15167, + "mutability": "mutable", + "name": "responseCID1", + "nameLocation": "12111:12:59", + "nodeType": "VariableDeclaration", + "scope": 15177, + "src": "12103:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15166, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12103:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15169, + "mutability": "mutable", + "name": "subgraphDeploymentId1", + "nameLocation": "12141:21:59", + "nodeType": "VariableDeclaration", + "scope": 15177, + "src": "12133:29:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15168, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12133:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15171, + "mutability": "mutable", + "name": "requestCID2", + "nameLocation": "12180:11:59", + "nodeType": "VariableDeclaration", + "scope": 15177, + "src": "12172:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15170, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12172:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15173, + "mutability": "mutable", + "name": "responseCID2", + "nameLocation": "12209:12:59", + "nodeType": "VariableDeclaration", + "scope": 15177, + "src": "12201:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15172, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12201:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15175, + "mutability": "mutable", + "name": "subgraphDeploymentId2", + "nameLocation": "12239:21:59", + "nodeType": "VariableDeclaration", + "scope": 15177, + "src": "12231:29:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15174, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12231:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "12064:202:59" + }, + "src": "12018:249:59" + }, + { + "documentation": { + "id": 15178, + "nodeType": "StructuredDocumentation", + "src": "12273:94:59", + "text": " @notice Thrown when attempting to get the subgraph service before it is set" + }, + "errorSelector": "bd088b4f", + "id": 15180, + "name": "DisputeManagerSubgraphServiceNotSet", + "nameLocation": "12378:35:59", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15179, + "nodeType": "ParameterList", + "parameters": [], + "src": "12413:2:59" + }, + "src": "12372:44:59" + }, + { + "documentation": { + "id": 15181, + "nodeType": "StructuredDocumentation", + "src": "12422:430:59", + "text": " @notice Initialize this contract.\n @param owner The owner of the contract\n @param arbitrator Arbitrator role\n @param disputePeriod Dispute period in seconds\n @param disputeDeposit Deposit required to create a Dispute\n @param fishermanRewardCut_ Percent of slashed funds for fisherman (ppm)\n @param maxSlashingCut_ Maximum percentage of indexer stake that can be slashed (ppm)" + }, + "functionSelector": "0bc7344b", + "id": 15196, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "initialize", + "nameLocation": "12866:10:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15194, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15183, + "mutability": "mutable", + "name": "owner", + "nameLocation": "12894:5:59", + "nodeType": "VariableDeclaration", + "scope": 15196, + "src": "12886:13:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15182, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12886:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15185, + "mutability": "mutable", + "name": "arbitrator", + "nameLocation": "12917:10:59", + "nodeType": "VariableDeclaration", + "scope": 15196, + "src": "12909:18:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15184, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12909:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15187, + "mutability": "mutable", + "name": "disputePeriod", + "nameLocation": "12944:13:59", + "nodeType": "VariableDeclaration", + "scope": 15196, + "src": "12937:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 15186, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "12937:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15189, + "mutability": "mutable", + "name": "disputeDeposit", + "nameLocation": "12975:14:59", + "nodeType": "VariableDeclaration", + "scope": 15196, + "src": "12967:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15188, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12967:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15191, + "mutability": "mutable", + "name": "fishermanRewardCut_", + "nameLocation": "13006:19:59", + "nodeType": "VariableDeclaration", + "scope": 15196, + "src": "12999:26:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15190, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "12999:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15193, + "mutability": "mutable", + "name": "maxSlashingCut_", + "nameLocation": "13042:15:59", + "nodeType": "VariableDeclaration", + "scope": 15196, + "src": "13035:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15192, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "13035:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "12876:187:59" + }, + "returnParameters": { + "id": 15195, + "nodeType": "ParameterList", + "parameters": [], + "src": "13072:0:59" + }, + "scope": 15373, + "src": "12857:216:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15197, + "nodeType": "StructuredDocumentation", + "src": "13079:173:59", + "text": " @notice Set the dispute period.\n @dev Update the dispute period to `_disputePeriod` in seconds\n @param disputePeriod Dispute period in seconds" + }, + "functionSelector": "d76f62d1", + "id": 15202, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDisputePeriod", + "nameLocation": "13266:16:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15200, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15199, + "mutability": "mutable", + "name": "disputePeriod", + "nameLocation": "13290:13:59", + "nodeType": "VariableDeclaration", + "scope": 15202, + "src": "13283:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 15198, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "13283:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "13282:22:59" + }, + "returnParameters": { + "id": 15201, + "nodeType": "ParameterList", + "parameters": [], + "src": "13313:0:59" + }, + "scope": 15373, + "src": "13257:57:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15203, + "nodeType": "StructuredDocumentation", + "src": "13320:179:59", + "text": " @notice Set the arbitrator address.\n @dev Update the arbitrator to `_arbitrator`\n @param arbitrator The address of the arbitration contract or party" + }, + "functionSelector": "b0eefabe", + "id": 15208, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setArbitrator", + "nameLocation": "13513:13:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15206, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15205, + "mutability": "mutable", + "name": "arbitrator", + "nameLocation": "13535:10:59", + "nodeType": "VariableDeclaration", + "scope": 15208, + "src": "13527:18:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15204, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13527:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "13526:20:59" + }, + "returnParameters": { + "id": 15207, + "nodeType": "ParameterList", + "parameters": [], + "src": "13555:0:59" + }, + "scope": 15373, + "src": "13504:52:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15209, + "nodeType": "StructuredDocumentation", + "src": "13562:218:59", + "text": " @notice Set the dispute deposit required to create a dispute.\n @dev Update the dispute deposit to `_disputeDeposit` Graph Tokens\n @param disputeDeposit The dispute deposit in Graph Tokens" + }, + "functionSelector": "16972978", + "id": 15214, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDisputeDeposit", + "nameLocation": "13794:17:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15212, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15211, + "mutability": "mutable", + "name": "disputeDeposit", + "nameLocation": "13820:14:59", + "nodeType": "VariableDeclaration", + "scope": 15214, + "src": "13812:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15210, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13812:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "13811:24:59" + }, + "returnParameters": { + "id": 15213, + "nodeType": "ParameterList", + "parameters": [], + "src": "13844:0:59" + }, + "scope": 15373, + "src": "13785:60:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15215, + "nodeType": "StructuredDocumentation", + "src": "13851:227:59", + "text": " @notice Set the percent reward that the fisherman gets when slashing occurs.\n @dev Update the reward percentage to `_percentage`\n @param fishermanRewardCut_ Reward as a percentage of indexer stake" + }, + "functionSelector": "76c993ae", + "id": 15220, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setFishermanRewardCut", + "nameLocation": "14092:21:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15218, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15217, + "mutability": "mutable", + "name": "fishermanRewardCut_", + "nameLocation": "14121:19:59", + "nodeType": "VariableDeclaration", + "scope": 15220, + "src": "14114:26:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15216, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "14114:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "14113:28:59" + }, + "returnParameters": { + "id": 15219, + "nodeType": "ParameterList", + "parameters": [], + "src": "14150:0:59" + }, + "scope": 15373, + "src": "14083:68:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15221, + "nodeType": "StructuredDocumentation", + "src": "14157:160:59", + "text": " @notice Set the maximum percentage that can be used for slashing indexers.\n @param maxSlashingCut_ Max percentage slashing for disputes" + }, + "functionSelector": "9f81a7cf", + "id": 15226, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMaxSlashingCut", + "nameLocation": "14331:17:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15224, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15223, + "mutability": "mutable", + "name": "maxSlashingCut_", + "nameLocation": "14356:15:59", + "nodeType": "VariableDeclaration", + "scope": 15226, + "src": "14349:22:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15222, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "14349:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "14348:24:59" + }, + "returnParameters": { + "id": 15225, + "nodeType": "ParameterList", + "parameters": [], + "src": "14381:0:59" + }, + "scope": 15373, + "src": "14322:60:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15227, + "nodeType": "StructuredDocumentation", + "src": "14388:197:59", + "text": " @notice Set the subgraph service address.\n @dev Update the subgraph service to `_subgraphService`\n @param subgraphService The address of the subgraph service contract" + }, + "functionSelector": "93a90a1e", + "id": 15232, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setSubgraphService", + "nameLocation": "14599:18:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15230, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15229, + "mutability": "mutable", + "name": "subgraphService", + "nameLocation": "14626:15:59", + "nodeType": "VariableDeclaration", + "scope": 15232, + "src": "14618:23:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15228, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14618:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "14617:25:59" + }, + "returnParameters": { + "id": 15231, + "nodeType": "ParameterList", + "parameters": [], + "src": "14651:0:59" + }, + "scope": 15373, + "src": "14590:62:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15233, + "nodeType": "StructuredDocumentation", + "src": "14680:448:59", + "text": " @notice Create a query dispute for the arbitrator to resolve.\n This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens.\n * Requirements:\n - fisherman must have previously approved this contract to pull `disputeDeposit` amount\n of tokens from their balance.\n @param attestationData Attestation bytes submitted by the fisherman\n @return The dispute id" + }, + "functionSelector": "c50a77b1", + "id": 15240, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createQueryDispute", + "nameLocation": "15142:18:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15236, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15235, + "mutability": "mutable", + "name": "attestationData", + "nameLocation": "15176:15:59", + "nodeType": "VariableDeclaration", + "scope": 15240, + "src": "15161:30:59", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 15234, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "15161:5:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "15160:32:59" + }, + "returnParameters": { + "id": 15239, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15238, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15240, + "src": "15211:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15237, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "15211:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "15210:9:59" + }, + "scope": 15373, + "src": "15133:87:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15241, + "nodeType": "StructuredDocumentation", + "src": "15226:974:59", + "text": " @notice Create query disputes for two conflicting attestations.\n A conflicting attestation is a proof presented by two different indexers\n where for the same request on a subgraph the response is different.\n Two linked disputes will be created and if the arbitrator resolve one, the other\n one will be automatically resolved. Note that:\n - it's not possible to reject a conflicting query dispute as by definition at least one\n of the attestations is incorrect.\n - if both attestations are proven to be incorrect, the arbitrator can slash the indexer twice.\n Requirements:\n - fisherman must have previously approved this contract to pull `disputeDeposit` amount\n of tokens from their balance.\n @param attestationData1 First attestation data submitted\n @param attestationData2 Second attestation data submitted\n @return The first dispute id\n @return The second dispute id" + }, + "functionSelector": "c894222e", + "id": 15252, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createQueryDisputeConflict", + "nameLocation": "16214:26:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15246, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15243, + "mutability": "mutable", + "name": "attestationData1", + "nameLocation": "16265:16:59", + "nodeType": "VariableDeclaration", + "scope": 15252, + "src": "16250:31:59", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 15242, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "16250:5:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15245, + "mutability": "mutable", + "name": "attestationData2", + "nameLocation": "16306:16:59", + "nodeType": "VariableDeclaration", + "scope": 15252, + "src": "16291:31:59", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 15244, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "16291:5:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "16240:88:59" + }, + "returnParameters": { + "id": 15251, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15248, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15252, + "src": "16347:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15247, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "16347:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15250, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15252, + "src": "16356:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15249, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "16356:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "16346:18:59" + }, + "scope": 15373, + "src": "16205:160:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15253, + "nodeType": "StructuredDocumentation", + "src": "16371:604:59", + "text": " @notice Create an indexing dispute for the arbitrator to resolve.\n The disputes are created in reference to an allocationId and specifically\n a POI for that allocation.\n This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens.\n Requirements:\n - fisherman must have previously approved this contract to pull `disputeDeposit` amount\n of tokens from their balance.\n @param allocationId The allocation to dispute\n @param poi The Proof of Indexing (POI) being disputed\n @return The dispute id" + }, + "functionSelector": "4bc5839a", + "id": 15262, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createIndexingDispute", + "nameLocation": "16989:21:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15258, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15255, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "17019:12:59", + "nodeType": "VariableDeclaration", + "scope": 15262, + "src": "17011:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15254, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "17011:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15257, + "mutability": "mutable", + "name": "poi", + "nameLocation": "17041:3:59", + "nodeType": "VariableDeclaration", + "scope": 15262, + "src": "17033:11:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15256, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "17033:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "17010:35:59" + }, + "returnParameters": { + "id": 15261, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15260, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15262, + "src": "17064:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15259, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "17064:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "17063:9:59" + }, + "scope": 15373, + "src": "16980:93:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15263, + "nodeType": "StructuredDocumentation", + "src": "17079:1363:59", + "text": " @notice Creates and auto-accepts a legacy dispute.\n This disputes can be created to settle outstanding slashing amounts with an indexer that has been\n \"legacy slashed\" during or shortly after the transition period. See {HorizonStakingExtension.legacySlash}\n for more details.\n Note that this type of dispute:\n - can only be created by the arbitrator\n - does not require a bond\n - is automatically accepted when created\n Additionally, note that this type of disputes allow the arbitrator to directly set the slash and rewards\n amounts, bypassing the usual mechanisms that impose restrictions on those. This is done to give arbitrators\n maximum flexibility to ensure outstanding slashing amounts are settled fairly. This function needs to be removed\n after the transition period.\n Requirements:\n - Indexer must have been legacy slashed during or shortly after the transition period\n - Indexer must have provisioned funds to the Subgraph Service\n @param allocationId The allocation to dispute\n @param fisherman The fisherman address to be credited with the rewards\n @param tokensSlash The amount of tokens to slash\n @param tokensRewards The amount of tokens to reward the fisherman\n @return The dispute id" + }, + "functionSelector": "8d4e9008", + "id": 15276, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createAndAcceptLegacyDispute", + "nameLocation": "18456:28:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15272, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15265, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "18502:12:59", + "nodeType": "VariableDeclaration", + "scope": 15276, + "src": "18494:20:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15264, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18494:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15267, + "mutability": "mutable", + "name": "fisherman", + "nameLocation": "18532:9:59", + "nodeType": "VariableDeclaration", + "scope": 15276, + "src": "18524:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15266, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18524:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15269, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "18559:11:59", + "nodeType": "VariableDeclaration", + "scope": 15276, + "src": "18551:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15268, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18551:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15271, + "mutability": "mutable", + "name": "tokensRewards", + "nameLocation": "18588:13:59", + "nodeType": "VariableDeclaration", + "scope": 15276, + "src": "18580:21:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15270, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "18580:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "18484:123:59" + }, + "returnParameters": { + "id": 15275, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15274, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15276, + "src": "18626:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15273, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "18626:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "18625:9:59" + }, + "scope": 15373, + "src": "18447:188:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15277, + "nodeType": "StructuredDocumentation", + "src": "18666:649:59", + "text": " @notice The arbitrator accepts a dispute as being valid.\n This function will revert if the indexer is not slashable, whether because it does not have\n any stake available or the slashing percentage is configured to be zero. In those cases\n a dispute must be resolved using drawDispute or rejectDispute.\n This function will also revert if the dispute is in conflict, to accept a conflicting dispute\n use acceptDisputeConflict.\n @dev Accept a dispute with Id `disputeId`\n @param disputeId Id of the dispute to be accepted\n @param tokensSlash Amount of tokens to slash from the indexer" + }, + "functionSelector": "050b17ad", + "id": 15284, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "acceptDispute", + "nameLocation": "19329:13:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15282, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15279, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "19351:9:59", + "nodeType": "VariableDeclaration", + "scope": 15284, + "src": "19343:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15278, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "19343:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15281, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "19370:11:59", + "nodeType": "VariableDeclaration", + "scope": 15284, + "src": "19362:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15280, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "19362:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "19342:40:59" + }, + "returnParameters": { + "id": 15283, + "nodeType": "ParameterList", + "parameters": [], + "src": "19391:0:59" + }, + "scope": 15373, + "src": "19320:72:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15285, + "nodeType": "StructuredDocumentation", + "src": "19398:770:59", + "text": " @notice The arbitrator accepts a conflicting dispute as being valid.\n This function will revert if the indexer is not slashable, whether because it does not have\n any stake available or the slashing percentage is configured to be zero. In those cases\n a dispute must be resolved using drawDispute.\n @param disputeId Id of the dispute to be accepted\n @param tokensSlash Amount of tokens to slash from the indexer for the first dispute\n @param acceptDisputeInConflict Accept the conflicting dispute. Otherwise it will be drawn automatically\n @param tokensSlashRelated Amount of tokens to slash from the indexer for the related dispute in case\n acceptDisputeInConflict is true, otherwise it will be ignored" + }, + "functionSelector": "b0e2f7e9", + "id": 15296, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "acceptDisputeConflict", + "nameLocation": "20182:21:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15294, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15287, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "20221:9:59", + "nodeType": "VariableDeclaration", + "scope": 15296, + "src": "20213:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15286, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "20213:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15289, + "mutability": "mutable", + "name": "tokensSlash", + "nameLocation": "20248:11:59", + "nodeType": "VariableDeclaration", + "scope": 15296, + "src": "20240:19:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15288, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20240:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15291, + "mutability": "mutable", + "name": "acceptDisputeInConflict", + "nameLocation": "20274:23:59", + "nodeType": "VariableDeclaration", + "scope": 15296, + "src": "20269:28:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15290, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "20269:4:59", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15293, + "mutability": "mutable", + "name": "tokensSlashRelated", + "nameLocation": "20315:18:59", + "nodeType": "VariableDeclaration", + "scope": 15296, + "src": "20307:26:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15292, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "20307:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "20203:136:59" + }, + "returnParameters": { + "id": 15295, + "nodeType": "ParameterList", + "parameters": [], + "src": "20348:0:59" + }, + "scope": 15373, + "src": "20173:176:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15297, + "nodeType": "StructuredDocumentation", + "src": "20355:247:59", + "text": " @notice The arbitrator rejects a dispute as being invalid.\n Note that conflicting query disputes cannot be rejected.\n @dev Reject a dispute with Id `disputeId`\n @param disputeId Id of the dispute to be rejected" + }, + "functionSelector": "36167e03", + "id": 15302, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "rejectDispute", + "nameLocation": "20616:13:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15300, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15299, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "20638:9:59", + "nodeType": "VariableDeclaration", + "scope": 15302, + "src": "20630:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15298, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "20630:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "20629:19:59" + }, + "returnParameters": { + "id": 15301, + "nodeType": "ParameterList", + "parameters": [], + "src": "20657:0:59" + }, + "scope": 15373, + "src": "20607:51:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15303, + "nodeType": "StructuredDocumentation", + "src": "20664:335:59", + "text": " @notice The arbitrator draws dispute.\n Note that drawing a conflicting query dispute should not be possible however it is allowed\n to give arbitrators greater flexibility when resolving disputes.\n @dev Ignore a dispute with Id `disputeId`\n @param disputeId Id of the dispute to be disregarded" + }, + "functionSelector": "9334ea52", + "id": 15308, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "drawDispute", + "nameLocation": "21013:11:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15306, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15305, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "21033:9:59", + "nodeType": "VariableDeclaration", + "scope": 15308, + "src": "21025:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15304, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "21025:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "21024:19:59" + }, + "returnParameters": { + "id": 15307, + "nodeType": "ParameterList", + "parameters": [], + "src": "21052:0:59" + }, + "scope": 15373, + "src": "21004:49:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15309, + "nodeType": "StructuredDocumentation", + "src": "21059:376:59", + "text": " @notice Once the dispute period ends, if the dispute status remains Pending,\n the fisherman can cancel the dispute and get back their initial deposit.\n Note that cancelling a conflicting query dispute will also cancel the related dispute.\n @dev Cancel a dispute with Id `disputeId`\n @param disputeId Id of the dispute to be cancelled" + }, + "functionSelector": "1792f194", + "id": 15314, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "cancelDispute", + "nameLocation": "21449:13:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15312, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15311, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "21471:9:59", + "nodeType": "VariableDeclaration", + "scope": 15314, + "src": "21463:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15310, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "21463:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "21462:19:59" + }, + "returnParameters": { + "id": 15313, + "nodeType": "ParameterList", + "parameters": [], + "src": "21490:0:59" + }, + "scope": 15373, + "src": "21440:51:59", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15315, + "nodeType": "StructuredDocumentation", + "src": "21519:112:59", + "text": " @notice Get the fisherman reward cut.\n @return Fisherman reward cut in percentage (ppm)" + }, + "functionSelector": "bb2a2b47", + "id": 15320, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getFishermanRewardCut", + "nameLocation": "21645:21:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15316, + "nodeType": "ParameterList", + "parameters": [], + "src": "21666:2:59" + }, + "returnParameters": { + "id": 15319, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15318, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15320, + "src": "21692:6:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15317, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "21692:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "21691:8:59" + }, + "scope": 15373, + "src": "21636:64:59", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15321, + "nodeType": "StructuredDocumentation", + "src": "21706:91:59", + "text": " @notice Get the dispute period.\n @return Dispute period in seconds" + }, + "functionSelector": "5aea0ec4", + "id": 15326, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDisputePeriod", + "nameLocation": "21811:16:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15322, + "nodeType": "ParameterList", + "parameters": [], + "src": "21827:2:59" + }, + "returnParameters": { + "id": 15325, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15324, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15326, + "src": "21853:6:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 15323, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "21853:6:59", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + } + ], + "src": "21852:8:59" + }, + "scope": 15373, + "src": "21802:59:59", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15327, + "nodeType": "StructuredDocumentation", + "src": "21867:224:59", + "text": " @notice Return whether a dispute exists or not.\n @dev Return if dispute with Id `disputeId` exists\n @param disputeId True if dispute already exists\n @return True if dispute already exists" + }, + "functionSelector": "be41f384", + "id": 15334, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isDisputeCreated", + "nameLocation": "22105:16:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15330, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15329, + "mutability": "mutable", + "name": "disputeId", + "nameLocation": "22130:9:59", + "nodeType": "VariableDeclaration", + "scope": 15334, + "src": "22122:17:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15328, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "22122:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "22121:19:59" + }, + "returnParameters": { + "id": 15333, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15332, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15334, + "src": "22164:4:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15331, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "22164:4:59", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "22163:6:59" + }, + "scope": 15373, + "src": "22096:74:59", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15335, + "nodeType": "StructuredDocumentation", + "src": "22176:429:59", + "text": " @notice Get the message hash that a indexer used to sign the receipt.\n Encodes a receipt using a domain separator, as described on\n https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification.\n @dev Return the message hash used to sign the receipt\n @param receipt Receipt returned by indexer and submitted by fisherman\n @return Message hash used to sign the receipt" + }, + "functionSelector": "6369df6b", + "id": 15343, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "encodeReceipt", + "nameLocation": "22619:13:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15339, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15338, + "mutability": "mutable", + "name": "receipt", + "nameLocation": "22660:7:59", + "nodeType": "VariableDeclaration", + "scope": 15343, + "src": "22633:34:59", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt" + }, + "typeName": { + "id": 15337, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15336, + "name": "Attestation.Receipt", + "nameLocations": ["22633:11:59", "22645:7:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16044, + "src": "22633:19:59" + }, + "referencedDeclaration": 16044, + "src": "22633:19:59", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_storage_ptr", + "typeString": "struct Attestation.Receipt" + } + }, + "visibility": "internal" + } + ], + "src": "22632:36:59" + }, + "returnParameters": { + "id": 15342, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15341, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15343, + "src": "22692:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15340, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "22692:7:59", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "22691:9:59" + }, + "scope": 15373, + "src": "22610:91:59", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15344, + "nodeType": "StructuredDocumentation", + "src": "22707:143:59", + "text": " @notice Returns the indexer that signed an attestation.\n @param attestation Attestation\n @return indexer address" + }, + "functionSelector": "c9747f51", + "id": 15352, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAttestationIndexer", + "nameLocation": "22864:21:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15348, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15347, + "mutability": "mutable", + "name": "attestation", + "nameLocation": "22911:11:59", + "nodeType": "VariableDeclaration", + "scope": 15352, + "src": "22886:36:59", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 15346, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15345, + "name": "Attestation.State", + "nameLocations": ["22886:11:59", "22898:5:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "22886:17:59" + }, + "referencedDeclaration": 16058, + "src": "22886:17:59", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "22885:38:59" + }, + "returnParameters": { + "id": 15351, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15350, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15352, + "src": "22947:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15349, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "22947:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "22946:9:59" + }, + "scope": 15373, + "src": "22855:101:59", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15353, + "nodeType": "StructuredDocumentation", + "src": "22962:141:59", + "text": " @notice Get the stake snapshot for an indexer.\n @param indexer The indexer address\n @return The stake snapshot" + }, + "functionSelector": "c133b429", + "id": 15360, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getStakeSnapshot", + "nameLocation": "23117:16:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15356, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15355, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "23142:7:59", + "nodeType": "VariableDeclaration", + "scope": 15360, + "src": "23134:15:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15354, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "23134:7:59", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "23133:17:59" + }, + "returnParameters": { + "id": 15359, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15358, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15360, + "src": "23174:7:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15357, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "23174:7:59", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "23173:9:59" + }, + "scope": 15373, + "src": "23108:75:59", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15361, + "nodeType": "StructuredDocumentation", + "src": "23189:224:59", + "text": " @notice Checks if two attestations are conflicting\n @param attestation1 The first attestation\n @param attestation2 The second attestation\n @return Whether the attestations are conflicting" + }, + "functionSelector": "d36fc9d4", + "id": 15372, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "areConflictingAttestations", + "nameLocation": "23427:26:59", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15368, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15364, + "mutability": "mutable", + "name": "attestation1", + "nameLocation": "23488:12:59", + "nodeType": "VariableDeclaration", + "scope": 15372, + "src": "23463:37:59", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 15363, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15362, + "name": "Attestation.State", + "nameLocations": ["23463:11:59", "23475:5:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "23463:17:59" + }, + "referencedDeclaration": 16058, + "src": "23463:17:59", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15367, + "mutability": "mutable", + "name": "attestation2", + "nameLocation": "23535:12:59", + "nodeType": "VariableDeclaration", + "scope": 15372, + "src": "23510:37:59", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 15366, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15365, + "name": "Attestation.State", + "nameLocations": ["23510:11:59", "23522:5:59"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "23510:17:59" + }, + "referencedDeclaration": 16058, + "src": "23510:17:59", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "23453:100:59" + }, + "returnParameters": { + "id": 15371, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15370, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15372, + "src": "23577:4:59", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15369, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "23577:4:59", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "23576:6:59" + }, + "scope": 15373, + "src": "23418:165:59", + "stateMutability": "pure", + "virtual": false, + "visibility": "external" + } + ], + "scope": 15374, + "src": "363:23222:59", + "usedErrors": [ + 15080, 15083, 15086, 15089, 15092, 15097, 15102, 15107, 15112, 15119, 15125, 15130, 15133, 15138, 15143, + 15150, 15155, 15162, 15177, 15180 + ], + "usedEvents": [ + 14948, 14953, 14958, 14963, 14968, 14973, 14992, 15011, 15026, 15037, 15048, 15059, 15066, 15077 + ] + } + ], + "src": "46:23540:59" + }, + "id": 59 + }, + "contracts/interfaces/ISubgraphService.sol": { + "ast": { + "absolutePath": "contracts/interfaces/ISubgraphService.sol", + "exportedSymbols": { + "Allocation": [16033], + "IDataServiceFees": [1620], + "IGraphPayments": [2489], + "ISubgraphService": [15634], + "LegacyAllocation": [16462] + }, + "id": 15635, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 15375, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:60" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol", + "file": "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol", + "id": 15377, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 15635, + "sourceUnit": 1621, + "src": "70:113:60", + "symbolAliases": [ + { + "foreign": { + "id": 15376, + "name": "IDataServiceFees", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1620, + "src": "79:16:60", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "id": 15379, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 15635, + "sourceUnit": 2490, + "src": "184:96:60", + "symbolAliases": [ + { + "foreign": { + "id": 15378, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "193:14:60", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/Allocation.sol", + "file": "../libraries/Allocation.sol", + "id": 15381, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 15635, + "sourceUnit": 16034, + "src": "282:57:60", + "symbolAliases": [ + { + "foreign": { + "id": 15380, + "name": "Allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16033, + "src": "291:10:60", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/LegacyAllocation.sol", + "file": "../libraries/LegacyAllocation.sol", + "id": 15383, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 15635, + "sourceUnit": 16463, + "src": "340:69:60", + "symbolAliases": [ + { + "foreign": { + "id": 15382, + "name": "LegacyAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16462, + "src": "349:16:60", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 15385, + "name": "IDataServiceFees", + "nameLocations": ["1138:16:60"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1620, + "src": "1138:16:60" + }, + "id": 15386, + "nodeType": "InheritanceSpecifier", + "src": "1138:16:60" + } + ], + "canonicalName": "ISubgraphService", + "contractDependencies": [], + "contractKind": "interface", + "documentation": { + "id": 15384, + "nodeType": "StructuredDocumentation", + "src": "411:696:60", + "text": " @title Interface for the {SubgraphService} contract\n @dev This interface extends {IDataServiceFees} and {IDataService}.\n @notice The Subgraph Service is a data service built on top of Graph Horizon that supports the use case of\n subgraph indexing and querying. The {SubgraphService} contract implements the flows described in the Data\n Service framework to allow indexers to register as subgraph service providers, create allocations to signal\n their commitment to index a subgraph, and collect fees for indexing and querying services.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": false, + "id": 15634, + "linearizedBaseContracts": [15634, 1620, 1557], + "name": "ISubgraphService", + "nameLocation": "1118:16:60", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "ISubgraphService.Indexer", + "documentation": { + "id": 15387, + "nodeType": "StructuredDocumentation", + "src": "1161:259:60", + "text": " @notice Indexer details\n @param registeredAt The timestamp when the indexer registered\n @param url The URL where the indexer can be reached at for queries\n @param geoHash The indexer's geo location, expressed as a geo hash" + }, + "id": 15394, + "members": [ + { + "constant": false, + "id": 15389, + "mutability": "mutable", + "name": "registeredAt", + "nameLocation": "1458:12:60", + "nodeType": "VariableDeclaration", + "scope": 15394, + "src": "1450:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15388, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1450:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15391, + "mutability": "mutable", + "name": "url", + "nameLocation": "1487:3:60", + "nodeType": "VariableDeclaration", + "scope": 15394, + "src": "1480:10:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + }, + "typeName": { + "id": 15390, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1480:6:60", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15393, + "mutability": "mutable", + "name": "geoHash", + "nameLocation": "1507:7:60", + "nodeType": "VariableDeclaration", + "scope": 15394, + "src": "1500:14:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + }, + "typeName": { + "id": 15392, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1500:6:60", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "name": "Indexer", + "nameLocation": "1432:7:60", + "nodeType": "StructDefinition", + "scope": 15634, + "src": "1425:96:60", + "visibility": "public" + }, + { + "anonymous": false, + "documentation": { + "id": 15395, + "nodeType": "StructuredDocumentation", + "src": "1527:471:60", + "text": " @notice Emitted when a subgraph service collects query fees from Graph Payments\n @param serviceProvider The address of the service provider\n @param payer The address paying for the query fees\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment\n @param tokensCollected The amount of tokens collected\n @param tokensCurators The amount of tokens curators receive" + }, + "eventSelector": "184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba2", + "id": 15409, + "name": "QueryFeesCollected", + "nameLocation": "2009:18:60", + "nodeType": "EventDefinition", + "parameters": { + "id": 15408, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15397, + "indexed": true, + "mutability": "mutable", + "name": "serviceProvider", + "nameLocation": "2053:15:60", + "nodeType": "VariableDeclaration", + "scope": 15409, + "src": "2037:31:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15396, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2037:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15399, + "indexed": true, + "mutability": "mutable", + "name": "payer", + "nameLocation": "2094:5:60", + "nodeType": "VariableDeclaration", + "scope": 15409, + "src": "2078:21:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15398, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2078:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15401, + "indexed": true, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "2125:12:60", + "nodeType": "VariableDeclaration", + "scope": 15409, + "src": "2109:28:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15400, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2109:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15403, + "indexed": false, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "2155:20:60", + "nodeType": "VariableDeclaration", + "scope": 15409, + "src": "2147:28:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15402, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2147:7:60", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15405, + "indexed": false, + "mutability": "mutable", + "name": "tokensCollected", + "nameLocation": "2193:15:60", + "nodeType": "VariableDeclaration", + "scope": 15409, + "src": "2185:23:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15404, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2185:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15407, + "indexed": false, + "mutability": "mutable", + "name": "tokensCurators", + "nameLocation": "2226:14:60", + "nodeType": "VariableDeclaration", + "scope": 15409, + "src": "2218:22:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15406, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2218:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2027:219:60" + }, + "src": "2003:244:60" + }, + { + "anonymous": false, + "documentation": { + "id": 15410, + "nodeType": "StructuredDocumentation", + "src": "2253:207:60", + "text": " @notice Emitted when an indexer sets a new payments destination\n @param indexer The address of the indexer\n @param paymentsDestination The address where payments should be sent" + }, + "eventSelector": "003215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c1", + "id": 15416, + "name": "PaymentsDestinationSet", + "nameLocation": "2471:22:60", + "nodeType": "EventDefinition", + "parameters": { + "id": 15415, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15412, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "2510:7:60", + "nodeType": "VariableDeclaration", + "scope": 15416, + "src": "2494:23:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15411, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2494:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15414, + "indexed": true, + "mutability": "mutable", + "name": "paymentsDestination", + "nameLocation": "2535:19:60", + "nodeType": "VariableDeclaration", + "scope": 15416, + "src": "2519:35:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15413, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2519:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2493:62:60" + }, + "src": "2465:91:60" + }, + { + "anonymous": false, + "documentation": { + "id": 15417, + "nodeType": "StructuredDocumentation", + "src": "2562:115:60", + "text": " @notice Emitted when the stake to fees ratio is set.\n @param ratio The stake to fees ratio" + }, + "eventSelector": "2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd23", + "id": 15421, + "name": "StakeToFeesRatioSet", + "nameLocation": "2688:19:60", + "nodeType": "EventDefinition", + "parameters": { + "id": 15420, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15419, + "indexed": false, + "mutability": "mutable", + "name": "ratio", + "nameLocation": "2716:5:60", + "nodeType": "VariableDeclaration", + "scope": 15421, + "src": "2708:13:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15418, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2708:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2707:15:60" + }, + "src": "2682:41:60" + }, + { + "anonymous": false, + "documentation": { + "id": 15422, + "nodeType": "StructuredDocumentation", + "src": "2729:103:60", + "text": " @notice Emitted when curator cuts are set\n @param curationCut The curation cut" + }, + "eventSelector": "6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9", + "id": 15426, + "name": "CurationCutSet", + "nameLocation": "2843:14:60", + "nodeType": "EventDefinition", + "parameters": { + "id": 15425, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15424, + "indexed": false, + "mutability": "mutable", + "name": "curationCut", + "nameLocation": "2866:11:60", + "nodeType": "VariableDeclaration", + "scope": 15426, + "src": "2858:19:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15423, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2858:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2857:21:60" + }, + "src": "2837:42:60" + }, + { + "documentation": { + "id": 15427, + "nodeType": "StructuredDocumentation", + "src": "2885:146:60", + "text": " @notice Thrown when trying to set a curation cut that is not a valid PPM value\n @param curationCut The curation cut value" + }, + "errorSelector": "1c9c717b", + "id": 15431, + "name": "SubgraphServiceInvalidCurationCut", + "nameLocation": "3042:33:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15430, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15429, + "mutability": "mutable", + "name": "curationCut", + "nameLocation": "3084:11:60", + "nodeType": "VariableDeclaration", + "scope": 15431, + "src": "3076:19:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15428, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3076:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3075:21:60" + }, + "src": "3036:61:60" + }, + { + "documentation": { + "id": 15432, + "nodeType": "StructuredDocumentation", + "src": "3103:85:60", + "text": " @notice Thrown when an indexer tries to register with an empty URL" + }, + "errorSelector": "f0708720", + "id": 15434, + "name": "SubgraphServiceEmptyUrl", + "nameLocation": "3199:23:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15433, + "nodeType": "ParameterList", + "parameters": [], + "src": "3222:2:60" + }, + "src": "3193:32:60" + }, + { + "documentation": { + "id": 15435, + "nodeType": "StructuredDocumentation", + "src": "3231:89:60", + "text": " @notice Thrown when an indexer tries to register with an empty geohash" + }, + "errorSelector": "798ef654", + "id": 15437, + "name": "SubgraphServiceEmptyGeohash", + "nameLocation": "3331:27:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15436, + "nodeType": "ParameterList", + "parameters": [], + "src": "3358:2:60" + }, + "src": "3325:36:60" + }, + { + "documentation": { + "id": 15438, + "nodeType": "StructuredDocumentation", + "src": "3367:99:60", + "text": " @notice Thrown when an indexer tries to register but they are already registered" + }, + "errorSelector": "341a19b4", + "id": 15440, + "name": "SubgraphServiceIndexerAlreadyRegistered", + "nameLocation": "3477:39:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15439, + "nodeType": "ParameterList", + "parameters": [], + "src": "3516:2:60" + }, + "src": "3471:48:60" + }, + { + "documentation": { + "id": 15441, + "nodeType": "StructuredDocumentation", + "src": "3525:179:60", + "text": " @notice Thrown when an indexer tries to perform an operation but they are not registered\n @param indexer The address of the indexer that is not registered" + }, + "errorSelector": "ee271899", + "id": 15445, + "name": "SubgraphServiceIndexerNotRegistered", + "nameLocation": "3715:35:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15444, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15443, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "3759:7:60", + "nodeType": "VariableDeclaration", + "scope": 15445, + "src": "3751:15:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15442, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3751:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3750:17:60" + }, + "src": "3709:59:60" + }, + { + "documentation": { + "id": 15446, + "nodeType": "StructuredDocumentation", + "src": "3774:168:60", + "text": " @notice Thrown when an indexer tries to collect fees for an unsupported payment type\n @param paymentType The payment type that is not supported" + }, + "errorSelector": "47031cf0", + "id": 15451, + "name": "SubgraphServiceInvalidPaymentType", + "nameLocation": "3953:33:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15450, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15449, + "mutability": "mutable", + "name": "paymentType", + "nameLocation": "4015:11:60", + "nodeType": "VariableDeclaration", + "scope": 15451, + "src": "3987:39:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + }, + "typeName": { + "id": 15448, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15447, + "name": "IGraphPayments.PaymentTypes", + "nameLocations": ["3987:14:60", "4002:12:60"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2433, + "src": "3987:27:60" + }, + "referencedDeclaration": 2433, + "src": "3987:27:60", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + }, + "visibility": "internal" + } + ], + "src": "3986:41:60" + }, + "src": "3947:81:60" + }, + { + "documentation": { + "id": 15452, + "nodeType": "StructuredDocumentation", + "src": "4034:264:60", + "text": " @notice Thrown when the contract GRT balance is inconsistent after collecting from Graph Payments\n @param balanceBefore The contract GRT balance before the collection\n @param balanceAfter The contract GRT balance after the collection" + }, + "errorSelector": "9db8bc95", + "id": 15458, + "name": "SubgraphServiceInconsistentCollection", + "nameLocation": "4309:37:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15457, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15454, + "mutability": "mutable", + "name": "balanceBefore", + "nameLocation": "4355:13:60", + "nodeType": "VariableDeclaration", + "scope": 15458, + "src": "4347:21:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15453, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4347:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15456, + "mutability": "mutable", + "name": "balanceAfter", + "nameLocation": "4378:12:60", + "nodeType": "VariableDeclaration", + "scope": 15458, + "src": "4370:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15455, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4370:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4346:45:60" + }, + "src": "4303:89:60" + }, + { + "documentation": { + "id": 15459, + "nodeType": "StructuredDocumentation", + "src": "4398:249:60", + "text": " @notice @notice Thrown when the service provider in the RAV does not match the expected indexer.\n @param providedIndexer The address of the provided indexer.\n @param expectedIndexer The address of the expected indexer." + }, + "errorSelector": "1a071d07", + "id": 15465, + "name": "SubgraphServiceIndexerMismatch", + "nameLocation": "4658:30:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15464, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15461, + "mutability": "mutable", + "name": "providedIndexer", + "nameLocation": "4697:15:60", + "nodeType": "VariableDeclaration", + "scope": 15465, + "src": "4689:23:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15460, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4689:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15463, + "mutability": "mutable", + "name": "expectedIndexer", + "nameLocation": "4722:15:60", + "nodeType": "VariableDeclaration", + "scope": 15465, + "src": "4714:23:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15462, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4714:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "4688:50:60" + }, + "src": "4652:87:60" + }, + { + "documentation": { + "id": 15466, + "nodeType": "StructuredDocumentation", + "src": "4745:223:60", + "text": " @notice Thrown when the indexer in the allocation state does not match the expected indexer.\n @param indexer The address of the expected indexer.\n @param allocationId The id of the allocation." + }, + "errorSelector": "c0bbff13", + "id": 15472, + "name": "SubgraphServiceAllocationNotAuthorized", + "nameLocation": "4979:38:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15471, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15468, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "5026:7:60", + "nodeType": "VariableDeclaration", + "scope": 15472, + "src": "5018:15:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15467, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5018:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15470, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5043:12:60", + "nodeType": "VariableDeclaration", + "scope": 15472, + "src": "5035:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15469, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5035:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5017:39:60" + }, + "src": "4973:84:60" + }, + { + "documentation": { + "id": 15473, + "nodeType": "StructuredDocumentation", + "src": "5063:245:60", + "text": " @notice Thrown when collecting a RAV where the RAV indexer is not the same as the allocation indexer\n @param ravIndexer The address of the RAV indexer\n @param allocationIndexer The address of the allocation indexer" + }, + "errorSelector": "8a11f7ee", + "id": 15479, + "name": "SubgraphServiceInvalidRAV", + "nameLocation": "5319:25:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15478, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15475, + "mutability": "mutable", + "name": "ravIndexer", + "nameLocation": "5353:10:60", + "nodeType": "VariableDeclaration", + "scope": 15479, + "src": "5345:18:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15474, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5345:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15477, + "mutability": "mutable", + "name": "allocationIndexer", + "nameLocation": "5373:17:60", + "nodeType": "VariableDeclaration", + "scope": 15479, + "src": "5365:25:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15476, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5365:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5344:47:60" + }, + "src": "5313:79:60" + }, + { + "documentation": { + "id": 15480, + "nodeType": "StructuredDocumentation", + "src": "5398:182:60", + "text": " @notice Thrown when trying to force close an allocation that is not stale and the indexer is not over-allocated\n @param allocationId The id of the allocation" + }, + "errorSelector": "068ef6a0", + "id": 15484, + "name": "SubgraphServiceCannotForceCloseAllocation", + "nameLocation": "5591:41:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15483, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15482, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5641:12:60", + "nodeType": "VariableDeclaration", + "scope": 15484, + "src": "5633:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15481, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5633:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5632:22:60" + }, + "src": "5585:70:60" + }, + { + "documentation": { + "id": 15485, + "nodeType": "StructuredDocumentation", + "src": "5661:137:60", + "text": " @notice Thrown when trying to force close an altruistic allocation\n @param allocationId The id of the allocation" + }, + "errorSelector": "be3d9ae8", + "id": 15489, + "name": "SubgraphServiceAllocationIsAltruistic", + "nameLocation": "5809:37:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15488, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15487, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5855:12:60", + "nodeType": "VariableDeclaration", + "scope": 15489, + "src": "5847:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15486, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5847:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5846:22:60" + }, + "src": "5803:66:60" + }, + { + "documentation": { + "id": 15490, + "nodeType": "StructuredDocumentation", + "src": "5875:80:60", + "text": " @notice Thrown when trying to set stake to fees ratio to zero" + }, + "errorSelector": "bc71a043", + "id": 15492, + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "nameLocation": "5966:42:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15491, + "nodeType": "ParameterList", + "parameters": [], + "src": "6008:2:60" + }, + "src": "5960:51:60" + }, + { + "documentation": { + "id": 15493, + "nodeType": "StructuredDocumentation", + "src": "6017:118:60", + "text": " @notice Thrown when collectionId is not a valid address\n @param collectionId The collectionId" + }, + "errorSelector": "fa4ac7a7", + "id": 15497, + "name": "SubgraphServiceInvalidCollectionId", + "nameLocation": "6146:34:60", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15496, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15495, + "mutability": "mutable", + "name": "collectionId", + "nameLocation": "6189:12:60", + "nodeType": "VariableDeclaration", + "scope": 15497, + "src": "6181:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15494, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6181:7:60", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "6180:22:60" + }, + "src": "6140:63:60" + }, + { + "documentation": { + "id": 15498, + "nodeType": "StructuredDocumentation", + "src": "6209:589:60", + "text": " @notice Initialize the contract\n @dev The thawingPeriod and verifierCut ranges are not set here because they are variables\n on the DisputeManager. We use the {ProvisionManager} overrideable getters to get the ranges.\n @param owner The owner of the contract\n @param minimumProvisionTokens The minimum amount of provisioned tokens required to create an allocation\n @param maximumDelegationRatio The maximum delegation ratio allowed for an allocation\n @param stakeToFeesRatio The ratio of stake to fees to lock when collecting query fees" + }, + "functionSelector": "c84a5ef3", + "id": 15509, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "initialize", + "nameLocation": "6812:10:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15507, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15500, + "mutability": "mutable", + "name": "owner", + "nameLocation": "6840:5:60", + "nodeType": "VariableDeclaration", + "scope": 15509, + "src": "6832:13:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15499, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6832:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15502, + "mutability": "mutable", + "name": "minimumProvisionTokens", + "nameLocation": "6863:22:60", + "nodeType": "VariableDeclaration", + "scope": 15509, + "src": "6855:30:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15501, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6855:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15504, + "mutability": "mutable", + "name": "maximumDelegationRatio", + "nameLocation": "6902:22:60", + "nodeType": "VariableDeclaration", + "scope": 15509, + "src": "6895:29:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15503, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "6895:6:60", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15506, + "mutability": "mutable", + "name": "stakeToFeesRatio", + "nameLocation": "6942:16:60", + "nodeType": "VariableDeclaration", + "scope": 15509, + "src": "6934:24:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15505, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6934:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6822:142:60" + }, + "returnParameters": { + "id": 15508, + "nodeType": "ParameterList", + "parameters": [], + "src": "6973:0:60" + }, + "scope": 15634, + "src": "6803:171:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15510, + "nodeType": "StructuredDocumentation", + "src": "6980:495:60", + "text": " @notice Force close a stale allocation\n @dev This function can be permissionlessly called when the allocation is stale. This\n ensures that rewards for other allocations are not diluted by an inactive allocation.\n Requirements:\n - Allocation must exist and be open\n - Allocation must be stale\n - Allocation cannot be altruistic\n Emits a {AllocationClosed} event.\n @param allocationId The id of the allocation" + }, + "functionSelector": "ec9c218d", + "id": 15515, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "closeStaleAllocation", + "nameLocation": "7489:20:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15513, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15512, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "7518:12:60", + "nodeType": "VariableDeclaration", + "scope": 15515, + "src": "7510:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15511, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7510:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7509:22:60" + }, + "returnParameters": { + "id": 15514, + "nodeType": "ParameterList", + "parameters": [], + "src": "7540:0:60" + }, + "scope": 15634, + "src": "7480:61:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15516, + "nodeType": "StructuredDocumentation", + "src": "7547:681:60", + "text": " @notice Change the amount of tokens in an allocation\n @dev Requirements:\n - The indexer must be registered\n - The provision must be valid according to the subgraph service rules\n - `tokens` must be different from the current allocation size\n - The indexer must have enough available tokens to allocate if they are upsizing the allocation\n Emits a {AllocationResized} event.\n See {AllocationManager-_resizeAllocation} for more details.\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param tokens The new amount of tokens in the allocation" + }, + "functionSelector": "81e777a7", + "id": 15525, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "resizeAllocation", + "nameLocation": "8242:16:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15523, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15518, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "8267:7:60", + "nodeType": "VariableDeclaration", + "scope": 15525, + "src": "8259:15:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15517, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8259:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15520, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "8284:12:60", + "nodeType": "VariableDeclaration", + "scope": 15525, + "src": "8276:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15519, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8276:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15522, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "8306:6:60", + "nodeType": "VariableDeclaration", + "scope": 15525, + "src": "8298:14:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15521, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8298:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8258:55:60" + }, + "returnParameters": { + "id": 15524, + "nodeType": "ParameterList", + "parameters": [], + "src": "8322:0:60" + }, + "scope": 15634, + "src": "8233:90:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15526, + "nodeType": "StructuredDocumentation", + "src": "8329:398:60", + "text": " @notice Imports a legacy allocation id into the subgraph service\n This is a governor only action that is required to prevent indexers from re-using allocation ids from the\n legacy staking contract.\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment" + }, + "functionSelector": "7dfe6d28", + "id": 15535, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "migrateLegacyAllocation", + "nameLocation": "8741:23:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15533, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15528, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "8773:7:60", + "nodeType": "VariableDeclaration", + "scope": 15535, + "src": "8765:15:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15527, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8765:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15530, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "8790:12:60", + "nodeType": "VariableDeclaration", + "scope": 15535, + "src": "8782:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15529, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8782:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15532, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "8812:20:60", + "nodeType": "VariableDeclaration", + "scope": 15535, + "src": "8804:28:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15531, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8804:7:60", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "8764:69:60" + }, + "returnParameters": { + "id": 15534, + "nodeType": "ParameterList", + "parameters": [], + "src": "8842:0:60" + }, + "scope": 15634, + "src": "8732:111:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15536, + "nodeType": "StructuredDocumentation", + "src": "8849:209:60", + "text": " @notice Sets a pause guardian\n @param pauseGuardian The address of the pause guardian\n @param allowed True if the pause guardian is allowed to pause the contract, false otherwise" + }, + "functionSelector": "35577962", + "id": 15543, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setPauseGuardian", + "nameLocation": "9072:16:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15541, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15538, + "mutability": "mutable", + "name": "pauseGuardian", + "nameLocation": "9097:13:60", + "nodeType": "VariableDeclaration", + "scope": 15543, + "src": "9089:21:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15537, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9089:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15540, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "9117:7:60", + "nodeType": "VariableDeclaration", + "scope": 15543, + "src": "9112:12:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15539, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9112:4:60", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "9088:37:60" + }, + "returnParameters": { + "id": 15542, + "nodeType": "ParameterList", + "parameters": [], + "src": "9134:0:60" + }, + "scope": 15634, + "src": "9063:72:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15544, + "nodeType": "StructuredDocumentation", + "src": "9141:216:60", + "text": " @notice Sets the minimum amount of provisioned tokens required to create an allocation\n @param minimumProvisionTokens The minimum amount of provisioned tokens required to create an allocation" + }, + "functionSelector": "832bc923", + "id": 15549, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMinimumProvisionTokens", + "nameLocation": "9371:25:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15547, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15546, + "mutability": "mutable", + "name": "minimumProvisionTokens", + "nameLocation": "9405:22:60", + "nodeType": "VariableDeclaration", + "scope": 15549, + "src": "9397:30:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15545, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9397:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9396:32:60" + }, + "returnParameters": { + "id": 15548, + "nodeType": "ParameterList", + "parameters": [], + "src": "9437:0:60" + }, + "scope": 15634, + "src": "9362:76:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15550, + "nodeType": "StructuredDocumentation", + "src": "9444:103:60", + "text": " @notice Sets the delegation ratio\n @param delegationRatio The delegation ratio" + }, + "functionSelector": "1dd42f60", + "id": 15555, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setDelegationRatio", + "nameLocation": "9561:18:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15553, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15552, + "mutability": "mutable", + "name": "delegationRatio", + "nameLocation": "9587:15:60", + "nodeType": "VariableDeclaration", + "scope": 15555, + "src": "9580:22:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 15551, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "9580:6:60", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "9579:24:60" + }, + "returnParameters": { + "id": 15554, + "nodeType": "ParameterList", + "parameters": [], + "src": "9612:0:60" + }, + "scope": 15634, + "src": "9552:61:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15556, + "nodeType": "StructuredDocumentation", + "src": "9619:110:60", + "text": " @notice Sets the stake to fees ratio\n @param stakeToFeesRatio The stake to fees ratio" + }, + "functionSelector": "e6f50054", + "id": 15561, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setStakeToFeesRatio", + "nameLocation": "9743:19:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15559, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15558, + "mutability": "mutable", + "name": "stakeToFeesRatio", + "nameLocation": "9771:16:60", + "nodeType": "VariableDeclaration", + "scope": 15561, + "src": "9763:24:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15557, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9763:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "9762:26:60" + }, + "returnParameters": { + "id": 15560, + "nodeType": "ParameterList", + "parameters": [], + "src": "9797:0:60" + }, + "scope": 15634, + "src": "9734:64:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15562, + "nodeType": "StructuredDocumentation", + "src": "9804:190:60", + "text": " @notice Sets the max POI staleness\n See {AllocationManagerV1Storage-maxPOIStaleness} for more details.\n @param maxPOIStaleness The max POI staleness in seconds" + }, + "functionSelector": "7aa31bce", + "id": 15567, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setMaxPOIStaleness", + "nameLocation": "10008:18:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15565, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15564, + "mutability": "mutable", + "name": "maxPOIStaleness", + "nameLocation": "10035:15:60", + "nodeType": "VariableDeclaration", + "scope": 15567, + "src": "10027:23:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15563, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10027:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10026:25:60" + }, + "returnParameters": { + "id": 15566, + "nodeType": "ParameterList", + "parameters": [], + "src": "10060:0:60" + }, + "scope": 15634, + "src": "9999:62:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15568, + "nodeType": "StructuredDocumentation", + "src": "10067:177:60", + "text": " @notice Sets the curators payment cut for query fees\n @dev Emits a {CuratorCutSet} event\n @param curationCut The curation cut for the payment type" + }, + "functionSelector": "7e89bac3", + "id": 15573, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setCurationCut", + "nameLocation": "10258:14:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15571, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15570, + "mutability": "mutable", + "name": "curationCut", + "nameLocation": "10281:11:60", + "nodeType": "VariableDeclaration", + "scope": 15573, + "src": "10273:19:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15569, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10273:7:60", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "10272:21:60" + }, + "returnParameters": { + "id": 15572, + "nodeType": "ParameterList", + "parameters": [], + "src": "10302:0:60" + }, + "scope": 15634, + "src": "10249:54:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15574, + "nodeType": "StructuredDocumentation", + "src": "10309:218:60", + "text": " @notice Sets the payments destination for an indexer to receive payments\n @dev Emits a {PaymentsDestinationSet} event\n @param paymentsDestination The address where payments should be sent" + }, + "functionSelector": "6ccec5b8", + "id": 15579, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "setPaymentsDestination", + "nameLocation": "10541:22:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15577, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15576, + "mutability": "mutable", + "name": "paymentsDestination", + "nameLocation": "10572:19:60", + "nodeType": "VariableDeclaration", + "scope": 15579, + "src": "10564:27:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15575, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10564:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "10563:29:60" + }, + "returnParameters": { + "id": 15578, + "nodeType": "ParameterList", + "parameters": [], + "src": "10601:0:60" + }, + "scope": 15634, + "src": "10532:70:60", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15580, + "nodeType": "StructuredDocumentation", + "src": "10608:206:60", + "text": " @notice Gets the details of an allocation\n For legacy allocations use {getLegacyAllocation}\n @param allocationId The id of the allocation\n @return The allocation details" + }, + "functionSelector": "0e022923", + "id": 15588, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getAllocation", + "nameLocation": "10828:13:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15583, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15582, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "10850:12:60", + "nodeType": "VariableDeclaration", + "scope": 15588, + "src": "10842:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15581, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10842:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "10841:22:60" + }, + "returnParameters": { + "id": 15587, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15586, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15588, + "src": "10887:23:60", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15585, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15584, + "name": "Allocation.State", + "nameLocations": ["10887:10:60", "10898:5:60"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "10887:16:60" + }, + "referencedDeclaration": 15663, + "src": "10887:16:60", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "10886:25:60" + }, + "scope": 15634, + "src": "10819:93:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15589, + "nodeType": "StructuredDocumentation", + "src": "10918:217:60", + "text": " @notice Gets the details of a legacy allocation\n For non-legacy allocations use {getAllocation}\n @param allocationId The id of the allocation\n @return The legacy allocation details" + }, + "functionSelector": "6d9a3951", + "id": 15597, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getLegacyAllocation", + "nameLocation": "11149:19:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15592, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15591, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "11177:12:60", + "nodeType": "VariableDeclaration", + "scope": 15597, + "src": "11169:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15590, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11169:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "11168:22:60" + }, + "returnParameters": { + "id": 15596, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15595, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15597, + "src": "11214:29:60", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_memory_ptr", + "typeString": "struct LegacyAllocation.State" + }, + "typeName": { + "id": 15594, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15593, + "name": "LegacyAllocation.State", + "nameLocations": ["11214:16:60", "11231:5:60"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "11214:22:60" + }, + "referencedDeclaration": 16305, + "src": "11214:22:60", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "11213:31:60" + }, + "scope": 15634, + "src": "11140:105:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15598, + "nodeType": "StructuredDocumentation", + "src": "11251:219:60", + "text": " @notice Encodes the allocation proof for EIP712 signing\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @return The encoded allocation proof" + }, + "functionSelector": "ce56c98b", + "id": 15607, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "encodeAllocationProof", + "nameLocation": "11484:21:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15603, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15600, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "11514:7:60", + "nodeType": "VariableDeclaration", + "scope": 15607, + "src": "11506:15:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15599, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11506:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15602, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "11531:12:60", + "nodeType": "VariableDeclaration", + "scope": 15607, + "src": "11523:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15601, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11523:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "11505:39:60" + }, + "returnParameters": { + "id": 15606, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15605, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15607, + "src": "11568:7:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15604, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "11568:7:60", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "11567:9:60" + }, + "scope": 15634, + "src": "11475:102:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15608, + "nodeType": "StructuredDocumentation", + "src": "11583:187:60", + "text": " @notice Checks if an indexer is over-allocated\n @param allocationId The id of the allocation\n @return True if the indexer is over-allocated, false otherwise" + }, + "functionSelector": "ba38f67d", + "id": 15615, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isOverAllocated", + "nameLocation": "11784:15:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15611, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15610, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "11808:12:60", + "nodeType": "VariableDeclaration", + "scope": 15615, + "src": "11800:20:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15609, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11800:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "11799:22:60" + }, + "returnParameters": { + "id": 15614, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15613, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15615, + "src": "11845:4:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15612, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "11845:4:60", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "11844:6:60" + }, + "scope": 15634, + "src": "11775:76:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15616, + "nodeType": "StructuredDocumentation", + "src": "11857:116:60", + "text": " @notice Gets the address of the dispute manager\n @return The address of the dispute manager" + }, + "functionSelector": "db9bee46", + "id": 15621, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getDisputeManager", + "nameLocation": "11987:17:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15617, + "nodeType": "ParameterList", + "parameters": [], + "src": "12004:2:60" + }, + "returnParameters": { + "id": 15620, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15619, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15621, + "src": "12030:7:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15618, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12030:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12029:9:60" + }, + "scope": 15634, + "src": "11978:61:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15622, + "nodeType": "StructuredDocumentation", + "src": "12045:128:60", + "text": " @notice Gets the address of the graph tally collector\n @return The address of the graph tally collector" + }, + "functionSelector": "ebf6ddaf", + "id": 15627, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getGraphTallyCollector", + "nameLocation": "12187:22:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15623, + "nodeType": "ParameterList", + "parameters": [], + "src": "12209:2:60" + }, + "returnParameters": { + "id": 15626, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15625, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15627, + "src": "12235:7:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15624, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12235:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12234:9:60" + }, + "scope": 15634, + "src": "12178:66:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 15628, + "nodeType": "StructuredDocumentation", + "src": "12250:120:60", + "text": " @notice Gets the address of the curation contract\n @return The address of the curation contract" + }, + "functionSelector": "c0f47497", + "id": 15633, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "getCuration", + "nameLocation": "12384:11:60", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15629, + "nodeType": "ParameterList", + "parameters": [], + "src": "12395:2:60" + }, + "returnParameters": { + "id": 15632, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15631, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15633, + "src": "12421:7:60", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15630, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12421:7:60", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "12420:9:60" + }, + "scope": 15634, + "src": "12375:55:60", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 15635, + "src": "1108:11324:60", + "usedErrors": [ + 1610, 1613, 15431, 15434, 15437, 15440, 15445, 15451, 15458, 15465, 15472, 15479, 15484, 15489, 15492, + 15497 + ], + "usedEvents": [1437, 1442, 1449, 1456, 1466, 1473, 1585, 1596, 1605, 15409, 15416, 15421, 15426] + } + ], + "src": "45:12388:60" + }, + "id": 60 + }, + "contracts/libraries/Allocation.sol": { + "ast": { + "absolutePath": "contracts/libraries/Allocation.sol", + "exportedSymbols": { + "Allocation": [16033], + "Math": [9938] + }, + "id": 16034, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 15636, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:61" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/math/Math.sol", + "file": "@openzeppelin/contracts/utils/math/Math.sol", + "id": 15638, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 16034, + "sourceUnit": 9939, + "src": "70:67:61", + "symbolAliases": [ + { + "foreign": { + "id": 15637, + "name": "Math", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9938, + "src": "79:4:61", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Allocation", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 15639, + "nodeType": "StructuredDocumentation", + "src": "139:220:61", + "text": " @title Allocation library\n @notice A library to handle Allocations.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 16033, + "linearizedBaseContracts": [16033], + "name": "Allocation", + "nameLocation": "368:10:61", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 15643, + "libraryName": { + "id": 15640, + "name": "Allocation", + "nameLocations": ["391:10:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16033, + "src": "391:10:61" + }, + "nodeType": "UsingForDirective", + "src": "385:27:61", + "typeName": { + "id": 15642, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15641, + "name": "State", + "nameLocations": ["406:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "406:5:61" + }, + "referencedDeclaration": 15663, + "src": "406:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + { + "canonicalName": "Allocation.State", + "documentation": { + "id": 15644, + "nodeType": "StructuredDocumentation", + "src": "418:723:61", + "text": " @notice Allocation details\n @param indexer The indexer that owns the allocation\n @param subgraphDeploymentId The subgraph deployment id the allocation is for\n @param tokens The number of tokens allocated\n @param createdAt The timestamp when the allocation was created\n @param closedAt The timestamp when the allocation was closed\n @param lastPOIPresentedAt The timestamp when the last POI was presented\n @param accRewardsPerAllocatedToken The accumulated rewards per allocated token\n @param accRewardsPending The accumulated rewards that are pending to be claimed due allocation resize\n @param createdAtEpoch The epoch when the allocation was created" + }, + "id": 15663, + "members": [ + { + "constant": false, + "id": 15646, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "1177:7:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1169:15:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15645, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1169:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15648, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "1202:20:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1194:28:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15647, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1194:7:61", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15650, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "1240:6:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1232:14:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15649, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1232:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15652, + "mutability": "mutable", + "name": "createdAt", + "nameLocation": "1264:9:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1256:17:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15651, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1256:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15654, + "mutability": "mutable", + "name": "closedAt", + "nameLocation": "1291:8:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1283:16:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15653, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1283:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15656, + "mutability": "mutable", + "name": "lastPOIPresentedAt", + "nameLocation": "1317:18:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1309:26:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15655, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1309:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15658, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "1353:27:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1345:35:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15657, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1345:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15660, + "mutability": "mutable", + "name": "accRewardsPending", + "nameLocation": "1398:17:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1390:25:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15659, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1390:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15662, + "mutability": "mutable", + "name": "createdAtEpoch", + "nameLocation": "1433:14:61", + "nodeType": "VariableDeclaration", + "scope": 15663, + "src": "1425:22:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15661, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1425:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "name": "State", + "nameLocation": "1153:5:61", + "nodeType": "StructDefinition", + "scope": 16033, + "src": "1146:308:61", + "visibility": "public" + }, + { + "documentation": { + "id": 15664, + "nodeType": "StructuredDocumentation", + "src": "1460:138:61", + "text": " @notice Thrown when attempting to create an allocation with an existing id\n @param allocationId The allocation id" + }, + "errorSelector": "0bc4def5", + "id": 15668, + "name": "AllocationAlreadyExists", + "nameLocation": "1609:23:61", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15667, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15666, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "1641:12:61", + "nodeType": "VariableDeclaration", + "scope": 15668, + "src": "1633:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15665, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1633:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1632:22:61" + }, + "src": "1603:52:61" + }, + { + "documentation": { + "id": 15669, + "nodeType": "StructuredDocumentation", + "src": "1661:143:61", + "text": " @notice Thrown when trying to perform an operation on a non-existent allocation\n @param allocationId The allocation id" + }, + "errorSelector": "42daadaf", + "id": 15673, + "name": "AllocationDoesNotExist", + "nameLocation": "1815:22:61", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15672, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15671, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "1846:12:61", + "nodeType": "VariableDeclaration", + "scope": 15673, + "src": "1838:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15670, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1838:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1837:22:61" + }, + "src": "1809:51:61" + }, + { + "documentation": { + "id": 15674, + "nodeType": "StructuredDocumentation", + "src": "1866:205:61", + "text": " @notice Thrown when trying to perform an operation on a closed allocation\n @param allocationId The allocation id\n @param closedAt The timestamp when the allocation was closed" + }, + "errorSelector": "61b66e0d", + "id": 15680, + "name": "AllocationClosed", + "nameLocation": "2082:16:61", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 15679, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15676, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "2107:12:61", + "nodeType": "VariableDeclaration", + "scope": 15680, + "src": "2099:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15675, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2099:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15678, + "mutability": "mutable", + "name": "closedAt", + "nameLocation": "2129:8:61", + "nodeType": "VariableDeclaration", + "scope": 15680, + "src": "2121:16:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15677, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2121:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2098:40:61" + }, + "src": "2076:63:61" + }, + { + "body": { + "id": 15740, + "nodeType": "Block", + "src": "3043:579:61", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 15710, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3061:28:61", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "baseExpression": { + "id": 15705, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15686, + "src": "3062:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 15707, + "indexExpression": { + "id": 15706, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15690, + "src": "3067:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3062:18:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "id": 15708, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3081:6:61", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 15961, + "src": "3062:25:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15709, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3062:27:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 15712, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15690, + "src": "3115:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 15711, + "name": "AllocationAlreadyExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15668, + "src": "3091:23:61", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 15713, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3091:37:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 15704, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3053:7:61", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 15714, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3053:76:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 15715, + "nodeType": "ExpressionStatement", + "src": "3053:76:61" + }, + { + "assignments": [15718], + "declarations": [ + { + "constant": false, + "id": 15718, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "3153:10:61", + "nodeType": "VariableDeclaration", + "scope": 15740, + "src": "3140:23:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15717, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15716, + "name": "State", + "nameLocations": ["3140:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "3140:5:61" + }, + "referencedDeclaration": 15663, + "src": "3140:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 15731, + "initialValue": { + "arguments": [ + { + "id": 15720, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15688, + "src": "3195:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 15721, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15692, + "src": "3238:20:61", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 15722, + "name": "tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15694, + "src": "3280:6:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 15723, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "3311:5:61", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 15724, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3317:9:61", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "3311:15:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "30", + "id": 15725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3350:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "hexValue": "30", + "id": 15726, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3385:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "id": 15727, + "name": "accRewardsPerAllocatedToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15696, + "src": "3429:27:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "30", + "id": 15728, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3489:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "id": 15729, + "name": "createdAtEpoch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15698, + "src": "3520:14:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 15719, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15663, + "src": "3166:5:61", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_State_$15663_storage_ptr_$", + "typeString": "type(struct Allocation.State storage pointer)" + } + }, + "id": 15730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": [ + "3186:7:61", + "3216:20:61", + "3272:6:61", + "3300:9:61", + "3340:8:61", + "3365:18:61", + "3400:27:61", + "3470:17:61", + "3504:14:61" + ], + "names": [ + "indexer", + "subgraphDeploymentId", + "tokens", + "createdAt", + "closedAt", + "lastPOIPresentedAt", + "accRewardsPerAllocatedToken", + "accRewardsPending", + "createdAtEpoch" + ], + "nodeType": "FunctionCall", + "src": "3166:379:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3140:405:61" + }, + { + "expression": { + "id": 15736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 15732, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15686, + "src": "3556:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 15734, + "indexExpression": { + "id": 15733, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15690, + "src": "3561:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3556:18:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 15735, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15718, + "src": "3577:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "src": "3556:31:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "id": 15737, + "nodeType": "ExpressionStatement", + "src": "3556:31:61" + }, + { + "expression": { + "id": 15738, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15718, + "src": "3605:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "functionReturnParameters": 15703, + "id": 15739, + "nodeType": "Return", + "src": "3598:17:61" + } + ] + }, + "documentation": { + "id": 15681, + "nodeType": "StructuredDocumentation", + "src": "2145:597:61", + "text": " @notice Create a new allocation\n @dev Requirements:\n - The allocation must not exist\n @param self The allocation list mapping\n @param indexer The indexer that owns the allocation\n @param allocationId The allocation id\n @param subgraphDeploymentId The subgraph deployment id the allocation is for\n @param tokens The number of tokens allocated\n @param accRewardsPerAllocatedToken The initial accumulated rewards per allocated token\n @param createdAtEpoch The epoch when the allocation was created\n @return The allocation" + }, + "id": 15741, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "create", + "nameLocation": "2756:6:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15699, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15686, + "mutability": "mutable", + "name": "self", + "nameLocation": "2806:4:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2772:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 15685, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 15682, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2780:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "2772:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 15684, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15683, + "name": "State", + "nameLocations": ["2791:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "2791:5:61" + }, + "referencedDeclaration": 15663, + "src": "2791:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15688, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "2828:7:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2820:15:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15687, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2820:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15690, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "2853:12:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2845:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15689, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2845:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15692, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "2883:20:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2875:28:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 15691, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2875:7:61", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15694, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2921:6:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2913:14:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15693, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2913:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15696, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "2945:27:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2937:35:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15695, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2937:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15698, + "mutability": "mutable", + "name": "createdAtEpoch", + "nameLocation": "2990:14:61", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "2982:22:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15697, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2982:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2762:248:61" + }, + "returnParameters": { + "id": 15703, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15702, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15741, + "src": "3029:12:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15701, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15700, + "name": "State", + "nameLocations": ["3029:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "3029:5:61" + }, + "referencedDeclaration": 15663, + "src": "3029:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "3028:14:61" + }, + "scope": 16033, + "src": "2747:875:61", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15778, + "nodeType": "Block", + "src": "3994:216:61", + "statements": [ + { + "assignments": [15754], + "declarations": [ + { + "constant": false, + "id": 15754, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "4018:10:61", + "nodeType": "VariableDeclaration", + "scope": 15778, + "src": "4004:24:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15753, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15752, + "name": "State", + "nameLocations": ["4004:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "4004:5:61" + }, + "referencedDeclaration": 15663, + "src": "4004:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 15759, + "initialValue": { + "arguments": [ + { + "id": 15756, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15747, + "src": "4036:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + { + "id": 15757, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15749, + "src": "4042:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 15755, + "name": "_get", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16032, + "src": "4031:4:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_storage_ptr_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State storage pointer)" + } + }, + "id": 15758, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4031:24:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4004:51:61" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15761, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15754, + "src": "4073:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15762, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4084:6:61", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "4073:17:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15763, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4073:19:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 15765, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15749, + "src": "4111:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 15766, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15754, + "src": "4125:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15767, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4136:8:61", + "memberName": "closedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15654, + "src": "4125:19:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 15764, + "name": "AllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15680, + "src": "4094:16:61", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$", + "typeString": "function (address,uint256) pure returns (error)" + } + }, + "id": 15768, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4094:51:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 15760, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "4065:7:61", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 15769, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4065:81:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 15770, + "nodeType": "ExpressionStatement", + "src": "4065:81:61" + }, + { + "expression": { + "id": 15776, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 15771, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15754, + "src": "4156:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15773, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "4167:18:61", + "memberName": "lastPOIPresentedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15656, + "src": "4156:29:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "id": 15774, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "4188:5:61", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 15775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4194:9:61", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "4188:15:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4156:47:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 15777, + "nodeType": "ExpressionStatement", + "src": "4156:47:61" + } + ] + }, + "documentation": { + "id": 15742, + "nodeType": "StructuredDocumentation", + "src": "3628:270:61", + "text": " @notice Present a POI for an allocation\n @dev It only updates the last POI presented timestamp.\n Requirements:\n - The allocation must be open\n @param self The allocation list mapping\n @param allocationId The allocation id" + }, + "id": 15779, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "presentPOI", + "nameLocation": "3912:10:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15750, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15747, + "mutability": "mutable", + "name": "self", + "nameLocation": "3957:4:61", + "nodeType": "VariableDeclaration", + "scope": 15779, + "src": "3923:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 15746, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 15743, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3931:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "3923:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 15745, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15744, + "name": "State", + "nameLocations": ["3942:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "3942:5:61" + }, + "referencedDeclaration": 15663, + "src": "3942:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15749, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "3971:12:61", + "nodeType": "VariableDeclaration", + "scope": 15779, + "src": "3963:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15748, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3963:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3922:62:61" + }, + "returnParameters": { + "id": 15751, + "nodeType": "ParameterList", + "parameters": [], + "src": "3994:0:61" + }, + "scope": 16033, + "src": "3903:307:61", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15817, + "nodeType": "Block", + "src": "4724:237:61", + "statements": [ + { + "assignments": [15794], + "declarations": [ + { + "constant": false, + "id": 15794, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "4748:10:61", + "nodeType": "VariableDeclaration", + "scope": 15817, + "src": "4734:24:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15793, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15792, + "name": "State", + "nameLocations": ["4734:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "4734:5:61" + }, + "referencedDeclaration": 15663, + "src": "4734:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 15799, + "initialValue": { + "arguments": [ + { + "id": 15796, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15785, + "src": "4766:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + { + "id": 15797, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15787, + "src": "4772:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 15795, + "name": "_get", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16032, + "src": "4761:4:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_storage_ptr_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State storage pointer)" + } + }, + "id": 15798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4761:24:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4734:51:61" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15801, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15794, + "src": "4803:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15802, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4814:6:61", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "4803:17:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15803, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4803:19:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 15805, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15787, + "src": "4841:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 15806, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15794, + "src": "4855:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15807, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4866:8:61", + "memberName": "closedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15654, + "src": "4855:19:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 15804, + "name": "AllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15680, + "src": "4824:16:61", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$", + "typeString": "function (address,uint256) pure returns (error)" + } + }, + "id": 15808, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4824:51:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 15800, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "4795:7:61", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 15809, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4795:81:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 15810, + "nodeType": "ExpressionStatement", + "src": "4795:81:61" + }, + { + "expression": { + "id": 15815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 15811, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15794, + "src": "4886:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15813, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "4897:27:61", + "memberName": "accRewardsPerAllocatedToken", + "nodeType": "MemberAccess", + "referencedDeclaration": 15658, + "src": "4886:38:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 15814, + "name": "accRewardsPerAllocatedToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15789, + "src": "4927:27:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4886:68:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 15816, + "nodeType": "ExpressionStatement", + "src": "4886:68:61" + } + ] + }, + "documentation": { + "id": 15780, + "nodeType": "StructuredDocumentation", + "src": "4216:340:61", + "text": " @notice Update the accumulated rewards per allocated token for an allocation\n @dev Requirements:\n - The allocation must be open\n @param self The allocation list mapping\n @param allocationId The allocation id\n @param accRewardsPerAllocatedToken The new accumulated rewards per allocated token" + }, + "id": 15818, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "snapshotRewards", + "nameLocation": "4570:15:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15790, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15785, + "mutability": "mutable", + "name": "self", + "nameLocation": "4629:4:61", + "nodeType": "VariableDeclaration", + "scope": 15818, + "src": "4595:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 15784, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 15781, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4603:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "4595:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 15783, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15782, + "name": "State", + "nameLocations": ["4614:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "4614:5:61" + }, + "referencedDeclaration": 15663, + "src": "4614:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15787, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "4651:12:61", + "nodeType": "VariableDeclaration", + "scope": 15818, + "src": "4643:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15786, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4643:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15789, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "4681:27:61", + "nodeType": "VariableDeclaration", + "scope": 15818, + "src": "4673:35:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15788, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4673:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4585:129:61" + }, + "returnParameters": { + "id": 15791, + "nodeType": "ParameterList", + "parameters": [], + "src": "4724:0:61" + }, + "scope": 16033, + "src": "4561:400:61", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15854, + "nodeType": "Block", + "src": "5324:201:61", + "statements": [ + { + "assignments": [15831], + "declarations": [ + { + "constant": false, + "id": 15831, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "5348:10:61", + "nodeType": "VariableDeclaration", + "scope": 15854, + "src": "5334:24:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15830, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15829, + "name": "State", + "nameLocations": ["5334:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "5334:5:61" + }, + "referencedDeclaration": 15663, + "src": "5334:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 15836, + "initialValue": { + "arguments": [ + { + "id": 15833, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15824, + "src": "5366:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + { + "id": 15834, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15826, + "src": "5372:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 15832, + "name": "_get", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16032, + "src": "5361:4:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_storage_ptr_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State storage pointer)" + } + }, + "id": 15835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5361:24:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5334:51:61" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15838, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15831, + "src": "5403:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15839, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5414:6:61", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "5403:17:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15840, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5403:19:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 15842, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15826, + "src": "5441:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 15843, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15831, + "src": "5455:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15844, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5466:8:61", + "memberName": "closedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15654, + "src": "5455:19:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 15841, + "name": "AllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15680, + "src": "5424:16:61", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$", + "typeString": "function (address,uint256) pure returns (error)" + } + }, + "id": 15845, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5424:51:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 15837, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5395:7:61", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 15846, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5395:81:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 15847, + "nodeType": "ExpressionStatement", + "src": "5395:81:61" + }, + { + "expression": { + "id": 15852, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 15848, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15831, + "src": "5486:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15850, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "5497:17:61", + "memberName": "accRewardsPending", + "nodeType": "MemberAccess", + "referencedDeclaration": 15660, + "src": "5486:28:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "hexValue": "30", + "id": 15851, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5517:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5486:32:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 15853, + "nodeType": "ExpressionStatement", + "src": "5486:32:61" + } + ] + }, + "documentation": { + "id": 15819, + "nodeType": "StructuredDocumentation", + "src": "4967:252:61", + "text": " @notice Update the accumulated rewards pending to be claimed for an allocation\n @dev Requirements:\n - The allocation must be open\n @param self The allocation list mapping\n @param allocationId The allocation id" + }, + "id": 15855, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "clearPendingRewards", + "nameLocation": "5233:19:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15827, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15824, + "mutability": "mutable", + "name": "self", + "nameLocation": "5287:4:61", + "nodeType": "VariableDeclaration", + "scope": 15855, + "src": "5253:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 15823, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 15820, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5261:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "5253:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 15822, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15821, + "name": "State", + "nameLocations": ["5272:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "5272:5:61" + }, + "referencedDeclaration": 15663, + "src": "5272:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15826, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5301:12:61", + "nodeType": "VariableDeclaration", + "scope": 15855, + "src": "5293:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15825, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5293:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5252:62:61" + }, + "returnParameters": { + "id": 15828, + "nodeType": "ParameterList", + "parameters": [], + "src": "5324:0:61" + }, + "scope": 16033, + "src": "5224:301:61", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15892, + "nodeType": "Block", + "src": "5823:206:61", + "statements": [ + { + "assignments": [15868], + "declarations": [ + { + "constant": false, + "id": 15868, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "5847:10:61", + "nodeType": "VariableDeclaration", + "scope": 15892, + "src": "5833:24:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15867, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15866, + "name": "State", + "nameLocations": ["5833:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "5833:5:61" + }, + "referencedDeclaration": 15663, + "src": "5833:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 15873, + "initialValue": { + "arguments": [ + { + "id": 15870, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15861, + "src": "5865:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + { + "id": 15871, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15863, + "src": "5871:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 15869, + "name": "_get", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16032, + "src": "5860:4:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_storage_ptr_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State storage pointer)" + } + }, + "id": 15872, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5860:24:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5833:51:61" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15875, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15868, + "src": "5902:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15876, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5913:6:61", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "5902:17:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15877, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5902:19:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 15879, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15863, + "src": "5940:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 15880, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15868, + "src": "5954:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15881, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5965:8:61", + "memberName": "closedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15654, + "src": "5954:19:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 15878, + "name": "AllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15680, + "src": "5923:16:61", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$", + "typeString": "function (address,uint256) pure returns (error)" + } + }, + "id": 15882, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5923:51:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 15874, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5894:7:61", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 15883, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5894:81:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 15884, + "nodeType": "ExpressionStatement", + "src": "5894:81:61" + }, + { + "expression": { + "id": 15890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "id": 15885, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15868, + "src": "5985:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 15887, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "5996:8:61", + "memberName": "closedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15654, + "src": "5985:19:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "id": 15888, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "6007:5:61", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 15889, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6013:9:61", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "6007:15:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5985:37:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 15891, + "nodeType": "ExpressionStatement", + "src": "5985:37:61" + } + ] + }, + "documentation": { + "id": 15856, + "nodeType": "StructuredDocumentation", + "src": "5531:201:61", + "text": " @notice Close an allocation\n @dev Requirements:\n - The allocation must be open\n @param self The allocation list mapping\n @param allocationId The allocation id" + }, + "id": 15893, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "close", + "nameLocation": "5746:5:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15864, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15861, + "mutability": "mutable", + "name": "self", + "nameLocation": "5786:4:61", + "nodeType": "VariableDeclaration", + "scope": 15893, + "src": "5752:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 15860, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 15857, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5760:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "5752:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 15859, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15858, + "name": "State", + "nameLocations": ["5771:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "5771:5:61" + }, + "referencedDeclaration": 15663, + "src": "5771:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15863, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5800:12:61", + "nodeType": "VariableDeclaration", + "scope": 15893, + "src": "5792:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15862, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5792:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5751:62:61" + }, + "returnParameters": { + "id": 15865, + "nodeType": "ParameterList", + "parameters": [], + "src": "5823:0:61" + }, + "scope": 16033, + "src": "5737:292:61", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15912, + "nodeType": "Block", + "src": "6318:48:61", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 15908, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15899, + "src": "6340:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + { + "id": 15909, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15901, + "src": "6346:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 15907, + "name": "_get", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16032, + "src": "6335:4:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_storage_ptr_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State storage pointer)" + } + }, + "id": 15910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6335:24:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "functionReturnParameters": 15906, + "id": 15911, + "nodeType": "Return", + "src": "6328:31:61" + } + ] + }, + "documentation": { + "id": 15894, + "nodeType": "StructuredDocumentation", + "src": "6035:166:61", + "text": " @notice Get an allocation\n @param self The allocation list mapping\n @param allocationId The allocation id\n @return The allocation" + }, + "id": 15913, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "get", + "nameLocation": "6215:3:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15902, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15899, + "mutability": "mutable", + "name": "self", + "nameLocation": "6253:4:61", + "nodeType": "VariableDeclaration", + "scope": 15913, + "src": "6219:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 15898, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 15895, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6227:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "6219:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 15897, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15896, + "name": "State", + "nameLocations": ["6238:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "6238:5:61" + }, + "referencedDeclaration": 15663, + "src": "6238:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15901, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "6267:12:61", + "nodeType": "VariableDeclaration", + "scope": 15913, + "src": "6259:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 15900, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6259:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6218:62:61" + }, + "returnParameters": { + "id": 15906, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15905, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15913, + "src": "6304:12:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15904, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15903, + "name": "State", + "nameLocations": ["6304:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "6304:5:61" + }, + "referencedDeclaration": 15663, + "src": "6304:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "6303:14:61" + }, + "scope": 16033, + "src": "6206:160:61", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15945, + "nodeType": "Block", + "src": "6686:178:61", + "statements": [ + { + "assignments": [15925], + "declarations": [ + { + "constant": false, + "id": 15925, + "mutability": "mutable", + "name": "timeSinceLastPOI", + "nameLocation": "6704:16:61", + "nodeType": "VariableDeclaration", + "scope": 15945, + "src": "6696:24:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15924, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6696:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 15936, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 15935, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 15926, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "6723:5:61", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 15927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6729:9:61", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "6723:15:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "arguments": [ + { + "expression": { + "id": 15930, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15917, + "src": "6750:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15931, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6755:9:61", + "memberName": "createdAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15652, + "src": "6750:14:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 15932, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15917, + "src": "6766:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15933, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6771:18:61", + "memberName": "lastPOIPresentedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15656, + "src": "6766:23:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 15928, + "name": "Math", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9938, + "src": "6741:4:61", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Math_$9938_$", + "typeString": "type(library Math)" + } + }, + "id": 15929, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6746:3:61", + "memberName": "max", + "nodeType": "MemberAccess", + "referencedDeclaration": 8625, + "src": "6741:8:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 15934, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6741:49:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6723:67:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6696:94:61" + }, + { + "expression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 15943, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15937, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15917, + "src": "6807:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15938, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6812:6:61", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "6807:11:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15939, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6807:13:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 15942, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 15940, + "name": "timeSinceLastPOI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15925, + "src": "6824:16:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 15941, + "name": "staleThreshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15919, + "src": "6843:14:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6824:33:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "6807:50:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 15923, + "id": 15944, + "nodeType": "Return", + "src": "6800:57:61" + } + ] + }, + "documentation": { + "id": 15914, + "nodeType": "StructuredDocumentation", + "src": "6372:220:61", + "text": " @notice Checks if an allocation is stale\n @param self The allocation\n @param staleThreshold The time in blocks to consider an allocation stale\n @return True if the allocation is stale" + }, + "id": 15946, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isStale", + "nameLocation": "6606:7:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15920, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15917, + "mutability": "mutable", + "name": "self", + "nameLocation": "6627:4:61", + "nodeType": "VariableDeclaration", + "scope": 15946, + "src": "6614:17:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15916, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15915, + "name": "State", + "nameLocations": ["6614:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "6614:5:61" + }, + "referencedDeclaration": 15663, + "src": "6614:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 15919, + "mutability": "mutable", + "name": "staleThreshold", + "nameLocation": "6641:14:61", + "nodeType": "VariableDeclaration", + "scope": 15946, + "src": "6633:22:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 15918, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6633:7:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6613:43:61" + }, + "returnParameters": { + "id": 15923, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15922, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15946, + "src": "6680:4:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15921, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "6680:4:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "6679:6:61" + }, + "scope": 16033, + "src": "6597:267:61", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15960, + "nodeType": "Block", + "src": "7075:43:61", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 15958, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 15955, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15950, + "src": "7092:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15956, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7097:9:61", + "memberName": "createdAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15652, + "src": "7092:14:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 15957, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7110:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7092:19:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 15954, + "id": 15959, + "nodeType": "Return", + "src": "7085:26:61" + } + ] + }, + "documentation": { + "id": 15947, + "nodeType": "StructuredDocumentation", + "src": "6870:136:61", + "text": " @notice Checks if an allocation exists\n @param self The allocation\n @return True if the allocation exists" + }, + "id": 15961, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "exists", + "nameLocation": "7020:6:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15951, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15950, + "mutability": "mutable", + "name": "self", + "nameLocation": "7040:4:61", + "nodeType": "VariableDeclaration", + "scope": 15961, + "src": "7027:17:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15949, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15948, + "name": "State", + "nameLocations": ["7027:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "7027:5:61" + }, + "referencedDeclaration": 15663, + "src": "7027:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "7026:19:61" + }, + "returnParameters": { + "id": 15954, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15953, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15961, + "src": "7069:4:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15952, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7069:4:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "7068:6:61" + }, + "scope": 16033, + "src": "7011:107:61", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15979, + "nodeType": "Block", + "src": "7331:59:61", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 15977, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15970, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15965, + "src": "7348:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15971, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7353:6:61", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 15961, + "src": "7348:11:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15972, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7348:13:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 15976, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 15973, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15965, + "src": "7365:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15974, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7370:8:61", + "memberName": "closedAt", + "nodeType": "MemberAccess", + "referencedDeclaration": 15654, + "src": "7365:13:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 15975, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7382:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7365:18:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "7348:35:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 15969, + "id": 15978, + "nodeType": "Return", + "src": "7341:42:61" + } + ] + }, + "documentation": { + "id": 15962, + "nodeType": "StructuredDocumentation", + "src": "7124:138:61", + "text": " @notice Checks if an allocation is open\n @param self The allocation\n @return True if the allocation is open" + }, + "id": 15980, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isOpen", + "nameLocation": "7276:6:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15966, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15965, + "mutability": "mutable", + "name": "self", + "nameLocation": "7296:4:61", + "nodeType": "VariableDeclaration", + "scope": 15980, + "src": "7283:17:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15964, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15963, + "name": "State", + "nameLocations": ["7283:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "7283:5:61" + }, + "referencedDeclaration": 15663, + "src": "7283:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "7282:19:61" + }, + "returnParameters": { + "id": 15969, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15968, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15980, + "src": "7325:4:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15967, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7325:4:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "7324:6:61" + }, + "scope": 16033, + "src": "7267:123:61", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 15998, + "nodeType": "Block", + "src": "7621:57:61", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 15996, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 15989, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15984, + "src": "7638:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15990, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7643:6:61", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 15961, + "src": "7638:11:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 15991, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7638:13:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 15995, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 15992, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15984, + "src": "7655:4:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 15993, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7660:6:61", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "7655:11:61", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 15994, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7670:1:61", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "7655:16:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "7638:33:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 15988, + "id": 15997, + "nodeType": "Return", + "src": "7631:40:61" + } + ] + }, + "documentation": { + "id": 15981, + "nodeType": "StructuredDocumentation", + "src": "7396:150:61", + "text": " @notice Checks if an allocation is alturistic\n @param self The allocation\n @return True if the allocation is alturistic" + }, + "id": 15999, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isAltruistic", + "nameLocation": "7560:12:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15985, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15984, + "mutability": "mutable", + "name": "self", + "nameLocation": "7586:4:61", + "nodeType": "VariableDeclaration", + "scope": 15999, + "src": "7573:17:61", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 15983, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 15982, + "name": "State", + "nameLocations": ["7573:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "7573:5:61" + }, + "referencedDeclaration": 15663, + "src": "7573:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "7572:19:61" + }, + "returnParameters": { + "id": 15988, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 15987, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15999, + "src": "7615:4:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 15986, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7615:4:61", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "7614:6:61" + }, + "scope": 16033, + "src": "7551:127:61", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16031, + "nodeType": "Block", + "src": "8043:165:61", + "statements": [ + { + "assignments": [16015], + "declarations": [ + { + "constant": false, + "id": 16015, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "8067:10:61", + "nodeType": "VariableDeclaration", + "scope": 16031, + "src": "8053:24:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 16014, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16013, + "name": "State", + "nameLocations": ["8053:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "8053:5:61" + }, + "referencedDeclaration": 15663, + "src": "8053:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 16019, + "initialValue": { + "baseExpression": { + "id": 16016, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16005, + "src": "8080:4:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 16018, + "indexExpression": { + "id": 16017, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16007, + "src": "8085:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8080:18:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8053:45:61" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 16021, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16015, + "src": "8116:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "id": 16022, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8127:6:61", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 15961, + "src": "8116:17:61", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 16023, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8116:19:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 16025, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16007, + "src": "8160:12:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16024, + "name": "AllocationDoesNotExist", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15673, + "src": "8137:22:61", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 16026, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8137:36:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16020, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "8108:7:61", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16027, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8108:66:61", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16028, + "nodeType": "ExpressionStatement", + "src": "8108:66:61" + }, + { + "expression": { + "id": 16029, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16015, + "src": "8191:10:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State storage pointer" + } + }, + "functionReturnParameters": 16012, + "id": 16030, + "nodeType": "Return", + "src": "8184:17:61" + } + ] + }, + "documentation": { + "id": 16000, + "nodeType": "StructuredDocumentation", + "src": "7684:241:61", + "text": " @notice Get the allocation for an allocation id\n @dev Reverts if the allocation does not exist\n @param self The allocation list mapping\n @param allocationId The allocation id\n @return The allocation" + }, + "id": 16032, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_get", + "nameLocation": "7939:4:61", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16008, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16005, + "mutability": "mutable", + "name": "self", + "nameLocation": "7978:4:61", + "nodeType": "VariableDeclaration", + "scope": 16032, + "src": "7944:38:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 16004, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16001, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7952:7:61", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "7944:25:61", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16003, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16002, + "name": "State", + "nameLocations": ["7963:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "7963:5:61" + }, + "referencedDeclaration": 15663, + "src": "7963:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16007, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "7992:12:61", + "nodeType": "VariableDeclaration", + "scope": 16032, + "src": "7984:20:61", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16006, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7984:7:61", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "7943:62:61" + }, + "returnParameters": { + "id": 16012, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16011, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16032, + "src": "8028:13:61", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 16010, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16009, + "name": "State", + "nameLocations": ["8028:5:61"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "8028:5:61" + }, + "referencedDeclaration": 15663, + "src": "8028:5:61", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "8027:15:61" + }, + "scope": 16033, + "src": "7930:278:61", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 16034, + "src": "360:7850:61", + "usedErrors": [15668, 15673, 15680], + "usedEvents": [] + } + ], + "src": "45:8166:61" + }, + "id": 61 + }, + "contracts/libraries/Attestation.sol": { + "ast": { + "absolutePath": "contracts/libraries/Attestation.sol", + "exportedSymbols": { + "Attestation": [16290] + }, + "id": 16291, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 16035, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:62" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Attestation", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 16036, + "nodeType": "StructuredDocumentation", + "src": "70:221:62", + "text": " @title Attestation library\n @notice A library to handle Attestation.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 16290, + "linearizedBaseContracts": [16290], + "name": "Attestation", + "nameLocation": "300:11:62", + "nodeType": "ContractDefinition", + "nodes": [ + { + "canonicalName": "Attestation.Receipt", + "documentation": { + "id": 16037, + "nodeType": "StructuredDocumentation", + "src": "318:242:62", + "text": " @notice Receipt content sent from the service provider in response to request\n @param requestCID The request CID\n @param responseCID The response CID\n @param subgraphDeploymentId The subgraph deployment id" + }, + "id": 16044, + "members": [ + { + "constant": false, + "id": 16039, + "mutability": "mutable", + "name": "requestCID", + "nameLocation": "598:10:62", + "nodeType": "VariableDeclaration", + "scope": 16044, + "src": "590:18:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16038, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "590:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16041, + "mutability": "mutable", + "name": "responseCID", + "nameLocation": "626:11:62", + "nodeType": "VariableDeclaration", + "scope": 16044, + "src": "618:19:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16040, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "618:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16043, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "655:20:62", + "nodeType": "VariableDeclaration", + "scope": 16044, + "src": "647:28:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16042, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "647:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "name": "Receipt", + "nameLocation": "572:7:62", + "nodeType": "StructDefinition", + "scope": 16290, + "src": "565:117:62", + "visibility": "public" + }, + { + "canonicalName": "Attestation.State", + "documentation": { + "id": 16045, + "nodeType": "StructuredDocumentation", + "src": "688:375:62", + "text": " @notice Attestation sent from the service provider in response to a request\n @param requestCID The request CID\n @param responseCID The response CID\n @param subgraphDeploymentId The subgraph deployment id\n @param r The r value of the signature\n @param s The s value of the signature\n @param v The v value of the signature" + }, + "id": 16058, + "members": [ + { + "constant": false, + "id": 16047, + "mutability": "mutable", + "name": "requestCID", + "nameLocation": "1099:10:62", + "nodeType": "VariableDeclaration", + "scope": 16058, + "src": "1091:18:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16046, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1091:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16049, + "mutability": "mutable", + "name": "responseCID", + "nameLocation": "1127:11:62", + "nodeType": "VariableDeclaration", + "scope": 16058, + "src": "1119:19:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16048, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1119:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16051, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "1156:20:62", + "nodeType": "VariableDeclaration", + "scope": 16058, + "src": "1148:28:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16050, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1148:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16053, + "mutability": "mutable", + "name": "r", + "nameLocation": "1194:1:62", + "nodeType": "VariableDeclaration", + "scope": 16058, + "src": "1186:9:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16052, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1186:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16055, + "mutability": "mutable", + "name": "s", + "nameLocation": "1213:1:62", + "nodeType": "VariableDeclaration", + "scope": 16058, + "src": "1205:9:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16054, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1205:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16057, + "mutability": "mutable", + "name": "v", + "nameLocation": "1230:1:62", + "nodeType": "VariableDeclaration", + "scope": 16058, + "src": "1224:7:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 16056, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "1224:5:62", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "name": "State", + "nameLocation": "1075:5:62", + "nodeType": "StructDefinition", + "scope": 16290, + "src": "1068:170:62", + "visibility": "public" + }, + { + "constant": true, + "documentation": { + "id": 16059, + "nodeType": "StructuredDocumentation", + "src": "1244:76:62", + "text": "@notice Attestation size is the sum of the receipt (96) + signature (65)" + }, + "id": 16062, + "mutability": "constant", + "name": "RECEIPT_SIZE_BYTES", + "nameLocation": "1350:18:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "1325:48:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16060, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1325:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "3936", + "id": 16061, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1371:2:62", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "value": "96" + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16063, + "nodeType": "StructuredDocumentation", + "src": "1380:54:62", + "text": "@notice The length of the r value of the signature" + }, + "id": 16066, + "mutability": "constant", + "name": "SIG_R_LENGTH", + "nameLocation": "1464:12:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "1439:42:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16064, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1439:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "3332", + "id": 16065, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1479:2:62", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16067, + "nodeType": "StructuredDocumentation", + "src": "1488:54:62", + "text": "@notice The length of the s value of the signature" + }, + "id": 16070, + "mutability": "constant", + "name": "SIG_S_LENGTH", + "nameLocation": "1572:12:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "1547:42:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16068, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1547:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "3332", + "id": 16069, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1587:2:62", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16071, + "nodeType": "StructuredDocumentation", + "src": "1596:54:62", + "text": "@notice The length of the v value of the signature" + }, + "id": 16074, + "mutability": "constant", + "name": "SIG_V_LENGTH", + "nameLocation": "1680:12:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "1655:41:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16072, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1655:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "31", + "id": 16073, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1695:1:62", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16075, + "nodeType": "StructuredDocumentation", + "src": "1703:54:62", + "text": "@notice The offset of the r value of the signature" + }, + "id": 16078, + "mutability": "constant", + "name": "SIG_R_OFFSET", + "nameLocation": "1787:12:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "1762:58:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16076, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1762:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "id": 16077, + "name": "RECEIPT_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16062, + "src": "1802:18:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16079, + "nodeType": "StructuredDocumentation", + "src": "1827:54:62", + "text": "@notice The offset of the s value of the signature" + }, + "id": 16084, + "mutability": "constant", + "name": "SIG_S_OFFSET", + "nameLocation": "1911:12:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "1886:73:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16080, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1886:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16083, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "id": 16081, + "name": "RECEIPT_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16062, + "src": "1926:18:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16082, + "name": "SIG_R_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16066, + "src": "1947:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1926:33:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16085, + "nodeType": "StructuredDocumentation", + "src": "1966:54:62", + "text": "@notice The offset of the v value of the signature" + }, + "id": 16092, + "mutability": "constant", + "name": "SIG_V_OFFSET", + "nameLocation": "2050:12:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "2025:88:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16086, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2025:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16091, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16089, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "id": 16087, + "name": "RECEIPT_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16062, + "src": "2065:18:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16088, + "name": "SIG_R_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16066, + "src": "2086:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2065:33:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16090, + "name": "SIG_S_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16070, + "src": "2101:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2065:48:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16093, + "nodeType": "StructuredDocumentation", + "src": "2120:37:62", + "text": "@notice The size of the signature" + }, + "id": 16100, + "mutability": "constant", + "name": "SIG_SIZE_BYTES", + "nameLocation": "2187:14:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "2162:84:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16094, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2162:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16099, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16097, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "id": 16095, + "name": "SIG_R_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16066, + "src": "2204:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16096, + "name": "SIG_S_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16070, + "src": "2219:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2204:27:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16098, + "name": "SIG_V_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16074, + "src": "2234:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2204:42:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16101, + "nodeType": "StructuredDocumentation", + "src": "2253:39:62", + "text": "@notice The size of the attestation" + }, + "id": 16106, + "mutability": "constant", + "name": "ATTESTATION_SIZE_BYTES", + "nameLocation": "2322:22:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "2297:85:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16102, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2297:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16105, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "id": 16103, + "name": "RECEIPT_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16062, + "src": "2347:18:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16104, + "name": "SIG_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16100, + "src": "2368:14:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2347:35:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16107, + "nodeType": "StructuredDocumentation", + "src": "2389:41:62", + "text": "@notice The length of the uint8 value" + }, + "id": 16110, + "mutability": "constant", + "name": "UINT8_BYTE_LENGTH", + "nameLocation": "2460:17:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "2435:46:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16108, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2435:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "31", + "id": 16109, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2480:1:62", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 16111, + "nodeType": "StructuredDocumentation", + "src": "2488:43:62", + "text": "@notice The length of the bytes32 value" + }, + "id": 16114, + "mutability": "constant", + "name": "BYTES32_BYTE_LENGTH", + "nameLocation": "2561:19:62", + "nodeType": "VariableDeclaration", + "scope": 16290, + "src": "2536:49:62", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16112, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2536:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "3332", + "id": 16113, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2583:2:62", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "visibility": "private" + }, + { + "documentation": { + "id": 16115, + "nodeType": "StructuredDocumentation", + "src": "2592:216:62", + "text": " @notice The error thrown when the attestation data length is invalid\n @param length The length of the attestation data\n @param expectedLength The expected length of the attestation data" + }, + "errorSelector": "3fdf3423", + "id": 16121, + "name": "AttestationInvalidBytesLength", + "nameLocation": "2819:29:62", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16120, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16117, + "mutability": "mutable", + "name": "length", + "nameLocation": "2857:6:62", + "nodeType": "VariableDeclaration", + "scope": 16121, + "src": "2849:14:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16116, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2849:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16119, + "mutability": "mutable", + "name": "expectedLength", + "nameLocation": "2873:14:62", + "nodeType": "VariableDeclaration", + "scope": 16121, + "src": "2865:22:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16118, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2865:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2848:40:62" + }, + "src": "2813:76:62" + }, + { + "body": { + "id": 16152, + "nodeType": "Block", + "src": "3319:236:62", + "statements": [ + { + "expression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 16149, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 16143, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 16137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16133, + "name": "_attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16125, + "src": "3337:13:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 16134, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3351:10:62", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16047, + "src": "3337:24:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 16135, + "name": "_attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16128, + "src": "3365:13:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 16136, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3379:10:62", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16047, + "src": "3365:24:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "3337:52:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 16142, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16138, + "name": "_attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16125, + "src": "3405:13:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 16139, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3419:20:62", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "3405:34:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "id": 16140, + "name": "_attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16128, + "src": "3443:13:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 16141, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3457:20:62", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "3443:34:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "3405:72:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3337:140:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 16148, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16144, + "name": "_attestation1", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16125, + "src": "3493:13:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 16145, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3507:11:62", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16049, + "src": "3493:25:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "expression": { + "id": 16146, + "name": "_attestation2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16128, + "src": "3522:13:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 16147, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3536:11:62", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16049, + "src": "3522:25:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "3493:54:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3337:210:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 16150, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3336:212:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 16132, + "id": 16151, + "nodeType": "Return", + "src": "3329:219:62" + } + ] + }, + "documentation": { + "id": 16122, + "nodeType": "StructuredDocumentation", + "src": "2895:264:62", + "text": " @dev Returns if two attestations are conflicting.\n Everything must match except for the responseId.\n @param _attestation1 Attestation\n @param _attestation2 Attestation\n @return True if the two attestations are conflicting" + }, + "id": 16153, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "areConflicting", + "nameLocation": "3173:14:62", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16129, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16125, + "mutability": "mutable", + "name": "_attestation1", + "nameLocation": "3222:13:62", + "nodeType": "VariableDeclaration", + "scope": 16153, + "src": "3197:38:62", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 16124, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16123, + "name": "Attestation.State", + "nameLocations": ["3197:11:62", "3209:5:62"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "3197:17:62" + }, + "referencedDeclaration": 16058, + "src": "3197:17:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16128, + "mutability": "mutable", + "name": "_attestation2", + "nameLocation": "3270:13:62", + "nodeType": "VariableDeclaration", + "scope": 16153, + "src": "3245:38:62", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 16127, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16126, + "name": "Attestation.State", + "nameLocations": ["3245:11:62", "3257:5:62"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "3245:17:62" + }, + "referencedDeclaration": 16058, + "src": "3245:17:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "3187:102:62" + }, + "returnParameters": { + "id": 16132, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16131, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16153, + "src": "3313:4:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 16130, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3313:4:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "3312:6:62" + }, + "scope": 16290, + "src": "3164:391:62", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16222, + "nodeType": "Block", + "src": "3790:748:62", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16166, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16163, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16156, + "src": "3862:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 16164, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3868:6:62", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "3862:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 16165, + "name": "ATTESTATION_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16106, + "src": "3878:22:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3862:38:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 16168, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16156, + "src": "3944:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 16169, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3950:6:62", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "3944:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 16170, + "name": "ATTESTATION_SIZE_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16106, + "src": "3958:22:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16167, + "name": "AttestationInvalidBytesLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16121, + "src": "3914:29:62", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 16171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3914:67:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16162, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3841:7:62", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3841:150:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16173, + "nodeType": "ExpressionStatement", + "src": "3841:150:62" + }, + { + "assignments": [16175, 16177, 16179], + "declarations": [ + { + "constant": false, + "id": 16175, + "mutability": "mutable", + "name": "requestCID", + "nameLocation": "4037:10:62", + "nodeType": "VariableDeclaration", + "scope": 16222, + "src": "4029:18:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16174, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4029:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16177, + "mutability": "mutable", + "name": "responseCID", + "nameLocation": "4057:11:62", + "nodeType": "VariableDeclaration", + "scope": 16222, + "src": "4049:19:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16176, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4049:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16179, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "4078:20:62", + "nodeType": "VariableDeclaration", + "scope": 16222, + "src": "4070:28:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16178, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4070:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 16191, + "initialValue": { + "arguments": [ + { + "id": 16182, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16156, + "src": "4126:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "components": [ + { + "id": 16184, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4146:7:62", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 16183, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4146:7:62", + "typeDescriptions": {} + } + }, + { + "id": 16186, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4155:7:62", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 16185, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4155:7:62", + "typeDescriptions": {} + } + }, + { + "id": 16188, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4164:7:62", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 16187, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4164:7:62", + "typeDescriptions": {} + } + } + ], + "id": 16189, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "4145:27:62", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_type$_t_bytes32_$_$_t_type$_t_bytes32_$_$_t_type$_t_bytes32_$_$", + "typeString": "tuple(type(bytes32),type(bytes32),type(bytes32))" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_tuple$_t_type$_t_bytes32_$_$_t_type$_t_bytes32_$_$_t_type$_t_bytes32_$_$", + "typeString": "tuple(type(bytes32),type(bytes32),type(bytes32))" + } + ], + "expression": { + "id": 16180, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "4102:3:62", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 16181, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4106:6:62", + "memberName": "decode", + "nodeType": "MemberAccess", + "src": "4102:10:62", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 16190, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4102:80:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_bytes32_$_t_bytes32_$", + "typeString": "tuple(bytes32,bytes32,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4028:154:62" + }, + { + "assignments": [16193], + "declarations": [ + { + "constant": false, + "id": 16193, + "mutability": "mutable", + "name": "r", + "nameLocation": "4315:1:62", + "nodeType": "VariableDeclaration", + "scope": 16222, + "src": "4307:9:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16192, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4307:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 16198, + "initialValue": { + "arguments": [ + { + "id": 16195, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16156, + "src": "4330:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 16196, + "name": "SIG_R_OFFSET", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16078, + "src": "4337:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16194, + "name": "_toBytes32", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16289, + "src": "4319:10:62", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 16197, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4319:31:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4307:43:62" + }, + { + "assignments": [16200], + "declarations": [ + { + "constant": false, + "id": 16200, + "mutability": "mutable", + "name": "s", + "nameLocation": "4368:1:62", + "nodeType": "VariableDeclaration", + "scope": 16222, + "src": "4360:9:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16199, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4360:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 16205, + "initialValue": { + "arguments": [ + { + "id": 16202, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16156, + "src": "4383:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 16203, + "name": "SIG_S_OFFSET", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16084, + "src": "4390:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16201, + "name": "_toBytes32", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16289, + "src": "4372:10:62", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes memory,uint256) pure returns (bytes32)" + } + }, + "id": 16204, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4372:31:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4360:43:62" + }, + { + "assignments": [16207], + "declarations": [ + { + "constant": false, + "id": 16207, + "mutability": "mutable", + "name": "v", + "nameLocation": "4419:1:62", + "nodeType": "VariableDeclaration", + "scope": 16222, + "src": "4413:7:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 16206, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4413:5:62", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 16212, + "initialValue": { + "arguments": [ + { + "id": 16209, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16156, + "src": "4432:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "id": 16210, + "name": "SIG_V_OFFSET", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16092, + "src": "4439:12:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16208, + "name": "_toUint8", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16256, + "src": "4423:8:62", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_uint8_$", + "typeString": "function (bytes memory,uint256) pure returns (uint8)" + } + }, + "id": 16211, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4423:29:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4413:39:62" + }, + { + "expression": { + "arguments": [ + { + "id": 16214, + "name": "requestCID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16175, + "src": "4476:10:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 16215, + "name": "responseCID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16177, + "src": "4488:11:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 16216, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16179, + "src": "4501:20:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 16217, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16193, + "src": "4523:1:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 16218, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16200, + "src": "4526:1:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 16219, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16207, + "src": "4529:1:62", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 16213, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16058, + "src": "4470:5:62", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_State_$16058_storage_ptr_$", + "typeString": "type(struct Attestation.State storage pointer)" + } + }, + "id": 16220, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4470:61:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "functionReturnParameters": 16161, + "id": 16221, + "nodeType": "Return", + "src": "4463:68:62" + } + ] + }, + "documentation": { + "id": 16154, + "nodeType": "StructuredDocumentation", + "src": "3561:152:62", + "text": " @dev Parse the bytes attestation into a struct from `_data`.\n @param _data The bytes to parse\n @return Attestation struct" + }, + "id": 16223, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "parse", + "nameLocation": "3727:5:62", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16157, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16156, + "mutability": "mutable", + "name": "_data", + "nameLocation": "3746:5:62", + "nodeType": "VariableDeclaration", + "scope": 16223, + "src": "3733:18:62", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16155, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3733:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3732:20:62" + }, + "returnParameters": { + "id": 16161, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16160, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16223, + "src": "3776:12:62", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 16159, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16158, + "name": "State", + "nameLocations": ["3776:5:62"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "3776:5:62" + }, + "referencedDeclaration": 16058, + "src": "3776:5:62", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "3775:14:62" + }, + "scope": 16290, + "src": "3718:820:62", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16255, + "nodeType": "Block", + "src": "4818:584:62", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16239, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16234, + "name": "_bytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16226, + "src": "4849:6:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 16235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4856:6:62", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4849:13:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16238, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16236, + "name": "_start", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16228, + "src": "4866:6:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16237, + "name": "UINT8_BYTE_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16110, + "src": "4875:17:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4866:26:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4849:43:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 16241, + "name": "_bytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16226, + "src": "4936:6:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 16242, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4943:6:62", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4936:13:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16243, + "name": "_start", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16228, + "src": "4951:6:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16244, + "name": "UINT8_BYTE_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16110, + "src": "4960:17:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4951:26:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16240, + "name": "AttestationInvalidBytesLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16121, + "src": "4906:29:62", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 16246, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4906:72:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16233, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "4828:7:62", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16247, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4828:160:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16248, + "nodeType": "ExpressionStatement", + "src": "4828:160:62" + }, + { + "assignments": [16250], + "declarations": [ + { + "constant": false, + "id": 16250, + "mutability": "mutable", + "name": "tempUint", + "nameLocation": "5004:8:62", + "nodeType": "VariableDeclaration", + "scope": 16255, + "src": "4998:14:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 16249, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4998:5:62", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 16251, + "nodeType": "VariableDeclarationStatement", + "src": "4998:14:62" + }, + { + "AST": { + "nativeSrc": "5088:282:62", + "nodeType": "YulBlock", + "src": "5088:282:62", + "statements": [ + { + "nativeSrc": "5312:48:62", + "nodeType": "YulAssignment", + "src": "5312:48:62", + "value": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_bytes", + "nativeSrc": "5338:6:62", + "nodeType": "YulIdentifier", + "src": "5338:6:62" + }, + { + "kind": "number", + "nativeSrc": "5346:3:62", + "nodeType": "YulLiteral", + "src": "5346:3:62", + "type": "", + "value": "0x1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5334:3:62", + "nodeType": "YulIdentifier", + "src": "5334:3:62" + }, + "nativeSrc": "5334:16:62", + "nodeType": "YulFunctionCall", + "src": "5334:16:62" + }, + { + "name": "_start", + "nativeSrc": "5352:6:62", + "nodeType": "YulIdentifier", + "src": "5352:6:62" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5330:3:62", + "nodeType": "YulIdentifier", + "src": "5330:3:62" + }, + "nativeSrc": "5330:29:62", + "nodeType": "YulFunctionCall", + "src": "5330:29:62" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "5324:5:62", + "nodeType": "YulIdentifier", + "src": "5324:5:62" + }, + "nativeSrc": "5324:36:62", + "nodeType": "YulFunctionCall", + "src": "5324:36:62" + }, + "variableNames": [ + { + "name": "tempUint", + "nativeSrc": "5312:8:62", + "nodeType": "YulIdentifier", + "src": "5312:8:62" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 16226, + "isOffset": false, + "isSlot": false, + "src": "5338:6:62", + "valueSize": 1 + }, + { + "declaration": 16228, + "isOffset": false, + "isSlot": false, + "src": "5352:6:62", + "valueSize": 1 + }, + { + "declaration": 16250, + "isOffset": false, + "isSlot": false, + "src": "5312:8:62", + "valueSize": 1 + } + ], + "id": 16252, + "nodeType": "InlineAssembly", + "src": "5079:291:62" + }, + { + "expression": { + "id": 16253, + "name": "tempUint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16250, + "src": "5387:8:62", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "functionReturnParameters": 16232, + "id": 16254, + "nodeType": "Return", + "src": "5380:15:62" + } + ] + }, + "documentation": { + "id": 16224, + "nodeType": "StructuredDocumentation", + "src": "4544:185:62", + "text": " @dev Parse a uint8 from `_bytes` starting at offset `_start`.\n @param _bytes The bytes to parse\n @param _start The start offset\n @return uint8 value" + }, + "id": 16256, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_toUint8", + "nameLocation": "4743:8:62", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16229, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16226, + "mutability": "mutable", + "name": "_bytes", + "nameLocation": "4765:6:62", + "nodeType": "VariableDeclaration", + "scope": 16256, + "src": "4752:19:62", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16225, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4752:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16228, + "mutability": "mutable", + "name": "_start", + "nameLocation": "4781:6:62", + "nodeType": "VariableDeclaration", + "scope": 16256, + "src": "4773:14:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16227, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4773:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4751:37:62" + }, + "returnParameters": { + "id": 16232, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16231, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16256, + "src": "4811:5:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 16230, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4811:5:62", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "src": "4810:7:62" + }, + "scope": 16290, + "src": "4734:668:62", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 16288, + "nodeType": "Block", + "src": "5690:390:62", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16267, + "name": "_bytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16259, + "src": "5721:6:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 16268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5728:6:62", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5721:13:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16271, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16269, + "name": "_start", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16261, + "src": "5738:6:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16270, + "name": "BYTES32_BYTE_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16114, + "src": "5747:19:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5738:28:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5721:45:62", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 16274, + "name": "_bytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16259, + "src": "5810:6:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 16275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5817:6:62", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5810:13:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16278, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16276, + "name": "_start", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16261, + "src": "5825:6:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 16277, + "name": "BYTES32_BYTE_LENGTH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16114, + "src": "5834:19:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5825:28:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16273, + "name": "AttestationInvalidBytesLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16121, + "src": "5780:29:62", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$_t_error_$", + "typeString": "function (uint256,uint256) pure returns (error)" + } + }, + "id": 16279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5780:74:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16266, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "5700:7:62", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16280, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5700:164:62", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16281, + "nodeType": "ExpressionStatement", + "src": "5700:164:62" + }, + { + "assignments": [16283], + "declarations": [ + { + "constant": false, + "id": 16283, + "mutability": "mutable", + "name": "tempBytes32", + "nameLocation": "5882:11:62", + "nodeType": "VariableDeclaration", + "scope": 16288, + "src": "5874:19:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16282, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5874:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 16284, + "nodeType": "VariableDeclarationStatement", + "src": "5874:19:62" + }, + { + "AST": { + "nativeSrc": "5969:76:62", + "nodeType": "YulBlock", + "src": "5969:76:62", + "statements": [ + { + "nativeSrc": "5983:52:62", + "nodeType": "YulAssignment", + "src": "5983:52:62", + "value": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_bytes", + "nativeSrc": "6012:6:62", + "nodeType": "YulIdentifier", + "src": "6012:6:62" + }, + { + "kind": "number", + "nativeSrc": "6020:4:62", + "nodeType": "YulLiteral", + "src": "6020:4:62", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6008:3:62", + "nodeType": "YulIdentifier", + "src": "6008:3:62" + }, + "nativeSrc": "6008:17:62", + "nodeType": "YulFunctionCall", + "src": "6008:17:62" + }, + { + "name": "_start", + "nativeSrc": "6027:6:62", + "nodeType": "YulIdentifier", + "src": "6027:6:62" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6004:3:62", + "nodeType": "YulIdentifier", + "src": "6004:3:62" + }, + "nativeSrc": "6004:30:62", + "nodeType": "YulFunctionCall", + "src": "6004:30:62" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "5998:5:62", + "nodeType": "YulIdentifier", + "src": "5998:5:62" + }, + "nativeSrc": "5998:37:62", + "nodeType": "YulFunctionCall", + "src": "5998:37:62" + }, + "variableNames": [ + { + "name": "tempBytes32", + "nativeSrc": "5983:11:62", + "nodeType": "YulIdentifier", + "src": "5983:11:62" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 16259, + "isOffset": false, + "isSlot": false, + "src": "6012:6:62", + "valueSize": 1 + }, + { + "declaration": 16261, + "isOffset": false, + "isSlot": false, + "src": "6027:6:62", + "valueSize": 1 + }, + { + "declaration": 16283, + "isOffset": false, + "isSlot": false, + "src": "5983:11:62", + "valueSize": 1 + } + ], + "id": 16285, + "nodeType": "InlineAssembly", + "src": "5960:85:62" + }, + { + "expression": { + "id": 16286, + "name": "tempBytes32", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16283, + "src": "6062:11:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 16265, + "id": 16287, + "nodeType": "Return", + "src": "6055:18:62" + } + ] + }, + "documentation": { + "id": 16257, + "nodeType": "StructuredDocumentation", + "src": "5408:189:62", + "text": " @dev Parse a bytes32 from `_bytes` starting at offset `_start`.\n @param _bytes The bytes to parse\n @param _start The start offset\n @return bytes32 value" + }, + "id": 16289, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_toBytes32", + "nameLocation": "5611:10:62", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16262, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16259, + "mutability": "mutable", + "name": "_bytes", + "nameLocation": "5635:6:62", + "nodeType": "VariableDeclaration", + "scope": 16289, + "src": "5622:19:62", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16258, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5622:5:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16261, + "mutability": "mutable", + "name": "_start", + "nameLocation": "5651:6:62", + "nodeType": "VariableDeclaration", + "scope": 16289, + "src": "5643:14:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16260, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5643:7:62", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5621:37:62" + }, + "returnParameters": { + "id": 16265, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16264, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16289, + "src": "5681:7:62", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16263, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5681:7:62", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5680:9:62" + }, + "scope": 16290, + "src": "5602:478:62", + "stateMutability": "pure", + "virtual": false, + "visibility": "private" + } + ], + "scope": 16291, + "src": "292:5790:62", + "usedErrors": [16121], + "usedEvents": [] + } + ], + "src": "45:6038:62" + }, + "id": 62 + }, + "contracts/libraries/LegacyAllocation.sol": { + "ast": { + "absolutePath": "contracts/libraries/LegacyAllocation.sol", + "exportedSymbols": { + "IHorizonStaking": [2625], + "LegacyAllocation": [16462] + }, + "id": 16463, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 16292, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:63" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol", + "id": 16294, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 16463, + "sourceUnit": 2626, + "src": "70:98:63", + "symbolAliases": [ + { + "foreign": { + "id": 16293, + "name": "IHorizonStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2625, + "src": "79:15:63", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "LegacyAllocation", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 16295, + "nodeType": "StructuredDocumentation", + "src": "170:233:63", + "text": " @title LegacyAllocation library\n @notice A library to handle legacy Allocations.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 16462, + "linearizedBaseContracts": [16462], + "name": "LegacyAllocation", + "nameLocation": "412:16:63", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 16299, + "libraryName": { + "id": 16296, + "name": "LegacyAllocation", + "nameLocations": ["441:16:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16462, + "src": "441:16:63" + }, + "nodeType": "UsingForDirective", + "src": "435:33:63", + "typeName": { + "id": 16298, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16297, + "name": "State", + "nameLocations": ["462:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "462:5:63" + }, + "referencedDeclaration": 16305, + "src": "462:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + }, + { + "canonicalName": "LegacyAllocation.State", + "documentation": { + "id": 16300, + "nodeType": "StructuredDocumentation", + "src": "474:450:63", + "text": " @notice Legacy allocation details\n @dev Note that we are only storing the indexer and subgraphDeploymentId. The main point of tracking legacy allocations\n is to prevent them from being re used on the Subgraph Service. We don't need to store the rest of the allocation details.\n @param indexer The indexer that owns the allocation\n @param subgraphDeploymentId The subgraph deployment id the allocation is for" + }, + "id": 16305, + "members": [ + { + "constant": false, + "id": 16302, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "960:7:63", + "nodeType": "VariableDeclaration", + "scope": 16305, + "src": "952:15:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16301, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "952:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16304, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "985:20:63", + "nodeType": "VariableDeclaration", + "scope": 16305, + "src": "977:28:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16303, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "977:7:63", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "name": "State", + "nameLocation": "936:5:63", + "nodeType": "StructDefinition", + "scope": 16462, + "src": "929:83:63", + "visibility": "public" + }, + { + "documentation": { + "id": 16306, + "nodeType": "StructuredDocumentation", + "src": "1018:139:63", + "text": " @notice Thrown when attempting to migrate an allocation with an existing id\n @param allocationId The allocation id" + }, + "errorSelector": "b5f497c4", + "id": 16310, + "name": "LegacyAllocationAlreadyExists", + "nameLocation": "1168:29:63", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16309, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16308, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "1206:12:63", + "nodeType": "VariableDeclaration", + "scope": 16310, + "src": "1198:20:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16307, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1198:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1197:22:63" + }, + "src": "1162:58:63" + }, + { + "documentation": { + "id": 16311, + "nodeType": "StructuredDocumentation", + "src": "1226:123:63", + "text": " @notice Thrown when trying to get a non-existent allocation\n @param allocationId The allocation id" + }, + "errorSelector": "40e1fd4a", + "id": 16315, + "name": "LegacyAllocationDoesNotExist", + "nameLocation": "1360:28:63", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16314, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16313, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "1397:12:63", + "nodeType": "VariableDeclaration", + "scope": 16315, + "src": "1389:20:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16312, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1389:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1388:22:63" + }, + "src": "1354:57:63" + }, + { + "body": { + "id": 16351, + "nodeType": "Block", + "src": "2077:202:63", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 16336, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "2095:28:63", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "baseExpression": { + "id": 16331, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16321, + "src": "2096:4:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 16333, + "indexExpression": { + "id": 16332, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16325, + "src": "2101:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2096:18:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage", + "typeString": "struct LegacyAllocation.State storage ref" + } + }, + "id": 16334, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2115:6:63", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 16428, + "src": "2096:25:63", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$16305_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$16305_memory_ptr_$", + "typeString": "function (struct LegacyAllocation.State memory) pure returns (bool)" + } + }, + "id": 16335, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2096:27:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 16338, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16325, + "src": "2155:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16337, + "name": "LegacyAllocationAlreadyExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16310, + "src": "2125:29:63", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 16339, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2125:43:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16330, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2087:7:63", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2087:82:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16341, + "nodeType": "ExpressionStatement", + "src": "2087:82:63" + }, + { + "expression": { + "id": 16349, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 16342, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16321, + "src": "2180:4:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 16344, + "indexExpression": { + "id": 16343, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16325, + "src": "2185:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2180:18:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage", + "typeString": "struct LegacyAllocation.State storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 16346, + "name": "indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16323, + "src": "2218:7:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16347, + "name": "subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16327, + "src": "2249:20:63", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 16345, + "name": "State", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16305, + "src": "2201:5:63", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_State_$16305_storage_ptr_$", + "typeString": "type(struct LegacyAllocation.State storage pointer)" + } + }, + "id": 16348, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": ["2209:7:63", "2227:20:63"], + "names": ["indexer", "subgraphDeploymentId"], + "nodeType": "FunctionCall", + "src": "2201:71:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_memory_ptr", + "typeString": "struct LegacyAllocation.State memory" + } + }, + "src": "2180:92:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage", + "typeString": "struct LegacyAllocation.State storage ref" + } + }, + "id": 16350, + "nodeType": "ExpressionStatement", + "src": "2180:92:63" + } + ] + }, + "documentation": { + "id": 16316, + "nodeType": "StructuredDocumentation", + "src": "1417:482:63", + "text": " @notice Migrate a legacy allocation\n @dev Requirements:\n - The allocation must not have been previously migrated\n @param self The legacy allocation list mapping\n @param indexer The indexer that owns the allocation\n @param allocationId The allocation id\n @param subgraphDeploymentId The subgraph deployment id the allocation is for\n @custom:error LegacyAllocationAlreadyMigrated if the allocation has already been migrated" + }, + "id": 16352, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "migrate", + "nameLocation": "1913:7:63", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16328, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16321, + "mutability": "mutable", + "name": "self", + "nameLocation": "1964:4:63", + "nodeType": "VariableDeclaration", + "scope": 16352, + "src": "1930:38:63", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "typeName": { + "id": 16320, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16317, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1938:7:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1930:25:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16319, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16318, + "name": "State", + "nameLocations": ["1949:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "1949:5:63" + }, + "referencedDeclaration": 16305, + "src": "1949:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16323, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "1986:7:63", + "nodeType": "VariableDeclaration", + "scope": 16352, + "src": "1978:15:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16322, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1978:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16325, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "2011:12:63", + "nodeType": "VariableDeclaration", + "scope": 16352, + "src": "2003:20:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16324, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2003:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16327, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "2041:20:63", + "nodeType": "VariableDeclaration", + "scope": 16352, + "src": "2033:28:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16326, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2033:7:63", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1920:147:63" + }, + "returnParameters": { + "id": 16329, + "nodeType": "ParameterList", + "parameters": [], + "src": "2077:0:63" + }, + "scope": 16462, + "src": "1904:375:63", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16371, + "nodeType": "Block", + "src": "2596:48:63", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 16367, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16358, + "src": "2618:4:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + { + "id": 16368, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16360, + "src": "2624:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16366, + "name": "_get", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16461, + "src": "2613:4:63", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$16305_storage_$_$_t_address_$returns$_t_struct$_State_$16305_storage_ptr_$", + "typeString": "function (mapping(address => struct LegacyAllocation.State storage ref),address) view returns (struct LegacyAllocation.State storage pointer)" + } + }, + "id": 16369, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2613:24:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State storage pointer" + } + }, + "functionReturnParameters": 16365, + "id": 16370, + "nodeType": "Return", + "src": "2606:31:63" + } + ] + }, + "documentation": { + "id": 16353, + "nodeType": "StructuredDocumentation", + "src": "2285:194:63", + "text": " @notice Get a legacy allocation\n @param self The legacy allocation list mapping\n @param allocationId The allocation id\n @return The legacy allocation details" + }, + "id": 16372, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "get", + "nameLocation": "2493:3:63", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16361, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16358, + "mutability": "mutable", + "name": "self", + "nameLocation": "2531:4:63", + "nodeType": "VariableDeclaration", + "scope": 16372, + "src": "2497:38:63", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "typeName": { + "id": 16357, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16354, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2505:7:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "2497:25:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16356, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16355, + "name": "State", + "nameLocations": ["2516:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "2516:5:63" + }, + "referencedDeclaration": 16305, + "src": "2516:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16360, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "2545:12:63", + "nodeType": "VariableDeclaration", + "scope": 16372, + "src": "2537:20:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16359, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2537:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2496:62:63" + }, + "returnParameters": { + "id": 16365, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16364, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16372, + "src": "2582:12:63", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_memory_ptr", + "typeString": "struct LegacyAllocation.State" + }, + "typeName": { + "id": 16363, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16362, + "name": "State", + "nameLocations": ["2582:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "2582:5:63" + }, + "referencedDeclaration": 16305, + "src": "2582:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "2581:14:63" + }, + "scope": 16462, + "src": "2484:160:63", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16409, + "nodeType": "Block", + "src": "3264:203:63", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 16392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3282:28:63", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "baseExpression": { + "id": 16387, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16378, + "src": "3283:4:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 16389, + "indexExpression": { + "id": 16388, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16383, + "src": "3288:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3283:18:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage", + "typeString": "struct LegacyAllocation.State storage ref" + } + }, + "id": 16390, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3302:6:63", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 16428, + "src": "3283:25:63", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$16305_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$16305_memory_ptr_$", + "typeString": "function (struct LegacyAllocation.State memory) pure returns (bool)" + } + }, + "id": 16391, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3283:27:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 16394, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16383, + "src": "3342:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16393, + "name": "LegacyAllocationAlreadyExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16310, + "src": "3312:29:63", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 16395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3312:43:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16386, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3274:7:63", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16396, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3274:82:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16397, + "nodeType": "ExpressionStatement", + "src": "3274:82:63" + }, + { + "expression": { + "arguments": [ + { + "id": 16403, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3374:40:63", + "subExpression": { + "arguments": [ + { + "id": 16401, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16383, + "src": "3401:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 16399, + "name": "graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16381, + "src": "3375:12:63", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 16400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3388:12:63", + "memberName": "isAllocation", + "nodeType": "MemberAccess", + "referencedDeclaration": 3213, + "src": "3375:25:63", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$", + "typeString": "function (address) view external returns (bool)" + } + }, + "id": 16402, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3375:39:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 16405, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16383, + "src": "3446:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16404, + "name": "LegacyAllocationAlreadyExists", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16310, + "src": "3416:29:63", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 16406, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3416:43:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16398, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "3366:7:63", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16407, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3366:94:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16408, + "nodeType": "ExpressionStatement", + "src": "3366:94:63" + } + ] + }, + "documentation": { + "id": 16373, + "nodeType": "StructuredDocumentation", + "src": "2650:449:63", + "text": " @notice Revert if a legacy allocation exists\n @dev We first check the migrated mapping then the old staking contract.\n @dev TRANSITION PERIOD: after the transition period when all the allocations are migrated we can\n remove the call to the staking contract.\n @param self The legacy allocation list mapping\n @param graphStaking The Horizon Staking contract\n @param allocationId The allocation id" + }, + "id": 16410, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "revertIfExists", + "nameLocation": "3113:14:63", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16384, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16378, + "mutability": "mutable", + "name": "self", + "nameLocation": "3171:4:63", + "nodeType": "VariableDeclaration", + "scope": 16410, + "src": "3137:38:63", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "typeName": { + "id": 16377, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16374, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3145:7:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "3137:25:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16376, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16375, + "name": "State", + "nameLocations": ["3156:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "3156:5:63" + }, + "referencedDeclaration": 16305, + "src": "3156:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16381, + "mutability": "mutable", + "name": "graphStaking", + "nameLocation": "3201:12:63", + "nodeType": "VariableDeclaration", + "scope": 16410, + "src": "3185:28:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + "typeName": { + "id": 16380, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16379, + "name": "IHorizonStaking", + "nameLocations": ["3185:15:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2625, + "src": "3185:15:63" + }, + "referencedDeclaration": 2625, + "src": "3185:15:63", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16383, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "3231:12:63", + "nodeType": "VariableDeclaration", + "scope": 16410, + "src": "3223:20:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16382, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3223:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3127:122:63" + }, + "returnParameters": { + "id": 16385, + "nodeType": "ParameterList", + "parameters": [], + "src": "3264:0:63" + }, + "scope": 16462, + "src": "3104:363:63", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16427, + "nodeType": "Block", + "src": "3690:50:63", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 16425, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16419, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16414, + "src": "3707:4:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_memory_ptr", + "typeString": "struct LegacyAllocation.State memory" + } + }, + "id": 16420, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3712:7:63", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 16302, + "src": "3707:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 16423, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3731:1:63", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 16422, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3723:7:63", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16421, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3723:7:63", + "typeDescriptions": {} + } + }, + "id": 16424, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3723:10:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3707:26:63", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 16418, + "id": 16426, + "nodeType": "Return", + "src": "3700:33:63" + } + ] + }, + "documentation": { + "id": 16411, + "nodeType": "StructuredDocumentation", + "src": "3473:148:63", + "text": " @notice Check if a legacy allocation exists\n @param self The legacy allocation\n @return True if the allocation exists" + }, + "id": 16428, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "exists", + "nameLocation": "3635:6:63", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16415, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16414, + "mutability": "mutable", + "name": "self", + "nameLocation": "3655:4:63", + "nodeType": "VariableDeclaration", + "scope": 16428, + "src": "3642:17:63", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_memory_ptr", + "typeString": "struct LegacyAllocation.State" + }, + "typeName": { + "id": 16413, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16412, + "name": "State", + "nameLocations": ["3642:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "3642:5:63" + }, + "referencedDeclaration": 16305, + "src": "3642:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "3641:19:63" + }, + "returnParameters": { + "id": 16418, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16417, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16428, + "src": "3684:4:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 16416, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3684:4:63", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "3683:6:63" + }, + "scope": 16462, + "src": "3626:114:63", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16460, + "nodeType": "Block", + "src": "4058:171:63", + "statements": [ + { + "assignments": [16444], + "declarations": [ + { + "constant": false, + "id": 16444, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "4082:10:63", + "nodeType": "VariableDeclaration", + "scope": 16460, + "src": "4068:24:63", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + }, + "typeName": { + "id": 16443, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16442, + "name": "State", + "nameLocations": ["4068:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "4068:5:63" + }, + "referencedDeclaration": 16305, + "src": "4068:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 16448, + "initialValue": { + "baseExpression": { + "id": 16445, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16434, + "src": "4095:4:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 16447, + "indexExpression": { + "id": 16446, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16436, + "src": "4100:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4095:18:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage", + "typeString": "struct LegacyAllocation.State storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4068:45:63" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 16450, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16444, + "src": "4131:10:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State storage pointer" + } + }, + "id": 16451, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4142:6:63", + "memberName": "exists", + "nodeType": "MemberAccess", + "referencedDeclaration": 16428, + "src": "4131:17:63", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$16305_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$16305_memory_ptr_$", + "typeString": "function (struct LegacyAllocation.State memory) pure returns (bool)" + } + }, + "id": 16452, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4131:19:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 16454, + "name": "allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16436, + "src": "4181:12:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16453, + "name": "LegacyAllocationDoesNotExist", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16315, + "src": "4152:28:63", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 16455, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4152:42:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16449, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "4123:7:63", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16456, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4123:72:63", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16457, + "nodeType": "ExpressionStatement", + "src": "4123:72:63" + }, + { + "expression": { + "id": 16458, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16444, + "src": "4212:10:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State storage pointer" + } + }, + "functionReturnParameters": 16441, + "id": 16459, + "nodeType": "Return", + "src": "4205:17:63" + } + ] + }, + "documentation": { + "id": 16429, + "nodeType": "StructuredDocumentation", + "src": "3746:194:63", + "text": " @notice Get a legacy allocation\n @param self The legacy allocation list mapping\n @param allocationId The allocation id\n @return The legacy allocation details" + }, + "id": 16461, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_get", + "nameLocation": "3954:4:63", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16437, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16434, + "mutability": "mutable", + "name": "self", + "nameLocation": "3993:4:63", + "nodeType": "VariableDeclaration", + "scope": 16461, + "src": "3959:38:63", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "typeName": { + "id": 16433, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16430, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3967:7:63", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "3959:25:63", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16432, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16431, + "name": "State", + "nameLocations": ["3978:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "3978:5:63" + }, + "referencedDeclaration": 16305, + "src": "3978:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16436, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "4007:12:63", + "nodeType": "VariableDeclaration", + "scope": 16461, + "src": "3999:20:63", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16435, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3999:7:63", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3958:62:63" + }, + "returnParameters": { + "id": 16441, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16440, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 16461, + "src": "4043:13:63", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + }, + "typeName": { + "id": 16439, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16438, + "name": "State", + "nameLocations": ["4043:5:63"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "4043:5:63" + }, + "referencedDeclaration": 16305, + "src": "4043:5:63", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + }, + "visibility": "internal" + } + ], + "src": "4042:15:63" + }, + "scope": 16462, + "src": "3945:284:63", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 16463, + "src": "404:3827:63", + "usedErrors": [16310, 16315], + "usedEvents": [] + } + ], + "src": "45:4187:63" + }, + "id": 63 + }, + "contracts/mocks/imports.sol": { + "ast": { + "absolutePath": "contracts/mocks/imports.sol", + "exportedSymbols": { + "ICallhookReceiver": [382], + "IDisputeManager": [314], + "IL2Curation": [481], + "IL2GNS": [532] + }, + "id": 16468, + "license": "GPL-2.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 16464, + "literals": ["solidity", "^", "0.7", ".6", "||", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:33:64" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol", + "file": "@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol", + "id": 16465, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 16468, + "sourceUnit": 482, + "src": "130:72:64", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol", + "file": "@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol", + "id": 16466, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 16468, + "sourceUnit": 533, + "src": "203:68:64", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol", + "file": "@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol", + "id": 16467, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 16468, + "sourceUnit": 315, + "src": "272:73:64", + "symbolAliases": [], + "unitAlias": "" + } + ], + "src": "45:301:64" + }, + "id": 64 + }, + "contracts/utilities/AllocationManager.sol": { + "ast": { + "absolutePath": "contracts/utilities/AllocationManager.sol", + "exportedSymbols": { + "Allocation": [16033], + "AllocationManager": [17363], + "AllocationManagerV1Storage": [17401], + "ECDSA": [8231], + "EIP712Upgradeable": [6044], + "GraphDirectory": [4928], + "IGraphPayments": [2489], + "IGraphToken": [758], + "IHorizonStakingTypes": [4073], + "LegacyAllocation": [16462], + "PPMMath": [4539], + "ProvisionTracker": [1801], + "TokenUtils": [840] + }, + "id": 17364, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 16469, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:65" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol", + "id": 16471, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 2490, + "src": "70:96:65", + "symbolAliases": [ + { + "foreign": { + "id": 16470, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "79:14:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "file": "@graphprotocol/contracts/contracts/token/IGraphToken.sol", + "id": 16473, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 759, + "src": "167:87:65", + "symbolAliases": [ + { + "foreign": { + "id": 16472, + "name": "IGraphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 758, + "src": "176:11:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol", + "id": 16475, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 4074, + "src": "255:117:65", + "symbolAliases": [ + { + "foreign": { + "id": 16474, + "name": "IHorizonStakingTypes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4073, + "src": "264:20:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "file": "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol", + "id": 16477, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 4929, + "src": "374:95:65", + "symbolAliases": [ + { + "foreign": { + "id": 16476, + "name": "GraphDirectory", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4928, + "src": "383:14:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/utilities/AllocationManagerStorage.sol", + "file": "./AllocationManagerStorage.sol", + "id": 16479, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 17402, + "src": "470:76:65", + "symbolAliases": [ + { + "foreign": { + "id": 16478, + "name": "AllocationManagerV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17401, + "src": "479:26:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "file": "@graphprotocol/contracts/contracts/utils/TokenUtils.sol", + "id": 16481, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 841, + "src": "548:85:65", + "symbolAliases": [ + { + "foreign": { + "id": 16480, + "name": "TokenUtils", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 840, + "src": "557:10:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", + "file": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", + "id": 16483, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 8232, + "src": "634:77:65", + "symbolAliases": [ + { + "foreign": { + "id": 16482, + "name": "ECDSA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8231, + "src": "643:5:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol", + "file": "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol", + "id": 16485, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 6045, + "src": "712:113:65", + "symbolAliases": [ + { + "foreign": { + "id": 16484, + "name": "EIP712Upgradeable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 6044, + "src": "721:17:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/Allocation.sol", + "file": "../libraries/Allocation.sol", + "id": 16487, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 16034, + "src": "826:57:65", + "symbolAliases": [ + { + "foreign": { + "id": 16486, + "name": "Allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16033, + "src": "835:10:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/LegacyAllocation.sol", + "file": "../libraries/LegacyAllocation.sol", + "id": 16489, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 16463, + "src": "884:69:65", + "symbolAliases": [ + { + "foreign": { + "id": 16488, + "name": "LegacyAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16462, + "src": "893:16:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "file": "@graphprotocol/horizon/contracts/libraries/PPMMath.sol", + "id": 16491, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 4540, + "src": "954:81:65", + "symbolAliases": [ + { + "foreign": { + "id": 16490, + "name": "PPMMath", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4539, + "src": "963:7:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol", + "file": "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol", + "id": 16493, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17364, + "sourceUnit": 1802, + "src": "1036:112:65", + "symbolAliases": [ + { + "foreign": { + "id": 16492, + "name": "ProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1801, + "src": "1045:16:65", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 16495, + "name": "EIP712Upgradeable", + "nameLocations": ["1586:17:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 6044, + "src": "1586:17:65" + }, + "id": 16496, + "nodeType": "InheritanceSpecifier", + "src": "1586:17:65" + }, + { + "baseName": { + "id": 16497, + "name": "GraphDirectory", + "nameLocations": ["1605:14:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4928, + "src": "1605:14:65" + }, + "id": 16498, + "nodeType": "InheritanceSpecifier", + "src": "1605:14:65" + }, + { + "baseName": { + "id": 16499, + "name": "AllocationManagerV1Storage", + "nameLocations": ["1621:26:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17401, + "src": "1621:26:65" + }, + "id": 16500, + "nodeType": "InheritanceSpecifier", + "src": "1621:26:65" + } + ], + "canonicalName": "AllocationManager", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 16494, + "nodeType": "StructuredDocumentation", + "src": "1150:396:65", + "text": " @title AllocationManager contract\n @notice A helper contract implementing allocation lifecycle management.\n Allows opening, resizing, and closing allocations, as well as collecting indexing rewards by presenting a Proof\n of Indexing (POI).\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 17363, + "linearizedBaseContracts": [17363, 17401, 4928, 6044, 6069, 5391], + "name": "AllocationManager", + "nameLocation": "1565:17:65", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 16505, + "libraryName": { + "id": 16501, + "name": "ProvisionTracker", + "nameLocations": ["1660:16:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1801, + "src": "1660:16:65" + }, + "nodeType": "UsingForDirective", + "src": "1654:55:65", + "typeName": { + "id": 16504, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16502, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1689:7:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1681:27:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16503, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1700:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + } + }, + { + "global": false, + "id": 16511, + "libraryName": { + "id": 16506, + "name": "Allocation", + "nameLocations": ["1720:10:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16033, + "src": "1720:10:65" + }, + "nodeType": "UsingForDirective", + "src": "1714:58:65", + "typeName": { + "id": 16510, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16507, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1743:7:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1735:36:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16509, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16508, + "name": "Allocation.State", + "nameLocations": ["1754:10:65", "1765:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "1754:16:65" + }, + "referencedDeclaration": 15663, + "src": "1754:16:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + } + }, + { + "global": false, + "id": 16515, + "libraryName": { + "id": 16512, + "name": "Allocation", + "nameLocations": ["1783:10:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16033, + "src": "1783:10:65" + }, + "nodeType": "UsingForDirective", + "src": "1777:38:65", + "typeName": { + "id": 16514, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16513, + "name": "Allocation.State", + "nameLocations": ["1798:10:65", "1809:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "1798:16:65" + }, + "referencedDeclaration": 15663, + "src": "1798:16:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + { + "global": false, + "id": 16521, + "libraryName": { + "id": 16516, + "name": "LegacyAllocation", + "nameLocations": ["1826:16:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16462, + "src": "1826:16:65" + }, + "nodeType": "UsingForDirective", + "src": "1820:70:65", + "typeName": { + "id": 16520, + "keyName": "", + "keyNameLocation": "-1:-1:-1", + "keyType": { + "id": 16517, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1855:7:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1847:42:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "valueName": "", + "valueNameLocation": "-1:-1:-1", + "valueType": { + "id": 16519, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16518, + "name": "LegacyAllocation.State", + "nameLocations": ["1866:16:65", "1883:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "1866:22:65" + }, + "referencedDeclaration": 16305, + "src": "1866:22:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + } + }, + { + "global": false, + "id": 16524, + "libraryName": { + "id": 16522, + "name": "PPMMath", + "nameLocations": ["1901:7:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 4539, + "src": "1901:7:65" + }, + "nodeType": "UsingForDirective", + "src": "1895:26:65", + "typeName": { + "id": 16523, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1913:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "global": false, + "id": 16528, + "libraryName": { + "id": 16525, + "name": "TokenUtils", + "nameLocations": ["1932:10:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 840, + "src": "1932:10:65" + }, + "nodeType": "UsingForDirective", + "src": "1926:33:65", + "typeName": { + "id": 16527, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16526, + "name": "IGraphToken", + "nameLocations": ["1947:11:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 758, + "src": "1947:11:65" + }, + "referencedDeclaration": 758, + "src": "1947:11:65", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + } + }, + { + "constant": true, + "documentation": { + "id": 16529, + "nodeType": "StructuredDocumentation", + "src": "1965:47:65", + "text": "@dev EIP712 typehash for allocation id proof" + }, + "id": 16534, + "mutability": "constant", + "name": "EIP712_ALLOCATION_ID_PROOF_TYPEHASH", + "nameLocation": "2042:35:65", + "nodeType": "VariableDeclaration", + "scope": 17363, + "src": "2017:139:65", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16530, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2017:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "416c6c6f636174696f6e496450726f6f66286164647265737320696e64657865722c6164647265737320616c6c6f636174696f6e496429", + "id": 16532, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2098:57:65", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f74673", + "typeString": "literal_string \"AllocationIdProof(address indexer,address allocationId)\"" + }, + "value": "AllocationIdProof(address indexer,address allocationId)" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f74673", + "typeString": "literal_string \"AllocationIdProof(address indexer,address allocationId)\"" + } + ], + "id": 16531, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2088:9:65", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 16533, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2088:68:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": { + "id": 16535, + "nodeType": "StructuredDocumentation", + "src": "2163:339:65", + "text": " @notice Emitted when an indexer creates an allocation\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment\n @param tokens The amount of tokens allocated\n @param currentEpoch The current epoch" + }, + "eventSelector": "e5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f83", + "id": 16547, + "name": "AllocationCreated", + "nameLocation": "2513:17:65", + "nodeType": "EventDefinition", + "parameters": { + "id": 16546, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16537, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "2556:7:65", + "nodeType": "VariableDeclaration", + "scope": 16547, + "src": "2540:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16536, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2540:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16539, + "indexed": true, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "2589:12:65", + "nodeType": "VariableDeclaration", + "scope": 16547, + "src": "2573:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16538, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2573:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16541, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "2627:20:65", + "nodeType": "VariableDeclaration", + "scope": 16547, + "src": "2611:36:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16540, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2611:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16543, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "2665:6:65", + "nodeType": "VariableDeclaration", + "scope": 16547, + "src": "2657:14:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16542, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2657:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16545, + "indexed": false, + "mutability": "mutable", + "name": "currentEpoch", + "nameLocation": "2689:12:65", + "nodeType": "VariableDeclaration", + "scope": 16547, + "src": "2681:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16544, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2681:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2530:177:65" + }, + "src": "2507:201:65" + }, + { + "anonymous": false, + "documentation": { + "id": 16548, + "nodeType": "StructuredDocumentation", + "src": "2714:633:65", + "text": " @notice Emitted when an indexer collects indexing rewards for an allocation\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment\n @param tokensRewards The amount of tokens collected\n @param tokensIndexerRewards The amount of tokens collected for the indexer\n @param tokensDelegationRewards The amount of tokens collected for delegators\n @param poi The POI presented\n @param currentEpoch The current epoch\n @param poiMetadata The metadata associated with the POI" + }, + "eventSelector": "443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f", + "id": 16568, + "name": "IndexingRewardsCollected", + "nameLocation": "3358:24:65", + "nodeType": "EventDefinition", + "parameters": { + "id": 16567, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16550, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "3408:7:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3392:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16549, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3392:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16552, + "indexed": true, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "3441:12:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3425:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16551, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3425:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16554, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "3479:20:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3463:36:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16553, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3463:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16556, + "indexed": false, + "mutability": "mutable", + "name": "tokensRewards", + "nameLocation": "3517:13:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3509:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16555, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3509:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16558, + "indexed": false, + "mutability": "mutable", + "name": "tokensIndexerRewards", + "nameLocation": "3548:20:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3540:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16557, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3540:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16560, + "indexed": false, + "mutability": "mutable", + "name": "tokensDelegationRewards", + "nameLocation": "3586:23:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3578:31:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16559, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3578:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16562, + "indexed": false, + "mutability": "mutable", + "name": "poi", + "nameLocation": "3627:3:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3619:11:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16561, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3619:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16564, + "indexed": false, + "mutability": "mutable", + "name": "poiMetadata", + "nameLocation": "3646:11:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3640:17:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16563, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3640:5:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16566, + "indexed": false, + "mutability": "mutable", + "name": "currentEpoch", + "nameLocation": "3675:12:65", + "nodeType": "VariableDeclaration", + "scope": 16568, + "src": "3667:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16565, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3667:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3382:311:65" + }, + "src": "3352:342:65" + }, + { + "anonymous": false, + "documentation": { + "id": 16569, + "nodeType": "StructuredDocumentation", + "src": "3700:360:65", + "text": " @notice Emitted when an indexer resizes an allocation\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment\n @param newTokens The new amount of tokens allocated\n @param oldTokens The old amount of tokens allocated" + }, + "eventSelector": "6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f", + "id": 16581, + "name": "AllocationResized", + "nameLocation": "4071:17:65", + "nodeType": "EventDefinition", + "parameters": { + "id": 16580, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16571, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "4114:7:65", + "nodeType": "VariableDeclaration", + "scope": 16581, + "src": "4098:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16570, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4098:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16573, + "indexed": true, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "4147:12:65", + "nodeType": "VariableDeclaration", + "scope": 16581, + "src": "4131:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16572, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4131:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16575, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "4185:20:65", + "nodeType": "VariableDeclaration", + "scope": 16581, + "src": "4169:36:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16574, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4169:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16577, + "indexed": false, + "mutability": "mutable", + "name": "newTokens", + "nameLocation": "4223:9:65", + "nodeType": "VariableDeclaration", + "scope": 16581, + "src": "4215:17:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16576, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4215:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16579, + "indexed": false, + "mutability": "mutable", + "name": "oldTokens", + "nameLocation": "4250:9:65", + "nodeType": "VariableDeclaration", + "scope": 16581, + "src": "4242:17:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16578, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4242:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4088:177:65" + }, + "src": "4065:201:65" + }, + { + "anonymous": false, + "documentation": { + "id": 16582, + "nodeType": "StructuredDocumentation", + "src": "4272:356:65", + "text": " @dev Emitted when an indexer closes an allocation\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment\n @param tokens The amount of tokens allocated\n @param forceClosed Whether the allocation was force closed" + }, + "eventSelector": "08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f545", + "id": 16594, + "name": "AllocationClosed", + "nameLocation": "4639:16:65", + "nodeType": "EventDefinition", + "parameters": { + "id": 16593, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16584, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "4681:7:65", + "nodeType": "VariableDeclaration", + "scope": 16594, + "src": "4665:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16583, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4665:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16586, + "indexed": true, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "4714:12:65", + "nodeType": "VariableDeclaration", + "scope": 16594, + "src": "4698:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16585, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4698:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16588, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "4752:20:65", + "nodeType": "VariableDeclaration", + "scope": 16594, + "src": "4736:36:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16587, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4736:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16590, + "indexed": false, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "4790:6:65", + "nodeType": "VariableDeclaration", + "scope": 16594, + "src": "4782:14:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16589, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4782:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16592, + "indexed": false, + "mutability": "mutable", + "name": "forceClosed", + "nameLocation": "4811:11:65", + "nodeType": "VariableDeclaration", + "scope": 16594, + "src": "4806:16:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 16591, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4806:4:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "4655:173:65" + }, + "src": "4633:196:65" + }, + { + "anonymous": false, + "documentation": { + "id": 16595, + "nodeType": "StructuredDocumentation", + "src": "4835:267:65", + "text": " @notice Emitted when a legacy allocation is migrated into the subgraph service\n @param indexer The address of the indexer\n @param allocationId The id of the allocation\n @param subgraphDeploymentId The id of the subgraph deployment" + }, + "eventSelector": "d54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e19", + "id": 16603, + "name": "LegacyAllocationMigrated", + "nameLocation": "5113:24:65", + "nodeType": "EventDefinition", + "parameters": { + "id": 16602, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16597, + "indexed": true, + "mutability": "mutable", + "name": "indexer", + "nameLocation": "5163:7:65", + "nodeType": "VariableDeclaration", + "scope": 16603, + "src": "5147:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16596, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5147:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16599, + "indexed": true, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5196:12:65", + "nodeType": "VariableDeclaration", + "scope": 16603, + "src": "5180:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16598, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5180:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16601, + "indexed": true, + "mutability": "mutable", + "name": "subgraphDeploymentId", + "nameLocation": "5234:20:65", + "nodeType": "VariableDeclaration", + "scope": 16603, + "src": "5218:36:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16600, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5218:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "5137:123:65" + }, + "src": "5107:154:65" + }, + { + "anonymous": false, + "documentation": { + "id": 16604, + "nodeType": "StructuredDocumentation", + "src": "5267:139:65", + "text": " @notice Emitted when the maximum POI staleness is updated\n @param maxPOIStaleness The max POI staleness in seconds" + }, + "eventSelector": "21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba", + "id": 16608, + "name": "MaxPOIStalenessSet", + "nameLocation": "5417:18:65", + "nodeType": "EventDefinition", + "parameters": { + "id": 16607, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16606, + "indexed": false, + "mutability": "mutable", + "name": "maxPOIStaleness", + "nameLocation": "5444:15:65", + "nodeType": "VariableDeclaration", + "scope": 16608, + "src": "5436:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16605, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5436:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5435:25:65" + }, + "src": "5411:50:65" + }, + { + "documentation": { + "id": 16609, + "nodeType": "StructuredDocumentation", + "src": "5467:248:65", + "text": " @notice Thrown when an allocation proof is invalid\n Both `signer` and `allocationId` should match for a valid proof.\n @param signer The address that signed the proof\n @param allocationId The id of the allocation" + }, + "errorSelector": "8c5b935d", + "id": 16615, + "name": "AllocationManagerInvalidAllocationProof", + "nameLocation": "5726:39:65", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16614, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16611, + "mutability": "mutable", + "name": "signer", + "nameLocation": "5774:6:65", + "nodeType": "VariableDeclaration", + "scope": 16615, + "src": "5766:14:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16610, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5766:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16613, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "5790:12:65", + "nodeType": "VariableDeclaration", + "scope": 16615, + "src": "5782:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16612, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5782:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5765:38:65" + }, + "src": "5720:84:65" + }, + { + "documentation": { + "id": 16616, + "nodeType": "StructuredDocumentation", + "src": "5810:99:65", + "text": " @notice Thrown when attempting to create an allocation with a zero allocation id" + }, + "errorSelector": "9ffbebde", + "id": 16618, + "name": "AllocationManagerInvalidZeroAllocationId", + "nameLocation": "5920:40:65", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16617, + "nodeType": "ParameterList", + "parameters": [], + "src": "5960:2:65" + }, + "src": "5914:49:65" + }, + { + "documentation": { + "id": 16619, + "nodeType": "StructuredDocumentation", + "src": "5969:153:65", + "text": " @notice Thrown when attempting to collect indexing rewards on a closed allocationl\n @param allocationId The id of the allocation" + }, + "errorSelector": "1eb5ff95", + "id": 16623, + "name": "AllocationManagerAllocationClosed", + "nameLocation": "6133:33:65", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16622, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16621, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "6175:12:65", + "nodeType": "VariableDeclaration", + "scope": 16623, + "src": "6167:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16620, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6167:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6166:22:65" + }, + "src": "6127:62:65" + }, + { + "documentation": { + "id": 16624, + "nodeType": "StructuredDocumentation", + "src": "6195:186:65", + "text": " @notice Thrown when attempting to resize an allocation with the same size\n @param allocationId The id of the allocation\n @param tokens The amount of tokens" + }, + "errorSelector": "f32518cd", + "id": 16630, + "name": "AllocationManagerAllocationSameSize", + "nameLocation": "6392:35:65", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 16629, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16626, + "mutability": "mutable", + "name": "allocationId", + "nameLocation": "6436:12:65", + "nodeType": "VariableDeclaration", + "scope": 16630, + "src": "6428:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16625, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6428:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16628, + "mutability": "mutable", + "name": "tokens", + "nameLocation": "6458:6:65", + "nodeType": "VariableDeclaration", + "scope": 16630, + "src": "6450:14:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16627, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6450:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6427:38:65" + }, + "src": "6386:80:65" + }, + { + "body": { + "id": 16648, + "nodeType": "Block", + "src": "6790:93:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 16641, + "name": "_name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16633, + "src": "6814:5:65", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 16642, + "name": "_version", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16635, + "src": "6821:8:65", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + ], + "id": 16640, + "name": "__EIP712_init", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5757, + "src": "6800:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory,string memory)" + } + }, + "id": 16643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6800:30:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16644, + "nodeType": "ExpressionStatement", + "src": "6800:30:65" + }, + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16645, + "name": "__AllocationManager_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16656, + "src": "6840:34:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 16646, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6840:36:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16647, + "nodeType": "ExpressionStatement", + "src": "6840:36:65" + } + ] + }, + "documentation": { + "id": 16631, + "nodeType": "StructuredDocumentation", + "src": "6472:208:65", + "text": " @notice Initializes the contract and parent contracts\n @param _name The name to use for EIP712 domain separation\n @param _version The version to use for EIP712 domain separation" + }, + "id": 16649, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 16638, + "kind": "modifierInvocation", + "modifierName": { + "id": 16637, + "name": "onlyInitializing", + "nameLocations": ["6773:16:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "6773:16:65" + }, + "nodeType": "ModifierInvocation", + "src": "6773:16:65" + } + ], + "name": "__AllocationManager_init", + "nameLocation": "6694:24:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16636, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16633, + "mutability": "mutable", + "name": "_name", + "nameLocation": "6733:5:65", + "nodeType": "VariableDeclaration", + "scope": 16649, + "src": "6719:19:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 16632, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6719:6:65", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16635, + "mutability": "mutable", + "name": "_version", + "nameLocation": "6754:8:65", + "nodeType": "VariableDeclaration", + "scope": 16649, + "src": "6740:22:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 16634, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "6740:6:65", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "6718:45:65" + }, + "returnParameters": { + "id": 16639, + "nodeType": "ParameterList", + "parameters": [], + "src": "6790:0:65" + }, + "scope": 17363, + "src": "6685:198:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16655, + "nodeType": "Block", + "src": "7017:2:65", + "statements": [] + }, + "documentation": { + "id": 16650, + "nodeType": "StructuredDocumentation", + "src": "6889:51:65", + "text": " @notice Initializes the contract" + }, + "id": 16656, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 16653, + "kind": "modifierInvocation", + "modifierName": { + "id": 16652, + "name": "onlyInitializing", + "nameLocations": ["7000:16:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "7000:16:65" + }, + "nodeType": "ModifierInvocation", + "src": "7000:16:65" + } + ], + "name": "__AllocationManager_init_unchained", + "nameLocation": "6954:34:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16651, + "nodeType": "ParameterList", + "parameters": [], + "src": "6988:2:65" + }, + "returnParameters": { + "id": 16654, + "nodeType": "ParameterList", + "parameters": [], + "src": "7017:0:65" + }, + "scope": 17363, + "src": "6945:74:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16680, + "nodeType": "Block", + "src": "7643:178:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 16669, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16659, + "src": "7680:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16670, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16661, + "src": "7690:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16671, + "name": "_subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16663, + "src": "7705:21:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 16666, + "name": "_legacyAllocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17382, + "src": "7653:18:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 16668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7672:7:65", + "memberName": "migrate", + "nodeType": "MemberAccess", + "referencedDeclaration": 16352, + "src": "7653:26:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$16305_storage_$_$_t_address_$_t_address_$_t_bytes32_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$16305_storage_$_$", + "typeString": "function (mapping(address => struct LegacyAllocation.State storage ref),address,address,bytes32)" + } + }, + "id": 16672, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7653:74:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16673, + "nodeType": "ExpressionStatement", + "src": "7653:74:65" + }, + { + "eventCall": { + "arguments": [ + { + "id": 16675, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16659, + "src": "7767:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16676, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16661, + "src": "7777:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16677, + "name": "_subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16663, + "src": "7792:21:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 16674, + "name": "LegacyAllocationMigrated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16603, + "src": "7742:24:65", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bytes32_$returns$__$", + "typeString": "function (address,address,bytes32)" + } + }, + "id": 16678, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7742:72:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16679, + "nodeType": "EmitStatement", + "src": "7737:77:65" + } + ] + }, + "documentation": { + "id": 16657, + "nodeType": "StructuredDocumentation", + "src": "7025:498:65", + "text": " @notice Imports a legacy allocation id into the subgraph service\n This is a governor only action that is required to prevent indexers from re-using allocation ids from the\n legacy staking contract. It will revert with LegacyAllocationAlreadyMigrated if the allocation has already been migrated.\n @param _indexer The address of the indexer\n @param _allocationId The id of the allocation\n @param _subgraphDeploymentId The id of the subgraph deployment" + }, + "id": 16681, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_migrateLegacyAllocation", + "nameLocation": "7537:24:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16664, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16659, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "7570:8:65", + "nodeType": "VariableDeclaration", + "scope": 16681, + "src": "7562:16:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16658, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7562:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16661, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "7588:13:65", + "nodeType": "VariableDeclaration", + "scope": 16681, + "src": "7580:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16660, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7580:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16663, + "mutability": "mutable", + "name": "_subgraphDeploymentId", + "nameLocation": "7611:21:65", + "nodeType": "VariableDeclaration", + "scope": 16681, + "src": "7603:29:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16662, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7603:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "7561:72:65" + }, + "returnParameters": { + "id": 16665, + "nodeType": "ParameterList", + "parameters": [], + "src": "7643:0:65" + }, + "scope": 17363, + "src": "7528:293:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 16780, + "nodeType": "Block", + "src": "8758:1346:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 16703, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16698, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16686, + "src": "8776:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 16701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8801:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 16700, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8793:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16699, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8793:7:65", + "typeDescriptions": {} + } + }, + "id": 16702, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8793:10:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "8776:27:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16704, + "name": "AllocationManagerInvalidZeroAllocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16618, + "src": "8805:40:65", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$_t_error_$", + "typeString": "function () pure returns (error)" + } + }, + "id": 16705, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8805:42:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16697, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "8768:7:65", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8768:80:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16707, + "nodeType": "ExpressionStatement", + "src": "8768:80:65" + }, + { + "expression": { + "arguments": [ + { + "id": 16709, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16684, + "src": "8882:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16710, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16686, + "src": "8892:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16711, + "name": "_allocationProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16692, + "src": "8907:16:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 16708, + "name": "_verifyAllocationProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17362, + "src": "8859:22:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (address,address,bytes memory) view" + } + }, + "id": 16712, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8859:65:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16713, + "nodeType": "ExpressionStatement", + "src": "8859:65:65" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16717, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "9111:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16718, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9111:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + { + "id": 16719, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16686, + "src": "9128:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 16714, + "name": "_legacyAllocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17382, + "src": "9077:18:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State storage ref)" + } + }, + "id": 16716, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9096:14:65", + "memberName": "revertIfExists", + "nodeType": "MemberAccess", + "referencedDeclaration": 16410, + "src": "9077:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$16305_storage_$_$_t_contract$_IHorizonStaking_$2625_$_t_address_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$16305_storage_$_$", + "typeString": "function (mapping(address => struct LegacyAllocation.State storage ref),contract IHorizonStaking,address) view" + } + }, + "id": 16720, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9077:65:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16721, + "nodeType": "ExpressionStatement", + "src": "9077:65:65" + }, + { + "assignments": [16723], + "declarations": [ + { + "constant": false, + "id": 16723, + "mutability": "mutable", + "name": "currentEpoch", + "nameLocation": "9161:12:65", + "nodeType": "VariableDeclaration", + "scope": 16780, + "src": "9153:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16722, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9153:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 16728, + "initialValue": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16724, + "name": "_graphEpochManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4855, + "src": "9176:18:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IEpochManager_$369_$", + "typeString": "function () view returns (contract IEpochManager)" + } + }, + "id": 16725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9176:20:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "id": 16726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9197:12:65", + "memberName": "currentEpoch", + "nodeType": "MemberAccess", + "referencedDeclaration": 346, + "src": "9176:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", + "typeString": "function () view external returns (uint256)" + } + }, + "id": 16727, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9176:35:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9153:58:65" + }, + { + "assignments": [16733], + "declarations": [ + { + "constant": false, + "id": 16733, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "9245:10:65", + "nodeType": "VariableDeclaration", + "scope": 16780, + "src": "9221:34:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 16732, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16731, + "name": "Allocation.State", + "nameLocations": ["9221:10:65", "9232:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "9221:16:65" + }, + "referencedDeclaration": 15663, + "src": "9221:16:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 16747, + "initialValue": { + "arguments": [ + { + "id": 16736, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16684, + "src": "9291:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16737, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16686, + "src": "9313:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16738, + "name": "_subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16688, + "src": "9340:21:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 16739, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16690, + "src": "9375:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 16743, + "name": "_subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16688, + "src": "9446:21:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16740, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "9396:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 16741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9396:22:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 16742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9419:26:65", + "memberName": "onSubgraphAllocationUpdate", + "nodeType": "MemberAccess", + "referencedDeclaration": 677, + "src": "9396:49:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$returns$_t_uint256_$", + "typeString": "function (bytes32) external returns (uint256)" + } + }, + "id": 16744, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9396:72:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 16745, + "name": "currentEpoch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16723, + "src": "9482:12:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 16734, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "9258:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 16735, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9271:6:65", + "memberName": "create", + "nodeType": "MemberAccess", + "referencedDeclaration": 15741, + "src": "9258:19:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address,address,bytes32,uint256,uint256,uint256) returns (struct Allocation.State memory)" + } + }, + "id": 16746, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9258:246:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9221:283:65" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16751, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "9689:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9689:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + { + "id": 16753, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16684, + "src": "9706:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16754, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16690, + "src": "9716:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 16755, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16694, + "src": "9725:16:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 16748, + "name": "allocationProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17387, + "src": "9657:26:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 16750, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9684:4:65", + "memberName": "lock", + "nodeType": "MemberAccess", + "referencedDeclaration": 1726, + "src": "9657:31:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_uint256_$_$_t_contract$_IHorizonStaking_$2625_$_t_address_$_t_uint256_$_t_uint32_$returns$__$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),contract IHorizonStaking,address,uint256,uint32)" + } + }, + "id": 16756, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9657:85:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16757, + "nodeType": "ExpressionStatement", + "src": "9657:85:65" + }, + { + "expression": { + "id": 16769, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 16758, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "9822:24:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 16761, + "indexExpression": { + "expression": { + "id": 16759, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16733, + "src": "9847:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16760, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9858:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "9847:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "9822:57:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16768, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 16762, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "9894:24:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 16765, + "indexExpression": { + "expression": { + "id": 16763, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16733, + "src": "9919:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16764, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9930:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "9919:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9894:57:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "expression": { + "id": 16766, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16733, + "src": "9966:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16767, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9977:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "9966:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9894:89:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9822:161:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 16770, + "nodeType": "ExpressionStatement", + "src": "9822:161:65" + }, + { + "eventCall": { + "arguments": [ + { + "id": 16772, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16684, + "src": "10017:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16773, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16686, + "src": "10027:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16774, + "name": "_subgraphDeploymentId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16688, + "src": "10042:21:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 16775, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16733, + "src": "10065:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16776, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "10076:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "10065:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 16777, + "name": "currentEpoch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16723, + "src": "10084:12:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16771, + "name": "AllocationCreated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16547, + "src": "9999:17:65", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,bytes32,uint256,uint256)" + } + }, + "id": 16778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9999:98:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16779, + "nodeType": "EmitStatement", + "src": "9994:103:65" + } + ] + }, + "documentation": { + "id": 16682, + "nodeType": "StructuredDocumentation", + "src": "7827:699:65", + "text": " @notice Create an allocation\n @dev The `_allocationProof` is a 65-bytes Ethereum signed message of `keccak256(indexerAddress,allocationId)`\n Requirements:\n - `_allocationId` must not be the zero address\n Emits a {AllocationCreated} event\n @param _indexer The address of the indexer\n @param _allocationId The id of the allocation to be created\n @param _subgraphDeploymentId The subgraph deployment Id\n @param _tokens The amount of tokens to allocate\n @param _allocationProof Signed proof of allocation id address ownership\n @param _delegationRatio The delegation ratio to consider when locking tokens" + }, + "id": 16781, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_allocate", + "nameLocation": "8540:9:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16695, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16684, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "8567:8:65", + "nodeType": "VariableDeclaration", + "scope": 16781, + "src": "8559:16:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16683, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8559:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16686, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "8593:13:65", + "nodeType": "VariableDeclaration", + "scope": 16781, + "src": "8585:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16685, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8585:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16688, + "mutability": "mutable", + "name": "_subgraphDeploymentId", + "nameLocation": "8624:21:65", + "nodeType": "VariableDeclaration", + "scope": 16781, + "src": "8616:29:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16687, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8616:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16690, + "mutability": "mutable", + "name": "_tokens", + "nameLocation": "8663:7:65", + "nodeType": "VariableDeclaration", + "scope": 16781, + "src": "8655:15:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16689, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8655:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16692, + "mutability": "mutable", + "name": "_allocationProof", + "nameLocation": "8693:16:65", + "nodeType": "VariableDeclaration", + "scope": 16781, + "src": "8680:29:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16691, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8680:5:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16694, + "mutability": "mutable", + "name": "_delegationRatio", + "nameLocation": "8726:16:65", + "nodeType": "VariableDeclaration", + "scope": 16781, + "src": "8719:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 16693, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "8719:6:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "8549:199:65" + }, + "returnParameters": { + "id": 16696, + "nodeType": "ParameterList", + "parameters": [], + "src": "8758:0:65" + }, + "scope": 17363, + "src": "8531:1573:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17043, + "nodeType": "Block", + "src": "12059:3207:65", + "statements": [ + { + "assignments": [16801], + "declarations": [ + { + "constant": false, + "id": 16801, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "12093:10:65", + "nodeType": "VariableDeclaration", + "scope": 17043, + "src": "12069:34:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 16800, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16799, + "name": "Allocation.State", + "nameLocations": ["12069:10:65", "12080:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "12069:16:65" + }, + "referencedDeclaration": 15663, + "src": "12069:16:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 16806, + "initialValue": { + "arguments": [ + { + "id": 16804, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "12123:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 16802, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "12106:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 16803, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12119:3:65", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "12106:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 16805, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12106:31:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12069:68:65" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 16808, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "12155:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16809, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12166:6:65", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "12155:17:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 16810, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12155:19:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 16812, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "12210:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 16811, + "name": "AllocationManagerAllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16623, + "src": "12176:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 16813, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12176:48:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 16807, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "12147:7:65", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 16814, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12147:78:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16815, + "nodeType": "ExpressionStatement", + "src": "12147:78:65" + }, + { + "assignments": [16817], + "declarations": [ + { + "constant": false, + "id": 16817, + "mutability": "mutable", + "name": "tokensRewards", + "nameLocation": "12303:13:65", + "nodeType": "VariableDeclaration", + "scope": 17043, + "src": "12295:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16816, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12295:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 16851, + "initialValue": { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 16843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 16834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 16827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16822, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "12320:36:65", + "subExpression": { + "arguments": [ + { + "id": 16820, + "name": "maxPOIStaleness", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17390, + "src": "12340:15:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 16818, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "12321:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16819, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12332:7:65", + "memberName": "isStale", + "nodeType": "MemberAccess", + "referencedDeclaration": 15946, + "src": "12321:18:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_State_$15663_memory_ptr_$_t_uint256_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory,uint256) view returns (bool)" + } + }, + "id": 16821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12321:35:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "id": 16826, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "12372:26:65", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 16823, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "12373:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16824, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12384:12:65", + "memberName": "isAltruistic", + "nodeType": "MemberAccess", + "referencedDeclaration": 15999, + "src": "12373:23:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 16825, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12373:25:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "12320:78:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 16833, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16828, + "name": "_poi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16786, + "src": "12414:4:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 16831, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12430:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 16830, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12422:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 16829, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "12422:7:65", + "typeDescriptions": {} + } + }, + "id": 16832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12422:10:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "12414:18:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "12320:112:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 16835, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "12319:114:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16836, + "name": "_graphEpochManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4855, + "src": "12437:18:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IEpochManager_$369_$", + "typeString": "function () view returns (contract IEpochManager)" + } + }, + "id": 16837, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12437:20:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "id": 16838, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12458:12:65", + "memberName": "currentEpoch", + "nodeType": "MemberAccess", + "referencedDeclaration": 346, + "src": "12437:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", + "typeString": "function () view external returns (uint256)" + } + }, + "id": 16839, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12437:35:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "expression": { + "id": 16840, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "12475:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16841, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12486:14:65", + "memberName": "createdAtEpoch", + "nodeType": "MemberAccess", + "referencedDeclaration": 15662, + "src": "12475:25:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "12437:63:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "12319:181:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "30", + "id": 16849, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12579:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 16850, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "12319:261:65", + "trueExpression": { + "arguments": [ + { + "id": 16847, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "12550:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16844, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "12515:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 16845, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12515:22:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 16846, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12538:11:65", + "memberName": "takeRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 663, + "src": "12515:34:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) external returns (uint256)" + } + }, + "id": 16848, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12515:49:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12295:285:65" + }, + { + "expression": { + "arguments": [ + { + "id": 16855, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "12742:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "expression": { + "id": 16859, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "12819:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16860, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12830:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "12819:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16856, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "12769:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 16857, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12769:22:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 16858, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12792:26:65", + "memberName": "onSubgraphAllocationUpdate", + "nodeType": "MemberAccess", + "referencedDeclaration": 677, + "src": "12769:49:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$returns$_t_uint256_$", + "typeString": "function (bytes32) external returns (uint256)" + } + }, + "id": 16861, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12769:82:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 16852, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "12700:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 16854, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12713:15:65", + "memberName": "snapshotRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 15818, + "src": "12700:28:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$_t_uint256_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address,uint256)" + } + }, + "id": 16862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12700:161:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16863, + "nodeType": "ExpressionStatement", + "src": "12700:161:65" + }, + { + "expression": { + "arguments": [ + { + "id": 16867, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "12895:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 16864, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "12871:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 16866, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12884:10:65", + "memberName": "presentPOI", + "nodeType": "MemberAccess", + "referencedDeclaration": 15779, + "src": "12871:23:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address)" + } + }, + "id": 16868, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12871:38:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16869, + "nodeType": "ExpressionStatement", + "src": "12871:38:65" + }, + { + "expression": { + "arguments": [ + { + "id": 16873, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "13015:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 16870, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "12982:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 16872, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "12995:19:65", + "memberName": "clearPendingRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 15855, + "src": "12982:32:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address)" + } + }, + "id": 16874, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "12982:47:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16875, + "nodeType": "ExpressionStatement", + "src": "12982:47:65" + }, + { + "assignments": [16877], + "declarations": [ + { + "constant": false, + "id": 16877, + "mutability": "mutable", + "name": "tokensIndexerRewards", + "nameLocation": "13048:20:65", + "nodeType": "VariableDeclaration", + "scope": 17043, + "src": "13040:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16876, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13040:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 16879, + "initialValue": { + "hexValue": "30", + "id": 16878, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13071:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "13040:32:65" + }, + { + "assignments": [16881], + "declarations": [ + { + "constant": false, + "id": 16881, + "mutability": "mutable", + "name": "tokensDelegationRewards", + "nameLocation": "13090:23:65", + "nodeType": "VariableDeclaration", + "scope": 17043, + "src": "13082:31:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16880, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13082:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 16883, + "initialValue": { + "hexValue": "30", + "id": 16882, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13116:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "13082:35:65" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16886, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16884, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16817, + "src": "13131:13:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 16885, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13148:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "13131:18:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 17011, + "nodeType": "IfStatement", + "src": "13127:1531:65", + "trueBody": { + "id": 17010, + "nodeType": "Block", + "src": "13151:1507:65", + "statements": [ + { + "assignments": [16888], + "declarations": [ + { + "constant": false, + "id": 16888, + "mutability": "mutable", + "name": "delegatorCut", + "nameLocation": "13221:12:65", + "nodeType": "VariableDeclaration", + "scope": 17010, + "src": "13213:20:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16887, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13213:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 16902, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 16892, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "13289:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16893, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13300:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "13289:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 16896, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "13333:4:65", + "typeDescriptions": { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + ], + "id": 16895, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13325:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16894, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13325:7:65", + "typeDescriptions": {} + } + }, + "id": 16897, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13325:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "expression": { + "id": 16898, + "name": "IGraphPayments", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2489, + "src": "13356:14:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphPayments_$2489_$", + "typeString": "type(contract IGraphPayments)" + } + }, + "id": 16899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13371:12:65", + "memberName": "PaymentTypes", + "nodeType": "MemberAccess", + "referencedDeclaration": 2433, + "src": "13356:27:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_enum$_PaymentTypes_$2433_$", + "typeString": "type(enum IGraphPayments.PaymentTypes)" + } + }, + "id": 16900, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "13384:15:65", + "memberName": "IndexingRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 2432, + "src": "13356:43:65", + "typeDescriptions": { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_enum$_PaymentTypes_$2433", + "typeString": "enum IGraphPayments.PaymentTypes" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16889, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "13236:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13236:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 16891, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13252:19:65", + "memberName": "getDelegationFeeCut", + "nodeType": "MemberAccess", + "referencedDeclaration": 2939, + "src": "13236:35:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$_t_enum$_PaymentTypes_$2433_$returns$_t_uint256_$", + "typeString": "function (address,address,enum IGraphPayments.PaymentTypes) view external returns (uint256)" + } + }, + "id": 16901, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13236:177:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13213:200:65" + }, + { + "assignments": [16907], + "declarations": [ + { + "constant": false, + "id": 16907, + "mutability": "mutable", + "name": "delegationPool", + "nameLocation": "13470:14:65", + "nodeType": "VariableDeclaration", + "scope": 17010, + "src": "13427:57:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_memory_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool" + }, + "typeName": { + "id": 16906, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 16905, + "name": "IHorizonStakingTypes.DelegationPool", + "nameLocations": ["13427:20:65", "13448:14:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3992, + "src": "13427:35:65" + }, + "referencedDeclaration": 3992, + "src": "13427:35:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_storage_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool" + } + }, + "visibility": "internal" + } + ], + "id": 16918, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 16911, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "13538:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16912, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13549:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "13538:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 16915, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "13582:4:65", + "typeDescriptions": { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + ], + "id": 16914, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13574:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16913, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13574:7:65", + "typeDescriptions": {} + } + }, + "id": 16916, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13574:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16908, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "13487:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16909, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13487:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 16910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13503:17:65", + "memberName": "getDelegationPool", + "nodeType": "MemberAccess", + "referencedDeclaration": 2913, + "src": "13487:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_struct$_DelegationPool_$3992_memory_ptr_$", + "typeString": "function (address,address) view external returns (struct IHorizonStakingTypes.DelegationPool memory)" + } + }, + "id": 16917, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13487:114:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_memory_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13427:174:65" + }, + { + "expression": { + "id": 16930, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 16919, + "name": "tokensDelegationRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16881, + "src": "13718:23:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16923, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 16920, + "name": "delegationPool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16907, + "src": "13744:14:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_DelegationPool_$3992_memory_ptr", + "typeString": "struct IHorizonStakingTypes.DelegationPool memory" + } + }, + "id": 16921, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13759:6:65", + "memberName": "shares", + "nodeType": "MemberAccess", + "referencedDeclaration": 3985, + "src": "13744:21:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 16922, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13768:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "13744:25:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "30", + "id": 16928, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13809:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 16929, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "13744:66:65", + "trueExpression": { + "arguments": [ + { + "id": 16926, + "name": "delegatorCut", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16888, + "src": "13793:12:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 16924, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16817, + "src": "13772:13:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 16925, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13786:6:65", + "memberName": "mulPPM", + "nodeType": "MemberAccess", + "referencedDeclaration": 4496, + "src": "13772:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$attached_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 16927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13772:34:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13718:92:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 16931, + "nodeType": "ExpressionStatement", + "src": "13718:92:65" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16934, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16932, + "name": "tokensDelegationRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16881, + "src": "13828:23:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 16933, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13854:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "13828:27:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 16959, + "nodeType": "IfStatement", + "src": "13824:251:65", + "trueBody": { + "id": 16958, + "nodeType": "Block", + "src": "13857:218:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16940, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "13905:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16941, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13905:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + ], + "id": 16939, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13897:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16938, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13897:7:65", + "typeDescriptions": {} + } + }, + "id": 16942, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13897:24:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16943, + "name": "tokensDelegationRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16881, + "src": "13923:23:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16935, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "13875:11:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 16936, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13875:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 16937, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13889:7:65", + "memberName": "approve", + "nodeType": "MemberAccess", + "referencedDeclaration": 6134, + "src": "13875:21:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", + "typeString": "function (address,uint256) external returns (bool)" + } + }, + "id": 16944, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13875:72:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 16945, + "nodeType": "ExpressionStatement", + "src": "13875:72:65" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 16949, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "14001:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16950, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14012:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "14001:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 16953, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "14029:4:65", + "typeDescriptions": { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + ], + "id": 16952, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14021:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16951, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14021:7:65", + "typeDescriptions": {} + } + }, + "id": 16954, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14021:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16955, + "name": "tokensDelegationRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16881, + "src": "14036:23:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16946, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "13965:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16947, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13965:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 16948, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "13981:19:65", + "memberName": "addToDelegationPool", + "nodeType": "MemberAccess", + "referencedDeclaration": 3773, + "src": "13965:35:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256) external" + } + }, + "id": 16956, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "13965:95:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16957, + "nodeType": "ExpressionStatement", + "src": "13965:95:65" + } + ] + } + }, + { + "expression": { + "id": 16964, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 16960, + "name": "tokensIndexerRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16877, + "src": "14134:20:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16963, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16961, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16817, + "src": "14157:13:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 16962, + "name": "tokensDelegationRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16881, + "src": "14173:23:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "14157:39:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "14134:62:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 16965, + "nodeType": "ExpressionStatement", + "src": "14134:62:65" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 16968, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16966, + "name": "tokensIndexerRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16877, + "src": "14214:20:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 16967, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14237:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "14214:24:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 17009, + "nodeType": "IfStatement", + "src": "14210:438:65", + "trueBody": { + "id": 17008, + "nodeType": "Block", + "src": "14240:408:65", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 16974, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 16969, + "name": "_paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16792, + "src": "14262:20:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 16972, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14294:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 16971, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14286:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16970, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14286:7:65", + "typeDescriptions": {} + } + }, + "id": 16973, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14286:10:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "14262:34:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 17006, + "nodeType": "Block", + "src": "14525:109:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 17002, + "name": "_paymentsDestination", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16792, + "src": "14572:20:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17003, + "name": "tokensIndexerRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16877, + "src": "14594:20:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16999, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "14547:11:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 17000, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14547:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 17001, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14561:10:65", + "memberName": "pushTokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 818, + "src": "14547:24:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IGraphToken_$758_$_t_address_$_t_uint256_$returns$__$attached_to$_t_contract$_IGraphToken_$758_$", + "typeString": "function (contract IGraphToken,address,uint256)" + } + }, + "id": 17004, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14547:68:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17005, + "nodeType": "ExpressionStatement", + "src": "14547:68:65" + } + ] + }, + "id": 17007, + "nodeType": "IfStatement", + "src": "14258:376:65", + "trueBody": { + "id": 16998, + "nodeType": "Block", + "src": "14298:221:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16980, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "14350:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16981, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14350:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + ], + "id": 16979, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14342:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16978, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14342:7:65", + "typeDescriptions": {} + } + }, + "id": 16982, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14342:24:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16983, + "name": "tokensIndexerRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16877, + "src": "14368:20:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16975, + "name": "_graphToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4805, + "src": "14320:11:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IGraphToken_$758_$", + "typeString": "function () view returns (contract IGraphToken)" + } + }, + "id": 16976, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14320:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphToken_$758", + "typeString": "contract IGraphToken" + } + }, + "id": 16977, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14334:7:65", + "memberName": "approve", + "nodeType": "MemberAccess", + "referencedDeclaration": 6134, + "src": "14320:21:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", + "typeString": "function (address,uint256) external returns (bool)" + } + }, + "id": 16984, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14320:69:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 16985, + "nodeType": "ExpressionStatement", + "src": "14320:69:65" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 16989, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "14444:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 16990, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14455:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "14444:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 16993, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "14472:4:65", + "typeDescriptions": { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_AllocationManager_$17363", + "typeString": "contract AllocationManager" + } + ], + "id": 16992, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14464:7:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 16991, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14464:7:65", + "typeDescriptions": {} + } + }, + "id": 16994, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14464:13:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 16995, + "name": "tokensIndexerRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16877, + "src": "14479:20:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 16986, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "14411:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 16987, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14411:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + "id": 16988, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14427:16:65", + "memberName": "stakeToProvision", + "nodeType": "MemberAccess", + "referencedDeclaration": 3665, + "src": "14411:32:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256) external" + } + }, + "id": 16996, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14411:89:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 16997, + "nodeType": "ExpressionStatement", + "src": "14411:89:65" + } + ] + } + } + ] + } + } + ] + } + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 17013, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "14711:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17014, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14722:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "14711:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17015, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "14743:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 17016, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "14770:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17017, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14781:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "14770:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17018, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16817, + "src": "14815:13:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17019, + "name": "tokensIndexerRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16877, + "src": "14842:20:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17020, + "name": "tokensDelegationRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16881, + "src": "14876:23:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17021, + "name": "_poi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16786, + "src": "14913:4:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17022, + "name": "_poiMetadata", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16788, + "src": "14931:12:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17023, + "name": "_graphEpochManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4855, + "src": "14957:18:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IEpochManager_$369_$", + "typeString": "function () view returns (contract IEpochManager)" + } + }, + "id": 17024, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14957:20:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEpochManager_$369", + "typeString": "contract IEpochManager" + } + }, + "id": 17025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "14978:12:65", + "memberName": "currentEpoch", + "nodeType": "MemberAccess", + "referencedDeclaration": 346, + "src": "14957:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", + "typeString": "function () view external returns (uint256)" + } + }, + "id": 17026, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14957:35:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 17012, + "name": "IndexingRewardsCollected", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16568, + "src": "14673:24:65", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$", + "typeString": "function (address,address,bytes32,uint256,uint256,uint256,bytes32,bytes memory,uint256)" + } + }, + "id": 17027, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "14673:329:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17028, + "nodeType": "EmitStatement", + "src": "14668:334:65" + }, + { + "condition": { + "arguments": [ + { + "expression": { + "id": 17030, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16801, + "src": "15128:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17031, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "15139:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "15128:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17032, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16790, + "src": "15148:16:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "id": 17029, + "name": "_isOverAllocated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17330, + "src": "15111:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint32_$returns$_t_bool_$", + "typeString": "function (address,uint32) view returns (bool)" + } + }, + "id": 17033, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15111:54:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 17040, + "nodeType": "IfStatement", + "src": "15107:122:65", + "trueBody": { + "id": 17039, + "nodeType": "Block", + "src": "15167:62:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 17035, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16784, + "src": "15198:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "hexValue": "74727565", + "id": 17036, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "15213:4:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 17034, + "name": "_closeAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17273, + "src": "15181:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$", + "typeString": "function (address,bool)" + } + }, + "id": 17037, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "15181:37:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17038, + "nodeType": "ExpressionStatement", + "src": "15181:37:65" + } + ] + } + }, + { + "expression": { + "id": 17041, + "name": "tokensRewards", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16817, + "src": "15246:13:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 16796, + "id": 17042, + "nodeType": "Return", + "src": "15239:20:65" + } + ] + }, + "documentation": { + "id": 16782, + "nodeType": "StructuredDocumentation", + "src": "10110:1731:65", + "text": " @notice Present a POI to collect indexing rewards for an allocation\n This function will mint indexing rewards using the {RewardsManager} and distribute them to the indexer and delegators.\n Conditions to qualify for indexing rewards:\n - POI must be non-zero\n - POI must not be stale, i.e: older than `maxPOIStaleness`\n - allocation must not be altruistic (allocated tokens = 0)\n - allocation must be open for at least one epoch\n Note that indexers are required to periodically (at most every `maxPOIStaleness`) present POIs to collect rewards.\n Rewards will not be issued to stale POIs, which means that indexers are advised to present a zero POI if they are\n unable to present a valid one to prevent being locked out of future rewards.\n Note on allocation duration restriction: this is required to ensure that non protocol chains have a valid block number for\n which to calculate POIs. EBO posts once per epoch typically at each epoch change, so we restrict rewards to allocations\n that have gone through at least one epoch change.\n Emits a {IndexingRewardsCollected} event.\n @param _allocationId The id of the allocation to collect rewards for\n @param _poi The POI being presented\n @param _poiMetadata The metadata associated with the POI. The data and encoding format is for off-chain components to define, this function will only emit the value in an event as-is.\n @param _delegationRatio The delegation ratio to consider when locking tokens\n @param _paymentsDestination The address where indexing rewards should be sent\n @return The amount of tokens collected" + }, + "id": 17044, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_presentPOI", + "nameLocation": "11855:11:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 16793, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16784, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "11884:13:65", + "nodeType": "VariableDeclaration", + "scope": 17044, + "src": "11876:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16783, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11876:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16786, + "mutability": "mutable", + "name": "_poi", + "nameLocation": "11915:4:65", + "nodeType": "VariableDeclaration", + "scope": 17044, + "src": "11907:12:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 16785, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "11907:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16788, + "mutability": "mutable", + "name": "_poiMetadata", + "nameLocation": "11942:12:65", + "nodeType": "VariableDeclaration", + "scope": 17044, + "src": "11929:25:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 16787, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "11929:5:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16790, + "mutability": "mutable", + "name": "_delegationRatio", + "nameLocation": "11971:16:65", + "nodeType": "VariableDeclaration", + "scope": 17044, + "src": "11964:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 16789, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "11964:6:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16792, + "mutability": "mutable", + "name": "_paymentsDestination", + "nameLocation": "12005:20:65", + "nodeType": "VariableDeclaration", + "scope": 17044, + "src": "11997:28:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 16791, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11997:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "11866:165:65" + }, + "returnParameters": { + "id": 16796, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 16795, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17044, + "src": "12050:7:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16794, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12050:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "12049:9:65" + }, + "scope": 17363, + "src": "11846:3420:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17202, + "nodeType": "Block", + "src": "16142:1867:65", + "statements": [ + { + "assignments": [17058], + "declarations": [ + { + "constant": false, + "id": 17058, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "16176:10:65", + "nodeType": "VariableDeclaration", + "scope": 17202, + "src": "16152:34:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 17057, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17056, + "name": "Allocation.State", + "nameLocations": ["16152:10:65", "16163:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "16152:16:65" + }, + "referencedDeclaration": 15663, + "src": "16152:16:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 17063, + "initialValue": { + "arguments": [ + { + "id": 17061, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "16206:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 17059, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "16189:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17060, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16202:3:65", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "16189:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 17062, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16189:31:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "16152:68:65" + }, + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 17065, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "16238:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17066, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16249:6:65", + "memberName": "isOpen", + "nodeType": "MemberAccess", + "referencedDeclaration": 15980, + "src": "16238:17:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 17067, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16238:19:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 17069, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "16293:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17068, + "name": "AllocationManagerAllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16623, + "src": "16259:33:65", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$returns$_t_error_$", + "typeString": "function (address) pure returns (error)" + } + }, + "id": 17070, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16259:48:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 17064, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "16230:7:65", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 17071, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16230:78:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17072, + "nodeType": "ExpressionStatement", + "src": "16230:78:65" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17077, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17074, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "16326:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "expression": { + "id": 17075, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "16337:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17076, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16348:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "16337:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "16326:28:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 17079, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "16392:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17080, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "16407:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 17078, + "name": "AllocationManagerAllocationSameSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16630, + "src": "16356:35:65", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_uint256_$returns$_t_error_$", + "typeString": "function (address,uint256) pure returns (error)" + } + }, + "id": 17081, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16356:59:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 17073, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "16318:7:65", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 17082, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16318:98:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17083, + "nodeType": "ExpressionStatement", + "src": "16318:98:65" + }, + { + "assignments": [17085], + "declarations": [ + { + "constant": false, + "id": 17085, + "mutability": "mutable", + "name": "oldTokens", + "nameLocation": "16471:9:65", + "nodeType": "VariableDeclaration", + "scope": 17202, + "src": "16463:17:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17084, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16463:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 17088, + "initialValue": { + "expression": { + "id": 17086, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "16483:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17087, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16494:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "16483:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "16463:37:65" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17091, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17089, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "16514:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 17090, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "16524:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "16514:19:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 17116, + "nodeType": "Block", + "src": "16673:100:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 17109, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "16722:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17110, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16733:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "16722:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17113, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17111, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "16742:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 17112, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "16754:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "16742:19:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 17106, + "name": "allocationProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17387, + "src": "16687:26:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 17108, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16714:7:65", + "memberName": "release", + "nodeType": "MemberAccess", + "referencedDeclaration": 1764, + "src": "16687:34:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_uint256_$_$_t_address_$_t_uint256_$returns$__$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),address,uint256)" + } + }, + "id": 17114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16687:75:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17115, + "nodeType": "ExpressionStatement", + "src": "16687:75:65" + } + ] + }, + "id": 17117, + "nodeType": "IfStatement", + "src": "16510:263:65", + "trueBody": { + "id": 17105, + "nodeType": "Block", + "src": "16535:132:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17095, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "16581:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 17096, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16581:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + { + "expression": { + "id": 17097, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "16598:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17098, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16609:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "16598:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17101, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17099, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "16618:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 17100, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "16628:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "16618:19:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17102, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17051, + "src": "16639:16:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 17092, + "name": "allocationProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17387, + "src": "16549:26:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 17094, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16576:4:65", + "memberName": "lock", + "nodeType": "MemberAccess", + "referencedDeclaration": 1726, + "src": "16549:31:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_uint256_$_$_t_contract$_IHorizonStaking_$2625_$_t_address_$_t_uint256_$_t_uint32_$returns$__$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),contract IHorizonStaking,address,uint256,uint32)" + } + }, + "id": 17103, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16549:107:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17104, + "nodeType": "ExpressionStatement", + "src": "16549:107:65" + } + ] + } + }, + { + "assignments": [17119], + "declarations": [ + { + "constant": false, + "id": 17119, + "mutability": "mutable", + "name": "accRewardsPerAllocatedToken", + "nameLocation": "16886:27:65", + "nodeType": "VariableDeclaration", + "scope": 17202, + "src": "16878:35:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17118, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16878:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 17126, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 17123, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "16979:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17124, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16990:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "16979:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17120, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "16916:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 17121, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16916:22:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 17122, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "16939:26:65", + "memberName": "onSubgraphAllocationUpdate", + "nodeType": "MemberAccess", + "referencedDeclaration": 677, + "src": "16916:49:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$returns$_t_uint256_$", + "typeString": "function (bytes32) external returns (uint256)" + } + }, + "id": 17125, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "16916:104:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "16878:142:65" + }, + { + "assignments": [17128], + "declarations": [ + { + "constant": false, + "id": 17128, + "mutability": "mutable", + "name": "accRewardsPerAllocatedTokenPending", + "nameLocation": "17038:34:65", + "nodeType": "VariableDeclaration", + "scope": 17202, + "src": "17030:42:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17127, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "17030:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 17139, + "initialValue": { + "condition": { + "id": 17132, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "17075:26:65", + "subExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 17129, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "17076:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17130, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17087:12:65", + "memberName": "isAltruistic", + "nodeType": "MemberAccess", + "referencedDeclaration": 15999, + "src": "17076:23:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_struct$_State_$15663_memory_ptr_$returns$_t_bool_$attached_to$_t_struct$_State_$15663_memory_ptr_$", + "typeString": "function (struct Allocation.State memory) pure returns (bool)" + } + }, + "id": 17131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17076:25:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "hexValue": "30", + "id": 17137, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "17199:1:65", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 17138, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "17075:125:65", + "trueExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17136, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17133, + "name": "accRewardsPerAllocatedToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17119, + "src": "17116:27:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "expression": { + "id": 17134, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "17146:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17135, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17157:27:65", + "memberName": "accRewardsPerAllocatedToken", + "nodeType": "MemberAccess", + "referencedDeclaration": 15658, + "src": "17146:38:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17116:68:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "17030:170:65" + }, + { + "expression": { + "id": 17145, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "baseExpression": { + "id": 17140, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "17244:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17142, + "indexExpression": { + "id": 17141, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "17257:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "17244:27:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "id": 17143, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "17272:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "17244:34:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 17144, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "17281:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17244:44:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17146, + "nodeType": "ExpressionStatement", + "src": "17244:44:65" + }, + { + "expression": { + "id": 17152, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "baseExpression": { + "id": 17147, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "17298:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17149, + "indexExpression": { + "id": 17148, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "17311:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "17298:27:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "id": 17150, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "17326:27:65", + "memberName": "accRewardsPerAllocatedToken", + "nodeType": "MemberAccess", + "referencedDeclaration": 15658, + "src": "17298:55:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 17151, + "name": "accRewardsPerAllocatedToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17119, + "src": "17356:27:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17298:85:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17153, + "nodeType": "ExpressionStatement", + "src": "17298:85:65" + }, + { + "expression": { + "id": 17164, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "expression": { + "baseExpression": { + "id": 17154, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "17393:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17156, + "indexExpression": { + "id": 17155, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "17406:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "17393:27:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage", + "typeString": "struct Allocation.State storage ref" + } + }, + "id": 17157, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberLocation": "17421:17:65", + "memberName": "accRewardsPending", + "nodeType": "MemberAccess", + "referencedDeclaration": 15660, + "src": "17393:45:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "arguments": [ + { + "id": 17161, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "17490:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17162, + "name": "accRewardsPerAllocatedTokenPending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17128, + "src": "17513:34:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17158, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "17442:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 17159, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17442:22:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 17160, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17465:11:65", + "memberName": "calcRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 651, + "src": "17442:34:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure external returns (uint256)" + } + }, + "id": 17163, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17442:115:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17393:164:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17165, + "nodeType": "ExpressionStatement", + "src": "17393:164:65" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17166, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "17641:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "id": 17167, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "17651:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17641:19:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 17190, + "nodeType": "Block", + "src": "17775:107:65", + "statements": [ + { + "expression": { + "id": 17188, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 17180, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "17789:24:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 17183, + "indexExpression": { + "expression": { + "id": 17181, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "17814:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17182, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17825:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "17814:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17789:57:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17184, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "17851:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 17185, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "17863:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17851:19:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 17187, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "17850:21:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17789:82:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17189, + "nodeType": "ExpressionStatement", + "src": "17789:82:65" + } + ] + }, + "id": 17191, + "nodeType": "IfStatement", + "src": "17637:245:65", + "trueBody": { + "id": 17179, + "nodeType": "Block", + "src": "17662:107:65", + "statements": [ + { + "expression": { + "id": 17177, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 17169, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "17676:24:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 17172, + "indexExpression": { + "expression": { + "id": 17170, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "17701:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17171, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17712:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "17701:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "17676:57:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "components": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17173, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "17738:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 17174, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "17748:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17738:19:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 17176, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "17737:21:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "17676:82:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17178, + "nodeType": "ExpressionStatement", + "src": "17676:82:65" + } + ] + } + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 17193, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "17915:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17194, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17926:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "17915:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17195, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17047, + "src": "17935:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 17196, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17058, + "src": "17950:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17197, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "17961:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "17950:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17198, + "name": "_tokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17049, + "src": "17983:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17199, + "name": "oldTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17085, + "src": "17992:9:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 17192, + "name": "AllocationResized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16581, + "src": "17897:17:65", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,bytes32,uint256,uint256)" + } + }, + "id": 17200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "17897:105:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17201, + "nodeType": "EmitStatement", + "src": "17892:110:65" + } + ] + }, + "documentation": { + "id": 17045, + "nodeType": "StructuredDocumentation", + "src": "15272:764:65", + "text": " @notice Resize an allocation\n @dev Will lock or release tokens in the provision tracker depending on the new allocation size.\n Rewards accrued but not issued before the resize will be accounted for as pending rewards.\n These will be paid out when the indexer presents a POI.\n Requirements:\n - `_indexer` must be the owner of the allocation\n - Allocation must be open\n - `_tokens` must be different from the current allocation size\n Emits a {AllocationResized} event.\n @param _allocationId The id of the allocation to be resized\n @param _tokens The new amount of tokens to allocate\n @param _delegationRatio The delegation ratio to consider when locking tokens" + }, + "id": 17203, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_resizeAllocation", + "nameLocation": "16050:17:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17052, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17047, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "16076:13:65", + "nodeType": "VariableDeclaration", + "scope": 17203, + "src": "16068:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17046, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "16068:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17049, + "mutability": "mutable", + "name": "_tokens", + "nameLocation": "16099:7:65", + "nodeType": "VariableDeclaration", + "scope": 17203, + "src": "16091:15:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17048, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "16091:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17051, + "mutability": "mutable", + "name": "_delegationRatio", + "nameLocation": "16115:16:65", + "nodeType": "VariableDeclaration", + "scope": 17203, + "src": "16108:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 17050, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "16108:6:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "16067:65:65" + }, + "returnParameters": { + "id": 17053, + "nodeType": "ParameterList", + "parameters": [], + "src": "16142:0:65" + }, + "scope": 17363, + "src": "16041:1968:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17272, + "nodeType": "Block", + "src": "18738:920:65", + "statements": [ + { + "assignments": [17215], + "declarations": [ + { + "constant": false, + "id": 17215, + "mutability": "mutable", + "name": "allocation", + "nameLocation": "18772:10:65", + "nodeType": "VariableDeclaration", + "scope": 17272, + "src": "18748:34:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State" + }, + "typeName": { + "id": 17214, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17213, + "name": "Allocation.State", + "nameLocations": ["18748:10:65", "18759:5:65"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "18748:16:65" + }, + "referencedDeclaration": 15663, + "src": "18748:16:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + }, + "visibility": "internal" + } + ], + "id": 17220, + "initialValue": { + "arguments": [ + { + "id": 17218, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17206, + "src": "18802:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 17216, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "18785:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17217, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18798:3:65", + "memberName": "get", + "nodeType": "MemberAccess", + "referencedDeclaration": 15913, + "src": "18785:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$_t_struct$_State_$15663_memory_ptr_$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address) view returns (struct Allocation.State memory)" + } + }, + "id": 17219, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18785:31:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "18748:68:65" + }, + { + "expression": { + "arguments": [ + { + "id": 17224, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17206, + "src": "18961:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "expression": { + "id": 17228, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19038:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17229, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19049:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "19038:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17225, + "name": "_graphRewardsManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4865, + "src": "18988:20:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IRewardsManager_$678_$", + "typeString": "function () view returns (contract IRewardsManager)" + } + }, + "id": 17226, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18988:22:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewardsManager_$678", + "typeString": "contract IRewardsManager" + } + }, + "id": 17227, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19011:26:65", + "memberName": "onSubgraphAllocationUpdate", + "nodeType": "MemberAccess", + "referencedDeclaration": 677, + "src": "18988:49:65", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$returns$_t_uint256_$", + "typeString": "function (bytes32) external returns (uint256)" + } + }, + "id": 17230, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18988:82:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 17221, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "18919:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17223, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "18932:15:65", + "memberName": "snapshotRewards", + "nodeType": "MemberAccess", + "referencedDeclaration": 15818, + "src": "18919:28:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$_t_uint256_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address,uint256)" + } + }, + "id": 17231, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "18919:161:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17232, + "nodeType": "ExpressionStatement", + "src": "18919:161:65" + }, + { + "expression": { + "arguments": [ + { + "id": 17236, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17206, + "src": "19110:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 17233, + "name": "_allocations", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17376, + "src": "19091:12:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State storage ref)" + } + }, + "id": 17235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19104:5:65", + "memberName": "close", + "nodeType": "MemberAccess", + "referencedDeclaration": 15893, + "src": "19091:18:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$_t_address_$returns$__$attached_to$_t_mapping$_t_address_$_t_struct$_State_$15663_storage_$_$", + "typeString": "function (mapping(address => struct Allocation.State storage ref),address)" + } + }, + "id": 17237, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19091:33:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17238, + "nodeType": "ExpressionStatement", + "src": "19091:33:65" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 17242, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19169:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17243, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19180:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "19169:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 17244, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19189:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17245, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19200:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "19189:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 17239, + "name": "allocationProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17387, + "src": "19134:26:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 17241, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19161:7:65", + "memberName": "release", + "nodeType": "MemberAccess", + "referencedDeclaration": 1764, + "src": "19134:34:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_mapping$_t_address_$_t_uint256_$_$_t_address_$_t_uint256_$returns$__$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),address,uint256)" + } + }, + "id": 17246, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19134:73:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17247, + "nodeType": "ExpressionStatement", + "src": "19134:73:65" + }, + { + "expression": { + "id": 17259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "id": 17248, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "19287:24:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 17251, + "indexExpression": { + "expression": { + "id": 17249, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19312:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17250, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19323:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "19312:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "19287:57:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 17258, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "baseExpression": { + "id": 17252, + "name": "_subgraphAllocatedTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17395, + "src": "19359:24:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + } + }, + "id": 17255, + "indexExpression": { + "expression": { + "id": 17253, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19384:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17254, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19395:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "19384:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "19359:57:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "expression": { + "id": 17256, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19431:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17257, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19442:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "19431:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "19359:89:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "19287:161:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17260, + "nodeType": "ExpressionStatement", + "src": "19287:161:65" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 17262, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19494:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17263, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19505:7:65", + "memberName": "indexer", + "nodeType": "MemberAccess", + "referencedDeclaration": 15646, + "src": "19494:18:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17264, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17206, + "src": "19526:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 17265, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19553:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17266, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19564:20:65", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 15648, + "src": "19553:31:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17267, + "name": "allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17215, + "src": "19598:10:65", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_memory_ptr", + "typeString": "struct Allocation.State memory" + } + }, + "id": 17268, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "19609:6:65", + "memberName": "tokens", + "nodeType": "MemberAccess", + "referencedDeclaration": 15650, + "src": "19598:17:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 17269, + "name": "_forceClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17208, + "src": "19629:12:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 17261, + "name": "AllocationClosed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16594, + "src": "19464:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bytes32_$_t_uint256_$_t_bool_$returns$__$", + "typeString": "function (address,address,bytes32,uint256,bool)" + } + }, + "id": 17270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "19464:187:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17271, + "nodeType": "EmitStatement", + "src": "19459:192:65" + } + ] + }, + "documentation": { + "id": 17204, + "nodeType": "StructuredDocumentation", + "src": "18015:641:65", + "text": " @notice Close an allocation\n Does not require presenting a POI, use {_collectIndexingRewards} to present a POI and collect rewards\n @dev Note that allocations are nowlong lived. All service payments, including indexing rewards, should be collected periodically\n without the need of closing the allocation. Allocations should only be closed when indexers want to reclaim the allocated\n tokens for other purposes.\n Emits a {AllocationClosed} event\n @param _allocationId The id of the allocation to be closed\n @param _forceClosed Whether the allocation was force closed" + }, + "id": 17273, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_closeAllocation", + "nameLocation": "18670:16:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17209, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17206, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "18695:13:65", + "nodeType": "VariableDeclaration", + "scope": 17273, + "src": "18687:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17205, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "18687:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17208, + "mutability": "mutable", + "name": "_forceClosed", + "nameLocation": "18715:12:65", + "nodeType": "VariableDeclaration", + "scope": 17273, + "src": "18710:17:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 17207, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "18710:4:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "18686:42:65" + }, + "returnParameters": { + "id": 17210, + "nodeType": "ParameterList", + "parameters": [], + "src": "18738:0:65" + }, + "scope": 17363, + "src": "18661:997:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17287, + "nodeType": "Block", + "src": "19979:102:65", + "statements": [ + { + "expression": { + "id": 17281, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 17279, + "name": "maxPOIStaleness", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17390, + "src": "19989:15:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 17280, + "name": "_maxPOIStaleness", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17276, + "src": "20007:16:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "19989:34:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17282, + "nodeType": "ExpressionStatement", + "src": "19989:34:65" + }, + { + "eventCall": { + "arguments": [ + { + "id": 17284, + "name": "_maxPOIStaleness", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17276, + "src": "20057:16:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 17283, + "name": "MaxPOIStalenessSet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16608, + "src": "20038:18:65", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 17285, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20038:36:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17286, + "nodeType": "EmitStatement", + "src": "20033:41:65" + } + ] + }, + "documentation": { + "id": 17274, + "nodeType": "StructuredDocumentation", + "src": "19664:246:65", + "text": " @notice Sets the maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards\n @dev Emits a {MaxPOIStalenessSet} event\n @param _maxPOIStaleness The max POI staleness in seconds" + }, + "id": 17288, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_setMaxPOIStaleness", + "nameLocation": "19924:19:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17277, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17276, + "mutability": "mutable", + "name": "_maxPOIStaleness", + "nameLocation": "19952:16:65", + "nodeType": "VariableDeclaration", + "scope": 17288, + "src": "19944:24:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17275, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "19944:7:65", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "19943:26:65" + }, + "returnParameters": { + "id": 17278, + "nodeType": "ParameterList", + "parameters": [], + "src": "19979:0:65" + }, + "scope": 17363, + "src": "19915:166:65", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17309, + "nodeType": "Block", + "src": "20418:125:65", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 17302, + "name": "EIP712_ALLOCATION_ID_PROOF_TYPEHASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16534, + "src": "20473:35:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17303, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17291, + "src": "20510:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17304, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17293, + "src": "20520:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 17300, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "20462:3:65", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 17301, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "20466:6:65", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "20462:10:65", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 17305, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20462:72:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 17299, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "20452:9:65", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17306, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20452:83:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 17298, + "name": "_hashTypedDataV4", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5846, + "src": "20435:16:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 17307, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20435:101:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 17297, + "id": 17308, + "nodeType": "Return", + "src": "20428:108:65" + } + ] + }, + "documentation": { + "id": 17289, + "nodeType": "StructuredDocumentation", + "src": "20087:221:65", + "text": " @notice Encodes the allocation proof for EIP712 signing\n @param _indexer The address of the indexer\n @param _allocationId The id of the allocation\n @return The encoded allocation proof" + }, + "id": 17310, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_encodeAllocationProof", + "nameLocation": "20322:22:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17294, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17291, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "20353:8:65", + "nodeType": "VariableDeclaration", + "scope": 17310, + "src": "20345:16:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17290, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "20345:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17293, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "20371:13:65", + "nodeType": "VariableDeclaration", + "scope": 17310, + "src": "20363:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17292, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "20363:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "20344:41:65" + }, + "returnParameters": { + "id": 17297, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17296, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17310, + "src": "20409:7:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17295, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "20409:7:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "20408:9:65" + }, + "scope": 17363, + "src": "20313:230:65", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17329, + "nodeType": "Block", + "src": "20927:102:65", + "statements": [ + { + "expression": { + "id": 17327, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "20944:78:65", + "subExpression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17322, + "name": "_graphStaking", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4815, + "src": "20978:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IHorizonStaking_$2625_$", + "typeString": "function () view returns (contract IHorizonStaking)" + } + }, + "id": 17323, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20978:15:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + } + }, + { + "id": 17324, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17313, + "src": "20995:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17325, + "name": "_delegationRatio", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17315, + "src": "21005:16:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IHorizonStaking_$2625", + "typeString": "contract IHorizonStaking" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + ], + "expression": { + "id": 17320, + "name": "allocationProvisionTracker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17387, + "src": "20945:26:65", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 17321, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "20972:5:65", + "memberName": "check", + "nodeType": "MemberAccess", + "referencedDeclaration": 1800, + "src": "20945:32:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_mapping$_t_address_$_t_uint256_$_$_t_contract$_IHorizonStaking_$2625_$_t_address_$_t_uint32_$returns$_t_bool_$attached_to$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "function (mapping(address => uint256),contract IHorizonStaking,address,uint32) view returns (bool)" + } + }, + "id": 17326, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "20945:77:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 17319, + "id": 17328, + "nodeType": "Return", + "src": "20937:85:65" + } + ] + }, + "documentation": { + "id": 17311, + "nodeType": "StructuredDocumentation", + "src": "20549:275:65", + "text": " @notice Checks if an allocation is over-allocated\n @param _indexer The address of the indexer\n @param _delegationRatio The delegation ratio to consider when locking tokens\n @return True if the allocation is over-allocated, false otherwise" + }, + "id": 17330, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_isOverAllocated", + "nameLocation": "20838:16:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17316, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17313, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "20863:8:65", + "nodeType": "VariableDeclaration", + "scope": 17330, + "src": "20855:16:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17312, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "20855:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17315, + "mutability": "mutable", + "name": "_delegationRatio", + "nameLocation": "20880:16:65", + "nodeType": "VariableDeclaration", + "scope": 17330, + "src": "20873:23:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 17314, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "20873:6:65", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "20854:43:65" + }, + "returnParameters": { + "id": 17319, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17318, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17330, + "src": "20921:4:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 17317, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "20921:4:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "20920:6:65" + }, + "scope": 17363, + "src": "20829:200:65", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17361, + "nodeType": "Block", + "src": "21521:210:65", + "statements": [ + { + "assignments": [17341], + "declarations": [ + { + "constant": false, + "id": 17341, + "mutability": "mutable", + "name": "signer", + "nameLocation": "21539:6:65", + "nodeType": "VariableDeclaration", + "scope": 17361, + "src": "21531:14:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17340, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21531:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 17350, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 17345, + "name": "_indexer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17333, + "src": "21585:8:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17346, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17335, + "src": "21595:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17344, + "name": "_encodeAllocationProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17310, + "src": "21562:22:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bytes32_$", + "typeString": "function (address,address) view returns (bytes32)" + } + }, + "id": 17347, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21562:47:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17348, + "name": "_proof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17337, + "src": "21611:6:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 17342, + "name": "ECDSA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8231, + "src": "21548:5:65", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ECDSA_$8231_$", + "typeString": "type(library ECDSA)" + } + }, + "id": 17343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "21554:7:65", + "memberName": "recover", + "nodeType": "MemberAccess", + "referencedDeclaration": 7987, + "src": "21548:13:65", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes32,bytes memory) pure returns (address)" + } + }, + "id": 17349, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21548:70:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "21531:87:65" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 17354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 17352, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17341, + "src": "21636:6:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 17353, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17335, + "src": "21646:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "21636:23:65", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "id": 17356, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17341, + "src": "21701:6:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17357, + "name": "_allocationId", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17335, + "src": "21709:13:65", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17355, + "name": "AllocationManagerInvalidAllocationProof", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16615, + "src": "21661:39:65", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 17358, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21661:62:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 17351, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "21628:7:65", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 17359, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "21628:96:65", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17360, + "nodeType": "ExpressionStatement", + "src": "21628:96:65" + } + ] + }, + "documentation": { + "id": 17331, + "nodeType": "StructuredDocumentation", + "src": "21035:374:65", + "text": " @notice Verifies ownership of an allocation id by verifying an EIP712 allocation proof\n @dev Requirements:\n - Signer must be the allocation id address\n @param _indexer The address of the indexer\n @param _allocationId The id of the allocation\n @param _proof The EIP712 proof, an EIP712 signed message of (indexer,allocationId)" + }, + "id": 17362, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_verifyAllocationProof", + "nameLocation": "21423:22:65", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17338, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17333, + "mutability": "mutable", + "name": "_indexer", + "nameLocation": "21454:8:65", + "nodeType": "VariableDeclaration", + "scope": 17362, + "src": "21446:16:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17332, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21446:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17335, + "mutability": "mutable", + "name": "_allocationId", + "nameLocation": "21472:13:65", + "nodeType": "VariableDeclaration", + "scope": 17362, + "src": "21464:21:65", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17334, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "21464:7:65", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17337, + "mutability": "mutable", + "name": "_proof", + "nameLocation": "21500:6:65", + "nodeType": "VariableDeclaration", + "scope": 17362, + "src": "21487:19:65", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 17336, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "21487:5:65", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "21445:62:65" + }, + "returnParameters": { + "id": 17339, + "nodeType": "ParameterList", + "parameters": [], + "src": "21521:0:65" + }, + "scope": 17363, + "src": "21414:317:65", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + } + ], + "scope": 17364, + "src": "1547:20186:65", + "usedErrors": [4655, 5140, 5143, 16615, 16618, 16623, 16630], + "usedEvents": [4650, 5148, 6049, 16547, 16568, 16581, 16594, 16603, 16608] + } + ], + "src": "45:21689:65" + }, + "id": 65 + }, + "contracts/utilities/AllocationManagerStorage.sol": { + "ast": { + "absolutePath": "contracts/utilities/AllocationManagerStorage.sol", + "exportedSymbols": { + "Allocation": [16033], + "AllocationManagerV1Storage": [17401], + "LegacyAllocation": [16462] + }, + "id": 17402, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 17365, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:66" + }, + { + "absolutePath": "contracts/libraries/Allocation.sol", + "file": "../libraries/Allocation.sol", + "id": 17367, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17402, + "sourceUnit": 16034, + "src": "70:57:66", + "symbolAliases": [ + { + "foreign": { + "id": 17366, + "name": "Allocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16033, + "src": "79:10:66", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/LegacyAllocation.sol", + "file": "../libraries/LegacyAllocation.sol", + "id": 17369, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17402, + "sourceUnit": 16463, + "src": "128:69:66", + "symbolAliases": [ + { + "foreign": { + "id": 17368, + "name": "LegacyAllocation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16462, + "src": "137:16:66", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "AllocationManagerV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 17370, + "nodeType": "StructuredDocumentation", + "src": "199:276:66", + "text": " @title AllocationManagerStorage\n @notice This contract holds all the storage variables for the Allocation Manager contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 17401, + "linearizedBaseContracts": [17401], + "name": "AllocationManagerV1Storage", + "nameLocation": "494:26:66", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 17371, + "nodeType": "StructuredDocumentation", + "src": "527:30:66", + "text": "@notice Allocation details" + }, + "id": 17376, + "mutability": "mutable", + "name": "_allocations", + "nameLocation": "632:12:66", + "nodeType": "VariableDeclaration", + "scope": 17401, + "src": "562:82:66", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "typeName": { + "id": 17375, + "keyName": "allocationId", + "keyNameLocation": "578:12:66", + "keyType": { + "id": 17372, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "570:7:66", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "562:60:66", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$15663_storage_$", + "typeString": "mapping(address => struct Allocation.State)" + }, + "valueName": "allocation", + "valueNameLocation": "611:10:66", + "valueType": { + "id": 17374, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17373, + "name": "Allocation.State", + "nameLocations": ["594:10:66", "605:5:66"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15663, + "src": "594:16:66" + }, + "referencedDeclaration": 15663, + "src": "594:16:66", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$15663_storage_ptr", + "typeString": "struct Allocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 17377, + "nodeType": "StructuredDocumentation", + "src": "651:37:66", + "text": "@notice Legacy allocation details" + }, + "id": 17382, + "mutability": "mutable", + "name": "_legacyAllocations", + "nameLocation": "769:18:66", + "nodeType": "VariableDeclaration", + "scope": 17401, + "src": "693:94:66", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "typeName": { + "id": 17381, + "keyName": "allocationId", + "keyNameLocation": "709:12:66", + "keyType": { + "id": 17378, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "701:7:66", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "693:66:66", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_State_$16305_storage_$", + "typeString": "mapping(address => struct LegacyAllocation.State)" + }, + "valueName": "allocation", + "valueNameLocation": "748:10:66", + "valueType": { + "id": 17380, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17379, + "name": "LegacyAllocation.State", + "nameLocations": ["725:16:66", "742:5:66"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16305, + "src": "725:22:66" + }, + "referencedDeclaration": 16305, + "src": "725:22:66", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16305_storage_ptr", + "typeString": "struct LegacyAllocation.State" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 17383, + "nodeType": "StructuredDocumentation", + "src": "794:47:66", + "text": "@notice Tracks allocated tokens per indexer" + }, + "functionSelector": "6234e216", + "id": 17387, + "mutability": "mutable", + "name": "allocationProvisionTracker", + "nameLocation": "896:26:66", + "nodeType": "VariableDeclaration", + "scope": 17401, + "src": "846:76:66", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 17386, + "keyName": "indexer", + "keyNameLocation": "862:7:66", + "keyType": { + "id": 17384, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "854:7:66", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "846:42:66", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueName": "tokens", + "valueNameLocation": "881:6:66", + "valueType": { + "id": 17385, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "873:7:66", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 17388, + "nodeType": "StructuredDocumentation", + "src": "929:111:66", + "text": "@notice Maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards" + }, + "functionSelector": "85e82baf", + "id": 17390, + "mutability": "mutable", + "name": "maxPOIStaleness", + "nameLocation": "1060:15:66", + "nodeType": "VariableDeclaration", + "scope": 17401, + "src": "1045:30:66", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17389, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1045:7:66", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 17391, + "nodeType": "StructuredDocumentation", + "src": "1082:112:66", + "text": "@notice Track total tokens allocated per subgraph deployment\n @dev Used to calculate indexing rewards" + }, + "id": 17395, + "mutability": "mutable", + "name": "_subgraphAllocatedTokens", + "nameLocation": "1264:24:66", + "nodeType": "VariableDeclaration", + "scope": 17401, + "src": "1199:89:66", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + }, + "typeName": { + "id": 17394, + "keyName": "subgraphDeploymentId", + "keyNameLocation": "1215:20:66", + "keyType": { + "id": 17392, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1207:7:66", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Mapping", + "src": "1199:55:66", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$", + "typeString": "mapping(bytes32 => uint256)" + }, + "valueName": "tokens", + "valueNameLocation": "1247:6:66", + "valueType": { + "id": 17393, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1239:7:66", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 17396, + "nodeType": "StructuredDocumentation", + "src": "1295:57:66", + "text": "@dev Gap to allow adding variables in future upgrades" + }, + "id": 17400, + "mutability": "mutable", + "name": "__gap", + "nameLocation": "1377:5:66", + "nodeType": "VariableDeclaration", + "scope": 17401, + "src": "1357:25:66", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage", + "typeString": "uint256[50]" + }, + "typeName": { + "baseType": { + "id": 17397, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1357:7:66", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17399, + "length": { + "hexValue": "3530", + "id": 17398, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1365:2:66", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "nodeType": "ArrayTypeName", + "src": "1357:11:66", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr", + "typeString": "uint256[50]" + } + }, + "visibility": "private" + } + ], + "scope": 17402, + "src": "476:909:66", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:1341:66" + }, + "id": 66 + }, + "contracts/utilities/AttestationManager.sol": { + "ast": { + "absolutePath": "contracts/utilities/AttestationManager.sol", + "exportedSymbols": { + "Attestation": [16290], + "AttestationManager": [17555], + "AttestationManagerV1Storage": [17567], + "ECDSA": [8231], + "Initializable": [5391] + }, + "id": 17556, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 17403, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:67" + }, + { + "absolutePath": "contracts/utilities/AttestationManagerStorage.sol", + "file": "./AttestationManagerStorage.sol", + "id": 17405, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17556, + "sourceUnit": 17568, + "src": "70:78:67", + "symbolAliases": [ + { + "foreign": { + "id": 17404, + "name": "AttestationManagerV1Storage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17567, + "src": "79:27:67", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", + "file": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", + "id": 17407, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17556, + "sourceUnit": 8232, + "src": "150:77:67", + "symbolAliases": [ + { + "foreign": { + "id": 17406, + "name": "ECDSA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8231, + "src": "159:5:67", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "file": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol", + "id": 17409, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17556, + "sourceUnit": 5392, + "src": "228:98:67", + "symbolAliases": [ + { + "foreign": { + "id": 17408, + "name": "Initializable", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5391, + "src": "237:13:67", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/Attestation.sol", + "file": "../libraries/Attestation.sol", + "id": 17411, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17556, + "sourceUnit": 16291, + "src": "327:59:67", + "symbolAliases": [ + { + "foreign": { + "id": 17410, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "336:11:67", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 17413, + "name": "Initializable", + "nameLocations": ["771:13:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5391, + "src": "771:13:67" + }, + "id": 17414, + "nodeType": "InheritanceSpecifier", + "src": "771:13:67" + }, + { + "baseName": { + "id": 17415, + "name": "AttestationManagerV1Storage", + "nameLocations": ["786:27:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 17567, + "src": "786:27:67" + }, + "id": 17416, + "nodeType": "InheritanceSpecifier", + "src": "786:27:67" + } + ], + "canonicalName": "AttestationManager", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 17412, + "nodeType": "StructuredDocumentation", + "src": "388:342:67", + "text": " @title AttestationManager contract\n @notice A helper contract implementing attestation verification.\n Uses a custom implementation of EIP712 for backwards compatibility with attestations.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 17555, + "linearizedBaseContracts": [17555, 17567, 5391], + "name": "AttestationManager", + "nameLocation": "749:18:67", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "documentation": { + "id": 17417, + "nodeType": "StructuredDocumentation", + "src": "820:47:67", + "text": "@notice EIP712 type hash for Receipt struct" + }, + "id": 17422, + "mutability": "constant", + "name": "RECEIPT_TYPE_HASH", + "nameLocation": "897:17:67", + "nodeType": "VariableDeclaration", + "scope": 17555, + "src": "872:142:67", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17418, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "872:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "52656365697074286279746573333220726571756573744349442c6279746573333220726573706f6e73654349442c627974657333322073756267726170684465706c6f796d656e74494429", + "id": 17420, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "935:78:67", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6", + "typeString": "literal_string \"Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)\"" + }, + "value": "Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6", + "typeString": "literal_string \"Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)\"" + } + ], + "id": 17419, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "925:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17421, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "925:89:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 17423, + "nodeType": "StructuredDocumentation", + "src": "1021:35:67", + "text": "@notice EIP712 domain type hash" + }, + "id": 17428, + "mutability": "constant", + "name": "DOMAIN_TYPE_HASH", + "nameLocation": "1086:16:67", + "nodeType": "VariableDeclaration", + "scope": 17555, + "src": "1061:160:67", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17424, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1061:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429", + "id": 17426, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1123:97:67", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_d87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472", + "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\"" + }, + "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_d87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472", + "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\"" + } + ], + "id": 17425, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "1113:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17427, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1113:108:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 17429, + "nodeType": "StructuredDocumentation", + "src": "1228:30:67", + "text": "@notice EIP712 domain name" + }, + "id": 17434, + "mutability": "constant", + "name": "DOMAIN_NAME_HASH", + "nameLocation": "1288:16:67", + "nodeType": "VariableDeclaration", + "scope": 17555, + "src": "1263:71:67", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17430, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1263:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "47726170682050726f746f636f6c", + "id": 17432, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1317:16:67", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4", + "typeString": "literal_string \"Graph Protocol\"" + }, + "value": "Graph Protocol" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4", + "typeString": "literal_string \"Graph Protocol\"" + } + ], + "id": 17431, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "1307:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17433, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1307:27:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 17435, + "nodeType": "StructuredDocumentation", + "src": "1341:33:67", + "text": "@notice EIP712 domain version" + }, + "id": 17440, + "mutability": "constant", + "name": "DOMAIN_VERSION_HASH", + "nameLocation": "1404:19:67", + "nodeType": "VariableDeclaration", + "scope": 17555, + "src": "1379:61:67", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17436, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1379:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "30", + "id": 17438, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1436:3:67", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "typeString": "literal_string \"0\"" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "typeString": "literal_string \"0\"" + } + ], + "id": 17437, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "1426:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17439, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1426:14:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "constant": true, + "documentation": { + "id": 17441, + "nodeType": "StructuredDocumentation", + "src": "1447:30:67", + "text": "@notice EIP712 domain salt" + }, + "id": 17444, + "mutability": "constant", + "name": "DOMAIN_SALT", + "nameLocation": "1507:11:67", + "nodeType": "VariableDeclaration", + "scope": 17555, + "src": "1482:105:67", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17442, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1482:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "hexValue": "307861303730666662316364373430393634396266373738323263636537343439353436386530366462666165663039353536383338626631383836373962396332", + "id": 17443, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1521:66:67", + "typeDescriptions": { + "typeIdentifier": "t_rational_72569707383443547382267636376646613935103975378761491950889697921835323734466_by_1", + "typeString": "int_const 7256...(69 digits omitted)...4466" + }, + "value": "0xa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c2" + }, + "visibility": "private" + }, + { + "body": { + "id": 17453, + "nodeType": "Block", + "src": "1802:54:67", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 17450, + "name": "__AttestationManager_init_unchained", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17479, + "src": "1812:35:67", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 17451, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1812:37:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17452, + "nodeType": "ExpressionStatement", + "src": "1812:37:67" + } + ] + }, + "documentation": { + "id": 17445, + "nodeType": "StructuredDocumentation", + "src": "1594:87:67", + "text": " @dev Initialize the AttestationManager contract and parent contracts" + }, + "id": 17454, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 17448, + "kind": "modifierInvocation", + "modifierName": { + "id": 17447, + "name": "onlyInitializing", + "nameLocations": ["1785:16:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "1785:16:67" + }, + "nodeType": "ModifierInvocation", + "src": "1785:16:67" + } + ], + "name": "__AttestationManager_init", + "nameLocation": "1748:25:67", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17446, + "nodeType": "ParameterList", + "parameters": [], + "src": "1773:2:67" + }, + "returnParameters": { + "id": 17449, + "nodeType": "ParameterList", + "parameters": [], + "src": "1802:0:67" + }, + "scope": 17555, + "src": "1739:117:67", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17478, + "nodeType": "Block", + "src": "2059:289:67", + "statements": [ + { + "expression": { + "id": 17476, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 17460, + "name": "_domainSeparator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17561, + "src": "2069:16:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "id": 17464, + "name": "DOMAIN_TYPE_HASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17428, + "src": "2139:16:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17465, + "name": "DOMAIN_NAME_HASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17434, + "src": "2173:16:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 17466, + "name": "DOMAIN_VERSION_HASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17440, + "src": "2207:19:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17467, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "2244:5:67", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 17468, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2250:7:67", + "memberName": "chainid", + "nodeType": "MemberAccess", + "src": "2244:13:67", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 17471, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "2283:4:67", + "typeDescriptions": { + "typeIdentifier": "t_contract$_AttestationManager_$17555", + "typeString": "contract AttestationManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_AttestationManager_$17555", + "typeString": "contract AttestationManager" + } + ], + "id": 17470, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2275:7:67", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 17469, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2275:7:67", + "typeDescriptions": {} + } + }, + "id": 17472, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2275:13:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17473, + "name": "DOMAIN_SALT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17444, + "src": "2306:11:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 17462, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "2111:3:67", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 17463, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2115:6:67", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "2111:10:67", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 17474, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2111:220:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 17461, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2088:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17475, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2088:253:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2069:272:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 17477, + "nodeType": "ExpressionStatement", + "src": "2069:272:67" + } + ] + }, + "documentation": { + "id": 17455, + "nodeType": "StructuredDocumentation", + "src": "1862:66:67", + "text": " @dev Initialize the AttestationManager contract" + }, + "id": 17479, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 17458, + "kind": "modifierInvocation", + "modifierName": { + "id": 17457, + "name": "onlyInitializing", + "nameLocations": ["2042:16:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 5286, + "src": "2042:16:67" + }, + "nodeType": "ModifierInvocation", + "src": "2042:16:67" + } + ], + "name": "__AttestationManager_init_unchained", + "nameLocation": "1995:35:67", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17456, + "nodeType": "ParameterList", + "parameters": [], + "src": "2030:2:67" + }, + "returnParameters": { + "id": 17459, + "nodeType": "ParameterList", + "parameters": [], + "src": "2059:0:67" + }, + "scope": 17555, + "src": "1986:362:67", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17523, + "nodeType": "Block", + "src": "2607:605:67", + "statements": [ + { + "assignments": [17492], + "declarations": [ + { + "constant": false, + "id": 17492, + "mutability": "mutable", + "name": "receipt", + "nameLocation": "2722:7:67", + "nodeType": "VariableDeclaration", + "scope": 17523, + "src": "2695:34:67", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt" + }, + "typeName": { + "id": 17491, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17490, + "name": "Attestation.Receipt", + "nameLocations": ["2695:11:67", "2707:7:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16044, + "src": "2695:19:67" + }, + "referencedDeclaration": 16044, + "src": "2695:19:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_storage_ptr", + "typeString": "struct Attestation.Receipt" + } + }, + "visibility": "internal" + } + ], + "id": 17502, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 17495, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17483, + "src": "2765:12:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 17496, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2778:10:67", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16047, + "src": "2765:23:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17497, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17483, + "src": "2802:12:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 17498, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2815:11:67", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16049, + "src": "2802:24:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17499, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17483, + "src": "2840:12:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 17500, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2853:20:67", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16051, + "src": "2840:33:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 17493, + "name": "Attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 16290, + "src": "2732:11:67", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Attestation_$16290_$", + "typeString": "type(library Attestation)" + } + }, + "id": 17494, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2744:7:67", + "memberName": "Receipt", + "nodeType": "MemberAccess", + "referencedDeclaration": 16044, + "src": "2732:19:67", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_Receipt_$16044_storage_ptr_$", + "typeString": "type(struct Attestation.Receipt storage pointer)" + } + }, + "id": 17501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2732:151:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2695:188:67" + }, + { + "assignments": [17504], + "declarations": [ + { + "constant": false, + "id": 17504, + "mutability": "mutable", + "name": "messageHash", + "nameLocation": "2901:11:67", + "nodeType": "VariableDeclaration", + "scope": 17523, + "src": "2893:19:67", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17503, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2893:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 17508, + "initialValue": { + "arguments": [ + { + "id": 17506, + "name": "receipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17492, + "src": "2930:7:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt memory" + } + ], + "id": 17505, + "name": "_encodeReceipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17554, + "src": "2915:14:67", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Receipt_$16044_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (struct Attestation.Receipt memory) view returns (bytes32)" + } + }, + "id": 17507, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2915:23:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2893:45:67" + }, + { + "expression": { + "arguments": [ + { + "id": 17511, + "name": "messageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17504, + "src": "3127:11:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "expression": { + "id": 17514, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17483, + "src": "3157:12:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 17515, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3170:1:67", + "memberName": "r", + "nodeType": "MemberAccess", + "referencedDeclaration": 16053, + "src": "3157:14:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17516, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17483, + "src": "3173:12:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 17517, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3186:1:67", + "memberName": "s", + "nodeType": "MemberAccess", + "referencedDeclaration": 16055, + "src": "3173:14:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17518, + "name": "_attestation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17483, + "src": "3189:12:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State memory" + } + }, + "id": 17519, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3202:1:67", + "memberName": "v", + "nodeType": "MemberAccess", + "referencedDeclaration": 16057, + "src": "3189:14:67", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "expression": { + "id": 17512, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3140:3:67", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 17513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3144:12:67", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "3140:16:67", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 17520, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3140:64:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 17509, + "name": "ECDSA", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 8231, + "src": "3113:5:67", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ECDSA_$8231_$", + "typeString": "type(library ECDSA)" + } + }, + "id": 17510, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3119:7:67", + "memberName": "recover", + "nodeType": "MemberAccess", + "referencedDeclaration": 7987, + "src": "3113:13:67", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$", + "typeString": "function (bytes32,bytes memory) pure returns (address)" + } + }, + "id": 17521, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3113:92:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 17487, + "id": 17522, + "nodeType": "Return", + "src": "3106:99:67" + } + ] + }, + "documentation": { + "id": 17480, + "nodeType": "StructuredDocumentation", + "src": "2354:153:67", + "text": " @dev Recover the signer address of the `_attestation`.\n @param _attestation The attestation struct\n @return Signer address" + }, + "id": 17524, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_recoverSigner", + "nameLocation": "2521:14:67", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17484, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17483, + "mutability": "mutable", + "name": "_attestation", + "nameLocation": "2561:12:67", + "nodeType": "VariableDeclaration", + "scope": 17524, + "src": "2536:37:67", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_memory_ptr", + "typeString": "struct Attestation.State" + }, + "typeName": { + "id": 17482, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17481, + "name": "Attestation.State", + "nameLocations": ["2536:11:67", "2548:5:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16058, + "src": "2536:17:67" + }, + "referencedDeclaration": 16058, + "src": "2536:17:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_State_$16058_storage_ptr", + "typeString": "struct Attestation.State" + } + }, + "visibility": "internal" + } + ], + "src": "2535:39:67" + }, + "returnParameters": { + "id": 17487, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17486, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17524, + "src": "2598:7:67", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17485, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2598:7:67", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2597:9:67" + }, + "scope": 17555, + "src": "2512:700:67", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17553, + "nodeType": "Block", + "src": "3746:576:67", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "1901", + "id": 17536, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3840:10:67", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", + "typeString": "literal_string hex\"1901\"" + }, + "value": "\u0019\u0001" + }, + { + "id": 17537, + "name": "_domainSeparator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17561, + "src": "3915:16:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "arguments": [ + { + "id": 17541, + "name": "RECEIPT_TYPE_HASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17422, + "src": "4028:17:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17542, + "name": "_receipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17528, + "src": "4075:8:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt memory" + } + }, + "id": 17543, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4084:10:67", + "memberName": "requestCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16039, + "src": "4075:19:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17544, + "name": "_receipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17528, + "src": "4124:8:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt memory" + } + }, + "id": 17545, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4133:11:67", + "memberName": "responseCID", + "nodeType": "MemberAccess", + "referencedDeclaration": 16041, + "src": "4124:20:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "expression": { + "id": 17546, + "name": "_receipt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17528, + "src": "4174:8:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt memory" + } + }, + "id": 17547, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4183:20:67", + "memberName": "subgraphDeploymentId", + "nodeType": "MemberAccess", + "referencedDeclaration": 16043, + "src": "4174:29:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 17539, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3988:3:67", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 17540, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3992:6:67", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "3988:10:67", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 17548, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3988:241:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 17538, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "3953:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17549, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3953:330:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", + "typeString": "literal_string hex\"1901\"" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 17534, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "3802:3:67", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 17535, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3806:12:67", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "3802:16:67", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 17550, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3802:499:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 17533, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "3775:9:67", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 17551, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3775:540:67", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 17532, + "id": 17552, + "nodeType": "Return", + "src": "3756:559:67" + } + ] + }, + "documentation": { + "id": 17525, + "nodeType": "StructuredDocumentation", + "src": "3218:430:67", + "text": " @dev Get the message hash that a indexer used to sign the receipt.\n Encodes a receipt using a domain separator, as described on\n https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification.\n @notice Return the message hash used to sign the receipt\n @param _receipt Receipt returned by indexer and submitted by fisherman\n @return Message hash used to sign the receipt" + }, + "id": 17554, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_encodeReceipt", + "nameLocation": "3662:14:67", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17529, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17528, + "mutability": "mutable", + "name": "_receipt", + "nameLocation": "3704:8:67", + "nodeType": "VariableDeclaration", + "scope": 17554, + "src": "3677:35:67", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_memory_ptr", + "typeString": "struct Attestation.Receipt" + }, + "typeName": { + "id": 17527, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17526, + "name": "Attestation.Receipt", + "nameLocations": ["3677:11:67", "3689:7:67"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 16044, + "src": "3677:19:67" + }, + "referencedDeclaration": 16044, + "src": "3677:19:67", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Receipt_$16044_storage_ptr", + "typeString": "struct Attestation.Receipt" + } + }, + "visibility": "internal" + } + ], + "src": "3676:37:67" + }, + "returnParameters": { + "id": 17532, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17531, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17554, + "src": "3737:7:67", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17530, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3737:7:67", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3736:9:67" + }, + "scope": 17555, + "src": "3653:669:67", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 17556, + "src": "731:3593:67", + "usedErrors": [5140, 5143], + "usedEvents": [5148] + } + ], + "src": "45:4280:67" + }, + "id": 67 + }, + "contracts/utilities/AttestationManagerStorage.sol": { + "ast": { + "absolutePath": "contracts/utilities/AttestationManagerStorage.sol", + "exportedSymbols": { + "AttestationManagerV1Storage": [17567] + }, + "id": 17568, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 17557, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:68" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "AttestationManagerV1Storage", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 17558, + "nodeType": "StructuredDocumentation", + "src": "70:278:68", + "text": " @title AttestationManagerStorage\n @notice This contract holds all the storage variables for the Attestation Manager contract.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 17567, + "linearizedBaseContracts": [17567], + "name": "AttestationManagerV1Storage", + "nameLocation": "367:27:68", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 17559, + "nodeType": "StructuredDocumentation", + "src": "401:32:68", + "text": "@dev EIP712 domain separator" + }, + "id": 17561, + "mutability": "mutable", + "name": "_domainSeparator", + "nameLocation": "455:16:68", + "nodeType": "VariableDeclaration", + "scope": 17567, + "src": "438:33:68", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 17560, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "438:7:68", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "documentation": { + "id": 17562, + "nodeType": "StructuredDocumentation", + "src": "478:57:68", + "text": "@dev Gap to allow adding variables in future upgrades" + }, + "id": 17566, + "mutability": "mutable", + "name": "__gap", + "nameLocation": "560:5:68", + "nodeType": "VariableDeclaration", + "scope": 17567, + "src": "540:25:68", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage", + "typeString": "uint256[50]" + }, + "typeName": { + "baseType": { + "id": 17563, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "540:7:68", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 17565, + "length": { + "hexValue": "3530", + "id": 17564, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "548:2:68", + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "nodeType": "ArrayTypeName", + "src": "540:11:68", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr", + "typeString": "uint256[50]" + } + }, + "visibility": "private" + } + ], + "scope": 17568, + "src": "349:219:68", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "45:524:68" + }, + "id": 68 + }, + "contracts/utilities/Directory.sol": { + "ast": { + "absolutePath": "contracts/utilities/Directory.sol", + "exportedSymbols": { + "Directory": [17720], + "ICuration": [165], + "IDisputeManager": [15373], + "IGraphTallyCollector": [2605], + "ISubgraphService": [15634] + }, + "id": 17721, + "license": "GPL-3.0-or-later", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 17569, + "literals": ["solidity", "0.8", ".27"], + "nodeType": "PragmaDirective", + "src": "45:23:69" + }, + { + "absolutePath": "contracts/interfaces/IDisputeManager.sol", + "file": "../interfaces/IDisputeManager.sol", + "id": 17571, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17721, + "sourceUnit": 15374, + "src": "70:68:69", + "symbolAliases": [ + { + "foreign": { + "id": 17570, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "79:15:69", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/ISubgraphService.sol", + "file": "../interfaces/ISubgraphService.sol", + "id": 17573, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17721, + "sourceUnit": 15635, + "src": "139:70:69", + "symbolAliases": [ + { + "foreign": { + "id": 17572, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "148:16:69", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol", + "file": "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol", + "id": 17575, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17721, + "sourceUnit": 2606, + "src": "210:108:69", + "symbolAliases": [ + { + "foreign": { + "id": 17574, + "name": "IGraphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2605, + "src": "219:20:69", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "absolutePath": "@graphprotocol/contracts/contracts/curation/ICuration.sol", + "file": "@graphprotocol/contracts/contracts/curation/ICuration.sol", + "id": 17577, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 17721, + "sourceUnit": 166, + "src": "319:86:69", + "symbolAliases": [ + { + "foreign": { + "id": 17576, + "name": "ICuration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 165, + "src": "328:9:69", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "Directory", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 17578, + "nodeType": "StructuredDocumentation", + "src": "407:388:69", + "text": " @title Directory contract\n @notice This contract is meant to be inherited by {SubgraphService} contract.\n It contains the addresses of the contracts that the contract interacts with.\n Uses immutable variables to minimize gas costs.\n @custom:security-contact Please email security+contracts@thegraph.com if you find any\n bugs. We may have an active bug bounty program." + }, + "fullyImplemented": true, + "id": 17720, + "linearizedBaseContracts": [17720], + "name": "Directory", + "nameLocation": "814:9:69", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "documentation": { + "id": 17579, + "nodeType": "StructuredDocumentation", + "src": "830:49:69", + "text": "@notice The Subgraph Service contract address" + }, + "id": 17582, + "mutability": "immutable", + "name": "SUBGRAPH_SERVICE", + "nameLocation": "919:16:69", + "nodeType": "VariableDeclaration", + "scope": 17720, + "src": "884:51:69", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 17581, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17580, + "name": "ISubgraphService", + "nameLocations": ["884:16:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "884:16:69" + }, + "referencedDeclaration": 15634, + "src": "884:16:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 17583, + "nodeType": "StructuredDocumentation", + "src": "942:48:69", + "text": "@notice The Dispute Manager contract address" + }, + "id": 17586, + "mutability": "immutable", + "name": "DISPUTE_MANAGER", + "nameLocation": "1029:15:69", + "nodeType": "VariableDeclaration", + "scope": 17720, + "src": "995:49:69", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + }, + "typeName": { + "id": 17585, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17584, + "name": "IDisputeManager", + "nameLocations": ["995:15:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15373, + "src": "995:15:69" + }, + "referencedDeclaration": 15373, + "src": "995:15:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 17587, + "nodeType": "StructuredDocumentation", + "src": "1051:132:69", + "text": "@notice The Graph Tally Collector contract address\n @dev Required to collect payments via Graph Horizon payments protocol" + }, + "id": 17590, + "mutability": "immutable", + "name": "GRAPH_TALLY_COLLECTOR", + "nameLocation": "1227:21:69", + "nodeType": "VariableDeclaration", + "scope": 17720, + "src": "1188:60:69", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + }, + "typeName": { + "id": 17589, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17588, + "name": "IGraphTallyCollector", + "nameLocations": ["1188:20:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2605, + "src": "1188:20:69" + }, + "referencedDeclaration": 2605, + "src": "1188:20:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "visibility": "private" + }, + { + "constant": false, + "documentation": { + "id": 17591, + "nodeType": "StructuredDocumentation", + "src": "1255:94:69", + "text": "@notice The Curation contract address\n @dev Required for curation fees distribution" + }, + "id": 17594, + "mutability": "immutable", + "name": "CURATION", + "nameLocation": "1382:8:69", + "nodeType": "VariableDeclaration", + "scope": 17720, + "src": "1354:36:69", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + }, + "typeName": { + "id": 17593, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17592, + "name": "ICuration", + "nameLocations": ["1354:9:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 165, + "src": "1354:9:69" + }, + "referencedDeclaration": 165, + "src": "1354:9:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": { + "id": 17595, + "nodeType": "StructuredDocumentation", + "src": "1397:332:69", + "text": " @notice Emitted when the Directory is initialized\n @param subgraphService The Subgraph Service contract address\n @param disputeManager The Dispute Manager contract address\n @param graphTallyCollector The Graph Tally Collector contract address\n @param curation The Curation contract address" + }, + "eventSelector": "4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda7", + "id": 17605, + "name": "SubgraphServiceDirectoryInitialized", + "nameLocation": "1740:35:69", + "nodeType": "EventDefinition", + "parameters": { + "id": 17604, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17597, + "indexed": false, + "mutability": "mutable", + "name": "subgraphService", + "nameLocation": "1793:15:69", + "nodeType": "VariableDeclaration", + "scope": 17605, + "src": "1785:23:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17596, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1785:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17599, + "indexed": false, + "mutability": "mutable", + "name": "disputeManager", + "nameLocation": "1826:14:69", + "nodeType": "VariableDeclaration", + "scope": 17605, + "src": "1818:22:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17598, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1818:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17601, + "indexed": false, + "mutability": "mutable", + "name": "graphTallyCollector", + "nameLocation": "1858:19:69", + "nodeType": "VariableDeclaration", + "scope": 17605, + "src": "1850:27:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17600, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1850:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17603, + "indexed": false, + "mutability": "mutable", + "name": "curation", + "nameLocation": "1895:8:69", + "nodeType": "VariableDeclaration", + "scope": 17605, + "src": "1887:16:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17602, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1887:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1775:134:69" + }, + "src": "1734:176:69" + }, + { + "documentation": { + "id": 17606, + "nodeType": "StructuredDocumentation", + "src": "1916:173:69", + "text": " @notice Thrown when the caller is not the Dispute Manager\n @param caller The caller address\n @param disputeManager The Dispute Manager address" + }, + "errorSelector": "cdc0567f", + "id": 17612, + "name": "DirectoryNotDisputeManager", + "nameLocation": "2100:26:69", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 17611, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17608, + "mutability": "mutable", + "name": "caller", + "nameLocation": "2135:6:69", + "nodeType": "VariableDeclaration", + "scope": 17612, + "src": "2127:14:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17607, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2127:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17610, + "mutability": "mutable", + "name": "disputeManager", + "nameLocation": "2151:14:69", + "nodeType": "VariableDeclaration", + "scope": 17612, + "src": "2143:22:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17609, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2143:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2126:40:69" + }, + "src": "2094:73:69" + }, + { + "body": { + "id": 17634, + "nodeType": "Block", + "src": "2280:175:69", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 17622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 17616, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2311:3:69", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 17617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2315:6:69", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2311:10:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "id": 17620, + "name": "DISPUTE_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17586, + "src": "2333:15:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + ], + "id": 17619, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2325:7:69", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 17618, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2325:7:69", + "typeDescriptions": {} + } + }, + "id": 17621, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2325:24:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2311:38:69", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "arguments": [ + { + "expression": { + "id": 17624, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2390:3:69", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 17625, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2394:6:69", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2390:10:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 17628, + "name": "DISPUTE_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17586, + "src": "2410:15:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + ], + "id": 17627, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2402:7:69", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 17626, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2402:7:69", + "typeDescriptions": {} + } + }, + "id": 17629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2402:24:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17623, + "name": "DirectoryNotDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17612, + "src": "2363:26:69", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$_t_error_$", + "typeString": "function (address,address) pure returns (error)" + } + }, + "id": 17630, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2363:64:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_error", + "typeString": "error" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_error", + "typeString": "error" + } + ], + "id": 17615, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [-18, -18, -18], + "referencedDeclaration": -18, + "src": "2290:7:69", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_error_$returns$__$", + "typeString": "function (bool,error) pure" + } + }, + "id": 17631, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2290:147:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17632, + "nodeType": "ExpressionStatement", + "src": "2290:147:69" + }, + { + "id": 17633, + "nodeType": "PlaceholderStatement", + "src": "2447:1:69" + } + ] + }, + "documentation": { + "id": 17613, + "nodeType": "StructuredDocumentation", + "src": "2173:72:69", + "text": " @notice Checks that the caller is the Dispute Manager" + }, + "id": 17635, + "name": "onlyDisputeManager", + "nameLocation": "2259:18:69", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 17614, + "nodeType": "ParameterList", + "parameters": [], + "src": "2277:2:69" + }, + "src": "2250:205:69", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17678, + "nodeType": "Block", + "src": "2903:358:69", + "statements": [ + { + "expression": { + "id": 17651, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 17647, + "name": "SUBGRAPH_SERVICE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17582, + "src": "2913:16:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 17649, + "name": "subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17638, + "src": "2949:15:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17648, + "name": "ISubgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15634, + "src": "2932:16:69", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ISubgraphService_$15634_$", + "typeString": "type(contract ISubgraphService)" + } + }, + "id": 17650, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2932:33:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "src": "2913:52:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "id": 17652, + "nodeType": "ExpressionStatement", + "src": "2913:52:69" + }, + { + "expression": { + "id": 17657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 17653, + "name": "DISPUTE_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17586, + "src": "2975:15:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 17655, + "name": "disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17640, + "src": "3009:14:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17654, + "name": "IDisputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 15373, + "src": "2993:15:69", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IDisputeManager_$15373_$", + "typeString": "type(contract IDisputeManager)" + } + }, + "id": 17656, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2993:31:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "src": "2975:49:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "id": 17658, + "nodeType": "ExpressionStatement", + "src": "2975:49:69" + }, + { + "expression": { + "id": 17663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 17659, + "name": "GRAPH_TALLY_COLLECTOR", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17590, + "src": "3034:21:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 17661, + "name": "graphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17642, + "src": "3079:19:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17660, + "name": "IGraphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2605, + "src": "3058:20:69", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IGraphTallyCollector_$2605_$", + "typeString": "type(contract IGraphTallyCollector)" + } + }, + "id": 17662, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3058:41:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "src": "3034:65:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "id": 17664, + "nodeType": "ExpressionStatement", + "src": "3034:65:69" + }, + { + "expression": { + "id": 17669, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 17665, + "name": "CURATION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17594, + "src": "3109:8:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 17667, + "name": "curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17644, + "src": "3130:8:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17666, + "name": "ICuration", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 165, + "src": "3120:9:69", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ICuration_$165_$", + "typeString": "type(contract ICuration)" + } + }, + "id": 17668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3120:19:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "src": "3109:30:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "id": 17670, + "nodeType": "ExpressionStatement", + "src": "3109:30:69" + }, + { + "eventCall": { + "arguments": [ + { + "id": 17672, + "name": "subgraphService", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17638, + "src": "3191:15:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17673, + "name": "disputeManager", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17640, + "src": "3208:14:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17674, + "name": "graphTallyCollector", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17642, + "src": "3224:19:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 17675, + "name": "curation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17644, + "src": "3245:8:69", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 17671, + "name": "SubgraphServiceDirectoryInitialized", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17605, + "src": "3155:35:69", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address,address,address)" + } + }, + "id": 17676, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3155:99:69", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 17677, + "nodeType": "EmitStatement", + "src": "3150:104:69" + } + ] + }, + "documentation": { + "id": 17636, + "nodeType": "StructuredDocumentation", + "src": "2461:329:69", + "text": " @notice Constructor for the Directory contract\n @param subgraphService The Subgraph Service contract address\n @param disputeManager The Dispute Manager contract address\n @param graphTallyCollector The Graph Tally Collector contract address\n @param curation The Curation contract address" + }, + "id": 17679, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17645, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17638, + "mutability": "mutable", + "name": "subgraphService", + "nameLocation": "2815:15:69", + "nodeType": "VariableDeclaration", + "scope": 17679, + "src": "2807:23:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17637, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2807:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17640, + "mutability": "mutable", + "name": "disputeManager", + "nameLocation": "2840:14:69", + "nodeType": "VariableDeclaration", + "scope": 17679, + "src": "2832:22:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17639, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2832:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17642, + "mutability": "mutable", + "name": "graphTallyCollector", + "nameLocation": "2864:19:69", + "nodeType": "VariableDeclaration", + "scope": 17679, + "src": "2856:27:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17641, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2856:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 17644, + "mutability": "mutable", + "name": "curation", + "nameLocation": "2893:8:69", + "nodeType": "VariableDeclaration", + "scope": 17679, + "src": "2885:16:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 17643, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2885:7:69", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2806:96:69" + }, + "returnParameters": { + "id": 17646, + "nodeType": "ParameterList", + "parameters": [], + "src": "2903:0:69" + }, + "scope": 17720, + "src": "2795:466:69", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17688, + "nodeType": "Block", + "src": "3458:40:69", + "statements": [ + { + "expression": { + "id": 17686, + "name": "SUBGRAPH_SERVICE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17582, + "src": "3475:16:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "functionReturnParameters": 17685, + "id": 17687, + "nodeType": "Return", + "src": "3468:23:69" + } + ] + }, + "documentation": { + "id": 17680, + "nodeType": "StructuredDocumentation", + "src": "3267:117:69", + "text": " @notice Returns the Subgraph Service contract address\n @return The Subgraph Service contract" + }, + "id": 17689, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_subgraphService", + "nameLocation": "3398:16:69", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17681, + "nodeType": "ParameterList", + "parameters": [], + "src": "3414:2:69" + }, + "returnParameters": { + "id": 17685, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17684, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17689, + "src": "3440:16:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + }, + "typeName": { + "id": 17683, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17682, + "name": "ISubgraphService", + "nameLocations": ["3440:16:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15634, + "src": "3440:16:69" + }, + "referencedDeclaration": 15634, + "src": "3440:16:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ISubgraphService_$15634", + "typeString": "contract ISubgraphService" + } + }, + "visibility": "internal" + } + ], + "src": "3439:18:69" + }, + "scope": 17720, + "src": "3389:109:69", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17698, + "nodeType": "Block", + "src": "3691:39:69", + "statements": [ + { + "expression": { + "id": 17696, + "name": "DISPUTE_MANAGER", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17586, + "src": "3708:15:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "functionReturnParameters": 17695, + "id": 17697, + "nodeType": "Return", + "src": "3701:22:69" + } + ] + }, + "documentation": { + "id": 17690, + "nodeType": "StructuredDocumentation", + "src": "3504:115:69", + "text": " @notice Returns the Dispute Manager contract address\n @return The Dispute Manager contract" + }, + "id": 17699, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_disputeManager", + "nameLocation": "3633:15:69", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17691, + "nodeType": "ParameterList", + "parameters": [], + "src": "3648:2:69" + }, + "returnParameters": { + "id": 17695, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17694, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17699, + "src": "3674:15:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + }, + "typeName": { + "id": 17693, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17692, + "name": "IDisputeManager", + "nameLocations": ["3674:15:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 15373, + "src": "3674:15:69" + }, + "referencedDeclaration": 15373, + "src": "3674:15:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IDisputeManager_$15373", + "typeString": "contract IDisputeManager" + } + }, + "visibility": "internal" + } + ], + "src": "3673:17:69" + }, + "scope": 17720, + "src": "3624:106:69", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17708, + "nodeType": "Block", + "src": "3945:45:69", + "statements": [ + { + "expression": { + "id": 17706, + "name": "GRAPH_TALLY_COLLECTOR", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17590, + "src": "3962:21:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "functionReturnParameters": 17705, + "id": 17707, + "nodeType": "Return", + "src": "3955:28:69" + } + ] + }, + "documentation": { + "id": 17700, + "nodeType": "StructuredDocumentation", + "src": "3736:127:69", + "text": " @notice Returns the Graph Tally Collector contract address\n @return The Graph Tally Collector contract" + }, + "id": 17709, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_graphTallyCollector", + "nameLocation": "3877:20:69", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17701, + "nodeType": "ParameterList", + "parameters": [], + "src": "3897:2:69" + }, + "returnParameters": { + "id": 17705, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17704, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17709, + "src": "3923:20:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + }, + "typeName": { + "id": 17703, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17702, + "name": "IGraphTallyCollector", + "nameLocations": ["3923:20:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2605, + "src": "3923:20:69" + }, + "referencedDeclaration": 2605, + "src": "3923:20:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IGraphTallyCollector_$2605", + "typeString": "contract IGraphTallyCollector" + } + }, + "visibility": "internal" + } + ], + "src": "3922:22:69" + }, + "scope": 17720, + "src": "3868:122:69", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 17718, + "nodeType": "Block", + "src": "4157:32:69", + "statements": [ + { + "expression": { + "id": 17716, + "name": "CURATION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 17594, + "src": "4174:8:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "functionReturnParameters": 17715, + "id": 17717, + "nodeType": "Return", + "src": "4167:15:69" + } + ] + }, + "documentation": { + "id": 17710, + "nodeType": "StructuredDocumentation", + "src": "3996:101:69", + "text": " @notice Returns the Curation contract address\n @return The Curation contract" + }, + "id": 17719, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_curation", + "nameLocation": "4111:9:69", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17711, + "nodeType": "ParameterList", + "parameters": [], + "src": "4120:2:69" + }, + "returnParameters": { + "id": 17715, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17714, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 17719, + "src": "4146:9:69", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + }, + "typeName": { + "id": 17713, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 17712, + "name": "ICuration", + "nameLocations": ["4146:9:69"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 165, + "src": "4146:9:69" + }, + "referencedDeclaration": 165, + "src": "4146:9:69", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ICuration_$165", + "typeString": "contract ICuration" + } + }, + "visibility": "internal" + } + ], + "src": "4145:11:69" + }, + "scope": 17720, + "src": "4102:87:69", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 17721, + "src": "796:3395:69", + "usedErrors": [17612], + "usedEvents": [17605] + } + ], + "src": "45:4147:69" + }, + "id": 69 + } + }, + "contracts": { + "@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol": { + "ITokenGateway": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "l1ERC20", + "type": "address" + } + ], + "name": "calculateL2TokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "finalizeInboundTransfer", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amunt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPiceBid", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "outboundTransfer", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "calculateL2TokenAddress(address)": "a7e28d48", + "finalizeInboundTransfer(address,address,address,uint256,bytes)": "2e567b36", + "outboundTransfer(address,address,uint256,uint256,uint256,bytes)": "d2ce7d65" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"l1ERC20\",\"type\":\"address\"}],\"name\":\"calculateL2TokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"finalizeInboundTransfer\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amunt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPiceBid\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"outboundTransfer\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"calculateL2TokenAddress(address)\":{\"details\":\"the L1 and L2 address oracles may not always be in sync. For example, a custom token may have been registered but not deployed or the contract self destructed.\",\"params\":{\"l1ERC20\":\"address of L1 token\"},\"returns\":{\"_0\":\"L2 address of a bridged ERC20 token\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"calculateL2TokenAddress(address)\":{\"notice\":\"Calculate the address used when bridging an ERC20 token\"},\"outboundTransfer(address,address,uint256,uint256,uint256,bytes)\":{\"notice\":\"event deprecated in favor of DepositFinalized and WithdrawalFinalized\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":\"ITokenGateway\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/curation/ICuration.sol": { + "ICuration": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_tokensOutMin", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "curationTaxPercentage", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCurationPoolTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getCuratorSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isCurated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_signalOutMin", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_percentage", + "type": "uint32" + } + ], + "name": "setCurationTaxPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_curationTokenMaster", + "type": "address" + } + ], + "name": "setCurationTokenMaster", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_defaultReserveRatio", + "type": "uint32" + } + ], + "name": "setDefaultReserveRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumCurationDeposit", + "type": "uint256" + } + ], + "name": "setMinimumCurationDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_signalIn", + "type": "uint256" + } + ], + "name": "signalToTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "burn(bytes32,uint256,uint256)": "24bdeec7", + "collect(bytes32,uint256)": "81573288", + "curationTaxPercentage()": "f115c427", + "getCurationPoolSignal(bytes32)": "99439fee", + "getCurationPoolTokens(bytes32)": "46e855da", + "getCuratorSignal(address,bytes32)": "9f94c667", + "isCurated(bytes32)": "4c4ea0ed", + "mint(bytes32,uint256,uint256)": "375a54ab", + "setCurationTaxPercentage(uint32)": "cd18119e", + "setCurationTokenMaster(address)": "9b4d9f33", + "setDefaultReserveRatio(uint32)": "cd0ad4a2", + "setMinimumCurationDeposit(uint256)": "6536fe32", + "signalToTokens(bytes32,uint256)": "0faaf87f", + "tokensToSignal(bytes32,uint256)": "f049b900" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_signalIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_tokensOutMin\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_tokens\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"curationTaxPercentage\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"getCurationPoolSignal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"getCurationPoolTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_curator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"getCuratorSignal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"isCurated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_tokensIn\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_signalOutMin\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_percentage\",\"type\":\"uint32\"}],\"name\":\"setCurationTaxPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_curationTokenMaster\",\"type\":\"address\"}],\"name\":\"setCurationTokenMaster\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_defaultReserveRatio\",\"type\":\"uint32\"}],\"name\":\"setDefaultReserveRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minimumCurationDeposit\",\"type\":\"uint256\"}],\"name\":\"setMinimumCurationDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_signalIn\",\"type\":\"uint256\"}],\"name\":\"signalToTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_tokensIn\",\"type\":\"uint256\"}],\"name\":\"tokensToSignal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for the Curation contract (and L2Curation too)\",\"kind\":\"dev\",\"methods\":{\"burn(bytes32,uint256,uint256)\":{\"params\":{\"_signalIn\":\"Amount of signal to return\",\"_subgraphDeploymentID\":\"SubgraphDeployment the curator is returning signal\",\"_tokensOutMin\":\"Expected minimum amount of tokens to receive\"},\"returns\":{\"_0\":\"Tokens returned\"}},\"collect(bytes32,uint256)\":{\"params\":{\"_subgraphDeploymentID\":\"SubgraphDeployment where funds should be allocated as reserves\",\"_tokens\":\"Amount of Graph Tokens to add to reserves\"}},\"curationTaxPercentage()\":{\"returns\":{\"_0\":\"Curation tax percentage expressed in PPM\"}},\"getCurationPoolSignal(bytes32)\":{\"params\":{\"_subgraphDeploymentID\":\"Subgraph deployment curation pool\"},\"returns\":{\"_0\":\"Amount of signal minted for the subgraph deployment\"}},\"getCurationPoolTokens(bytes32)\":{\"params\":{\"_subgraphDeploymentID\":\"Subgraph deployment curation pool\"},\"returns\":{\"_0\":\"Amount of token reserves in the curation pool\"}},\"getCuratorSignal(address,bytes32)\":{\"params\":{\"_curator\":\"Curator owning the signal tokens\",\"_subgraphDeploymentID\":\"Subgraph deployment curation pool\"},\"returns\":{\"_0\":\"Amount of signal owned by a curator for the subgraph deployment\"}},\"isCurated(bytes32)\":{\"params\":{\"_subgraphDeploymentID\":\"SubgraphDeployment to check if curated\"},\"returns\":{\"_0\":\"True if curated, false otherwise\"}},\"mint(bytes32,uint256,uint256)\":{\"params\":{\"_signalOutMin\":\"Expected minimum amount of signal to receive\",\"_subgraphDeploymentID\":\"Subgraph deployment pool from where to mint signal\",\"_tokensIn\":\"Amount of Graph Tokens to deposit\"},\"returns\":{\"_0\":\"Amount of signal minted\",\"_1\":\"Amount of curation tax burned\"}},\"setCurationTaxPercentage(uint32)\":{\"params\":{\"_percentage\":\"Curation tax percentage charged when depositing GRT tokens\"}},\"setCurationTokenMaster(address)\":{\"params\":{\"_curationTokenMaster\":\"Address of implementation contract to use for curation tokens\"}},\"setDefaultReserveRatio(uint32)\":{\"params\":{\"_defaultReserveRatio\":\"Reserve ratio (in PPM)\"}},\"setMinimumCurationDeposit(uint256)\":{\"params\":{\"_minimumCurationDeposit\":\"Minimum amount of tokens required deposit\"}},\"signalToTokens(bytes32,uint256)\":{\"params\":{\"_signalIn\":\"Amount of signal to burn\",\"_subgraphDeploymentID\":\"Subgraph deployment to burn signal\"},\"returns\":{\"_0\":\"Amount of tokens to get for the specified amount of signal\"}},\"tokensToSignal(bytes32,uint256)\":{\"params\":{\"_subgraphDeploymentID\":\"Subgraph deployment to mint signal\",\"_tokensIn\":\"Amount of tokens used to mint signal\"},\"returns\":{\"_0\":\"Amount of signal that can be bought\",\"_1\":\"Amount of tokens that will be burned as curation tax\"}}},\"title\":\"Curation Interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"burn(bytes32,uint256,uint256)\":{\"notice\":\"Burn _signal from the SubgraphDeployment curation pool\"},\"collect(bytes32,uint256)\":{\"notice\":\"Assign Graph Tokens collected as curation fees to the curation pool reserve.\"},\"curationTaxPercentage()\":{\"notice\":\"Tax charged when curators deposit funds. Parts per million. (Allows for 4 decimal points, 999,999 = 99.9999%)\"},\"getCurationPoolSignal(bytes32)\":{\"notice\":\"Get the amount of signal in a curation pool.\"},\"getCurationPoolTokens(bytes32)\":{\"notice\":\"Get the amount of token reserves in a curation pool.\"},\"getCuratorSignal(address,bytes32)\":{\"notice\":\"Get the amount of signal a curator has in a curation pool.\"},\"isCurated(bytes32)\":{\"notice\":\"Check if any GRT tokens are deposited for a SubgraphDeployment.\"},\"mint(bytes32,uint256,uint256)\":{\"notice\":\"Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool.\"},\"setCurationTaxPercentage(uint32)\":{\"notice\":\"Set the curation tax percentage to charge when a curator deposits GRT tokens.\"},\"setCurationTokenMaster(address)\":{\"notice\":\"Set the master copy to use as clones for the curation token.\"},\"setDefaultReserveRatio(uint32)\":{\"notice\":\"Update the default reserve ratio to `_defaultReserveRatio`\"},\"setMinimumCurationDeposit(uint256)\":{\"notice\":\"Update the minimum deposit amount needed to intialize a new subgraph\"},\"signalToTokens(bytes32,uint256)\":{\"notice\":\"Calculate number of tokens to get when burning signal from a curation pool.\"},\"tokensToSignal(bytes32,uint256)\":{\"notice\":\"Calculate amount of signal that can be bought with tokens in a curation pool. This function considers and excludes the deposit tax.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":\"ICuration\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol": { + "IDisputeManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_disputeID", + "type": "bytes32" + } + ], + "name": "acceptDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IDisputeManager.Attestation", + "name": "_attestation1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IDisputeManager.Attestation", + "name": "_attestation2", + "type": "tuple" + } + ], + "name": "areConflictingAttestations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_deposit", + "type": "uint256" + } + ], + "name": "createIndexingDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_attestationData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_deposit", + "type": "uint256" + } + ], + "name": "createQueryDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_attestationData1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_attestationData2", + "type": "bytes" + } + ], + "name": "createQueryDisputeConflict", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_disputeID", + "type": "bytes32" + } + ], + "name": "drawDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + } + ], + "internalType": "struct IDisputeManager.Receipt", + "name": "_receipt", + "type": "tuple" + } + ], + "name": "encodeHashReceipt", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct IDisputeManager.Attestation", + "name": "_attestation", + "type": "tuple" + } + ], + "name": "getAttestationIndexer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_disputeID", + "type": "bytes32" + } + ], + "name": "isDisputeCreated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_disputeID", + "type": "bytes32" + } + ], + "name": "rejectDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_arbitrator", + "type": "address" + } + ], + "name": "setArbitrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_percentage", + "type": "uint32" + } + ], + "name": "setFishermanRewardPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumDeposit", + "type": "uint256" + } + ], + "name": "setMinimumDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_qryPercentage", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "_idxPercentage", + "type": "uint32" + } + ], + "name": "setSlashingPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptDispute(bytes32)": "11b42611", + "areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))": "d36fc9d4", + "createIndexingDispute(address,uint256)": "c8792217", + "createQueryDispute(bytes,uint256)": "131610b1", + "createQueryDisputeConflict(bytes,bytes)": "c894222e", + "drawDispute(bytes32)": "9334ea52", + "encodeHashReceipt((bytes32,bytes32,bytes32))": "460967df", + "getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))": "c9747f51", + "isDisputeCreated(bytes32)": "be41f384", + "rejectDispute(bytes32)": "36167e03", + "setArbitrator(address)": "b0eefabe", + "setFishermanRewardPercentage(uint32)": "991a8355", + "setMinimumDeposit(uint256)": "e78ec42e", + "setSlashingPercentage(uint32,uint32)": "8bbb33b4" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_disputeID\",\"type\":\"bytes32\"}],\"name\":\"acceptDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct IDisputeManager.Attestation\",\"name\":\"_attestation1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct IDisputeManager.Attestation\",\"name\":\"_attestation2\",\"type\":\"tuple\"}],\"name\":\"areConflictingAttestations\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_allocationID\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_deposit\",\"type\":\"uint256\"}],\"name\":\"createIndexingDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_attestationData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_deposit\",\"type\":\"uint256\"}],\"name\":\"createQueryDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_attestationData1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_attestationData2\",\"type\":\"bytes\"}],\"name\":\"createQueryDisputeConflict\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_disputeID\",\"type\":\"bytes32\"}],\"name\":\"drawDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"}],\"internalType\":\"struct IDisputeManager.Receipt\",\"name\":\"_receipt\",\"type\":\"tuple\"}],\"name\":\"encodeHashReceipt\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct IDisputeManager.Attestation\",\"name\":\"_attestation\",\"type\":\"tuple\"}],\"name\":\"getAttestationIndexer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_disputeID\",\"type\":\"bytes32\"}],\"name\":\"isDisputeCreated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_disputeID\",\"type\":\"bytes32\"}],\"name\":\"rejectDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_arbitrator\",\"type\":\"address\"}],\"name\":\"setArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_percentage\",\"type\":\"uint32\"}],\"name\":\"setFishermanRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minimumDeposit\",\"type\":\"uint256\"}],\"name\":\"setMinimumDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_qryPercentage\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_idxPercentage\",\"type\":\"uint32\"}],\"name\":\"setSlashingPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol\":\"IDisputeManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/disputes/IDisputeManager.sol\":{\"keccak256\":\"0xc0885c741445df7c565f9dd5f3e3ffc654bc681eb718e178b4265f7c36bb597c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c7e4d1147147ca3257d6bd2aca0cbbf098b5be3fe46848b7c09c843e24e85391\",\"dweb:/ipfs/QmeTN6Tq9Qzv4Sb6hgyoKeiK2KGqyWPQcJwjFPqRS1ai9a\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/epochs/IEpochManager.sol": { + "IEpochManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_block", + "type": "uint256" + } + ], + "name": "blockHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "blockNum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpochBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpochBlockSinceStart", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epoch", + "type": "uint256" + } + ], + "name": "epochsSince", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "epochsSinceUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isCurrentEpochRun", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "runEpoch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_epochLength", + "type": "uint256" + } + ], + "name": "setEpochLength", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "blockHash(uint256)": "85df51fd", + "blockNum()": "8ae63d6d", + "currentEpoch()": "76671808", + "currentEpochBlock()": "ab93122c", + "currentEpochBlockSinceStart()": "d0cfa46e", + "epochsSince(uint256)": "1b28126d", + "epochsSinceUpdate()": "19c3b82d", + "isCurrentEpochRun()": "1ce05d38", + "runEpoch()": "c46e58eb", + "setEpochLength(uint256)": "54eea796" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_block\",\"type\":\"uint256\"}],\"name\":\"blockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blockNum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpochBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpochBlockSinceStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epoch\",\"type\":\"uint256\"}],\"name\":\"epochsSince\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"epochsSinceUpdate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isCurrentEpochRun\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"runEpoch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_epochLength\",\"type\":\"uint256\"}],\"name\":\"setEpochLength\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":\"IEpochManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol": { + "ICallhookReceiver": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "onTokenTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "onTokenTransfer(address,uint256,bytes)": "a4c0ed36" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onTokenTransfer(address,uint256,bytes)\":{\"params\":{\"_amount\":\"Amount of tokens that were transferred\",\"_data\":\"ABI-encoded callhook data\",\"_from\":\"Token sender in L1\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onTokenTransfer(address,uint256,bytes)\":{\"notice\":\"Receive tokens with a callhook from the bridge\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol\":\"ICallhookReceiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol\":{\"keccak256\":\"0x1a1627520f3d9ad670b46b9e8d08a928b892955161915dece233912b30989794\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a8e3df46e53b8cf46bced72f229497620c2f45169d512855877acdccf9b06d0f\",\"dweb:/ipfs/QmUgTnaZZxquYZQVz1dDoLKiD6AKRy1yUFzVCj3DrXBLQ4\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/governance/IController.sol": { + "IController": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + } + ], + "name": "getContractProxy", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGovernor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "partialPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_contractAddress", + "type": "address" + } + ], + "name": "setContractProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_partialPaused", + "type": "bool" + } + ], + "name": "setPartialPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newPauseGuardian", + "type": "address" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_paused", + "type": "bool" + } + ], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + } + ], + "name": "unsetContractProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_id", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_controller", + "type": "address" + } + ], + "name": "updateController", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "getContractProxy(bytes32)": "f7641a5e", + "getGovernor()": "4fc07d75", + "partialPaused()": "2e292fc7", + "paused()": "5c975abb", + "setContractProxy(bytes32,address)": "e0e99292", + "setPartialPaused(bool)": "56371bd8", + "setPauseGuardian(address)": "48bde20c", + "setPaused(bool)": "16c38b3c", + "unsetContractProxy(bytes32)": "9181df9c", + "updateController(bytes32,address)": "eb5dd94f" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_id\",\"type\":\"bytes32\"}],\"name\":\"getContractProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGovernor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"partialPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_id\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"}],\"name\":\"setContractProxy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_partialPaused\",\"type\":\"bool\"}],\"name\":\"setPartialPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newPauseGuardian\",\"type\":\"address\"}],\"name\":\"setPauseGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_paused\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_id\",\"type\":\"bytes32\"}],\"name\":\"unsetContractProxy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_id\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"updateController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/governance/IController.sol\":\"IController\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol": { + "IL2Curation": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "mintTaxFree", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_tokensIn", + "type": "uint256" + } + ], + "name": "tokensToSignalToTokensNoTax", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "mintTaxFree(bytes32,uint256)": "3718896d", + "setSubgraphService(address)": "93a90a1e", + "tokensToSignalNoTax(bytes32,uint256)": "7a2a45b8", + "tokensToSignalToTokensNoTax(bytes32,uint256)": "69db11a1" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_tokensIn\",\"type\":\"uint256\"}],\"name\":\"mintTaxFree\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_subgraphService\",\"type\":\"address\"}],\"name\":\"setSubgraphService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_tokensIn\",\"type\":\"uint256\"}],\"name\":\"tokensToSignalNoTax\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_tokensIn\",\"type\":\"uint256\"}],\"name\":\"tokensToSignalToTokensNoTax\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"mintTaxFree(bytes32,uint256)\":{\"details\":\"This function charges no tax and can only be called by GNS in specific scenarios (for now only during an L1-L2 transfer).\",\"params\":{\"_subgraphDeploymentID\":\"Subgraph deployment pool from where to mint signal\",\"_tokensIn\":\"Amount of Graph Tokens to deposit\"},\"returns\":{\"_0\":\"Signal minted\"}},\"setSubgraphService(address)\":{\"params\":{\"_subgraphService\":\"Address of the SubgraphService contract\"}},\"tokensToSignalNoTax(bytes32,uint256)\":{\"params\":{\"_subgraphDeploymentID\":\"Subgraph deployment for which to mint signal\",\"_tokensIn\":\"Amount of tokens used to mint signal\"},\"returns\":{\"_0\":\"Amount of signal that can be bought\"}},\"tokensToSignalToTokensNoTax(bytes32,uint256)\":{\"params\":{\"_subgraphDeploymentID\":\"Subgraph deployment for which to mint signal\",\"_tokensIn\":\"Amount of tokens used to mint signal\"},\"returns\":{\"_0\":\"Amount of tokens that would be recovered after minting and burning signal\"}}},\"title\":\"Interface of the L2 Curation contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"mintTaxFree(bytes32,uint256)\":{\"notice\":\"Deposit Graph Tokens in exchange for signal of a SubgraphDeployment curation pool.\"},\"setSubgraphService(address)\":{\"notice\":\"Set the subgraph service address.\"},\"tokensToSignalNoTax(bytes32,uint256)\":{\"notice\":\"Calculate amount of signal that can be bought with tokens in a curation pool, without accounting for curation tax.\"},\"tokensToSignalToTokensNoTax(bytes32,uint256)\":{\"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.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol\":\"IL2Curation\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/l2/curation/IL2Curation.sol\":{\"keccak256\":\"0x11ecb2e7e916d69c68d08e85bb29f8c1b051f5c86ca93c54919317f2ce6045cc\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://875f33c94088b76c0b6cf737c48747271f2229da5875cbeb8344d22009ebaf47\",\"dweb:/ipfs/QmaqdDDhcB6F6dDJ3s3nv6kvd2HNE6PWA3g2o9bs9jfPCh\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol": { + "IL2GNS": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_l2SubgraphID", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_subgraphMetadata", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_versionMetadata", + "type": "bytes32" + } + ], + "name": "finishSubgraphTransferFromL1", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_l1SubgraphID", + "type": "uint256" + } + ], + "name": "getAliasedL2SubgraphID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_l2SubgraphID", + "type": "uint256" + } + ], + "name": "getUnaliasedL1SubgraphID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "onTokenTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "finishSubgraphTransferFromL1(uint256,bytes32,bytes32,bytes32)": "d1a80612", + "getAliasedL2SubgraphID(uint256)": "ea0f2eba", + "getUnaliasedL1SubgraphID(uint256)": "9c6c022b", + "onTokenTransfer(address,uint256,bytes)": "a4c0ed36" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2SubgraphID\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_subgraphMetadata\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_versionMetadata\",\"type\":\"bytes32\"}],\"name\":\"finishSubgraphTransferFromL1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l1SubgraphID\",\"type\":\"uint256\"}],\"name\":\"getAliasedL2SubgraphID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2SubgraphID\",\"type\":\"uint256\"}],\"name\":\"getUnaliasedL1SubgraphID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"finishSubgraphTransferFromL1(uint256,bytes32,bytes32,bytes32)\":{\"params\":{\"_l2SubgraphID\":\"Subgraph ID in L2 (aliased from the L1 subgraph ID)\",\"_subgraphDeploymentID\":\"Latest subgraph deployment to assign to the subgraph\",\"_subgraphMetadata\":\"IPFS hash of the subgraph metadata\",\"_versionMetadata\":\"IPFS hash of the version metadata\"}},\"getAliasedL2SubgraphID(uint256)\":{\"params\":{\"_l1SubgraphID\":\"L1 subgraph ID\"},\"returns\":{\"_0\":\"L2 subgraph ID\"}},\"getUnaliasedL1SubgraphID(uint256)\":{\"params\":{\"_l2SubgraphID\":\"L2 subgraph ID\"},\"returns\":{\"_0\":\"L1subgraph ID\"}},\"onTokenTransfer(address,uint256,bytes)\":{\"params\":{\"_amount\":\"Amount of tokens that were transferred\",\"_data\":\"ABI-encoded callhook data\",\"_from\":\"Token sender in L1\"}}},\"title\":\"Interface for the L2GNS contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"finishSubgraphTransferFromL1(uint256,bytes32,bytes32,bytes32)\":{\"notice\":\"Finish a subgraph transfer from L1. The subgraph must have been previously sent through the bridge using the sendSubgraphToL2 function on L1GNS.\"},\"getAliasedL2SubgraphID(uint256)\":{\"notice\":\"Return the aliased L2 subgraph ID from a transferred L1 subgraph ID\"},\"getUnaliasedL1SubgraphID(uint256)\":{\"notice\":\"Return the unaliased L1 subgraph ID from a transferred L2 subgraph ID\"},\"onTokenTransfer(address,uint256,bytes)\":{\"notice\":\"Receive tokens with a callhook from the bridge\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol\":\"IL2GNS\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/gateway/ICallhookReceiver.sol\":{\"keccak256\":\"0x1a1627520f3d9ad670b46b9e8d08a928b892955161915dece233912b30989794\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a8e3df46e53b8cf46bced72f229497620c2f45169d512855877acdccf9b06d0f\",\"dweb:/ipfs/QmUgTnaZZxquYZQVz1dDoLKiD6AKRy1yUFzVCj3DrXBLQ4\"]},\"@graphprotocol/contracts/contracts/l2/discovery/IL2GNS.sol\":{\"keccak256\":\"0xe546e0aed7d7ceaffd1b6acef7007998a0c03cc6e3742739b7d79f0318417e8a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a4ddc12539c90207fe78b33dd29813a60100fca0b8ca023843b30359194a7fb9\",\"dweb:/ipfs/QmQxfiHmaS8HpJuMcvEmPL2HV8VAPGcz7TmVT1sspErNYR\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol": { + "IRewardsIssuer": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "getAllocationData(address)": "55c85269", + "getSubgraphAllocatedTokens(bytes32)": "e2e1e8e9" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getAllocationData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPending\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"getSubgraphAllocatedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getAllocationData(address)\":{\"details\":\"Get allocation data to calculate rewards issuance \",\"params\":{\"allocationId\":\"The allocation Id\"},\"returns\":{\"accRewardsPending\":\"Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed\",\"accRewardsPerAllocatedToken\":\"Rewards snapshot\",\"indexer\":\"The indexer address\",\"isActive\":\"Whether the allocation is active or not\",\"subgraphDeploymentId\":\"Subgraph deployment id for the allocation\",\"tokens\":\"Amount of allocated tokens\"}},\"getSubgraphAllocatedTokens(bytes32)\":{\"params\":{\"_subgraphDeploymentId\":\"Deployment Id for the subgraph\"},\"returns\":{\"_0\":\"Total tokens allocated to subgraph\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getSubgraphAllocatedTokens(bytes32)\":{\"notice\":\"Return the total amount of tokens allocated to subgraph.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":\"IRewardsIssuer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol": { + "IRewardsManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_accRewardsPerAllocatedToken", + "type": "uint256" + } + ], + "name": "calcRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getAccRewardsForSubgraph", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "getAccRewardsPerAllocatedToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAccRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNewRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_rewardsIssuer", + "type": "address" + }, + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + } + ], + "name": "getRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "isDenied", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "onSubgraphAllocationUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "onSubgraphSignalUpdate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "_deny", + "type": "bool" + } + ], + "name": "setDenied", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_issuancePerBlock", + "type": "uint256" + } + ], + "name": "setIssuancePerBlock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minimumSubgraphSignal", + "type": "uint256" + } + ], + "name": "setMinimumSubgraphSignal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphAvailabilityOracle", + "type": "address" + } + ], + "name": "setSubgraphAvailabilityOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_allocationID", + "type": "address" + } + ], + "name": "takeRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateAccRewardsPerSignal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "calcRewards(uint256,uint256)": "c8a5f81e", + "getAccRewardsForSubgraph(bytes32)": "5c6cbd59", + "getAccRewardsPerAllocatedToken(bytes32)": "702a280e", + "getAccRewardsPerSignal()": "a8cc0ee2", + "getNewRewardsPerSignal()": "e284f848", + "getRewards(address,address)": "779bcb9b", + "isDenied(bytes32)": "e820e284", + "onSubgraphAllocationUpdate(bytes32)": "eeac3e0e", + "onSubgraphSignalUpdate(bytes32)": "1d1c2fec", + "setDenied(bytes32,bool)": "1324a506", + "setIssuancePerBlock(uint256)": "1156bdc1", + "setMinimumSubgraphSignal(uint256)": "4bbfc1c5", + "setSubgraphAvailabilityOracle(address)": "0903c094", + "setSubgraphService(address)": "93a90a1e", + "takeRewards(address)": "db750926", + "updateAccRewardsPerSignal()": "c7d1117d" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_accRewardsPerAllocatedToken\",\"type\":\"uint256\"}],\"name\":\"calcRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"getAccRewardsForSubgraph\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"getAccRewardsPerAllocatedToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAccRewardsPerSignal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNewRewardsPerSignal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardsIssuer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_allocationID\",\"type\":\"address\"}],\"name\":\"getRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"isDenied\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"onSubgraphAllocationUpdate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"onSubgraphSignalUpdate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_deny\",\"type\":\"bool\"}],\"name\":\"setDenied\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_issuancePerBlock\",\"type\":\"uint256\"}],\"name\":\"setIssuancePerBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minimumSubgraphSignal\",\"type\":\"uint256\"}],\"name\":\"setMinimumSubgraphSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_subgraphAvailabilityOracle\",\"type\":\"address\"}],\"name\":\"setSubgraphAvailabilityOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_subgraphService\",\"type\":\"address\"}],\"name\":\"setSubgraphService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_allocationID\",\"type\":\"address\"}],\"name\":\"takeRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateAccRewardsPerSignal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":\"IRewardsManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/token/IGraphToken.sol": { + "IGraphToken": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isMinter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "addMinter(address)": "983b2d56", + "allowance(address,address)": "dd62ed3e", + "approve(address,uint256)": "095ea7b3", + "balanceOf(address)": "70a08231", + "burn(uint256)": "42966c68", + "burnFrom(address,uint256)": "79cc6790", + "decreaseAllowance(address,uint256)": "a457c2d7", + "increaseAllowance(address,uint256)": "39509351", + "isMinter(address)": "aa271e1a", + "mint(address,uint256)": "40c10f19", + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf", + "removeMinter(address)": "3092afd5", + "renounceMinter()": "98650275", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferFrom(address,address,uint256)": "23b872dd" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":\"IGraphToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@graphprotocol/contracts/contracts/utils/TokenUtils.sol": { + "TokenUtils": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220542683f1c09a402c1717c86ca1ed67c4d870e4a9ea5201b1e94892aa7bfc0a4b64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLOAD 0x26 DUP4 CALL 0xC0 SWAP11 BLOCKHASH 0x2C OR OR 0xC8 PUSH13 0xA1ED67C4D870E4A9EA5201B1E9 BASEFEE SWAP3 0xAA PUSH28 0xFC0A4B64736F6C634300081B00330000000000000000000000000000 ", + "sourceMap": "357:1203:11:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;357:1203:11;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220542683f1c09a402c1717c86ca1ed67c4d870e4a9ea5201b1e94892aa7bfc0a4b64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLOAD 0x26 DUP4 CALL 0xC0 SWAP11 BLOCKHASH 0x2C OR OR 0xC8 PUSH13 0xA1ED67C4D870E4A9EA5201B1E9 BASEFEE SWAP3 0xAA PUSH28 0xFC0A4B64736F6C634300081B00330000000000000000000000000000 ", + "sourceMap": "357:1203:11:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"TokenUtils library\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"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.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\":\"TokenUtils\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\":{\"keccak256\":\"0x7bd336193785ed6f09a3bd847f9208f64aa9b87ad67c40838d00fec41bb153d5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d96d83cdb9bbb567e4eafac8bdef3ff6bdaf426338baf76bae277c11afb33cee\",\"dweb:/ipfs/QmNjr4PiJ76Wc5mFqa9H88BjsEMrUfy1jiftNHYTgd6Mp5\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/DataService.sol": { + "DataService": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "collect(address,uint8,bytes)": "b15d2a2c", + "getDelegationRatio()": "1ebb7c30", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "register(address,bytes)": "24b8fbf6", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"ProvisionManagerNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionManagerProvisionNotFound\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"ratio\",\"type\":\"uint32\"}],\"name\":\"DelegationRatioSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionTokensRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"ThawingPeriodRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"min\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"VerifierCutRangeSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Implementation of the {IDataService} interface.A note on upgradeability: this base contract can be inherited by upgradeable or non upgradeable contracts. - If the data service implementation is upgradeable, it must initialize the contract via an external initializer function with the `initializer` modifier that calls {__DataService_init} or {__DataService_init_unchained}. It's recommended the implementation constructor to also call {_disableInitializers} to prevent the implementation from being initialized. - If the data service implementation is NOT upgradeable, it must initialize the contract by calling {__DataService_init} or {__DataService_init_unchained} in the constructor. Note that the `initializer` will be required in the constructor. - Note that in both cases if using {__DataService_init_unchained} variant the corresponding parent initializers must be called in the implementation.\",\"errors\":{\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"params\":{\"max\":\"The maximum value.\",\"min\":\"The minimum value.\"}}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"params\":{\"max\":\"The maximum allowed value.\",\"message\":\"The error message.\",\"min\":\"The minimum allowed value.\",\"value\":\"The value that is out of range.\"}}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"params\":{\"caller\":\"The address of the caller.\",\"serviceProvider\":\"The address of the serviceProvider.\"}}],\"ProvisionManagerProvisionNotFound(address)\":[{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"params\":{\"ratio\":\"The delegation ratio\"}},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"params\":{\"max\":\"The maximum allowed value for the provision tokens.\",\"min\":\"The minimum allowed value for the provision tokens.\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"params\":{\"max\":\"The maximum allowed value for the thawing period.\",\"min\":\"The minimum allowed value for the thawing period.\"}},\"VerifierCutRangeSet(uint32,uint32)\":{\"params\":{\"max\":\"The maximum allowed value for the max verifier cut.\",\"min\":\"The minimum allowed value for the max verifier cut.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"constructor\":{\"details\":\"Addresses in GraphDirectory are immutables, they can only be set in this constructor.\",\"params\":{\"controller\":\"The address of the Graph Horizon controller contract.\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"title\":\"DataService contract\",\"version\":1},\"userdoc\":{\"errors\":{\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"notice\":\"Thrown when attempting to set a range where min is greater than max.\"}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when a provision parameter is out of range.\"}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to manage the provision of a service provider.\"}],\"ProvisionManagerProvisionNotFound(address)\":[{\"notice\":\"Thrown when a provision is not found.\"}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"notice\":\"Emitted when the delegation ratio is set.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"notice\":\"Emitted when the provision tokens range is set.\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"notice\":\"Emitted when the thawing period range is set.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"notice\":\"Emitted when the verifier cut range is set.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"}},\"notice\":\"This implementation provides base functionality for a data service: - GraphDirectory, allows the data service to interact with Graph Horizon contracts - ProvisionManager, provides functionality to manage provisions The derived contract MUST implement all the interfaces described in {IDataService} and in accordance with the Data Service framework.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/DataService.sol\":\"DataService\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/horizon/contracts/data-service/DataService.sol\":{\"keccak256\":\"0xa57fda8ea4c94a2cda061a6c8f29ae215241b0af03a43df3bc622051d8b2493c\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://7fc433ef0eb71c264224e9058de7e9aea3b2dbfab68dbdf0df8a13de82e90ef6\",\"dweb:/ipfs/QmVrp6kv8Ef1AP38C4soa1cnnRqqmKFnHer2VrXms52Asy\"]},\"@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol\":{\"keccak256\":\"0x615aac9d5c9cd04216fa9ee21c770f3877a2971a1c023052143c95c08b87610f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd4eb031e9ab86e3a17df29fcb297621e88850c3c5db123925d24b77c802b037\",\"dweb:/ipfs/QmSCNfQqMzui9gaN3Rf8nTNJBPWSFNqFgexbK2k6GBN381\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol\":{\"keccak256\":\"0x63e7f1df10586beb7f8683065719fbff045437508539a9358c25a13fcf989f91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b32f9a7be91ae6d9c9a6edbe2404efbcf9fa99c1d503f4a688054be468494a8e\",\"dweb:/ipfs/QmQ5AQXsBPxtJSW24LqRZAaYYaz1518FpUCHfDEdsMfF8F\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":{\"keccak256\":\"0xe44f72a63c472a6de42e08a2d732044fe1ac9245c4203d4e1eb941b1a2fa2159\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://412708a4f94b5757e46676c5702e47d37fdbdacbe53f70e2ee93d37c5938e028\",\"dweb:/ipfs/Qmdw4uagDdKeCzyS319BKyPzfnWCvM3KCtNYosFBd3xGco\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":{\"keccak256\":\"0x70d69069b2c122becd29ec4ea9a79f2e26cf7cbe7b1918ffced691ee00cdbd82\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://6bddc7d257c3df1fd4940dd3c554e5a1efbc1b23d50f7878415389b75380628c\",\"dweb:/ipfs/QmTQBCsL4pHoXMixVvDwGMdmJnGfEeeDZfHdJkcpKamu58\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol": { + "DataServiceV1Storage": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"This contract holds the storage variables for the DataService contract.\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"__gap\":{\"details\":\"Gap to allow adding variables in future upgrades Note that this contract is not upgradeable but might be inherited by an upgradeable contract\"}},\"title\":\"DataServiceStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol\":\"DataServiceV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol\":{\"keccak256\":\"0x615aac9d5c9cd04216fa9ee21c770f3877a2971a1c023052143c95c08b87610f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd4eb031e9ab86e3a17df29fcb297621e88850c3c5db123925d24b77c802b037\",\"dweb:/ipfs/QmSCNfQqMzui9gaN3Rf8nTNJBPWSFNqFgexbK2k6GBN381\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol": { + "DataServiceFees": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAvailable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRequired", + "type": "uint256" + } + ], + "name": "ProvisionTrackerInsufficientTokens", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nextClaim", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "claimsLists", + "outputs": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "feesProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "claims(bytes32)": "eff0f592", + "claimsLists(address)": "13c474c9", + "collect(address,uint8,bytes)": "b15d2a2c", + "feesProvisionTracker(address)": "cbe5f3f2", + "getDelegationRatio()": "1ebb7c30", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "register(address,bytes)": "24b8fbf6", + "releaseStake(uint256)": "45f54485", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"DataServiceFeesClaimNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataServiceFeesZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListEmptyList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListInvalidIterations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"ProvisionManagerNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionManagerProvisionNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensAvailable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensRequired\",\"type\":\"uint256\"}],\"name\":\"ProvisionTrackerInsufficientTokens\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"ratio\",\"type\":\"uint32\"}],\"name\":\"DelegationRatioSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionTokensRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockTimestamp\",\"type\":\"uint256\"}],\"name\":\"StakeClaimLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"}],\"name\":\"StakeClaimReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimsCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensReleased\",\"type\":\"uint256\"}],\"name\":\"StakeClaimsReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"ThawingPeriodRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"min\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"VerifierCutRangeSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nextClaim\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"claimsLists\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"head\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tail\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"feesProvisionTracker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numClaimsToRelease\",\"type\":\"uint256\"}],\"name\":\"releaseStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Implementation of the {IDataServiceFees} interface.This contract inherits from {DataService} which needs to be initialized, please see {DataService} for detailed instructions.\",\"errors\":{\"DataServiceFeesClaimNotFound(bytes32)\":[{\"params\":{\"claimId\":\"The id of the stake claim\"}}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"params\":{\"max\":\"The maximum value.\",\"min\":\"The minimum value.\"}}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"params\":{\"max\":\"The maximum allowed value.\",\"message\":\"The error message.\",\"min\":\"The minimum allowed value.\",\"value\":\"The value that is out of range.\"}}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"params\":{\"caller\":\"The address of the caller.\",\"serviceProvider\":\"The address of the serviceProvider.\"}}],\"ProvisionManagerProvisionNotFound(address)\":[{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}}],\"ProvisionTrackerInsufficientTokens(uint256,uint256)\":[{\"params\":{\"tokensAvailable\":\"The amount of tokens available\",\"tokensRequired\":\"The amount of tokens required\"}}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"params\":{\"ratio\":\"The delegation ratio\"}},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"params\":{\"max\":\"The maximum allowed value for the provision tokens.\",\"min\":\"The minimum allowed value for the provision tokens.\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens to lock in the claim\",\"unlockTimestamp\":\"The timestamp when the tokens can be released\"}},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"releasableAt\":\"The timestamp when the tokens were released\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens released\"}},\"StakeClaimsReleased(address,uint256,uint256)\":{\"params\":{\"claimsCount\":\"The number of stake claims being released\",\"serviceProvider\":\"The address of the service provider\",\"tokensReleased\":\"The total amount of tokens being released\"}},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"params\":{\"max\":\"The maximum allowed value for the thawing period.\",\"min\":\"The minimum allowed value for the thawing period.\"}},\"VerifierCutRangeSet(uint32,uint32)\":{\"params\":{\"max\":\"The maximum allowed value for the max verifier cut.\",\"min\":\"The minimum allowed value for the max verifier cut.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"releaseStake(uint256)\":{\"details\":\"This function is only meant to be called if the service provider has enough stake claims that releasing them all at once would exceed the block gas limit.This function can be overriden and/or disabled.Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\",\"params\":{\"numClaimsToRelease\":\"Amount of stake claims to process. If 0, all stake claims are processed.\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"title\":\"DataServiceFees contract\",\"version\":1},\"userdoc\":{\"errors\":{\"DataServiceFeesClaimNotFound(bytes32)\":[{\"notice\":\"Thrown when attempting to get a stake claim that does not exist.\"}],\"DataServiceFeesZeroTokens()\":[{\"notice\":\"Emitted when trying to lock zero tokens in a stake claim\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}],\"LinkedListEmptyList()\":[{\"notice\":\"Thrown when trying to remove an item from an empty list\"}],\"LinkedListInvalidIterations()\":[{\"notice\":\"Thrown when trying to traverse a list with more iterations than elements\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"notice\":\"Thrown when attempting to set a range where min is greater than max.\"}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when a provision parameter is out of range.\"}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to manage the provision of a service provider.\"}],\"ProvisionManagerProvisionNotFound(address)\":[{\"notice\":\"Thrown when a provision is not found.\"}],\"ProvisionTrackerInsufficientTokens(uint256,uint256)\":[{\"notice\":\"Thrown when trying to lock more tokens than available\"}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"notice\":\"Emitted when the delegation ratio is set.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"notice\":\"Emitted when the provision tokens range is set.\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is created and stake is locked.\"},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is released and stake is unlocked.\"},\"StakeClaimsReleased(address,uint256,uint256)\":{\"notice\":\"Emitted when a series of stake claims are released.\"},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"notice\":\"Emitted when the thawing period range is set.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"notice\":\"Emitted when the verifier cut range is set.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"claims(bytes32)\":{\"notice\":\"List of all locked stake claims to be released to service providers\"},\"claimsLists(address)\":{\"notice\":\"Service providers registered in the data service\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"feesProvisionTracker(address)\":{\"notice\":\"The amount of tokens locked in stake claims for each service provider\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"releaseStake(uint256)\":{\"notice\":\"Releases expired stake claims for the caller.\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"}},\"notice\":\"Extension for the {IDataService} contract to handle payment collateralization using a Horizon provision. See {IDataServiceFees} for more details.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol\":\"DataServiceFees\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/horizon/contracts/data-service/DataService.sol\":{\"keccak256\":\"0xa57fda8ea4c94a2cda061a6c8f29ae215241b0af03a43df3bc622051d8b2493c\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://7fc433ef0eb71c264224e9058de7e9aea3b2dbfab68dbdf0df8a13de82e90ef6\",\"dweb:/ipfs/QmVrp6kv8Ef1AP38C4soa1cnnRqqmKFnHer2VrXms52Asy\"]},\"@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol\":{\"keccak256\":\"0x615aac9d5c9cd04216fa9ee21c770f3877a2971a1c023052143c95c08b87610f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd4eb031e9ab86e3a17df29fcb297621e88850c3c5db123925d24b77c802b037\",\"dweb:/ipfs/QmSCNfQqMzui9gaN3Rf8nTNJBPWSFNqFgexbK2k6GBN381\"]},\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol\":{\"keccak256\":\"0xa9e95b7ca9af3987697c06b252fdb12e1d01e5c62c123c17f39f03d96d38876f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://d86b520570fb3dd76b60fc64eabe6a7104b41a96a9c92e9031c91a799287d749\",\"dweb:/ipfs/QmZGaiEZVfycnQu4EkPWGM7Jg3jo4jdEuLeuZxAMPMg5s6\"]},\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol\":{\"keccak256\":\"0x9068f639ea7aad02d842eb0054cadc3a5f05044d8d0176dc4c9ff60693775bc0\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://9e22fd5157ea02064104b02952c327ab58b0a5c70c7356d94017f3e03da298d4\",\"dweb:/ipfs/QmdTZAFaZWSpVUvWTnUgednbRNLMbFvUMKZ5FHkjhRk4Qf\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol\":{\"keccak256\":\"0xc0f433a20f91fb2c2c588d5accfd311535314d71f7adc4e2b84fa4193ed1a739\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a920d9446c3e76783921d2f2d980a058f41700de1d59470c9b3892a49ebcaf48\",\"dweb:/ipfs/QmcwmqNkxS1BpJQ7kgf4V9F98w2MKcVvg2N7P3i8KtDSF4\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol\":{\"keccak256\":\"0x63e7f1df10586beb7f8683065719fbff045437508539a9358c25a13fcf989f91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b32f9a7be91ae6d9c9a6edbe2404efbcf9fa99c1d503f4a688054be468494a8e\",\"dweb:/ipfs/QmQ5AQXsBPxtJSW24LqRZAaYYaz1518FpUCHfDEdsMfF8F\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":{\"keccak256\":\"0xe44f72a63c472a6de42e08a2d732044fe1ac9245c4203d4e1eb941b1a2fa2159\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://412708a4f94b5757e46676c5702e47d37fdbdacbe53f70e2ee93d37c5938e028\",\"dweb:/ipfs/Qmdw4uagDdKeCzyS319BKyPzfnWCvM3KCtNYosFBd3xGco\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":{\"keccak256\":\"0x70d69069b2c122becd29ec4ea9a79f2e26cf7cbe7b1918ffced691ee00cdbd82\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://6bddc7d257c3df1fd4940dd3c554e5a1efbc1b23d50f7878415389b75380628c\",\"dweb:/ipfs/QmTQBCsL4pHoXMixVvDwGMdmJnGfEeeDZfHdJkcpKamu58\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol": { + "DataServiceFeesV1Storage": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nextClaim", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "claimsLists", + "outputs": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "feesProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "claims(bytes32)": "eff0f592", + "claimsLists(address)": "13c474c9", + "feesProvisionTracker(address)": "cbe5f3f2" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nextClaim\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"claimsLists\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"head\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tail\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"feesProvisionTracker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"__gap\":{\"details\":\"Gap to allow adding variables in future upgrades Note that this contract is not upgradeable but might be inherited by an upgradeable contract\"}},\"title\":\"Storage layout for the {DataServiceFees} extension contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claims(bytes32)\":{\"notice\":\"List of all locked stake claims to be released to service providers\"},\"claimsLists(address)\":{\"notice\":\"Service providers registered in the data service\"},\"feesProvisionTracker(address)\":{\"notice\":\"The amount of tokens locked in stake claims for each service provider\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol\":\"DataServiceFeesV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol\":{\"keccak256\":\"0x9068f639ea7aad02d842eb0054cadc3a5f05044d8d0176dc4c9ff60693775bc0\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://9e22fd5157ea02064104b02952c327ab58b0a5c70c7356d94017f3e03da298d4\",\"dweb:/ipfs/QmdTZAFaZWSpVUvWTnUgednbRNLMbFvUMKZ5FHkjhRk4Qf\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol": { + "DataServicePausableUpgradeable": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "DataServicePausableNotPauseGuardian", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "DataServicePausablePauseGuardianNoChange", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "PauseGuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "pauseGuardians", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "collect(address,uint8,bytes)": "b15d2a2c", + "getDelegationRatio()": "1ebb7c30", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "pause()": "8456cb59", + "pauseGuardians(address)": "9384e078", + "paused()": "5c975abb", + "register(address,bytes)": "24b8fbf6", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b", + "unpause()": "3f4ba83a" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"DataServicePausableNotPauseGuardian\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"DataServicePausablePauseGuardianNoChange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"ProvisionManagerNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionManagerProvisionNotFound\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"ratio\",\"type\":\"uint32\"}],\"name\":\"DelegationRatioSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"PauseGuardianSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionTokensRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"ThawingPeriodRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"min\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"VerifierCutRangeSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pauseGuardian\",\"type\":\"address\"}],\"name\":\"pauseGuardians\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Implementation of the {IDataServicePausable} interface.Upgradeable version of the {DataServicePausable} contract.This contract inherits from {DataService} which needs to be initialized, please see {DataService} for detailed instructions.\",\"errors\":{\"DataServicePausableNotPauseGuardian(address)\":[{\"params\":{\"account\":\"The address of the pause guardian\"}}],\"DataServicePausablePauseGuardianNoChange(address,bool)\":[{\"params\":{\"account\":\"The address of the pause guardian\",\"allowed\":\"The allowed status of the pause guardian\"}}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"params\":{\"max\":\"The maximum value.\",\"min\":\"The minimum value.\"}}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"params\":{\"max\":\"The maximum allowed value.\",\"message\":\"The error message.\",\"min\":\"The minimum allowed value.\",\"value\":\"The value that is out of range.\"}}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"params\":{\"caller\":\"The address of the caller.\",\"serviceProvider\":\"The address of the serviceProvider.\"}}],\"ProvisionManagerProvisionNotFound(address)\":[{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"params\":{\"ratio\":\"The delegation ratio\"}},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"PauseGuardianSet(address,bool)\":{\"params\":{\"account\":\"The address of the pause guardian\",\"allowed\":\"The allowed status of the pause guardian\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"params\":{\"max\":\"The maximum allowed value for the provision tokens.\",\"min\":\"The minimum allowed value for the provision tokens.\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"params\":{\"max\":\"The maximum allowed value for the thawing period.\",\"min\":\"The minimum allowed value for the thawing period.\"}},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"params\":{\"max\":\"The maximum allowed value for the max verifier cut.\",\"min\":\"The minimum allowed value for the max verifier cut.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"pause()\":{\"details\":\"Note that only functions using the modifiers `whenNotPaused` and `whenPaused` will be affected by the pause. Requirements: - The contract must not be already paused\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"unpause()\":{\"details\":\"Note that only functions using the modifiers `whenNotPaused` and `whenPaused` will be affected by the pause. Requirements: - The contract must be paused\"}},\"stateVariables\":{\"__gap\":{\"details\":\"Gap to allow adding variables in future upgrades\"}},\"title\":\"DataServicePausableUpgradeable contract\",\"version\":1},\"userdoc\":{\"errors\":{\"DataServicePausableNotPauseGuardian(address)\":[{\"notice\":\"Emitted when a the caller is not a pause guardian\"}],\"DataServicePausablePauseGuardianNoChange(address,bool)\":[{\"notice\":\"Emitted when a pause guardian is set to the same allowed status\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"notice\":\"Thrown when attempting to set a range where min is greater than max.\"}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when a provision parameter is out of range.\"}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to manage the provision of a service provider.\"}],\"ProvisionManagerProvisionNotFound(address)\":[{\"notice\":\"Thrown when a provision is not found.\"}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"notice\":\"Emitted when the delegation ratio is set.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"PauseGuardianSet(address,bool)\":{\"notice\":\"Emitted when a pause guardian is set.\"},\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"notice\":\"Emitted when the provision tokens range is set.\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"notice\":\"Emitted when the thawing period range is set.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"notice\":\"Emitted when the verifier cut range is set.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"pause()\":{\"notice\":\"Pauses the data service.\"},\"pauseGuardians(address)\":{\"notice\":\"List of pause guardians and their allowed status\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"},\"unpause()\":{\"notice\":\"Unpauses the data service.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol\":\"DataServicePausableUpgradeable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/horizon/contracts/data-service/DataService.sol\":{\"keccak256\":\"0xa57fda8ea4c94a2cda061a6c8f29ae215241b0af03a43df3bc622051d8b2493c\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://7fc433ef0eb71c264224e9058de7e9aea3b2dbfab68dbdf0df8a13de82e90ef6\",\"dweb:/ipfs/QmVrp6kv8Ef1AP38C4soa1cnnRqqmKFnHer2VrXms52Asy\"]},\"@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol\":{\"keccak256\":\"0x615aac9d5c9cd04216fa9ee21c770f3877a2971a1c023052143c95c08b87610f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd4eb031e9ab86e3a17df29fcb297621e88850c3c5db123925d24b77c802b037\",\"dweb:/ipfs/QmSCNfQqMzui9gaN3Rf8nTNJBPWSFNqFgexbK2k6GBN381\"]},\"@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol\":{\"keccak256\":\"0x57790344249a2d9fac827173389665a678619103d3baba0df0f9ec72f514cba7\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://964b818fdefcaf55cfd1c8f7066c44032e8dc82f1569f35d875e86c147b94e23\",\"dweb:/ipfs/QmcsjNPCFbYPdLiTjmykgVSLXbZxA2pJ1N7JXaWtxJzZet\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol\":{\"keccak256\":\"0x6e65df59821dce2e4c9c221e1381eac69534464b8c69c83c2f18bff188e120f5\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd7f1d4d7b1d9de204580678f24fbe453235bbc1fbb15f65f022619a419b11a8\",\"dweb:/ipfs/QmP7JnK6Buor5bvRFcb427ACJKTwX6mnJb31TJzKL4EnSD\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol\":{\"keccak256\":\"0x63e7f1df10586beb7f8683065719fbff045437508539a9358c25a13fcf989f91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b32f9a7be91ae6d9c9a6edbe2404efbcf9fa99c1d503f4a688054be468494a8e\",\"dweb:/ipfs/QmQ5AQXsBPxtJSW24LqRZAaYYaz1518FpUCHfDEdsMfF8F\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":{\"keccak256\":\"0xe44f72a63c472a6de42e08a2d732044fe1ac9245c4203d4e1eb941b1a2fa2159\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://412708a4f94b5757e46676c5702e47d37fdbdacbe53f70e2ee93d37c5938e028\",\"dweb:/ipfs/Qmdw4uagDdKeCzyS319BKyPzfnWCvM3KCtNYosFBd3xGco\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":{\"keccak256\":\"0x70d69069b2c122becd29ec4ea9a79f2e26cf7cbe7b1918ffced691ee00cdbd82\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://6bddc7d257c3df1fd4940dd3c554e5a1efbc1b23d50f7878415389b75380628c\",\"dweb:/ipfs/QmTQBCsL4pHoXMixVvDwGMdmJnGfEeeDZfHdJkcpKamu58\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"keccak256\":\"0xa6bf6b7efe0e6625a9dcd30c5ddf52c4c24fe8372f37c7de9dbf5034746768d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c353ee3705bbf6fadb84c0fb10ef1b736e8ca3ca1867814349d1487ed207beb\",\"dweb:/ipfs/QmcugaPssrzGGE8q4YZKm2ZhnD3kCijjcgdWWg76nWt3FY\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol": { + "IDataService": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "collect(address,uint8,bytes)": "b15d2a2c", + "getDelegationRatio()": "1ebb7c30", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "register(address,bytes)": "24b8fbf6", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"This interface is expected to be inherited and extended by a data service interface. It can be used to interact with it however it's advised to use the more specific parent interface.\",\"events\":{\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"title\":\"Interface of the base {DataService} contract as defined by the Graph Horizon specification.\",\"version\":1},\"userdoc\":{\"events\":{\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"}},\"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 an implementation will honor the Data Service framework guidelines so it's advised to always review the implementation code and the documentation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":\"IDataService\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol": { + "IDataServiceFees": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "collect(address,uint8,bytes)": "b15d2a2c", + "getDelegationRatio()": "1ebb7c30", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "register(address,bytes)": "24b8fbf6", + "releaseStake(uint256)": "45f54485", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"DataServiceFeesClaimNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataServiceFeesZeroTokens\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockTimestamp\",\"type\":\"uint256\"}],\"name\":\"StakeClaimLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"}],\"name\":\"StakeClaimReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimsCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensReleased\",\"type\":\"uint256\"}],\"name\":\"StakeClaimsReleased\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numClaimsToRelease\",\"type\":\"uint256\"}],\"name\":\"releaseStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Note that this implementation uses the entire provisioned stake as collateral for the payment. It can be used to provide economic security for the payments collected as long as the provisioned stake is not being used for other purposes.\",\"errors\":{\"DataServiceFeesClaimNotFound(bytes32)\":[{\"params\":{\"claimId\":\"The id of the stake claim\"}}]},\"events\":{\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens to lock in the claim\",\"unlockTimestamp\":\"The timestamp when the tokens can be released\"}},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"releasableAt\":\"The timestamp when the tokens were released\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens released\"}},\"StakeClaimsReleased(address,uint256,uint256)\":{\"params\":{\"claimsCount\":\"The number of stake claims being released\",\"serviceProvider\":\"The address of the service provider\",\"tokensReleased\":\"The total amount of tokens being released\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"releaseStake(uint256)\":{\"details\":\"This function is only meant to be called if the service provider has enough stake claims that releasing them all at once would exceed the block gas limit.This function can be overriden and/or disabled.Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\",\"params\":{\"numClaimsToRelease\":\"Amount of stake claims to process. If 0, all stake claims are processed.\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"title\":\"Interface for the {DataServiceFees} contract.\",\"version\":1},\"userdoc\":{\"errors\":{\"DataServiceFeesClaimNotFound(bytes32)\":[{\"notice\":\"Thrown when attempting to get a stake claim that does not exist.\"}],\"DataServiceFeesZeroTokens()\":[{\"notice\":\"Emitted when trying to lock zero tokens in a stake claim\"}]},\"events\":{\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is created and stake is locked.\"},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is released and stake is unlocked.\"},\"StakeClaimsReleased(address,uint256,uint256)\":{\"notice\":\"Emitted when a series of stake claims are released.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"releaseStake(uint256)\":{\"notice\":\"Releases expired stake claims for the caller.\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"}},\"notice\":\"Extension for the {IDataService} contract to handle payment collateralization using a Horizon provision. It's designed to be used with the Data Service framework: - When a service provider collects payment with {IDataService.collect} the data service should lock stake to back the payment using {_lockStake}. - Every time there is a payment collection with {IDataService.collect}, the data service should attempt to release any expired stake claims by calling {_releaseStake}. - Stake claims can also be manually released by calling {releaseStake} directly.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":\"IDataServiceFees\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol": { + "IDataServicePausable": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "DataServicePausableNotPauseGuardian", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "DataServicePausablePauseGuardianNoChange", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "PauseGuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "collect(address,uint8,bytes)": "b15d2a2c", + "getDelegationRatio()": "1ebb7c30", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "pause()": "8456cb59", + "register(address,bytes)": "24b8fbf6", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b", + "unpause()": "3f4ba83a" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"DataServicePausableNotPauseGuardian\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"DataServicePausablePauseGuardianNoChange\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"PauseGuardianSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"DataServicePausableNotPauseGuardian(address)\":[{\"params\":{\"account\":\"The address of the pause guardian\"}}],\"DataServicePausablePauseGuardianNoChange(address,bool)\":[{\"params\":{\"account\":\"The address of the pause guardian\",\"allowed\":\"The allowed status of the pause guardian\"}}]},\"events\":{\"PauseGuardianSet(address,bool)\":{\"params\":{\"account\":\"The address of the pause guardian\",\"allowed\":\"The allowed status of the pause guardian\"}},\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"pause()\":{\"details\":\"Note that only functions using the modifiers `whenNotPaused` and `whenPaused` will be affected by the pause. Requirements: - The contract must not be already paused\"},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"unpause()\":{\"details\":\"Note that only functions using the modifiers `whenNotPaused` and `whenPaused` will be affected by the pause. Requirements: - The contract must be paused\"}},\"title\":\"Interface for the {DataServicePausable} contract.\",\"version\":1},\"userdoc\":{\"errors\":{\"DataServicePausableNotPauseGuardian(address)\":[{\"notice\":\"Emitted when a the caller is not a pause guardian\"}],\"DataServicePausablePauseGuardianNoChange(address,bool)\":[{\"notice\":\"Emitted when a pause guardian is set to the same allowed status\"}]},\"events\":{\"PauseGuardianSet(address,bool)\":{\"notice\":\"Emitted when a pause guardian is set.\"},\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"pause()\":{\"notice\":\"Pauses the data service.\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"},\"unpause()\":{\"notice\":\"Unpauses the data service.\"}},\"notice\":\"Extension for the {IDataService} contract, adds pausing functionality to the data service. Pausing is controlled by privileged accounts called pause guardians.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol\":\"IDataServicePausable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol\":{\"keccak256\":\"0x6e65df59821dce2e4c9c221e1381eac69534464b8c69c83c2f18bff188e120f5\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd7f1d4d7b1d9de204580678f24fbe453235bbc1fbb15f65f022619a419b11a8\",\"dweb:/ipfs/QmP7JnK6Buor5bvRFcb427ACJKTwX6mnJb31TJzKL4EnSD\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol": { + "ProvisionTracker": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAvailable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRequired", + "type": "uint256" + } + ], + "name": "ProvisionTrackerInsufficientTokens", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ed1fd9291ad35d2fe9b4b07415a19a0798fc542c5ed7e8efe6b20ec6d74b95d364736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED 0x1F 0xD9 0x29 BYTE 0xD3 TSTORE 0x2F 0xE9 0xB4 0xB0 PUSH21 0x15A19A0798FC542C5ED7E8EFE6B20EC6D74B95D364 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "779:2963:20:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;779:2963:20;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ed1fd9291ad35d2fe9b4b07415a19a0798fc542c5ed7e8efe6b20ec6d74b95d364736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED 0x1F 0xD9 0x29 BYTE 0xD3 TSTORE 0x2F 0xE9 0xB4 0xB0 PUSH21 0x15A19A0798FC542C5ED7E8EFE6B20EC6D74B95D364 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "779:2963:20:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensAvailable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensRequired\",\"type\":\"uint256\"}],\"name\":\"ProvisionTrackerInsufficientTokens\",\"type\":\"error\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"ProvisionTrackerInsufficientTokens(uint256,uint256)\":[{\"params\":{\"tokensAvailable\":\"The amount of tokens available\",\"tokensRequired\":\"The amount of tokens required\"}}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"ProvisionTracker library\",\"version\":1},\"userdoc\":{\"errors\":{\"ProvisionTrackerInsufficientTokens(uint256,uint256)\":[{\"notice\":\"Thrown when trying to lock more tokens than available\"}]},\"kind\":\"user\",\"methods\":{},\"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. The library provides two primitives, lock and release to signal token usage and free up tokens respectively. It does not make any assumptions about the conditions under which tokens are locked or released.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol\":\"ProvisionTracker\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol\":{\"keccak256\":\"0xc0f433a20f91fb2c2c588d5accfd311535314d71f7adc4e2b84fa4193ed1a739\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a920d9446c3e76783921d2f2d980a058f41700de1d59470c9b3892a49ebcaf48\",\"dweb:/ipfs/QmcwmqNkxS1BpJQ7kgf4V9F98w2MKcVvg2N7P3i8KtDSF4\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol": { + "ProvisionManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"ProvisionManagerNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionManagerProvisionNotFound\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"ratio\",\"type\":\"uint32\"}],\"name\":\"DelegationRatioSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionTokensRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"ThawingPeriodRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"min\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"VerifierCutRangeSet\",\"type\":\"event\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"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 if the parameter is out of range. The parameters are: - Provision parameters (thawing period and verifier cut) - Provision tokens Note that default values for all provision parameters provide the most permissive configuration, it's highly recommended to override them at the data service level.\",\"errors\":{\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"params\":{\"max\":\"The maximum value.\",\"min\":\"The minimum value.\"}}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"params\":{\"max\":\"The maximum allowed value.\",\"message\":\"The error message.\",\"min\":\"The minimum allowed value.\",\"value\":\"The value that is out of range.\"}}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"params\":{\"caller\":\"The address of the caller.\",\"serviceProvider\":\"The address of the serviceProvider.\"}}],\"ProvisionManagerProvisionNotFound(address)\":[{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"params\":{\"ratio\":\"The delegation ratio\"}},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"params\":{\"max\":\"The maximum allowed value for the provision tokens.\",\"min\":\"The minimum allowed value for the provision tokens.\"}},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"params\":{\"max\":\"The maximum allowed value for the thawing period.\",\"min\":\"The minimum allowed value for the thawing period.\"}},\"VerifierCutRangeSet(uint32,uint32)\":{\"params\":{\"max\":\"The maximum allowed value for the max verifier cut.\",\"min\":\"The minimum allowed value for the max verifier cut.\"}}},\"kind\":\"dev\",\"methods\":{},\"title\":\"ProvisionManager contract\",\"version\":1},\"userdoc\":{\"errors\":{\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"notice\":\"Thrown when attempting to set a range where min is greater than max.\"}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when a provision parameter is out of range.\"}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to manage the provision of a service provider.\"}],\"ProvisionManagerProvisionNotFound(address)\":[{\"notice\":\"Thrown when a provision is not found.\"}]},\"events\":{\"DelegationRatioSet(uint32)\":{\"notice\":\"Emitted when the delegation ratio is set.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"notice\":\"Emitted when the provision tokens range is set.\"},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"notice\":\"Emitted when the thawing period range is set.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"notice\":\"Emitted when the verifier cut range is set.\"}},\"kind\":\"user\",\"methods\":{},\"notice\":\"A helper contract that implements several provision management functions.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol\":\"ProvisionManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol\":{\"keccak256\":\"0x63e7f1df10586beb7f8683065719fbff045437508539a9358c25a13fcf989f91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b32f9a7be91ae6d9c9a6edbe2404efbcf9fa99c1d503f4a688054be468494a8e\",\"dweb:/ipfs/QmQ5AQXsBPxtJSW24LqRZAaYYaz1518FpUCHfDEdsMfF8F\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":{\"keccak256\":\"0xe44f72a63c472a6de42e08a2d732044fe1ac9245c4203d4e1eb941b1a2fa2159\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://412708a4f94b5757e46676c5702e47d37fdbdacbe53f70e2ee93d37c5938e028\",\"dweb:/ipfs/Qmdw4uagDdKeCzyS319BKyPzfnWCvM3KCtNYosFBd3xGco\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":{\"keccak256\":\"0x70d69069b2c122becd29ec4ea9a79f2e26cf7cbe7b1918ffced691ee00cdbd82\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://6bddc7d257c3df1fd4940dd3c554e5a1efbc1b23d50f7878415389b75380628c\",\"dweb:/ipfs/QmTQBCsL4pHoXMixVvDwGMdmJnGfEeeDZfHdJkcpKamu58\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol": { + "ProvisionManagerV1Storage": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"__gap\":{\"details\":\"Gap to allow adding variables in future upgrades Note that this contract is not upgradeable but might be inherited by an upgradeable contract\"},\"_delegationRatio\":{\"details\":\"Max calculated as service provider's stake * delegationRatio\"}},\"title\":\"Storage layout for the {ProvisionManager} helper contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":\"ProvisionManagerV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":{\"keccak256\":\"0xe44f72a63c472a6de42e08a2d732044fe1ac9245c4203d4e1eb941b1a2fa2159\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://412708a4f94b5757e46676c5702e47d37fdbdacbe53f70e2ee93d37c5938e028\",\"dweb:/ipfs/Qmdw4uagDdKeCzyS319BKyPzfnWCvM3KCtNYosFBd3xGco\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol": { + "IGraphPayments": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "cut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolPaymentCut", + "type": "uint256" + } + ], + "name": "GraphPaymentsInvalidProtocolPaymentCut", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensProtocol", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDataService", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationPool", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReceiver", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "GraphPaymentCollected", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "collect(uint8,address,uint256,address,uint256,address)": "81cd11a0", + "initialize()": "8129fc1c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cut\",\"type\":\"uint256\"}],\"name\":\"GraphPaymentsInvalidCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"protocolPaymentCut\",\"type\":\"uint256\"}],\"name\":\"GraphPaymentsInvalidProtocolPaymentCut\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensProtocol\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensDataService\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensDelegationPool\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensReceiver\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverDestination\",\"type\":\"address\"}],\"name\":\"GraphPaymentCollected\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"dataServiceCut\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiverDestination\",\"type\":\"address\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"GraphPaymentsInvalidCut(uint256)\":[{\"params\":{\"cut\":\"The cut\"}}],\"GraphPaymentsInvalidProtocolPaymentCut(uint256)\":[{\"params\":{\"protocolPaymentCut\":\"The protocol payment cut\"}}]},\"events\":{\"GraphPaymentCollected(uint8,address,address,address,uint256,uint256,uint256,uint256,uint256,address)\":{\"params\":{\"dataService\":\"The address of the data service\",\"payer\":\"The address of the payer\",\"paymentType\":\"The type of payment as defined in {IGraphPayments}\",\"receiver\":\"The address of the receiver\",\"receiverDestination\":\"The address where the receiver's payment cut is sent.\",\"tokens\":\"The total amount of tokens being collected\",\"tokensDataService\":\"Amount of tokens for the data service\",\"tokensDelegationPool\":\"Amount of tokens for delegators\",\"tokensProtocol\":\"Amount of tokens charged as protocol tax\",\"tokensReceiver\":\"Amount of tokens for the receiver\"}}},\"kind\":\"dev\",\"methods\":{\"collect(uint8,address,uint256,address,uint256,address)\":{\"params\":{\"dataService\":\"The address of the data service\",\"dataServiceCut\":\"The data service cut in PPM\",\"paymentType\":\"The type of payment as defined in {IGraphPayments}\",\"receiver\":\"The address of the receiver\",\"receiverDestination\":\"The address where the receiver's payment cut is sent.\",\"tokens\":\"The amount of tokens being collected.\"}}},\"title\":\"Interface for the {GraphPayments} contract\",\"version\":1},\"userdoc\":{\"errors\":{\"GraphPaymentsInvalidCut(uint256)\":[{\"notice\":\"Thrown when trying to use a cut that is not expressed in PPM\"}],\"GraphPaymentsInvalidProtocolPaymentCut(uint256)\":[{\"notice\":\"Thrown when the protocol payment cut is invalid\"}]},\"events\":{\"GraphPaymentCollected(uint8,address,address,address,uint256,uint256,uint256,uint256,uint256,address)\":{\"notice\":\"Emitted when a payment is collected\"}},\"kind\":\"user\",\"methods\":{\"collect(uint8,address,uint256,address,uint256,address)\":{\"notice\":\"Collects funds from a payer. It will pay cuts to all relevant parties and forward the rest to the receiver destination address. If the destination address is zero the funds are automatically staked to the receiver. Note that the receiver destination address can be set to the receiver address to collect funds on the receiver without re-staking. Note that the collected amount can be zero.\"},\"initialize()\":{\"notice\":\"Initialize the contract\"}},\"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.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":\"IGraphPayments\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol": { + "IGraphProxyAdmin": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Empty interface to allow the GraphProxyAdmin contract to be used in the GraphDirectory contract.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"IGraphProxyAdmin\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":\"IGraphProxyAdmin\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol": { + "IGraphTallyCollector": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + } + ], + "name": "GraphTallyCollectorCallerNotDataService", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + } + ], + "name": "GraphTallyCollectorInconsistentRAVTokens", + "type": "error" + }, + { + "inputs": [], + "name": "GraphTallyCollectorInvalidRAVSigner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensToCollect", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensToCollect", + "type": "uint256" + } + ], + "name": "GraphTallyCollectorInvalidTokensToCollectAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dataService", + "type": "address" + } + ], + "name": "GraphTallyCollectorUnauthorizedDataService", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "timestampNs", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "valueAggregate", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "RAVCollected", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "tokensToCollect", + "type": "uint256" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint64", + "name": "timestampNs", + "type": "uint64" + }, + { + "internalType": "uint128", + "name": "valueAggregate", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "internalType": "struct IGraphTallyCollector.ReceiptAggregateVoucher", + "name": "rav", + "type": "tuple" + } + ], + "name": "encodeRAV", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint64", + "name": "timestampNs", + "type": "uint64" + }, + { + "internalType": "uint128", + "name": "valueAggregate", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "internalType": "struct IGraphTallyCollector.ReceiptAggregateVoucher", + "name": "rav", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct IGraphTallyCollector.SignedRAV", + "name": "signedRAV", + "type": "tuple" + } + ], + "name": "recoverRAVSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "collect(uint8,bytes)": "7f07d283", + "collect(uint8,bytes,uint256)": "692209ce", + "encodeRAV((bytes32,address,address,address,uint64,uint128,bytes))": "26969c4c", + "recoverRAVSigner(((bytes32,address,address,address,uint64,uint128,bytes),bytes))": "63648817" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"}],\"name\":\"GraphTallyCollectorCallerNotDataService\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensCollected\",\"type\":\"uint256\"}],\"name\":\"GraphTallyCollectorInconsistentRAVTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GraphTallyCollectorInvalidRAVSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensToCollect\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTokensToCollect\",\"type\":\"uint256\"}],\"name\":\"GraphTallyCollectorInvalidTokensToCollectAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"}],\"name\":\"GraphTallyCollectorUnauthorizedDataService\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"PaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"timestampNs\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"valueAggregate\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"RAVCollected\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"tokensToCollect\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"timestampNs\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"valueAggregate\",\"type\":\"uint128\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"struct IGraphTallyCollector.ReceiptAggregateVoucher\",\"name\":\"rav\",\"type\":\"tuple\"}],\"name\":\"encodeRAV\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"timestampNs\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"valueAggregate\",\"type\":\"uint128\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"internalType\":\"struct IGraphTallyCollector.ReceiptAggregateVoucher\",\"name\":\"rav\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct IGraphTallyCollector.SignedRAV\",\"name\":\"signedRAV\",\"type\":\"tuple\"}],\"name\":\"recoverRAVSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Implements the {IPaymentCollector} interface as defined by the Graph Horizon payments protocol.\",\"errors\":{\"GraphTallyCollectorCallerNotDataService(address,address)\":[{\"params\":{\"caller\":\"The address of the caller\",\"dataService\":\"The address of the data service\"}}],\"GraphTallyCollectorInconsistentRAVTokens(uint256,uint256)\":[{\"params\":{\"tokens\":\"The amount of tokens in the RAV\",\"tokensCollected\":\"The amount of tokens already collected\"}}],\"GraphTallyCollectorInvalidTokensToCollectAmount(uint256,uint256)\":[{\"params\":{\"maxTokensToCollect\":\"The maximum amount of tokens to collect\",\"tokensToCollect\":\"The amount of tokens to collect\"}}],\"GraphTallyCollectorUnauthorizedDataService(address)\":[{\"params\":{\"dataService\":\"The address of the data service\"}}]},\"events\":{\"PaymentCollected(uint8,bytes32,address,address,address,uint256)\":{\"params\":{\"collectionId\":\"The id for the collection. Can be used at the discretion of the collector to group multiple payments.\",\"dataService\":\"The address of the data service\",\"payer\":\"The address of the payer\",\"paymentType\":\"The payment type collected as defined by {IGraphPayments}\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens being collected\"}},\"RAVCollected(bytes32,address,address,address,uint64,uint128,bytes,bytes)\":{\"params\":{\"collectionId\":\"The ID of the collection \\\"bucket\\\" the RAV belongs to.\",\"dataService\":\"The address of the data service\",\"metadata\":\"Arbitrary metadata\",\"payer\":\"The address of the payer\",\"serviceProvider\":\"The address of the service provider\",\"signature\":\"The signature of the RAV\",\"timestampNs\":\"The timestamp of the RAV\",\"valueAggregate\":\"The total amount owed to the service provider\"}}},\"kind\":\"dev\",\"methods\":{\"collect(uint8,bytes)\":{\"details\":\"This function should require the caller to present some form of evidence of the payer's debt to the receiver. The collector should validate this evidence and, if valid, collect the payment. Emits a {PaymentCollected} event\",\"params\":{\"data\":\"Additional data required for the payment collection. Will vary depending on the collector implementation.\",\"paymentType\":\"The payment type to collect, as defined by {IGraphPayments}\"},\"returns\":{\"_0\":\"The amount of tokens collected\"}},\"collect(uint8,bytes,uint256)\":{\"params\":{\"data\":\"Additional data required for the payment collection. Encoded as follows: - SignedRAV `signedRAV`: The signed RAV - uint256 `dataServiceCut`: The data service cut in PPM - address `receiverDestination`: The address where the receiver's payment should be sent.\",\"paymentType\":\"The payment type to collect\",\"tokensToCollect\":\"The amount of tokens to collect\"},\"returns\":{\"_0\":\"The amount of tokens collected\"}},\"encodeRAV((bytes32,address,address,address,uint64,uint128,bytes))\":{\"details\":\"Computes the hash of a ReceiptAggregateVoucher (RAV).\",\"params\":{\"rav\":\"The RAV for which to compute the hash.\"},\"returns\":{\"_0\":\"The hash of the RAV.\"}},\"recoverRAVSigner(((bytes32,address,address,address,uint64,uint128,bytes),bytes))\":{\"details\":\"Recovers the signer address of a signed ReceiptAggregateVoucher (RAV).\",\"params\":{\"signedRAV\":\"The SignedRAV containing the RAV and its signature.\"},\"returns\":{\"_0\":\"The address of the signer.\"}}},\"title\":\"Interface for the {GraphTallyCollector} contract\",\"version\":1},\"userdoc\":{\"errors\":{\"GraphTallyCollectorCallerNotDataService(address,address)\":[{\"notice\":\"Thrown when the caller is not the data service the RAV was issued to\"}],\"GraphTallyCollectorInconsistentRAVTokens(uint256,uint256)\":[{\"notice\":\"Thrown when the tokens collected are inconsistent with the collection history Each RAV should have a value greater than the previous one\"}],\"GraphTallyCollectorInvalidRAVSigner()\":[{\"notice\":\"Thrown when the RAV signer is invalid\"}],\"GraphTallyCollectorInvalidTokensToCollectAmount(uint256,uint256)\":[{\"notice\":\"Thrown when the attempting to collect more tokens than what it's owed\"}],\"GraphTallyCollectorUnauthorizedDataService(address)\":[{\"notice\":\"Thrown when the RAV is for a data service the service provider has no provision for\"}]},\"events\":{\"PaymentCollected(uint8,bytes32,address,address,address,uint256)\":{\"notice\":\"Emitted when a payment is collected\"},\"RAVCollected(bytes32,address,address,address,uint64,uint128,bytes,bytes)\":{\"notice\":\"Emitted when a RAV is collected\"}},\"kind\":\"user\",\"methods\":{\"collect(uint8,bytes)\":{\"notice\":\"Initiate a payment collection through the payments protocol\"},\"collect(uint8,bytes,uint256)\":{\"notice\":\"See {IPaymentsCollector.collect} This variant adds the ability to partially collect a RAV by specifying the amount of tokens to collect. Requirements: - The amount of tokens to collect must be less than or equal to the total amount of tokens in the RAV minus the tokens already collected.\"}},\"notice\":\"Implements a payments collector contract that can be used to collect payments using a GraphTally RAV (Receipt Aggregate Voucher).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol\":\"IGraphTallyCollector\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol\":{\"keccak256\":\"0x762c26300d098fb1bdc5e6b52e0ffd0b497634e9bcfc9a9cd409df65d8d54590\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f5c68742e96c1483449c882b082631a9bfafebb27152b87427e1234d34e604f3\",\"dweb:/ipfs/QmYqtSeQpCbKEaKKDXwmeK5DrYFiwSHYVzM3dzanh7MQ3D\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol\":{\"keccak256\":\"0x0871e02129e1fabdb39024f9ac3368b4c747e6b374fdf4fc200d3c225ed82860\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a5fdf2dbedc15f739e6010a3ce3478ea7ad23bd643a8af3f39ccf631c06ebd52\",\"dweb:/ipfs/QmNusbPTqzzUwGomXBzsWHwbZMJ2HuTkxvgviLJZ6hr9i4\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol": { + "IHorizonStaking": { + "abi": [ + { + "inputs": [], + "name": "HorizonStakingCallerIsServiceProvider", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientDelegationTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientIdleStake", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientShares", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientStakeForLegacyAllocations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minRequired", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "HorizonStakingInvalidDelegationFeeCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPool", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPoolState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + } + ], + "name": "HorizonStakingInvalidMaxVerifierCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidProvision", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidServiceProviderZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidThawRequestType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "HorizonStakingInvalidThawingPeriod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidVerifier", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidVerifierZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroShares", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingLegacySlashFailed", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNoTokensToSlash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "HorizonStakingNotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingToWithdraw", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingProvisionAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingSlippageProtection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakingStillThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingTooManyThawRequests", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingTooManyTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingVerifierNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "AllowedLockedVerifierSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegatedTokensWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "DelegationFeeCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "DelegationSlashingEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashingSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakeLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "MaxThawingPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "OperatorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersStaged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionThawed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "assetHolder", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolTax", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queryFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queryRebates", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delegationRewards", + "type": "uint256" + } + ], + "name": "RebateCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "StakeDelegatedWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "StakeSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "ThawRequestCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bool", + "name": "valid", + "type": "bool" + } + ], + "name": "ThawRequestFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawRequestsFulfilled", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ThawRequestsFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ThawingPeriodCleared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensDelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensDeprovisioned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensToDelegationPoolAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensUndelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "VerifierTokensSent", + "type": "event" + }, + { + "inputs": [], + "name": "__DEPRECATED_getThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "acceptProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToDelegationPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clearThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "closeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSharesOut", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "deprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAtEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collectedFees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "__DEPRECATED_effectiveAllocation", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "distributedRebates", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingExtension.Allocation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocationState", + "outputs": [ + { + "internalType": "enum IHorizonStakingExtension.AllocationState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegatedTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "getDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Delegation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "getDelegationFeeCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegationPool", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.DelegationPool", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getIdleStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getIndexerStakedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProviderTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProvision", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "internalType": "uint32", + "name": "maxVerifierCutPending", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriodPending", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastParametersStagedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Provision", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getServiceProvider", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokensStaked", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensProvisioned", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ServiceProvider", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingExtension", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSubgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "thawRequestType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + } + ], + "name": "getThawRequest", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "nextRequest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ThawRequest", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "thawRequestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawRequestList", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "internalType": "struct LinkedList.List", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "thawRequestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "getTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "hasStake", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "isAllocation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "isAllowedLockedVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isAuthorized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDelegationSlashingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "legacySlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provisionLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oldServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minSharesForNewProvider", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "redelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "reprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setAllowedLockedVerifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "setDelegationFeeCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "setDelegationSlashingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "setMaxThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperatorLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "setProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensVerifier", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifierDestination", + "type": "address" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "withdrawDelegated", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "deprecated", + "type": "address" + } + ], + "name": "withdrawDelegated", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "__DEPRECATED_getThawingPeriod()": "c0641994", + "acceptProvisionParameters(address)": "3a78b732", + "addToDelegationPool(address,address,uint256)": "ca94b0e9", + "addToProvision(address,address,uint256)": "fecc9cc1", + "clearThawingPeriod()": "e473522a", + "closeAllocation(address,bytes32)": "44c32a61", + "collect(uint256,address)": "8d3c100a", + "delegate(address,address,uint256,uint256)": "6230001a", + "delegate(address,uint256)": "026e402b", + "deprovision(address,address,uint256)": "21195373", + "getAllocation(address)": "0e022923", + "getAllocationData(address)": "55c85269", + "getAllocationState(address)": "98c657dc", + "getDelegatedTokensAvailable(address,address)": "fb744cc0", + "getDelegation(address,address,address)": "ccebcabb", + "getDelegationFeeCut(address,address,uint8)": "7573ef4f", + "getDelegationPool(address,address)": "561285e4", + "getIdleStake(address)": "a784d498", + "getIndexerStakedTokens(address)": "1787e69f", + "getMaxThawingPeriod()": "39514ad2", + "getProviderTokensAvailable(address,address)": "08ce5f68", + "getProvision(address,address)": "25d9897e", + "getServiceProvider(address)": "8cc01c86", + "getStake(address)": "7a766460", + "getStakingExtension()": "66ee1b28", + "getSubgraphAllocatedTokens(bytes32)": "e2e1e8e9", + "getSubgraphService()": "9363c522", + "getThawRequest(uint8,bytes32)": "d48de845", + "getThawRequestList(uint8,address,address,address)": "e56f8a1d", + "getThawedTokens(uint8,address,address,address)": "2f7cc501", + "getTokensAvailable(address,address,uint32)": "872d0489", + "hasStake(address)": "e73e14bf", + "isAllocation(address)": "f1d60d66", + "isAllowedLockedVerifier(address)": "ae4fe67a", + "isAuthorized(address,address,address)": "7c145cc7", + "isDelegationSlashingEnabled()": "fc54fb27", + "isOperator(address,address)": "b6363cf2", + "legacySlash(address,uint256,uint256,address)": "4488a382", + "provision(address,address,uint256,uint32,uint64)": "010167e5", + "provisionLocked(address,address,uint256,uint32,uint64)": "82d66cb8", + "redelegate(address,address,address,address,uint256,uint256)": "f64b3598", + "reprovision(address,address,address,uint256)": "ba7fb0b4", + "setAllowedLockedVerifier(address,bool)": "4ca7ac22", + "setDelegationFeeCut(address,address,uint8,uint256)": "42c51693", + "setDelegationSlashingEnabled()": "ef58bd67", + "setMaxThawingPeriod(uint64)": "259bc435", + "setOperator(address,address,bool)": "bc735d90", + "setOperatorLocked(address,address,bool)": "ad4d35b5", + "setProvisionParameters(address,address,uint32,uint64)": "81e21b56", + "slash(address,uint256,uint256,address)": "e76fede6", + "stake(uint256)": "a694fc3a", + "stakeTo(address,uint256)": "a2a31722", + "stakeToProvision(address,address,uint256)": "74612092", + "thaw(address,address,uint256)": "f93f1cd0", + "undelegate(address,address,uint256)": "a02b9426", + "undelegate(address,uint256)": "4d99dd16", + "unstake(uint256)": "2e17de78", + "withdraw()": "3ccfd60b", + "withdrawDelegated(address,address)": "51a60b02", + "withdrawDelegated(address,address,uint256)": "3993d849" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"HorizonStakingCallerIsServiceProvider\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientDelegationTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientIdleStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minShares\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientShares\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientStakeForLegacyAllocations\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRequired\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"feeCut\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInvalidDelegationFeeCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidDelegationPool\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidDelegationPoolState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"}],\"name\":\"HorizonStakingInvalidMaxVerifierCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidProvision\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidServiceProviderZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidThawRequestType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxThawingPeriod\",\"type\":\"uint64\"}],\"name\":\"HorizonStakingInvalidThawingPeriod\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidVerifier\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidVerifierZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidZeroShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingLegacySlashFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingNoTokensToSlash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"HorizonStakingNotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingNothingThawing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingNothingToWithdraw\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingProvisionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minShares\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingSlippageProtection\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"until\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingStillThawing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingTooManyThawRequests\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingTooManyTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingVerifierNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"AllocationClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"AllowedLockedVerifierSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DelegatedTokensWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeCut\",\"type\":\"uint256\"}],\"name\":\"DelegationFeeCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DelegationSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"DelegationSlashingEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DelegationSlashingSkipped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakeDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"until\",\"type\":\"uint256\"}],\"name\":\"HorizonStakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxThawingPeriod\",\"type\":\"uint64\"}],\"name\":\"MaxThawingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"OperatorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"ProvisionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ProvisionIncreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"ProvisionParametersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"ProvisionParametersStaged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ProvisionSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ProvisionThawed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"assetHolder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"protocolTax\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"curationFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"queryFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"queryRebates\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delegationRewards\",\"type\":\"uint256\"}],\"name\":\"RebateCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"StakeDelegatedWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"StakeSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"requestType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingUntil\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"thawRequestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"ThawRequestCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"requestType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"thawRequestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingUntil\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"ThawRequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"requestType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"thawRequestsFulfilled\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ThawRequestsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ThawingPeriodCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"TokensDelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensDeprovisioned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensToDelegationPoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"TokensUndelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"VerifierTokensSent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__DEPRECATED_getThawingPeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"acceptProvisionParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"addToDelegationPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"addToProvision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearThawingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"}],\"name\":\"closeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSharesOut\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"deprovision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"getAllocation\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAtEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"closedAtEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"collectedFees\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"__DEPRECATED_effectiveAllocation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"distributedRebates\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingExtension.Allocation\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getAllocationData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPending\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"getAllocationState\",\"outputs\":[{\"internalType\":\"enum IHorizonStakingExtension.AllocationState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getDelegatedTokensAvailable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"getDelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.Delegation\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"}],\"name\":\"getDelegationFeeCut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getDelegationPool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"thawingNonce\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.DelegationPool\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"getIdleStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"getIndexerStakedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxThawingPeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getProviderTokensAvailable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getProvision\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"createdAt\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCutPending\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriodPending\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"lastParametersStagedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"thawingNonce\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.Provision\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"getServiceProvider\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"tokensStaked\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensProvisioned\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.ServiceProvider\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"getStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakingExtension\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"getSubgraphAllocatedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSubgraphService\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"thawRequestType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"thawRequestId\",\"type\":\"bytes32\"}],\"name\":\"getThawRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"thawingUntil\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"nextRequest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"thawingNonce\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.ThawRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"thawRequestType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getThawRequestList\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"head\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tail\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"internalType\":\"struct LinkedList.List\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"thawRequestType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getThawedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"delegationRatio\",\"type\":\"uint32\"}],\"name\":\"getTokensAvailable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"hasStake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"isAllocation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isAllowedLockedVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isAuthorized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDelegationSlashingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"legacySlash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"provision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"provisionLocked\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oldServiceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newServiceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minSharesForNewProvider\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"redelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"reprovision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setAllowedLockedVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"feeCut\",\"type\":\"uint256\"}],\"name\":\"setDelegationFeeCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setDelegationSlashingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"maxThawingPeriod\",\"type\":\"uint64\"}],\"name\":\"setMaxThawingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setOperatorLocked\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"setProvisionParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensVerifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifierDestination\",\"type\":\"address\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"stakeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"stakeToProvision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"thaw\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"undelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"undelegate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"withdrawDelegated\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"deprecated\",\"type\":\"address\"}],\"name\":\"withdrawDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Use this interface to interact with the Horizon Staking contract.\",\"errors\":{\"HorizonStakingInsufficientDelegationTokens(uint256,uint256)\":[{\"params\":{\"minTokens\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInsufficientIdleStake(uint256,uint256)\":[{\"params\":{\"minTokens\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInsufficientShares(uint256,uint256)\":[{\"params\":{\"minShares\":\"The minimum required share amount\",\"shares\":\"The actual share amount\"}}],\"HorizonStakingInsufficientStakeForLegacyAllocations(uint256,uint256)\":[{\"params\":{\"minTokens\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInsufficientTokens(uint256,uint256)\":[{\"params\":{\"minRequired\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInvalidDelegationFeeCut(uint256)\":[{\"params\":{\"feeCut\":\"The fee cut\"}}],\"HorizonStakingInvalidDelegationPool(address,address)\":[{\"params\":{\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingInvalidDelegationPoolState(address,address)\":[{\"params\":{\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingInvalidMaxVerifierCut(uint32)\":[{\"params\":{\"maxVerifierCut\":\"The maximum verifier cut\"}}],\"HorizonStakingInvalidProvision(address,address)\":[{\"params\":{\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingInvalidThawingPeriod(uint64,uint64)\":[{\"params\":{\"maxThawingPeriod\":\"The maximum `thawingPeriod` allowed\",\"thawingPeriod\":\"The thawing period\"}}],\"HorizonStakingInvalidVerifier(address)\":[{\"params\":{\"verifier\":\"The verifier address\"}}],\"HorizonStakingNotAuthorized(address,address,address)\":[{\"params\":{\"caller\":\"The caller address\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingSlippageProtection(uint256,uint256)\":[{\"params\":{\"minShares\":\"The minimum required share amount\",\"shares\":\"The actual share amount\"}}],\"HorizonStakingStillThawing(uint256)\":[{\"details\":\"Note this thawing refers to the global thawing period applied to legacy allocated tokens, it does not refer to thaw requests.\",\"params\":{\"until\":\"The block number until the stake is locked\"}}],\"HorizonStakingTooManyTokens(uint256,uint256)\":[{\"params\":{\"maxTokens\":\"The maximum allowed token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingVerifierNotAllowed(address)\":[{\"details\":\"Only applies to stake from locked wallets.\",\"params\":{\"verifier\":\"The verifier address\"}}]},\"events\":{\"AllocationClosed(address,bytes32,uint256,uint256,address,address,bytes32,bool)\":{\"details\":\"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.\",\"params\":{\"allocationID\":\"The allocation identifier\",\"epoch\":\"The protocol epoch the allocation was closed on\",\"indexer\":\"The indexer address\",\"isPublic\":\"True if the allocation was force closed by someone other than the indexer/operator\",\"poi\":\"The proof of indexing submitted by the sender\",\"sender\":\"The address closing the allocation\",\"subgraphDeploymentID\":\"The subgraph deployment ID\",\"tokens\":\"The amount of tokens unallocated from the allocation\"}},\"AllowedLockedVerifierSet(address,bool)\":{\"params\":{\"allowed\":\"Whether the verifier is allowed or disallowed\",\"verifier\":\"The address of the verifier\"}},\"DelegatedTokensWithdrawn(address,address,address,uint256)\":{\"params\":{\"delegator\":\"The address of the delegator\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens withdrawn\",\"verifier\":\"The address of the verifier\"}},\"DelegationFeeCutSet(address,address,uint8,uint256)\":{\"params\":{\"feeCut\":\"The fee cut set, in PPM\",\"paymentType\":\"The payment type for which the fee cut is set, as defined in {IGraphPayments}\",\"serviceProvider\":\"The address of the service provider\",\"verifier\":\"The address of the verifier\"}},\"DelegationSlashed(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens slashed (note this only represents delegation pool's slashed stake)\",\"verifier\":\"The address of the verifier\"}},\"DelegationSlashingSkipped(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens that would have been slashed (note this only represents delegation pool's slashed stake)\",\"verifier\":\"The address of the verifier\"}},\"HorizonStakeDeposited(address,uint256)\":{\"details\":\"TRANSITION PERIOD: After transition period move to IHorizonStakingMain. Temporarily it needs to be here since it's emitted by {_stake} which is used by both {HorizonStaking} and {HorizonStakingExtension}.\",\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens staked.\"}},\"HorizonStakeLocked(address,uint256,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens now locked (including previously locked tokens)\",\"until\":\"The block number until the stake is locked\"}},\"HorizonStakeWithdrawn(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens withdrawn\"}},\"MaxThawingPeriodSet(uint64)\":{\"params\":{\"maxThawingPeriod\":\"The new maximum thawing period\"}},\"OperatorSet(address,address,address,bool)\":{\"details\":\"Emitted when an operator is allowed or denied by a service provider for a particular verifier\",\"params\":{\"allowed\":\"Whether the operator is allowed or denied\",\"operator\":\"The address of the operator\",\"serviceProvider\":\"The address of the service provider\",\"verifier\":\"The address of the verifier\"}},\"ProvisionCreated(address,address,uint256,uint32,uint64)\":{\"params\":{\"maxVerifierCut\":\"The maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The address of the service provider\",\"thawingPeriod\":\"The period in seconds that the tokens will be thawing before they can be removed from the provision\",\"tokens\":\"The amount of tokens provisioned\",\"verifier\":\"The address of the verifier\"}},\"ProvisionIncreased(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens added to the provision\",\"verifier\":\"The address of the verifier\"}},\"ProvisionParametersSet(address,address,uint32,uint64)\":{\"params\":{\"maxVerifierCut\":\"The new maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The address of the service provider\",\"thawingPeriod\":\"The new period in seconds that the tokens will be thawing before they can be removed from the provision\",\"verifier\":\"The address of the verifier\"}},\"ProvisionParametersStaged(address,address,uint32,uint64)\":{\"params\":{\"maxVerifierCut\":\"The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The address of the service provider\",\"thawingPeriod\":\"The proposed period in seconds that the tokens will be thawing before they can be removed from the provision\",\"verifier\":\"The address of the verifier\"}},\"ProvisionSlashed(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens slashed (note this only represents service provider's slashed stake)\",\"verifier\":\"The address of the verifier\"}},\"ProvisionThawed(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens thawed\",\"verifier\":\"The address of the verifier\"}},\"RebateCollected(address,address,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)\":{\"details\":\"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.\",\"params\":{\"allocationID\":\"The allocation identifier\",\"assetHolder\":\"The address of the asset holder, the entity paying the query fees\",\"curationFees\":\"The amount of tokens distributed to the curation pool\",\"delegationRewards\":\"The amount of tokens collected from the delegation pool\",\"epoch\":\"The protocol epoch the rebate was collected on\",\"indexer\":\"The indexer address\",\"protocolTax\":\"The amount of tokens burnt as protocol tax\",\"queryFees\":\"The amount of tokens collected as query fees\",\"queryRebates\":\"The amount of tokens distributed to the indexer\",\"subgraphDeploymentID\":\"The subgraph deployment ID\",\"tokens\":\"The amount of tokens collected\"}},\"StakeDelegatedWithdrawn(address,address,uint256)\":{\"details\":\"This event is for the legacy `withdrawDelegated` function.\",\"params\":{\"delegator\":\"The address of the delegator\",\"indexer\":\"The address of the indexer\",\"tokens\":\"The amount of tokens withdrawn\"}},\"StakeSlashed(address,uint256,uint256,address)\":{\"details\":\"Emitted when `indexer` was slashed for a total of `tokens` amount. Tracks `reward` amount of tokens given to `beneficiary`.\",\"params\":{\"beneficiary\":\"The address of a beneficiary to receive a reward for the slashing\",\"indexer\":\"The indexer address\",\"reward\":\"The amount of reward tokens to send to a beneficiary\",\"tokens\":\"The amount of tokens slashed\"}},\"ThawRequestCreated(uint8,address,address,address,uint256,uint64,bytes32,uint256)\":{\"details\":\"Can be emitted by the service provider when thawing stake or by the delegator when undelegating.\",\"params\":{\"nonce\":\"The nonce of the thaw request\",\"owner\":\"The address of the owner of the thaw request.\",\"requestType\":\"The type of thaw request\",\"serviceProvider\":\"The address of the service provider\",\"shares\":\"The amount of shares being thawed\",\"thawRequestId\":\"The ID of the thaw request\",\"thawingUntil\":\"The timestamp until the stake is thawed\",\"verifier\":\"The address of the verifier\"}},\"ThawRequestFulfilled(uint8,bytes32,uint256,uint256,uint64,bool)\":{\"params\":{\"requestType\":\"The type of thaw request\",\"shares\":\"The amount of shares being released\",\"thawRequestId\":\"The ID of the thaw request\",\"thawingUntil\":\"The timestamp until the stake has thawed\",\"tokens\":\"The amount of tokens being released\",\"valid\":\"Whether the thaw request was valid at the time of fulfillment\"}},\"ThawRequestsFulfilled(uint8,address,address,address,uint256,uint256)\":{\"params\":{\"owner\":\"The address of the owner of the thaw requests\",\"requestType\":\"The type of thaw request\",\"serviceProvider\":\"The address of the service provider\",\"thawRequestsFulfilled\":\"The number of thaw requests fulfilled\",\"tokens\":\"The total amount of tokens being released\",\"verifier\":\"The address of the verifier\"}},\"ThawingPeriodCleared()\":{\"details\":\"This marks the end of the transition period.\"},\"TokensDelegated(address,address,address,uint256,uint256)\":{\"params\":{\"delegator\":\"The address of the delegator\",\"serviceProvider\":\"The address of the service provider\",\"shares\":\"The amount of shares delegated\",\"tokens\":\"The amount of tokens delegated\",\"verifier\":\"The address of the verifier\"}},\"TokensDeprovisioned(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens removed\",\"verifier\":\"The address of the verifier\"}},\"TokensToDelegationPoolAdded(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens withdrawn\",\"verifier\":\"The address of the verifier\"}},\"TokensUndelegated(address,address,address,uint256,uint256)\":{\"params\":{\"delegator\":\"The address of the delegator\",\"serviceProvider\":\"The address of the service provider\",\"shares\":\"The amount of shares undelegated\",\"tokens\":\"The amount of tokens undelegated\",\"verifier\":\"The address of the verifier\"}},\"VerifierTokensSent(address,address,address,uint256)\":{\"params\":{\"destination\":\"The address where the verifier cut is sent\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens sent to the verifier\",\"verifier\":\"The address of the verifier\"}}},\"kind\":\"dev\",\"methods\":{\"__DEPRECATED_getThawingPeriod()\":{\"returns\":{\"_0\":\"Thawing period in blocks\"}},\"acceptProvisionParameters(address)\":{\"details\":\"Only the provision's verifier can call this function. Emits a {ProvisionParametersSet} event.\",\"params\":{\"serviceProvider\":\"The service provider address\"}},\"addToDelegationPool(address,address,uint256)\":{\"details\":\"Requirements: - `tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits a {TokensToDelegationPoolAdded} event.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to add to the delegation pool\",\"verifier\":\"The verifier address for which the tokens are provisioned\"}},\"addToProvision(address,address,uint256)\":{\"details\":\"Requirements: - The `serviceProvider` must have previously provisioned stake to `verifier`. - `tokens` cannot be zero. - The `serviceProvider` must have enough idle stake to cover the tokens to add. Emits a {ProvisionIncreased} event.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to add to the provision\",\"verifier\":\"The verifier address\"}},\"clearThawingPeriod()\":{\"details\":\"This function can only be called by the contract governor.Emits a {ThawingPeriodCleared} event.\"},\"closeAllocation(address,bytes32)\":{\"params\":{\"allocationID\":\"The allocation identifier\",\"poi\":\"Proof of indexing submitted for the allocated period\"}},\"collect(uint256,address)\":{\"details\":\"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 total amount rebated, the total amount collected and compensating the indexer for the difference.\",\"params\":{\"allocationID\":\"Allocation where the tokens will be assigned\",\"tokens\":\"Amount of tokens to collect\"}},\"delegate(address,address,uint256,uint256)\":{\"details\":\"Requirements: - `tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. - The provision must exist. Emits a {TokensDelegated} event.\",\"params\":{\"minSharesOut\":\"The minimum amount of shares to accept, slippage protection.\",\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to delegate\",\"verifier\":\"The verifier address\"}},\"delegate(address,uint256)\":{\"details\":\"See {delegate}.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to delegate\"}},\"deprovision(address,address,uint256)\":{\"details\":\"The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function will attempt to fulfill all thaw requests until the first one that is not yet expired is found. Requirements: - Must have previously initiated a thaw request using {thaw}. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {TokensDeprovisioned} events.\",\"params\":{\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}},\"getAllocation(address)\":{\"params\":{\"allocationID\":\"Address used as allocation identifier\"},\"returns\":{\"_0\":\"Allocation data\"}},\"getAllocationData(address)\":{\"details\":\"Get allocation data to calculate rewards issuance \",\"params\":{\"allocationId\":\"The allocation Id\"},\"returns\":{\"accRewardsPending\":\"Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed\",\"accRewardsPerAllocatedToken\":\"Rewards snapshot\",\"indexer\":\"The indexer address\",\"isActive\":\"Whether the allocation is active or not\",\"subgraphDeploymentId\":\"Subgraph deployment id for the allocation\",\"tokens\":\"Amount of allocated tokens\"}},\"getAllocationState(address)\":{\"params\":{\"allocationID\":\"Allocation identifier\"},\"returns\":{\"_0\":\"AllocationState enum with the state of the allocation\"}},\"getDelegatedTokensAvailable(address,address)\":{\"details\":\"Calculated as the tokens available minus the tokens thawing.\",\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of tokens available.\"}},\"getDelegation(address,address,address)\":{\"params\":{\"delegator\":\"The address of the delegator.\",\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The delegation details.\"}},\"getDelegationFeeCut(address,address,uint8)\":{\"params\":{\"paymentType\":\"The payment type as defined by {IGraphPayments.PaymentTypes}.\",\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The delegation fee cut in PPM.\"}},\"getDelegationPool(address,address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The delegation pool details.\"}},\"getIdleStake(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens that are idle.\"}},\"getIndexerStakedTokens(address)\":{\"params\":{\"indexer\":\"Address of the indexer\"},\"returns\":{\"_0\":\"Amount of tokens staked by the indexer\"}},\"getMaxThawingPeriod()\":{\"returns\":{\"_0\":\"The maximum allowed thawing period in seconds.\"}},\"getProviderTokensAvailable(address,address)\":{\"details\":\"Calculated as the tokens available minus the tokens thawing.\",\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of tokens available.\"}},\"getProvision(address,address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The provision details.\"}},\"getServiceProvider(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The service provider details.\"}},\"getStake(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens staked.\"}},\"getStakingExtension()\":{\"returns\":{\"_0\":\"The address of the staking extension\"}},\"getSubgraphAllocatedTokens(bytes32)\":{\"params\":{\"_subgraphDeploymentId\":\"Deployment Id for the subgraph\"},\"returns\":{\"_0\":\"Total tokens allocated to subgraph\"}},\"getSubgraphService()\":{\"details\":\"TRANSITION PERIOD: After transition period move to main HorizonStaking contract\",\"returns\":{\"_0\":\"Address of the subgraph data service\"}},\"getThawRequest(uint8,bytes32)\":{\"params\":{\"thawRequestId\":\"The id of the thaw request.\",\"thawRequestType\":\"The type of thaw request.\"},\"returns\":{\"_0\":\"The thaw request details.\"}},\"getThawRequestList(uint8,address,address,address)\":{\"params\":{\"owner\":\"The owner of the thaw requests. Use either the service provider or delegator address.\",\"serviceProvider\":\"The address of the service provider.\",\"thawRequestType\":\"The type of thaw request.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The thaw requests list metadata.\"}},\"getThawedTokens(uint8,address,address,address)\":{\"details\":\"Note that the value returned by this function does not return the total amount of thawed tokens but only those that can be released. If thaw requests are created with different thawing periods it's possible that an unexpired thaw request temporarily blocks the release of other ones that have already expired. This function will stop counting when it encounters the first thaw request that is not yet expired.\",\"params\":{\"owner\":\"The owner of the thaw requests. Use either the service provider or delegator address.\",\"serviceProvider\":\"The address of the service provider.\",\"thawRequestType\":\"The type of thaw request.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of thawed tokens.\"}},\"getTokensAvailable(address,address,uint32)\":{\"params\":{\"delegationRatio\":\"The delegation ratio.\",\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of tokens available.\"}},\"hasStake(address)\":{\"params\":{\"indexer\":\"Address of the indexer\"},\"returns\":{\"_0\":\"True if indexer has staked tokens\"}},\"isAllocation(address)\":{\"params\":{\"allocationID\":\"Address used as signer by the indexer for an allocation\"},\"returns\":{\"_0\":\"True if allocationID already used\"}},\"isAllowedLockedVerifier(address)\":{\"params\":{\"verifier\":\"Address of the verifier\"},\"returns\":{\"_0\":\"True if verifier is allowed locked verifier, false otherwise\"}},\"isAuthorized(address,address,address)\":{\"params\":{\"operator\":\"The address to check for auth\",\"serviceProvider\":\"The service provider on behalf of whom they're claiming to act\",\"verifier\":\"The verifier / data service on which they're claiming to act\"},\"returns\":{\"_0\":\"Whether the operator is authorized or not\"}},\"isDelegationSlashingEnabled()\":{\"returns\":{\"_0\":\"True if delegation slashing is enabled, false otherwise\"}},\"isOperator(address,address)\":{\"params\":{\"indexer\":\"Address of the service provider\",\"operator\":\"Address of the operator\"},\"returns\":{\"_0\":\"True if operator is allowed for indexer, false otherwise\"}},\"legacySlash(address,uint256,uint256,address)\":{\"details\":\"Can only be called by the slasher role.\",\"params\":{\"beneficiary\":\"Address of a beneficiary to receive a reward for the slashing\",\"indexer\":\"Address of indexer to slash\",\"reward\":\"Amount of reward tokens to send to a beneficiary\",\"tokens\":\"Amount of tokens to slash from the indexer stake\"}},\"provision(address,address,uint256,uint32,uint64)\":{\"details\":\"During the transition period, only the subgraph data service can be used as a verifier. This prevents an escape hatch for legacy allocation stake.Requirements: - `tokens` cannot be zero. - The `serviceProvider` must have enough idle stake to cover the tokens to provision. - `maxVerifierCut` must be a valid PPM. - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`. Emits a {ProvisionCreated} event.\",\"params\":{\"maxVerifierCut\":\"The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\",\"serviceProvider\":\"The service provider address\",\"thawingPeriod\":\"The period in seconds that the tokens will be thawing before they can be removed from the provision\",\"tokens\":\"The amount of tokens that will be locked and slashable\",\"verifier\":\"The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\"}},\"provisionLocked(address,address,uint256,uint32,uint64)\":{\"details\":\"See {provision}. Additional requirements: - The `verifier` must be allowed to be used for locked provisions.\",\"params\":{\"maxVerifierCut\":\"The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\",\"serviceProvider\":\"The service provider address\",\"thawingPeriod\":\"The period in seconds that the tokens will be thawing before they can be removed from the provision\",\"tokens\":\"The amount of tokens that will be locked and slashable\",\"verifier\":\"The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\"}},\"redelegate(address,address,address,address,uint256,uint256)\":{\"details\":\"The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw requests in the event that fulfilling all of them results in a gas limit error. Requirements: - Must have previously initiated a thaw request using {undelegate}. - `newServiceProvider` and `newVerifier` must not be the zero address. - `newServiceProvider` must have previously provisioned stake to `newVerifier`. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\",\"params\":{\"minSharesForNewProvider\":\"The minimum amount of shares to accept for the new service provider\",\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"newServiceProvider\":\"The address of a new service provider\",\"newVerifier\":\"The address of a new verifier\",\"oldServiceProvider\":\"The old service provider address\",\"oldVerifier\":\"The old verifier address\"}},\"reprovision(address,address,address,uint256)\":{\"details\":\"Requirements: - Must have previously initiated a thaw request using {thaw}. - `tokens` cannot be zero. - The `serviceProvider` must have previously provisioned stake to `newVerifier`. - The `serviceProvider` must have enough idle stake to cover the tokens to add. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled}, {TokensDeprovisioned} and {ProvisionIncreased} events.\",\"params\":{\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"newVerifier\":\"The verifier address for which the tokens will be provisioned\",\"oldVerifier\":\"The verifier address for which the tokens are currently provisioned\",\"serviceProvider\":\"The service provider address\"}},\"setAllowedLockedVerifier(address,bool)\":{\"details\":\"This function can only be called by the contract governor, it's used to maintain a whitelist of verifiers that do not allow the stake from a locked wallet to escape the lock.Emits a {AllowedLockedVerifierSet} event.\",\"params\":{\"allowed\":\"Whether the verifier is allowed or not\",\"verifier\":\"The verifier address\"}},\"setDelegationFeeCut(address,address,uint8,uint256)\":{\"details\":\"Emits a {DelegationFeeCutSet} event.\",\"params\":{\"feeCut\":\"The fee cut to set, in PPM\",\"paymentType\":\"The payment type for which the fee cut is set, as defined in {IGraphPayments}\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}},\"setDelegationSlashingEnabled()\":{\"details\":\"This function can only be called by the contract governor.\"},\"setMaxThawingPeriod(uint64)\":{\"params\":{\"maxThawingPeriod\":\"The new maximum thawing period, in seconds\"}},\"setOperator(address,address,bool)\":{\"details\":\"Emits a {OperatorSet} event.\",\"params\":{\"allowed\":\"Whether the operator is authorized or not\",\"operator\":\"Address to authorize or unauthorize\",\"verifier\":\"The verifier / data service on which they'll be allowed to operate\"}},\"setOperatorLocked(address,address,bool)\":{\"details\":\"See {setOperator}. Additional requirements: - The `verifier` must be allowed to be used for locked provisions.\",\"params\":{\"allowed\":\"Whether the operator is authorized or not\",\"operator\":\"Address to authorize or unauthorize\",\"verifier\":\"The verifier / data service on which they'll be allowed to operate\"}},\"setProvisionParameters(address,address,uint32,uint64)\":{\"details\":\"This two step update process prevents the service provider from changing the parameters without the verifier's consent. Requirements: - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`. Note that if `_maxThawingPeriod` changes the function will not revert if called with the same thawing period as the current one. Emits a {ProvisionParametersStaged} event if at least one of the parameters changed.\",\"params\":{\"maxVerifierCut\":\"The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The service provider address\",\"thawingPeriod\":\"The proposed period in seconds that the tokens will be thawing before they can be removed from the provision\",\"verifier\":\"The verifier address\"}},\"slash(address,uint256,uint256,address)\":{\"details\":\"Requirements: - `tokens` must be less than or equal to the amount of tokens provisioned by the service provider. - `tokensVerifier` must be less than the provision's tokens times the provision's maximum verifier cut. Emits a {ProvisionSlashed} and {VerifierTokensSent} events. Emits a {DelegationSlashed} or {DelegationSlashingSkipped} event depending on the global delegation slashing flag.\",\"params\":{\"serviceProvider\":\"The service provider to slash\",\"tokens\":\"The amount of tokens to slash\",\"tokensVerifier\":\"The amount of tokens to transfer instead of burning\",\"verifierDestination\":\"The address to transfer the verifier cut to\"}},\"stake(uint256)\":{\"details\":\"Pulls tokens from the caller. Requirements: - `_tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits a {HorizonStakeDeposited} event.\",\"params\":{\"tokens\":\"Amount of tokens to stake\"}},\"stakeTo(address,uint256)\":{\"details\":\"Pulls tokens from the caller. Requirements: - `_tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits a {HorizonStakeDeposited} event.\",\"params\":{\"serviceProvider\":\"Address of the service provider\",\"tokens\":\"Amount of tokens to stake\"}},\"stakeToProvision(address,address,uint256)\":{\"details\":\"This function can be called by the service provider, by an authorized operator or by the verifier itself.Requirements: - The `serviceProvider` must have previously provisioned stake to `verifier`. - `_tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits {HorizonStakeDeposited} and {ProvisionIncreased} events.\",\"params\":{\"serviceProvider\":\"Address of the service provider\",\"tokens\":\"Amount of tokens to stake\",\"verifier\":\"Address of the verifier\"}},\"thaw(address,address,uint256)\":{\"details\":\"Requirements: - The provision must have enough tokens available to thaw. - `tokens` cannot be zero. Emits {ProvisionThawed} and {ThawRequestCreated} events.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to thaw\",\"verifier\":\"The verifier address for which the tokens are provisioned\"},\"returns\":{\"_0\":\"The ID of the thaw request\"}},\"undelegate(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The service provider address\",\"shares\":\"The amount of shares to undelegate\",\"verifier\":\"The verifier address\"},\"returns\":{\"_0\":\"The ID of the thaw request\"}},\"undelegate(address,uint256)\":{\"details\":\"See {undelegate}.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"shares\":\"The amount of shares to undelegate\"}},\"unstake(uint256)\":{\"details\":\"Requirements: - `_tokens` cannot be zero. - `_serviceProvider` must have enough idle stake to cover the staking amount and any legacy allocation. Emits a {HorizonStakeLocked} event during the transition period. Emits a {HorizonStakeWithdrawn} event after the transition period.\",\"params\":{\"tokens\":\"Amount of tokens to unstake\"}},\"withdraw()\":{\"details\":\"This is only needed during the transition period while we still have a global lock. After that, unstake() will automatically withdraw.\"},\"withdrawDelegated(address,address)\":{\"details\":\"See {delegate}.\",\"params\":{\"deprecated\":\"Deprecated parameter kept for backwards compatibility\",\"serviceProvider\":\"The service provider address\"},\"returns\":{\"_0\":\"The amount of tokens withdrawn\"}},\"withdrawDelegated(address,address,uint256)\":{\"details\":\"The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function will attempt to fulfill all thaw requests until the first one that is not yet expired is found.If the delegation pool was completely slashed before withdrawing, calling this function will fulfill the thaw requests with an amount equal to zero. Requirements: - Must have previously initiated a thaw request using {undelegate}. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\",\"params\":{\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}},\"title\":\"Complete interface for the Horizon Staking contract\",\"version\":1},\"userdoc\":{\"errors\":{\"HorizonStakingCallerIsServiceProvider()\":[{\"notice\":\"Thrown when a service provider attempts to change their own operator access.\"}],\"HorizonStakingInsufficientDelegationTokens(uint256,uint256)\":[{\"notice\":\"Thrown when the minimum token amount required for delegation is not met.\"}],\"HorizonStakingInsufficientIdleStake(uint256,uint256)\":[{\"notice\":\"Thrown when the service provider has insufficient idle stake to operate.\"}],\"HorizonStakingInsufficientShares(uint256,uint256)\":[{\"notice\":\"Thrown when a minimum share amount is required to operate but it's not met.\"}],\"HorizonStakingInsufficientStakeForLegacyAllocations(uint256,uint256)\":[{\"notice\":\"Thrown during the transition period when the service provider has insufficient stake to cover their existing legacy allocations.\"}],\"HorizonStakingInsufficientTokens(uint256,uint256)\":[{\"notice\":\"Thrown when a minimum token amount is required to operate but it's not met.\"}],\"HorizonStakingInvalidDelegationFeeCut(uint256)\":[{\"notice\":\"Thrown when trying to set a delegation fee cut that is not valid.\"}],\"HorizonStakingInvalidDelegationPool(address,address)\":[{\"notice\":\"Thrown when attempting to operate with a delegation pool that does not exist.\"}],\"HorizonStakingInvalidDelegationPoolState(address,address)\":[{\"notice\":\"Thrown when as a result of slashing delegation pool has no tokens but has shares.\"}],\"HorizonStakingInvalidMaxVerifierCut(uint32)\":[{\"notice\":\"Thrown when attempting to create a provision with an invalid maximum verifier cut.\"}],\"HorizonStakingInvalidProvision(address,address)\":[{\"notice\":\"Thrown when attempting to operate with a provision that does not exist.\"}],\"HorizonStakingInvalidServiceProviderZeroAddress()\":[{\"notice\":\"Thrown when attempting to redelegate with a serivce provider that is the zero address.\"}],\"HorizonStakingInvalidThawRequestType()\":[{\"notice\":\"Thrown when using an invalid thaw request type.\"}],\"HorizonStakingInvalidThawingPeriod(uint64,uint64)\":[{\"notice\":\"Thrown when attempting to create a provision with an invalid thawing period.\"}],\"HorizonStakingInvalidVerifier(address)\":[{\"notice\":\"Thrown when attempting to create a provision with a verifier other than the subgraph data service. This restriction only applies during the transition period.\"}],\"HorizonStakingInvalidVerifierZeroAddress()\":[{\"notice\":\"Thrown when attempting to redelegate with a verifier that is the zero address.\"}],\"HorizonStakingInvalidZeroShares()\":[{\"notice\":\"Thrown when operating a zero share amount is not allowed.\"}],\"HorizonStakingInvalidZeroTokens()\":[{\"notice\":\"Thrown when operating a zero token amount is not allowed.\"}],\"HorizonStakingLegacySlashFailed()\":[{\"notice\":\"Thrown when a legacy slash fails.\"}],\"HorizonStakingNoTokensToSlash()\":[{\"notice\":\"Thrown when there attempting to slash a provision with no tokens to slash.\"}],\"HorizonStakingNotAuthorized(address,address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to operate on a provision.\"}],\"HorizonStakingNothingThawing()\":[{\"notice\":\"Thrown when attempting to fulfill a thaw request but there is nothing thawing.\"}],\"HorizonStakingNothingToWithdraw()\":[{\"notice\":\"Thrown when attempting to withdraw tokens that have not thawed (legacy undelegate).\"}],\"HorizonStakingProvisionAlreadyExists()\":[{\"notice\":\"Thrown when attempting to create a provision for a data service that already has a provision.\"}],\"HorizonStakingSlippageProtection(uint256,uint256)\":[{\"notice\":\"Thrown when delegation shares obtained are below the expected amount.\"}],\"HorizonStakingStillThawing(uint256)\":[{\"notice\":\"Thrown during the transition period when attempting to withdraw tokens that are still thawing.\"}],\"HorizonStakingTooManyThawRequests()\":[{\"notice\":\"Thrown when a service provider has too many thaw requests.\"}],\"HorizonStakingTooManyTokens(uint256,uint256)\":[{\"notice\":\"Thrown when the amount of tokens exceeds the maximum allowed to operate.\"}],\"HorizonStakingVerifierNotAllowed(address)\":[{\"notice\":\"Thrown when a service provider attempts to operate on verifiers that are not allowed.\"}]},\"events\":{\"AllowedLockedVerifierSet(address,bool)\":{\"notice\":\"Emitted when a verifier is allowed or disallowed to be used for locked provisions.\"},\"DelegatedTokensWithdrawn(address,address,address,uint256)\":{\"notice\":\"Emitted when a delegator withdraws tokens from a provision after thawing.\"},\"DelegationFeeCutSet(address,address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider sets delegation fee cuts for a verifier.\"},\"DelegationSlashed(address,address,uint256)\":{\"notice\":\"Emitted when a delegation pool is slashed by a verifier.\"},\"DelegationSlashingEnabled()\":{\"notice\":\"Emitted when the delegation slashing global flag is set.\"},\"DelegationSlashingSkipped(address,address,uint256)\":{\"notice\":\"Emitted when a delegation pool would have been slashed by a verifier, but the slashing was skipped because delegation slashing global parameter is not enabled.\"},\"HorizonStakeDeposited(address,uint256)\":{\"notice\":\"Emitted when a service provider stakes tokens.\"},\"HorizonStakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when a service provider unstakes tokens during the transition period.\"},\"HorizonStakeWithdrawn(address,uint256)\":{\"notice\":\"Emitted when a service provider withdraws tokens during the transition period.\"},\"MaxThawingPeriodSet(uint64)\":{\"notice\":\"Emitted when the global maximum thawing period allowed for provisions is set.\"},\"ProvisionCreated(address,address,uint256,uint32,uint64)\":{\"notice\":\"Emitted when a service provider provisions staked tokens to a verifier.\"},\"ProvisionIncreased(address,address,uint256)\":{\"notice\":\"Emitted whenever staked tokens are added to an existing provision\"},\"ProvisionParametersSet(address,address,uint32,uint64)\":{\"notice\":\"Emitted when a service provider accepts a staged provision parameter update.\"},\"ProvisionParametersStaged(address,address,uint32,uint64)\":{\"notice\":\"Emitted when a service provider stages a provision parameter update.\"},\"ProvisionSlashed(address,address,uint256)\":{\"notice\":\"Emitted when a provision is slashed by a verifier.\"},\"ProvisionThawed(address,address,uint256)\":{\"notice\":\"Emitted when a service provider thaws tokens from a provision.\"},\"StakeDelegatedWithdrawn(address,address,uint256)\":{\"notice\":\"Emitted when `delegator` withdrew delegated `tokens` from `indexer` using `withdrawDelegated`.\"},\"ThawRequestCreated(uint8,address,address,address,uint256,uint64,bytes32,uint256)\":{\"notice\":\"Emitted when a thaw request is created.\"},\"ThawRequestFulfilled(uint8,bytes32,uint256,uint256,uint64,bool)\":{\"notice\":\"Emitted when a thaw request is fulfilled, meaning the stake is released.\"},\"ThawRequestsFulfilled(uint8,address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a series of thaw requests are fulfilled.\"},\"ThawingPeriodCleared()\":{\"notice\":\"Emitted when the legacy global thawing period is set to zero.\"},\"TokensDelegated(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when tokens are delegated to a provision.\"},\"TokensDeprovisioned(address,address,uint256)\":{\"notice\":\"Emitted when a service provider removes tokens from a provision.\"},\"TokensToDelegationPoolAdded(address,address,uint256)\":{\"notice\":\"Emitted when tokens are added to a delegation pool's reserve.\"},\"TokensUndelegated(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a delegator undelegates tokens from a provision and starts thawing them.\"},\"VerifierTokensSent(address,address,address,uint256)\":{\"notice\":\"Emitted when the verifier cut is sent to the verifier after slashing a provision.\"}},\"kind\":\"user\",\"methods\":{\"__DEPRECATED_getThawingPeriod()\":{\"notice\":\"Return the time in blocks to unstake Deprecated, now enforced by each data service (verifier)\"},\"acceptProvisionParameters(address)\":{\"notice\":\"Accepts a staged provision parameter update.\"},\"addToDelegationPool(address,address,uint256)\":{\"notice\":\"Add tokens to a delegation pool without issuing shares. Used by data services to pay delegation fees/rewards. Delegators SHOULD NOT call this function.\"},\"addToProvision(address,address,uint256)\":{\"notice\":\"Adds tokens from the service provider's idle stake to a provision\"},\"clearThawingPeriod()\":{\"notice\":\"Clear the legacy global thawing period. This signifies the end of the transition period, after which no legacy allocations should be left.\"},\"closeAllocation(address,bytes32)\":{\"notice\":\"Close an allocation and free the staked tokens. 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\"},\"delegate(address,address,uint256,uint256)\":{\"notice\":\"Delegate tokens to a provision.\"},\"delegate(address,uint256)\":{\"notice\":\"Delegate tokens to the subgraph data service provision. This function is for backwards compatibility with the legacy staking contract. It only allows delegating to the subgraph data service and DOES NOT have slippage protection.\"},\"deprovision(address,address,uint256)\":{\"notice\":\"Remove tokens from a provision and move them back to the service provider's idle stake.\"},\"getAllocation(address)\":{\"notice\":\"Return the allocation by ID.\"},\"getAllocationState(address)\":{\"notice\":\"Return the current state of an allocation\"},\"getDelegatedTokensAvailable(address,address)\":{\"notice\":\"Gets the delegator's tokens available in a provision.\"},\"getDelegation(address,address,address)\":{\"notice\":\"Gets the details of a delegation.\"},\"getDelegationFeeCut(address,address,uint8)\":{\"notice\":\"Gets the delegation fee cut for a payment type.\"},\"getDelegationPool(address,address)\":{\"notice\":\"Gets the details of delegation pool.\"},\"getIdleStake(address)\":{\"notice\":\"Gets the service provider's idle stake which is the stake that is not being used for any provision. Note that this only includes service provider's self stake.\"},\"getIndexerStakedTokens(address)\":{\"notice\":\"Get the total amount of tokens staked by the indexer.\"},\"getMaxThawingPeriod()\":{\"notice\":\"Gets the maximum allowed thawing period for a provision.\"},\"getProviderTokensAvailable(address,address)\":{\"notice\":\"Gets the service provider's tokens available in a provision.\"},\"getProvision(address,address)\":{\"notice\":\"Gets the details of a provision.\"},\"getServiceProvider(address)\":{\"notice\":\"Gets the details of a service provider.\"},\"getStake(address)\":{\"notice\":\"Gets the stake of a service provider.\"},\"getStakingExtension()\":{\"notice\":\"Get the address of the staking extension.\"},\"getSubgraphAllocatedTokens(bytes32)\":{\"notice\":\"Return the total amount of tokens allocated to subgraph.\"},\"getSubgraphService()\":{\"notice\":\"Return the address of the subgraph data service.\"},\"getThawRequest(uint8,bytes32)\":{\"notice\":\"Gets a thaw request.\"},\"getThawRequestList(uint8,address,address,address)\":{\"notice\":\"Gets the metadata of a thaw request list. Service provider and delegators each have their own thaw request list per provision. Metadata includes the head and tail of the list, plus the total number of thaw requests.\"},\"getThawedTokens(uint8,address,address,address)\":{\"notice\":\"Gets the amount of thawed tokens that can be releasedfor a given provision.\"},\"getTokensAvailable(address,address,uint32)\":{\"notice\":\"Gets the tokens available in a provision. Tokens available are the tokens in a provision that are not thawing. Includes service provider's and delegator's stake. Allows specifying a `delegationRatio` which caps the amount of delegated tokens that are considered available.\"},\"hasStake(address)\":{\"notice\":\"Getter that returns if an indexer has any stake.\"},\"isAllocation(address)\":{\"notice\":\"Return if allocationID is used.\"},\"isAllowedLockedVerifier(address)\":{\"notice\":\"Return true if the verifier is an allowed locked verifier.\"},\"isAuthorized(address,address,address)\":{\"notice\":\"Check if an operator is authorized for the caller on a specific verifier / data service.\"},\"isDelegationSlashingEnabled()\":{\"notice\":\"Return true if delegation slashing is enabled, false otherwise.\"},\"isOperator(address,address)\":{\"notice\":\"(Legacy) Return true if operator is allowed for the service provider on the subgraph data service.\"},\"legacySlash(address,uint256,uint256,address)\":{\"notice\":\"Slash the indexer stake. Delegated tokens are not subject to slashing. Note that depending on the state of the indexer's stake, the slashed amount might be smaller than the requested slash amount. This can happen if the indexer has moved a significant part of their stake to a provision. Any outstanding slashing amount should be settled using Horizon's slash function {IHorizonStaking.slash}.\"},\"provision(address,address,uint256,uint32,uint64)\":{\"notice\":\"Provision stake to a verifier. The tokens will be locked with a thawing period and will be slashable by the verifier. This is the main mechanism to provision stake to a data service, where the data service is the verifier. This function can be called by the service provider or by an operator authorized by the provider for this specific verifier.\"},\"provisionLocked(address,address,uint256,uint32,uint64)\":{\"notice\":\"Provision stake to a verifier using locked tokens (i.e. from GraphTokenLockWallets).\"},\"redelegate(address,address,address,address,uint256,uint256)\":{\"notice\":\"Re-delegate undelegated tokens from a provision after thawing to a `newServiceProvider` and `newVerifier`.\"},\"reprovision(address,address,address,uint256)\":{\"notice\":\"Move already thawed stake from one provision into another provision This function can be called by the service provider or by an operator authorized by the provider for the two corresponding verifiers.\"},\"setAllowedLockedVerifier(address,bool)\":{\"notice\":\"Sets a verifier as a globally allowed verifier for locked provisions.\"},\"setDelegationFeeCut(address,address,uint8,uint256)\":{\"notice\":\"Set the fee cut for a verifier on a specific payment type.\"},\"setDelegationSlashingEnabled()\":{\"notice\":\"Set the global delegation slashing flag to true.\"},\"setMaxThawingPeriod(uint64)\":{\"notice\":\"Sets the global maximum thawing period allowed for provisions.\"},\"setOperator(address,address,bool)\":{\"notice\":\"Authorize or unauthorize an address to be an operator for the caller on a data service.\"},\"setOperatorLocked(address,address,bool)\":{\"notice\":\"Authorize or unauthorize an address to be an operator for the caller on a verifier.\"},\"setProvisionParameters(address,address,uint32,uint64)\":{\"notice\":\"Stages a provision parameter update. Note that the change is not effective until the verifier calls {acceptProvisionParameters}. Calling this function is a no-op if the new parameters are the same as the current ones.\"},\"slash(address,uint256,uint256,address)\":{\"notice\":\"Slash a service provider. This can only be called by a verifier to which the provider has provisioned stake, and up to the amount of tokens they have provisioned. If the service provider's stake is not enough, the associated delegation pool might be slashed depending on the value of the global delegation slashing flag. Part of the slashed tokens are sent to the `verifierDestination` as a reward.\"},\"stake(uint256)\":{\"notice\":\"Deposit tokens on the staking contract.\"},\"stakeTo(address,uint256)\":{\"notice\":\"Deposit tokens on the service provider stake, on behalf of the service provider.\"},\"stakeToProvision(address,address,uint256)\":{\"notice\":\"Deposit tokens on the service provider stake, on behalf of the service provider, provisioned to a specific verifier.\"},\"thaw(address,address,uint256)\":{\"notice\":\"Start thawing tokens to remove them from a provision. This function can be called by the service provider or by an operator authorized by the provider for this specific verifier. Note that removing tokens from a provision is a two step process: - First the tokens are thawed using this function. - Then after the thawing period, the tokens are removed from the provision using {deprovision} or {reprovision}.\"},\"undelegate(address,address,uint256)\":{\"notice\":\"Undelegate tokens from a provision and start thawing them. Note that undelegating tokens from a provision is a two step process: - First the tokens are thawed using this function. - Then after the thawing period, the tokens are removed from the provision using {withdrawDelegated}. Requirements: - `shares` cannot be zero. Emits a {TokensUndelegated} and {ThawRequestCreated} event.\"},\"undelegate(address,uint256)\":{\"notice\":\"Undelegate tokens from the subgraph data service provision and start thawing them. This function is for backwards compatibility with the legacy staking contract. It only allows undelegating from the subgraph data service.\"},\"unstake(uint256)\":{\"notice\":\"Move idle stake back to the owner's account. Stake is removed from the protocol: - During the transition period it's locked for a period of time before it can be withdrawn by calling {withdraw}. - After the transition period it's immediately withdrawn. Note that after the transition period if there are tokens still locked they will have to be withdrawn by calling {withdraw}.\"},\"withdraw()\":{\"notice\":\"Withdraw service provider tokens once the thawing period (initiated by {unstake}) has passed. All thawed tokens are withdrawn.\"},\"withdrawDelegated(address,address)\":{\"notice\":\"Withdraw undelegated tokens from the subgraph data service provision after thawing. This function is for backwards compatibility with the legacy staking contract. It only allows withdrawing tokens undelegated before horizon upgrade.\"},\"withdrawDelegated(address,address,uint256)\":{\"notice\":\"Withdraw undelegated tokens from a provision after thawing.\"}},\"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.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":\"IHorizonStaking\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol": { + "IPaymentsCollector": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentCollected", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "collect(uint8,bytes)": "7f07d283" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"PaymentCollected\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"It's important to note that it's the collector contract's responsibility to validate the payment request is legitimate.\",\"events\":{\"PaymentCollected(uint8,bytes32,address,address,address,uint256)\":{\"params\":{\"collectionId\":\"The id for the collection. Can be used at the discretion of the collector to group multiple payments.\",\"dataService\":\"The address of the data service\",\"payer\":\"The address of the payer\",\"paymentType\":\"The payment type collected as defined by {IGraphPayments}\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens being collected\"}}},\"kind\":\"dev\",\"methods\":{\"collect(uint8,bytes)\":{\"details\":\"This function should require the caller to present some form of evidence of the payer's debt to the receiver. The collector should validate this evidence and, if valid, collect the payment. Emits a {PaymentCollected} event\",\"params\":{\"data\":\"Additional data required for the payment collection. Will vary depending on the collector implementation.\",\"paymentType\":\"The payment type to collect, as defined by {IGraphPayments}\"},\"returns\":{\"_0\":\"The amount of tokens collected\"}}},\"title\":\"Interface for a payments collector contract as defined by Graph Horizon payments protocol\",\"version\":1},\"userdoc\":{\"events\":{\"PaymentCollected(uint8,bytes32,address,address,address,uint256)\":{\"notice\":\"Emitted when a payment is collected\"}},\"kind\":\"user\",\"methods\":{\"collect(uint8,bytes)\":{\"notice\":\"Initiate a payment collection through the payments protocol\"}},\"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.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol\":\"IPaymentsCollector\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol\":{\"keccak256\":\"0x0871e02129e1fabdb39024f9ac3368b4c747e6b374fdf4fc200d3c225ed82860\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a5fdf2dbedc15f739e6010a3ce3478ea7ad23bd643a8af3f39ccf631c06ebd52\",\"dweb:/ipfs/QmNusbPTqzzUwGomXBzsWHwbZMJ2HuTkxvgviLJZ6hr9i4\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol": { + "IPaymentsEscrow": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInconsistentCollection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBalance", + "type": "uint256" + } + ], + "name": "PaymentsEscrowInsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowIsPaused", + "type": "error" + }, + { + "inputs": [], + "name": "PaymentsEscrowNotThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "currentTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "PaymentsEscrowStillThawing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "thawingPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxWaitPeriod", + "type": "uint256" + } + ], + "name": "PaymentsEscrowThawingPeriodTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "CancelThaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "EscrowCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawEndTimestamp", + "type": "uint256" + } + ], + "name": "Thaw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "cancelThaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "dataService", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dataServiceCut", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiverDestination", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "depositTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "getBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collector", + "type": "address" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "cancelThaw(address,address)": "b1d07de4", + "collect(uint8,address,address,uint256,address,uint256,address)": "1230fa3e", + "deposit(address,address,uint256)": "8340f549", + "depositTo(address,address,address,uint256)": "72eb521e", + "getBalance(address,address,address)": "d6bd603c", + "initialize()": "8129fc1c", + "thaw(address,address,uint256)": "f93f1cd0", + "withdraw(address,address)": "f940e385" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balanceBefore\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balanceAfter\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"PaymentsEscrowInconsistentCollection\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBalance\",\"type\":\"uint256\"}],\"name\":\"PaymentsEscrowInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentsEscrowInvalidZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentsEscrowIsPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentsEscrowNotThawing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"thawEndTimestamp\",\"type\":\"uint256\"}],\"name\":\"PaymentsEscrowStillThawing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"thawingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxWaitPeriod\",\"type\":\"uint256\"}],\"name\":\"PaymentsEscrowThawingPeriodTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensThawing\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"thawEndTimestamp\",\"type\":\"uint256\"}],\"name\":\"CancelThaw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverDestination\",\"type\":\"address\"}],\"name\":\"EscrowCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"thawEndTimestamp\",\"type\":\"uint256\"}],\"name\":\"Thaw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"cancelThaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"dataService\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"dataServiceCut\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiverDestination\",\"type\":\"address\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"thaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"PaymentsEscrowInconsistentCollection(uint256,uint256,uint256)\":[{\"params\":{\"balanceAfter\":\"The balance after the collection\",\"balanceBefore\":\"The balance before the collection\",\"tokens\":\"The amount of tokens collected\"}}],\"PaymentsEscrowInsufficientBalance(uint256,uint256)\":[{\"params\":{\"balance\":\"The current balance\",\"minBalance\":\"The minimum required balance\"}}],\"PaymentsEscrowStillThawing(uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current timestamp\",\"thawEndTimestamp\":\"The timestamp at which the thawing period ends\"}}],\"PaymentsEscrowThawingPeriodTooLong(uint256,uint256)\":[{\"params\":{\"maxWaitPeriod\":\"The maximum wait period\",\"thawingPeriod\":\"The thawing period\"}}]},\"events\":{\"CancelThaw(address,address,address,uint256,uint256)\":{\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"receiver\":\"The address of the receiver\",\"thawEndTimestamp\":\"The timestamp at which the thawing period was ending\",\"tokensThawing\":\"The amount of tokens that were being thawed\"}},\"Deposit(address,address,address,uint256)\":{\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens deposited\"}},\"EscrowCollected(uint8,address,address,address,uint256,address)\":{\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"paymentType\":\"The type of payment being collected as defined in the {IGraphPayments} interface\",\"receiver\":\"The address of the receiver\",\"receiverDestination\":\"The address where the receiver's payment should be sent.\",\"tokens\":\"The amount of tokens collected\"}},\"Thaw(address,address,address,uint256,uint256)\":{\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"receiver\":\"The address of the receiver\",\"thawEndTimestamp\":\"The timestamp at which the thawing period ends\",\"tokens\":\"The amount of tokens being thawed\"}},\"Withdraw(address,address,address,uint256)\":{\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens withdrawn\"}}},\"kind\":\"dev\",\"methods\":{\"cancelThaw(address,address)\":{\"details\":\"Requirements: - The payer must be thawing funds Emits a {CancelThaw} event.\",\"params\":{\"collector\":\"The address of the collector\",\"receiver\":\"The address of the receiver\"}},\"collect(uint8,address,address,uint256,address,uint256,address)\":{\"params\":{\"dataService\":\"The address of the data service\",\"dataServiceCut\":\"The data service cut in PPM that {GraphPayments} should send\",\"payer\":\"The address of the payer\",\"paymentType\":\"The type of payment being collected as defined in the {IGraphPayments} interface\",\"receiver\":\"The address of the receiver\",\"receiverDestination\":\"The address where the receiver's payment should be sent.\",\"tokens\":\"The amount of tokens to collect\"}},\"deposit(address,address,uint256)\":{\"details\":\"Emits a {Deposit} event\",\"params\":{\"collector\":\"The address of the collector\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens to deposit\"}},\"depositTo(address,address,address,uint256)\":{\"details\":\"Emits a {Deposit} event\",\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens to deposit\"}},\"getBalance(address,address,address)\":{\"params\":{\"collector\":\"The address of the collector\",\"payer\":\"The address of the payer\",\"receiver\":\"The address of the receiver\"},\"returns\":{\"_0\":\"The balance of the payer-collector-receiver tuple\"}},\"thaw(address,address,uint256)\":{\"details\":\"Requirements: - `tokens` must be less than or equal to the available balance Emits a {Thaw} event.\",\"params\":{\"collector\":\"The address of the collector\",\"receiver\":\"The address of the receiver\",\"tokens\":\"The amount of tokens to thaw\"}},\"withdraw(address,address)\":{\"details\":\"Requirements: - Funds must be thawed Emits a {Withdraw} event\",\"params\":{\"collector\":\"The address of the collector\",\"receiver\":\"The address of the receiver\"}}},\"title\":\"Interface for the {PaymentsEscrow} contract\",\"version\":1},\"userdoc\":{\"errors\":{\"PaymentsEscrowInconsistentCollection(uint256,uint256,uint256)\":[{\"notice\":\"Thrown when the contract balance is not consistent with the collection amount\"}],\"PaymentsEscrowInsufficientBalance(uint256,uint256)\":[{\"notice\":\"Thrown when the available balance is insufficient to perform an operation\"}],\"PaymentsEscrowInvalidZeroTokens()\":[{\"notice\":\"Thrown when operating a zero token amount is not allowed.\"}],\"PaymentsEscrowIsPaused()\":[{\"notice\":\"Thrown when a protected function is called and the contract is paused.\"}],\"PaymentsEscrowNotThawing()\":[{\"notice\":\"Thrown when a thawing is expected to be in progress but it is not\"}],\"PaymentsEscrowStillThawing(uint256,uint256)\":[{\"notice\":\"Thrown when a thawing is still in progress\"}],\"PaymentsEscrowThawingPeriodTooLong(uint256,uint256)\":[{\"notice\":\"Thrown when setting the thawing period to a value greater than the maximum\"}]},\"events\":{\"CancelThaw(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a payer cancels an escrow thawing\"},\"Deposit(address,address,address,uint256)\":{\"notice\":\"Emitted when a payer deposits funds into the escrow for a payer-collector-receiver tuple\"},\"EscrowCollected(uint8,address,address,address,uint256,address)\":{\"notice\":\"Emitted when a collector collects funds from the escrow for a payer-collector-receiver tuple\"},\"Thaw(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a payer thaws funds from the escrow for a payer-collector-receiver tuple\"},\"Withdraw(address,address,address,uint256)\":{\"notice\":\"Emitted when a payer withdraws funds from the escrow for a payer-collector-receiver tuple\"}},\"kind\":\"user\",\"methods\":{\"cancelThaw(address,address)\":{\"notice\":\"Cancels the thawing of escrow from a payer-collector-receiver's escrow account.\"},\"collect(uint8,address,address,uint256,address,uint256,address)\":{\"notice\":\"Collects funds from the payer-collector-receiver's escrow and sends them to {GraphPayments} for distribution using the Graph Horizon Payments protocol. The function will revert if there are not enough funds in the escrow. Emits an {EscrowCollected} event\"},\"deposit(address,address,uint256)\":{\"notice\":\"Deposits funds into the escrow for a payer-collector-receiver tuple, where the payer is the transaction caller.\"},\"depositTo(address,address,address,uint256)\":{\"notice\":\"Deposits funds into the escrow for a payer-collector-receiver tuple, where the payer can be specified.\"},\"getBalance(address,address,address)\":{\"notice\":\"Get the balance of a payer-collector-receiver tuple This function will return 0 if the current balance is less than the amount of funds being thawed.\"},\"initialize()\":{\"notice\":\"Initialize the contract\"},\"thaw(address,address,uint256)\":{\"notice\":\"Thaw a specific amount of escrow from a payer-collector-receiver's escrow account. The payer is the transaction caller. Note that repeated calls to this function will overwrite the previous thawing amount and reset the thawing period.\"},\"withdraw(address,address)\":{\"notice\":\"Withdraws all thawed escrow from a payer-collector-receiver's escrow account. The payer is the transaction caller. Note that the withdrawn funds might be less than the thawed amount if there were payment collections in the meantime.\"}},\"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. Payers deposit funds on the escrow, signalling their ability to pay for a service, and only being able to retrieve them after a thawing period. Receivers collect funds from the escrow, provided the payer has authorized them. The payer authorization is delegated to a payment collector contract which implements the {IPaymentsCollector} interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":\"IPaymentsEscrow\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol": { + "IHorizonStakingBase": { + "abi": [ + { + "inputs": [], + "name": "HorizonStakingInvalidThawRequestType", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeDeposited", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegatedTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "getDelegation", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Delegation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "getDelegationFeeCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getDelegationPool", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.DelegationPool", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getIdleStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProviderTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "getProvision", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensThawing", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sharesThawing", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "createdAt", + "type": "uint64" + }, + { + "internalType": "uint32", + "name": "maxVerifierCutPending", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriodPending", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "lastParametersStagedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.Provision", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getServiceProvider", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "tokensStaked", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensProvisioned", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ServiceProvider", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "getStake", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "thawRequestType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + } + ], + "name": "getThawRequest", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "nextRequest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "thawingNonce", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingTypes.ThawRequest", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "thawRequestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawRequestList", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "internalType": "struct LinkedList.List", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "thawRequestType", + "type": "uint8" + }, + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "getThawedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "getTokensAvailable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "isAllowedLockedVerifier", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDelegationSlashingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "getDelegatedTokensAvailable(address,address)": "fb744cc0", + "getDelegation(address,address,address)": "ccebcabb", + "getDelegationFeeCut(address,address,uint8)": "7573ef4f", + "getDelegationPool(address,address)": "561285e4", + "getIdleStake(address)": "a784d498", + "getMaxThawingPeriod()": "39514ad2", + "getProviderTokensAvailable(address,address)": "08ce5f68", + "getProvision(address,address)": "25d9897e", + "getServiceProvider(address)": "8cc01c86", + "getStake(address)": "7a766460", + "getThawRequest(uint8,bytes32)": "d48de845", + "getThawRequestList(uint8,address,address,address)": "e56f8a1d", + "getThawedTokens(uint8,address,address,address)": "2f7cc501", + "getTokensAvailable(address,address,uint32)": "872d0489", + "isAllowedLockedVerifier(address)": "ae4fe67a", + "isDelegationSlashingEnabled()": "fc54fb27" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"HorizonStakingInvalidThawRequestType\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakeDeposited\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getDelegatedTokensAvailable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"getDelegation\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.Delegation\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"}],\"name\":\"getDelegationFeeCut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getDelegationPool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"thawingNonce\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.DelegationPool\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"getIdleStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMaxThawingPeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getProviderTokensAvailable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"getProvision\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sharesThawing\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"createdAt\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCutPending\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriodPending\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"lastParametersStagedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"thawingNonce\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.Provision\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"getServiceProvider\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"tokensStaked\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensProvisioned\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.ServiceProvider\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"getStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"thawRequestType\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"thawRequestId\",\"type\":\"bytes32\"}],\"name\":\"getThawRequest\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"thawingUntil\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"nextRequest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"thawingNonce\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingTypes.ThawRequest\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"thawRequestType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getThawRequestList\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"head\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tail\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"internalType\":\"struct LinkedList.List\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"thawRequestType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"getThawedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"delegationRatio\",\"type\":\"uint32\"}],\"name\":\"getTokensAvailable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isAllowedLockedVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDelegationSlashingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision functions take `serviceProvider` and `verifier` addresses.\",\"events\":{\"HorizonStakeDeposited(address,uint256)\":{\"details\":\"TRANSITION PERIOD: After transition period move to IHorizonStakingMain. Temporarily it needs to be here since it's emitted by {_stake} which is used by both {HorizonStaking} and {HorizonStakingExtension}.\",\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens staked.\"}}},\"kind\":\"dev\",\"methods\":{\"getDelegatedTokensAvailable(address,address)\":{\"details\":\"Calculated as the tokens available minus the tokens thawing.\",\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of tokens available.\"}},\"getDelegation(address,address,address)\":{\"params\":{\"delegator\":\"The address of the delegator.\",\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The delegation details.\"}},\"getDelegationFeeCut(address,address,uint8)\":{\"params\":{\"paymentType\":\"The payment type as defined by {IGraphPayments.PaymentTypes}.\",\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The delegation fee cut in PPM.\"}},\"getDelegationPool(address,address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The delegation pool details.\"}},\"getIdleStake(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens that are idle.\"}},\"getMaxThawingPeriod()\":{\"returns\":{\"_0\":\"The maximum allowed thawing period in seconds.\"}},\"getProviderTokensAvailable(address,address)\":{\"details\":\"Calculated as the tokens available minus the tokens thawing.\",\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of tokens available.\"}},\"getProvision(address,address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The provision details.\"}},\"getServiceProvider(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The service provider details.\"}},\"getStake(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens staked.\"}},\"getThawRequest(uint8,bytes32)\":{\"params\":{\"thawRequestId\":\"The id of the thaw request.\",\"thawRequestType\":\"The type of thaw request.\"},\"returns\":{\"_0\":\"The thaw request details.\"}},\"getThawRequestList(uint8,address,address,address)\":{\"params\":{\"owner\":\"The owner of the thaw requests. Use either the service provider or delegator address.\",\"serviceProvider\":\"The address of the service provider.\",\"thawRequestType\":\"The type of thaw request.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The thaw requests list metadata.\"}},\"getThawedTokens(uint8,address,address,address)\":{\"details\":\"Note that the value returned by this function does not return the total amount of thawed tokens but only those that can be released. If thaw requests are created with different thawing periods it's possible that an unexpired thaw request temporarily blocks the release of other ones that have already expired. This function will stop counting when it encounters the first thaw request that is not yet expired.\",\"params\":{\"owner\":\"The owner of the thaw requests. Use either the service provider or delegator address.\",\"serviceProvider\":\"The address of the service provider.\",\"thawRequestType\":\"The type of thaw request.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of thawed tokens.\"}},\"getTokensAvailable(address,address,uint32)\":{\"params\":{\"delegationRatio\":\"The delegation ratio.\",\"serviceProvider\":\"The address of the service provider.\",\"verifier\":\"The address of the verifier.\"},\"returns\":{\"_0\":\"The amount of tokens available.\"}},\"isAllowedLockedVerifier(address)\":{\"params\":{\"verifier\":\"Address of the verifier\"},\"returns\":{\"_0\":\"True if verifier is allowed locked verifier, false otherwise\"}},\"isDelegationSlashingEnabled()\":{\"returns\":{\"_0\":\"True if delegation slashing is enabled, false otherwise\"}}},\"title\":\"Interface for the {HorizonStakingBase} contract.\",\"version\":1},\"userdoc\":{\"errors\":{\"HorizonStakingInvalidThawRequestType()\":[{\"notice\":\"Thrown when using an invalid thaw request type.\"}]},\"events\":{\"HorizonStakeDeposited(address,uint256)\":{\"notice\":\"Emitted when a service provider stakes tokens.\"}},\"kind\":\"user\",\"methods\":{\"getDelegatedTokensAvailable(address,address)\":{\"notice\":\"Gets the delegator's tokens available in a provision.\"},\"getDelegation(address,address,address)\":{\"notice\":\"Gets the details of a delegation.\"},\"getDelegationFeeCut(address,address,uint8)\":{\"notice\":\"Gets the delegation fee cut for a payment type.\"},\"getDelegationPool(address,address)\":{\"notice\":\"Gets the details of delegation pool.\"},\"getIdleStake(address)\":{\"notice\":\"Gets the service provider's idle stake which is the stake that is not being used for any provision. Note that this only includes service provider's self stake.\"},\"getMaxThawingPeriod()\":{\"notice\":\"Gets the maximum allowed thawing period for a provision.\"},\"getProviderTokensAvailable(address,address)\":{\"notice\":\"Gets the service provider's tokens available in a provision.\"},\"getProvision(address,address)\":{\"notice\":\"Gets the details of a provision.\"},\"getServiceProvider(address)\":{\"notice\":\"Gets the details of a service provider.\"},\"getStake(address)\":{\"notice\":\"Gets the stake of a service provider.\"},\"getThawRequest(uint8,bytes32)\":{\"notice\":\"Gets a thaw request.\"},\"getThawRequestList(uint8,address,address,address)\":{\"notice\":\"Gets the metadata of a thaw request list. Service provider and delegators each have their own thaw request list per provision. Metadata includes the head and tail of the list, plus the total number of thaw requests.\"},\"getThawedTokens(uint8,address,address,address)\":{\"notice\":\"Gets the amount of thawed tokens that can be releasedfor a given provision.\"},\"getTokensAvailable(address,address,uint32)\":{\"notice\":\"Gets the tokens available in a provision. Tokens available are the tokens in a provision that are not thawing. Includes service provider's and delegator's stake. Allows specifying a `delegationRatio` which caps the amount of delegated tokens that are considered available.\"},\"isAllowedLockedVerifier(address)\":{\"notice\":\"Return true if the verifier is an allowed locked verifier.\"},\"isDelegationSlashingEnabled()\":{\"notice\":\"Return true if delegation slashing is enabled, false otherwise.\"}},\"notice\":\"Provides getters for {HorizonStaking} and {HorizonStakingExtension} storage variables.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":\"IHorizonStakingBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol": { + "IHorizonStakingExtension": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isPublic", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "assetHolder", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolTax", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "curationFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queryFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "queryRebates", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delegationRewards", + "type": "uint256" + } + ], + "name": "RebateCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "StakeSlashed", + "type": "event" + }, + { + "inputs": [], + "name": "__DEPRECATED_getThawingPeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "closeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "collect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAtEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "collectedFees", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "__DEPRECATED_effectiveAllocation", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "distributedRebates", + "type": "uint256" + } + ], + "internalType": "struct IHorizonStakingExtension.Allocation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "getAllocationState", + "outputs": [ + { + "internalType": "enum IHorizonStakingExtension.AllocationState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getIndexerStakedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSubgraphService", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "hasStake", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationID", + "type": "address" + } + ], + "name": "isAllocation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reward", + "type": "uint256" + }, + { + "internalType": "address", + "name": "beneficiary", + "type": "address" + } + ], + "name": "legacySlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "__DEPRECATED_getThawingPeriod()": "c0641994", + "closeAllocation(address,bytes32)": "44c32a61", + "collect(uint256,address)": "8d3c100a", + "getAllocation(address)": "0e022923", + "getAllocationData(address)": "55c85269", + "getAllocationState(address)": "98c657dc", + "getIndexerStakedTokens(address)": "1787e69f", + "getSubgraphAllocatedTokens(bytes32)": "e2e1e8e9", + "getSubgraphService()": "9363c522", + "hasStake(address)": "e73e14bf", + "isAllocation(address)": "f1d60d66", + "isOperator(address,address)": "b6363cf2", + "legacySlash(address,uint256,uint256,address)": "4488a382" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"}],\"name\":\"AllocationClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"assetHolder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"protocolTax\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"curationFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"queryFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"queryRebates\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delegationRewards\",\"type\":\"uint256\"}],\"name\":\"RebateCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"StakeSlashed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"__DEPRECATED_getThawingPeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"}],\"name\":\"closeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"getAllocation\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAtEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"closedAtEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"collectedFees\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"__DEPRECATED_effectiveAllocation\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"distributedRebates\",\"type\":\"uint256\"}],\"internalType\":\"struct IHorizonStakingExtension.Allocation\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getAllocationData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPending\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"getAllocationState\",\"outputs\":[{\"internalType\":\"enum IHorizonStakingExtension.AllocationState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"getIndexerStakedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"getSubgraphAllocatedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSubgraphService\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"hasStake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationID\",\"type\":\"address\"}],\"name\":\"isAllocation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"isOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"}],\"name\":\"legacySlash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"events\":{\"AllocationClosed(address,bytes32,uint256,uint256,address,address,bytes32,bool)\":{\"details\":\"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.\",\"params\":{\"allocationID\":\"The allocation identifier\",\"epoch\":\"The protocol epoch the allocation was closed on\",\"indexer\":\"The indexer address\",\"isPublic\":\"True if the allocation was force closed by someone other than the indexer/operator\",\"poi\":\"The proof of indexing submitted by the sender\",\"sender\":\"The address closing the allocation\",\"subgraphDeploymentID\":\"The subgraph deployment ID\",\"tokens\":\"The amount of tokens unallocated from the allocation\"}},\"RebateCollected(address,address,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)\":{\"details\":\"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.\",\"params\":{\"allocationID\":\"The allocation identifier\",\"assetHolder\":\"The address of the asset holder, the entity paying the query fees\",\"curationFees\":\"The amount of tokens distributed to the curation pool\",\"delegationRewards\":\"The amount of tokens collected from the delegation pool\",\"epoch\":\"The protocol epoch the rebate was collected on\",\"indexer\":\"The indexer address\",\"protocolTax\":\"The amount of tokens burnt as protocol tax\",\"queryFees\":\"The amount of tokens collected as query fees\",\"queryRebates\":\"The amount of tokens distributed to the indexer\",\"subgraphDeploymentID\":\"The subgraph deployment ID\",\"tokens\":\"The amount of tokens collected\"}},\"StakeSlashed(address,uint256,uint256,address)\":{\"details\":\"Emitted when `indexer` was slashed for a total of `tokens` amount. Tracks `reward` amount of tokens given to `beneficiary`.\",\"params\":{\"beneficiary\":\"The address of a beneficiary to receive a reward for the slashing\",\"indexer\":\"The indexer address\",\"reward\":\"The amount of reward tokens to send to a beneficiary\",\"tokens\":\"The amount of tokens slashed\"}}},\"kind\":\"dev\",\"methods\":{\"__DEPRECATED_getThawingPeriod()\":{\"returns\":{\"_0\":\"Thawing period in blocks\"}},\"closeAllocation(address,bytes32)\":{\"params\":{\"allocationID\":\"The allocation identifier\",\"poi\":\"Proof of indexing submitted for the allocated period\"}},\"collect(uint256,address)\":{\"details\":\"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 total amount rebated, the total amount collected and compensating the indexer for the difference.\",\"params\":{\"allocationID\":\"Allocation where the tokens will be assigned\",\"tokens\":\"Amount of tokens to collect\"}},\"getAllocation(address)\":{\"params\":{\"allocationID\":\"Address used as allocation identifier\"},\"returns\":{\"_0\":\"Allocation data\"}},\"getAllocationData(address)\":{\"details\":\"Get allocation data to calculate rewards issuance \",\"params\":{\"allocationId\":\"The allocation Id\"},\"returns\":{\"accRewardsPending\":\"Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed\",\"accRewardsPerAllocatedToken\":\"Rewards snapshot\",\"indexer\":\"The indexer address\",\"isActive\":\"Whether the allocation is active or not\",\"subgraphDeploymentId\":\"Subgraph deployment id for the allocation\",\"tokens\":\"Amount of allocated tokens\"}},\"getAllocationState(address)\":{\"params\":{\"allocationID\":\"Allocation identifier\"},\"returns\":{\"_0\":\"AllocationState enum with the state of the allocation\"}},\"getIndexerStakedTokens(address)\":{\"params\":{\"indexer\":\"Address of the indexer\"},\"returns\":{\"_0\":\"Amount of tokens staked by the indexer\"}},\"getSubgraphAllocatedTokens(bytes32)\":{\"params\":{\"_subgraphDeploymentId\":\"Deployment Id for the subgraph\"},\"returns\":{\"_0\":\"Total tokens allocated to subgraph\"}},\"getSubgraphService()\":{\"details\":\"TRANSITION PERIOD: After transition period move to main HorizonStaking contract\",\"returns\":{\"_0\":\"Address of the subgraph data service\"}},\"hasStake(address)\":{\"params\":{\"indexer\":\"Address of the indexer\"},\"returns\":{\"_0\":\"True if indexer has staked tokens\"}},\"isAllocation(address)\":{\"params\":{\"allocationID\":\"Address used as signer by the indexer for an allocation\"},\"returns\":{\"_0\":\"True if allocationID already used\"}},\"isOperator(address,address)\":{\"params\":{\"indexer\":\"Address of the service provider\",\"operator\":\"Address of the operator\"},\"returns\":{\"_0\":\"True if operator is allowed for indexer, false otherwise\"}},\"legacySlash(address,uint256,uint256,address)\":{\"details\":\"Can only be called by the slasher role.\",\"params\":{\"beneficiary\":\"Address of a beneficiary to receive a reward for the slashing\",\"indexer\":\"Address of indexer to slash\",\"reward\":\"Amount of reward tokens to send to a beneficiary\",\"tokens\":\"Amount of tokens to slash from the indexer stake\"}}},\"title\":\"Interface for {HorizonStakingExtension} contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"__DEPRECATED_getThawingPeriod()\":{\"notice\":\"Return the time in blocks to unstake Deprecated, now enforced by each data service (verifier)\"},\"closeAllocation(address,bytes32)\":{\"notice\":\"Close an allocation and free the staked tokens. 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\"},\"getAllocation(address)\":{\"notice\":\"Return the allocation by ID.\"},\"getAllocationState(address)\":{\"notice\":\"Return the current state of an allocation\"},\"getIndexerStakedTokens(address)\":{\"notice\":\"Get the total amount of tokens staked by the indexer.\"},\"getSubgraphAllocatedTokens(bytes32)\":{\"notice\":\"Return the total amount of tokens allocated to subgraph.\"},\"getSubgraphService()\":{\"notice\":\"Return the address of the subgraph data service.\"},\"hasStake(address)\":{\"notice\":\"Getter that returns if an indexer has any stake.\"},\"isAllocation(address)\":{\"notice\":\"Return if allocationID is used.\"},\"isOperator(address,address)\":{\"notice\":\"(Legacy) Return true if operator is allowed for the service provider on the subgraph data service.\"},\"legacySlash(address,uint256,uint256,address)\":{\"notice\":\"Slash the indexer stake. Delegated tokens are not subject to slashing. Note that depending on the state of the indexer's stake, the slashed amount might be smaller than the requested slash amount. This can happen if the indexer has moved a significant part of their stake to a provision. Any outstanding slashing amount should be settled using Horizon's slash function {IHorizonStaking.slash}.\"}},\"notice\":\"Provides functions for managing legacy allocations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":\"IHorizonStakingExtension\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol": { + "IHorizonStakingMain": { + "abi": [ + { + "inputs": [], + "name": "HorizonStakingCallerIsServiceProvider", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientDelegationTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientIdleStake", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientShares", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientStakeForLegacyAllocations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minRequired", + "type": "uint256" + } + ], + "name": "HorizonStakingInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "HorizonStakingInvalidDelegationFeeCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPool", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidDelegationPoolState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + } + ], + "name": "HorizonStakingInvalidMaxVerifierCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidProvision", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidServiceProviderZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "HorizonStakingInvalidThawingPeriod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingInvalidVerifier", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidVerifierZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroShares", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingInvalidZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingLegacySlashFailed", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNoTokensToSlash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "HorizonStakingNotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingNothingToWithdraw", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingProvisionAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minShares", + "type": "uint256" + } + ], + "name": "HorizonStakingSlippageProtection", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakingStillThawing", + "type": "error" + }, + { + "inputs": [], + "name": "HorizonStakingTooManyThawRequests", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokens", + "type": "uint256" + } + ], + "name": "HorizonStakingTooManyTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "HorizonStakingVerifierNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "AllowedLockedVerifierSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegatedTokensWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "DelegationFeeCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "DelegationSlashingEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DelegationSlashingSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "until", + "type": "uint256" + } + ], + "name": "HorizonStakeLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "HorizonStakeWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "MaxThawingPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "OperatorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "ProvisionParametersStaged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ProvisionThawed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "StakeDelegatedWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "ThawRequestCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "thawRequestId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "thawingUntil", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bool", + "name": "valid", + "type": "bool" + } + ], + "name": "ThawRequestFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IHorizonStakingTypes.ThawRequestType", + "name": "requestType", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "thawRequestsFulfilled", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ThawRequestsFulfilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "ThawingPeriodCleared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensDelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensDeprovisioned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "TokensToDelegationPoolAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "TokensUndelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "destination", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "VerifierTokensSent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "acceptProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToDelegationPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "addToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clearThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minSharesOut", + "type": "uint256" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "deprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getStakingExtension", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isAuthorized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "provisionLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oldServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newServiceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minSharesForNewProvider", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "redelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "oldVerifier", + "type": "address" + }, + { + "internalType": "address", + "name": "newVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "reprovision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setAllowedLockedVerifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "feeCut", + "type": "uint256" + } + ], + "name": "setDelegationFeeCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "setDelegationSlashingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "maxThawingPeriod", + "type": "uint64" + } + ], + "name": "setMaxThawingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setOperatorLocked", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint32", + "name": "maxVerifierCut", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "thawingPeriod", + "type": "uint64" + } + ], + "name": "setProvisionParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensVerifier", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifierDestination", + "type": "address" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "stakeToProvision", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "thaw", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "unstake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "verifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nThawRequests", + "type": "uint256" + } + ], + "name": "withdrawDelegated", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "deprecated", + "type": "address" + } + ], + "name": "withdrawDelegated", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionParameters(address)": "3a78b732", + "addToDelegationPool(address,address,uint256)": "ca94b0e9", + "addToProvision(address,address,uint256)": "fecc9cc1", + "clearThawingPeriod()": "e473522a", + "delegate(address,address,uint256,uint256)": "6230001a", + "delegate(address,uint256)": "026e402b", + "deprovision(address,address,uint256)": "21195373", + "getStakingExtension()": "66ee1b28", + "isAuthorized(address,address,address)": "7c145cc7", + "provision(address,address,uint256,uint32,uint64)": "010167e5", + "provisionLocked(address,address,uint256,uint32,uint64)": "82d66cb8", + "redelegate(address,address,address,address,uint256,uint256)": "f64b3598", + "reprovision(address,address,address,uint256)": "ba7fb0b4", + "setAllowedLockedVerifier(address,bool)": "4ca7ac22", + "setDelegationFeeCut(address,address,uint8,uint256)": "42c51693", + "setDelegationSlashingEnabled()": "ef58bd67", + "setMaxThawingPeriod(uint64)": "259bc435", + "setOperator(address,address,bool)": "bc735d90", + "setOperatorLocked(address,address,bool)": "ad4d35b5", + "setProvisionParameters(address,address,uint32,uint64)": "81e21b56", + "slash(address,uint256,uint256,address)": "e76fede6", + "stake(uint256)": "a694fc3a", + "stakeTo(address,uint256)": "a2a31722", + "stakeToProvision(address,address,uint256)": "74612092", + "thaw(address,address,uint256)": "f93f1cd0", + "undelegate(address,address,uint256)": "a02b9426", + "undelegate(address,uint256)": "4d99dd16", + "unstake(uint256)": "2e17de78", + "withdraw()": "3ccfd60b", + "withdrawDelegated(address,address)": "51a60b02", + "withdrawDelegated(address,address,uint256)": "3993d849" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"HorizonStakingCallerIsServiceProvider\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientDelegationTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientIdleStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minShares\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientShares\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientStakeForLegacyAllocations\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minRequired\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInsufficientTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"feeCut\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingInvalidDelegationFeeCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidDelegationPool\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidDelegationPoolState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"}],\"name\":\"HorizonStakingInvalidMaxVerifierCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidProvision\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidServiceProviderZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxThawingPeriod\",\"type\":\"uint64\"}],\"name\":\"HorizonStakingInvalidThawingPeriod\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingInvalidVerifier\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidVerifierZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidZeroShares\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingInvalidZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingLegacySlashFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingNoTokensToSlash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"HorizonStakingNotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingNothingThawing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingNothingToWithdraw\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingProvisionAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minShares\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingSlippageProtection\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"until\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingStillThawing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HorizonStakingTooManyThawRequests\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakingTooManyTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"HorizonStakingVerifierNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"AllowedLockedVerifierSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DelegatedTokensWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeCut\",\"type\":\"uint256\"}],\"name\":\"DelegationFeeCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DelegationSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"DelegationSlashingEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DelegationSlashingSkipped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"until\",\"type\":\"uint256\"}],\"name\":\"HorizonStakeLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"HorizonStakeWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxThawingPeriod\",\"type\":\"uint64\"}],\"name\":\"MaxThawingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"OperatorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"ProvisionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ProvisionIncreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"ProvisionParametersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"ProvisionParametersStaged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ProvisionSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ProvisionThawed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"StakeDelegatedWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"requestType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingUntil\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"thawRequestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"ThawRequestCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"requestType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"thawRequestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"thawingUntil\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"ThawRequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum IHorizonStakingTypes.ThawRequestType\",\"name\":\"requestType\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"thawRequestsFulfilled\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ThawRequestsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ThawingPeriodCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"TokensDelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensDeprovisioned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensToDelegationPoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"TokensUndelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"VerifierTokensSent\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"acceptProvisionParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"addToDelegationPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"addToProvision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearThawingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSharesOut\",\"type\":\"uint256\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"deprovision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakingExtension\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isAuthorized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"provision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"provisionLocked\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oldServiceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newServiceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minSharesForNewProvider\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"redelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"reprovision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setAllowedLockedVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"feeCut\",\"type\":\"uint256\"}],\"name\":\"setDelegationFeeCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setDelegationSlashingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"maxThawingPeriod\",\"type\":\"uint64\"}],\"name\":\"setMaxThawingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setOperatorLocked\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxVerifierCut\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"thawingPeriod\",\"type\":\"uint64\"}],\"name\":\"setProvisionParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensVerifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifierDestination\",\"type\":\"address\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"stakeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"stakeToProvision\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"thaw\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"undelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"undelegate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nThawRequests\",\"type\":\"uint256\"}],\"name\":\"withdrawDelegated\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"deprecated\",\"type\":\"address\"}],\"name\":\"withdrawDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"Note that this interface only includes the functions implemented by {HorizonStaking} contract, and not those implemented by {HorizonStakingExtension}. Do not use this interface to interface with the {HorizonStaking} contract, use {IHorizonStaking} for the complete interface.Most functions operate over {HorizonStaking} provisions. To uniquely identify a provision functions take `serviceProvider` and `verifier` addresses.TRANSITION PERIOD: After transition period rename to IHorizonStaking.\",\"errors\":{\"HorizonStakingInsufficientDelegationTokens(uint256,uint256)\":[{\"params\":{\"minTokens\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInsufficientIdleStake(uint256,uint256)\":[{\"params\":{\"minTokens\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInsufficientShares(uint256,uint256)\":[{\"params\":{\"minShares\":\"The minimum required share amount\",\"shares\":\"The actual share amount\"}}],\"HorizonStakingInsufficientStakeForLegacyAllocations(uint256,uint256)\":[{\"params\":{\"minTokens\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInsufficientTokens(uint256,uint256)\":[{\"params\":{\"minRequired\":\"The minimum required token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingInvalidDelegationFeeCut(uint256)\":[{\"params\":{\"feeCut\":\"The fee cut\"}}],\"HorizonStakingInvalidDelegationPool(address,address)\":[{\"params\":{\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingInvalidDelegationPoolState(address,address)\":[{\"params\":{\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingInvalidMaxVerifierCut(uint32)\":[{\"params\":{\"maxVerifierCut\":\"The maximum verifier cut\"}}],\"HorizonStakingInvalidProvision(address,address)\":[{\"params\":{\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingInvalidThawingPeriod(uint64,uint64)\":[{\"params\":{\"maxThawingPeriod\":\"The maximum `thawingPeriod` allowed\",\"thawingPeriod\":\"The thawing period\"}}],\"HorizonStakingInvalidVerifier(address)\":[{\"params\":{\"verifier\":\"The verifier address\"}}],\"HorizonStakingNotAuthorized(address,address,address)\":[{\"params\":{\"caller\":\"The caller address\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}],\"HorizonStakingSlippageProtection(uint256,uint256)\":[{\"params\":{\"minShares\":\"The minimum required share amount\",\"shares\":\"The actual share amount\"}}],\"HorizonStakingStillThawing(uint256)\":[{\"details\":\"Note this thawing refers to the global thawing period applied to legacy allocated tokens, it does not refer to thaw requests.\",\"params\":{\"until\":\"The block number until the stake is locked\"}}],\"HorizonStakingTooManyTokens(uint256,uint256)\":[{\"params\":{\"maxTokens\":\"The maximum allowed token amount\",\"tokens\":\"The actual token amount\"}}],\"HorizonStakingVerifierNotAllowed(address)\":[{\"details\":\"Only applies to stake from locked wallets.\",\"params\":{\"verifier\":\"The verifier address\"}}]},\"events\":{\"AllowedLockedVerifierSet(address,bool)\":{\"params\":{\"allowed\":\"Whether the verifier is allowed or disallowed\",\"verifier\":\"The address of the verifier\"}},\"DelegatedTokensWithdrawn(address,address,address,uint256)\":{\"params\":{\"delegator\":\"The address of the delegator\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens withdrawn\",\"verifier\":\"The address of the verifier\"}},\"DelegationFeeCutSet(address,address,uint8,uint256)\":{\"params\":{\"feeCut\":\"The fee cut set, in PPM\",\"paymentType\":\"The payment type for which the fee cut is set, as defined in {IGraphPayments}\",\"serviceProvider\":\"The address of the service provider\",\"verifier\":\"The address of the verifier\"}},\"DelegationSlashed(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens slashed (note this only represents delegation pool's slashed stake)\",\"verifier\":\"The address of the verifier\"}},\"DelegationSlashingSkipped(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens that would have been slashed (note this only represents delegation pool's slashed stake)\",\"verifier\":\"The address of the verifier\"}},\"HorizonStakeLocked(address,uint256,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens now locked (including previously locked tokens)\",\"until\":\"The block number until the stake is locked\"}},\"HorizonStakeWithdrawn(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens withdrawn\"}},\"MaxThawingPeriodSet(uint64)\":{\"params\":{\"maxThawingPeriod\":\"The new maximum thawing period\"}},\"OperatorSet(address,address,address,bool)\":{\"details\":\"Emitted when an operator is allowed or denied by a service provider for a particular verifier\",\"params\":{\"allowed\":\"Whether the operator is allowed or denied\",\"operator\":\"The address of the operator\",\"serviceProvider\":\"The address of the service provider\",\"verifier\":\"The address of the verifier\"}},\"ProvisionCreated(address,address,uint256,uint32,uint64)\":{\"params\":{\"maxVerifierCut\":\"The maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The address of the service provider\",\"thawingPeriod\":\"The period in seconds that the tokens will be thawing before they can be removed from the provision\",\"tokens\":\"The amount of tokens provisioned\",\"verifier\":\"The address of the verifier\"}},\"ProvisionIncreased(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens added to the provision\",\"verifier\":\"The address of the verifier\"}},\"ProvisionParametersSet(address,address,uint32,uint64)\":{\"params\":{\"maxVerifierCut\":\"The new maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The address of the service provider\",\"thawingPeriod\":\"The new period in seconds that the tokens will be thawing before they can be removed from the provision\",\"verifier\":\"The address of the verifier\"}},\"ProvisionParametersStaged(address,address,uint32,uint64)\":{\"params\":{\"maxVerifierCut\":\"The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The address of the service provider\",\"thawingPeriod\":\"The proposed period in seconds that the tokens will be thawing before they can be removed from the provision\",\"verifier\":\"The address of the verifier\"}},\"ProvisionSlashed(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens slashed (note this only represents service provider's slashed stake)\",\"verifier\":\"The address of the verifier\"}},\"ProvisionThawed(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens thawed\",\"verifier\":\"The address of the verifier\"}},\"StakeDelegatedWithdrawn(address,address,uint256)\":{\"details\":\"This event is for the legacy `withdrawDelegated` function.\",\"params\":{\"delegator\":\"The address of the delegator\",\"indexer\":\"The address of the indexer\",\"tokens\":\"The amount of tokens withdrawn\"}},\"ThawRequestCreated(uint8,address,address,address,uint256,uint64,bytes32,uint256)\":{\"details\":\"Can be emitted by the service provider when thawing stake or by the delegator when undelegating.\",\"params\":{\"nonce\":\"The nonce of the thaw request\",\"owner\":\"The address of the owner of the thaw request.\",\"requestType\":\"The type of thaw request\",\"serviceProvider\":\"The address of the service provider\",\"shares\":\"The amount of shares being thawed\",\"thawRequestId\":\"The ID of the thaw request\",\"thawingUntil\":\"The timestamp until the stake is thawed\",\"verifier\":\"The address of the verifier\"}},\"ThawRequestFulfilled(uint8,bytes32,uint256,uint256,uint64,bool)\":{\"params\":{\"requestType\":\"The type of thaw request\",\"shares\":\"The amount of shares being released\",\"thawRequestId\":\"The ID of the thaw request\",\"thawingUntil\":\"The timestamp until the stake has thawed\",\"tokens\":\"The amount of tokens being released\",\"valid\":\"Whether the thaw request was valid at the time of fulfillment\"}},\"ThawRequestsFulfilled(uint8,address,address,address,uint256,uint256)\":{\"params\":{\"owner\":\"The address of the owner of the thaw requests\",\"requestType\":\"The type of thaw request\",\"serviceProvider\":\"The address of the service provider\",\"thawRequestsFulfilled\":\"The number of thaw requests fulfilled\",\"tokens\":\"The total amount of tokens being released\",\"verifier\":\"The address of the verifier\"}},\"ThawingPeriodCleared()\":{\"details\":\"This marks the end of the transition period.\"},\"TokensDelegated(address,address,address,uint256,uint256)\":{\"params\":{\"delegator\":\"The address of the delegator\",\"serviceProvider\":\"The address of the service provider\",\"shares\":\"The amount of shares delegated\",\"tokens\":\"The amount of tokens delegated\",\"verifier\":\"The address of the verifier\"}},\"TokensDeprovisioned(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens removed\",\"verifier\":\"The address of the verifier\"}},\"TokensToDelegationPoolAdded(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens withdrawn\",\"verifier\":\"The address of the verifier\"}},\"TokensUndelegated(address,address,address,uint256,uint256)\":{\"params\":{\"delegator\":\"The address of the delegator\",\"serviceProvider\":\"The address of the service provider\",\"shares\":\"The amount of shares undelegated\",\"tokens\":\"The amount of tokens undelegated\",\"verifier\":\"The address of the verifier\"}},\"VerifierTokensSent(address,address,address,uint256)\":{\"params\":{\"destination\":\"The address where the verifier cut is sent\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens sent to the verifier\",\"verifier\":\"The address of the verifier\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionParameters(address)\":{\"details\":\"Only the provision's verifier can call this function. Emits a {ProvisionParametersSet} event.\",\"params\":{\"serviceProvider\":\"The service provider address\"}},\"addToDelegationPool(address,address,uint256)\":{\"details\":\"Requirements: - `tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits a {TokensToDelegationPoolAdded} event.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to add to the delegation pool\",\"verifier\":\"The verifier address for which the tokens are provisioned\"}},\"addToProvision(address,address,uint256)\":{\"details\":\"Requirements: - The `serviceProvider` must have previously provisioned stake to `verifier`. - `tokens` cannot be zero. - The `serviceProvider` must have enough idle stake to cover the tokens to add. Emits a {ProvisionIncreased} event.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to add to the provision\",\"verifier\":\"The verifier address\"}},\"clearThawingPeriod()\":{\"details\":\"This function can only be called by the contract governor.Emits a {ThawingPeriodCleared} event.\"},\"delegate(address,address,uint256,uint256)\":{\"details\":\"Requirements: - `tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. - The provision must exist. Emits a {TokensDelegated} event.\",\"params\":{\"minSharesOut\":\"The minimum amount of shares to accept, slippage protection.\",\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to delegate\",\"verifier\":\"The verifier address\"}},\"delegate(address,uint256)\":{\"details\":\"See {delegate}.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to delegate\"}},\"deprovision(address,address,uint256)\":{\"details\":\"The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function will attempt to fulfill all thaw requests until the first one that is not yet expired is found. Requirements: - Must have previously initiated a thaw request using {thaw}. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {TokensDeprovisioned} events.\",\"params\":{\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}},\"getStakingExtension()\":{\"returns\":{\"_0\":\"The address of the staking extension\"}},\"isAuthorized(address,address,address)\":{\"params\":{\"operator\":\"The address to check for auth\",\"serviceProvider\":\"The service provider on behalf of whom they're claiming to act\",\"verifier\":\"The verifier / data service on which they're claiming to act\"},\"returns\":{\"_0\":\"Whether the operator is authorized or not\"}},\"provision(address,address,uint256,uint32,uint64)\":{\"details\":\"During the transition period, only the subgraph data service can be used as a verifier. This prevents an escape hatch for legacy allocation stake.Requirements: - `tokens` cannot be zero. - The `serviceProvider` must have enough idle stake to cover the tokens to provision. - `maxVerifierCut` must be a valid PPM. - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`. Emits a {ProvisionCreated} event.\",\"params\":{\"maxVerifierCut\":\"The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\",\"serviceProvider\":\"The service provider address\",\"thawingPeriod\":\"The period in seconds that the tokens will be thawing before they can be removed from the provision\",\"tokens\":\"The amount of tokens that will be locked and slashable\",\"verifier\":\"The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\"}},\"provisionLocked(address,address,uint256,uint32,uint64)\":{\"details\":\"See {provision}. Additional requirements: - The `verifier` must be allowed to be used for locked provisions.\",\"params\":{\"maxVerifierCut\":\"The maximum cut, expressed in PPM, that a verifier can transfer instead of burning when slashing\",\"serviceProvider\":\"The service provider address\",\"thawingPeriod\":\"The period in seconds that the tokens will be thawing before they can be removed from the provision\",\"tokens\":\"The amount of tokens that will be locked and slashable\",\"verifier\":\"The verifier address for which the tokens are provisioned (who will be able to slash the tokens)\"}},\"redelegate(address,address,address,address,uint256,uint256)\":{\"details\":\"The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw requests in the event that fulfilling all of them results in a gas limit error. Requirements: - Must have previously initiated a thaw request using {undelegate}. - `newServiceProvider` and `newVerifier` must not be the zero address. - `newServiceProvider` must have previously provisioned stake to `newVerifier`. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\",\"params\":{\"minSharesForNewProvider\":\"The minimum amount of shares to accept for the new service provider\",\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"newServiceProvider\":\"The address of a new service provider\",\"newVerifier\":\"The address of a new verifier\",\"oldServiceProvider\":\"The old service provider address\",\"oldVerifier\":\"The old verifier address\"}},\"reprovision(address,address,address,uint256)\":{\"details\":\"Requirements: - Must have previously initiated a thaw request using {thaw}. - `tokens` cannot be zero. - The `serviceProvider` must have previously provisioned stake to `newVerifier`. - The `serviceProvider` must have enough idle stake to cover the tokens to add. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled}, {TokensDeprovisioned} and {ProvisionIncreased} events.\",\"params\":{\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"newVerifier\":\"The verifier address for which the tokens will be provisioned\",\"oldVerifier\":\"The verifier address for which the tokens are currently provisioned\",\"serviceProvider\":\"The service provider address\"}},\"setAllowedLockedVerifier(address,bool)\":{\"details\":\"This function can only be called by the contract governor, it's used to maintain a whitelist of verifiers that do not allow the stake from a locked wallet to escape the lock.Emits a {AllowedLockedVerifierSet} event.\",\"params\":{\"allowed\":\"Whether the verifier is allowed or not\",\"verifier\":\"The verifier address\"}},\"setDelegationFeeCut(address,address,uint8,uint256)\":{\"details\":\"Emits a {DelegationFeeCutSet} event.\",\"params\":{\"feeCut\":\"The fee cut to set, in PPM\",\"paymentType\":\"The payment type for which the fee cut is set, as defined in {IGraphPayments}\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}},\"setDelegationSlashingEnabled()\":{\"details\":\"This function can only be called by the contract governor.\"},\"setMaxThawingPeriod(uint64)\":{\"params\":{\"maxThawingPeriod\":\"The new maximum thawing period, in seconds\"}},\"setOperator(address,address,bool)\":{\"details\":\"Emits a {OperatorSet} event.\",\"params\":{\"allowed\":\"Whether the operator is authorized or not\",\"operator\":\"Address to authorize or unauthorize\",\"verifier\":\"The verifier / data service on which they'll be allowed to operate\"}},\"setOperatorLocked(address,address,bool)\":{\"details\":\"See {setOperator}. Additional requirements: - The `verifier` must be allowed to be used for locked provisions.\",\"params\":{\"allowed\":\"Whether the operator is authorized or not\",\"operator\":\"Address to authorize or unauthorize\",\"verifier\":\"The verifier / data service on which they'll be allowed to operate\"}},\"setProvisionParameters(address,address,uint32,uint64)\":{\"details\":\"This two step update process prevents the service provider from changing the parameters without the verifier's consent. Requirements: - `thawingPeriod` must be less than or equal to `_maxThawingPeriod`. Note that if `_maxThawingPeriod` changes the function will not revert if called with the same thawing period as the current one. Emits a {ProvisionParametersStaged} event if at least one of the parameters changed.\",\"params\":{\"maxVerifierCut\":\"The proposed maximum cut, expressed in PPM of the slashed amount, that a verifier can take for themselves when slashing\",\"serviceProvider\":\"The service provider address\",\"thawingPeriod\":\"The proposed period in seconds that the tokens will be thawing before they can be removed from the provision\",\"verifier\":\"The verifier address\"}},\"slash(address,uint256,uint256,address)\":{\"details\":\"Requirements: - `tokens` must be less than or equal to the amount of tokens provisioned by the service provider. - `tokensVerifier` must be less than the provision's tokens times the provision's maximum verifier cut. Emits a {ProvisionSlashed} and {VerifierTokensSent} events. Emits a {DelegationSlashed} or {DelegationSlashingSkipped} event depending on the global delegation slashing flag.\",\"params\":{\"serviceProvider\":\"The service provider to slash\",\"tokens\":\"The amount of tokens to slash\",\"tokensVerifier\":\"The amount of tokens to transfer instead of burning\",\"verifierDestination\":\"The address to transfer the verifier cut to\"}},\"stake(uint256)\":{\"details\":\"Pulls tokens from the caller. Requirements: - `_tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits a {HorizonStakeDeposited} event.\",\"params\":{\"tokens\":\"Amount of tokens to stake\"}},\"stakeTo(address,uint256)\":{\"details\":\"Pulls tokens from the caller. Requirements: - `_tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits a {HorizonStakeDeposited} event.\",\"params\":{\"serviceProvider\":\"Address of the service provider\",\"tokens\":\"Amount of tokens to stake\"}},\"stakeToProvision(address,address,uint256)\":{\"details\":\"This function can be called by the service provider, by an authorized operator or by the verifier itself.Requirements: - The `serviceProvider` must have previously provisioned stake to `verifier`. - `_tokens` cannot be zero. - Caller must have previously approved this contract to pull tokens from their balance. Emits {HorizonStakeDeposited} and {ProvisionIncreased} events.\",\"params\":{\"serviceProvider\":\"Address of the service provider\",\"tokens\":\"Amount of tokens to stake\",\"verifier\":\"Address of the verifier\"}},\"thaw(address,address,uint256)\":{\"details\":\"Requirements: - The provision must have enough tokens available to thaw. - `tokens` cannot be zero. Emits {ProvisionThawed} and {ThawRequestCreated} events.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"tokens\":\"The amount of tokens to thaw\",\"verifier\":\"The verifier address for which the tokens are provisioned\"},\"returns\":{\"_0\":\"The ID of the thaw request\"}},\"undelegate(address,address,uint256)\":{\"params\":{\"serviceProvider\":\"The service provider address\",\"shares\":\"The amount of shares to undelegate\",\"verifier\":\"The verifier address\"},\"returns\":{\"_0\":\"The ID of the thaw request\"}},\"undelegate(address,uint256)\":{\"details\":\"See {undelegate}.\",\"params\":{\"serviceProvider\":\"The service provider address\",\"shares\":\"The amount of shares to undelegate\"}},\"unstake(uint256)\":{\"details\":\"Requirements: - `_tokens` cannot be zero. - `_serviceProvider` must have enough idle stake to cover the staking amount and any legacy allocation. Emits a {HorizonStakeLocked} event during the transition period. Emits a {HorizonStakeWithdrawn} event after the transition period.\",\"params\":{\"tokens\":\"Amount of tokens to unstake\"}},\"withdraw()\":{\"details\":\"This is only needed during the transition period while we still have a global lock. After that, unstake() will automatically withdraw.\"},\"withdrawDelegated(address,address)\":{\"details\":\"See {delegate}.\",\"params\":{\"deprecated\":\"Deprecated parameter kept for backwards compatibility\",\"serviceProvider\":\"The service provider address\"},\"returns\":{\"_0\":\"The amount of tokens withdrawn\"}},\"withdrawDelegated(address,address,uint256)\":{\"details\":\"The parameter `nThawRequests` can be set to a non zero value to fulfill a specific number of thaw requests in the event that fulfilling all of them results in a gas limit error. Otherwise, the function will attempt to fulfill all thaw requests until the first one that is not yet expired is found.If the delegation pool was completely slashed before withdrawing, calling this function will fulfill the thaw requests with an amount equal to zero. Requirements: - Must have previously initiated a thaw request using {undelegate}. Emits {ThawRequestFulfilled}, {ThawRequestsFulfilled} and {DelegatedTokensWithdrawn} events.\",\"params\":{\"nThawRequests\":\"The number of thaw requests to fulfill. Set to 0 to fulfill all thaw requests.\",\"serviceProvider\":\"The service provider address\",\"verifier\":\"The verifier address\"}}},\"title\":\"Inferface for the {HorizonStaking} contract.\",\"version\":1},\"userdoc\":{\"errors\":{\"HorizonStakingCallerIsServiceProvider()\":[{\"notice\":\"Thrown when a service provider attempts to change their own operator access.\"}],\"HorizonStakingInsufficientDelegationTokens(uint256,uint256)\":[{\"notice\":\"Thrown when the minimum token amount required for delegation is not met.\"}],\"HorizonStakingInsufficientIdleStake(uint256,uint256)\":[{\"notice\":\"Thrown when the service provider has insufficient idle stake to operate.\"}],\"HorizonStakingInsufficientShares(uint256,uint256)\":[{\"notice\":\"Thrown when a minimum share amount is required to operate but it's not met.\"}],\"HorizonStakingInsufficientStakeForLegacyAllocations(uint256,uint256)\":[{\"notice\":\"Thrown during the transition period when the service provider has insufficient stake to cover their existing legacy allocations.\"}],\"HorizonStakingInsufficientTokens(uint256,uint256)\":[{\"notice\":\"Thrown when a minimum token amount is required to operate but it's not met.\"}],\"HorizonStakingInvalidDelegationFeeCut(uint256)\":[{\"notice\":\"Thrown when trying to set a delegation fee cut that is not valid.\"}],\"HorizonStakingInvalidDelegationPool(address,address)\":[{\"notice\":\"Thrown when attempting to operate with a delegation pool that does not exist.\"}],\"HorizonStakingInvalidDelegationPoolState(address,address)\":[{\"notice\":\"Thrown when as a result of slashing delegation pool has no tokens but has shares.\"}],\"HorizonStakingInvalidMaxVerifierCut(uint32)\":[{\"notice\":\"Thrown when attempting to create a provision with an invalid maximum verifier cut.\"}],\"HorizonStakingInvalidProvision(address,address)\":[{\"notice\":\"Thrown when attempting to operate with a provision that does not exist.\"}],\"HorizonStakingInvalidServiceProviderZeroAddress()\":[{\"notice\":\"Thrown when attempting to redelegate with a serivce provider that is the zero address.\"}],\"HorizonStakingInvalidThawingPeriod(uint64,uint64)\":[{\"notice\":\"Thrown when attempting to create a provision with an invalid thawing period.\"}],\"HorizonStakingInvalidVerifier(address)\":[{\"notice\":\"Thrown when attempting to create a provision with a verifier other than the subgraph data service. This restriction only applies during the transition period.\"}],\"HorizonStakingInvalidVerifierZeroAddress()\":[{\"notice\":\"Thrown when attempting to redelegate with a verifier that is the zero address.\"}],\"HorizonStakingInvalidZeroShares()\":[{\"notice\":\"Thrown when operating a zero share amount is not allowed.\"}],\"HorizonStakingInvalidZeroTokens()\":[{\"notice\":\"Thrown when operating a zero token amount is not allowed.\"}],\"HorizonStakingLegacySlashFailed()\":[{\"notice\":\"Thrown when a legacy slash fails.\"}],\"HorizonStakingNoTokensToSlash()\":[{\"notice\":\"Thrown when there attempting to slash a provision with no tokens to slash.\"}],\"HorizonStakingNotAuthorized(address,address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to operate on a provision.\"}],\"HorizonStakingNothingThawing()\":[{\"notice\":\"Thrown when attempting to fulfill a thaw request but there is nothing thawing.\"}],\"HorizonStakingNothingToWithdraw()\":[{\"notice\":\"Thrown when attempting to withdraw tokens that have not thawed (legacy undelegate).\"}],\"HorizonStakingProvisionAlreadyExists()\":[{\"notice\":\"Thrown when attempting to create a provision for a data service that already has a provision.\"}],\"HorizonStakingSlippageProtection(uint256,uint256)\":[{\"notice\":\"Thrown when delegation shares obtained are below the expected amount.\"}],\"HorizonStakingStillThawing(uint256)\":[{\"notice\":\"Thrown during the transition period when attempting to withdraw tokens that are still thawing.\"}],\"HorizonStakingTooManyThawRequests()\":[{\"notice\":\"Thrown when a service provider has too many thaw requests.\"}],\"HorizonStakingTooManyTokens(uint256,uint256)\":[{\"notice\":\"Thrown when the amount of tokens exceeds the maximum allowed to operate.\"}],\"HorizonStakingVerifierNotAllowed(address)\":[{\"notice\":\"Thrown when a service provider attempts to operate on verifiers that are not allowed.\"}]},\"events\":{\"AllowedLockedVerifierSet(address,bool)\":{\"notice\":\"Emitted when a verifier is allowed or disallowed to be used for locked provisions.\"},\"DelegatedTokensWithdrawn(address,address,address,uint256)\":{\"notice\":\"Emitted when a delegator withdraws tokens from a provision after thawing.\"},\"DelegationFeeCutSet(address,address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider sets delegation fee cuts for a verifier.\"},\"DelegationSlashed(address,address,uint256)\":{\"notice\":\"Emitted when a delegation pool is slashed by a verifier.\"},\"DelegationSlashingEnabled()\":{\"notice\":\"Emitted when the delegation slashing global flag is set.\"},\"DelegationSlashingSkipped(address,address,uint256)\":{\"notice\":\"Emitted when a delegation pool would have been slashed by a verifier, but the slashing was skipped because delegation slashing global parameter is not enabled.\"},\"HorizonStakeLocked(address,uint256,uint256)\":{\"notice\":\"Emitted when a service provider unstakes tokens during the transition period.\"},\"HorizonStakeWithdrawn(address,uint256)\":{\"notice\":\"Emitted when a service provider withdraws tokens during the transition period.\"},\"MaxThawingPeriodSet(uint64)\":{\"notice\":\"Emitted when the global maximum thawing period allowed for provisions is set.\"},\"ProvisionCreated(address,address,uint256,uint32,uint64)\":{\"notice\":\"Emitted when a service provider provisions staked tokens to a verifier.\"},\"ProvisionIncreased(address,address,uint256)\":{\"notice\":\"Emitted whenever staked tokens are added to an existing provision\"},\"ProvisionParametersSet(address,address,uint32,uint64)\":{\"notice\":\"Emitted when a service provider accepts a staged provision parameter update.\"},\"ProvisionParametersStaged(address,address,uint32,uint64)\":{\"notice\":\"Emitted when a service provider stages a provision parameter update.\"},\"ProvisionSlashed(address,address,uint256)\":{\"notice\":\"Emitted when a provision is slashed by a verifier.\"},\"ProvisionThawed(address,address,uint256)\":{\"notice\":\"Emitted when a service provider thaws tokens from a provision.\"},\"StakeDelegatedWithdrawn(address,address,uint256)\":{\"notice\":\"Emitted when `delegator` withdrew delegated `tokens` from `indexer` using `withdrawDelegated`.\"},\"ThawRequestCreated(uint8,address,address,address,uint256,uint64,bytes32,uint256)\":{\"notice\":\"Emitted when a thaw request is created.\"},\"ThawRequestFulfilled(uint8,bytes32,uint256,uint256,uint64,bool)\":{\"notice\":\"Emitted when a thaw request is fulfilled, meaning the stake is released.\"},\"ThawRequestsFulfilled(uint8,address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a series of thaw requests are fulfilled.\"},\"ThawingPeriodCleared()\":{\"notice\":\"Emitted when the legacy global thawing period is set to zero.\"},\"TokensDelegated(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when tokens are delegated to a provision.\"},\"TokensDeprovisioned(address,address,uint256)\":{\"notice\":\"Emitted when a service provider removes tokens from a provision.\"},\"TokensToDelegationPoolAdded(address,address,uint256)\":{\"notice\":\"Emitted when tokens are added to a delegation pool's reserve.\"},\"TokensUndelegated(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a delegator undelegates tokens from a provision and starts thawing them.\"},\"VerifierTokensSent(address,address,address,uint256)\":{\"notice\":\"Emitted when the verifier cut is sent to the verifier after slashing a provision.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionParameters(address)\":{\"notice\":\"Accepts a staged provision parameter update.\"},\"addToDelegationPool(address,address,uint256)\":{\"notice\":\"Add tokens to a delegation pool without issuing shares. Used by data services to pay delegation fees/rewards. Delegators SHOULD NOT call this function.\"},\"addToProvision(address,address,uint256)\":{\"notice\":\"Adds tokens from the service provider's idle stake to a provision\"},\"clearThawingPeriod()\":{\"notice\":\"Clear the legacy global thawing period. This signifies the end of the transition period, after which no legacy allocations should be left.\"},\"delegate(address,address,uint256,uint256)\":{\"notice\":\"Delegate tokens to a provision.\"},\"delegate(address,uint256)\":{\"notice\":\"Delegate tokens to the subgraph data service provision. This function is for backwards compatibility with the legacy staking contract. It only allows delegating to the subgraph data service and DOES NOT have slippage protection.\"},\"deprovision(address,address,uint256)\":{\"notice\":\"Remove tokens from a provision and move them back to the service provider's idle stake.\"},\"getStakingExtension()\":{\"notice\":\"Get the address of the staking extension.\"},\"isAuthorized(address,address,address)\":{\"notice\":\"Check if an operator is authorized for the caller on a specific verifier / data service.\"},\"provision(address,address,uint256,uint32,uint64)\":{\"notice\":\"Provision stake to a verifier. The tokens will be locked with a thawing period and will be slashable by the verifier. This is the main mechanism to provision stake to a data service, where the data service is the verifier. This function can be called by the service provider or by an operator authorized by the provider for this specific verifier.\"},\"provisionLocked(address,address,uint256,uint32,uint64)\":{\"notice\":\"Provision stake to a verifier using locked tokens (i.e. from GraphTokenLockWallets).\"},\"redelegate(address,address,address,address,uint256,uint256)\":{\"notice\":\"Re-delegate undelegated tokens from a provision after thawing to a `newServiceProvider` and `newVerifier`.\"},\"reprovision(address,address,address,uint256)\":{\"notice\":\"Move already thawed stake from one provision into another provision This function can be called by the service provider or by an operator authorized by the provider for the two corresponding verifiers.\"},\"setAllowedLockedVerifier(address,bool)\":{\"notice\":\"Sets a verifier as a globally allowed verifier for locked provisions.\"},\"setDelegationFeeCut(address,address,uint8,uint256)\":{\"notice\":\"Set the fee cut for a verifier on a specific payment type.\"},\"setDelegationSlashingEnabled()\":{\"notice\":\"Set the global delegation slashing flag to true.\"},\"setMaxThawingPeriod(uint64)\":{\"notice\":\"Sets the global maximum thawing period allowed for provisions.\"},\"setOperator(address,address,bool)\":{\"notice\":\"Authorize or unauthorize an address to be an operator for the caller on a data service.\"},\"setOperatorLocked(address,address,bool)\":{\"notice\":\"Authorize or unauthorize an address to be an operator for the caller on a verifier.\"},\"setProvisionParameters(address,address,uint32,uint64)\":{\"notice\":\"Stages a provision parameter update. Note that the change is not effective until the verifier calls {acceptProvisionParameters}. Calling this function is a no-op if the new parameters are the same as the current ones.\"},\"slash(address,uint256,uint256,address)\":{\"notice\":\"Slash a service provider. This can only be called by a verifier to which the provider has provisioned stake, and up to the amount of tokens they have provisioned. If the service provider's stake is not enough, the associated delegation pool might be slashed depending on the value of the global delegation slashing flag. Part of the slashed tokens are sent to the `verifierDestination` as a reward.\"},\"stake(uint256)\":{\"notice\":\"Deposit tokens on the staking contract.\"},\"stakeTo(address,uint256)\":{\"notice\":\"Deposit tokens on the service provider stake, on behalf of the service provider.\"},\"stakeToProvision(address,address,uint256)\":{\"notice\":\"Deposit tokens on the service provider stake, on behalf of the service provider, provisioned to a specific verifier.\"},\"thaw(address,address,uint256)\":{\"notice\":\"Start thawing tokens to remove them from a provision. This function can be called by the service provider or by an operator authorized by the provider for this specific verifier. Note that removing tokens from a provision is a two step process: - First the tokens are thawed using this function. - Then after the thawing period, the tokens are removed from the provision using {deprovision} or {reprovision}.\"},\"undelegate(address,address,uint256)\":{\"notice\":\"Undelegate tokens from a provision and start thawing them. Note that undelegating tokens from a provision is a two step process: - First the tokens are thawed using this function. - Then after the thawing period, the tokens are removed from the provision using {withdrawDelegated}. Requirements: - `shares` cannot be zero. Emits a {TokensUndelegated} and {ThawRequestCreated} event.\"},\"undelegate(address,uint256)\":{\"notice\":\"Undelegate tokens from the subgraph data service provision and start thawing them. This function is for backwards compatibility with the legacy staking contract. It only allows undelegating from the subgraph data service.\"},\"unstake(uint256)\":{\"notice\":\"Move idle stake back to the owner's account. Stake is removed from the protocol: - During the transition period it's locked for a period of time before it can be withdrawn by calling {withdraw}. - After the transition period it's immediately withdrawn. Note that after the transition period if there are tokens still locked they will have to be withdrawn by calling {withdraw}.\"},\"withdraw()\":{\"notice\":\"Withdraw service provider tokens once the thawing period (initiated by {unstake}) has passed. All thawed tokens are withdrawn.\"},\"withdrawDelegated(address,address)\":{\"notice\":\"Withdraw undelegated tokens from the subgraph data service provision after thawing. This function is for backwards compatibility with the legacy staking contract. It only allows withdrawing tokens undelegated before horizon upgrade.\"},\"withdrawDelegated(address,address,uint256)\":{\"notice\":\"Withdraw undelegated tokens from a provision after thawing.\"}},\"notice\":\"Provides functions for managing stake, provisions, delegations, and slashing.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":\"IHorizonStakingMain\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol": { + "IHorizonStakingTypes": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"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.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Defines the data types used in the Horizon staking contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":\"IHorizonStakingTypes\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/libraries/LinkedList.sol": { + "LinkedList": { + "abi": [ + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220634bc6e5aef788fd779dcee4cca795e76964f7e1e5b44586fd8eda2c36fc128764736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH4 0x4BC6E5AE 0xF7 DUP9 REVERT PUSH24 0x9DCEE4CCA795E76964F7E1E5B44586FD8EDA2C36FC128764 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "786:4964:33:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;786:4964:33;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220634bc6e5aef788fd779dcee4cca795e76964f7e1e5b44586fd8eda2c36fc128764736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH4 0x4BC6E5AE 0xF7 DUP9 REVERT PUSH24 0x9DCEE4CCA795E76964F7E1E5B44586FD8EDA2C36FC128764 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "786:4964:33:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"LinkedListEmptyList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListInvalidIterations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListInvalidZeroId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListMaxElementsExceeded\",\"type\":\"error\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"LinkedList library\",\"version\":1},\"userdoc\":{\"errors\":{\"LinkedListEmptyList()\":[{\"notice\":\"Thrown when trying to remove an item from an empty list\"}],\"LinkedListInvalidIterations()\":[{\"notice\":\"Thrown when trying to traverse a list with more iterations than elements\"}],\"LinkedListInvalidZeroId()\":[{\"notice\":\"Thrown when trying to add an item with id equal to bytes32(0)\"}],\"LinkedListMaxElementsExceeded()\":[{\"notice\":\"Thrown when trying to add an item to a list that has reached the maximum number of elements\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"A library to manage singly linked lists. The library makes no assumptions about the contents of the items, the only requirements on the items are: - they must be represented by a unique bytes32 id - the id of the item must not be bytes32(0) - each item must have a reference to the next item in the list - the list cannot have more than `MAX_ITEMS` items A contract using this library must store: - a LinkedList.List to keep track of the list metadata - a mapping from bytes32 to the item data\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":\"LinkedList\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/libraries/MathUtils.sol": { + "MathUtils": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122090721977f146bc47651e28a67cd8f9ce83518cba11871d05c2c3ef61d8aefbd264736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP1 PUSH19 0x1977F146BC47651E28A67CD8F9CE83518CBA11 DUP8 SAR SDIV 0xC2 0xC3 0xEF PUSH2 0xD8AE 0xFB 0xD2 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "311:1477:34:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;311:1477:34;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122090721977f146bc47651e28a67cd8f9ce83518cba11871d05c2c3ef61d8aefbd264736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP1 PUSH19 0x1977F146BC47651E28A67CD8F9CE83518CBA11 DUP8 SAR SDIV 0xC2 0xC3 0xEF PUSH2 0xD8AE 0xFB 0xD2 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "311:1477:34:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"MathUtils Library\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A collection of functions to perform math operations\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/libraries/MathUtils.sol\":\"MathUtils\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/libraries/MathUtils.sol\":{\"keccak256\":\"0x24cd80c0d25f634db1e8101c0a474a284758eb7a2203ae3abf507f578fa12e0a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://69d03db4aaa31184b3ec9526bf236949683c5a35785c298cad0ac160904b695c\",\"dweb:/ipfs/Qmd2xSKW6ojrapgrRimrXCpc52GTrQ3BMAEYH17UvSfvLV\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/libraries/PPMMath.sol": { + "PPMMath": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "PPMMathInvalidPPM", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ec389b234df2d4af81896c70e838876b3c31d3925e53798ff4f46249c78f3d4b64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEC CODESIZE SWAP12 0x23 0x4D CALLCODE 0xD4 0xAF DUP2 DUP10 PUSH13 0x70E838876B3C31D3925E53798F DELEGATECALL DELEGATECALL PUSH3 0x49C78F RETURNDATASIZE 0x4B PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "329:1769:35:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;329:1769:35;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ec389b234df2d4af81896c70e838876b3c31d3925e53798ff4f46249c78f3d4b64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEC CODESIZE SWAP12 0x23 0x4D CALLCODE 0xD4 0xAF DUP2 DUP10 PUSH13 0x70E838876B3C31D3925E53798F DELEGATECALL DELEGATECALL PUSH3 0x49C78F RETURNDATASIZE 0x4B PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "329:1769:35:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"PPMMathInvalidMulPPM\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"PPMMathInvalidPPM\",\"type\":\"error\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"PPMMathInvalidMulPPM(uint256,uint256)\":[{\"params\":{\"a\":\"The first value in the multiplication.\",\"b\":\"The second value in the multiplication.\"}}],\"PPMMathInvalidPPM(uint256)\":[{\"params\":{\"value\":\"The value that is not in PPM.\"}}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"PPMMath library\",\"version\":1},\"userdoc\":{\"errors\":{\"PPMMathInvalidMulPPM(uint256,uint256)\":[{\"notice\":\"Thrown when no value in a multiplication is in PPM.\"}],\"PPMMathInvalidPPM(uint256)\":[{\"notice\":\"Thrown when a value is expected to be in PPM but is not.\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for handling calculations with parts per million (PPM) amounts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":\"PPMMath\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/libraries/UintRange.sol": { + "UintRange": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220202b2a49d0bef5c3760fc54aa977ee0438614d43207535d20e13c7a6105db25f64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 0x2B 0x2A BLOBHASH 0xD0 0xBE CREATE2 0xC3 PUSH23 0xFC54AA977EE0438614D43207535D20E13C7A6105DB25F PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "312:455:36:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;312:455:36;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220202b2a49d0bef5c3760fc54aa977ee0438614d43207535d20e13c7a6105db25f64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 KECCAK256 0x2B 0x2A BLOBHASH 0xD0 0xBE CREATE2 0xC3 PUSH23 0xFC54AA977EE0438614D43207535D20E13C7A6105DB25F PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "312:455:36:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"UintRange library\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for handling range checks on uint256 values.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":\"UintRange\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":{\"keccak256\":\"0x70d69069b2c122becd29ec4ea9a79f2e26cf7cbe7b1918ffced691ee00cdbd82\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://6bddc7d257c3df1fd4940dd3c554e5a1efbc1b23d50f7878415389b75380628c\",\"dweb:/ipfs/QmTQBCsL4pHoXMixVvDwGMdmJnGfEeeDZfHdJkcpKamu58\"]}},\"version\":1}" + } + }, + "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol": { + "GraphDirectory": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"}],\"devdoc\":{\"errors\":{\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}]},\"events\":{\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Requirements: - `controller` cannot be zero address Emits a {GraphDirectoryInitialized} event\",\"params\":{\"controller\":\"The address of the Graph Controller contract.\"}}},\"title\":\"GraphDirectory contract\",\"version\":1},\"userdoc\":{\"errors\":{\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}]},\"events\":{\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Constructor for the GraphDirectory contract\"}},\"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, and uses immutable variables to minimize gas costs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":\"GraphDirectory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "OwnableUpgradeable": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. The initial owner is set to the address provided by the deployer. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":\"OwnableUpgradeable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "Initializable": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"}],\"devdoc\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor constructor() { _disableInitializers(); } ``` ====\",\"details\":\"This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. The initialization functions use a version number. Once a version number is used, it is consumed and cannot be reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in case an upgrade adds a module that needs to be initialized. For example: [.hljs-theme-light.nopadding] ```solidity contract MyToken is ERC20Upgradeable { function initialize() initializer public { __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\"); } } contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { function initializeV2() reinitializer(2) public { __ERC20Permit_init(\\\"MyToken\\\"); } } ``` TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. [CAUTION] ==== Avoid leaving a contract uninitialized. An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: [.hljs-theme-light.nopadding] ```\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":\"Initializable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "ContextUpgradeable": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"}],\"devdoc\":{\"details\":\"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":\"ContextUpgradeable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol": { + "MulticallUpgradeable": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "multicall(bytes[])": "ac9650d8" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Provides a function to batch together multiple calls in a single external call. Consider any assumption about calldata validation performed by the sender may be violated if it's not especially careful about sending transactions invoking {multicall}. For example, a relay address that filters function selectors won't filter calls nested within a {multicall} operation. NOTE: Since 5.0.1 and 4.9.4, this contract identifies non-canonical contexts (i.e. `msg.sender` is not {Context-_msgSender}). If a non-canonical context is identified, the following self `delegatecall` appends the last bytes of `msg.data` to the subcall. This makes it safe to use with {ERC2771Context}. Contexts that don't affect the resolution of {Context-_msgSender} are not propagated to subcalls.\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol\":\"MulticallUpgradeable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol\":{\"keccak256\":\"0xe5775eb1fb17165cd191e8f8b2232dbea8765e7e610eaa3d6e52feead793ec5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://352614aea75c3d913cbcabb528be3d6c3335c3c77da41d59486a3193069dd095\",\"dweb:/ipfs/QmR3Nabxfme6tHrAMJCyK4MWZtpund2c4R7aFKmea3sGZM\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaaa1d17c1129b127a4a401db2fbd72960e2671474be3d08cae71ccdc42f7624c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cb2f27cd3952aa667e198fba0d9b7bcec52fbb12c16f013c25fe6fb52b29cc0e\",\"dweb:/ipfs/QmeuohBFoeyDPZA9JNCTEDz3VBfBD4EABWuWXVhHAuEpKR\"]},\"@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol": { + "PausableUpgradeable": { + "abi": [ + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "paused()": "5c975abb" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module which allows children to implement an emergency stop mechanism that can be triggered by an authorized account. This module is used through inheritance. It will make available the modifiers `whenNotPaused` and `whenPaused`, which can be applied to the functions of your contract. Note that they will not be pausable by simply including this module, only once the modifiers are put in place.\",\"errors\":{\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":\"PausableUpgradeable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"keccak256\":\"0xa6bf6b7efe0e6625a9dcd30c5ddf52c4c24fe8372f37c7de9dbf5034746768d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c353ee3705bbf6fadb84c0fb10ef1b736e8ca3ca1867814349d1487ed207beb\",\"dweb:/ipfs/QmcugaPssrzGGE8q4YZKm2ZhnD3kCijjcgdWWg76nWt3FY\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol": { + "EIP712Upgradeable": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "eip712Domain()": "84b0196e" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data. The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to produce the hash of their typed data using a combination of `abi.encode` and `keccak256`. This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA ({_hashTypedDataV4}). The implementation of the domain separator was designed to be as efficient as possible while still properly updating the chain id to protect against replay attacks on an eventual fork of the chain. NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\":\"EIP712Upgradeable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\":{\"keccak256\":\"0xd45a5b1d0e451376b08e1bc7e332426c24382053300acf0ac667be1b8abb6cc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://824eb0b8c71db8b95b707218d8540c2046a2fefc642e74b343ae90e5c72e2b52\",\"dweb:/ipfs/QmdQTZTomqxRrySDNdv1FEyh3ZWibxwC9FRdcV3DCuASpx\"]},\"@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x81c274a60a7ae232ae3dc9ff3a4011b4849a853c13b0832cd3351bb1bb2f0dae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da0c20dc74358a2a76330818f3bac9d1e2ce3371aec847b9cbf5d147fbae4f6\",\"dweb:/ipfs/QmeczhmnFv1hbXKGLwbYXY6Rrytc9a5A2YaRi5QMMgjPnb\"]},\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/interfaces/IERC5267.sol": { + "IERC5267": { + "abi": [ + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "eip712Domain()": "84b0196e" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"}},\"kind\":\"dev\",\"methods\":{\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/interfaces/IERC5267.sol\":\"IERC5267\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "IERC20": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "allowance(address,address)": "dd62ed3e", + "approve(address,uint256)": "095ea7b3", + "balanceOf(address)": "70a08231", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferFrom(address,address,uint256)": "23b872dd" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC-20 standard as defined in the ERC.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":\"IERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/Address.sol": { + "Address": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220781a1d5bdb5668d82b50835cd32ca92ccbec39aad96b67a488f50e9afdae7d5164736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH25 0x1A1D5BDB5668D82B50835CD32CA92CCBEC39AAD96B67A488F5 0xE SWAP11 REVERT 0xAE PUSH30 0x5164736F6C634300081B0033000000000000000000000000000000000000 ", + "sourceMap": "233:5815:46:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;233:5815:46;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220781a1d5bdb5668d82b50835cd32ca92ccbec39aad96b67a488f50e9afdae7d5164736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH25 0x1A1D5BDB5668D82B50835CD32CA92CCBEC39AAD96B67A488F5 0xE SWAP11 REVERT 0xAE PUSH30 0x5164736F6C634300081B0033000000000000000000000000000000000000 ", + "sourceMap": "233:5815:46:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaaa1d17c1129b127a4a401db2fbd72960e2671474be3d08cae71ccdc42f7624c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cb2f27cd3952aa667e198fba0d9b7bcec52fbb12c16f013c25fe6fb52b29cc0e\",\"dweb:/ipfs/QmeuohBFoeyDPZA9JNCTEDz3VBfBD4EABWuWXVhHAuEpKR\"]},\"@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/Errors.sol": { + "Errors": { + "abi": [ + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "FailedDeployment", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "MissingPrecompile", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122044ae8a2f23a1248c5d321b81ea162b8f9c89b21a77e70eb0aba03a267938d51f64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PREVRANDAO 0xAE DUP11 0x2F 0x23 LOG1 0x24 DUP13 TSTORE ORIGIN SHL DUP2 0xEA AND 0x2B DUP16 SWAP13 DUP10 0xB2 BYTE PUSH24 0xE70EB0ABA03A267938D51F64736F6C634300081B00330000 ", + "sourceMap": "411:484:47:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;411:484:47;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122044ae8a2f23a1248c5d321b81ea162b8f9c89b21a77e70eb0aba03a267938d51f64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PREVRANDAO 0xAE DUP11 0x2F 0x23 LOG1 0x24 DUP13 TSTORE ORIGIN SHL DUP2 0xEA AND 0x2B DUP16 SWAP13 DUP10 0xB2 BYTE PUSH24 0xE70EB0ABA03A267938D51F64736F6C634300081B00330000 ", + "sourceMap": "411:484:47:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedDeployment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"MissingPrecompile\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of common custom errors used in multiple contracts IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. It is recommended to avoid relying on the error API for critical functionality. _Available since v5.1._\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"FailedDeployment()\":[{\"details\":\"The deployment failed.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"MissingPrecompile(address)\":[{\"details\":\"A necessary precompile is missing.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Errors.sol\":\"Errors\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/Panic.sol": { + "Panic": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122094e995d013dad400678b7d35e8eb7544d9da48ba493c0f2ea19c12592c28629c64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 0xE9 SWAP6 0xD0 SGT 0xDA 0xD4 STOP PUSH8 0x8B7D35E8EB7544D9 0xDA BASEFEE 0xBA BLOBHASH EXTCODECOPY 0xF 0x2E LOG1 SWAP13 SLT MSIZE 0x2C 0x28 PUSH3 0x9C6473 PUSH16 0x6C634300081B00330000000000000000 ", + "sourceMap": "657:1315:48:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;657:1315:48;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122094e995d013dad400678b7d35e8eb7544d9da48ba493c0f2ea19c12592c28629c64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 0xE9 SWAP6 0xD0 SGT 0xDA 0xD4 STOP PUSH8 0x8B7D35E8EB7544D9 0xDA BASEFEE 0xBA BLOBHASH EXTCODECOPY 0xF 0x2E LOG1 SWAP13 SLT MSIZE 0x2C 0x28 PUSH3 0x9C6473 PUSH16 0x6C634300081B00330000000000000000 ", + "sourceMap": "657:1315:48:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Helper library for emitting standardized panic codes. ```solidity contract Example { using Panic for uint256; // Use any of the declared internal constants function foo() { Panic.GENERIC.panic(); } // Alternatively function foo() { Panic.panic(Panic.GENERIC); } } ``` Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil]. _Available since v5.1._\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"ARRAY_OUT_OF_BOUNDS\":{\"details\":\"array out of bounds access\"},\"ASSERT\":{\"details\":\"used by the assert() builtin\"},\"DIVISION_BY_ZERO\":{\"details\":\"division or modulo by zero\"},\"EMPTY_ARRAY_POP\":{\"details\":\"empty array pop\"},\"ENUM_CONVERSION_ERROR\":{\"details\":\"enum conversion error\"},\"GENERIC\":{\"details\":\"generic / unspecified error\"},\"INVALID_INTERNAL_FUNCTION\":{\"details\":\"calling invalid internal function\"},\"RESOURCE_ERROR\":{\"details\":\"resource error (too large allocation or too large array)\"},\"STORAGE_ENCODING_ERROR\":{\"details\":\"invalid encoding in storage\"},\"UNDER_OVERFLOW\":{\"details\":\"arithmetic underflow or overflow\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Panic.sol\":\"Panic\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "Strings": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "StringsInsufficientHexLength", + "type": "error" + }, + { + "inputs": [], + "name": "StringsInvalidAddressFormat", + "type": "error" + }, + { + "inputs": [], + "name": "StringsInvalidChar", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122058f56da3e94bb4690ff2a315d128d171be8dd3c73ab16dcb6c2f491a33b239af64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PC CREATE2 PUSH14 0xA3E94BB4690FF2A315D128D171BE DUP14 0xD3 0xC7 GASPRICE 0xB1 PUSH14 0xCB6C2F491A33B239AF64736F6C63 NUMBER STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "297:18980:49:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;297:18980:49;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122058f56da3e94bb4690ff2a315d128d171be8dd3c73ab16dcb6c2f491a33b239af64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PC CREATE2 PUSH14 0xA3E94BB4690FF2A315D128D171BE DUP14 0xD3 0xC7 GASPRICE 0xB1 PUSH14 0xCB6C2F491A33B239AF64736F6C63 NUMBER STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "297:18980:49:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StringsInvalidAddressFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StringsInvalidChar\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"String operations.\",\"errors\":{\"StringsInsufficientHexLength(uint256,uint256)\":[{\"details\":\"The `value` string doesn't fit in the specified `length`.\"}],\"StringsInvalidAddressFormat()\":[{\"details\":\"The string being parsed is not a properly formatted address.\"}],\"StringsInvalidChar()\":[{\"details\":\"The string being parsed contains characters that are not in scope of the given base.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/Strings.sol\":\"Strings\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x81c274a60a7ae232ae3dc9ff3a4011b4849a853c13b0832cd3351bb1bb2f0dae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da0c20dc74358a2a76330818f3bac9d1e2ce3371aec847b9cbf5d147fbae4f6\",\"dweb:/ipfs/QmeczhmnFv1hbXKGLwbYXY6Rrytc9a5A2YaRi5QMMgjPnb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "ECDSA": { + "abi": [ + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204a45519caa943036b099b384dc8f08082679ed7bcf35f4f1926155f3a3b94e9964736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BLOBBASEFEE GASLIMIT MLOAD SWAP13 0xAA SWAP5 ADDRESS CALLDATASIZE 0xB0 SWAP10 0xB3 DUP5 0xDC DUP16 ADDMOD ADDMOD 0x26 PUSH26 0xED7BCF35F4F1926155F3A3B94E9964736F6C634300081B003300 ", + "sourceMap": "344:7470:50:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;344:7470:50;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204a45519caa943036b099b384dc8f08082679ed7bcf35f4f1926155f3a3b94e9964736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BLOBBASEFEE GASLIMIT MLOAD SWAP13 0xAA SWAP5 ADDRESS CALLDATASIZE 0xB0 SWAP10 0xB3 DUP5 0xDC DUP16 ADDMOD ADDMOD 0x26 PUSH26 0xED7BCF35F4F1926155F3A3B94E9964736F6C634300081B003300 ", + "sourceMap": "344:7470:50:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.\",\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":\"ECDSA\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "MessageHashUtils": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220739fcbc5433e639277fd7c7dac5e18e07f939d67d86fd83eaafc76605e2ea54e64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH20 0x9FCBC5433E639277FD7C7DAC5E18E07F939D67D8 PUSH16 0xD83EAAFC76605E2EA54E64736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "521:3729:51:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;521:3729:51;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220739fcbc5433e639277fd7c7dac5e18e07f939d67d86fd83eaafc76605e2ea54e64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH20 0x9FCBC5433E639277FD7C7DAC5E18E07F939D67D8 PUSH16 0xD83EAAFC76605E2EA54E64736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "521:3729:51:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. The library provides methods for generating a hash of a message that conforms to the https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] specifications.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":\"MessageHashUtils\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x81c274a60a7ae232ae3dc9ff3a4011b4849a853c13b0832cd3351bb1bb2f0dae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da0c20dc74358a2a76330818f3bac9d1e2ce3371aec847b9cbf5d147fbae4f6\",\"dweb:/ipfs/QmeczhmnFv1hbXKGLwbYXY6Rrytc9a5A2YaRi5QMMgjPnb\"]},\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "Math": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206d087252d20c33a6b84716edfdc60d52df72243223a4a6e0fb868c95d9ba9d6064736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH14 0x87252D20C33A6B84716EDFDC60D MSTORE 0xDF PUSH19 0x243223A4A6E0FB868C95D9BA9D6064736F6C63 NUMBER STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "281:31863:52:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;281:31863:52;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206d087252d20c33a6b84716edfdc60d52df72243223a4a6e0fb868c95d9ba9d6064736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH14 0x87252D20C33A6B84716EDFDC60D MSTORE 0xDF PUSH19 0x243223A4A6E0FB868C95D9BA9D6064736F6C63 NUMBER STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "281:31863:52:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/math/Math.sol\":\"Math\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "SafeCast": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "int256", + "name": "value", + "type": "int256" + } + ], + "name": "SafeCastOverflowedIntDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "value", + "type": "int256" + } + ], + "name": "SafeCastOverflowedIntToUint", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintToInt", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201f9483f55fcb74a866273ce15b4f1b8be6a52b82c427c107bd5d98b6eb7b5b9664736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x1F SWAP5 DUP4 CREATE2 PUSH0 0xCB PUSH21 0xA866273CE15B4F1B8BE6A52B82C427C107BD5D98B6 0xEB PUSH28 0x5B9664736F6C634300081B0033000000000000000000000000000000 ", + "sourceMap": "769:34173:53:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;769:34173:53;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201f9483f55fcb74a866273ce15b4f1b8be6a52b82c427c107bd5d98b6eb7b5b9664736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x1F SWAP5 DUP4 CREATE2 PUSH0 0xCB PUSH21 0xA866273CE15B4F1B8BE6A52B82C427C107BD5D98B6 0xEB PUSH28 0x5B9664736F6C634300081B0033000000000000000000000000000000 ", + "sourceMap": "769:34173:53:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"int256\",\"name\":\"value\",\"type\":\"int256\"}],\"name\":\"SafeCastOverflowedIntDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"value\",\"type\":\"int256\"}],\"name\":\"SafeCastOverflowedIntToUint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintToInt\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow checks. Downcasting from uint256/int256 in Solidity does not revert on overflow. This can easily result in undesired exploitation or bugs, since developers usually assume that overflows raise errors. `SafeCast` restores this intuition by reverting the transaction when such an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.\",\"errors\":{\"SafeCastOverflowedIntDowncast(uint8,int256)\":[{\"details\":\"Value doesn't fit in an int of `bits` size.\"}],\"SafeCastOverflowedIntToUint(int256)\":[{\"details\":\"An int value doesn't fit in an uint of `bits` size.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}],\"SafeCastOverflowedUintToInt(uint256)\":[{\"details\":\"An uint value doesn't fit in an int of `bits` size.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/math/SafeCast.sol\":\"SafeCast\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]}},\"version\":1}" + } + }, + "@openzeppelin/contracts/utils/math/SignedMath.sol": { + "SignedMath": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203f8ce045c06cb3d784cb291e8c3a0485d015860bc9a53fb4b262bab7802a0bc264736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH DUP13 0xE0 GASLIMIT 0xC0 PUSH13 0xB3D784CB291E8C3A0485D01586 SIGNEXTEND 0xC9 0xA5 EXTCODEHASH 0xB4 0xB2 PUSH3 0xBAB780 0x2A SIGNEXTEND 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "258:2354:54:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;258:2354:54;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203f8ce045c06cb3d784cb291e8c3a0485d015860bc9a53fb4b262bab7802a0bc264736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH DUP13 0xE0 GASLIMIT 0xC0 PUSH13 0xB3D784CB291E8C3A0485D01586 SIGNEXTEND 0xC9 0xA5 EXTCODEHASH 0xB4 0xB2 PUSH3 0xBAB780 0x2A SIGNEXTEND 0xC2 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "258:2354:54:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard signed math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/math/SignedMath.sol\":\"SignedMath\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]}},\"version\":1}" + } + }, + "contracts/DisputeManager.sol": { + "DisputeManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "controller", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedLength", + "type": "uint256" + } + ], + "name": "AttestationInvalidBytesLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeAlreadyCreated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeNotInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + } + ], + "name": "DisputeManagerDisputeNotPending", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodNotFinished", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "DisputeManagerIndexerNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerInvalidDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidDisputeDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "cut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidFishermanReward", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidMaxSlashingCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensSlash", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidTokensSlash", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerMustAcceptRelatedDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "requestCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonConflictingAttestations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotArbitrator", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotFisherman", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerSubgraphServiceNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerZeroTokens", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "ArbitratorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeDepositSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeDrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId1", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId2", + "type": "bytes32" + } + ], + "name": "DisputeLinked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "DisputePeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "fishermanRewardCut", + "type": "uint32" + } + ], + "name": "FishermanRewardCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "IndexingDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "LegacyDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "MaxSlashingCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "attestation", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "QueryDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "subgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_FISHERMAN_REWARD_CUT", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_DISPUTE_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + } + ], + "name": "acceptDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "acceptDisputeInConflict", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "tokensSlashRelated", + "type": "uint256" + } + ], + "name": "acceptDisputeConflict", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "arbitrator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation2", + "type": "tuple" + } + ], + "name": "areConflictingAttestations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "cancelDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "createAndAcceptLegacyDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "createIndexingDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData", + "type": "bytes" + } + ], + "name": "createQueryDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "attestationData2", + "type": "bytes" + } + ], + "name": "createQueryDisputeConflict", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disputeDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "disputes", + "outputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + }, + { + "internalType": "enum IDisputeManager.DisputeType", + "name": "disputeType", + "type": "uint8" + }, + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "drawDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct Attestation.Receipt", + "name": "receipt", + "type": "tuple" + } + ], + "name": "encodeReceipt", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation", + "type": "tuple" + } + ], + "name": "getAttestationIndexer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getStakeSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "arbitrator_", + "type": "address" + }, + { + "internalType": "uint64", + "name": "disputePeriod_", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "disputeDeposit_", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "isDisputeCreated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxSlashingCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "rejectDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "setArbitrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "setDisputeDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "setDisputePeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + } + ], + "name": "setFishermanRewardCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "setMaxSlashingCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "subgraphService_", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract ISubgraphService", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_11993": { + "entryPoint": null, + "id": 11993, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_4795": { + "entryPoint": null, + "id": 4795, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_disableInitializers_5345": { + "entryPoint": 1001, + "id": 5345, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_getContractFromController_4927": { + "entryPoint": 827, + "id": 4927, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_getInitializableStorage_5390": { + "entryPoint": null, + "id": 5390, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_initializableStorageSlot_5376": { + "entryPoint": null, + "id": 5376, + "parameterSlots": 0, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address_fromMemory": { + "entryPoint": 1179, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_address_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address_t_address_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 8, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 1227, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + } + }, + "generatedSources": [ + { + "ast": { + "nativeSrc": "0:2355:70", + "nodeType": "YulBlock", + "src": "0:2355:70", + "statements": [ + { + "nativeSrc": "6:3:70", + "nodeType": "YulBlock", + "src": "6:3:70", + "statements": [] + }, + { + "body": { + "nativeSrc": "95:209:70", + "nodeType": "YulBlock", + "src": "95:209:70", + "statements": [ + { + "body": { + "nativeSrc": "141:16:70", + "nodeType": "YulBlock", + "src": "141:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "150:1:70", + "nodeType": "YulLiteral", + "src": "150:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "153:1:70", + "nodeType": "YulLiteral", + "src": "153:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "143:6:70", + "nodeType": "YulIdentifier", + "src": "143:6:70" + }, + "nativeSrc": "143:12:70", + "nodeType": "YulFunctionCall", + "src": "143:12:70" + }, + "nativeSrc": "143:12:70", + "nodeType": "YulExpressionStatement", + "src": "143:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "116:7:70", + "nodeType": "YulIdentifier", + "src": "116:7:70" + }, + { + "name": "headStart", + "nativeSrc": "125:9:70", + "nodeType": "YulIdentifier", + "src": "125:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "112:3:70", + "nodeType": "YulIdentifier", + "src": "112:3:70" + }, + "nativeSrc": "112:23:70", + "nodeType": "YulFunctionCall", + "src": "112:23:70" + }, + { + "kind": "number", + "nativeSrc": "137:2:70", + "nodeType": "YulLiteral", + "src": "137:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "108:3:70", + "nodeType": "YulIdentifier", + "src": "108:3:70" + }, + "nativeSrc": "108:32:70", + "nodeType": "YulFunctionCall", + "src": "108:32:70" + }, + "nativeSrc": "105:52:70", + "nodeType": "YulIf", + "src": "105:52:70" + }, + { + "nativeSrc": "166:29:70", + "nodeType": "YulVariableDeclaration", + "src": "166:29:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "185:9:70", + "nodeType": "YulIdentifier", + "src": "185:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "179:5:70", + "nodeType": "YulIdentifier", + "src": "179:5:70" + }, + "nativeSrc": "179:16:70", + "nodeType": "YulFunctionCall", + "src": "179:16:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "170:5:70", + "nodeType": "YulTypedName", + "src": "170:5:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "258:16:70", + "nodeType": "YulBlock", + "src": "258:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "267:1:70", + "nodeType": "YulLiteral", + "src": "267:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "270:1:70", + "nodeType": "YulLiteral", + "src": "270:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "260:6:70", + "nodeType": "YulIdentifier", + "src": "260:6:70" + }, + "nativeSrc": "260:12:70", + "nodeType": "YulFunctionCall", + "src": "260:12:70" + }, + "nativeSrc": "260:12:70", + "nodeType": "YulExpressionStatement", + "src": "260:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "217:5:70", + "nodeType": "YulIdentifier", + "src": "217:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "228:5:70", + "nodeType": "YulIdentifier", + "src": "228:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "243:3:70", + "nodeType": "YulLiteral", + "src": "243:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "248:1:70", + "nodeType": "YulLiteral", + "src": "248:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "239:3:70", + "nodeType": "YulIdentifier", + "src": "239:3:70" + }, + "nativeSrc": "239:11:70", + "nodeType": "YulFunctionCall", + "src": "239:11:70" + }, + { + "kind": "number", + "nativeSrc": "252:1:70", + "nodeType": "YulLiteral", + "src": "252:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "235:3:70", + "nodeType": "YulIdentifier", + "src": "235:3:70" + }, + "nativeSrc": "235:19:70", + "nodeType": "YulFunctionCall", + "src": "235:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "224:3:70", + "nodeType": "YulIdentifier", + "src": "224:3:70" + }, + "nativeSrc": "224:31:70", + "nodeType": "YulFunctionCall", + "src": "224:31:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "214:2:70", + "nodeType": "YulIdentifier", + "src": "214:2:70" + }, + "nativeSrc": "214:42:70", + "nodeType": "YulFunctionCall", + "src": "214:42:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "207:6:70", + "nodeType": "YulIdentifier", + "src": "207:6:70" + }, + "nativeSrc": "207:50:70", + "nodeType": "YulFunctionCall", + "src": "207:50:70" + }, + "nativeSrc": "204:70:70", + "nodeType": "YulIf", + "src": "204:70:70" + }, + { + "nativeSrc": "283:15:70", + "nodeType": "YulAssignment", + "src": "283:15:70", + "value": { + "name": "value", + "nativeSrc": "293:5:70", + "nodeType": "YulIdentifier", + "src": "293:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "283:6:70", + "nodeType": "YulIdentifier", + "src": "283:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address_fromMemory", + "nativeSrc": "14:290:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "61:9:70", + "nodeType": "YulTypedName", + "src": "61:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "72:7:70", + "nodeType": "YulTypedName", + "src": "72:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "84:6:70", + "nodeType": "YulTypedName", + "src": "84:6:70", + "type": "" + } + ], + "src": "14:290:70" + }, + { + "body": { + "nativeSrc": "482:160:70", + "nodeType": "YulBlock", + "src": "482:160:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "499:9:70", + "nodeType": "YulIdentifier", + "src": "499:9:70" + }, + { + "kind": "number", + "nativeSrc": "510:2:70", + "nodeType": "YulLiteral", + "src": "510:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "492:6:70", + "nodeType": "YulIdentifier", + "src": "492:6:70" + }, + "nativeSrc": "492:21:70", + "nodeType": "YulFunctionCall", + "src": "492:21:70" + }, + "nativeSrc": "492:21:70", + "nodeType": "YulExpressionStatement", + "src": "492:21:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "533:9:70", + "nodeType": "YulIdentifier", + "src": "533:9:70" + }, + { + "kind": "number", + "nativeSrc": "544:2:70", + "nodeType": "YulLiteral", + "src": "544:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "529:3:70", + "nodeType": "YulIdentifier", + "src": "529:3:70" + }, + "nativeSrc": "529:18:70", + "nodeType": "YulFunctionCall", + "src": "529:18:70" + }, + { + "kind": "number", + "nativeSrc": "549:2:70", + "nodeType": "YulLiteral", + "src": "549:2:70", + "type": "", + "value": "10" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "522:6:70", + "nodeType": "YulIdentifier", + "src": "522:6:70" + }, + "nativeSrc": "522:30:70", + "nodeType": "YulFunctionCall", + "src": "522:30:70" + }, + "nativeSrc": "522:30:70", + "nodeType": "YulExpressionStatement", + "src": "522:30:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "572:9:70", + "nodeType": "YulIdentifier", + "src": "572:9:70" + }, + { + "kind": "number", + "nativeSrc": "583:2:70", + "nodeType": "YulLiteral", + "src": "583:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "568:3:70", + "nodeType": "YulIdentifier", + "src": "568:3:70" + }, + "nativeSrc": "568:18:70", + "nodeType": "YulFunctionCall", + "src": "568:18:70" + }, + { + "hexValue": "436f6e74726f6c6c6572", + "kind": "string", + "nativeSrc": "588:12:70", + "nodeType": "YulLiteral", + "src": "588:12:70", + "type": "", + "value": "Controller" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "561:6:70", + "nodeType": "YulIdentifier", + "src": "561:6:70" + }, + "nativeSrc": "561:40:70", + "nodeType": "YulFunctionCall", + "src": "561:40:70" + }, + "nativeSrc": "561:40:70", + "nodeType": "YulExpressionStatement", + "src": "561:40:70" + }, + { + "nativeSrc": "610:26:70", + "nodeType": "YulAssignment", + "src": "610:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "622:9:70", + "nodeType": "YulIdentifier", + "src": "622:9:70" + }, + { + "kind": "number", + "nativeSrc": "633:2:70", + "nodeType": "YulLiteral", + "src": "633:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "618:3:70", + "nodeType": "YulIdentifier", + "src": "618:3:70" + }, + "nativeSrc": "618:18:70", + "nodeType": "YulFunctionCall", + "src": "618:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "610:4:70", + "nodeType": "YulIdentifier", + "src": "610:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a__to_t_bytes_memory_ptr__fromStack_reversed", + "nativeSrc": "309:333:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "459:9:70", + "nodeType": "YulTypedName", + "src": "459:9:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "473:4:70", + "nodeType": "YulTypedName", + "src": "473:4:70", + "type": "" + } + ], + "src": "309:333:70" + }, + { + "body": { + "nativeSrc": "916:520:70", + "nodeType": "YulBlock", + "src": "916:520:70", + "statements": [ + { + "nativeSrc": "926:27:70", + "nodeType": "YulAssignment", + "src": "926:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "938:9:70", + "nodeType": "YulIdentifier", + "src": "938:9:70" + }, + { + "kind": "number", + "nativeSrc": "949:3:70", + "nodeType": "YulLiteral", + "src": "949:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "934:3:70", + "nodeType": "YulIdentifier", + "src": "934:3:70" + }, + "nativeSrc": "934:19:70", + "nodeType": "YulFunctionCall", + "src": "934:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "926:4:70", + "nodeType": "YulIdentifier", + "src": "926:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "969:9:70", + "nodeType": "YulIdentifier", + "src": "969:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "984:6:70", + "nodeType": "YulIdentifier", + "src": "984:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1000:3:70", + "nodeType": "YulLiteral", + "src": "1000:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1005:1:70", + "nodeType": "YulLiteral", + "src": "1005:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "996:3:70", + "nodeType": "YulIdentifier", + "src": "996:3:70" + }, + "nativeSrc": "996:11:70", + "nodeType": "YulFunctionCall", + "src": "996:11:70" + }, + { + "kind": "number", + "nativeSrc": "1009:1:70", + "nodeType": "YulLiteral", + "src": "1009:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "992:3:70", + "nodeType": "YulIdentifier", + "src": "992:3:70" + }, + "nativeSrc": "992:19:70", + "nodeType": "YulFunctionCall", + "src": "992:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "980:3:70", + "nodeType": "YulIdentifier", + "src": "980:3:70" + }, + "nativeSrc": "980:32:70", + "nodeType": "YulFunctionCall", + "src": "980:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "962:6:70", + "nodeType": "YulIdentifier", + "src": "962:6:70" + }, + "nativeSrc": "962:51:70", + "nodeType": "YulFunctionCall", + "src": "962:51:70" + }, + "nativeSrc": "962:51:70", + "nodeType": "YulExpressionStatement", + "src": "962:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1033:9:70", + "nodeType": "YulIdentifier", + "src": "1033:9:70" + }, + { + "kind": "number", + "nativeSrc": "1044:2:70", + "nodeType": "YulLiteral", + "src": "1044:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1029:3:70", + "nodeType": "YulIdentifier", + "src": "1029:3:70" + }, + "nativeSrc": "1029:18:70", + "nodeType": "YulFunctionCall", + "src": "1029:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "1053:6:70", + "nodeType": "YulIdentifier", + "src": "1053:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1069:3:70", + "nodeType": "YulLiteral", + "src": "1069:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1074:1:70", + "nodeType": "YulLiteral", + "src": "1074:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1065:3:70", + "nodeType": "YulIdentifier", + "src": "1065:3:70" + }, + "nativeSrc": "1065:11:70", + "nodeType": "YulFunctionCall", + "src": "1065:11:70" + }, + { + "kind": "number", + "nativeSrc": "1078:1:70", + "nodeType": "YulLiteral", + "src": "1078:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1061:3:70", + "nodeType": "YulIdentifier", + "src": "1061:3:70" + }, + "nativeSrc": "1061:19:70", + "nodeType": "YulFunctionCall", + "src": "1061:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1049:3:70", + "nodeType": "YulIdentifier", + "src": "1049:3:70" + }, + "nativeSrc": "1049:32:70", + "nodeType": "YulFunctionCall", + "src": "1049:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1022:6:70", + "nodeType": "YulIdentifier", + "src": "1022:6:70" + }, + "nativeSrc": "1022:60:70", + "nodeType": "YulFunctionCall", + "src": "1022:60:70" + }, + "nativeSrc": "1022:60:70", + "nodeType": "YulExpressionStatement", + "src": "1022:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1102:9:70", + "nodeType": "YulIdentifier", + "src": "1102:9:70" + }, + { + "kind": "number", + "nativeSrc": "1113:2:70", + "nodeType": "YulLiteral", + "src": "1113:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1098:3:70", + "nodeType": "YulIdentifier", + "src": "1098:3:70" + }, + "nativeSrc": "1098:18:70", + "nodeType": "YulFunctionCall", + "src": "1098:18:70" + }, + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "1122:6:70", + "nodeType": "YulIdentifier", + "src": "1122:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1138:3:70", + "nodeType": "YulLiteral", + "src": "1138:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1143:1:70", + "nodeType": "YulLiteral", + "src": "1143:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1134:3:70", + "nodeType": "YulIdentifier", + "src": "1134:3:70" + }, + "nativeSrc": "1134:11:70", + "nodeType": "YulFunctionCall", + "src": "1134:11:70" + }, + { + "kind": "number", + "nativeSrc": "1147:1:70", + "nodeType": "YulLiteral", + "src": "1147:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1130:3:70", + "nodeType": "YulIdentifier", + "src": "1130:3:70" + }, + "nativeSrc": "1130:19:70", + "nodeType": "YulFunctionCall", + "src": "1130:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1118:3:70", + "nodeType": "YulIdentifier", + "src": "1118:3:70" + }, + "nativeSrc": "1118:32:70", + "nodeType": "YulFunctionCall", + "src": "1118:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1091:6:70", + "nodeType": "YulIdentifier", + "src": "1091:6:70" + }, + "nativeSrc": "1091:60:70", + "nodeType": "YulFunctionCall", + "src": "1091:60:70" + }, + "nativeSrc": "1091:60:70", + "nodeType": "YulExpressionStatement", + "src": "1091:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1171:9:70", + "nodeType": "YulIdentifier", + "src": "1171:9:70" + }, + { + "kind": "number", + "nativeSrc": "1182:2:70", + "nodeType": "YulLiteral", + "src": "1182:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1167:3:70", + "nodeType": "YulIdentifier", + "src": "1167:3:70" + }, + "nativeSrc": "1167:18:70", + "nodeType": "YulFunctionCall", + "src": "1167:18:70" + }, + { + "arguments": [ + { + "name": "value3", + "nativeSrc": "1191:6:70", + "nodeType": "YulIdentifier", + "src": "1191:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1207:3:70", + "nodeType": "YulLiteral", + "src": "1207:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1212:1:70", + "nodeType": "YulLiteral", + "src": "1212:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1203:3:70", + "nodeType": "YulIdentifier", + "src": "1203:3:70" + }, + "nativeSrc": "1203:11:70", + "nodeType": "YulFunctionCall", + "src": "1203:11:70" + }, + { + "kind": "number", + "nativeSrc": "1216:1:70", + "nodeType": "YulLiteral", + "src": "1216:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1199:3:70", + "nodeType": "YulIdentifier", + "src": "1199:3:70" + }, + "nativeSrc": "1199:19:70", + "nodeType": "YulFunctionCall", + "src": "1199:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1187:3:70", + "nodeType": "YulIdentifier", + "src": "1187:3:70" + }, + "nativeSrc": "1187:32:70", + "nodeType": "YulFunctionCall", + "src": "1187:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1160:6:70", + "nodeType": "YulIdentifier", + "src": "1160:6:70" + }, + "nativeSrc": "1160:60:70", + "nodeType": "YulFunctionCall", + "src": "1160:60:70" + }, + "nativeSrc": "1160:60:70", + "nodeType": "YulExpressionStatement", + "src": "1160:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1240:9:70", + "nodeType": "YulIdentifier", + "src": "1240:9:70" + }, + { + "kind": "number", + "nativeSrc": "1251:3:70", + "nodeType": "YulLiteral", + "src": "1251:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1236:3:70", + "nodeType": "YulIdentifier", + "src": "1236:3:70" + }, + "nativeSrc": "1236:19:70", + "nodeType": "YulFunctionCall", + "src": "1236:19:70" + }, + { + "arguments": [ + { + "name": "value4", + "nativeSrc": "1261:6:70", + "nodeType": "YulIdentifier", + "src": "1261:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1277:3:70", + "nodeType": "YulLiteral", + "src": "1277:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1282:1:70", + "nodeType": "YulLiteral", + "src": "1282:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1273:3:70", + "nodeType": "YulIdentifier", + "src": "1273:3:70" + }, + "nativeSrc": "1273:11:70", + "nodeType": "YulFunctionCall", + "src": "1273:11:70" + }, + { + "kind": "number", + "nativeSrc": "1286:1:70", + "nodeType": "YulLiteral", + "src": "1286:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1269:3:70", + "nodeType": "YulIdentifier", + "src": "1269:3:70" + }, + "nativeSrc": "1269:19:70", + "nodeType": "YulFunctionCall", + "src": "1269:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1257:3:70", + "nodeType": "YulIdentifier", + "src": "1257:3:70" + }, + "nativeSrc": "1257:32:70", + "nodeType": "YulFunctionCall", + "src": "1257:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1229:6:70", + "nodeType": "YulIdentifier", + "src": "1229:6:70" + }, + "nativeSrc": "1229:61:70", + "nodeType": "YulFunctionCall", + "src": "1229:61:70" + }, + "nativeSrc": "1229:61:70", + "nodeType": "YulExpressionStatement", + "src": "1229:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1310:9:70", + "nodeType": "YulIdentifier", + "src": "1310:9:70" + }, + { + "kind": "number", + "nativeSrc": "1321:3:70", + "nodeType": "YulLiteral", + "src": "1321:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1306:3:70", + "nodeType": "YulIdentifier", + "src": "1306:3:70" + }, + "nativeSrc": "1306:19:70", + "nodeType": "YulFunctionCall", + "src": "1306:19:70" + }, + { + "arguments": [ + { + "name": "value5", + "nativeSrc": "1331:6:70", + "nodeType": "YulIdentifier", + "src": "1331:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1347:3:70", + "nodeType": "YulLiteral", + "src": "1347:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1352:1:70", + "nodeType": "YulLiteral", + "src": "1352:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1343:3:70", + "nodeType": "YulIdentifier", + "src": "1343:3:70" + }, + "nativeSrc": "1343:11:70", + "nodeType": "YulFunctionCall", + "src": "1343:11:70" + }, + { + "kind": "number", + "nativeSrc": "1356:1:70", + "nodeType": "YulLiteral", + "src": "1356:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1339:3:70", + "nodeType": "YulIdentifier", + "src": "1339:3:70" + }, + "nativeSrc": "1339:19:70", + "nodeType": "YulFunctionCall", + "src": "1339:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1327:3:70", + "nodeType": "YulIdentifier", + "src": "1327:3:70" + }, + "nativeSrc": "1327:32:70", + "nodeType": "YulFunctionCall", + "src": "1327:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1299:6:70", + "nodeType": "YulIdentifier", + "src": "1299:6:70" + }, + "nativeSrc": "1299:61:70", + "nodeType": "YulFunctionCall", + "src": "1299:61:70" + }, + "nativeSrc": "1299:61:70", + "nodeType": "YulExpressionStatement", + "src": "1299:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1380:9:70", + "nodeType": "YulIdentifier", + "src": "1380:9:70" + }, + { + "kind": "number", + "nativeSrc": "1391:3:70", + "nodeType": "YulLiteral", + "src": "1391:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1376:3:70", + "nodeType": "YulIdentifier", + "src": "1376:3:70" + }, + "nativeSrc": "1376:19:70", + "nodeType": "YulFunctionCall", + "src": "1376:19:70" + }, + { + "arguments": [ + { + "name": "value6", + "nativeSrc": "1401:6:70", + "nodeType": "YulIdentifier", + "src": "1401:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1417:3:70", + "nodeType": "YulLiteral", + "src": "1417:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1422:1:70", + "nodeType": "YulLiteral", + "src": "1422:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1413:3:70", + "nodeType": "YulIdentifier", + "src": "1413:3:70" + }, + "nativeSrc": "1413:11:70", + "nodeType": "YulFunctionCall", + "src": "1413:11:70" + }, + { + "kind": "number", + "nativeSrc": "1426:1:70", + "nodeType": "YulLiteral", + "src": "1426:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1409:3:70", + "nodeType": "YulIdentifier", + "src": "1409:3:70" + }, + "nativeSrc": "1409:19:70", + "nodeType": "YulFunctionCall", + "src": "1409:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1397:3:70", + "nodeType": "YulIdentifier", + "src": "1397:3:70" + }, + "nativeSrc": "1397:32:70", + "nodeType": "YulFunctionCall", + "src": "1397:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1369:6:70", + "nodeType": "YulIdentifier", + "src": "1369:6:70" + }, + "nativeSrc": "1369:61:70", + "nodeType": "YulFunctionCall", + "src": "1369:61:70" + }, + "nativeSrc": "1369:61:70", + "nodeType": "YulExpressionStatement", + "src": "1369:61:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_address_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address_t_address_t_address_t_address__fromStack_reversed", + "nativeSrc": "647:789:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "837:9:70", + "nodeType": "YulTypedName", + "src": "837:9:70", + "type": "" + }, + { + "name": "value6", + "nativeSrc": "848:6:70", + "nodeType": "YulTypedName", + "src": "848:6:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "856:6:70", + "nodeType": "YulTypedName", + "src": "856:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "864:6:70", + "nodeType": "YulTypedName", + "src": "864:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "872:6:70", + "nodeType": "YulTypedName", + "src": "872:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "880:6:70", + "nodeType": "YulTypedName", + "src": "880:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "888:6:70", + "nodeType": "YulTypedName", + "src": "888:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "896:6:70", + "nodeType": "YulTypedName", + "src": "896:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "907:4:70", + "nodeType": "YulTypedName", + "src": "907:4:70", + "type": "" + } + ], + "src": "647:789:70" + }, + { + "body": { + "nativeSrc": "1542:76:70", + "nodeType": "YulBlock", + "src": "1542:76:70", + "statements": [ + { + "nativeSrc": "1552:26:70", + "nodeType": "YulAssignment", + "src": "1552:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1564:9:70", + "nodeType": "YulIdentifier", + "src": "1564:9:70" + }, + { + "kind": "number", + "nativeSrc": "1575:2:70", + "nodeType": "YulLiteral", + "src": "1575:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1560:3:70", + "nodeType": "YulIdentifier", + "src": "1560:3:70" + }, + "nativeSrc": "1560:18:70", + "nodeType": "YulFunctionCall", + "src": "1560:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "1552:4:70", + "nodeType": "YulIdentifier", + "src": "1552:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1594:9:70", + "nodeType": "YulIdentifier", + "src": "1594:9:70" + }, + { + "name": "value0", + "nativeSrc": "1605:6:70", + "nodeType": "YulIdentifier", + "src": "1605:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1587:6:70", + "nodeType": "YulIdentifier", + "src": "1587:6:70" + }, + "nativeSrc": "1587:25:70", + "nodeType": "YulFunctionCall", + "src": "1587:25:70" + }, + "nativeSrc": "1587:25:70", + "nodeType": "YulExpressionStatement", + "src": "1587:25:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nativeSrc": "1441:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1511:9:70", + "nodeType": "YulTypedName", + "src": "1511:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "1522:6:70", + "nodeType": "YulTypedName", + "src": "1522:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "1533:4:70", + "nodeType": "YulTypedName", + "src": "1533:4:70", + "type": "" + } + ], + "src": "1441:177:70" + }, + { + "body": { + "nativeSrc": "1742:406:70", + "nodeType": "YulBlock", + "src": "1742:406:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1759:9:70", + "nodeType": "YulIdentifier", + "src": "1759:9:70" + }, + { + "kind": "number", + "nativeSrc": "1770:2:70", + "nodeType": "YulLiteral", + "src": "1770:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1752:6:70", + "nodeType": "YulIdentifier", + "src": "1752:6:70" + }, + "nativeSrc": "1752:21:70", + "nodeType": "YulFunctionCall", + "src": "1752:21:70" + }, + "nativeSrc": "1752:21:70", + "nodeType": "YulExpressionStatement", + "src": "1752:21:70" + }, + { + "nativeSrc": "1782:27:70", + "nodeType": "YulVariableDeclaration", + "src": "1782:27:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1802:6:70", + "nodeType": "YulIdentifier", + "src": "1802:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1796:5:70", + "nodeType": "YulIdentifier", + "src": "1796:5:70" + }, + "nativeSrc": "1796:13:70", + "nodeType": "YulFunctionCall", + "src": "1796:13:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "1786:6:70", + "nodeType": "YulTypedName", + "src": "1786:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1829:9:70", + "nodeType": "YulIdentifier", + "src": "1829:9:70" + }, + { + "kind": "number", + "nativeSrc": "1840:2:70", + "nodeType": "YulLiteral", + "src": "1840:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1825:3:70", + "nodeType": "YulIdentifier", + "src": "1825:3:70" + }, + "nativeSrc": "1825:18:70", + "nodeType": "YulFunctionCall", + "src": "1825:18:70" + }, + { + "name": "length", + "nativeSrc": "1845:6:70", + "nodeType": "YulIdentifier", + "src": "1845:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1818:6:70", + "nodeType": "YulIdentifier", + "src": "1818:6:70" + }, + "nativeSrc": "1818:34:70", + "nodeType": "YulFunctionCall", + "src": "1818:34:70" + }, + "nativeSrc": "1818:34:70", + "nodeType": "YulExpressionStatement", + "src": "1818:34:70" + }, + { + "nativeSrc": "1861:10:70", + "nodeType": "YulVariableDeclaration", + "src": "1861:10:70", + "value": { + "kind": "number", + "nativeSrc": "1870:1:70", + "nodeType": "YulLiteral", + "src": "1870:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "1865:1:70", + "nodeType": "YulTypedName", + "src": "1865:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "1930:90:70", + "nodeType": "YulBlock", + "src": "1930:90:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1959:9:70", + "nodeType": "YulIdentifier", + "src": "1959:9:70" + }, + { + "name": "i", + "nativeSrc": "1970:1:70", + "nodeType": "YulIdentifier", + "src": "1970:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1955:3:70", + "nodeType": "YulIdentifier", + "src": "1955:3:70" + }, + "nativeSrc": "1955:17:70", + "nodeType": "YulFunctionCall", + "src": "1955:17:70" + }, + { + "kind": "number", + "nativeSrc": "1974:2:70", + "nodeType": "YulLiteral", + "src": "1974:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1951:3:70", + "nodeType": "YulIdentifier", + "src": "1951:3:70" + }, + "nativeSrc": "1951:26:70", + "nodeType": "YulFunctionCall", + "src": "1951:26:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1993:6:70", + "nodeType": "YulIdentifier", + "src": "1993:6:70" + }, + { + "name": "i", + "nativeSrc": "2001:1:70", + "nodeType": "YulIdentifier", + "src": "2001:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1989:3:70", + "nodeType": "YulIdentifier", + "src": "1989:3:70" + }, + "nativeSrc": "1989:14:70", + "nodeType": "YulFunctionCall", + "src": "1989:14:70" + }, + { + "kind": "number", + "nativeSrc": "2005:2:70", + "nodeType": "YulLiteral", + "src": "2005:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1985:3:70", + "nodeType": "YulIdentifier", + "src": "1985:3:70" + }, + "nativeSrc": "1985:23:70", + "nodeType": "YulFunctionCall", + "src": "1985:23:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1979:5:70", + "nodeType": "YulIdentifier", + "src": "1979:5:70" + }, + "nativeSrc": "1979:30:70", + "nodeType": "YulFunctionCall", + "src": "1979:30:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1944:6:70", + "nodeType": "YulIdentifier", + "src": "1944:6:70" + }, + "nativeSrc": "1944:66:70", + "nodeType": "YulFunctionCall", + "src": "1944:66:70" + }, + "nativeSrc": "1944:66:70", + "nodeType": "YulExpressionStatement", + "src": "1944:66:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "1891:1:70", + "nodeType": "YulIdentifier", + "src": "1891:1:70" + }, + { + "name": "length", + "nativeSrc": "1894:6:70", + "nodeType": "YulIdentifier", + "src": "1894:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "1888:2:70", + "nodeType": "YulIdentifier", + "src": "1888:2:70" + }, + "nativeSrc": "1888:13:70", + "nodeType": "YulFunctionCall", + "src": "1888:13:70" + }, + "nativeSrc": "1880:140:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "1902:19:70", + "nodeType": "YulBlock", + "src": "1902:19:70", + "statements": [ + { + "nativeSrc": "1904:15:70", + "nodeType": "YulAssignment", + "src": "1904:15:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "1913:1:70", + "nodeType": "YulIdentifier", + "src": "1913:1:70" + }, + { + "kind": "number", + "nativeSrc": "1916:2:70", + "nodeType": "YulLiteral", + "src": "1916:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1909:3:70", + "nodeType": "YulIdentifier", + "src": "1909:3:70" + }, + "nativeSrc": "1909:10:70", + "nodeType": "YulFunctionCall", + "src": "1909:10:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "1904:1:70", + "nodeType": "YulIdentifier", + "src": "1904:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "1884:3:70", + "nodeType": "YulBlock", + "src": "1884:3:70", + "statements": [] + }, + "src": "1880:140:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2044:9:70", + "nodeType": "YulIdentifier", + "src": "2044:9:70" + }, + { + "name": "length", + "nativeSrc": "2055:6:70", + "nodeType": "YulIdentifier", + "src": "2055:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2040:3:70", + "nodeType": "YulIdentifier", + "src": "2040:3:70" + }, + "nativeSrc": "2040:22:70", + "nodeType": "YulFunctionCall", + "src": "2040:22:70" + }, + { + "kind": "number", + "nativeSrc": "2064:2:70", + "nodeType": "YulLiteral", + "src": "2064:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2036:3:70", + "nodeType": "YulIdentifier", + "src": "2036:3:70" + }, + "nativeSrc": "2036:31:70", + "nodeType": "YulFunctionCall", + "src": "2036:31:70" + }, + { + "kind": "number", + "nativeSrc": "2069:1:70", + "nodeType": "YulLiteral", + "src": "2069:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2029:6:70", + "nodeType": "YulIdentifier", + "src": "2029:6:70" + }, + "nativeSrc": "2029:42:70", + "nodeType": "YulFunctionCall", + "src": "2029:42:70" + }, + "nativeSrc": "2029:42:70", + "nodeType": "YulExpressionStatement", + "src": "2029:42:70" + }, + { + "nativeSrc": "2080:62:70", + "nodeType": "YulAssignment", + "src": "2080:62:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2096:9:70", + "nodeType": "YulIdentifier", + "src": "2096:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nativeSrc": "2115:6:70", + "nodeType": "YulIdentifier", + "src": "2115:6:70" + }, + { + "kind": "number", + "nativeSrc": "2123:2:70", + "nodeType": "YulLiteral", + "src": "2123:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2111:3:70", + "nodeType": "YulIdentifier", + "src": "2111:3:70" + }, + "nativeSrc": "2111:15:70", + "nodeType": "YulFunctionCall", + "src": "2111:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2132:2:70", + "nodeType": "YulLiteral", + "src": "2132:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "2128:3:70", + "nodeType": "YulIdentifier", + "src": "2128:3:70" + }, + "nativeSrc": "2128:7:70", + "nodeType": "YulFunctionCall", + "src": "2128:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2107:3:70", + "nodeType": "YulIdentifier", + "src": "2107:3:70" + }, + "nativeSrc": "2107:29:70", + "nodeType": "YulFunctionCall", + "src": "2107:29:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2092:3:70", + "nodeType": "YulIdentifier", + "src": "2092:3:70" + }, + "nativeSrc": "2092:45:70", + "nodeType": "YulFunctionCall", + "src": "2092:45:70" + }, + { + "kind": "number", + "nativeSrc": "2139:2:70", + "nodeType": "YulLiteral", + "src": "2139:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2088:3:70", + "nodeType": "YulIdentifier", + "src": "2088:3:70" + }, + "nativeSrc": "2088:54:70", + "nodeType": "YulFunctionCall", + "src": "2088:54:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "2080:4:70", + "nodeType": "YulIdentifier", + "src": "2080:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nativeSrc": "1623:525:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1711:9:70", + "nodeType": "YulTypedName", + "src": "1711:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "1722:6:70", + "nodeType": "YulTypedName", + "src": "1722:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "1733:4:70", + "nodeType": "YulTypedName", + "src": "1733:4:70", + "type": "" + } + ], + "src": "1623:525:70" + }, + { + "body": { + "nativeSrc": "2252:101:70", + "nodeType": "YulBlock", + "src": "2252:101:70", + "statements": [ + { + "nativeSrc": "2262:26:70", + "nodeType": "YulAssignment", + "src": "2262:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2274:9:70", + "nodeType": "YulIdentifier", + "src": "2274:9:70" + }, + { + "kind": "number", + "nativeSrc": "2285:2:70", + "nodeType": "YulLiteral", + "src": "2285:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2270:3:70", + "nodeType": "YulIdentifier", + "src": "2270:3:70" + }, + "nativeSrc": "2270:18:70", + "nodeType": "YulFunctionCall", + "src": "2270:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "2262:4:70", + "nodeType": "YulIdentifier", + "src": "2262:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2304:9:70", + "nodeType": "YulIdentifier", + "src": "2304:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "2319:6:70", + "nodeType": "YulIdentifier", + "src": "2319:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2335:2:70", + "nodeType": "YulLiteral", + "src": "2335:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "2339:1:70", + "nodeType": "YulLiteral", + "src": "2339:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2331:3:70", + "nodeType": "YulIdentifier", + "src": "2331:3:70" + }, + "nativeSrc": "2331:10:70", + "nodeType": "YulFunctionCall", + "src": "2331:10:70" + }, + { + "kind": "number", + "nativeSrc": "2343:1:70", + "nodeType": "YulLiteral", + "src": "2343:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2327:3:70", + "nodeType": "YulIdentifier", + "src": "2327:3:70" + }, + "nativeSrc": "2327:18:70", + "nodeType": "YulFunctionCall", + "src": "2327:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2315:3:70", + "nodeType": "YulIdentifier", + "src": "2315:3:70" + }, + "nativeSrc": "2315:31:70", + "nodeType": "YulFunctionCall", + "src": "2315:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2297:6:70", + "nodeType": "YulIdentifier", + "src": "2297:6:70" + }, + "nativeSrc": "2297:50:70", + "nodeType": "YulFunctionCall", + "src": "2297:50:70" + }, + "nativeSrc": "2297:50:70", + "nodeType": "YulExpressionStatement", + "src": "2297:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed", + "nativeSrc": "2153:200:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2221:9:70", + "nodeType": "YulTypedName", + "src": "2221:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "2232:6:70", + "nodeType": "YulTypedName", + "src": "2232:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "2243:4:70", + "nodeType": "YulTypedName", + "src": "2243:4:70", + "type": "" + } + ], + "src": "2153:200:70" + } + ] + }, + "contents": "{\n { }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a__to_t_bytes_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"Controller\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_address_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address_t_address_t_address_t_address__fromStack_reversed(headStart, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 224)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), and(value2, sub(shl(160, 1), 1)))\n mstore(add(headStart, 96), and(value3, sub(shl(160, 1), 1)))\n mstore(add(headStart, 128), and(value4, sub(shl(160, 1), 1)))\n mstore(add(headStart, 160), and(value5, sub(shl(160, 1), 1)))\n mstore(add(headStart, 192), and(value6, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), 32)))\n }\n mstore(add(add(headStart, length), 64), 0)\n tail := add(add(headStart, and(add(length, 31), not(31))), 64)\n }\n function abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n }\n}", + "id": 70, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "6101c060405234801561001157600080fd5b50604051613b6e380380613b6e8339810160408190526100309161049b565b806001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b29061033b565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e59061033b565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e9061033b565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b60208201526101589061033b565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b60208201526101909061033b565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb9061033b565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102099061033b565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102459061033b565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a9061033b565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a4506103356103e9565b50610519565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161037691815260200190565b602060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b7919061049b565b9050826001600160a01b0382166103e25760405163218f5add60e11b815260040161007191906104cb565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104395760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104985780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156104ad57600080fd5b81516001600160a01b03811681146104c457600080fd5b9392505050565b602081526000825180602084015260005b818110156104f957602081860181015160408684010152016104dc565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516135f261057c60003960005050600050506000505060005050600050506000505060005050600050506000611f23015260006119cc01526135f26000f3fe608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "opcodes": "PUSH2 0x1C0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x3B6E CODESIZE SUB DUP1 PUSH2 0x3B6E DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x30 SWAP2 PUSH2 0x49B JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x7A JUMPI PUSH1 0x40 MLOAD PUSH4 0x218F5ADD PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH10 0x21B7B73A3937B63632B9 PUSH1 0xB1 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x100 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xA DUP2 MSTORE PUSH10 0x23B930B8342A37B5B2B7 PUSH1 0xB1 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xB2 SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x7 DUP2 MSTORE PUSH7 0x5374616B696E67 PUSH1 0xC8 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xE5 SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xA0 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD DUP2 MSTORE PUSH13 0x47726170685061796D656E7473 PUSH1 0x98 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x11E SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH14 0x5061796D656E7473457363726F77 PUSH1 0x90 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x158 SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xE0 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xC DUP2 MSTORE PUSH12 0x22B837B1B426B0B730B3B2B9 PUSH1 0xA1 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x190 SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x120 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH14 0x2932BBB0B93239A6B0B730B3B2B9 PUSH1 0x91 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1CB SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x140 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH17 0x4772617068546F6B656E47617465776179 PUSH1 0x78 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x209 SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x160 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH15 0x23B930B834283937BC3CA0B236B4B7 PUSH1 0x89 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x245 SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x180 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x8 DUP2 MSTORE PUSH8 0x21BAB930BA34B7B7 PUSH1 0xC1 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x27A SWAP1 PUSH2 0x33B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH2 0x1A0 DUP2 SWAP1 MSTORE PUSH2 0x100 MLOAD PUSH1 0xA0 MLOAD PUSH1 0x80 MLOAD PUSH1 0xC0 MLOAD PUSH1 0xE0 MLOAD PUSH2 0x120 MLOAD PUSH2 0x140 MLOAD PUSH2 0x160 MLOAD PUSH2 0x180 MLOAD PUSH1 0x40 MLOAD SWAP9 DUP12 AND SWAP11 SWAP8 DUP9 AND SWAP10 SWAP7 SWAP1 SWAP8 AND SWAP8 PUSH32 0xEF5021414834D86E36470F5C1CECF6544FB2BB723F2CA51A4C86FCD8C5919A43 SWAP8 PUSH2 0x324 SWAP8 SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 DUP8 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP7 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 DUP6 AND PUSH1 0x60 DUP6 ADD MSTORE DUP5 AND PUSH1 0x80 DUP5 ADD MSTORE DUP4 AND PUSH1 0xA0 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH2 0x335 PUSH2 0x3E9 JUMP JUMPDEST POP PUSH2 0x519 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x100 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7641A5E DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x376 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x393 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3B7 SWAP2 SWAP1 PUSH2 0x49B JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x3E2 JUMPI PUSH1 0x40 MLOAD PUSH4 0x218F5ADD PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x4CB JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0xF0C57E16840DF040F15088DC2F81FE391C3923BEC73E23A9662EFC9C229C6A00 DUP1 SLOAD PUSH9 0x10000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x439 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND EQ PUSH2 0x498 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xC7F505B2F371AE2175EE4913F4499E1F2633A7B5936321EED1CDAEB6115181D2 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x4C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4F9 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP7 DUP5 ADD ADD MSTORE ADD PUSH2 0x4DC JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x40 DUP3 DUP6 ADD ADD MSTORE PUSH1 0x40 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND DUP5 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0xE0 MLOAD PUSH2 0x100 MLOAD PUSH2 0x120 MLOAD PUSH2 0x140 MLOAD PUSH2 0x160 MLOAD PUSH2 0x180 MLOAD PUSH2 0x1A0 MLOAD PUSH2 0x35F2 PUSH2 0x57C PUSH1 0x0 CODECOPY PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 PUSH2 0x1F23 ADD MSTORE PUSH1 0x0 PUSH2 0x19CC ADD MSTORE PUSH2 0x35F2 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1A1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x50B17AD EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x533E1BA EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xBC7344B EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x11BE1997 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x16972978 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x17337B46 EQ PUSH2 0x28B JUMPI DUP1 PUSH4 0x1792F194 EQ PUSH2 0x295 JUMPI DUP1 PUSH4 0x26058249 EQ PUSH2 0x2A8 JUMPI DUP1 PUSH4 0x29E03FF1 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0x36167E03 EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0x4BC5839A EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0x5AEA0EC4 EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x5BF31D4D EQ PUSH2 0x326 JUMPI DUP1 PUSH4 0x6369DF6B EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0x6CC6CDE1 EQ PUSH2 0x353 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x76C993AE EQ PUSH2 0x36E JUMPI DUP1 PUSH4 0x8D4E9008 EQ PUSH2 0x381 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x394 JUMPI DUP1 PUSH4 0x902A4938 EQ PUSH2 0x39C JUMPI DUP1 PUSH4 0x9334EA52 EQ PUSH2 0x3AC JUMPI DUP1 PUSH4 0x93A90A1E EQ PUSH2 0x3BF JUMPI DUP1 PUSH4 0x9F81A7CF EQ PUSH2 0x3D2 JUMPI DUP1 PUSH4 0xB0E2F7E9 EQ PUSH2 0x3E5 JUMPI DUP1 PUSH4 0xB0EEFABE EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0xBB2A2B47 EQ PUSH2 0x40B JUMPI DUP1 PUSH4 0xBE41F384 EQ PUSH2 0x419 JUMPI DUP1 PUSH4 0xC133B429 EQ PUSH2 0x43C JUMPI DUP1 PUSH4 0xC50A77B1 EQ PUSH2 0x44F JUMPI DUP1 PUSH4 0xC894222E EQ PUSH2 0x462 JUMPI DUP1 PUSH4 0xC9747F51 EQ PUSH2 0x483 JUMPI DUP1 PUSH4 0xCC2D55CD EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0xD36FC9D4 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xD76F62D1 EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4CB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9 PUSH2 0x1B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x2C8A JUMP JUMPDEST PUSH2 0x4DE JUMP JUMPDEST STOP JUMPDEST PUSH1 0x36 SLOAD PUSH2 0x1D2 SWAP1 PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP2 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1B9 PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CF9 JUMP JUMPDEST PUSH2 0x5FC JUMP JUMPDEST PUSH2 0x263 PUSH2 0x209 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x4 DUP6 ADD SLOAD PUSH1 0x5 DUP7 ADD SLOAD PUSH1 0x6 DUP8 ADD SLOAD PUSH1 0x7 SWAP1 SWAP8 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP7 DUP8 AND SWAP8 SWAP7 SWAP1 SWAP6 AND SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 PUSH1 0xFF DUP1 DUP5 AND SWAP5 PUSH2 0x100 SWAP1 SWAP5 DIV AND SWAP3 DUP10 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2DB5 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x734 JUMP JUMPDEST PUSH2 0x1D2 PUSH3 0x7A120 DUP2 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x2A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x748 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH2 0x2BB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x2D1 PUSH1 0x35 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DF JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x2ED CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x8A8 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x300 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E34 JUMP JUMPDEST PUSH2 0x9AE JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP2 SWAP1 PUSH2 0x2E60 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH2 0x319 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x34E CALLDATASIZE PUSH1 0x4 PUSH2 0x2E74 JUMP JUMPDEST PUSH2 0x9E6 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH2 0x2BB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x37C CALLDATASIZE PUSH1 0x4 PUSH2 0x2E8F JUMP JUMPDEST PUSH2 0xA13 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x38F CALLDATASIZE PUSH1 0x4 PUSH2 0x2EAC JUMP JUMPDEST PUSH2 0xA24 JUMP JUMPDEST PUSH2 0x2BB PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x36 SLOAD PUSH2 0x1D2 SWAP1 PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3BA CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0xDE0 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3CD CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0xEDF JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E8F JUMP JUMPDEST PUSH2 0xEF0 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x2F1D JUMP JUMPDEST PUSH2 0xF01 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x406 CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0x1062 JUMP JUMPDEST PUSH1 0x36 SLOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1D2 JUMP JUMPDEST PUSH2 0x42C PUSH2 0x427 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x1073 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DF JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x44A CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0x10A9 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x45D CALLDATASIZE PUSH1 0x4 PUSH2 0x2FA4 JUMP JUMPDEST PUSH2 0x1141 JUMP JUMPDEST PUSH2 0x475 PUSH2 0x470 CALLDATASIZE PUSH1 0x4 PUSH2 0x2FE5 JUMP JUMPDEST PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST PUSH2 0x2BB PUSH2 0x491 CALLDATASIZE PUSH1 0x4 PUSH2 0x30FA JUMP JUMPDEST PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x2D1 PUSH8 0xDE0B6B3A7640000 DUP2 JUMP JUMPDEST PUSH2 0x42C PUSH2 0x4B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x317C JUMP JUMPDEST PUSH2 0x14CD JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x4C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x31B2 JUMP JUMPDEST PUSH2 0x14F5 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x4D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0x1506 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x509 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x513 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x53E JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x56C JUMPI PUSH2 0x56C PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0x5A6 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP4 SWAP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x40 MLOAD PUSH4 0x64D0C32B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x5F6 DUP5 DUP3 DUP6 PUSH2 0x1541 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x606 PUSH2 0x15F2 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND ISZERO SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 DUP2 ISZERO DUP1 ISZERO PUSH2 0x62D JUMPI POP DUP3 JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x1 EQ DUP1 ISZERO PUSH2 0x649 JUMPI POP ADDRESS EXTCODESIZE ISZERO JUMPDEST SWAP1 POP DUP2 ISZERO DUP1 ISZERO PUSH2 0x657 JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x675 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB NOT AND PUSH1 0x1 OR DUP6 SSTORE DUP4 ISZERO PUSH2 0x69E JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL OR DUP6 SSTORE JUMPDEST PUSH2 0x6A7 DUP12 PUSH2 0x161B JUMP JUMPDEST PUSH2 0x6AF PUSH2 0x162C JUMP JUMPDEST PUSH2 0x6B8 DUP11 PUSH2 0x163C JUMP JUMPDEST PUSH2 0x6C1 DUP10 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x6CA DUP9 PUSH2 0x1736 JUMP JUMPDEST PUSH2 0x6D3 DUP8 PUSH2 0x1799 JUMP JUMPDEST PUSH2 0x6DC DUP7 PUSH2 0x180B JUMP JUMPDEST DUP4 ISZERO PUSH2 0x727 JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND DUP6 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC7F505B2F371AE2175EE4913F4499E1F2633A7B5936321EED1CDAEB6115181D2 SWAP1 PUSH2 0x71E SWAP1 PUSH1 0x1 SWAP1 PUSH2 0x2E60 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x73C PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x1736 JUMP JUMPDEST POP JUMP JUMPDEST DUP1 PUSH2 0x752 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x774 JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x7AF JUMPI PUSH1 0x40 MLOAD PUSH4 0x82C0055 PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x7B9 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x7DB JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x809 JUMPI PUSH2 0x809 PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0x843 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x6 DUP2 ADD SLOAD TIMESTAMP LT ISZERO PUSH2 0x877 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1D7753D5 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x881 DUP5 DUP3 PUSH2 0x18C4 JUMP JUMPDEST PUSH1 0x3 DUP2 ADD SLOAD ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x5F6 SWAP2 SWAP1 PUSH2 0x18C4 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x8D3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x8DD DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x8FF JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x92D JUMPI PUSH2 0x92D PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0x967 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD SLOAD DUP4 SWAP1 ISZERO PUSH2 0x99E JUMPI PUSH1 0x40 MLOAD PUSH4 0x64D0C32B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x9A9 DUP4 DUP3 PUSH2 0x194B JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9CF CALLER PUSH1 0x35 SLOAD PUSH2 0x9BF PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x19EE JUMP JUMPDEST PUSH2 0x9DD CALLER PUSH1 0x35 SLOAD DUP6 DUP6 PUSH2 0x1AA6 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9E0 PUSH2 0x9FA CALLDATASIZE DUP5 SWAP1 SUB DUP5 ADD DUP5 PUSH2 0x31DD JUMP JUMPDEST PUSH2 0x1E28 JUMP JUMPDEST PUSH2 0xA07 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0xA11 PUSH1 0x0 PUSH2 0x1EC5 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xA1B PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x1799 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xA52 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 DUP8 SWAP1 SHL AND PUSH1 0x20 DUP3 ADD MSTORE PUSH6 0x6C6567616379 PUSH1 0xD0 SHL PUSH1 0x34 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH1 0x3A ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xAA0 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE022923 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xACB SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAE9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xB0D SWAP2 SWAP1 PUSH2 0x32D9 JUMP JUMPDEST MLOAD SWAP1 POP DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xB39 JUMPI PUSH1 0x40 MLOAD PUSH4 0x34789D8B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND DUP3 MSTORE DUP9 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0xA0 DUP3 ADD MSTORE TIMESTAMP PUSH1 0xC0 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x34 SLOAD PUSH1 0xE0 DUP4 ADD SWAP2 PUSH2 0xBA1 SWAP2 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND SWAP1 PUSH2 0x330C JUMP JUMPDEST DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 ADD DUP2 SWAP1 MSTORE DUP5 DUP2 MSTORE PUSH1 0x37 DUP3 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP4 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP4 SSTORE SWAP4 DUP6 ADD MLOAD PUSH1 0x1 DUP1 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP6 AND OR SWAP1 SSTORE SWAP1 DUP4 ADD MLOAD PUSH1 0x2 DUP3 ADD SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x3 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x4 DUP4 ADD DUP1 SLOAD SWAP4 SWAP5 SWAP2 SWAP4 SWAP1 SWAP3 PUSH1 0xFF NOT SWAP1 SWAP2 AND SWAP2 SWAP1 DUP5 SWAP1 DUP2 GT ISZERO PUSH2 0xC2F JUMPI PUSH2 0xC2F PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 DUP4 PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xC59 JUMPI PUSH2 0xC59 PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0x5 DUP3 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0x6 DUP3 ADD SSTORE PUSH2 0x100 SWAP1 SWAP2 ADD MLOAD PUSH1 0x7 SWAP1 SWAP2 ADD SSTORE PUSH1 0x0 PUSH2 0xC89 PUSH2 0x1F45 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xCB8347FE DUP4 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xCAE SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCDA SWAP3 SWAP2 SWAP1 PUSH2 0x3365 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD08 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xD29 DUP8 DUP7 PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x1F81 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP10 SWAP1 MSTORE SWAP2 DUP2 ADD DUP8 SWAP1 MSTORE DUP2 DUP10 AND SWAP2 DUP5 AND SWAP1 DUP6 SWAP1 PUSH32 0x587A1FC7E80E653A2AB7F63F98C080F5818B8CEDCFD1374590C8C786290ED031 SWAP1 PUSH1 0x60 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x359D DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP9 PUSH1 0x40 MLOAD PUSH2 0xDB1 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xDD0 PUSH2 0x1FBC JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xE0B JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xE15 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0xE37 JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xE65 JUMPI PUSH2 0xE65 PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0xE9F JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xEB8 DUP4 DUP3 PUSH2 0x1FE0 JUMP JUMPDEST PUSH1 0x3 DUP2 ADD SLOAD ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x9A9 SWAP2 SWAP1 PUSH2 0x1FE0 JUMP JUMPDEST PUSH2 0xEE7 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x205F JUMP JUMPDEST PUSH2 0xEF8 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x180B JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xF2C JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH2 0xF36 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0xF58 JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xF86 JUMPI PUSH2 0xF86 PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0xFC0 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD ISZERO ISZERO DUP6 SWAP1 PUSH2 0xFFA JUMPI PUSH1 0x40 MLOAD PUSH1 0x1 PUSH3 0xD62C07 PUSH1 0xE0 SHL SUB NOT DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1014 DUP7 DUP3 DUP8 PUSH2 0x1541 JUMP JUMPDEST DUP4 ISZERO PUSH2 0x103D JUMPI PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1038 SWAP2 SWAP1 DUP6 PUSH2 0x1541 JUMP JUMPDEST PUSH2 0x105A JUMP JUMPDEST PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x105A SWAP2 SWAP1 PUSH2 0x1FE0 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x106A PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x163C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x10A1 JUMPI PUSH2 0x10A1 PUSH2 0x2D8B JUMP JUMPDEST EQ ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x10B4 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP5 PUSH2 0x10CB PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x10E8 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1106 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x112A SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST SWAP1 POP PUSH2 0x113A DUP4 DUP3 PUSH1 0x0 ADD MLOAD PUSH2 0x20D0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1152 CALLER PUSH1 0x35 SLOAD PUSH2 0x9BF PUSH2 0x19CA JUMP JUMPDEST PUSH2 0x9DD CALLER PUSH1 0x35 SLOAD PUSH2 0x1198 DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2165 SWAP3 POP POP POP JUMP JUMPDEST DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x22A5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 CALLER SWAP1 POP PUSH1 0x0 PUSH2 0x121D DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2165 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1260 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2165 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH2 0x126C DUP3 DUP3 PUSH2 0x25A4 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD DUP7 MLOAD SWAP4 DUP8 ADD MLOAD SWAP2 DUP8 ADD MLOAD SWAP5 SWAP6 SWAP3 SWAP5 SWAP1 SWAP4 SWAP3 PUSH2 0x12CB JUMPI PUSH1 0x40 MLOAD PUSH4 0x6ABA5297 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x24 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x44 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0xA4 DUP3 ADD MSTORE PUSH1 0xC4 ADD PUSH2 0x535 JUMP JUMPDEST POP POP POP POP POP POP PUSH2 0x12E0 CALLER PUSH1 0x35 SLOAD PUSH2 0x9BF PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1332 DUP5 PUSH1 0x2 PUSH1 0x35 SLOAD PUSH2 0x12F5 SWAP2 SWAP1 PUSH2 0x3466 JUMP JUMPDEST DUP6 DUP14 DUP14 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x22A5 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1386 DUP6 PUSH1 0x2 PUSH1 0x35 SLOAD PUSH2 0x1349 SWAP2 SWAP1 PUSH2 0x3466 JUMP JUMPDEST DUP6 DUP13 DUP13 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x22A5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH1 0x3 SWAP1 DUP2 ADD DUP5 SWAP1 SSTORE DUP4 DUP4 MSTORE DUP2 DUP4 KECCAK256 ADD DUP6 SWAP1 SSTORE MLOAD SWAP2 SWAP3 POP DUP3 SWAP2 DUP5 SWAP2 PUSH32 0xFEC135A4CF8E5C6E13DEA23BE058BF03A8BF8F1F6FB0A021B0A5AEDDFBA81407 SWAP2 LOG3 SWAP1 SWAP11 SWAP1 SWAP10 POP SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x13EE DUP4 PUSH2 0x25D5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x13FA PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE022923 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1425 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1443 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1467 SWAP2 SWAP1 PUSH2 0x32D9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1495 JUMPI PUSH1 0x40 MLOAD PUSH4 0x34789D8B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST POP PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x20 DUP3 ADD MLOAD SWAP1 DUP2 DUP2 EQ PUSH2 0x14C3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA24CFE5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9DD PUSH2 0x14E1 CALLDATASIZE DUP6 SWAP1 SUB DUP6 ADD DUP6 PUSH2 0x30FA JUMP JUMPDEST PUSH2 0x14F0 CALLDATASIZE DUP6 SWAP1 SUB DUP6 ADD DUP6 PUSH2 0x30FA JUMP JUMPDEST PUSH2 0x25A4 JUMP JUMPDEST PUSH2 0x14FD PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x150E PUSH2 0x1892 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1538 JUMPI PUSH1 0x0 PUSH1 0x40 MLOAD PUSH4 0x1E4FBDF7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x1EC5 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x7 DUP4 ADD SLOAD PUSH1 0x0 SWAP2 PUSH2 0x1562 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH2 0x265E JUMP JUMPDEST PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 OR SWAP1 SSTORE PUSH1 0x1 DUP5 ADD SLOAD PUSH1 0x2 DUP6 ADD SLOAD SWAP2 SWAP3 POP PUSH2 0x15A2 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH2 0x159A SWAP1 DUP5 PUSH2 0x330C JUMP JUMPDEST PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 DUP4 ADD SLOAD DUP4 SLOAD PUSH1 0x2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP7 SWAP1 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x359D DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH2 0x15DB SWAP1 DUP7 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0xF0C57E16840DF040F15088DC2F81FE391C3923BEC73E23A9662EFC9C229C6A00 PUSH2 0x9E0 JUMP JUMPDEST PUSH2 0x1623 PUSH2 0x280F JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x2834 JUMP JUMPDEST PUSH2 0x1634 PUSH2 0x280F JUMP JUMPDEST PUSH2 0xA11 PUSH2 0x283C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1663 JUMPI PUSH1 0x40 MLOAD PUSH4 0x616BC441 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x34 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x51744122301B50E919F4E3D22ADF8C53ABC92195B8C667EDA98C6EF20375672E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 SUB PUSH2 0x16D7 JUMPI PUSH1 0x40 MLOAD PUSH4 0xC4411F11 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x34 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x310462A9BF49FFF4A57910EC647C77CBF8AAF2F13394554AC6CDF14FC68DB7E6 SWAP1 PUSH2 0x172B SWAP1 DUP4 SWAP1 PUSH2 0x2E60 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST DUP1 PUSH8 0xDE0B6B3A7640000 DUP2 LT ISZERO PUSH2 0x1763 JUMPI PUSH1 0x40 MLOAD PUSH4 0x33F4E05 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x35 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x97896B9DA0F97F36BF3011570BCFF930069299DE4B1E89C9CB44909841CAC2F8 SWAP1 PUSH1 0x20 ADD PUSH2 0x172B JUMP JUMPDEST DUP1 PUSH3 0x7A120 PUSH4 0xFFFFFFFF DUP3 AND GT ISZERO PUSH2 0x17C5 JUMPI PUSH1 0x40 MLOAD PUSH4 0x432E6643 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST POP PUSH1 0x36 DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC573DC0F869F6A1D0A74FC7712A63BAABCB5567131D2D98005E163924EDDCBAB SWAP1 PUSH2 0x172B SWAP1 DUP4 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST DUP1 PUSH4 0xFFFFFFFF DUP2 AND PUSH3 0xF4240 LT ISZERO PUSH2 0x1837 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4E9374FB PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST POP PUSH1 0x36 DUP1 SLOAD PUSH4 0xFFFFFFFF PUSH1 0x20 SHL NOT AND PUSH1 0x1 PUSH1 0x20 SHL PUSH4 0xFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR SWAP3 DUP4 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7EFAF01BEC3CDA8D104163BB466D01D7E16F68848301C7EB0749CFA59D680502 SWAP4 PUSH2 0x172B SWAP4 SWAP3 SWAP1 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x2CAC JUMP JUMPDEST CALLER PUSH2 0x189B PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA11 JUMPI CALLER PUSH1 0x40 MLOAD PUSH4 0x118CDAA7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x4 DUP2 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x500 OR SWAP1 SSTORE PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH2 0x18F5 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH32 0x223103F8EB52E5F43A75655152ACD882A605D70DF57A5C0FEFD30F516B1756D2 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x4 DUP2 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x200 OR SWAP1 SSTORE PUSH1 0x2 DUP2 ADD SLOAD PUSH2 0x197C SWAP1 PUSH2 0x196D PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x290E JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH32 0x2226EBD23625A7938FB786DF2248BD171D2E6AD70CB2B654EA1BE830CA17224D SWAP1 PUSH1 0x20 ADD PUSH2 0x193F JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x40 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE ADDRESS PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP4 SWAP1 MSTORE DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH1 0x64 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1A6E SWAP2 SWAP1 PUSH2 0x3488 JUMP JUMPDEST PUSH2 0x9A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x10BA3930B739B332B9 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x535 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 DUP5 SWAP1 SHL AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x34 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x54 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH2 0x1AED DUP2 PUSH2 0x1073 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x1B10 JUMPI PUSH1 0x40 MLOAD PUSH4 0x124A23F1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x1B1B PUSH2 0x1F45 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE022923 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1B4B SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B69 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1B8D SWAP2 SWAP1 PUSH2 0x32D9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1BBB JUMPI PUSH1 0x40 MLOAD PUSH4 0x34789D8B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x1BC6 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP4 DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BF3 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C35 SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SUB PUSH2 0x1C5A JUMPI PUSH1 0x40 MLOAD PUSH4 0x307EFDB7 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1C6A DUP4 DUP4 PUSH1 0x0 ADD MLOAD PUSH2 0x20D0 JUMP JUMPDEST PUSH1 0x34 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x1C8D SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP PUSH2 0x330C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE DUP16 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP14 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x60 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x80 DUP2 ADD PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE PUSH1 0x60 SWAP3 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x37 DUP4 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP4 SSTORE SWAP4 DUP7 ADD MLOAD PUSH1 0x1 DUP1 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP6 AND OR SWAP1 SSTORE SWAP1 DUP5 ADD MLOAD PUSH1 0x2 DUP3 ADD SSTORE SWAP2 DUP4 ADD MLOAD PUSH1 0x3 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD SWAP2 SWAP4 SWAP1 SWAP3 PUSH1 0xFF NOT SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 GT ISZERO PUSH2 0x1D64 JUMPI PUSH2 0x1D64 PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 DUP4 PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x1D8E JUMPI PUSH2 0x1D8E PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0x5 DUP3 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0x6 DUP3 ADD SSTORE PUSH2 0x100 SWAP1 SWAP2 ADD MLOAD PUSH1 0x7 SWAP1 SWAP2 ADD SSTORE DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 DUP2 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD DUP13 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP5 SWAP1 MSTORE DUP2 DUP16 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP10 SWAP1 PUSH32 0x8A1ECCECCE948A912E2E195DE5960359755AEAC90AD88A3FDE55A77E1A73796B SWAP1 PUSH1 0xA0 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP5 SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 MLOAD PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH1 0x40 SWAP5 DUP6 ADD MLOAD DUP6 MLOAD PUSH32 0x32DD026408194A0D7E54CC66A2AB6C856EFC55CFCD4DD258FDE5B1A55222BAA6 DUP2 DUP6 ADD MSTORE DUP1 DUP8 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 DUP4 ADD DUP6 MSTORE DUP1 MLOAD SWAP1 DUP3 ADD KECCAK256 PUSH2 0x1901 PUSH1 0xF0 SHL PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xC2 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xE2 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP4 MLOAD DUP1 DUP4 SUB SWAP1 SWAP4 ADD DUP4 MSTORE PUSH2 0x102 SWAP1 SWAP2 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1ECF PUSH2 0x1FBC JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP4 SWAP5 POP SWAP2 AND SWAP2 DUP3 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F71 JUMPI PUSH1 0x40 MLOAD PUSH4 0xBD088B4F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE DUP5 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH1 0x44 ADD PUSH2 0x1A2B JUMP JUMPDEST PUSH32 0x9016D09D72D40FDAE2FD8CEAC6B6234C7706214FD39C1CD1E609A0528C199300 SWAP1 JUMP JUMPDEST PUSH1 0x4 DUP2 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x300 OR SWAP1 SSTORE PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH2 0x2011 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH32 0xF0912EFB86EA1D65A17D64D48393CDB1CA0EA5220DD2BBE438621199D30955B7 SWAP1 PUSH1 0x20 ADD PUSH2 0x193F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH4 0x616BC441 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x81DCB738DA3DABD5BB2ADBC7DD107FBBFCA936E9C8AECAB25F5B17A710A784C7 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x20DB PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x561285E4 DUP6 PUSH2 0x20F2 PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x210F SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x212C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2150 SWAP2 SWAP1 PUSH2 0x34A5 JUMP JUMPDEST MLOAD SWAP1 POP PUSH2 0x215D DUP2 DUP5 PUSH2 0x330C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH2 0x21A4 PUSH1 0x20 DUP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21AE SWAP2 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21B9 SWAP1 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST DUP3 MLOAD SWAP1 DUP2 EQ SWAP1 PUSH1 0x1 PUSH2 0x21CC PUSH1 0x20 DUP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21D6 SWAP2 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21E1 SWAP1 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x2202 JUMPI PUSH1 0x40 MLOAD PUSH4 0x3FDF3423 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x221D SWAP2 SWAP1 PUSH2 0x3524 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 PUSH2 0x2230 DUP7 PUSH1 0x60 PUSH2 0x296E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2249 DUP8 PUSH2 0x2244 PUSH1 0x20 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x296E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x226D DUP9 PUSH1 0x20 PUSH2 0x225E DUP2 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x2268 SWAP2 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x29B9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE SWAP8 DUP9 MSTORE PUSH1 0x20 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE SWAP5 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP5 ADD MSTORE POP PUSH1 0xFF AND PUSH1 0xA0 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x22B1 DUP5 PUSH2 0x13E2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22BD PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP4 PUSH2 0x22D4 PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22F1 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x230F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2333 SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SUB PUSH2 0x2358 JUMPI PUSH1 0x40 MLOAD PUSH4 0x307EFDB7 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 MLOAD PUSH1 0x20 DUP1 DUP8 ADD MLOAD PUSH1 0x40 DUP1 DUP10 ADD MLOAD DUP2 MLOAD SWAP4 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT DUP5 DUP4 SHL DUP2 AND PUSH1 0x80 DUP4 ADD MSTORE SWAP2 DUP10 SWAP1 SHL SWAP1 SWAP2 AND PUSH1 0x94 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH1 0xA8 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH2 0x23C1 DUP2 PUSH2 0x1073 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x23E4 JUMPI PUSH1 0x40 MLOAD PUSH4 0x124A23F1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x23F5 DUP5 DUP5 PUSH1 0x0 ADD MLOAD PUSH2 0x20D0 JUMP JUMPDEST PUSH1 0x34 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x2418 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP PUSH2 0x330C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND DUP3 MSTORE DUP14 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x60 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x80 DUP2 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE PUSH1 0x60 SWAP3 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x37 DUP4 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP4 SSTORE SWAP4 DUP7 ADD MLOAD PUSH1 0x1 DUP1 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP6 AND OR SWAP1 SSTORE SWAP1 DUP5 ADD MLOAD PUSH1 0x2 DUP3 ADD SSTORE SWAP2 DUP4 ADD MLOAD PUSH1 0x3 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD SWAP2 SWAP4 SWAP1 SWAP3 PUSH1 0xFF NOT SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 GT ISZERO PUSH2 0x24ED JUMPI PUSH2 0x24ED PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 DUP4 PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x2517 JUMPI PUSH2 0x2517 PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD SSTORE SWAP1 POP POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH32 0xFB70FAF7306B83C2CEC6D8C1627BAAD892CB79968A02CC0353174499ECFD8B35 DUP13 DUP13 PUSH1 0x40 ADD MLOAD DUP13 DUP8 DUP10 PUSH1 0x40 MLOAD PUSH2 0x258E SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3552 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MLOAD PUSH1 0x0 SWAP2 EQ DUP1 ISZERO PUSH2 0x25BF JUMPI POP DUP2 PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD EQ JUMPDEST DUP1 ISZERO PUSH2 0x9DD JUMPI POP POP PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MLOAD EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP3 ADD MSTORE DUP3 DUP3 ADD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 PUSH2 0x2605 DUP3 PUSH2 0x1E28 JUMP JUMPDEST SWAP1 POP PUSH2 0x215D DUP2 DUP6 PUSH1 0x60 ADD MLOAD DUP7 PUSH1 0x80 ADD MLOAD DUP8 PUSH1 0xA0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x264A SWAP4 SWAP3 SWAP2 SWAP1 SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xF8 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x41 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x2A04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2669 PUSH2 0x1F45 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2675 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP8 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x26A2 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x26E4 SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST PUSH1 0x36 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x2709 SWAP1 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0x20 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2A2E AND JUMP JUMPDEST SWAP1 POP DUP6 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x271A JUMPI POP DUP1 DUP7 GT ISZERO JUMPDEST DUP7 DUP3 SWAP1 SWAP2 PUSH2 0x273D JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC6B7C41 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP PUSH1 0x0 PUSH2 0x274F DUP8 DUP5 PUSH1 0x0 ADD MLOAD PUSH2 0x2A8E JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x36 SLOAD SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 PUSH2 0x2770 SWAP2 PUSH4 0xFFFFFFFF SWAP1 DUP2 AND SWAP2 AND PUSH2 0x2A8E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x277E DUP3 DUP5 PUSH2 0x2A2E JUMP JUMPDEST SWAP1 POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xCB8347FE DUP12 DUP12 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x27A3 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27CF SWAP3 SWAP2 SWAP1 PUSH2 0x3365 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x27FD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2817 PUSH2 0x2AA5 JUMP JUMPDEST PUSH2 0xA11 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1AFCD79F PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x150E PUSH2 0x280F JUMP JUMPDEST PUSH2 0x2844 PUSH2 0x280F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xD87CD6EF79D4E2B95E15CE8ABF732DB51EC771F1CA2EDCCF22A46C729AC56472 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x171A7FA058648750A8C5AAE430F30DB8D0100EFC3A5E1B2E8054B1C1CE28B6B4 SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x44852B2A670ADE5407E78FB2863C51DE9FCB96542A07186FE3AEDA6BB8A116D PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH32 0xA070FFB1CD7409649BF77822CCE74495468E06DBFAEF09556838BF188679B9C2 PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 PUSH1 0x0 SSTORE JUMP JUMPDEST DUP1 ISZERO PUSH2 0x296A JUMPI PUSH1 0x40 MLOAD PUSH4 0x852CD8D PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0x42966C68 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2956 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x105A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x297B PUSH1 0x20 DUP4 PUSH2 0x330C JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP2 LT ISZERO SWAP1 PUSH2 0x298D PUSH1 0x20 DUP6 PUSH2 0x330C JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x29AE JUMPI PUSH1 0x40 MLOAD PUSH4 0x3FDF3423 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29C6 PUSH1 0x1 DUP4 PUSH2 0x330C JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP2 LT ISZERO SWAP1 PUSH2 0x29D8 PUSH1 0x1 DUP6 PUSH2 0x330C JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x29F9 JUMPI PUSH1 0x40 MLOAD PUSH4 0x3FDF3423 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP POP ADD PUSH1 0x1 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2A14 DUP7 DUP7 PUSH2 0x2ABF JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x2A24 DUP3 DUP3 PUSH2 0x2B0C JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A3D DUP4 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP1 PUSH2 0x2A50 JUMPI POP PUSH2 0x2A50 DUP3 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP4 DUP4 SWAP1 SWAP2 PUSH2 0x2A73 JUMPI PUSH1 0x40 MLOAD PUSH4 0x768BF0EB PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP PUSH3 0xF4240 SWAP1 POP PUSH2 0x2A84 DUP4 DUP6 PUSH2 0x3585 JUMP JUMPDEST PUSH2 0x9DD SWAP2 SWAP1 PUSH2 0x3466 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x2A9E JUMPI DUP2 PUSH2 0x9DD JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AAF PUSH2 0x15F2 JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH1 0xFF AND SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 MLOAD PUSH1 0x41 SUB PUSH2 0x2AF9 JUMPI PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x2AEB DUP9 DUP3 DUP6 DUP6 PUSH2 0x2BC5 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP POP POP POP PUSH2 0x2B05 JUMP JUMPDEST POP POP DUP2 MLOAD PUSH1 0x0 SWAP2 POP PUSH1 0x2 SWAP1 JUMPDEST SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2B20 JUMPI PUSH2 0x2B20 PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x2B29 JUMPI POP POP JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2B3D JUMPI PUSH2 0x2B3D PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x2B5B JUMPI PUSH1 0x40 MLOAD PUSH4 0xF645EEDF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2B6F JUMPI PUSH2 0x2B6F PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x2B90 JUMPI PUSH1 0x40 MLOAD PUSH4 0xFCE698F7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x535 JUMP JUMPDEST PUSH1 0x3 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2BA4 JUMPI PUSH2 0x2BA4 PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x296A JUMPI PUSH1 0x40 MLOAD PUSH4 0x35E2F383 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x535 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH16 0xA2A8918CA85BAFE22016D0B997E4DF60 PUSH1 0x1 PUSH1 0xFF SHL SUB DUP5 GT ISZERO PUSH2 0x2BF6 JUMPI POP PUSH1 0x0 SWAP2 POP PUSH1 0x3 SWAP1 POP DUP3 PUSH2 0x2C80 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP10 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2C76 JUMPI POP PUSH1 0x0 SWAP3 POP PUSH1 0x1 SWAP2 POP DUP3 SWAP1 POP PUSH2 0x2C80 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 SWAP2 POP DUP2 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2C9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2D12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2D1D DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2D2D DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x2D3D DUP2 PUSH2 0x2CD2 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH2 0x2D54 DUP2 PUSH2 0x2CE7 JUMP JUMPDEST SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH2 0x2D64 DUP2 PUSH2 0x2CE7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2D84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 DUP2 LT PUSH2 0x2DB1 JUMPI PUSH2 0x2DB1 PUSH2 0x2D8B JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND DUP3 MSTORE DUP10 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD DUP9 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP8 SWAP1 MSTORE PUSH2 0x120 DUP2 ADD PUSH1 0x4 DUP8 LT PUSH2 0x2DEC JUMPI PUSH2 0x2DEC PUSH2 0x2D8B JUMP JUMPDEST DUP7 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x2DFF PUSH1 0xA0 DUP4 ADD DUP8 PUSH2 0x2DA1 JUMP JUMPDEST DUP5 PUSH1 0xC0 DUP4 ADD MSTORE DUP4 PUSH1 0xE0 DUP4 ADD MSTORE DUP3 PUSH2 0x100 DUP4 ADD MSTORE SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2E47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x2E52 DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x2E87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2EA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x113A DUP2 PUSH2 0x2CE7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2EC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2ECD DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x2EDD DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2F04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x113A DUP2 PUSH2 0x2CBD JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2F33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x2F4C DUP2 PUSH2 0x2F0F JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2F6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2F85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2F9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2FB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2FCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2FD9 DUP6 DUP3 DUP7 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2FFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x3011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x301D DUP8 DUP3 DUP9 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP1 SWAP6 POP SWAP4 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x303C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3048 DUP8 DUP3 DUP9 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xC0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3092 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x120 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3092 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x140 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3092 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x310D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 PUSH2 0x3118 PUSH2 0x3062 JUMP JUMPDEST DUP4 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x3157 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x180 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x319A DUP5 DUP5 PUSH2 0x3164 JUMP JUMPDEST SWAP2 POP PUSH2 0x31A9 DUP5 PUSH1 0xC0 DUP6 ADD PUSH2 0x3164 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x31C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x113A DUP2 PUSH2 0x2CD2 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x9E0 DUP3 DUP5 PUSH2 0x2DA1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x31F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3222 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL DUP4 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 DUP4 REVERT JUMPDEST PUSH1 0x40 SWAP1 DUP2 MSTORE DUP5 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 DUP1 DUP7 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE SWAP4 DUP5 ADD CALLDATALOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH2 0x3253 DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x120 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x326B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3273 PUSH2 0x3098 JUMP JUMPDEST SWAP1 POP PUSH2 0x327E DUP3 PUSH2 0x3248 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xC0 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xE0 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x100 SWAP2 DUP3 ADD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x120 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x32EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9DD DUP4 DUP4 PUSH2 0x3258 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x9E0 JUMPI PUSH2 0x9E0 PUSH2 0x32F6 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3345 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x3329 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x215D SWAP1 DUP4 ADD DUP5 PUSH2 0x331F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x3253 DUP2 PUSH2 0x2CE7 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x3253 DUP2 PUSH2 0x2CD2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x33CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 PUSH2 0x33D8 PUSH2 0x30C9 JUMP JUMPDEST DUP4 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x33FC PUSH1 0x60 DUP6 ADD PUSH2 0x33A3 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x340D PUSH1 0x80 DUP6 ADD PUSH2 0x33AE JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x341E PUSH1 0xA0 DUP6 ADD PUSH2 0x33AE JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x342F PUSH1 0xC0 DUP6 ADD PUSH2 0x33A3 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x3440 PUSH1 0xE0 DUP6 ADD PUSH2 0x33AE JUMP JUMPDEST PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x120 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3483 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x349A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x113A DUP2 PUSH2 0x2F0F JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x34B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xA0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x34EA JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL DUP4 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 DUP4 REVERT JUMPDEST PUSH1 0x40 SWAP1 DUP2 MSTORE DUP5 MLOAD DUP3 MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD SWAP1 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 SWAP1 SWAP4 ADD MLOAD SWAP1 SWAP5 SWAP3 SWAP4 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP6 DUP2 MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x3571 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x331F JUMP JUMPDEST PUSH1 0x60 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x80 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x9E0 JUMPI PUSH2 0x9E0 PUSH2 0x32F6 JUMP INVALID PUSH14 0x800AAAF64B9A1F321DCD63DA0436 SWAP14 CALLER 0xD8 LOG0 0xD4 SWAP11 0xD0 0xFB 0xBA ADDMOD GAS 0xAB BLOBBASEFEE SWAP9 0xBF BALANCE 0xC4 LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 SIGNEXTEND RETURNDATASIZE 0xEC 0x1E TSTORE 0x2D SAR EQ SMOD CALLER 0xDC 0xA7 0xD5 AND CODECOPY STOP 0xC1 0xFC DUP9 0x29 SELFBALANCE 0xB3 KECCAK256 DUP9 PUSH5 0x910C6F452D 0xE PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "2323:25016:55:-:0;;;3976:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4023:10;-1:-1:-1;;;;;4355:24:37;;4347:81;;;;-1:-1:-1;;;4347:81:37;;510:2:70;4347:81:37;;;492:21:70;549:2;529:18;;;522:30;-1:-1:-1;;;568:18:70;;;561:40;618:18;;4347:81:37;;;;;;;;;-1:-1:-1;;;;;4439:42:37;;;;4517:40;;;;;;;;;;;;-1:-1:-1;;;4517:40:37;;;;;;:26;:40::i;:::-;-1:-1:-1;;;;;4491:67:37;;;4600:37;;;;;;;;;;;;-1:-1:-1;;;4600:37:37;;;;;;:26;:37::i;:::-;-1:-1:-1;;;;;4568:70:37;;;4680:43;;;;;;;;;;;;-1:-1:-1;;;4680:43:37;;;;;;:26;:43::i;:::-;-1:-1:-1;;;;;4648:76:37;;;4774:44;;;;;;;;;;;;-1:-1:-1;;;4774:44:37;;;;;;:26;:44::i;:::-;-1:-1:-1;;;;;4734:85:37;;;4865:42;;;;;;;;;;;;-1:-1:-1;;;4865:42:37;;;;;;:26;:42::i;:::-;-1:-1:-1;;;;;4829:79:37;;;4958:44;;;;;;;;;;;;-1:-1:-1;;;4958:44:37;;;;;;:26;:44::i;:::-;-1:-1:-1;;;;;4918:85:37;;;5049:47;;;;;;;;;;;;-1:-1:-1;;;5049:47:37;;;;;;:26;:47::i;:::-;-1:-1:-1;;;;;5013:84:37;;;5144:45;;;;;;;;;;;;-1:-1:-1;;;5144:45:37;;;;;;:26;:45::i;:::-;-1:-1:-1;;;;;5107:83:37;;;5227:38;;;;;;;;;;;;-1:-1:-1;;;5227:38:37;;;;;;:26;:38::i;:::-;-1:-1:-1;;;;;5200:66:37;;;;;;;5480:16;;5363:13;;5329:11;;5399:14;;5436:21;;5519:19;;5561:21;;5605:19;;5647:17;;5282:430;;;;;;;;;;;;;;;;;;;5647:17;;-1:-1:-1;;;;;980:32:70;;;962:51;;1049:32;;;1044:2;1029:18;;1022:60;1118:32;;;1113:2;1098:18;;1091:60;1187:32;;;1182:2;1167:18;;1160:60;1257:32;;1251:3;1236:19;;1229:61;1327:32;;1000:3;1306:19;;1299:61;1397:32;;;1391:3;1376:19;;1369:61;949:3;934:19;;647:789;5282:430:37;;;;;;;;-1:-1:-1;4045:22:55::1;:20;:22::i;:::-;3976:98:::0;2323:25016;;8217:326:37;8303:7;8322:23;8348:16;;-1:-1:-1;;;;;8348:33:37;;8392:13;8382:24;;;;;;8348:59;;;;;;;;;;;;;1587:25:70;;1575:2;1560:18;;1441:177;8348:59:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8322:85;-1:-1:-1;8489:13:37;-1:-1:-1;;;;;8425:29:37;;8417:87;;;;-1:-1:-1;;;8417:87:37;;;;;;;;:::i;:::-;-1:-1:-1;8521:15:37;8217:326;-1:-1:-1;;8217:326:37:o;7709:422:39:-;3147:66;7898:15;;;;;;;7894:76;;;7936:23;;-1:-1:-1;;;7936:23:39;;;;;;;;;;;7894:76;7983:14;;-1:-1:-1;;;;;7983:14:39;;;:34;7979:146;;8033:33;;-1:-1:-1;;;;;;8033:33:39;-1:-1:-1;;;;;8033:33:39;;;;;8085:29;;2297:50:70;;;8085:29:39;;2285:2:70;2270:18;8085:29:39;;;;;;;7979:146;7758:373;7709:422::o;14:290:70:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:70;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:70:o;1623:525::-;1770:2;1759:9;1752:21;1733:4;1802:6;1796:13;1845:6;1840:2;1829:9;1825:18;1818:34;1870:1;1880:140;1894:6;1891:1;1888:13;1880:140;;;2005:2;1989:14;;;1985:23;;1979:30;1974:2;1955:17;;;1951:26;1944:66;1909:10;1880:140;;;1884:3;2069:1;2064:2;2055:6;2044:9;2040:22;2036:31;2029:42;2139:2;2132;2128:7;2123:2;2115:6;2111:15;2107:29;2096:9;2092:45;2088:54;2080:62;;;1623:525;;;;:::o;2153:200::-;2323:25016:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@MAX_FISHERMAN_REWARD_CUT_11901": { + "entryPoint": null, + "id": 11901, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@MIN_DISPUTE_DEPOSIT_11905": { + "entryPoint": null, + "id": 11905, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__AttestationManager_init_17454": { + "entryPoint": 5676, + "id": 17454, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__AttestationManager_init_unchained_17479": { + "entryPoint": 10300, + "id": 17479, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__Ownable_init_4983": { + "entryPoint": 5659, + "id": 4983, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@__Ownable_init_unchained_5010": { + "entryPoint": 10292, + "id": 5010, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_acceptDispute_13118": { + "entryPoint": 5441, + "id": 13118, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_cancelDispute_13227": { + "entryPoint": 6340, + "id": 13227, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_checkInitializing_5299": { + "entryPoint": 10255, + "id": 5299, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_checkOwner_5051": { + "entryPoint": 6290, + "id": 5051, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_createIndexingDisputeWithAllocation_13065": { + "entryPoint": 6822, + "id": 13065, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@_createQueryDisputeWithAttestation_12923": { + "entryPoint": 8869, + "id": 12923, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@_drawDispute_13190": { + "entryPoint": 8160, + "id": 13190, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_encodeReceipt_17554": { + "entryPoint": 7720, + "id": 17554, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_getInitializableStorage_5390": { + "entryPoint": 5618, + "id": 5390, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getOwnableStorage_4954": { + "entryPoint": 8124, + "id": 4954, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getStakeSnapshot_13541": { + "entryPoint": 8400, + "id": 13541, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_getSubgraphService_13494": { + "entryPoint": 8005, + "id": 13494, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_graphStaking_4815": { + "entryPoint": 7969, + "id": 4815, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_graphToken_4805": { + "entryPoint": 6602, + "id": 4805, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_initializableStorageSlot_5376": { + "entryPoint": null, + "id": 5376, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_isDisputeInConflict_13512": { + "entryPoint": null, + "id": 13512, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_isInitializing_5367": { + "entryPoint": 10917, + "id": 5367, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_msgSender_5419": { + "entryPoint": null, + "id": 5419, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_recoverSigner_17524": { + "entryPoint": 9685, + "id": 17524, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_rejectDispute_13153": { + "entryPoint": 6475, + "id": 13153, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_setArbitrator_13346": { + "entryPoint": 5692, + "id": 13346, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setDisputeDeposit_13393": { + "entryPoint": 5942, + "id": 13393, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setDisputePeriod_13369": { + "entryPoint": 5805, + "id": 13369, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setFishermanRewardCut_13417": { + "entryPoint": 6041, + "id": 13417, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setMaxSlashingCut_13442": { + "entryPoint": 6155, + "id": 13442, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setSubgraphService_13470": { + "entryPoint": 8287, + "id": 13470, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_slashIndexer_13320": { + "entryPoint": 9822, + "id": 13320, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@_throwError_8230": { + "entryPoint": 11020, + "id": 8230, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_toBytes32_16289": { + "entryPoint": 10606, + "id": 16289, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_toUint8_16256": { + "entryPoint": 10681, + "id": 16256, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_transferOwnership_5122": { + "entryPoint": 7877, + "id": 5122, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@acceptDisputeConflict_12431": { + "entryPoint": 3841, + "id": 12431, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@acceptDispute_12365": { + "entryPoint": 1246, + "id": 12365, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@arbitrator_13556": { + "entryPoint": null, + "id": 13556, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@areConflictingAttestations_12726": { + "entryPoint": 5325, + "id": 12726, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@areConflicting_16153": { + "entryPoint": 9636, + "id": 16153, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@burnTokens_839": { + "entryPoint": 10510, + "id": 839, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@cancelDispute_12555": { + "entryPoint": 1864, + "id": 12555, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@createAndAcceptLegacyDispute_12325": { + "entryPoint": 2596, + "id": 12325, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@createIndexingDispute_12068": { + "entryPoint": 2478, + "id": 12068, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@createQueryDisputeConflict_12211": { + "entryPoint": 4564, + "id": 12211, + "parameterSlots": 4, + "returnSlots": 2 + }, + "@createQueryDispute_12097": { + "entryPoint": 4417, + "id": 12097, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@disputeDeposit_13562": { + "entryPoint": null, + "id": 13562, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@disputePeriod_13559": { + "entryPoint": null, + "id": 13559, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@disputes_13574": { + "entryPoint": null, + "id": 13574, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@drawDispute_12505": { + "entryPoint": 3552, + "id": 12505, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@encodeReceipt_12654": { + "entryPoint": 2534, + "id": 12654, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@fishermanRewardCut_13565": { + "entryPoint": null, + "id": 13565, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@getAttestationIndexer_12783": { + "entryPoint": 5090, + "id": 12783, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@getDisputePeriod_12674": { + "entryPoint": null, + "id": 12674, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@getFishermanRewardCut_12664": { + "entryPoint": null, + "id": 12664, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@getStakeSnapshot_12706": { + "entryPoint": 4265, + "id": 12706, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@initialize_12040": { + "entryPoint": 1532, + "id": 12040, + "parameterSlots": 6, + "returnSlots": 0 + }, + "@isDisputeCreated_12801": { + "entryPoint": 4211, + "id": 12801, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@isValidPPM_4538": { + "entryPoint": null, + "id": 4538, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@maxSlashingCut_13568": { + "entryPoint": null, + "id": 13568, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@min_4423": { + "entryPoint": 10894, + "id": 4423, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@mulPPM_4496": { + "entryPoint": 10798, + "id": 4496, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@owner_5034": { + "entryPoint": 3525, + "id": 5034, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@parse_16223": { + "entryPoint": 8549, + "id": 16223, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@pullTokens_792": { + "entryPoint": 6638, + "id": 792, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@pushTokens_818": { + "entryPoint": 8065, + "id": 818, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@recover_7987": { + "entryPoint": 10756, + "id": 7987, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@rejectDispute_12466": { + "entryPoint": 2216, + "id": 12466, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@renounceOwnership_5065": { + "entryPoint": 2559, + "id": 5065, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@setArbitrator_12569": { + "entryPoint": 4194, + "id": 12569, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setDisputeDeposit_12597": { + "entryPoint": 1844, + "id": 12597, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setDisputePeriod_12583": { + "entryPoint": 5365, + "id": 12583, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setFishermanRewardCut_12611": { + "entryPoint": 2579, + "id": 12611, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setMaxSlashingCut_12625": { + "entryPoint": 3824, + "id": 12625, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setSubgraphService_12639": { + "entryPoint": 3807, + "id": 12639, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@subgraphService_13553": { + "entryPoint": null, + "id": 13553, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@transferOwnership_5093": { + "entryPoint": 5382, + "id": 5093, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@tryRecover_7957": { + "entryPoint": 10943, + "id": 7957, + "parameterSlots": 2, + "returnSlots": 3 + }, + "@tryRecover_8145": { + "entryPoint": 11205, + "id": 8145, + "parameterSlots": 4, + "returnSlots": 3 + }, + "abi_decode_address_fromMemory": { + "entryPoint": 12872, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 12124, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_struct_Allocation_fromMemory": { + "entryPoint": 12888, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_struct_State_calldata": { + "entryPoint": 12644, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address": { + "entryPoint": 12018, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_addresst_addresst_uint256t_uint256": { + "entryPoint": 11948, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_addresst_addresst_uint64t_uint256t_uint32t_uint32": { + "entryPoint": 11513, + "id": null, + "parameterSlots": 2, + "returnSlots": 6 + }, + "abi_decode_tuple_t_addresst_bytes32": { + "entryPoint": 11828, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_bool_fromMemory": { + "entryPoint": 13448, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32": { + "entryPoint": 11634, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32t_bytes32t_bytes32_fromMemory": { + "entryPoint": 13604, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_bytes32t_uint256": { + "entryPoint": 11402, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_bytes32t_uint256t_boolt_uint256": { + "entryPoint": 12061, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_bytes_calldata_ptr": { + "entryPoint": 12196, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr": { + "entryPoint": 12261, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_struct$_Allocation_$3073_memory_ptr_fromMemory": { + "entryPoint": 13017, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_DelegationPool_$3992_memory_ptr_fromMemory": { + "entryPoint": 13477, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_Provision_$3962_memory_ptr_fromMemory": { + "entryPoint": 13241, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_Receipt_$16044_calldata_ptr": { + "entryPoint": 11892, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_Receipt_$16044_memory_ptr": { + "entryPoint": 12765, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_State_$15663_memory_ptr_fromMemory": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_State_$16058_calldata_ptrt_struct$_State_$16058_calldata_ptr": { + "entryPoint": 12668, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_struct$_State_$16058_memory_ptr": { + "entryPoint": 12538, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint32": { + "entryPoint": 11919, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint64": { + "entryPoint": 12722, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint32_fromMemory": { + "entryPoint": 13219, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_uint64_fromMemory": { + "entryPoint": 13230, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_bytes": { + "entryPoint": 13087, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_enum_DisputeStatus": { + "entryPoint": 11681, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_packed_t_address_t_bytes32__to_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_address_t_stringliteral_b7ccb6878fbded310d2d05350bca9c84568ecb568d4b626c83e0508c3193ce89__to_t_address_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_bytes32_t_bytes32_t_bytes32_t_address_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_address_t_address__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_bytes32_t_bytes32_t_uint8__to_t_bytes32_t_bytes32_t_uint8__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_bytes32_t_bytes32__to_t_string_memory_ptr_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed": { + "entryPoint": 13193, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_uint256_t_bytes32_t_enum$_DisputeType_$14913_t_enum$_DisputeStatus_$14921_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_bytes32_t_uint8_t_uint8_t_uint256_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 11701, + "id": null, + "parameterSlots": 10, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 13157, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": 12372, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 7, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 7, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_contract$_ISubgraphService_$15634__to_t_address__fromStack_reversed": { + "entryPoint": 11808, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_enum$_DisputeStatus_$14921__to_t_uint8__fromStack_reversed": { + "entryPoint": 12751, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_rational_1_by_1__to_t_uint64__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_address_t_bytes32_t_uint256_t_uint256__to_t_uint256_t_address_t_bytes32_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256_t_uint256__to_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 13650, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed": { + "entryPoint": 11436, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed": { + "entryPoint": 11872, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 12386, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_memory_2390": { + "entryPoint": 12440, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_memory_2392": { + "entryPoint": 12489, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 13068, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_div_t_uint256": { + "entryPoint": 13414, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_mul_t_uint256": { + "entryPoint": 13701, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 13046, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x21": { + "entryPoint": 11659, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 11453, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bool": { + "entryPoint": 12047, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint32": { + "entryPoint": 11495, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint64": { + "entryPoint": 11474, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nativeSrc": "0:26391:70", + "nodeType": "YulBlock", + "src": "0:26391:70", + "statements": [ + { + "nativeSrc": "6:3:70", + "nodeType": "YulBlock", + "src": "6:3:70", + "statements": [] + }, + { + "body": { + "nativeSrc": "101:259:70", + "nodeType": "YulBlock", + "src": "101:259:70", + "statements": [ + { + "body": { + "nativeSrc": "147:16:70", + "nodeType": "YulBlock", + "src": "147:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "156:1:70", + "nodeType": "YulLiteral", + "src": "156:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "159:1:70", + "nodeType": "YulLiteral", + "src": "159:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "149:6:70", + "nodeType": "YulIdentifier", + "src": "149:6:70" + }, + "nativeSrc": "149:12:70", + "nodeType": "YulFunctionCall", + "src": "149:12:70" + }, + "nativeSrc": "149:12:70", + "nodeType": "YulExpressionStatement", + "src": "149:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "122:7:70", + "nodeType": "YulIdentifier", + "src": "122:7:70" + }, + { + "name": "headStart", + "nativeSrc": "131:9:70", + "nodeType": "YulIdentifier", + "src": "131:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "118:3:70", + "nodeType": "YulIdentifier", + "src": "118:3:70" + }, + "nativeSrc": "118:23:70", + "nodeType": "YulFunctionCall", + "src": "118:23:70" + }, + { + "kind": "number", + "nativeSrc": "143:2:70", + "nodeType": "YulLiteral", + "src": "143:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "114:3:70", + "nodeType": "YulIdentifier", + "src": "114:3:70" + }, + "nativeSrc": "114:32:70", + "nodeType": "YulFunctionCall", + "src": "114:32:70" + }, + "nativeSrc": "111:52:70", + "nodeType": "YulIf", + "src": "111:52:70" + }, + { + "nativeSrc": "172:14:70", + "nodeType": "YulVariableDeclaration", + "src": "172:14:70", + "value": { + "kind": "number", + "nativeSrc": "185:1:70", + "nodeType": "YulLiteral", + "src": "185:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "176:5:70", + "nodeType": "YulTypedName", + "src": "176:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "195:32:70", + "nodeType": "YulAssignment", + "src": "195:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "217:9:70", + "nodeType": "YulIdentifier", + "src": "217:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "204:12:70", + "nodeType": "YulIdentifier", + "src": "204:12:70" + }, + "nativeSrc": "204:23:70", + "nodeType": "YulFunctionCall", + "src": "204:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "195:5:70", + "nodeType": "YulIdentifier", + "src": "195:5:70" + } + ] + }, + { + "nativeSrc": "236:15:70", + "nodeType": "YulAssignment", + "src": "236:15:70", + "value": { + "name": "value", + "nativeSrc": "246:5:70", + "nodeType": "YulIdentifier", + "src": "246:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "236:6:70", + "nodeType": "YulIdentifier", + "src": "236:6:70" + } + ] + }, + { + "nativeSrc": "260:16:70", + "nodeType": "YulVariableDeclaration", + "src": "260:16:70", + "value": { + "kind": "number", + "nativeSrc": "275:1:70", + "nodeType": "YulLiteral", + "src": "275:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "264:7:70", + "nodeType": "YulTypedName", + "src": "264:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "285:43:70", + "nodeType": "YulAssignment", + "src": "285:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "313:9:70", + "nodeType": "YulIdentifier", + "src": "313:9:70" + }, + { + "kind": "number", + "nativeSrc": "324:2:70", + "nodeType": "YulLiteral", + "src": "324:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "309:3:70", + "nodeType": "YulIdentifier", + "src": "309:3:70" + }, + "nativeSrc": "309:18:70", + "nodeType": "YulFunctionCall", + "src": "309:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "296:12:70", + "nodeType": "YulIdentifier", + "src": "296:12:70" + }, + "nativeSrc": "296:32:70", + "nodeType": "YulFunctionCall", + "src": "296:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "285:7:70", + "nodeType": "YulIdentifier", + "src": "285:7:70" + } + ] + }, + { + "nativeSrc": "337:17:70", + "nodeType": "YulAssignment", + "src": "337:17:70", + "value": { + "name": "value_1", + "nativeSrc": "347:7:70", + "nodeType": "YulIdentifier", + "src": "347:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "337:6:70", + "nodeType": "YulIdentifier", + "src": "337:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32t_uint256", + "nativeSrc": "14:346:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "59:9:70", + "nodeType": "YulTypedName", + "src": "59:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "70:7:70", + "nodeType": "YulTypedName", + "src": "70:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "82:6:70", + "nodeType": "YulTypedName", + "src": "82:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "90:6:70", + "nodeType": "YulTypedName", + "src": "90:6:70", + "type": "" + } + ], + "src": "14:346:70" + }, + { + "body": { + "nativeSrc": "464:93:70", + "nodeType": "YulBlock", + "src": "464:93:70", + "statements": [ + { + "nativeSrc": "474:26:70", + "nodeType": "YulAssignment", + "src": "474:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "486:9:70", + "nodeType": "YulIdentifier", + "src": "486:9:70" + }, + { + "kind": "number", + "nativeSrc": "497:2:70", + "nodeType": "YulLiteral", + "src": "497:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "482:3:70", + "nodeType": "YulIdentifier", + "src": "482:3:70" + }, + "nativeSrc": "482:18:70", + "nodeType": "YulFunctionCall", + "src": "482:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "474:4:70", + "nodeType": "YulIdentifier", + "src": "474:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "516:9:70", + "nodeType": "YulIdentifier", + "src": "516:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "531:6:70", + "nodeType": "YulIdentifier", + "src": "531:6:70" + }, + { + "kind": "number", + "nativeSrc": "539:10:70", + "nodeType": "YulLiteral", + "src": "539:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "527:3:70", + "nodeType": "YulIdentifier", + "src": "527:3:70" + }, + "nativeSrc": "527:23:70", + "nodeType": "YulFunctionCall", + "src": "527:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "509:6:70", + "nodeType": "YulIdentifier", + "src": "509:6:70" + }, + "nativeSrc": "509:42:70", + "nodeType": "YulFunctionCall", + "src": "509:42:70" + }, + "nativeSrc": "509:42:70", + "nodeType": "YulExpressionStatement", + "src": "509:42:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed", + "nativeSrc": "365:192:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "433:9:70", + "nodeType": "YulTypedName", + "src": "433:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "444:6:70", + "nodeType": "YulTypedName", + "src": "444:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "455:4:70", + "nodeType": "YulTypedName", + "src": "455:4:70", + "type": "" + } + ], + "src": "365:192:70" + }, + { + "body": { + "nativeSrc": "607:86:70", + "nodeType": "YulBlock", + "src": "607:86:70", + "statements": [ + { + "body": { + "nativeSrc": "671:16:70", + "nodeType": "YulBlock", + "src": "671:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "680:1:70", + "nodeType": "YulLiteral", + "src": "680:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "683:1:70", + "nodeType": "YulLiteral", + "src": "683:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "673:6:70", + "nodeType": "YulIdentifier", + "src": "673:6:70" + }, + "nativeSrc": "673:12:70", + "nodeType": "YulFunctionCall", + "src": "673:12:70" + }, + "nativeSrc": "673:12:70", + "nodeType": "YulExpressionStatement", + "src": "673:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "630:5:70", + "nodeType": "YulIdentifier", + "src": "630:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "641:5:70", + "nodeType": "YulIdentifier", + "src": "641:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "656:3:70", + "nodeType": "YulLiteral", + "src": "656:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "661:1:70", + "nodeType": "YulLiteral", + "src": "661:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "652:3:70", + "nodeType": "YulIdentifier", + "src": "652:3:70" + }, + "nativeSrc": "652:11:70", + "nodeType": "YulFunctionCall", + "src": "652:11:70" + }, + { + "kind": "number", + "nativeSrc": "665:1:70", + "nodeType": "YulLiteral", + "src": "665:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "648:3:70", + "nodeType": "YulIdentifier", + "src": "648:3:70" + }, + "nativeSrc": "648:19:70", + "nodeType": "YulFunctionCall", + "src": "648:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "637:3:70", + "nodeType": "YulIdentifier", + "src": "637:3:70" + }, + "nativeSrc": "637:31:70", + "nodeType": "YulFunctionCall", + "src": "637:31:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "627:2:70", + "nodeType": "YulIdentifier", + "src": "627:2:70" + }, + "nativeSrc": "627:42:70", + "nodeType": "YulFunctionCall", + "src": "627:42:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "620:6:70", + "nodeType": "YulIdentifier", + "src": "620:6:70" + }, + "nativeSrc": "620:50:70", + "nodeType": "YulFunctionCall", + "src": "620:50:70" + }, + "nativeSrc": "617:70:70", + "nodeType": "YulIf", + "src": "617:70:70" + } + ] + }, + "name": "validator_revert_address", + "nativeSrc": "562:131:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "596:5:70", + "nodeType": "YulTypedName", + "src": "596:5:70", + "type": "" + } + ], + "src": "562:131:70" + }, + { + "body": { + "nativeSrc": "742:85:70", + "nodeType": "YulBlock", + "src": "742:85:70", + "statements": [ + { + "body": { + "nativeSrc": "805:16:70", + "nodeType": "YulBlock", + "src": "805:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "814:1:70", + "nodeType": "YulLiteral", + "src": "814:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "817:1:70", + "nodeType": "YulLiteral", + "src": "817:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "807:6:70", + "nodeType": "YulIdentifier", + "src": "807:6:70" + }, + "nativeSrc": "807:12:70", + "nodeType": "YulFunctionCall", + "src": "807:12:70" + }, + "nativeSrc": "807:12:70", + "nodeType": "YulExpressionStatement", + "src": "807:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "765:5:70", + "nodeType": "YulIdentifier", + "src": "765:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "776:5:70", + "nodeType": "YulIdentifier", + "src": "776:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "791:2:70", + "nodeType": "YulLiteral", + "src": "791:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "795:1:70", + "nodeType": "YulLiteral", + "src": "795:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "787:3:70", + "nodeType": "YulIdentifier", + "src": "787:3:70" + }, + "nativeSrc": "787:10:70", + "nodeType": "YulFunctionCall", + "src": "787:10:70" + }, + { + "kind": "number", + "nativeSrc": "799:1:70", + "nodeType": "YulLiteral", + "src": "799:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "783:3:70", + "nodeType": "YulIdentifier", + "src": "783:3:70" + }, + "nativeSrc": "783:18:70", + "nodeType": "YulFunctionCall", + "src": "783:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "772:3:70", + "nodeType": "YulIdentifier", + "src": "772:3:70" + }, + "nativeSrc": "772:30:70", + "nodeType": "YulFunctionCall", + "src": "772:30:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "762:2:70", + "nodeType": "YulIdentifier", + "src": "762:2:70" + }, + "nativeSrc": "762:41:70", + "nodeType": "YulFunctionCall", + "src": "762:41:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "755:6:70", + "nodeType": "YulIdentifier", + "src": "755:6:70" + }, + "nativeSrc": "755:49:70", + "nodeType": "YulFunctionCall", + "src": "755:49:70" + }, + "nativeSrc": "752:69:70", + "nodeType": "YulIf", + "src": "752:69:70" + } + ] + }, + "name": "validator_revert_uint64", + "nativeSrc": "698:129:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "731:5:70", + "nodeType": "YulTypedName", + "src": "731:5:70", + "type": "" + } + ], + "src": "698:129:70" + }, + { + "body": { + "nativeSrc": "876:77:70", + "nodeType": "YulBlock", + "src": "876:77:70", + "statements": [ + { + "body": { + "nativeSrc": "931:16:70", + "nodeType": "YulBlock", + "src": "931:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "940:1:70", + "nodeType": "YulLiteral", + "src": "940:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "943:1:70", + "nodeType": "YulLiteral", + "src": "943:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "933:6:70", + "nodeType": "YulIdentifier", + "src": "933:6:70" + }, + "nativeSrc": "933:12:70", + "nodeType": "YulFunctionCall", + "src": "933:12:70" + }, + "nativeSrc": "933:12:70", + "nodeType": "YulExpressionStatement", + "src": "933:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "899:5:70", + "nodeType": "YulIdentifier", + "src": "899:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "910:5:70", + "nodeType": "YulIdentifier", + "src": "910:5:70" + }, + { + "kind": "number", + "nativeSrc": "917:10:70", + "nodeType": "YulLiteral", + "src": "917:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "906:3:70", + "nodeType": "YulIdentifier", + "src": "906:3:70" + }, + "nativeSrc": "906:22:70", + "nodeType": "YulFunctionCall", + "src": "906:22:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "896:2:70", + "nodeType": "YulIdentifier", + "src": "896:2:70" + }, + "nativeSrc": "896:33:70", + "nodeType": "YulFunctionCall", + "src": "896:33:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "889:6:70", + "nodeType": "YulIdentifier", + "src": "889:6:70" + }, + "nativeSrc": "889:41:70", + "nodeType": "YulFunctionCall", + "src": "889:41:70" + }, + "nativeSrc": "886:61:70", + "nodeType": "YulIf", + "src": "886:61:70" + } + ] + }, + "name": "validator_revert_uint32", + "nativeSrc": "832:121:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "865:5:70", + "nodeType": "YulTypedName", + "src": "865:5:70", + "type": "" + } + ], + "src": "832:121:70" + }, + { + "body": { + "nativeSrc": "1110:776:70", + "nodeType": "YulBlock", + "src": "1110:776:70", + "statements": [ + { + "body": { + "nativeSrc": "1157:16:70", + "nodeType": "YulBlock", + "src": "1157:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1166:1:70", + "nodeType": "YulLiteral", + "src": "1166:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "1169:1:70", + "nodeType": "YulLiteral", + "src": "1169:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "1159:6:70", + "nodeType": "YulIdentifier", + "src": "1159:6:70" + }, + "nativeSrc": "1159:12:70", + "nodeType": "YulFunctionCall", + "src": "1159:12:70" + }, + "nativeSrc": "1159:12:70", + "nodeType": "YulExpressionStatement", + "src": "1159:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "1131:7:70", + "nodeType": "YulIdentifier", + "src": "1131:7:70" + }, + { + "name": "headStart", + "nativeSrc": "1140:9:70", + "nodeType": "YulIdentifier", + "src": "1140:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1127:3:70", + "nodeType": "YulIdentifier", + "src": "1127:3:70" + }, + "nativeSrc": "1127:23:70", + "nodeType": "YulFunctionCall", + "src": "1127:23:70" + }, + { + "kind": "number", + "nativeSrc": "1152:3:70", + "nodeType": "YulLiteral", + "src": "1152:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "1123:3:70", + "nodeType": "YulIdentifier", + "src": "1123:3:70" + }, + "nativeSrc": "1123:33:70", + "nodeType": "YulFunctionCall", + "src": "1123:33:70" + }, + "nativeSrc": "1120:53:70", + "nodeType": "YulIf", + "src": "1120:53:70" + }, + { + "nativeSrc": "1182:36:70", + "nodeType": "YulVariableDeclaration", + "src": "1182:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1208:9:70", + "nodeType": "YulIdentifier", + "src": "1208:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "1195:12:70", + "nodeType": "YulIdentifier", + "src": "1195:12:70" + }, + "nativeSrc": "1195:23:70", + "nodeType": "YulFunctionCall", + "src": "1195:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "1186:5:70", + "nodeType": "YulTypedName", + "src": "1186:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "1252:5:70", + "nodeType": "YulIdentifier", + "src": "1252:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "1227:24:70", + "nodeType": "YulIdentifier", + "src": "1227:24:70" + }, + "nativeSrc": "1227:31:70", + "nodeType": "YulFunctionCall", + "src": "1227:31:70" + }, + "nativeSrc": "1227:31:70", + "nodeType": "YulExpressionStatement", + "src": "1227:31:70" + }, + { + "nativeSrc": "1267:15:70", + "nodeType": "YulAssignment", + "src": "1267:15:70", + "value": { + "name": "value", + "nativeSrc": "1277:5:70", + "nodeType": "YulIdentifier", + "src": "1277:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "1267:6:70", + "nodeType": "YulIdentifier", + "src": "1267:6:70" + } + ] + }, + { + "nativeSrc": "1291:47:70", + "nodeType": "YulVariableDeclaration", + "src": "1291:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1323:9:70", + "nodeType": "YulIdentifier", + "src": "1323:9:70" + }, + { + "kind": "number", + "nativeSrc": "1334:2:70", + "nodeType": "YulLiteral", + "src": "1334:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1319:3:70", + "nodeType": "YulIdentifier", + "src": "1319:3:70" + }, + "nativeSrc": "1319:18:70", + "nodeType": "YulFunctionCall", + "src": "1319:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "1306:12:70", + "nodeType": "YulIdentifier", + "src": "1306:12:70" + }, + "nativeSrc": "1306:32:70", + "nodeType": "YulFunctionCall", + "src": "1306:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "1295:7:70", + "nodeType": "YulTypedName", + "src": "1295:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "1372:7:70", + "nodeType": "YulIdentifier", + "src": "1372:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "1347:24:70", + "nodeType": "YulIdentifier", + "src": "1347:24:70" + }, + "nativeSrc": "1347:33:70", + "nodeType": "YulFunctionCall", + "src": "1347:33:70" + }, + "nativeSrc": "1347:33:70", + "nodeType": "YulExpressionStatement", + "src": "1347:33:70" + }, + { + "nativeSrc": "1389:17:70", + "nodeType": "YulAssignment", + "src": "1389:17:70", + "value": { + "name": "value_1", + "nativeSrc": "1399:7:70", + "nodeType": "YulIdentifier", + "src": "1399:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "1389:6:70", + "nodeType": "YulIdentifier", + "src": "1389:6:70" + } + ] + }, + { + "nativeSrc": "1415:47:70", + "nodeType": "YulVariableDeclaration", + "src": "1415:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1447:9:70", + "nodeType": "YulIdentifier", + "src": "1447:9:70" + }, + { + "kind": "number", + "nativeSrc": "1458:2:70", + "nodeType": "YulLiteral", + "src": "1458:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1443:3:70", + "nodeType": "YulIdentifier", + "src": "1443:3:70" + }, + "nativeSrc": "1443:18:70", + "nodeType": "YulFunctionCall", + "src": "1443:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "1430:12:70", + "nodeType": "YulIdentifier", + "src": "1430:12:70" + }, + "nativeSrc": "1430:32:70", + "nodeType": "YulFunctionCall", + "src": "1430:32:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "1419:7:70", + "nodeType": "YulTypedName", + "src": "1419:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_2", + "nativeSrc": "1495:7:70", + "nodeType": "YulIdentifier", + "src": "1495:7:70" + } + ], + "functionName": { + "name": "validator_revert_uint64", + "nativeSrc": "1471:23:70", + "nodeType": "YulIdentifier", + "src": "1471:23:70" + }, + "nativeSrc": "1471:32:70", + "nodeType": "YulFunctionCall", + "src": "1471:32:70" + }, + "nativeSrc": "1471:32:70", + "nodeType": "YulExpressionStatement", + "src": "1471:32:70" + }, + { + "nativeSrc": "1512:17:70", + "nodeType": "YulAssignment", + "src": "1512:17:70", + "value": { + "name": "value_2", + "nativeSrc": "1522:7:70", + "nodeType": "YulIdentifier", + "src": "1522:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "1512:6:70", + "nodeType": "YulIdentifier", + "src": "1512:6:70" + } + ] + }, + { + "nativeSrc": "1538:16:70", + "nodeType": "YulVariableDeclaration", + "src": "1538:16:70", + "value": { + "kind": "number", + "nativeSrc": "1553:1:70", + "nodeType": "YulLiteral", + "src": "1553:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "1542:7:70", + "nodeType": "YulTypedName", + "src": "1542:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "1563:43:70", + "nodeType": "YulAssignment", + "src": "1563:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1591:9:70", + "nodeType": "YulIdentifier", + "src": "1591:9:70" + }, + { + "kind": "number", + "nativeSrc": "1602:2:70", + "nodeType": "YulLiteral", + "src": "1602:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1587:3:70", + "nodeType": "YulIdentifier", + "src": "1587:3:70" + }, + "nativeSrc": "1587:18:70", + "nodeType": "YulFunctionCall", + "src": "1587:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "1574:12:70", + "nodeType": "YulIdentifier", + "src": "1574:12:70" + }, + "nativeSrc": "1574:32:70", + "nodeType": "YulFunctionCall", + "src": "1574:32:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "1563:7:70", + "nodeType": "YulIdentifier", + "src": "1563:7:70" + } + ] + }, + { + "nativeSrc": "1615:17:70", + "nodeType": "YulAssignment", + "src": "1615:17:70", + "value": { + "name": "value_3", + "nativeSrc": "1625:7:70", + "nodeType": "YulIdentifier", + "src": "1625:7:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "1615:6:70", + "nodeType": "YulIdentifier", + "src": "1615:6:70" + } + ] + }, + { + "nativeSrc": "1641:48:70", + "nodeType": "YulVariableDeclaration", + "src": "1641:48:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1673:9:70", + "nodeType": "YulIdentifier", + "src": "1673:9:70" + }, + { + "kind": "number", + "nativeSrc": "1684:3:70", + "nodeType": "YulLiteral", + "src": "1684:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1669:3:70", + "nodeType": "YulIdentifier", + "src": "1669:3:70" + }, + "nativeSrc": "1669:19:70", + "nodeType": "YulFunctionCall", + "src": "1669:19:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "1656:12:70", + "nodeType": "YulIdentifier", + "src": "1656:12:70" + }, + "nativeSrc": "1656:33:70", + "nodeType": "YulFunctionCall", + "src": "1656:33:70" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "1645:7:70", + "nodeType": "YulTypedName", + "src": "1645:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_4", + "nativeSrc": "1722:7:70", + "nodeType": "YulIdentifier", + "src": "1722:7:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "1698:23:70", + "nodeType": "YulIdentifier", + "src": "1698:23:70" + }, + "nativeSrc": "1698:32:70", + "nodeType": "YulFunctionCall", + "src": "1698:32:70" + }, + "nativeSrc": "1698:32:70", + "nodeType": "YulExpressionStatement", + "src": "1698:32:70" + }, + { + "nativeSrc": "1739:17:70", + "nodeType": "YulAssignment", + "src": "1739:17:70", + "value": { + "name": "value_4", + "nativeSrc": "1749:7:70", + "nodeType": "YulIdentifier", + "src": "1749:7:70" + }, + "variableNames": [ + { + "name": "value4", + "nativeSrc": "1739:6:70", + "nodeType": "YulIdentifier", + "src": "1739:6:70" + } + ] + }, + { + "nativeSrc": "1765:48:70", + "nodeType": "YulVariableDeclaration", + "src": "1765:48:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1797:9:70", + "nodeType": "YulIdentifier", + "src": "1797:9:70" + }, + { + "kind": "number", + "nativeSrc": "1808:3:70", + "nodeType": "YulLiteral", + "src": "1808:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1793:3:70", + "nodeType": "YulIdentifier", + "src": "1793:3:70" + }, + "nativeSrc": "1793:19:70", + "nodeType": "YulFunctionCall", + "src": "1793:19:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "1780:12:70", + "nodeType": "YulIdentifier", + "src": "1780:12:70" + }, + "nativeSrc": "1780:33:70", + "nodeType": "YulFunctionCall", + "src": "1780:33:70" + }, + "variables": [ + { + "name": "value_5", + "nativeSrc": "1769:7:70", + "nodeType": "YulTypedName", + "src": "1769:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_5", + "nativeSrc": "1846:7:70", + "nodeType": "YulIdentifier", + "src": "1846:7:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "1822:23:70", + "nodeType": "YulIdentifier", + "src": "1822:23:70" + }, + "nativeSrc": "1822:32:70", + "nodeType": "YulFunctionCall", + "src": "1822:32:70" + }, + "nativeSrc": "1822:32:70", + "nodeType": "YulExpressionStatement", + "src": "1822:32:70" + }, + { + "nativeSrc": "1863:17:70", + "nodeType": "YulAssignment", + "src": "1863:17:70", + "value": { + "name": "value_5", + "nativeSrc": "1873:7:70", + "nodeType": "YulIdentifier", + "src": "1873:7:70" + }, + "variableNames": [ + { + "name": "value5", + "nativeSrc": "1863:6:70", + "nodeType": "YulIdentifier", + "src": "1863:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_uint64t_uint256t_uint32t_uint32", + "nativeSrc": "958:928:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1036:9:70", + "nodeType": "YulTypedName", + "src": "1036:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "1047:7:70", + "nodeType": "YulTypedName", + "src": "1047:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "1059:6:70", + "nodeType": "YulTypedName", + "src": "1059:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "1067:6:70", + "nodeType": "YulTypedName", + "src": "1067:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "1075:6:70", + "nodeType": "YulTypedName", + "src": "1075:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "1083:6:70", + "nodeType": "YulTypedName", + "src": "1083:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "1091:6:70", + "nodeType": "YulTypedName", + "src": "1091:6:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "1099:6:70", + "nodeType": "YulTypedName", + "src": "1099:6:70", + "type": "" + } + ], + "src": "958:928:70" + }, + { + "body": { + "nativeSrc": "1961:156:70", + "nodeType": "YulBlock", + "src": "1961:156:70", + "statements": [ + { + "body": { + "nativeSrc": "2007:16:70", + "nodeType": "YulBlock", + "src": "2007:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2016:1:70", + "nodeType": "YulLiteral", + "src": "2016:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "2019:1:70", + "nodeType": "YulLiteral", + "src": "2019:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "2009:6:70", + "nodeType": "YulIdentifier", + "src": "2009:6:70" + }, + "nativeSrc": "2009:12:70", + "nodeType": "YulFunctionCall", + "src": "2009:12:70" + }, + "nativeSrc": "2009:12:70", + "nodeType": "YulExpressionStatement", + "src": "2009:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "1982:7:70", + "nodeType": "YulIdentifier", + "src": "1982:7:70" + }, + { + "name": "headStart", + "nativeSrc": "1991:9:70", + "nodeType": "YulIdentifier", + "src": "1991:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1978:3:70", + "nodeType": "YulIdentifier", + "src": "1978:3:70" + }, + "nativeSrc": "1978:23:70", + "nodeType": "YulFunctionCall", + "src": "1978:23:70" + }, + { + "kind": "number", + "nativeSrc": "2003:2:70", + "nodeType": "YulLiteral", + "src": "2003:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "1974:3:70", + "nodeType": "YulIdentifier", + "src": "1974:3:70" + }, + "nativeSrc": "1974:32:70", + "nodeType": "YulFunctionCall", + "src": "1974:32:70" + }, + "nativeSrc": "1971:52:70", + "nodeType": "YulIf", + "src": "1971:52:70" + }, + { + "nativeSrc": "2032:14:70", + "nodeType": "YulVariableDeclaration", + "src": "2032:14:70", + "value": { + "kind": "number", + "nativeSrc": "2045:1:70", + "nodeType": "YulLiteral", + "src": "2045:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "2036:5:70", + "nodeType": "YulTypedName", + "src": "2036:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "2055:32:70", + "nodeType": "YulAssignment", + "src": "2055:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2077:9:70", + "nodeType": "YulIdentifier", + "src": "2077:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "2064:12:70", + "nodeType": "YulIdentifier", + "src": "2064:12:70" + }, + "nativeSrc": "2064:23:70", + "nodeType": "YulFunctionCall", + "src": "2064:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "2055:5:70", + "nodeType": "YulIdentifier", + "src": "2055:5:70" + } + ] + }, + { + "nativeSrc": "2096:15:70", + "nodeType": "YulAssignment", + "src": "2096:15:70", + "value": { + "name": "value", + "nativeSrc": "2106:5:70", + "nodeType": "YulIdentifier", + "src": "2106:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "2096:6:70", + "nodeType": "YulIdentifier", + "src": "2096:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32", + "nativeSrc": "1891:226:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1927:9:70", + "nodeType": "YulTypedName", + "src": "1927:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "1938:7:70", + "nodeType": "YulTypedName", + "src": "1938:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "1950:6:70", + "nodeType": "YulTypedName", + "src": "1950:6:70", + "type": "" + } + ], + "src": "1891:226:70" + }, + { + "body": { + "nativeSrc": "2154:95:70", + "nodeType": "YulBlock", + "src": "2154:95:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2171:1:70", + "nodeType": "YulLiteral", + "src": "2171:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2178:3:70", + "nodeType": "YulLiteral", + "src": "2178:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "2183:10:70", + "nodeType": "YulLiteral", + "src": "2183:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2174:3:70", + "nodeType": "YulIdentifier", + "src": "2174:3:70" + }, + "nativeSrc": "2174:20:70", + "nodeType": "YulFunctionCall", + "src": "2174:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2164:6:70", + "nodeType": "YulIdentifier", + "src": "2164:6:70" + }, + "nativeSrc": "2164:31:70", + "nodeType": "YulFunctionCall", + "src": "2164:31:70" + }, + "nativeSrc": "2164:31:70", + "nodeType": "YulExpressionStatement", + "src": "2164:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2211:1:70", + "nodeType": "YulLiteral", + "src": "2211:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "2214:4:70", + "nodeType": "YulLiteral", + "src": "2214:4:70", + "type": "", + "value": "0x21" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2204:6:70", + "nodeType": "YulIdentifier", + "src": "2204:6:70" + }, + "nativeSrc": "2204:15:70", + "nodeType": "YulFunctionCall", + "src": "2204:15:70" + }, + "nativeSrc": "2204:15:70", + "nodeType": "YulExpressionStatement", + "src": "2204:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2235:1:70", + "nodeType": "YulLiteral", + "src": "2235:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "2238:4:70", + "nodeType": "YulLiteral", + "src": "2238:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "2228:6:70", + "nodeType": "YulIdentifier", + "src": "2228:6:70" + }, + "nativeSrc": "2228:15:70", + "nodeType": "YulFunctionCall", + "src": "2228:15:70" + }, + "nativeSrc": "2228:15:70", + "nodeType": "YulExpressionStatement", + "src": "2228:15:70" + } + ] + }, + "name": "panic_error_0x21", + "nativeSrc": "2122:127:70", + "nodeType": "YulFunctionDefinition", + "src": "2122:127:70" + }, + { + "body": { + "nativeSrc": "2309:89:70", + "nodeType": "YulBlock", + "src": "2309:89:70", + "statements": [ + { + "body": { + "nativeSrc": "2343:22:70", + "nodeType": "YulBlock", + "src": "2343:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x21", + "nativeSrc": "2345:16:70", + "nodeType": "YulIdentifier", + "src": "2345:16:70" + }, + "nativeSrc": "2345:18:70", + "nodeType": "YulFunctionCall", + "src": "2345:18:70" + }, + "nativeSrc": "2345:18:70", + "nodeType": "YulExpressionStatement", + "src": "2345:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "2332:5:70", + "nodeType": "YulIdentifier", + "src": "2332:5:70" + }, + { + "kind": "number", + "nativeSrc": "2339:1:70", + "nodeType": "YulLiteral", + "src": "2339:1:70", + "type": "", + "value": "6" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "2329:2:70", + "nodeType": "YulIdentifier", + "src": "2329:2:70" + }, + "nativeSrc": "2329:12:70", + "nodeType": "YulFunctionCall", + "src": "2329:12:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "2322:6:70", + "nodeType": "YulIdentifier", + "src": "2322:6:70" + }, + "nativeSrc": "2322:20:70", + "nodeType": "YulFunctionCall", + "src": "2322:20:70" + }, + "nativeSrc": "2319:46:70", + "nodeType": "YulIf", + "src": "2319:46:70" + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "2381:3:70", + "nodeType": "YulIdentifier", + "src": "2381:3:70" + }, + { + "name": "value", + "nativeSrc": "2386:5:70", + "nodeType": "YulIdentifier", + "src": "2386:5:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2374:6:70", + "nodeType": "YulIdentifier", + "src": "2374:6:70" + }, + "nativeSrc": "2374:18:70", + "nodeType": "YulFunctionCall", + "src": "2374:18:70" + }, + "nativeSrc": "2374:18:70", + "nodeType": "YulExpressionStatement", + "src": "2374:18:70" + } + ] + }, + "name": "abi_encode_enum_DisputeStatus", + "nativeSrc": "2254:144:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "2293:5:70", + "nodeType": "YulTypedName", + "src": "2293:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "2300:3:70", + "nodeType": "YulTypedName", + "src": "2300:3:70", + "type": "" + } + ], + "src": "2254:144:70" + }, + { + "body": { + "nativeSrc": "2760:557:70", + "nodeType": "YulBlock", + "src": "2760:557:70", + "statements": [ + { + "nativeSrc": "2770:27:70", + "nodeType": "YulAssignment", + "src": "2770:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2782:9:70", + "nodeType": "YulIdentifier", + "src": "2782:9:70" + }, + { + "kind": "number", + "nativeSrc": "2793:3:70", + "nodeType": "YulLiteral", + "src": "2793:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2778:3:70", + "nodeType": "YulIdentifier", + "src": "2778:3:70" + }, + "nativeSrc": "2778:19:70", + "nodeType": "YulFunctionCall", + "src": "2778:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "2770:4:70", + "nodeType": "YulIdentifier", + "src": "2770:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2813:9:70", + "nodeType": "YulIdentifier", + "src": "2813:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "2828:6:70", + "nodeType": "YulIdentifier", + "src": "2828:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2844:3:70", + "nodeType": "YulLiteral", + "src": "2844:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "2849:1:70", + "nodeType": "YulLiteral", + "src": "2849:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2840:3:70", + "nodeType": "YulIdentifier", + "src": "2840:3:70" + }, + "nativeSrc": "2840:11:70", + "nodeType": "YulFunctionCall", + "src": "2840:11:70" + }, + { + "kind": "number", + "nativeSrc": "2853:1:70", + "nodeType": "YulLiteral", + "src": "2853:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2836:3:70", + "nodeType": "YulIdentifier", + "src": "2836:3:70" + }, + "nativeSrc": "2836:19:70", + "nodeType": "YulFunctionCall", + "src": "2836:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2824:3:70", + "nodeType": "YulIdentifier", + "src": "2824:3:70" + }, + "nativeSrc": "2824:32:70", + "nodeType": "YulFunctionCall", + "src": "2824:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2806:6:70", + "nodeType": "YulIdentifier", + "src": "2806:6:70" + }, + "nativeSrc": "2806:51:70", + "nodeType": "YulFunctionCall", + "src": "2806:51:70" + }, + "nativeSrc": "2806:51:70", + "nodeType": "YulExpressionStatement", + "src": "2806:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2877:9:70", + "nodeType": "YulIdentifier", + "src": "2877:9:70" + }, + { + "kind": "number", + "nativeSrc": "2888:2:70", + "nodeType": "YulLiteral", + "src": "2888:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2873:3:70", + "nodeType": "YulIdentifier", + "src": "2873:3:70" + }, + "nativeSrc": "2873:18:70", + "nodeType": "YulFunctionCall", + "src": "2873:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "2897:6:70", + "nodeType": "YulIdentifier", + "src": "2897:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2913:3:70", + "nodeType": "YulLiteral", + "src": "2913:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "2918:1:70", + "nodeType": "YulLiteral", + "src": "2918:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2909:3:70", + "nodeType": "YulIdentifier", + "src": "2909:3:70" + }, + "nativeSrc": "2909:11:70", + "nodeType": "YulFunctionCall", + "src": "2909:11:70" + }, + { + "kind": "number", + "nativeSrc": "2922:1:70", + "nodeType": "YulLiteral", + "src": "2922:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2905:3:70", + "nodeType": "YulIdentifier", + "src": "2905:3:70" + }, + "nativeSrc": "2905:19:70", + "nodeType": "YulFunctionCall", + "src": "2905:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2893:3:70", + "nodeType": "YulIdentifier", + "src": "2893:3:70" + }, + "nativeSrc": "2893:32:70", + "nodeType": "YulFunctionCall", + "src": "2893:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2866:6:70", + "nodeType": "YulIdentifier", + "src": "2866:6:70" + }, + "nativeSrc": "2866:60:70", + "nodeType": "YulFunctionCall", + "src": "2866:60:70" + }, + "nativeSrc": "2866:60:70", + "nodeType": "YulExpressionStatement", + "src": "2866:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2946:9:70", + "nodeType": "YulIdentifier", + "src": "2946:9:70" + }, + { + "kind": "number", + "nativeSrc": "2957:2:70", + "nodeType": "YulLiteral", + "src": "2957:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2942:3:70", + "nodeType": "YulIdentifier", + "src": "2942:3:70" + }, + "nativeSrc": "2942:18:70", + "nodeType": "YulFunctionCall", + "src": "2942:18:70" + }, + { + "name": "value2", + "nativeSrc": "2962:6:70", + "nodeType": "YulIdentifier", + "src": "2962:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2935:6:70", + "nodeType": "YulIdentifier", + "src": "2935:6:70" + }, + "nativeSrc": "2935:34:70", + "nodeType": "YulFunctionCall", + "src": "2935:34:70" + }, + "nativeSrc": "2935:34:70", + "nodeType": "YulExpressionStatement", + "src": "2935:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2989:9:70", + "nodeType": "YulIdentifier", + "src": "2989:9:70" + }, + { + "kind": "number", + "nativeSrc": "3000:2:70", + "nodeType": "YulLiteral", + "src": "3000:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2985:3:70", + "nodeType": "YulIdentifier", + "src": "2985:3:70" + }, + "nativeSrc": "2985:18:70", + "nodeType": "YulFunctionCall", + "src": "2985:18:70" + }, + { + "name": "value3", + "nativeSrc": "3005:6:70", + "nodeType": "YulIdentifier", + "src": "3005:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2978:6:70", + "nodeType": "YulIdentifier", + "src": "2978:6:70" + }, + "nativeSrc": "2978:34:70", + "nodeType": "YulFunctionCall", + "src": "2978:34:70" + }, + "nativeSrc": "2978:34:70", + "nodeType": "YulExpressionStatement", + "src": "2978:34:70" + }, + { + "body": { + "nativeSrc": "3046:22:70", + "nodeType": "YulBlock", + "src": "3046:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x21", + "nativeSrc": "3048:16:70", + "nodeType": "YulIdentifier", + "src": "3048:16:70" + }, + "nativeSrc": "3048:18:70", + "nodeType": "YulFunctionCall", + "src": "3048:18:70" + }, + "nativeSrc": "3048:18:70", + "nodeType": "YulExpressionStatement", + "src": "3048:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value4", + "nativeSrc": "3034:6:70", + "nodeType": "YulIdentifier", + "src": "3034:6:70" + }, + { + "kind": "number", + "nativeSrc": "3042:1:70", + "nodeType": "YulLiteral", + "src": "3042:1:70", + "type": "", + "value": "4" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "3031:2:70", + "nodeType": "YulIdentifier", + "src": "3031:2:70" + }, + "nativeSrc": "3031:13:70", + "nodeType": "YulFunctionCall", + "src": "3031:13:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "3024:6:70", + "nodeType": "YulIdentifier", + "src": "3024:6:70" + }, + "nativeSrc": "3024:21:70", + "nodeType": "YulFunctionCall", + "src": "3024:21:70" + }, + "nativeSrc": "3021:47:70", + "nodeType": "YulIf", + "src": "3021:47:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3088:9:70", + "nodeType": "YulIdentifier", + "src": "3088:9:70" + }, + { + "kind": "number", + "nativeSrc": "3099:3:70", + "nodeType": "YulLiteral", + "src": "3099:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3084:3:70", + "nodeType": "YulIdentifier", + "src": "3084:3:70" + }, + "nativeSrc": "3084:19:70", + "nodeType": "YulFunctionCall", + "src": "3084:19:70" + }, + { + "name": "value4", + "nativeSrc": "3105:6:70", + "nodeType": "YulIdentifier", + "src": "3105:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3077:6:70", + "nodeType": "YulIdentifier", + "src": "3077:6:70" + }, + "nativeSrc": "3077:35:70", + "nodeType": "YulFunctionCall", + "src": "3077:35:70" + }, + "nativeSrc": "3077:35:70", + "nodeType": "YulExpressionStatement", + "src": "3077:35:70" + }, + { + "expression": { + "arguments": [ + { + "name": "value5", + "nativeSrc": "3151:6:70", + "nodeType": "YulIdentifier", + "src": "3151:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3163:9:70", + "nodeType": "YulIdentifier", + "src": "3163:9:70" + }, + { + "kind": "number", + "nativeSrc": "3174:3:70", + "nodeType": "YulLiteral", + "src": "3174:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3159:3:70", + "nodeType": "YulIdentifier", + "src": "3159:3:70" + }, + "nativeSrc": "3159:19:70", + "nodeType": "YulFunctionCall", + "src": "3159:19:70" + } + ], + "functionName": { + "name": "abi_encode_enum_DisputeStatus", + "nativeSrc": "3121:29:70", + "nodeType": "YulIdentifier", + "src": "3121:29:70" + }, + "nativeSrc": "3121:58:70", + "nodeType": "YulFunctionCall", + "src": "3121:58:70" + }, + "nativeSrc": "3121:58:70", + "nodeType": "YulExpressionStatement", + "src": "3121:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3199:9:70", + "nodeType": "YulIdentifier", + "src": "3199:9:70" + }, + { + "kind": "number", + "nativeSrc": "3210:3:70", + "nodeType": "YulLiteral", + "src": "3210:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3195:3:70", + "nodeType": "YulIdentifier", + "src": "3195:3:70" + }, + "nativeSrc": "3195:19:70", + "nodeType": "YulFunctionCall", + "src": "3195:19:70" + }, + { + "name": "value6", + "nativeSrc": "3216:6:70", + "nodeType": "YulIdentifier", + "src": "3216:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3188:6:70", + "nodeType": "YulIdentifier", + "src": "3188:6:70" + }, + "nativeSrc": "3188:35:70", + "nodeType": "YulFunctionCall", + "src": "3188:35:70" + }, + "nativeSrc": "3188:35:70", + "nodeType": "YulExpressionStatement", + "src": "3188:35:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3243:9:70", + "nodeType": "YulIdentifier", + "src": "3243:9:70" + }, + { + "kind": "number", + "nativeSrc": "3254:3:70", + "nodeType": "YulLiteral", + "src": "3254:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3239:3:70", + "nodeType": "YulIdentifier", + "src": "3239:3:70" + }, + "nativeSrc": "3239:19:70", + "nodeType": "YulFunctionCall", + "src": "3239:19:70" + }, + { + "name": "value7", + "nativeSrc": "3260:6:70", + "nodeType": "YulIdentifier", + "src": "3260:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3232:6:70", + "nodeType": "YulIdentifier", + "src": "3232:6:70" + }, + "nativeSrc": "3232:35:70", + "nodeType": "YulFunctionCall", + "src": "3232:35:70" + }, + "nativeSrc": "3232:35:70", + "nodeType": "YulExpressionStatement", + "src": "3232:35:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3287:9:70", + "nodeType": "YulIdentifier", + "src": "3287:9:70" + }, + { + "kind": "number", + "nativeSrc": "3298:3:70", + "nodeType": "YulLiteral", + "src": "3298:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3283:3:70", + "nodeType": "YulIdentifier", + "src": "3283:3:70" + }, + "nativeSrc": "3283:19:70", + "nodeType": "YulFunctionCall", + "src": "3283:19:70" + }, + { + "name": "value8", + "nativeSrc": "3304:6:70", + "nodeType": "YulIdentifier", + "src": "3304:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3276:6:70", + "nodeType": "YulIdentifier", + "src": "3276:6:70" + }, + "nativeSrc": "3276:35:70", + "nodeType": "YulFunctionCall", + "src": "3276:35:70" + }, + "nativeSrc": "3276:35:70", + "nodeType": "YulExpressionStatement", + "src": "3276:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_uint256_t_bytes32_t_enum$_DisputeType_$14913_t_enum$_DisputeStatus_$14921_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_bytes32_t_uint8_t_uint8_t_uint256_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "2403:914:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2665:9:70", + "nodeType": "YulTypedName", + "src": "2665:9:70", + "type": "" + }, + { + "name": "value8", + "nativeSrc": "2676:6:70", + "nodeType": "YulTypedName", + "src": "2676:6:70", + "type": "" + }, + { + "name": "value7", + "nativeSrc": "2684:6:70", + "nodeType": "YulTypedName", + "src": "2684:6:70", + "type": "" + }, + { + "name": "value6", + "nativeSrc": "2692:6:70", + "nodeType": "YulTypedName", + "src": "2692:6:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "2700:6:70", + "nodeType": "YulTypedName", + "src": "2700:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "2708:6:70", + "nodeType": "YulTypedName", + "src": "2708:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "2716:6:70", + "nodeType": "YulTypedName", + "src": "2716:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "2724:6:70", + "nodeType": "YulTypedName", + "src": "2724:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "2732:6:70", + "nodeType": "YulTypedName", + "src": "2732:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "2740:6:70", + "nodeType": "YulTypedName", + "src": "2740:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "2751:4:70", + "nodeType": "YulTypedName", + "src": "2751:4:70", + "type": "" + } + ], + "src": "2403:914:70" + }, + { + "body": { + "nativeSrc": "3392:156:70", + "nodeType": "YulBlock", + "src": "3392:156:70", + "statements": [ + { + "body": { + "nativeSrc": "3438:16:70", + "nodeType": "YulBlock", + "src": "3438:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3447:1:70", + "nodeType": "YulLiteral", + "src": "3447:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3450:1:70", + "nodeType": "YulLiteral", + "src": "3450:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3440:6:70", + "nodeType": "YulIdentifier", + "src": "3440:6:70" + }, + "nativeSrc": "3440:12:70", + "nodeType": "YulFunctionCall", + "src": "3440:12:70" + }, + "nativeSrc": "3440:12:70", + "nodeType": "YulExpressionStatement", + "src": "3440:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "3413:7:70", + "nodeType": "YulIdentifier", + "src": "3413:7:70" + }, + { + "name": "headStart", + "nativeSrc": "3422:9:70", + "nodeType": "YulIdentifier", + "src": "3422:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "3409:3:70", + "nodeType": "YulIdentifier", + "src": "3409:3:70" + }, + "nativeSrc": "3409:23:70", + "nodeType": "YulFunctionCall", + "src": "3409:23:70" + }, + { + "kind": "number", + "nativeSrc": "3434:2:70", + "nodeType": "YulLiteral", + "src": "3434:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "3405:3:70", + "nodeType": "YulIdentifier", + "src": "3405:3:70" + }, + "nativeSrc": "3405:32:70", + "nodeType": "YulFunctionCall", + "src": "3405:32:70" + }, + "nativeSrc": "3402:52:70", + "nodeType": "YulIf", + "src": "3402:52:70" + }, + { + "nativeSrc": "3463:14:70", + "nodeType": "YulVariableDeclaration", + "src": "3463:14:70", + "value": { + "kind": "number", + "nativeSrc": "3476:1:70", + "nodeType": "YulLiteral", + "src": "3476:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "3467:5:70", + "nodeType": "YulTypedName", + "src": "3467:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "3486:32:70", + "nodeType": "YulAssignment", + "src": "3486:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3508:9:70", + "nodeType": "YulIdentifier", + "src": "3508:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "3495:12:70", + "nodeType": "YulIdentifier", + "src": "3495:12:70" + }, + "nativeSrc": "3495:23:70", + "nodeType": "YulFunctionCall", + "src": "3495:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "3486:5:70", + "nodeType": "YulIdentifier", + "src": "3486:5:70" + } + ] + }, + { + "nativeSrc": "3527:15:70", + "nodeType": "YulAssignment", + "src": "3527:15:70", + "value": { + "name": "value", + "nativeSrc": "3537:5:70", + "nodeType": "YulIdentifier", + "src": "3537:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "3527:6:70", + "nodeType": "YulIdentifier", + "src": "3527:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nativeSrc": "3322:226:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "3358:9:70", + "nodeType": "YulTypedName", + "src": "3358:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "3369:7:70", + "nodeType": "YulTypedName", + "src": "3369:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "3381:6:70", + "nodeType": "YulTypedName", + "src": "3381:6:70", + "type": "" + } + ], + "src": "3322:226:70" + }, + { + "body": { + "nativeSrc": "3680:102:70", + "nodeType": "YulBlock", + "src": "3680:102:70", + "statements": [ + { + "nativeSrc": "3690:26:70", + "nodeType": "YulAssignment", + "src": "3690:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3702:9:70", + "nodeType": "YulIdentifier", + "src": "3702:9:70" + }, + { + "kind": "number", + "nativeSrc": "3713:2:70", + "nodeType": "YulLiteral", + "src": "3713:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3698:3:70", + "nodeType": "YulIdentifier", + "src": "3698:3:70" + }, + "nativeSrc": "3698:18:70", + "nodeType": "YulFunctionCall", + "src": "3698:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "3690:4:70", + "nodeType": "YulIdentifier", + "src": "3690:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3732:9:70", + "nodeType": "YulIdentifier", + "src": "3732:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "3747:6:70", + "nodeType": "YulIdentifier", + "src": "3747:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3763:3:70", + "nodeType": "YulLiteral", + "src": "3763:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "3768:1:70", + "nodeType": "YulLiteral", + "src": "3768:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "3759:3:70", + "nodeType": "YulIdentifier", + "src": "3759:3:70" + }, + "nativeSrc": "3759:11:70", + "nodeType": "YulFunctionCall", + "src": "3759:11:70" + }, + { + "kind": "number", + "nativeSrc": "3772:1:70", + "nodeType": "YulLiteral", + "src": "3772:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "3755:3:70", + "nodeType": "YulIdentifier", + "src": "3755:3:70" + }, + "nativeSrc": "3755:19:70", + "nodeType": "YulFunctionCall", + "src": "3755:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "3743:3:70", + "nodeType": "YulIdentifier", + "src": "3743:3:70" + }, + "nativeSrc": "3743:32:70", + "nodeType": "YulFunctionCall", + "src": "3743:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3725:6:70", + "nodeType": "YulIdentifier", + "src": "3725:6:70" + }, + "nativeSrc": "3725:51:70", + "nodeType": "YulFunctionCall", + "src": "3725:51:70" + }, + "nativeSrc": "3725:51:70", + "nodeType": "YulExpressionStatement", + "src": "3725:51:70" + } + ] + }, + "name": "abi_encode_tuple_t_contract$_ISubgraphService_$15634__to_t_address__fromStack_reversed", + "nativeSrc": "3553:229:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "3649:9:70", + "nodeType": "YulTypedName", + "src": "3649:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "3660:6:70", + "nodeType": "YulTypedName", + "src": "3660:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "3671:4:70", + "nodeType": "YulTypedName", + "src": "3671:4:70", + "type": "" + } + ], + "src": "3553:229:70" + }, + { + "body": { + "nativeSrc": "3888:76:70", + "nodeType": "YulBlock", + "src": "3888:76:70", + "statements": [ + { + "nativeSrc": "3898:26:70", + "nodeType": "YulAssignment", + "src": "3898:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3910:9:70", + "nodeType": "YulIdentifier", + "src": "3910:9:70" + }, + { + "kind": "number", + "nativeSrc": "3921:2:70", + "nodeType": "YulLiteral", + "src": "3921:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3906:3:70", + "nodeType": "YulIdentifier", + "src": "3906:3:70" + }, + "nativeSrc": "3906:18:70", + "nodeType": "YulFunctionCall", + "src": "3906:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "3898:4:70", + "nodeType": "YulIdentifier", + "src": "3898:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3940:9:70", + "nodeType": "YulIdentifier", + "src": "3940:9:70" + }, + { + "name": "value0", + "nativeSrc": "3951:6:70", + "nodeType": "YulIdentifier", + "src": "3951:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3933:6:70", + "nodeType": "YulIdentifier", + "src": "3933:6:70" + }, + "nativeSrc": "3933:25:70", + "nodeType": "YulFunctionCall", + "src": "3933:25:70" + }, + "nativeSrc": "3933:25:70", + "nodeType": "YulExpressionStatement", + "src": "3933:25:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nativeSrc": "3787:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "3857:9:70", + "nodeType": "YulTypedName", + "src": "3857:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "3868:6:70", + "nodeType": "YulTypedName", + "src": "3868:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "3879:4:70", + "nodeType": "YulTypedName", + "src": "3879:4:70", + "type": "" + } + ], + "src": "3787:177:70" + }, + { + "body": { + "nativeSrc": "4056:280:70", + "nodeType": "YulBlock", + "src": "4056:280:70", + "statements": [ + { + "body": { + "nativeSrc": "4102:16:70", + "nodeType": "YulBlock", + "src": "4102:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "4111:1:70", + "nodeType": "YulLiteral", + "src": "4111:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "4114:1:70", + "nodeType": "YulLiteral", + "src": "4114:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "4104:6:70", + "nodeType": "YulIdentifier", + "src": "4104:6:70" + }, + "nativeSrc": "4104:12:70", + "nodeType": "YulFunctionCall", + "src": "4104:12:70" + }, + "nativeSrc": "4104:12:70", + "nodeType": "YulExpressionStatement", + "src": "4104:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "4077:7:70", + "nodeType": "YulIdentifier", + "src": "4077:7:70" + }, + { + "name": "headStart", + "nativeSrc": "4086:9:70", + "nodeType": "YulIdentifier", + "src": "4086:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "4073:3:70", + "nodeType": "YulIdentifier", + "src": "4073:3:70" + }, + "nativeSrc": "4073:23:70", + "nodeType": "YulFunctionCall", + "src": "4073:23:70" + }, + { + "kind": "number", + "nativeSrc": "4098:2:70", + "nodeType": "YulLiteral", + "src": "4098:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "4069:3:70", + "nodeType": "YulIdentifier", + "src": "4069:3:70" + }, + "nativeSrc": "4069:32:70", + "nodeType": "YulFunctionCall", + "src": "4069:32:70" + }, + "nativeSrc": "4066:52:70", + "nodeType": "YulIf", + "src": "4066:52:70" + }, + { + "nativeSrc": "4127:36:70", + "nodeType": "YulVariableDeclaration", + "src": "4127:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4153:9:70", + "nodeType": "YulIdentifier", + "src": "4153:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "4140:12:70", + "nodeType": "YulIdentifier", + "src": "4140:12:70" + }, + "nativeSrc": "4140:23:70", + "nodeType": "YulFunctionCall", + "src": "4140:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "4131:5:70", + "nodeType": "YulTypedName", + "src": "4131:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "4197:5:70", + "nodeType": "YulIdentifier", + "src": "4197:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "4172:24:70", + "nodeType": "YulIdentifier", + "src": "4172:24:70" + }, + "nativeSrc": "4172:31:70", + "nodeType": "YulFunctionCall", + "src": "4172:31:70" + }, + "nativeSrc": "4172:31:70", + "nodeType": "YulExpressionStatement", + "src": "4172:31:70" + }, + { + "nativeSrc": "4212:15:70", + "nodeType": "YulAssignment", + "src": "4212:15:70", + "value": { + "name": "value", + "nativeSrc": "4222:5:70", + "nodeType": "YulIdentifier", + "src": "4222:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "4212:6:70", + "nodeType": "YulIdentifier", + "src": "4212:6:70" + } + ] + }, + { + "nativeSrc": "4236:16:70", + "nodeType": "YulVariableDeclaration", + "src": "4236:16:70", + "value": { + "kind": "number", + "nativeSrc": "4251:1:70", + "nodeType": "YulLiteral", + "src": "4251:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "4240:7:70", + "nodeType": "YulTypedName", + "src": "4240:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "4261:43:70", + "nodeType": "YulAssignment", + "src": "4261:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4289:9:70", + "nodeType": "YulIdentifier", + "src": "4289:9:70" + }, + { + "kind": "number", + "nativeSrc": "4300:2:70", + "nodeType": "YulLiteral", + "src": "4300:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4285:3:70", + "nodeType": "YulIdentifier", + "src": "4285:3:70" + }, + "nativeSrc": "4285:18:70", + "nodeType": "YulFunctionCall", + "src": "4285:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "4272:12:70", + "nodeType": "YulIdentifier", + "src": "4272:12:70" + }, + "nativeSrc": "4272:32:70", + "nodeType": "YulFunctionCall", + "src": "4272:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "4261:7:70", + "nodeType": "YulIdentifier", + "src": "4261:7:70" + } + ] + }, + { + "nativeSrc": "4313:17:70", + "nodeType": "YulAssignment", + "src": "4313:17:70", + "value": { + "name": "value_1", + "nativeSrc": "4323:7:70", + "nodeType": "YulIdentifier", + "src": "4323:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "4313:6:70", + "nodeType": "YulIdentifier", + "src": "4313:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_bytes32", + "nativeSrc": "3969:367:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "4014:9:70", + "nodeType": "YulTypedName", + "src": "4014:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "4025:7:70", + "nodeType": "YulTypedName", + "src": "4025:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "4037:6:70", + "nodeType": "YulTypedName", + "src": "4037:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "4045:6:70", + "nodeType": "YulTypedName", + "src": "4045:6:70", + "type": "" + } + ], + "src": "3969:367:70" + }, + { + "body": { + "nativeSrc": "4442:76:70", + "nodeType": "YulBlock", + "src": "4442:76:70", + "statements": [ + { + "nativeSrc": "4452:26:70", + "nodeType": "YulAssignment", + "src": "4452:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4464:9:70", + "nodeType": "YulIdentifier", + "src": "4464:9:70" + }, + { + "kind": "number", + "nativeSrc": "4475:2:70", + "nodeType": "YulLiteral", + "src": "4475:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4460:3:70", + "nodeType": "YulIdentifier", + "src": "4460:3:70" + }, + "nativeSrc": "4460:18:70", + "nodeType": "YulFunctionCall", + "src": "4460:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "4452:4:70", + "nodeType": "YulIdentifier", + "src": "4452:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4494:9:70", + "nodeType": "YulIdentifier", + "src": "4494:9:70" + }, + { + "name": "value0", + "nativeSrc": "4505:6:70", + "nodeType": "YulIdentifier", + "src": "4505:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4487:6:70", + "nodeType": "YulIdentifier", + "src": "4487:6:70" + }, + "nativeSrc": "4487:25:70", + "nodeType": "YulFunctionCall", + "src": "4487:25:70" + }, + "nativeSrc": "4487:25:70", + "nodeType": "YulExpressionStatement", + "src": "4487:25:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nativeSrc": "4341:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "4411:9:70", + "nodeType": "YulTypedName", + "src": "4411:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "4422:6:70", + "nodeType": "YulTypedName", + "src": "4422:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "4433:4:70", + "nodeType": "YulTypedName", + "src": "4433:4:70", + "type": "" + } + ], + "src": "4341:177:70" + }, + { + "body": { + "nativeSrc": "4622:101:70", + "nodeType": "YulBlock", + "src": "4622:101:70", + "statements": [ + { + "nativeSrc": "4632:26:70", + "nodeType": "YulAssignment", + "src": "4632:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4644:9:70", + "nodeType": "YulIdentifier", + "src": "4644:9:70" + }, + { + "kind": "number", + "nativeSrc": "4655:2:70", + "nodeType": "YulLiteral", + "src": "4655:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4640:3:70", + "nodeType": "YulIdentifier", + "src": "4640:3:70" + }, + "nativeSrc": "4640:18:70", + "nodeType": "YulFunctionCall", + "src": "4640:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "4632:4:70", + "nodeType": "YulIdentifier", + "src": "4632:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4674:9:70", + "nodeType": "YulIdentifier", + "src": "4674:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "4689:6:70", + "nodeType": "YulIdentifier", + "src": "4689:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "4705:2:70", + "nodeType": "YulLiteral", + "src": "4705:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "4709:1:70", + "nodeType": "YulLiteral", + "src": "4709:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "4701:3:70", + "nodeType": "YulIdentifier", + "src": "4701:3:70" + }, + "nativeSrc": "4701:10:70", + "nodeType": "YulFunctionCall", + "src": "4701:10:70" + }, + { + "kind": "number", + "nativeSrc": "4713:1:70", + "nodeType": "YulLiteral", + "src": "4713:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "4697:3:70", + "nodeType": "YulIdentifier", + "src": "4697:3:70" + }, + "nativeSrc": "4697:18:70", + "nodeType": "YulFunctionCall", + "src": "4697:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "4685:3:70", + "nodeType": "YulIdentifier", + "src": "4685:3:70" + }, + "nativeSrc": "4685:31:70", + "nodeType": "YulFunctionCall", + "src": "4685:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4667:6:70", + "nodeType": "YulIdentifier", + "src": "4667:6:70" + }, + "nativeSrc": "4667:50:70", + "nodeType": "YulFunctionCall", + "src": "4667:50:70" + }, + "nativeSrc": "4667:50:70", + "nodeType": "YulExpressionStatement", + "src": "4667:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed", + "nativeSrc": "4523:200:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "4591:9:70", + "nodeType": "YulTypedName", + "src": "4591:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "4602:6:70", + "nodeType": "YulTypedName", + "src": "4602:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "4613:4:70", + "nodeType": "YulTypedName", + "src": "4613:4:70", + "type": "" + } + ], + "src": "4523:200:70" + }, + { + "body": { + "nativeSrc": "4826:133:70", + "nodeType": "YulBlock", + "src": "4826:133:70", + "statements": [ + { + "nativeSrc": "4836:42:70", + "nodeType": "YulVariableDeclaration", + "src": "4836:42:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "4854:7:70", + "nodeType": "YulIdentifier", + "src": "4854:7:70" + }, + { + "name": "headStart", + "nativeSrc": "4863:9:70", + "nodeType": "YulIdentifier", + "src": "4863:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "4850:3:70", + "nodeType": "YulIdentifier", + "src": "4850:3:70" + }, + "nativeSrc": "4850:23:70", + "nodeType": "YulFunctionCall", + "src": "4850:23:70" + }, + { + "kind": "number", + "nativeSrc": "4875:2:70", + "nodeType": "YulLiteral", + "src": "4875:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "4846:3:70", + "nodeType": "YulIdentifier", + "src": "4846:3:70" + }, + "nativeSrc": "4846:32:70", + "nodeType": "YulFunctionCall", + "src": "4846:32:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "4840:2:70", + "nodeType": "YulTypedName", + "src": "4840:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "4893:16:70", + "nodeType": "YulBlock", + "src": "4893:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "4902:1:70", + "nodeType": "YulLiteral", + "src": "4902:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "4905:1:70", + "nodeType": "YulLiteral", + "src": "4905:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "4895:6:70", + "nodeType": "YulIdentifier", + "src": "4895:6:70" + }, + "nativeSrc": "4895:12:70", + "nodeType": "YulFunctionCall", + "src": "4895:12:70" + }, + "nativeSrc": "4895:12:70", + "nodeType": "YulExpressionStatement", + "src": "4895:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "4890:2:70", + "nodeType": "YulIdentifier", + "src": "4890:2:70" + }, + "nativeSrc": "4887:22:70", + "nodeType": "YulIf", + "src": "4887:22:70" + }, + { + "nativeSrc": "4918:7:70", + "nodeType": "YulAssignment", + "src": "4918:7:70", + "value": { + "kind": "number", + "nativeSrc": "4924:1:70", + "nodeType": "YulLiteral", + "src": "4924:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "4918:2:70", + "nodeType": "YulIdentifier", + "src": "4918:2:70" + } + ] + }, + { + "nativeSrc": "4934:19:70", + "nodeType": "YulAssignment", + "src": "4934:19:70", + "value": { + "name": "headStart", + "nativeSrc": "4944:9:70", + "nodeType": "YulIdentifier", + "src": "4944:9:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "4934:6:70", + "nodeType": "YulIdentifier", + "src": "4934:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_Receipt_$16044_calldata_ptr", + "nativeSrc": "4728:231:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "4792:9:70", + "nodeType": "YulTypedName", + "src": "4792:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "4803:7:70", + "nodeType": "YulTypedName", + "src": "4803:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "4815:6:70", + "nodeType": "YulTypedName", + "src": "4815:6:70", + "type": "" + } + ], + "src": "4728:231:70" + }, + { + "body": { + "nativeSrc": "5065:102:70", + "nodeType": "YulBlock", + "src": "5065:102:70", + "statements": [ + { + "nativeSrc": "5075:26:70", + "nodeType": "YulAssignment", + "src": "5075:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5087:9:70", + "nodeType": "YulIdentifier", + "src": "5087:9:70" + }, + { + "kind": "number", + "nativeSrc": "5098:2:70", + "nodeType": "YulLiteral", + "src": "5098:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5083:3:70", + "nodeType": "YulIdentifier", + "src": "5083:3:70" + }, + "nativeSrc": "5083:18:70", + "nodeType": "YulFunctionCall", + "src": "5083:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "5075:4:70", + "nodeType": "YulIdentifier", + "src": "5075:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5117:9:70", + "nodeType": "YulIdentifier", + "src": "5117:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "5132:6:70", + "nodeType": "YulIdentifier", + "src": "5132:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "5148:3:70", + "nodeType": "YulLiteral", + "src": "5148:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "5153:1:70", + "nodeType": "YulLiteral", + "src": "5153:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "5144:3:70", + "nodeType": "YulIdentifier", + "src": "5144:3:70" + }, + "nativeSrc": "5144:11:70", + "nodeType": "YulFunctionCall", + "src": "5144:11:70" + }, + { + "kind": "number", + "nativeSrc": "5157:1:70", + "nodeType": "YulLiteral", + "src": "5157:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "5140:3:70", + "nodeType": "YulIdentifier", + "src": "5140:3:70" + }, + "nativeSrc": "5140:19:70", + "nodeType": "YulFunctionCall", + "src": "5140:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "5128:3:70", + "nodeType": "YulIdentifier", + "src": "5128:3:70" + }, + "nativeSrc": "5128:32:70", + "nodeType": "YulFunctionCall", + "src": "5128:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "5110:6:70", + "nodeType": "YulIdentifier", + "src": "5110:6:70" + }, + "nativeSrc": "5110:51:70", + "nodeType": "YulFunctionCall", + "src": "5110:51:70" + }, + "nativeSrc": "5110:51:70", + "nodeType": "YulExpressionStatement", + "src": "5110:51:70" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nativeSrc": "4964:203:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "5034:9:70", + "nodeType": "YulTypedName", + "src": "5034:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "5045:6:70", + "nodeType": "YulTypedName", + "src": "5045:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "5056:4:70", + "nodeType": "YulTypedName", + "src": "5056:4:70", + "type": "" + } + ], + "src": "4964:203:70" + }, + { + "body": { + "nativeSrc": "5241:176:70", + "nodeType": "YulBlock", + "src": "5241:176:70", + "statements": [ + { + "body": { + "nativeSrc": "5287:16:70", + "nodeType": "YulBlock", + "src": "5287:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "5296:1:70", + "nodeType": "YulLiteral", + "src": "5296:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "5299:1:70", + "nodeType": "YulLiteral", + "src": "5299:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "5289:6:70", + "nodeType": "YulIdentifier", + "src": "5289:6:70" + }, + "nativeSrc": "5289:12:70", + "nodeType": "YulFunctionCall", + "src": "5289:12:70" + }, + "nativeSrc": "5289:12:70", + "nodeType": "YulExpressionStatement", + "src": "5289:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "5262:7:70", + "nodeType": "YulIdentifier", + "src": "5262:7:70" + }, + { + "name": "headStart", + "nativeSrc": "5271:9:70", + "nodeType": "YulIdentifier", + "src": "5271:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "5258:3:70", + "nodeType": "YulIdentifier", + "src": "5258:3:70" + }, + "nativeSrc": "5258:23:70", + "nodeType": "YulFunctionCall", + "src": "5258:23:70" + }, + { + "kind": "number", + "nativeSrc": "5283:2:70", + "nodeType": "YulLiteral", + "src": "5283:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "5254:3:70", + "nodeType": "YulIdentifier", + "src": "5254:3:70" + }, + "nativeSrc": "5254:32:70", + "nodeType": "YulFunctionCall", + "src": "5254:32:70" + }, + "nativeSrc": "5251:52:70", + "nodeType": "YulIf", + "src": "5251:52:70" + }, + { + "nativeSrc": "5312:36:70", + "nodeType": "YulVariableDeclaration", + "src": "5312:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5338:9:70", + "nodeType": "YulIdentifier", + "src": "5338:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "5325:12:70", + "nodeType": "YulIdentifier", + "src": "5325:12:70" + }, + "nativeSrc": "5325:23:70", + "nodeType": "YulFunctionCall", + "src": "5325:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "5316:5:70", + "nodeType": "YulTypedName", + "src": "5316:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "5381:5:70", + "nodeType": "YulIdentifier", + "src": "5381:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "5357:23:70", + "nodeType": "YulIdentifier", + "src": "5357:23:70" + }, + "nativeSrc": "5357:30:70", + "nodeType": "YulFunctionCall", + "src": "5357:30:70" + }, + "nativeSrc": "5357:30:70", + "nodeType": "YulExpressionStatement", + "src": "5357:30:70" + }, + { + "nativeSrc": "5396:15:70", + "nodeType": "YulAssignment", + "src": "5396:15:70", + "value": { + "name": "value", + "nativeSrc": "5406:5:70", + "nodeType": "YulIdentifier", + "src": "5406:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "5396:6:70", + "nodeType": "YulIdentifier", + "src": "5396:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint32", + "nativeSrc": "5172:245:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "5207:9:70", + "nodeType": "YulTypedName", + "src": "5207:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "5218:7:70", + "nodeType": "YulTypedName", + "src": "5218:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "5230:6:70", + "nodeType": "YulTypedName", + "src": "5230:6:70", + "type": "" + } + ], + "src": "5172:245:70" + }, + { + "body": { + "nativeSrc": "5543:508:70", + "nodeType": "YulBlock", + "src": "5543:508:70", + "statements": [ + { + "body": { + "nativeSrc": "5590:16:70", + "nodeType": "YulBlock", + "src": "5590:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "5599:1:70", + "nodeType": "YulLiteral", + "src": "5599:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "5602:1:70", + "nodeType": "YulLiteral", + "src": "5602:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "5592:6:70", + "nodeType": "YulIdentifier", + "src": "5592:6:70" + }, + "nativeSrc": "5592:12:70", + "nodeType": "YulFunctionCall", + "src": "5592:12:70" + }, + "nativeSrc": "5592:12:70", + "nodeType": "YulExpressionStatement", + "src": "5592:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "5564:7:70", + "nodeType": "YulIdentifier", + "src": "5564:7:70" + }, + { + "name": "headStart", + "nativeSrc": "5573:9:70", + "nodeType": "YulIdentifier", + "src": "5573:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "5560:3:70", + "nodeType": "YulIdentifier", + "src": "5560:3:70" + }, + "nativeSrc": "5560:23:70", + "nodeType": "YulFunctionCall", + "src": "5560:23:70" + }, + { + "kind": "number", + "nativeSrc": "5585:3:70", + "nodeType": "YulLiteral", + "src": "5585:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "5556:3:70", + "nodeType": "YulIdentifier", + "src": "5556:3:70" + }, + "nativeSrc": "5556:33:70", + "nodeType": "YulFunctionCall", + "src": "5556:33:70" + }, + "nativeSrc": "5553:53:70", + "nodeType": "YulIf", + "src": "5553:53:70" + }, + { + "nativeSrc": "5615:36:70", + "nodeType": "YulVariableDeclaration", + "src": "5615:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5641:9:70", + "nodeType": "YulIdentifier", + "src": "5641:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "5628:12:70", + "nodeType": "YulIdentifier", + "src": "5628:12:70" + }, + "nativeSrc": "5628:23:70", + "nodeType": "YulFunctionCall", + "src": "5628:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "5619:5:70", + "nodeType": "YulTypedName", + "src": "5619:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "5685:5:70", + "nodeType": "YulIdentifier", + "src": "5685:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "5660:24:70", + "nodeType": "YulIdentifier", + "src": "5660:24:70" + }, + "nativeSrc": "5660:31:70", + "nodeType": "YulFunctionCall", + "src": "5660:31:70" + }, + "nativeSrc": "5660:31:70", + "nodeType": "YulExpressionStatement", + "src": "5660:31:70" + }, + { + "nativeSrc": "5700:15:70", + "nodeType": "YulAssignment", + "src": "5700:15:70", + "value": { + "name": "value", + "nativeSrc": "5710:5:70", + "nodeType": "YulIdentifier", + "src": "5710:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "5700:6:70", + "nodeType": "YulIdentifier", + "src": "5700:6:70" + } + ] + }, + { + "nativeSrc": "5724:47:70", + "nodeType": "YulVariableDeclaration", + "src": "5724:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5756:9:70", + "nodeType": "YulIdentifier", + "src": "5756:9:70" + }, + { + "kind": "number", + "nativeSrc": "5767:2:70", + "nodeType": "YulLiteral", + "src": "5767:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5752:3:70", + "nodeType": "YulIdentifier", + "src": "5752:3:70" + }, + "nativeSrc": "5752:18:70", + "nodeType": "YulFunctionCall", + "src": "5752:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "5739:12:70", + "nodeType": "YulIdentifier", + "src": "5739:12:70" + }, + "nativeSrc": "5739:32:70", + "nodeType": "YulFunctionCall", + "src": "5739:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "5728:7:70", + "nodeType": "YulTypedName", + "src": "5728:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "5805:7:70", + "nodeType": "YulIdentifier", + "src": "5805:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "5780:24:70", + "nodeType": "YulIdentifier", + "src": "5780:24:70" + }, + "nativeSrc": "5780:33:70", + "nodeType": "YulFunctionCall", + "src": "5780:33:70" + }, + "nativeSrc": "5780:33:70", + "nodeType": "YulExpressionStatement", + "src": "5780:33:70" + }, + { + "nativeSrc": "5822:17:70", + "nodeType": "YulAssignment", + "src": "5822:17:70", + "value": { + "name": "value_1", + "nativeSrc": "5832:7:70", + "nodeType": "YulIdentifier", + "src": "5832:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "5822:6:70", + "nodeType": "YulIdentifier", + "src": "5822:6:70" + } + ] + }, + { + "nativeSrc": "5848:16:70", + "nodeType": "YulVariableDeclaration", + "src": "5848:16:70", + "value": { + "kind": "number", + "nativeSrc": "5863:1:70", + "nodeType": "YulLiteral", + "src": "5863:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "5852:7:70", + "nodeType": "YulTypedName", + "src": "5852:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "5873:43:70", + "nodeType": "YulAssignment", + "src": "5873:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5901:9:70", + "nodeType": "YulIdentifier", + "src": "5901:9:70" + }, + { + "kind": "number", + "nativeSrc": "5912:2:70", + "nodeType": "YulLiteral", + "src": "5912:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5897:3:70", + "nodeType": "YulIdentifier", + "src": "5897:3:70" + }, + "nativeSrc": "5897:18:70", + "nodeType": "YulFunctionCall", + "src": "5897:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "5884:12:70", + "nodeType": "YulIdentifier", + "src": "5884:12:70" + }, + "nativeSrc": "5884:32:70", + "nodeType": "YulFunctionCall", + "src": "5884:32:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "5873:7:70", + "nodeType": "YulIdentifier", + "src": "5873:7:70" + } + ] + }, + { + "nativeSrc": "5925:17:70", + "nodeType": "YulAssignment", + "src": "5925:17:70", + "value": { + "name": "value_2", + "nativeSrc": "5935:7:70", + "nodeType": "YulIdentifier", + "src": "5935:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "5925:6:70", + "nodeType": "YulIdentifier", + "src": "5925:6:70" + } + ] + }, + { + "nativeSrc": "5951:16:70", + "nodeType": "YulVariableDeclaration", + "src": "5951:16:70", + "value": { + "kind": "number", + "nativeSrc": "5966:1:70", + "nodeType": "YulLiteral", + "src": "5966:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "5955:7:70", + "nodeType": "YulTypedName", + "src": "5955:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "5976:43:70", + "nodeType": "YulAssignment", + "src": "5976:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6004:9:70", + "nodeType": "YulIdentifier", + "src": "6004:9:70" + }, + { + "kind": "number", + "nativeSrc": "6015:2:70", + "nodeType": "YulLiteral", + "src": "6015:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6000:3:70", + "nodeType": "YulIdentifier", + "src": "6000:3:70" + }, + "nativeSrc": "6000:18:70", + "nodeType": "YulFunctionCall", + "src": "6000:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "5987:12:70", + "nodeType": "YulIdentifier", + "src": "5987:12:70" + }, + "nativeSrc": "5987:32:70", + "nodeType": "YulFunctionCall", + "src": "5987:32:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "5976:7:70", + "nodeType": "YulIdentifier", + "src": "5976:7:70" + } + ] + }, + { + "nativeSrc": "6028:17:70", + "nodeType": "YulAssignment", + "src": "6028:17:70", + "value": { + "name": "value_3", + "nativeSrc": "6038:7:70", + "nodeType": "YulIdentifier", + "src": "6038:7:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "6028:6:70", + "nodeType": "YulIdentifier", + "src": "6028:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_uint256t_uint256", + "nativeSrc": "5422:629:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "5485:9:70", + "nodeType": "YulTypedName", + "src": "5485:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "5496:7:70", + "nodeType": "YulTypedName", + "src": "5496:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "5508:6:70", + "nodeType": "YulTypedName", + "src": "5508:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "5516:6:70", + "nodeType": "YulTypedName", + "src": "5516:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "5524:6:70", + "nodeType": "YulTypedName", + "src": "5524:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "5532:6:70", + "nodeType": "YulTypedName", + "src": "5532:6:70", + "type": "" + } + ], + "src": "5422:629:70" + }, + { + "body": { + "nativeSrc": "6126:177:70", + "nodeType": "YulBlock", + "src": "6126:177:70", + "statements": [ + { + "body": { + "nativeSrc": "6172:16:70", + "nodeType": "YulBlock", + "src": "6172:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "6181:1:70", + "nodeType": "YulLiteral", + "src": "6181:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "6184:1:70", + "nodeType": "YulLiteral", + "src": "6184:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "6174:6:70", + "nodeType": "YulIdentifier", + "src": "6174:6:70" + }, + "nativeSrc": "6174:12:70", + "nodeType": "YulFunctionCall", + "src": "6174:12:70" + }, + "nativeSrc": "6174:12:70", + "nodeType": "YulExpressionStatement", + "src": "6174:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "6147:7:70", + "nodeType": "YulIdentifier", + "src": "6147:7:70" + }, + { + "name": "headStart", + "nativeSrc": "6156:9:70", + "nodeType": "YulIdentifier", + "src": "6156:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "6143:3:70", + "nodeType": "YulIdentifier", + "src": "6143:3:70" + }, + "nativeSrc": "6143:23:70", + "nodeType": "YulFunctionCall", + "src": "6143:23:70" + }, + { + "kind": "number", + "nativeSrc": "6168:2:70", + "nodeType": "YulLiteral", + "src": "6168:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "6139:3:70", + "nodeType": "YulIdentifier", + "src": "6139:3:70" + }, + "nativeSrc": "6139:32:70", + "nodeType": "YulFunctionCall", + "src": "6139:32:70" + }, + "nativeSrc": "6136:52:70", + "nodeType": "YulIf", + "src": "6136:52:70" + }, + { + "nativeSrc": "6197:36:70", + "nodeType": "YulVariableDeclaration", + "src": "6197:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6223:9:70", + "nodeType": "YulIdentifier", + "src": "6223:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "6210:12:70", + "nodeType": "YulIdentifier", + "src": "6210:12:70" + }, + "nativeSrc": "6210:23:70", + "nodeType": "YulFunctionCall", + "src": "6210:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "6201:5:70", + "nodeType": "YulTypedName", + "src": "6201:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "6267:5:70", + "nodeType": "YulIdentifier", + "src": "6267:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "6242:24:70", + "nodeType": "YulIdentifier", + "src": "6242:24:70" + }, + "nativeSrc": "6242:31:70", + "nodeType": "YulFunctionCall", + "src": "6242:31:70" + }, + "nativeSrc": "6242:31:70", + "nodeType": "YulExpressionStatement", + "src": "6242:31:70" + }, + { + "nativeSrc": "6282:15:70", + "nodeType": "YulAssignment", + "src": "6282:15:70", + "value": { + "name": "value", + "nativeSrc": "6292:5:70", + "nodeType": "YulIdentifier", + "src": "6292:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "6282:6:70", + "nodeType": "YulIdentifier", + "src": "6282:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address", + "nativeSrc": "6056:247:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "6092:9:70", + "nodeType": "YulTypedName", + "src": "6092:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "6103:7:70", + "nodeType": "YulTypedName", + "src": "6103:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "6115:6:70", + "nodeType": "YulTypedName", + "src": "6115:6:70", + "type": "" + } + ], + "src": "6056:247:70" + }, + { + "body": { + "nativeSrc": "6350:76:70", + "nodeType": "YulBlock", + "src": "6350:76:70", + "statements": [ + { + "body": { + "nativeSrc": "6404:16:70", + "nodeType": "YulBlock", + "src": "6404:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "6413:1:70", + "nodeType": "YulLiteral", + "src": "6413:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "6416:1:70", + "nodeType": "YulLiteral", + "src": "6416:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "6406:6:70", + "nodeType": "YulIdentifier", + "src": "6406:6:70" + }, + "nativeSrc": "6406:12:70", + "nodeType": "YulFunctionCall", + "src": "6406:12:70" + }, + "nativeSrc": "6406:12:70", + "nodeType": "YulExpressionStatement", + "src": "6406:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "6373:5:70", + "nodeType": "YulIdentifier", + "src": "6373:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "6394:5:70", + "nodeType": "YulIdentifier", + "src": "6394:5:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "6387:6:70", + "nodeType": "YulIdentifier", + "src": "6387:6:70" + }, + "nativeSrc": "6387:13:70", + "nodeType": "YulFunctionCall", + "src": "6387:13:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "6380:6:70", + "nodeType": "YulIdentifier", + "src": "6380:6:70" + }, + "nativeSrc": "6380:21:70", + "nodeType": "YulFunctionCall", + "src": "6380:21:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "6370:2:70", + "nodeType": "YulIdentifier", + "src": "6370:2:70" + }, + "nativeSrc": "6370:32:70", + "nodeType": "YulFunctionCall", + "src": "6370:32:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "6363:6:70", + "nodeType": "YulIdentifier", + "src": "6363:6:70" + }, + "nativeSrc": "6363:40:70", + "nodeType": "YulFunctionCall", + "src": "6363:40:70" + }, + "nativeSrc": "6360:60:70", + "nodeType": "YulIf", + "src": "6360:60:70" + } + ] + }, + "name": "validator_revert_bool", + "nativeSrc": "6308:118:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "6339:5:70", + "nodeType": "YulTypedName", + "src": "6339:5:70", + "type": "" + } + ], + "src": "6308:118:70" + }, + { + "body": { + "nativeSrc": "6549:484:70", + "nodeType": "YulBlock", + "src": "6549:484:70", + "statements": [ + { + "body": { + "nativeSrc": "6596:16:70", + "nodeType": "YulBlock", + "src": "6596:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "6605:1:70", + "nodeType": "YulLiteral", + "src": "6605:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "6608:1:70", + "nodeType": "YulLiteral", + "src": "6608:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "6598:6:70", + "nodeType": "YulIdentifier", + "src": "6598:6:70" + }, + "nativeSrc": "6598:12:70", + "nodeType": "YulFunctionCall", + "src": "6598:12:70" + }, + "nativeSrc": "6598:12:70", + "nodeType": "YulExpressionStatement", + "src": "6598:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "6570:7:70", + "nodeType": "YulIdentifier", + "src": "6570:7:70" + }, + { + "name": "headStart", + "nativeSrc": "6579:9:70", + "nodeType": "YulIdentifier", + "src": "6579:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "6566:3:70", + "nodeType": "YulIdentifier", + "src": "6566:3:70" + }, + "nativeSrc": "6566:23:70", + "nodeType": "YulFunctionCall", + "src": "6566:23:70" + }, + { + "kind": "number", + "nativeSrc": "6591:3:70", + "nodeType": "YulLiteral", + "src": "6591:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "6562:3:70", + "nodeType": "YulIdentifier", + "src": "6562:3:70" + }, + "nativeSrc": "6562:33:70", + "nodeType": "YulFunctionCall", + "src": "6562:33:70" + }, + "nativeSrc": "6559:53:70", + "nodeType": "YulIf", + "src": "6559:53:70" + }, + { + "nativeSrc": "6621:14:70", + "nodeType": "YulVariableDeclaration", + "src": "6621:14:70", + "value": { + "kind": "number", + "nativeSrc": "6634:1:70", + "nodeType": "YulLiteral", + "src": "6634:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "6625:5:70", + "nodeType": "YulTypedName", + "src": "6625:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "6644:32:70", + "nodeType": "YulAssignment", + "src": "6644:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6666:9:70", + "nodeType": "YulIdentifier", + "src": "6666:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "6653:12:70", + "nodeType": "YulIdentifier", + "src": "6653:12:70" + }, + "nativeSrc": "6653:23:70", + "nodeType": "YulFunctionCall", + "src": "6653:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "6644:5:70", + "nodeType": "YulIdentifier", + "src": "6644:5:70" + } + ] + }, + { + "nativeSrc": "6685:15:70", + "nodeType": "YulAssignment", + "src": "6685:15:70", + "value": { + "name": "value", + "nativeSrc": "6695:5:70", + "nodeType": "YulIdentifier", + "src": "6695:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "6685:6:70", + "nodeType": "YulIdentifier", + "src": "6685:6:70" + } + ] + }, + { + "nativeSrc": "6709:16:70", + "nodeType": "YulVariableDeclaration", + "src": "6709:16:70", + "value": { + "kind": "number", + "nativeSrc": "6724:1:70", + "nodeType": "YulLiteral", + "src": "6724:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "6713:7:70", + "nodeType": "YulTypedName", + "src": "6713:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "6734:43:70", + "nodeType": "YulAssignment", + "src": "6734:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6762:9:70", + "nodeType": "YulIdentifier", + "src": "6762:9:70" + }, + { + "kind": "number", + "nativeSrc": "6773:2:70", + "nodeType": "YulLiteral", + "src": "6773:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6758:3:70", + "nodeType": "YulIdentifier", + "src": "6758:3:70" + }, + "nativeSrc": "6758:18:70", + "nodeType": "YulFunctionCall", + "src": "6758:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "6745:12:70", + "nodeType": "YulIdentifier", + "src": "6745:12:70" + }, + "nativeSrc": "6745:32:70", + "nodeType": "YulFunctionCall", + "src": "6745:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "6734:7:70", + "nodeType": "YulIdentifier", + "src": "6734:7:70" + } + ] + }, + { + "nativeSrc": "6786:17:70", + "nodeType": "YulAssignment", + "src": "6786:17:70", + "value": { + "name": "value_1", + "nativeSrc": "6796:7:70", + "nodeType": "YulIdentifier", + "src": "6796:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "6786:6:70", + "nodeType": "YulIdentifier", + "src": "6786:6:70" + } + ] + }, + { + "nativeSrc": "6812:47:70", + "nodeType": "YulVariableDeclaration", + "src": "6812:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6844:9:70", + "nodeType": "YulIdentifier", + "src": "6844:9:70" + }, + { + "kind": "number", + "nativeSrc": "6855:2:70", + "nodeType": "YulLiteral", + "src": "6855:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6840:3:70", + "nodeType": "YulIdentifier", + "src": "6840:3:70" + }, + "nativeSrc": "6840:18:70", + "nodeType": "YulFunctionCall", + "src": "6840:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "6827:12:70", + "nodeType": "YulIdentifier", + "src": "6827:12:70" + }, + "nativeSrc": "6827:32:70", + "nodeType": "YulFunctionCall", + "src": "6827:32:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "6816:7:70", + "nodeType": "YulTypedName", + "src": "6816:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_2", + "nativeSrc": "6890:7:70", + "nodeType": "YulIdentifier", + "src": "6890:7:70" + } + ], + "functionName": { + "name": "validator_revert_bool", + "nativeSrc": "6868:21:70", + "nodeType": "YulIdentifier", + "src": "6868:21:70" + }, + "nativeSrc": "6868:30:70", + "nodeType": "YulFunctionCall", + "src": "6868:30:70" + }, + "nativeSrc": "6868:30:70", + "nodeType": "YulExpressionStatement", + "src": "6868:30:70" + }, + { + "nativeSrc": "6907:17:70", + "nodeType": "YulAssignment", + "src": "6907:17:70", + "value": { + "name": "value_2", + "nativeSrc": "6917:7:70", + "nodeType": "YulIdentifier", + "src": "6917:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "6907:6:70", + "nodeType": "YulIdentifier", + "src": "6907:6:70" + } + ] + }, + { + "nativeSrc": "6933:16:70", + "nodeType": "YulVariableDeclaration", + "src": "6933:16:70", + "value": { + "kind": "number", + "nativeSrc": "6948:1:70", + "nodeType": "YulLiteral", + "src": "6948:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "6937:7:70", + "nodeType": "YulTypedName", + "src": "6937:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "6958:43:70", + "nodeType": "YulAssignment", + "src": "6958:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6986:9:70", + "nodeType": "YulIdentifier", + "src": "6986:9:70" + }, + { + "kind": "number", + "nativeSrc": "6997:2:70", + "nodeType": "YulLiteral", + "src": "6997:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6982:3:70", + "nodeType": "YulIdentifier", + "src": "6982:3:70" + }, + "nativeSrc": "6982:18:70", + "nodeType": "YulFunctionCall", + "src": "6982:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "6969:12:70", + "nodeType": "YulIdentifier", + "src": "6969:12:70" + }, + "nativeSrc": "6969:32:70", + "nodeType": "YulFunctionCall", + "src": "6969:32:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "6958:7:70", + "nodeType": "YulIdentifier", + "src": "6958:7:70" + } + ] + }, + { + "nativeSrc": "7010:17:70", + "nodeType": "YulAssignment", + "src": "7010:17:70", + "value": { + "name": "value_3", + "nativeSrc": "7020:7:70", + "nodeType": "YulIdentifier", + "src": "7020:7:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "7010:6:70", + "nodeType": "YulIdentifier", + "src": "7010:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32t_uint256t_boolt_uint256", + "nativeSrc": "6431:602:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "6491:9:70", + "nodeType": "YulTypedName", + "src": "6491:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "6502:7:70", + "nodeType": "YulTypedName", + "src": "6502:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "6514:6:70", + "nodeType": "YulTypedName", + "src": "6514:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "6522:6:70", + "nodeType": "YulTypedName", + "src": "6522:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "6530:6:70", + "nodeType": "YulTypedName", + "src": "6530:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "6538:6:70", + "nodeType": "YulTypedName", + "src": "6538:6:70", + "type": "" + } + ], + "src": "6431:602:70" + }, + { + "body": { + "nativeSrc": "7133:92:70", + "nodeType": "YulBlock", + "src": "7133:92:70", + "statements": [ + { + "nativeSrc": "7143:26:70", + "nodeType": "YulAssignment", + "src": "7143:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7155:9:70", + "nodeType": "YulIdentifier", + "src": "7155:9:70" + }, + { + "kind": "number", + "nativeSrc": "7166:2:70", + "nodeType": "YulLiteral", + "src": "7166:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7151:3:70", + "nodeType": "YulIdentifier", + "src": "7151:3:70" + }, + "nativeSrc": "7151:18:70", + "nodeType": "YulFunctionCall", + "src": "7151:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "7143:4:70", + "nodeType": "YulIdentifier", + "src": "7143:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7185:9:70", + "nodeType": "YulIdentifier", + "src": "7185:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "7210:6:70", + "nodeType": "YulIdentifier", + "src": "7210:6:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "7203:6:70", + "nodeType": "YulIdentifier", + "src": "7203:6:70" + }, + "nativeSrc": "7203:14:70", + "nodeType": "YulFunctionCall", + "src": "7203:14:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "7196:6:70", + "nodeType": "YulIdentifier", + "src": "7196:6:70" + }, + "nativeSrc": "7196:22:70", + "nodeType": "YulFunctionCall", + "src": "7196:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "7178:6:70", + "nodeType": "YulIdentifier", + "src": "7178:6:70" + }, + "nativeSrc": "7178:41:70", + "nodeType": "YulFunctionCall", + "src": "7178:41:70" + }, + "nativeSrc": "7178:41:70", + "nodeType": "YulExpressionStatement", + "src": "7178:41:70" + } + ] + }, + "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed", + "nativeSrc": "7038:187:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "7102:9:70", + "nodeType": "YulTypedName", + "src": "7102:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "7113:6:70", + "nodeType": "YulTypedName", + "src": "7113:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "7124:4:70", + "nodeType": "YulTypedName", + "src": "7124:4:70", + "type": "" + } + ], + "src": "7038:187:70" + }, + { + "body": { + "nativeSrc": "7302:275:70", + "nodeType": "YulBlock", + "src": "7302:275:70", + "statements": [ + { + "body": { + "nativeSrc": "7351:16:70", + "nodeType": "YulBlock", + "src": "7351:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7360:1:70", + "nodeType": "YulLiteral", + "src": "7360:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "7363:1:70", + "nodeType": "YulLiteral", + "src": "7363:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "7353:6:70", + "nodeType": "YulIdentifier", + "src": "7353:6:70" + }, + "nativeSrc": "7353:12:70", + "nodeType": "YulFunctionCall", + "src": "7353:12:70" + }, + "nativeSrc": "7353:12:70", + "nodeType": "YulExpressionStatement", + "src": "7353:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nativeSrc": "7330:6:70", + "nodeType": "YulIdentifier", + "src": "7330:6:70" + }, + { + "kind": "number", + "nativeSrc": "7338:4:70", + "nodeType": "YulLiteral", + "src": "7338:4:70", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7326:3:70", + "nodeType": "YulIdentifier", + "src": "7326:3:70" + }, + "nativeSrc": "7326:17:70", + "nodeType": "YulFunctionCall", + "src": "7326:17:70" + }, + { + "name": "end", + "nativeSrc": "7345:3:70", + "nodeType": "YulIdentifier", + "src": "7345:3:70" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "7322:3:70", + "nodeType": "YulIdentifier", + "src": "7322:3:70" + }, + "nativeSrc": "7322:27:70", + "nodeType": "YulFunctionCall", + "src": "7322:27:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "7315:6:70", + "nodeType": "YulIdentifier", + "src": "7315:6:70" + }, + "nativeSrc": "7315:35:70", + "nodeType": "YulFunctionCall", + "src": "7315:35:70" + }, + "nativeSrc": "7312:55:70", + "nodeType": "YulIf", + "src": "7312:55:70" + }, + { + "nativeSrc": "7376:30:70", + "nodeType": "YulAssignment", + "src": "7376:30:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "7399:6:70", + "nodeType": "YulIdentifier", + "src": "7399:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "7386:12:70", + "nodeType": "YulIdentifier", + "src": "7386:12:70" + }, + "nativeSrc": "7386:20:70", + "nodeType": "YulFunctionCall", + "src": "7386:20:70" + }, + "variableNames": [ + { + "name": "length", + "nativeSrc": "7376:6:70", + "nodeType": "YulIdentifier", + "src": "7376:6:70" + } + ] + }, + { + "body": { + "nativeSrc": "7449:16:70", + "nodeType": "YulBlock", + "src": "7449:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7458:1:70", + "nodeType": "YulLiteral", + "src": "7458:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "7461:1:70", + "nodeType": "YulLiteral", + "src": "7461:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "7451:6:70", + "nodeType": "YulIdentifier", + "src": "7451:6:70" + }, + "nativeSrc": "7451:12:70", + "nodeType": "YulFunctionCall", + "src": "7451:12:70" + }, + "nativeSrc": "7451:12:70", + "nodeType": "YulExpressionStatement", + "src": "7451:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nativeSrc": "7421:6:70", + "nodeType": "YulIdentifier", + "src": "7421:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7437:2:70", + "nodeType": "YulLiteral", + "src": "7437:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "7441:1:70", + "nodeType": "YulLiteral", + "src": "7441:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "7433:3:70", + "nodeType": "YulIdentifier", + "src": "7433:3:70" + }, + "nativeSrc": "7433:10:70", + "nodeType": "YulFunctionCall", + "src": "7433:10:70" + }, + { + "kind": "number", + "nativeSrc": "7445:1:70", + "nodeType": "YulLiteral", + "src": "7445:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "7429:3:70", + "nodeType": "YulIdentifier", + "src": "7429:3:70" + }, + "nativeSrc": "7429:18:70", + "nodeType": "YulFunctionCall", + "src": "7429:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "7418:2:70", + "nodeType": "YulIdentifier", + "src": "7418:2:70" + }, + "nativeSrc": "7418:30:70", + "nodeType": "YulFunctionCall", + "src": "7418:30:70" + }, + "nativeSrc": "7415:50:70", + "nodeType": "YulIf", + "src": "7415:50:70" + }, + { + "nativeSrc": "7474:29:70", + "nodeType": "YulAssignment", + "src": "7474:29:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "7490:6:70", + "nodeType": "YulIdentifier", + "src": "7490:6:70" + }, + { + "kind": "number", + "nativeSrc": "7498:4:70", + "nodeType": "YulLiteral", + "src": "7498:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7486:3:70", + "nodeType": "YulIdentifier", + "src": "7486:3:70" + }, + "nativeSrc": "7486:17:70", + "nodeType": "YulFunctionCall", + "src": "7486:17:70" + }, + "variableNames": [ + { + "name": "arrayPos", + "nativeSrc": "7474:8:70", + "nodeType": "YulIdentifier", + "src": "7474:8:70" + } + ] + }, + { + "body": { + "nativeSrc": "7555:16:70", + "nodeType": "YulBlock", + "src": "7555:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7564:1:70", + "nodeType": "YulLiteral", + "src": "7564:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "7567:1:70", + "nodeType": "YulLiteral", + "src": "7567:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "7557:6:70", + "nodeType": "YulIdentifier", + "src": "7557:6:70" + }, + "nativeSrc": "7557:12:70", + "nodeType": "YulFunctionCall", + "src": "7557:12:70" + }, + "nativeSrc": "7557:12:70", + "nodeType": "YulExpressionStatement", + "src": "7557:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nativeSrc": "7526:6:70", + "nodeType": "YulIdentifier", + "src": "7526:6:70" + }, + { + "name": "length", + "nativeSrc": "7534:6:70", + "nodeType": "YulIdentifier", + "src": "7534:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7522:3:70", + "nodeType": "YulIdentifier", + "src": "7522:3:70" + }, + "nativeSrc": "7522:19:70", + "nodeType": "YulFunctionCall", + "src": "7522:19:70" + }, + { + "kind": "number", + "nativeSrc": "7543:4:70", + "nodeType": "YulLiteral", + "src": "7543:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7518:3:70", + "nodeType": "YulIdentifier", + "src": "7518:3:70" + }, + "nativeSrc": "7518:30:70", + "nodeType": "YulFunctionCall", + "src": "7518:30:70" + }, + { + "name": "end", + "nativeSrc": "7550:3:70", + "nodeType": "YulIdentifier", + "src": "7550:3:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "7515:2:70", + "nodeType": "YulIdentifier", + "src": "7515:2:70" + }, + "nativeSrc": "7515:39:70", + "nodeType": "YulFunctionCall", + "src": "7515:39:70" + }, + "nativeSrc": "7512:59:70", + "nodeType": "YulIf", + "src": "7512:59:70" + } + ] + }, + "name": "abi_decode_bytes_calldata", + "nativeSrc": "7230:347:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "7265:6:70", + "nodeType": "YulTypedName", + "src": "7265:6:70", + "type": "" + }, + { + "name": "end", + "nativeSrc": "7273:3:70", + "nodeType": "YulTypedName", + "src": "7273:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nativeSrc": "7281:8:70", + "nodeType": "YulTypedName", + "src": "7281:8:70", + "type": "" + }, + { + "name": "length", + "nativeSrc": "7291:6:70", + "nodeType": "YulTypedName", + "src": "7291:6:70", + "type": "" + } + ], + "src": "7230:347:70" + }, + { + "body": { + "nativeSrc": "7671:320:70", + "nodeType": "YulBlock", + "src": "7671:320:70", + "statements": [ + { + "body": { + "nativeSrc": "7717:16:70", + "nodeType": "YulBlock", + "src": "7717:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7726:1:70", + "nodeType": "YulLiteral", + "src": "7726:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "7729:1:70", + "nodeType": "YulLiteral", + "src": "7729:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "7719:6:70", + "nodeType": "YulIdentifier", + "src": "7719:6:70" + }, + "nativeSrc": "7719:12:70", + "nodeType": "YulFunctionCall", + "src": "7719:12:70" + }, + "nativeSrc": "7719:12:70", + "nodeType": "YulExpressionStatement", + "src": "7719:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "7692:7:70", + "nodeType": "YulIdentifier", + "src": "7692:7:70" + }, + { + "name": "headStart", + "nativeSrc": "7701:9:70", + "nodeType": "YulIdentifier", + "src": "7701:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "7688:3:70", + "nodeType": "YulIdentifier", + "src": "7688:3:70" + }, + "nativeSrc": "7688:23:70", + "nodeType": "YulFunctionCall", + "src": "7688:23:70" + }, + { + "kind": "number", + "nativeSrc": "7713:2:70", + "nodeType": "YulLiteral", + "src": "7713:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "7684:3:70", + "nodeType": "YulIdentifier", + "src": "7684:3:70" + }, + "nativeSrc": "7684:32:70", + "nodeType": "YulFunctionCall", + "src": "7684:32:70" + }, + "nativeSrc": "7681:52:70", + "nodeType": "YulIf", + "src": "7681:52:70" + }, + { + "nativeSrc": "7742:37:70", + "nodeType": "YulVariableDeclaration", + "src": "7742:37:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7769:9:70", + "nodeType": "YulIdentifier", + "src": "7769:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "7756:12:70", + "nodeType": "YulIdentifier", + "src": "7756:12:70" + }, + "nativeSrc": "7756:23:70", + "nodeType": "YulFunctionCall", + "src": "7756:23:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "7746:6:70", + "nodeType": "YulTypedName", + "src": "7746:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "7822:16:70", + "nodeType": "YulBlock", + "src": "7822:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7831:1:70", + "nodeType": "YulLiteral", + "src": "7831:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "7834:1:70", + "nodeType": "YulLiteral", + "src": "7834:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "7824:6:70", + "nodeType": "YulIdentifier", + "src": "7824:6:70" + }, + "nativeSrc": "7824:12:70", + "nodeType": "YulFunctionCall", + "src": "7824:12:70" + }, + "nativeSrc": "7824:12:70", + "nodeType": "YulExpressionStatement", + "src": "7824:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "7794:6:70", + "nodeType": "YulIdentifier", + "src": "7794:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7810:2:70", + "nodeType": "YulLiteral", + "src": "7810:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "7814:1:70", + "nodeType": "YulLiteral", + "src": "7814:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "7806:3:70", + "nodeType": "YulIdentifier", + "src": "7806:3:70" + }, + "nativeSrc": "7806:10:70", + "nodeType": "YulFunctionCall", + "src": "7806:10:70" + }, + { + "kind": "number", + "nativeSrc": "7818:1:70", + "nodeType": "YulLiteral", + "src": "7818:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "7802:3:70", + "nodeType": "YulIdentifier", + "src": "7802:3:70" + }, + "nativeSrc": "7802:18:70", + "nodeType": "YulFunctionCall", + "src": "7802:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "7791:2:70", + "nodeType": "YulIdentifier", + "src": "7791:2:70" + }, + "nativeSrc": "7791:30:70", + "nodeType": "YulFunctionCall", + "src": "7791:30:70" + }, + "nativeSrc": "7788:50:70", + "nodeType": "YulIf", + "src": "7788:50:70" + }, + { + "nativeSrc": "7847:84:70", + "nodeType": "YulVariableDeclaration", + "src": "7847:84:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7903:9:70", + "nodeType": "YulIdentifier", + "src": "7903:9:70" + }, + { + "name": "offset", + "nativeSrc": "7914:6:70", + "nodeType": "YulIdentifier", + "src": "7914:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7899:3:70", + "nodeType": "YulIdentifier", + "src": "7899:3:70" + }, + "nativeSrc": "7899:22:70", + "nodeType": "YulFunctionCall", + "src": "7899:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "7923:7:70", + "nodeType": "YulIdentifier", + "src": "7923:7:70" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nativeSrc": "7873:25:70", + "nodeType": "YulIdentifier", + "src": "7873:25:70" + }, + "nativeSrc": "7873:58:70", + "nodeType": "YulFunctionCall", + "src": "7873:58:70" + }, + "variables": [ + { + "name": "value0_1", + "nativeSrc": "7851:8:70", + "nodeType": "YulTypedName", + "src": "7851:8:70", + "type": "" + }, + { + "name": "value1_1", + "nativeSrc": "7861:8:70", + "nodeType": "YulTypedName", + "src": "7861:8:70", + "type": "" + } + ] + }, + { + "nativeSrc": "7940:18:70", + "nodeType": "YulAssignment", + "src": "7940:18:70", + "value": { + "name": "value0_1", + "nativeSrc": "7950:8:70", + "nodeType": "YulIdentifier", + "src": "7950:8:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "7940:6:70", + "nodeType": "YulIdentifier", + "src": "7940:6:70" + } + ] + }, + { + "nativeSrc": "7967:18:70", + "nodeType": "YulAssignment", + "src": "7967:18:70", + "value": { + "name": "value1_1", + "nativeSrc": "7977:8:70", + "nodeType": "YulIdentifier", + "src": "7977:8:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "7967:6:70", + "nodeType": "YulIdentifier", + "src": "7967:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_calldata_ptr", + "nativeSrc": "7582:409:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "7629:9:70", + "nodeType": "YulTypedName", + "src": "7629:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "7640:7:70", + "nodeType": "YulTypedName", + "src": "7640:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "7652:6:70", + "nodeType": "YulTypedName", + "src": "7652:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "7660:6:70", + "nodeType": "YulTypedName", + "src": "7660:6:70", + "type": "" + } + ], + "src": "7582:409:70" + }, + { + "body": { + "nativeSrc": "8121:587:70", + "nodeType": "YulBlock", + "src": "8121:587:70", + "statements": [ + { + "body": { + "nativeSrc": "8167:16:70", + "nodeType": "YulBlock", + "src": "8167:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8176:1:70", + "nodeType": "YulLiteral", + "src": "8176:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "8179:1:70", + "nodeType": "YulLiteral", + "src": "8179:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "8169:6:70", + "nodeType": "YulIdentifier", + "src": "8169:6:70" + }, + "nativeSrc": "8169:12:70", + "nodeType": "YulFunctionCall", + "src": "8169:12:70" + }, + "nativeSrc": "8169:12:70", + "nodeType": "YulExpressionStatement", + "src": "8169:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "8142:7:70", + "nodeType": "YulIdentifier", + "src": "8142:7:70" + }, + { + "name": "headStart", + "nativeSrc": "8151:9:70", + "nodeType": "YulIdentifier", + "src": "8151:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "8138:3:70", + "nodeType": "YulIdentifier", + "src": "8138:3:70" + }, + "nativeSrc": "8138:23:70", + "nodeType": "YulFunctionCall", + "src": "8138:23:70" + }, + { + "kind": "number", + "nativeSrc": "8163:2:70", + "nodeType": "YulLiteral", + "src": "8163:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "8134:3:70", + "nodeType": "YulIdentifier", + "src": "8134:3:70" + }, + "nativeSrc": "8134:32:70", + "nodeType": "YulFunctionCall", + "src": "8134:32:70" + }, + "nativeSrc": "8131:52:70", + "nodeType": "YulIf", + "src": "8131:52:70" + }, + { + "nativeSrc": "8192:37:70", + "nodeType": "YulVariableDeclaration", + "src": "8192:37:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8219:9:70", + "nodeType": "YulIdentifier", + "src": "8219:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "8206:12:70", + "nodeType": "YulIdentifier", + "src": "8206:12:70" + }, + "nativeSrc": "8206:23:70", + "nodeType": "YulFunctionCall", + "src": "8206:23:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "8196:6:70", + "nodeType": "YulTypedName", + "src": "8196:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "8272:16:70", + "nodeType": "YulBlock", + "src": "8272:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8281:1:70", + "nodeType": "YulLiteral", + "src": "8281:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "8284:1:70", + "nodeType": "YulLiteral", + "src": "8284:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "8274:6:70", + "nodeType": "YulIdentifier", + "src": "8274:6:70" + }, + "nativeSrc": "8274:12:70", + "nodeType": "YulFunctionCall", + "src": "8274:12:70" + }, + "nativeSrc": "8274:12:70", + "nodeType": "YulExpressionStatement", + "src": "8274:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "8244:6:70", + "nodeType": "YulIdentifier", + "src": "8244:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8260:2:70", + "nodeType": "YulLiteral", + "src": "8260:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "8264:1:70", + "nodeType": "YulLiteral", + "src": "8264:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "8256:3:70", + "nodeType": "YulIdentifier", + "src": "8256:3:70" + }, + "nativeSrc": "8256:10:70", + "nodeType": "YulFunctionCall", + "src": "8256:10:70" + }, + { + "kind": "number", + "nativeSrc": "8268:1:70", + "nodeType": "YulLiteral", + "src": "8268:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "8252:3:70", + "nodeType": "YulIdentifier", + "src": "8252:3:70" + }, + "nativeSrc": "8252:18:70", + "nodeType": "YulFunctionCall", + "src": "8252:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "8241:2:70", + "nodeType": "YulIdentifier", + "src": "8241:2:70" + }, + "nativeSrc": "8241:30:70", + "nodeType": "YulFunctionCall", + "src": "8241:30:70" + }, + "nativeSrc": "8238:50:70", + "nodeType": "YulIf", + "src": "8238:50:70" + }, + { + "nativeSrc": "8297:84:70", + "nodeType": "YulVariableDeclaration", + "src": "8297:84:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8353:9:70", + "nodeType": "YulIdentifier", + "src": "8353:9:70" + }, + { + "name": "offset", + "nativeSrc": "8364:6:70", + "nodeType": "YulIdentifier", + "src": "8364:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8349:3:70", + "nodeType": "YulIdentifier", + "src": "8349:3:70" + }, + "nativeSrc": "8349:22:70", + "nodeType": "YulFunctionCall", + "src": "8349:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "8373:7:70", + "nodeType": "YulIdentifier", + "src": "8373:7:70" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nativeSrc": "8323:25:70", + "nodeType": "YulIdentifier", + "src": "8323:25:70" + }, + "nativeSrc": "8323:58:70", + "nodeType": "YulFunctionCall", + "src": "8323:58:70" + }, + "variables": [ + { + "name": "value0_1", + "nativeSrc": "8301:8:70", + "nodeType": "YulTypedName", + "src": "8301:8:70", + "type": "" + }, + { + "name": "value1_1", + "nativeSrc": "8311:8:70", + "nodeType": "YulTypedName", + "src": "8311:8:70", + "type": "" + } + ] + }, + { + "nativeSrc": "8390:18:70", + "nodeType": "YulAssignment", + "src": "8390:18:70", + "value": { + "name": "value0_1", + "nativeSrc": "8400:8:70", + "nodeType": "YulIdentifier", + "src": "8400:8:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "8390:6:70", + "nodeType": "YulIdentifier", + "src": "8390:6:70" + } + ] + }, + { + "nativeSrc": "8417:18:70", + "nodeType": "YulAssignment", + "src": "8417:18:70", + "value": { + "name": "value1_1", + "nativeSrc": "8427:8:70", + "nodeType": "YulIdentifier", + "src": "8427:8:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "8417:6:70", + "nodeType": "YulIdentifier", + "src": "8417:6:70" + } + ] + }, + { + "nativeSrc": "8444:48:70", + "nodeType": "YulVariableDeclaration", + "src": "8444:48:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8477:9:70", + "nodeType": "YulIdentifier", + "src": "8477:9:70" + }, + { + "kind": "number", + "nativeSrc": "8488:2:70", + "nodeType": "YulLiteral", + "src": "8488:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8473:3:70", + "nodeType": "YulIdentifier", + "src": "8473:3:70" + }, + "nativeSrc": "8473:18:70", + "nodeType": "YulFunctionCall", + "src": "8473:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "8460:12:70", + "nodeType": "YulIdentifier", + "src": "8460:12:70" + }, + "nativeSrc": "8460:32:70", + "nodeType": "YulFunctionCall", + "src": "8460:32:70" + }, + "variables": [ + { + "name": "offset_1", + "nativeSrc": "8448:8:70", + "nodeType": "YulTypedName", + "src": "8448:8:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "8537:16:70", + "nodeType": "YulBlock", + "src": "8537:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8546:1:70", + "nodeType": "YulLiteral", + "src": "8546:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "8549:1:70", + "nodeType": "YulLiteral", + "src": "8549:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "8539:6:70", + "nodeType": "YulIdentifier", + "src": "8539:6:70" + }, + "nativeSrc": "8539:12:70", + "nodeType": "YulFunctionCall", + "src": "8539:12:70" + }, + "nativeSrc": "8539:12:70", + "nodeType": "YulExpressionStatement", + "src": "8539:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nativeSrc": "8507:8:70", + "nodeType": "YulIdentifier", + "src": "8507:8:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8525:2:70", + "nodeType": "YulLiteral", + "src": "8525:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "8529:1:70", + "nodeType": "YulLiteral", + "src": "8529:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "8521:3:70", + "nodeType": "YulIdentifier", + "src": "8521:3:70" + }, + "nativeSrc": "8521:10:70", + "nodeType": "YulFunctionCall", + "src": "8521:10:70" + }, + { + "kind": "number", + "nativeSrc": "8533:1:70", + "nodeType": "YulLiteral", + "src": "8533:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "8517:3:70", + "nodeType": "YulIdentifier", + "src": "8517:3:70" + }, + "nativeSrc": "8517:18:70", + "nodeType": "YulFunctionCall", + "src": "8517:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "8504:2:70", + "nodeType": "YulIdentifier", + "src": "8504:2:70" + }, + "nativeSrc": "8504:32:70", + "nodeType": "YulFunctionCall", + "src": "8504:32:70" + }, + "nativeSrc": "8501:52:70", + "nodeType": "YulIf", + "src": "8501:52:70" + }, + { + "nativeSrc": "8562:86:70", + "nodeType": "YulVariableDeclaration", + "src": "8562:86:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8618:9:70", + "nodeType": "YulIdentifier", + "src": "8618:9:70" + }, + { + "name": "offset_1", + "nativeSrc": "8629:8:70", + "nodeType": "YulIdentifier", + "src": "8629:8:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8614:3:70", + "nodeType": "YulIdentifier", + "src": "8614:3:70" + }, + "nativeSrc": "8614:24:70", + "nodeType": "YulFunctionCall", + "src": "8614:24:70" + }, + { + "name": "dataEnd", + "nativeSrc": "8640:7:70", + "nodeType": "YulIdentifier", + "src": "8640:7:70" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nativeSrc": "8588:25:70", + "nodeType": "YulIdentifier", + "src": "8588:25:70" + }, + "nativeSrc": "8588:60:70", + "nodeType": "YulFunctionCall", + "src": "8588:60:70" + }, + "variables": [ + { + "name": "value2_1", + "nativeSrc": "8566:8:70", + "nodeType": "YulTypedName", + "src": "8566:8:70", + "type": "" + }, + { + "name": "value3_1", + "nativeSrc": "8576:8:70", + "nodeType": "YulTypedName", + "src": "8576:8:70", + "type": "" + } + ] + }, + { + "nativeSrc": "8657:18:70", + "nodeType": "YulAssignment", + "src": "8657:18:70", + "value": { + "name": "value2_1", + "nativeSrc": "8667:8:70", + "nodeType": "YulIdentifier", + "src": "8667:8:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "8657:6:70", + "nodeType": "YulIdentifier", + "src": "8657:6:70" + } + ] + }, + { + "nativeSrc": "8684:18:70", + "nodeType": "YulAssignment", + "src": "8684:18:70", + "value": { + "name": "value3_1", + "nativeSrc": "8694:8:70", + "nodeType": "YulIdentifier", + "src": "8694:8:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "8684:6:70", + "nodeType": "YulIdentifier", + "src": "8684:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr", + "nativeSrc": "7996:712:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "8063:9:70", + "nodeType": "YulTypedName", + "src": "8063:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "8074:7:70", + "nodeType": "YulTypedName", + "src": "8074:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "8086:6:70", + "nodeType": "YulTypedName", + "src": "8086:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "8094:6:70", + "nodeType": "YulTypedName", + "src": "8094:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "8102:6:70", + "nodeType": "YulTypedName", + "src": "8102:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "8110:6:70", + "nodeType": "YulTypedName", + "src": "8110:6:70", + "type": "" + } + ], + "src": "7996:712:70" + }, + { + "body": { + "nativeSrc": "8842:119:70", + "nodeType": "YulBlock", + "src": "8842:119:70", + "statements": [ + { + "nativeSrc": "8852:26:70", + "nodeType": "YulAssignment", + "src": "8852:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8864:9:70", + "nodeType": "YulIdentifier", + "src": "8864:9:70" + }, + { + "kind": "number", + "nativeSrc": "8875:2:70", + "nodeType": "YulLiteral", + "src": "8875:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8860:3:70", + "nodeType": "YulIdentifier", + "src": "8860:3:70" + }, + "nativeSrc": "8860:18:70", + "nodeType": "YulFunctionCall", + "src": "8860:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "8852:4:70", + "nodeType": "YulIdentifier", + "src": "8852:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8894:9:70", + "nodeType": "YulIdentifier", + "src": "8894:9:70" + }, + { + "name": "value0", + "nativeSrc": "8905:6:70", + "nodeType": "YulIdentifier", + "src": "8905:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "8887:6:70", + "nodeType": "YulIdentifier", + "src": "8887:6:70" + }, + "nativeSrc": "8887:25:70", + "nodeType": "YulFunctionCall", + "src": "8887:25:70" + }, + "nativeSrc": "8887:25:70", + "nodeType": "YulExpressionStatement", + "src": "8887:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8932:9:70", + "nodeType": "YulIdentifier", + "src": "8932:9:70" + }, + { + "kind": "number", + "nativeSrc": "8943:2:70", + "nodeType": "YulLiteral", + "src": "8943:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8928:3:70", + "nodeType": "YulIdentifier", + "src": "8928:3:70" + }, + "nativeSrc": "8928:18:70", + "nodeType": "YulFunctionCall", + "src": "8928:18:70" + }, + { + "name": "value1", + "nativeSrc": "8948:6:70", + "nodeType": "YulIdentifier", + "src": "8948:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "8921:6:70", + "nodeType": "YulIdentifier", + "src": "8921:6:70" + }, + "nativeSrc": "8921:34:70", + "nodeType": "YulFunctionCall", + "src": "8921:34:70" + }, + "nativeSrc": "8921:34:70", + "nodeType": "YulExpressionStatement", + "src": "8921:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed", + "nativeSrc": "8713:248:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "8803:9:70", + "nodeType": "YulTypedName", + "src": "8803:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "8814:6:70", + "nodeType": "YulTypedName", + "src": "8814:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "8822:6:70", + "nodeType": "YulTypedName", + "src": "8822:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "8833:4:70", + "nodeType": "YulTypedName", + "src": "8833:4:70", + "type": "" + } + ], + "src": "8713:248:70" + }, + { + "body": { + "nativeSrc": "9007:303:70", + "nodeType": "YulBlock", + "src": "9007:303:70", + "statements": [ + { + "nativeSrc": "9017:19:70", + "nodeType": "YulAssignment", + "src": "9017:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9033:2:70", + "nodeType": "YulLiteral", + "src": "9033:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "9027:5:70", + "nodeType": "YulIdentifier", + "src": "9027:5:70" + }, + "nativeSrc": "9027:9:70", + "nodeType": "YulFunctionCall", + "src": "9027:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "9017:6:70", + "nodeType": "YulIdentifier", + "src": "9017:6:70" + } + ] + }, + { + "nativeSrc": "9045:34:70", + "nodeType": "YulVariableDeclaration", + "src": "9045:34:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "9067:6:70", + "nodeType": "YulIdentifier", + "src": "9067:6:70" + }, + { + "kind": "number", + "nativeSrc": "9075:3:70", + "nodeType": "YulLiteral", + "src": "9075:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9063:3:70", + "nodeType": "YulIdentifier", + "src": "9063:3:70" + }, + "nativeSrc": "9063:16:70", + "nodeType": "YulFunctionCall", + "src": "9063:16:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "9049:10:70", + "nodeType": "YulTypedName", + "src": "9049:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "9162:111:70", + "nodeType": "YulBlock", + "src": "9162:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9183:1:70", + "nodeType": "YulLiteral", + "src": "9183:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9190:3:70", + "nodeType": "YulLiteral", + "src": "9190:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "9195:10:70", + "nodeType": "YulLiteral", + "src": "9195:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9186:3:70", + "nodeType": "YulIdentifier", + "src": "9186:3:70" + }, + "nativeSrc": "9186:20:70", + "nodeType": "YulFunctionCall", + "src": "9186:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9176:6:70", + "nodeType": "YulIdentifier", + "src": "9176:6:70" + }, + "nativeSrc": "9176:31:70", + "nodeType": "YulFunctionCall", + "src": "9176:31:70" + }, + "nativeSrc": "9176:31:70", + "nodeType": "YulExpressionStatement", + "src": "9176:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9227:1:70", + "nodeType": "YulLiteral", + "src": "9227:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "9230:4:70", + "nodeType": "YulLiteral", + "src": "9230:4:70", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9220:6:70", + "nodeType": "YulIdentifier", + "src": "9220:6:70" + }, + "nativeSrc": "9220:15:70", + "nodeType": "YulFunctionCall", + "src": "9220:15:70" + }, + "nativeSrc": "9220:15:70", + "nodeType": "YulExpressionStatement", + "src": "9220:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9255:1:70", + "nodeType": "YulLiteral", + "src": "9255:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "9258:4:70", + "nodeType": "YulLiteral", + "src": "9258:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "9248:6:70", + "nodeType": "YulIdentifier", + "src": "9248:6:70" + }, + "nativeSrc": "9248:15:70", + "nodeType": "YulFunctionCall", + "src": "9248:15:70" + }, + "nativeSrc": "9248:15:70", + "nodeType": "YulExpressionStatement", + "src": "9248:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "9097:10:70", + "nodeType": "YulIdentifier", + "src": "9097:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9117:2:70", + "nodeType": "YulLiteral", + "src": "9117:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "9121:1:70", + "nodeType": "YulLiteral", + "src": "9121:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9113:3:70", + "nodeType": "YulIdentifier", + "src": "9113:3:70" + }, + "nativeSrc": "9113:10:70", + "nodeType": "YulFunctionCall", + "src": "9113:10:70" + }, + { + "kind": "number", + "nativeSrc": "9125:1:70", + "nodeType": "YulLiteral", + "src": "9125:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9109:3:70", + "nodeType": "YulIdentifier", + "src": "9109:3:70" + }, + "nativeSrc": "9109:18:70", + "nodeType": "YulFunctionCall", + "src": "9109:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "9094:2:70", + "nodeType": "YulIdentifier", + "src": "9094:2:70" + }, + "nativeSrc": "9094:34:70", + "nodeType": "YulFunctionCall", + "src": "9094:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "9133:10:70", + "nodeType": "YulIdentifier", + "src": "9133:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "9145:6:70", + "nodeType": "YulIdentifier", + "src": "9145:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "9130:2:70", + "nodeType": "YulIdentifier", + "src": "9130:2:70" + }, + "nativeSrc": "9130:22:70", + "nodeType": "YulFunctionCall", + "src": "9130:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "9091:2:70", + "nodeType": "YulIdentifier", + "src": "9091:2:70" + }, + "nativeSrc": "9091:62:70", + "nodeType": "YulFunctionCall", + "src": "9091:62:70" + }, + "nativeSrc": "9088:185:70", + "nodeType": "YulIf", + "src": "9088:185:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9289:2:70", + "nodeType": "YulLiteral", + "src": "9289:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "9293:10:70", + "nodeType": "YulIdentifier", + "src": "9293:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9282:6:70", + "nodeType": "YulIdentifier", + "src": "9282:6:70" + }, + "nativeSrc": "9282:22:70", + "nodeType": "YulFunctionCall", + "src": "9282:22:70" + }, + "nativeSrc": "9282:22:70", + "nodeType": "YulExpressionStatement", + "src": "9282:22:70" + } + ] + }, + "name": "allocate_memory", + "nativeSrc": "8966:344:70", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nativeSrc": "8996:6:70", + "nodeType": "YulTypedName", + "src": "8996:6:70", + "type": "" + } + ], + "src": "8966:344:70" + }, + { + "body": { + "nativeSrc": "9361:306:70", + "nodeType": "YulBlock", + "src": "9361:306:70", + "statements": [ + { + "nativeSrc": "9371:19:70", + "nodeType": "YulAssignment", + "src": "9371:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9387:2:70", + "nodeType": "YulLiteral", + "src": "9387:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "9381:5:70", + "nodeType": "YulIdentifier", + "src": "9381:5:70" + }, + "nativeSrc": "9381:9:70", + "nodeType": "YulFunctionCall", + "src": "9381:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "9371:6:70", + "nodeType": "YulIdentifier", + "src": "9371:6:70" + } + ] + }, + { + "nativeSrc": "9399:37:70", + "nodeType": "YulVariableDeclaration", + "src": "9399:37:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "9421:6:70", + "nodeType": "YulIdentifier", + "src": "9421:6:70" + }, + { + "kind": "number", + "nativeSrc": "9429:6:70", + "nodeType": "YulLiteral", + "src": "9429:6:70", + "type": "", + "value": "0x0120" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9417:3:70", + "nodeType": "YulIdentifier", + "src": "9417:3:70" + }, + "nativeSrc": "9417:19:70", + "nodeType": "YulFunctionCall", + "src": "9417:19:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "9403:10:70", + "nodeType": "YulTypedName", + "src": "9403:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "9519:111:70", + "nodeType": "YulBlock", + "src": "9519:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9540:1:70", + "nodeType": "YulLiteral", + "src": "9540:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9547:3:70", + "nodeType": "YulLiteral", + "src": "9547:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "9552:10:70", + "nodeType": "YulLiteral", + "src": "9552:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9543:3:70", + "nodeType": "YulIdentifier", + "src": "9543:3:70" + }, + "nativeSrc": "9543:20:70", + "nodeType": "YulFunctionCall", + "src": "9543:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9533:6:70", + "nodeType": "YulIdentifier", + "src": "9533:6:70" + }, + "nativeSrc": "9533:31:70", + "nodeType": "YulFunctionCall", + "src": "9533:31:70" + }, + "nativeSrc": "9533:31:70", + "nodeType": "YulExpressionStatement", + "src": "9533:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9584:1:70", + "nodeType": "YulLiteral", + "src": "9584:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "9587:4:70", + "nodeType": "YulLiteral", + "src": "9587:4:70", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9577:6:70", + "nodeType": "YulIdentifier", + "src": "9577:6:70" + }, + "nativeSrc": "9577:15:70", + "nodeType": "YulFunctionCall", + "src": "9577:15:70" + }, + "nativeSrc": "9577:15:70", + "nodeType": "YulExpressionStatement", + "src": "9577:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9612:1:70", + "nodeType": "YulLiteral", + "src": "9612:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "9615:4:70", + "nodeType": "YulLiteral", + "src": "9615:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "9605:6:70", + "nodeType": "YulIdentifier", + "src": "9605:6:70" + }, + "nativeSrc": "9605:15:70", + "nodeType": "YulFunctionCall", + "src": "9605:15:70" + }, + "nativeSrc": "9605:15:70", + "nodeType": "YulExpressionStatement", + "src": "9605:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "9454:10:70", + "nodeType": "YulIdentifier", + "src": "9454:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9474:2:70", + "nodeType": "YulLiteral", + "src": "9474:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "9478:1:70", + "nodeType": "YulLiteral", + "src": "9478:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9470:3:70", + "nodeType": "YulIdentifier", + "src": "9470:3:70" + }, + "nativeSrc": "9470:10:70", + "nodeType": "YulFunctionCall", + "src": "9470:10:70" + }, + { + "kind": "number", + "nativeSrc": "9482:1:70", + "nodeType": "YulLiteral", + "src": "9482:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9466:3:70", + "nodeType": "YulIdentifier", + "src": "9466:3:70" + }, + "nativeSrc": "9466:18:70", + "nodeType": "YulFunctionCall", + "src": "9466:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "9451:2:70", + "nodeType": "YulIdentifier", + "src": "9451:2:70" + }, + "nativeSrc": "9451:34:70", + "nodeType": "YulFunctionCall", + "src": "9451:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "9490:10:70", + "nodeType": "YulIdentifier", + "src": "9490:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "9502:6:70", + "nodeType": "YulIdentifier", + "src": "9502:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "9487:2:70", + "nodeType": "YulIdentifier", + "src": "9487:2:70" + }, + "nativeSrc": "9487:22:70", + "nodeType": "YulFunctionCall", + "src": "9487:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "9448:2:70", + "nodeType": "YulIdentifier", + "src": "9448:2:70" + }, + "nativeSrc": "9448:62:70", + "nodeType": "YulFunctionCall", + "src": "9448:62:70" + }, + "nativeSrc": "9445:185:70", + "nodeType": "YulIf", + "src": "9445:185:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9646:2:70", + "nodeType": "YulLiteral", + "src": "9646:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "9650:10:70", + "nodeType": "YulIdentifier", + "src": "9650:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9639:6:70", + "nodeType": "YulIdentifier", + "src": "9639:6:70" + }, + "nativeSrc": "9639:22:70", + "nodeType": "YulFunctionCall", + "src": "9639:22:70" + }, + "nativeSrc": "9639:22:70", + "nodeType": "YulExpressionStatement", + "src": "9639:22:70" + } + ] + }, + "name": "allocate_memory_2390", + "nativeSrc": "9315:352:70", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nativeSrc": "9350:6:70", + "nodeType": "YulTypedName", + "src": "9350:6:70", + "type": "" + } + ], + "src": "9315:352:70" + }, + { + "body": { + "nativeSrc": "9718:303:70", + "nodeType": "YulBlock", + "src": "9718:303:70", + "statements": [ + { + "nativeSrc": "9728:19:70", + "nodeType": "YulAssignment", + "src": "9728:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9744:2:70", + "nodeType": "YulLiteral", + "src": "9744:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "9738:5:70", + "nodeType": "YulIdentifier", + "src": "9738:5:70" + }, + "nativeSrc": "9738:9:70", + "nodeType": "YulFunctionCall", + "src": "9738:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "9728:6:70", + "nodeType": "YulIdentifier", + "src": "9728:6:70" + } + ] + }, + { + "nativeSrc": "9756:34:70", + "nodeType": "YulVariableDeclaration", + "src": "9756:34:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "9778:6:70", + "nodeType": "YulIdentifier", + "src": "9778:6:70" + }, + { + "kind": "number", + "nativeSrc": "9786:3:70", + "nodeType": "YulLiteral", + "src": "9786:3:70", + "type": "", + "value": "320" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9774:3:70", + "nodeType": "YulIdentifier", + "src": "9774:3:70" + }, + "nativeSrc": "9774:16:70", + "nodeType": "YulFunctionCall", + "src": "9774:16:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "9760:10:70", + "nodeType": "YulTypedName", + "src": "9760:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "9873:111:70", + "nodeType": "YulBlock", + "src": "9873:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9894:1:70", + "nodeType": "YulLiteral", + "src": "9894:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9901:3:70", + "nodeType": "YulLiteral", + "src": "9901:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "9906:10:70", + "nodeType": "YulLiteral", + "src": "9906:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9897:3:70", + "nodeType": "YulIdentifier", + "src": "9897:3:70" + }, + "nativeSrc": "9897:20:70", + "nodeType": "YulFunctionCall", + "src": "9897:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9887:6:70", + "nodeType": "YulIdentifier", + "src": "9887:6:70" + }, + "nativeSrc": "9887:31:70", + "nodeType": "YulFunctionCall", + "src": "9887:31:70" + }, + "nativeSrc": "9887:31:70", + "nodeType": "YulExpressionStatement", + "src": "9887:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9938:1:70", + "nodeType": "YulLiteral", + "src": "9938:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "9941:4:70", + "nodeType": "YulLiteral", + "src": "9941:4:70", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9931:6:70", + "nodeType": "YulIdentifier", + "src": "9931:6:70" + }, + "nativeSrc": "9931:15:70", + "nodeType": "YulFunctionCall", + "src": "9931:15:70" + }, + "nativeSrc": "9931:15:70", + "nodeType": "YulExpressionStatement", + "src": "9931:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9966:1:70", + "nodeType": "YulLiteral", + "src": "9966:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "9969:4:70", + "nodeType": "YulLiteral", + "src": "9969:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "9959:6:70", + "nodeType": "YulIdentifier", + "src": "9959:6:70" + }, + "nativeSrc": "9959:15:70", + "nodeType": "YulFunctionCall", + "src": "9959:15:70" + }, + "nativeSrc": "9959:15:70", + "nodeType": "YulExpressionStatement", + "src": "9959:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "9808:10:70", + "nodeType": "YulIdentifier", + "src": "9808:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9828:2:70", + "nodeType": "YulLiteral", + "src": "9828:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "9832:1:70", + "nodeType": "YulLiteral", + "src": "9832:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9824:3:70", + "nodeType": "YulIdentifier", + "src": "9824:3:70" + }, + "nativeSrc": "9824:10:70", + "nodeType": "YulFunctionCall", + "src": "9824:10:70" + }, + { + "kind": "number", + "nativeSrc": "9836:1:70", + "nodeType": "YulLiteral", + "src": "9836:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9820:3:70", + "nodeType": "YulIdentifier", + "src": "9820:3:70" + }, + "nativeSrc": "9820:18:70", + "nodeType": "YulFunctionCall", + "src": "9820:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "9805:2:70", + "nodeType": "YulIdentifier", + "src": "9805:2:70" + }, + "nativeSrc": "9805:34:70", + "nodeType": "YulFunctionCall", + "src": "9805:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "9844:10:70", + "nodeType": "YulIdentifier", + "src": "9844:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "9856:6:70", + "nodeType": "YulIdentifier", + "src": "9856:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "9841:2:70", + "nodeType": "YulIdentifier", + "src": "9841:2:70" + }, + "nativeSrc": "9841:22:70", + "nodeType": "YulFunctionCall", + "src": "9841:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "9802:2:70", + "nodeType": "YulIdentifier", + "src": "9802:2:70" + }, + "nativeSrc": "9802:62:70", + "nodeType": "YulFunctionCall", + "src": "9802:62:70" + }, + "nativeSrc": "9799:185:70", + "nodeType": "YulIf", + "src": "9799:185:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10000:2:70", + "nodeType": "YulLiteral", + "src": "10000:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "10004:10:70", + "nodeType": "YulIdentifier", + "src": "10004:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9993:6:70", + "nodeType": "YulIdentifier", + "src": "9993:6:70" + }, + "nativeSrc": "9993:22:70", + "nodeType": "YulFunctionCall", + "src": "9993:22:70" + }, + "nativeSrc": "9993:22:70", + "nodeType": "YulExpressionStatement", + "src": "9993:22:70" + } + ] + }, + "name": "allocate_memory_2392", + "nativeSrc": "9672:349:70", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nativeSrc": "9707:6:70", + "nodeType": "YulTypedName", + "src": "9707:6:70", + "type": "" + } + ], + "src": "9672:349:70" + }, + { + "body": { + "nativeSrc": "10120:911:70", + "nodeType": "YulBlock", + "src": "10120:911:70", + "statements": [ + { + "nativeSrc": "10130:43:70", + "nodeType": "YulVariableDeclaration", + "src": "10130:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "10148:7:70", + "nodeType": "YulIdentifier", + "src": "10148:7:70" + }, + { + "name": "headStart", + "nativeSrc": "10157:9:70", + "nodeType": "YulIdentifier", + "src": "10157:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "10144:3:70", + "nodeType": "YulIdentifier", + "src": "10144:3:70" + }, + "nativeSrc": "10144:23:70", + "nodeType": "YulFunctionCall", + "src": "10144:23:70" + }, + { + "kind": "number", + "nativeSrc": "10169:3:70", + "nodeType": "YulLiteral", + "src": "10169:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "10140:3:70", + "nodeType": "YulIdentifier", + "src": "10140:3:70" + }, + "nativeSrc": "10140:33:70", + "nodeType": "YulFunctionCall", + "src": "10140:33:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "10134:2:70", + "nodeType": "YulTypedName", + "src": "10134:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "10188:16:70", + "nodeType": "YulBlock", + "src": "10188:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10197:1:70", + "nodeType": "YulLiteral", + "src": "10197:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "10200:1:70", + "nodeType": "YulLiteral", + "src": "10200:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "10190:6:70", + "nodeType": "YulIdentifier", + "src": "10190:6:70" + }, + "nativeSrc": "10190:12:70", + "nodeType": "YulFunctionCall", + "src": "10190:12:70" + }, + "nativeSrc": "10190:12:70", + "nodeType": "YulExpressionStatement", + "src": "10190:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "10185:2:70", + "nodeType": "YulIdentifier", + "src": "10185:2:70" + }, + "nativeSrc": "10182:22:70", + "nodeType": "YulIf", + "src": "10182:22:70" + }, + { + "nativeSrc": "10213:7:70", + "nodeType": "YulAssignment", + "src": "10213:7:70", + "value": { + "kind": "number", + "nativeSrc": "10219:1:70", + "nodeType": "YulLiteral", + "src": "10219:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "10213:2:70", + "nodeType": "YulIdentifier", + "src": "10213:2:70" + } + ] + }, + { + "nativeSrc": "10229:30:70", + "nodeType": "YulVariableDeclaration", + "src": "10229:30:70", + "value": { + "arguments": [], + "functionName": { + "name": "allocate_memory", + "nativeSrc": "10242:15:70", + "nodeType": "YulIdentifier", + "src": "10242:15:70" + }, + "nativeSrc": "10242:17:70", + "nodeType": "YulFunctionCall", + "src": "10242:17:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "10233:5:70", + "nodeType": "YulTypedName", + "src": "10233:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10268:17:70", + "nodeType": "YulVariableDeclaration", + "src": "10268:17:70", + "value": { + "name": "_1", + "nativeSrc": "10283:2:70", + "nodeType": "YulIdentifier", + "src": "10283:2:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "10272:7:70", + "nodeType": "YulTypedName", + "src": "10272:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10294:34:70", + "nodeType": "YulAssignment", + "src": "10294:34:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10318:9:70", + "nodeType": "YulIdentifier", + "src": "10318:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10305:12:70", + "nodeType": "YulIdentifier", + "src": "10305:12:70" + }, + "nativeSrc": "10305:23:70", + "nodeType": "YulFunctionCall", + "src": "10305:23:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "10294:7:70", + "nodeType": "YulIdentifier", + "src": "10294:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "10344:5:70", + "nodeType": "YulIdentifier", + "src": "10344:5:70" + }, + { + "name": "value_1", + "nativeSrc": "10351:7:70", + "nodeType": "YulIdentifier", + "src": "10351:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10337:6:70", + "nodeType": "YulIdentifier", + "src": "10337:6:70" + }, + "nativeSrc": "10337:22:70", + "nodeType": "YulFunctionCall", + "src": "10337:22:70" + }, + "nativeSrc": "10337:22:70", + "nodeType": "YulExpressionStatement", + "src": "10337:22:70" + }, + { + "nativeSrc": "10368:17:70", + "nodeType": "YulVariableDeclaration", + "src": "10368:17:70", + "value": { + "name": "_1", + "nativeSrc": "10383:2:70", + "nodeType": "YulIdentifier", + "src": "10383:2:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "10372:7:70", + "nodeType": "YulTypedName", + "src": "10372:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10394:43:70", + "nodeType": "YulAssignment", + "src": "10394:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10422:9:70", + "nodeType": "YulIdentifier", + "src": "10422:9:70" + }, + { + "kind": "number", + "nativeSrc": "10433:2:70", + "nodeType": "YulLiteral", + "src": "10433:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10418:3:70", + "nodeType": "YulIdentifier", + "src": "10418:3:70" + }, + "nativeSrc": "10418:18:70", + "nodeType": "YulFunctionCall", + "src": "10418:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10405:12:70", + "nodeType": "YulIdentifier", + "src": "10405:12:70" + }, + "nativeSrc": "10405:32:70", + "nodeType": "YulFunctionCall", + "src": "10405:32:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "10394:7:70", + "nodeType": "YulIdentifier", + "src": "10394:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "10457:5:70", + "nodeType": "YulIdentifier", + "src": "10457:5:70" + }, + { + "kind": "number", + "nativeSrc": "10464:2:70", + "nodeType": "YulLiteral", + "src": "10464:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10453:3:70", + "nodeType": "YulIdentifier", + "src": "10453:3:70" + }, + "nativeSrc": "10453:14:70", + "nodeType": "YulFunctionCall", + "src": "10453:14:70" + }, + { + "name": "value_2", + "nativeSrc": "10469:7:70", + "nodeType": "YulIdentifier", + "src": "10469:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10446:6:70", + "nodeType": "YulIdentifier", + "src": "10446:6:70" + }, + "nativeSrc": "10446:31:70", + "nodeType": "YulFunctionCall", + "src": "10446:31:70" + }, + "nativeSrc": "10446:31:70", + "nodeType": "YulExpressionStatement", + "src": "10446:31:70" + }, + { + "nativeSrc": "10486:17:70", + "nodeType": "YulVariableDeclaration", + "src": "10486:17:70", + "value": { + "name": "_1", + "nativeSrc": "10501:2:70", + "nodeType": "YulIdentifier", + "src": "10501:2:70" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "10490:7:70", + "nodeType": "YulTypedName", + "src": "10490:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10512:43:70", + "nodeType": "YulAssignment", + "src": "10512:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10540:9:70", + "nodeType": "YulIdentifier", + "src": "10540:9:70" + }, + { + "kind": "number", + "nativeSrc": "10551:2:70", + "nodeType": "YulLiteral", + "src": "10551:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10536:3:70", + "nodeType": "YulIdentifier", + "src": "10536:3:70" + }, + "nativeSrc": "10536:18:70", + "nodeType": "YulFunctionCall", + "src": "10536:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10523:12:70", + "nodeType": "YulIdentifier", + "src": "10523:12:70" + }, + "nativeSrc": "10523:32:70", + "nodeType": "YulFunctionCall", + "src": "10523:32:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "10512:7:70", + "nodeType": "YulIdentifier", + "src": "10512:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "10575:5:70", + "nodeType": "YulIdentifier", + "src": "10575:5:70" + }, + { + "kind": "number", + "nativeSrc": "10582:2:70", + "nodeType": "YulLiteral", + "src": "10582:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10571:3:70", + "nodeType": "YulIdentifier", + "src": "10571:3:70" + }, + "nativeSrc": "10571:14:70", + "nodeType": "YulFunctionCall", + "src": "10571:14:70" + }, + { + "name": "value_3", + "nativeSrc": "10587:7:70", + "nodeType": "YulIdentifier", + "src": "10587:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10564:6:70", + "nodeType": "YulIdentifier", + "src": "10564:6:70" + }, + "nativeSrc": "10564:31:70", + "nodeType": "YulFunctionCall", + "src": "10564:31:70" + }, + "nativeSrc": "10564:31:70", + "nodeType": "YulExpressionStatement", + "src": "10564:31:70" + }, + { + "nativeSrc": "10604:17:70", + "nodeType": "YulVariableDeclaration", + "src": "10604:17:70", + "value": { + "name": "_1", + "nativeSrc": "10619:2:70", + "nodeType": "YulIdentifier", + "src": "10619:2:70" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "10608:7:70", + "nodeType": "YulTypedName", + "src": "10608:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10630:43:70", + "nodeType": "YulAssignment", + "src": "10630:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10658:9:70", + "nodeType": "YulIdentifier", + "src": "10658:9:70" + }, + { + "kind": "number", + "nativeSrc": "10669:2:70", + "nodeType": "YulLiteral", + "src": "10669:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10654:3:70", + "nodeType": "YulIdentifier", + "src": "10654:3:70" + }, + "nativeSrc": "10654:18:70", + "nodeType": "YulFunctionCall", + "src": "10654:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10641:12:70", + "nodeType": "YulIdentifier", + "src": "10641:12:70" + }, + "nativeSrc": "10641:32:70", + "nodeType": "YulFunctionCall", + "src": "10641:32:70" + }, + "variableNames": [ + { + "name": "value_4", + "nativeSrc": "10630:7:70", + "nodeType": "YulIdentifier", + "src": "10630:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "10693:5:70", + "nodeType": "YulIdentifier", + "src": "10693:5:70" + }, + { + "kind": "number", + "nativeSrc": "10700:2:70", + "nodeType": "YulLiteral", + "src": "10700:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10689:3:70", + "nodeType": "YulIdentifier", + "src": "10689:3:70" + }, + "nativeSrc": "10689:14:70", + "nodeType": "YulFunctionCall", + "src": "10689:14:70" + }, + { + "name": "value_4", + "nativeSrc": "10705:7:70", + "nodeType": "YulIdentifier", + "src": "10705:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10682:6:70", + "nodeType": "YulIdentifier", + "src": "10682:6:70" + }, + "nativeSrc": "10682:31:70", + "nodeType": "YulFunctionCall", + "src": "10682:31:70" + }, + "nativeSrc": "10682:31:70", + "nodeType": "YulExpressionStatement", + "src": "10682:31:70" + }, + { + "nativeSrc": "10722:17:70", + "nodeType": "YulVariableDeclaration", + "src": "10722:17:70", + "value": { + "name": "_1", + "nativeSrc": "10737:2:70", + "nodeType": "YulIdentifier", + "src": "10737:2:70" + }, + "variables": [ + { + "name": "value_5", + "nativeSrc": "10726:7:70", + "nodeType": "YulTypedName", + "src": "10726:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10748:44:70", + "nodeType": "YulAssignment", + "src": "10748:44:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10776:9:70", + "nodeType": "YulIdentifier", + "src": "10776:9:70" + }, + { + "kind": "number", + "nativeSrc": "10787:3:70", + "nodeType": "YulLiteral", + "src": "10787:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10772:3:70", + "nodeType": "YulIdentifier", + "src": "10772:3:70" + }, + "nativeSrc": "10772:19:70", + "nodeType": "YulFunctionCall", + "src": "10772:19:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10759:12:70", + "nodeType": "YulIdentifier", + "src": "10759:12:70" + }, + "nativeSrc": "10759:33:70", + "nodeType": "YulFunctionCall", + "src": "10759:33:70" + }, + "variableNames": [ + { + "name": "value_5", + "nativeSrc": "10748:7:70", + "nodeType": "YulIdentifier", + "src": "10748:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "10812:5:70", + "nodeType": "YulIdentifier", + "src": "10812:5:70" + }, + { + "kind": "number", + "nativeSrc": "10819:3:70", + "nodeType": "YulLiteral", + "src": "10819:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10808:3:70", + "nodeType": "YulIdentifier", + "src": "10808:3:70" + }, + "nativeSrc": "10808:15:70", + "nodeType": "YulFunctionCall", + "src": "10808:15:70" + }, + { + "name": "value_5", + "nativeSrc": "10825:7:70", + "nodeType": "YulIdentifier", + "src": "10825:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10801:6:70", + "nodeType": "YulIdentifier", + "src": "10801:6:70" + }, + "nativeSrc": "10801:32:70", + "nodeType": "YulFunctionCall", + "src": "10801:32:70" + }, + "nativeSrc": "10801:32:70", + "nodeType": "YulExpressionStatement", + "src": "10801:32:70" + }, + { + "nativeSrc": "10842:48:70", + "nodeType": "YulVariableDeclaration", + "src": "10842:48:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10874:9:70", + "nodeType": "YulIdentifier", + "src": "10874:9:70" + }, + { + "kind": "number", + "nativeSrc": "10885:3:70", + "nodeType": "YulLiteral", + "src": "10885:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10870:3:70", + "nodeType": "YulIdentifier", + "src": "10870:3:70" + }, + "nativeSrc": "10870:19:70", + "nodeType": "YulFunctionCall", + "src": "10870:19:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10857:12:70", + "nodeType": "YulIdentifier", + "src": "10857:12:70" + }, + "nativeSrc": "10857:33:70", + "nodeType": "YulFunctionCall", + "src": "10857:33:70" + }, + "variables": [ + { + "name": "value_6", + "nativeSrc": "10846:7:70", + "nodeType": "YulTypedName", + "src": "10846:7:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "10942:18:70", + "nodeType": "YulBlock", + "src": "10942:18:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "10951:2:70", + "nodeType": "YulIdentifier", + "src": "10951:2:70" + }, + { + "name": "_1", + "nativeSrc": "10955:2:70", + "nodeType": "YulIdentifier", + "src": "10955:2:70" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "10944:6:70", + "nodeType": "YulIdentifier", + "src": "10944:6:70" + }, + "nativeSrc": "10944:14:70", + "nodeType": "YulFunctionCall", + "src": "10944:14:70" + }, + "nativeSrc": "10944:14:70", + "nodeType": "YulExpressionStatement", + "src": "10944:14:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value_6", + "nativeSrc": "10912:7:70", + "nodeType": "YulIdentifier", + "src": "10912:7:70" + }, + { + "arguments": [ + { + "name": "value_6", + "nativeSrc": "10925:7:70", + "nodeType": "YulIdentifier", + "src": "10925:7:70" + }, + { + "kind": "number", + "nativeSrc": "10934:4:70", + "nodeType": "YulLiteral", + "src": "10934:4:70", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "10921:3:70", + "nodeType": "YulIdentifier", + "src": "10921:3:70" + }, + "nativeSrc": "10921:18:70", + "nodeType": "YulFunctionCall", + "src": "10921:18:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "10909:2:70", + "nodeType": "YulIdentifier", + "src": "10909:2:70" + }, + "nativeSrc": "10909:31:70", + "nodeType": "YulFunctionCall", + "src": "10909:31:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "10902:6:70", + "nodeType": "YulIdentifier", + "src": "10902:6:70" + }, + "nativeSrc": "10902:39:70", + "nodeType": "YulFunctionCall", + "src": "10902:39:70" + }, + "nativeSrc": "10899:61:70", + "nodeType": "YulIf", + "src": "10899:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "10980:5:70", + "nodeType": "YulIdentifier", + "src": "10980:5:70" + }, + { + "kind": "number", + "nativeSrc": "10987:3:70", + "nodeType": "YulLiteral", + "src": "10987:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10976:3:70", + "nodeType": "YulIdentifier", + "src": "10976:3:70" + }, + "nativeSrc": "10976:15:70", + "nodeType": "YulFunctionCall", + "src": "10976:15:70" + }, + { + "name": "value_6", + "nativeSrc": "10993:7:70", + "nodeType": "YulIdentifier", + "src": "10993:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10969:6:70", + "nodeType": "YulIdentifier", + "src": "10969:6:70" + }, + "nativeSrc": "10969:32:70", + "nodeType": "YulFunctionCall", + "src": "10969:32:70" + }, + "nativeSrc": "10969:32:70", + "nodeType": "YulExpressionStatement", + "src": "10969:32:70" + }, + { + "nativeSrc": "11010:15:70", + "nodeType": "YulAssignment", + "src": "11010:15:70", + "value": { + "name": "value", + "nativeSrc": "11020:5:70", + "nodeType": "YulIdentifier", + "src": "11020:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "11010:6:70", + "nodeType": "YulIdentifier", + "src": "11010:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_State_$16058_memory_ptr", + "nativeSrc": "10026:1005:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "10086:9:70", + "nodeType": "YulTypedName", + "src": "10086:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "10097:7:70", + "nodeType": "YulTypedName", + "src": "10097:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "10109:6:70", + "nodeType": "YulTypedName", + "src": "10109:6:70", + "type": "" + } + ], + "src": "10026:1005:70" + }, + { + "body": { + "nativeSrc": "11104:86:70", + "nodeType": "YulBlock", + "src": "11104:86:70", + "statements": [ + { + "body": { + "nativeSrc": "11144:16:70", + "nodeType": "YulBlock", + "src": "11144:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11153:1:70", + "nodeType": "YulLiteral", + "src": "11153:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "11156:1:70", + "nodeType": "YulLiteral", + "src": "11156:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "11146:6:70", + "nodeType": "YulIdentifier", + "src": "11146:6:70" + }, + "nativeSrc": "11146:12:70", + "nodeType": "YulFunctionCall", + "src": "11146:12:70" + }, + "nativeSrc": "11146:12:70", + "nodeType": "YulExpressionStatement", + "src": "11146:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "end", + "nativeSrc": "11125:3:70", + "nodeType": "YulIdentifier", + "src": "11125:3:70" + }, + { + "name": "offset", + "nativeSrc": "11130:6:70", + "nodeType": "YulIdentifier", + "src": "11130:6:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "11121:3:70", + "nodeType": "YulIdentifier", + "src": "11121:3:70" + }, + "nativeSrc": "11121:16:70", + "nodeType": "YulFunctionCall", + "src": "11121:16:70" + }, + { + "kind": "number", + "nativeSrc": "11139:3:70", + "nodeType": "YulLiteral", + "src": "11139:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "11117:3:70", + "nodeType": "YulIdentifier", + "src": "11117:3:70" + }, + "nativeSrc": "11117:26:70", + "nodeType": "YulFunctionCall", + "src": "11117:26:70" + }, + "nativeSrc": "11114:46:70", + "nodeType": "YulIf", + "src": "11114:46:70" + }, + { + "nativeSrc": "11169:15:70", + "nodeType": "YulAssignment", + "src": "11169:15:70", + "value": { + "name": "offset", + "nativeSrc": "11178:6:70", + "nodeType": "YulIdentifier", + "src": "11178:6:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "11169:5:70", + "nodeType": "YulIdentifier", + "src": "11169:5:70" + } + ] + } + ] + }, + "name": "abi_decode_struct_State_calldata", + "nativeSrc": "11036:154:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "11078:6:70", + "nodeType": "YulTypedName", + "src": "11078:6:70", + "type": "" + }, + { + "name": "end", + "nativeSrc": "11086:3:70", + "nodeType": "YulTypedName", + "src": "11086:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "11094:5:70", + "nodeType": "YulTypedName", + "src": "11094:5:70", + "type": "" + } + ], + "src": "11036:154:70" + }, + { + "body": { + "nativeSrc": "11334:221:70", + "nodeType": "YulBlock", + "src": "11334:221:70", + "statements": [ + { + "body": { + "nativeSrc": "11381:16:70", + "nodeType": "YulBlock", + "src": "11381:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11390:1:70", + "nodeType": "YulLiteral", + "src": "11390:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "11393:1:70", + "nodeType": "YulLiteral", + "src": "11393:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "11383:6:70", + "nodeType": "YulIdentifier", + "src": "11383:6:70" + }, + "nativeSrc": "11383:12:70", + "nodeType": "YulFunctionCall", + "src": "11383:12:70" + }, + "nativeSrc": "11383:12:70", + "nodeType": "YulExpressionStatement", + "src": "11383:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "11355:7:70", + "nodeType": "YulIdentifier", + "src": "11355:7:70" + }, + { + "name": "headStart", + "nativeSrc": "11364:9:70", + "nodeType": "YulIdentifier", + "src": "11364:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "11351:3:70", + "nodeType": "YulIdentifier", + "src": "11351:3:70" + }, + "nativeSrc": "11351:23:70", + "nodeType": "YulFunctionCall", + "src": "11351:23:70" + }, + { + "kind": "number", + "nativeSrc": "11376:3:70", + "nodeType": "YulLiteral", + "src": "11376:3:70", + "type": "", + "value": "384" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "11347:3:70", + "nodeType": "YulIdentifier", + "src": "11347:3:70" + }, + "nativeSrc": "11347:33:70", + "nodeType": "YulFunctionCall", + "src": "11347:33:70" + }, + "nativeSrc": "11344:53:70", + "nodeType": "YulIf", + "src": "11344:53:70" + }, + { + "nativeSrc": "11406:62:70", + "nodeType": "YulAssignment", + "src": "11406:62:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11449:9:70", + "nodeType": "YulIdentifier", + "src": "11449:9:70" + }, + { + "name": "dataEnd", + "nativeSrc": "11460:7:70", + "nodeType": "YulIdentifier", + "src": "11460:7:70" + } + ], + "functionName": { + "name": "abi_decode_struct_State_calldata", + "nativeSrc": "11416:32:70", + "nodeType": "YulIdentifier", + "src": "11416:32:70" + }, + "nativeSrc": "11416:52:70", + "nodeType": "YulFunctionCall", + "src": "11416:52:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "11406:6:70", + "nodeType": "YulIdentifier", + "src": "11406:6:70" + } + ] + }, + { + "nativeSrc": "11477:72:70", + "nodeType": "YulAssignment", + "src": "11477:72:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11524:9:70", + "nodeType": "YulIdentifier", + "src": "11524:9:70" + }, + { + "kind": "number", + "nativeSrc": "11535:3:70", + "nodeType": "YulLiteral", + "src": "11535:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11520:3:70", + "nodeType": "YulIdentifier", + "src": "11520:3:70" + }, + "nativeSrc": "11520:19:70", + "nodeType": "YulFunctionCall", + "src": "11520:19:70" + }, + { + "name": "dataEnd", + "nativeSrc": "11541:7:70", + "nodeType": "YulIdentifier", + "src": "11541:7:70" + } + ], + "functionName": { + "name": "abi_decode_struct_State_calldata", + "nativeSrc": "11487:32:70", + "nodeType": "YulIdentifier", + "src": "11487:32:70" + }, + "nativeSrc": "11487:62:70", + "nodeType": "YulFunctionCall", + "src": "11487:62:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "11477:6:70", + "nodeType": "YulIdentifier", + "src": "11477:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_State_$16058_calldata_ptrt_struct$_State_$16058_calldata_ptr", + "nativeSrc": "11195:360:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "11292:9:70", + "nodeType": "YulTypedName", + "src": "11292:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "11303:7:70", + "nodeType": "YulTypedName", + "src": "11303:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "11315:6:70", + "nodeType": "YulTypedName", + "src": "11315:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "11323:6:70", + "nodeType": "YulTypedName", + "src": "11323:6:70", + "type": "" + } + ], + "src": "11195:360:70" + }, + { + "body": { + "nativeSrc": "11629:176:70", + "nodeType": "YulBlock", + "src": "11629:176:70", + "statements": [ + { + "body": { + "nativeSrc": "11675:16:70", + "nodeType": "YulBlock", + "src": "11675:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11684:1:70", + "nodeType": "YulLiteral", + "src": "11684:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "11687:1:70", + "nodeType": "YulLiteral", + "src": "11687:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "11677:6:70", + "nodeType": "YulIdentifier", + "src": "11677:6:70" + }, + "nativeSrc": "11677:12:70", + "nodeType": "YulFunctionCall", + "src": "11677:12:70" + }, + "nativeSrc": "11677:12:70", + "nodeType": "YulExpressionStatement", + "src": "11677:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "11650:7:70", + "nodeType": "YulIdentifier", + "src": "11650:7:70" + }, + { + "name": "headStart", + "nativeSrc": "11659:9:70", + "nodeType": "YulIdentifier", + "src": "11659:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "11646:3:70", + "nodeType": "YulIdentifier", + "src": "11646:3:70" + }, + "nativeSrc": "11646:23:70", + "nodeType": "YulFunctionCall", + "src": "11646:23:70" + }, + { + "kind": "number", + "nativeSrc": "11671:2:70", + "nodeType": "YulLiteral", + "src": "11671:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "11642:3:70", + "nodeType": "YulIdentifier", + "src": "11642:3:70" + }, + "nativeSrc": "11642:32:70", + "nodeType": "YulFunctionCall", + "src": "11642:32:70" + }, + "nativeSrc": "11639:52:70", + "nodeType": "YulIf", + "src": "11639:52:70" + }, + { + "nativeSrc": "11700:36:70", + "nodeType": "YulVariableDeclaration", + "src": "11700:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11726:9:70", + "nodeType": "YulIdentifier", + "src": "11726:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "11713:12:70", + "nodeType": "YulIdentifier", + "src": "11713:12:70" + }, + "nativeSrc": "11713:23:70", + "nodeType": "YulFunctionCall", + "src": "11713:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "11704:5:70", + "nodeType": "YulTypedName", + "src": "11704:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "11769:5:70", + "nodeType": "YulIdentifier", + "src": "11769:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint64", + "nativeSrc": "11745:23:70", + "nodeType": "YulIdentifier", + "src": "11745:23:70" + }, + "nativeSrc": "11745:30:70", + "nodeType": "YulFunctionCall", + "src": "11745:30:70" + }, + "nativeSrc": "11745:30:70", + "nodeType": "YulExpressionStatement", + "src": "11745:30:70" + }, + { + "nativeSrc": "11784:15:70", + "nodeType": "YulAssignment", + "src": "11784:15:70", + "value": { + "name": "value", + "nativeSrc": "11794:5:70", + "nodeType": "YulIdentifier", + "src": "11794:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "11784:6:70", + "nodeType": "YulIdentifier", + "src": "11784:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint64", + "nativeSrc": "11560:245:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "11595:9:70", + "nodeType": "YulTypedName", + "src": "11595:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "11606:7:70", + "nodeType": "YulTypedName", + "src": "11606:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "11618:6:70", + "nodeType": "YulTypedName", + "src": "11618:6:70", + "type": "" + } + ], + "src": "11560:245:70" + }, + { + "body": { + "nativeSrc": "11928:99:70", + "nodeType": "YulBlock", + "src": "11928:99:70", + "statements": [ + { + "nativeSrc": "11938:26:70", + "nodeType": "YulAssignment", + "src": "11938:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11950:9:70", + "nodeType": "YulIdentifier", + "src": "11950:9:70" + }, + { + "kind": "number", + "nativeSrc": "11961:2:70", + "nodeType": "YulLiteral", + "src": "11961:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11946:3:70", + "nodeType": "YulIdentifier", + "src": "11946:3:70" + }, + "nativeSrc": "11946:18:70", + "nodeType": "YulFunctionCall", + "src": "11946:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "11938:4:70", + "nodeType": "YulIdentifier", + "src": "11938:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "12003:6:70", + "nodeType": "YulIdentifier", + "src": "12003:6:70" + }, + { + "name": "headStart", + "nativeSrc": "12011:9:70", + "nodeType": "YulIdentifier", + "src": "12011:9:70" + } + ], + "functionName": { + "name": "abi_encode_enum_DisputeStatus", + "nativeSrc": "11973:29:70", + "nodeType": "YulIdentifier", + "src": "11973:29:70" + }, + "nativeSrc": "11973:48:70", + "nodeType": "YulFunctionCall", + "src": "11973:48:70" + }, + "nativeSrc": "11973:48:70", + "nodeType": "YulExpressionStatement", + "src": "11973:48:70" + } + ] + }, + "name": "abi_encode_tuple_t_enum$_DisputeStatus_$14921__to_t_uint8__fromStack_reversed", + "nativeSrc": "11810:217:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "11897:9:70", + "nodeType": "YulTypedName", + "src": "11897:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "11908:6:70", + "nodeType": "YulTypedName", + "src": "11908:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "11919:4:70", + "nodeType": "YulTypedName", + "src": "11919:4:70", + "type": "" + } + ], + "src": "11810:217:70" + }, + { + "body": { + "nativeSrc": "12140:101:70", + "nodeType": "YulBlock", + "src": "12140:101:70", + "statements": [ + { + "nativeSrc": "12150:26:70", + "nodeType": "YulAssignment", + "src": "12150:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12162:9:70", + "nodeType": "YulIdentifier", + "src": "12162:9:70" + }, + { + "kind": "number", + "nativeSrc": "12173:2:70", + "nodeType": "YulLiteral", + "src": "12173:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12158:3:70", + "nodeType": "YulIdentifier", + "src": "12158:3:70" + }, + "nativeSrc": "12158:18:70", + "nodeType": "YulFunctionCall", + "src": "12158:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "12150:4:70", + "nodeType": "YulIdentifier", + "src": "12150:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12192:9:70", + "nodeType": "YulIdentifier", + "src": "12192:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "12207:6:70", + "nodeType": "YulIdentifier", + "src": "12207:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12223:2:70", + "nodeType": "YulLiteral", + "src": "12223:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "12227:1:70", + "nodeType": "YulLiteral", + "src": "12227:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "12219:3:70", + "nodeType": "YulIdentifier", + "src": "12219:3:70" + }, + "nativeSrc": "12219:10:70", + "nodeType": "YulFunctionCall", + "src": "12219:10:70" + }, + { + "kind": "number", + "nativeSrc": "12231:1:70", + "nodeType": "YulLiteral", + "src": "12231:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "12215:3:70", + "nodeType": "YulIdentifier", + "src": "12215:3:70" + }, + "nativeSrc": "12215:18:70", + "nodeType": "YulFunctionCall", + "src": "12215:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "12203:3:70", + "nodeType": "YulIdentifier", + "src": "12203:3:70" + }, + "nativeSrc": "12203:31:70", + "nodeType": "YulFunctionCall", + "src": "12203:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "12185:6:70", + "nodeType": "YulIdentifier", + "src": "12185:6:70" + }, + "nativeSrc": "12185:50:70", + "nodeType": "YulFunctionCall", + "src": "12185:50:70" + }, + "nativeSrc": "12185:50:70", + "nodeType": "YulExpressionStatement", + "src": "12185:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_rational_1_by_1__to_t_uint64__fromStack_reversed", + "nativeSrc": "12032:209:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "12109:9:70", + "nodeType": "YulTypedName", + "src": "12109:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "12120:6:70", + "nodeType": "YulTypedName", + "src": "12120:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "12131:4:70", + "nodeType": "YulTypedName", + "src": "12131:4:70", + "type": "" + } + ], + "src": "12032:209:70" + }, + { + "body": { + "nativeSrc": "12342:785:70", + "nodeType": "YulBlock", + "src": "12342:785:70", + "statements": [ + { + "nativeSrc": "12352:42:70", + "nodeType": "YulVariableDeclaration", + "src": "12352:42:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "12370:7:70", + "nodeType": "YulIdentifier", + "src": "12370:7:70" + }, + { + "name": "headStart", + "nativeSrc": "12379:9:70", + "nodeType": "YulIdentifier", + "src": "12379:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "12366:3:70", + "nodeType": "YulIdentifier", + "src": "12366:3:70" + }, + "nativeSrc": "12366:23:70", + "nodeType": "YulFunctionCall", + "src": "12366:23:70" + }, + { + "kind": "number", + "nativeSrc": "12391:2:70", + "nodeType": "YulLiteral", + "src": "12391:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "12362:3:70", + "nodeType": "YulIdentifier", + "src": "12362:3:70" + }, + "nativeSrc": "12362:32:70", + "nodeType": "YulFunctionCall", + "src": "12362:32:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "12356:2:70", + "nodeType": "YulTypedName", + "src": "12356:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "12409:16:70", + "nodeType": "YulBlock", + "src": "12409:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12418:1:70", + "nodeType": "YulLiteral", + "src": "12418:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "12421:1:70", + "nodeType": "YulLiteral", + "src": "12421:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "12411:6:70", + "nodeType": "YulIdentifier", + "src": "12411:6:70" + }, + "nativeSrc": "12411:12:70", + "nodeType": "YulFunctionCall", + "src": "12411:12:70" + }, + "nativeSrc": "12411:12:70", + "nodeType": "YulExpressionStatement", + "src": "12411:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "12406:2:70", + "nodeType": "YulIdentifier", + "src": "12406:2:70" + }, + "nativeSrc": "12403:22:70", + "nodeType": "YulIf", + "src": "12403:22:70" + }, + { + "nativeSrc": "12434:7:70", + "nodeType": "YulAssignment", + "src": "12434:7:70", + "value": { + "kind": "number", + "nativeSrc": "12440:1:70", + "nodeType": "YulLiteral", + "src": "12440:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "12434:2:70", + "nodeType": "YulIdentifier", + "src": "12434:2:70" + } + ] + }, + { + "nativeSrc": "12450:16:70", + "nodeType": "YulVariableDeclaration", + "src": "12450:16:70", + "value": { + "name": "_1", + "nativeSrc": "12464:2:70", + "nodeType": "YulIdentifier", + "src": "12464:2:70" + }, + "variables": [ + { + "name": "memPtr", + "nativeSrc": "12454:6:70", + "nodeType": "YulTypedName", + "src": "12454:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "12475:19:70", + "nodeType": "YulAssignment", + "src": "12475:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12491:2:70", + "nodeType": "YulLiteral", + "src": "12491:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "12485:5:70", + "nodeType": "YulIdentifier", + "src": "12485:5:70" + }, + "nativeSrc": "12485:9:70", + "nodeType": "YulFunctionCall", + "src": "12485:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "12475:6:70", + "nodeType": "YulIdentifier", + "src": "12475:6:70" + } + ] + }, + { + "nativeSrc": "12503:33:70", + "nodeType": "YulVariableDeclaration", + "src": "12503:33:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "12525:6:70", + "nodeType": "YulIdentifier", + "src": "12525:6:70" + }, + { + "kind": "number", + "nativeSrc": "12533:2:70", + "nodeType": "YulLiteral", + "src": "12533:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12521:3:70", + "nodeType": "YulIdentifier", + "src": "12521:3:70" + }, + "nativeSrc": "12521:15:70", + "nodeType": "YulFunctionCall", + "src": "12521:15:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "12507:10:70", + "nodeType": "YulTypedName", + "src": "12507:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "12619:113:70", + "nodeType": "YulBlock", + "src": "12619:113:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "12640:2:70", + "nodeType": "YulIdentifier", + "src": "12640:2:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12648:3:70", + "nodeType": "YulLiteral", + "src": "12648:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "12653:10:70", + "nodeType": "YulLiteral", + "src": "12653:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "12644:3:70", + "nodeType": "YulIdentifier", + "src": "12644:3:70" + }, + "nativeSrc": "12644:20:70", + "nodeType": "YulFunctionCall", + "src": "12644:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "12633:6:70", + "nodeType": "YulIdentifier", + "src": "12633:6:70" + }, + "nativeSrc": "12633:32:70", + "nodeType": "YulFunctionCall", + "src": "12633:32:70" + }, + "nativeSrc": "12633:32:70", + "nodeType": "YulExpressionStatement", + "src": "12633:32:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12685:1:70", + "nodeType": "YulLiteral", + "src": "12685:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "12688:4:70", + "nodeType": "YulLiteral", + "src": "12688:4:70", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "12678:6:70", + "nodeType": "YulIdentifier", + "src": "12678:6:70" + }, + "nativeSrc": "12678:15:70", + "nodeType": "YulFunctionCall", + "src": "12678:15:70" + }, + "nativeSrc": "12678:15:70", + "nodeType": "YulExpressionStatement", + "src": "12678:15:70" + }, + { + "expression": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "12713:2:70", + "nodeType": "YulIdentifier", + "src": "12713:2:70" + }, + { + "kind": "number", + "nativeSrc": "12717:4:70", + "nodeType": "YulLiteral", + "src": "12717:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "12706:6:70", + "nodeType": "YulIdentifier", + "src": "12706:6:70" + }, + "nativeSrc": "12706:16:70", + "nodeType": "YulFunctionCall", + "src": "12706:16:70" + }, + "nativeSrc": "12706:16:70", + "nodeType": "YulExpressionStatement", + "src": "12706:16:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "12554:10:70", + "nodeType": "YulIdentifier", + "src": "12554:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12574:2:70", + "nodeType": "YulLiteral", + "src": "12574:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "12578:1:70", + "nodeType": "YulLiteral", + "src": "12578:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "12570:3:70", + "nodeType": "YulIdentifier", + "src": "12570:3:70" + }, + "nativeSrc": "12570:10:70", + "nodeType": "YulFunctionCall", + "src": "12570:10:70" + }, + { + "kind": "number", + "nativeSrc": "12582:1:70", + "nodeType": "YulLiteral", + "src": "12582:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "12566:3:70", + "nodeType": "YulIdentifier", + "src": "12566:3:70" + }, + "nativeSrc": "12566:18:70", + "nodeType": "YulFunctionCall", + "src": "12566:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "12551:2:70", + "nodeType": "YulIdentifier", + "src": "12551:2:70" + }, + "nativeSrc": "12551:34:70", + "nodeType": "YulFunctionCall", + "src": "12551:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "12590:10:70", + "nodeType": "YulIdentifier", + "src": "12590:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "12602:6:70", + "nodeType": "YulIdentifier", + "src": "12602:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "12587:2:70", + "nodeType": "YulIdentifier", + "src": "12587:2:70" + }, + "nativeSrc": "12587:22:70", + "nodeType": "YulFunctionCall", + "src": "12587:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "12548:2:70", + "nodeType": "YulIdentifier", + "src": "12548:2:70" + }, + "nativeSrc": "12548:62:70", + "nodeType": "YulFunctionCall", + "src": "12548:62:70" + }, + "nativeSrc": "12545:187:70", + "nodeType": "YulIf", + "src": "12545:187:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12748:2:70", + "nodeType": "YulLiteral", + "src": "12748:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "12752:10:70", + "nodeType": "YulIdentifier", + "src": "12752:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "12741:6:70", + "nodeType": "YulIdentifier", + "src": "12741:6:70" + }, + "nativeSrc": "12741:22:70", + "nodeType": "YulFunctionCall", + "src": "12741:22:70" + }, + "nativeSrc": "12741:22:70", + "nodeType": "YulExpressionStatement", + "src": "12741:22:70" + }, + { + "nativeSrc": "12772:15:70", + "nodeType": "YulVariableDeclaration", + "src": "12772:15:70", + "value": { + "name": "_1", + "nativeSrc": "12785:2:70", + "nodeType": "YulIdentifier", + "src": "12785:2:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "12776:5:70", + "nodeType": "YulTypedName", + "src": "12776:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "12796:32:70", + "nodeType": "YulAssignment", + "src": "12796:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12818:9:70", + "nodeType": "YulIdentifier", + "src": "12818:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12805:12:70", + "nodeType": "YulIdentifier", + "src": "12805:12:70" + }, + "nativeSrc": "12805:23:70", + "nodeType": "YulFunctionCall", + "src": "12805:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "12796:5:70", + "nodeType": "YulIdentifier", + "src": "12796:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "12844:6:70", + "nodeType": "YulIdentifier", + "src": "12844:6:70" + }, + { + "name": "value", + "nativeSrc": "12852:5:70", + "nodeType": "YulIdentifier", + "src": "12852:5:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "12837:6:70", + "nodeType": "YulIdentifier", + "src": "12837:6:70" + }, + "nativeSrc": "12837:21:70", + "nodeType": "YulFunctionCall", + "src": "12837:21:70" + }, + "nativeSrc": "12837:21:70", + "nodeType": "YulExpressionStatement", + "src": "12837:21:70" + }, + { + "nativeSrc": "12867:17:70", + "nodeType": "YulVariableDeclaration", + "src": "12867:17:70", + "value": { + "name": "_1", + "nativeSrc": "12882:2:70", + "nodeType": "YulIdentifier", + "src": "12882:2:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "12871:7:70", + "nodeType": "YulTypedName", + "src": "12871:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "12893:43:70", + "nodeType": "YulAssignment", + "src": "12893:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12921:9:70", + "nodeType": "YulIdentifier", + "src": "12921:9:70" + }, + { + "kind": "number", + "nativeSrc": "12932:2:70", + "nodeType": "YulLiteral", + "src": "12932:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12917:3:70", + "nodeType": "YulIdentifier", + "src": "12917:3:70" + }, + "nativeSrc": "12917:18:70", + "nodeType": "YulFunctionCall", + "src": "12917:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12904:12:70", + "nodeType": "YulIdentifier", + "src": "12904:12:70" + }, + "nativeSrc": "12904:32:70", + "nodeType": "YulFunctionCall", + "src": "12904:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "12893:7:70", + "nodeType": "YulIdentifier", + "src": "12893:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "12956:6:70", + "nodeType": "YulIdentifier", + "src": "12956:6:70" + }, + { + "kind": "number", + "nativeSrc": "12964:2:70", + "nodeType": "YulLiteral", + "src": "12964:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12952:3:70", + "nodeType": "YulIdentifier", + "src": "12952:3:70" + }, + "nativeSrc": "12952:15:70", + "nodeType": "YulFunctionCall", + "src": "12952:15:70" + }, + { + "name": "value_1", + "nativeSrc": "12969:7:70", + "nodeType": "YulIdentifier", + "src": "12969:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "12945:6:70", + "nodeType": "YulIdentifier", + "src": "12945:6:70" + }, + "nativeSrc": "12945:32:70", + "nodeType": "YulFunctionCall", + "src": "12945:32:70" + }, + "nativeSrc": "12945:32:70", + "nodeType": "YulExpressionStatement", + "src": "12945:32:70" + }, + { + "nativeSrc": "12986:17:70", + "nodeType": "YulVariableDeclaration", + "src": "12986:17:70", + "value": { + "name": "_1", + "nativeSrc": "13001:2:70", + "nodeType": "YulIdentifier", + "src": "13001:2:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "12990:7:70", + "nodeType": "YulTypedName", + "src": "12990:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "13012:43:70", + "nodeType": "YulAssignment", + "src": "13012:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13040:9:70", + "nodeType": "YulIdentifier", + "src": "13040:9:70" + }, + { + "kind": "number", + "nativeSrc": "13051:2:70", + "nodeType": "YulLiteral", + "src": "13051:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13036:3:70", + "nodeType": "YulIdentifier", + "src": "13036:3:70" + }, + "nativeSrc": "13036:18:70", + "nodeType": "YulFunctionCall", + "src": "13036:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "13023:12:70", + "nodeType": "YulIdentifier", + "src": "13023:12:70" + }, + "nativeSrc": "13023:32:70", + "nodeType": "YulFunctionCall", + "src": "13023:32:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "13012:7:70", + "nodeType": "YulIdentifier", + "src": "13012:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "13075:6:70", + "nodeType": "YulIdentifier", + "src": "13075:6:70" + }, + { + "kind": "number", + "nativeSrc": "13083:2:70", + "nodeType": "YulLiteral", + "src": "13083:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13071:3:70", + "nodeType": "YulIdentifier", + "src": "13071:3:70" + }, + "nativeSrc": "13071:15:70", + "nodeType": "YulFunctionCall", + "src": "13071:15:70" + }, + { + "name": "value_2", + "nativeSrc": "13088:7:70", + "nodeType": "YulIdentifier", + "src": "13088:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13064:6:70", + "nodeType": "YulIdentifier", + "src": "13064:6:70" + }, + "nativeSrc": "13064:32:70", + "nodeType": "YulFunctionCall", + "src": "13064:32:70" + }, + "nativeSrc": "13064:32:70", + "nodeType": "YulExpressionStatement", + "src": "13064:32:70" + }, + { + "nativeSrc": "13105:16:70", + "nodeType": "YulAssignment", + "src": "13105:16:70", + "value": { + "name": "memPtr", + "nativeSrc": "13115:6:70", + "nodeType": "YulIdentifier", + "src": "13115:6:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "13105:6:70", + "nodeType": "YulIdentifier", + "src": "13105:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_Receipt_$16044_memory_ptr", + "nativeSrc": "12246:881:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "12308:9:70", + "nodeType": "YulTypedName", + "src": "12308:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "12319:7:70", + "nodeType": "YulTypedName", + "src": "12319:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "12331:6:70", + "nodeType": "YulTypedName", + "src": "12331:6:70", + "type": "" + } + ], + "src": "12246:881:70" + }, + { + "body": { + "nativeSrc": "13352:141:70", + "nodeType": "YulBlock", + "src": "13352:141:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "13369:3:70", + "nodeType": "YulIdentifier", + "src": "13369:3:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "13382:2:70", + "nodeType": "YulLiteral", + "src": "13382:2:70", + "type": "", + "value": "96" + }, + { + "name": "value0", + "nativeSrc": "13386:6:70", + "nodeType": "YulIdentifier", + "src": "13386:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "13378:3:70", + "nodeType": "YulIdentifier", + "src": "13378:3:70" + }, + "nativeSrc": "13378:15:70", + "nodeType": "YulFunctionCall", + "src": "13378:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "13407:2:70", + "nodeType": "YulLiteral", + "src": "13407:2:70", + "type": "", + "value": "96" + }, + { + "kind": "number", + "nativeSrc": "13411:1:70", + "nodeType": "YulLiteral", + "src": "13411:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "13403:3:70", + "nodeType": "YulIdentifier", + "src": "13403:3:70" + }, + "nativeSrc": "13403:10:70", + "nodeType": "YulFunctionCall", + "src": "13403:10:70" + }, + { + "kind": "number", + "nativeSrc": "13415:1:70", + "nodeType": "YulLiteral", + "src": "13415:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "13399:3:70", + "nodeType": "YulIdentifier", + "src": "13399:3:70" + }, + "nativeSrc": "13399:18:70", + "nodeType": "YulFunctionCall", + "src": "13399:18:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "13395:3:70", + "nodeType": "YulIdentifier", + "src": "13395:3:70" + }, + "nativeSrc": "13395:23:70", + "nodeType": "YulFunctionCall", + "src": "13395:23:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "13374:3:70", + "nodeType": "YulIdentifier", + "src": "13374:3:70" + }, + "nativeSrc": "13374:45:70", + "nodeType": "YulFunctionCall", + "src": "13374:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13362:6:70", + "nodeType": "YulIdentifier", + "src": "13362:6:70" + }, + "nativeSrc": "13362:58:70", + "nodeType": "YulFunctionCall", + "src": "13362:58:70" + }, + "nativeSrc": "13362:58:70", + "nodeType": "YulExpressionStatement", + "src": "13362:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "13440:3:70", + "nodeType": "YulIdentifier", + "src": "13440:3:70" + }, + { + "kind": "number", + "nativeSrc": "13445:2:70", + "nodeType": "YulLiteral", + "src": "13445:2:70", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13436:3:70", + "nodeType": "YulIdentifier", + "src": "13436:3:70" + }, + "nativeSrc": "13436:12:70", + "nodeType": "YulFunctionCall", + "src": "13436:12:70" + }, + { + "hexValue": "6c6567616379", + "kind": "string", + "nativeSrc": "13450:8:70", + "nodeType": "YulLiteral", + "src": "13450:8:70", + "type": "", + "value": "legacy" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13429:6:70", + "nodeType": "YulIdentifier", + "src": "13429:6:70" + }, + "nativeSrc": "13429:30:70", + "nodeType": "YulFunctionCall", + "src": "13429:30:70" + }, + "nativeSrc": "13429:30:70", + "nodeType": "YulExpressionStatement", + "src": "13429:30:70" + }, + { + "nativeSrc": "13468:19:70", + "nodeType": "YulAssignment", + "src": "13468:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "13479:3:70", + "nodeType": "YulIdentifier", + "src": "13479:3:70" + }, + { + "kind": "number", + "nativeSrc": "13484:2:70", + "nodeType": "YulLiteral", + "src": "13484:2:70", + "type": "", + "value": "26" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13475:3:70", + "nodeType": "YulIdentifier", + "src": "13475:3:70" + }, + "nativeSrc": "13475:12:70", + "nodeType": "YulFunctionCall", + "src": "13475:12:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "13468:3:70", + "nodeType": "YulIdentifier", + "src": "13468:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_address_t_stringliteral_b7ccb6878fbded310d2d05350bca9c84568ecb568d4b626c83e0508c3193ce89__to_t_address_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "13132:361:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "13328:3:70", + "nodeType": "YulTypedName", + "src": "13328:3:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "13333:6:70", + "nodeType": "YulTypedName", + "src": "13333:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "13344:3:70", + "nodeType": "YulTypedName", + "src": "13344:3:70", + "type": "" + } + ], + "src": "13132:361:70" + }, + { + "body": { + "nativeSrc": "13558:78:70", + "nodeType": "YulBlock", + "src": "13558:78:70", + "statements": [ + { + "nativeSrc": "13568:22:70", + "nodeType": "YulAssignment", + "src": "13568:22:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "13583:6:70", + "nodeType": "YulIdentifier", + "src": "13583:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "13577:5:70", + "nodeType": "YulIdentifier", + "src": "13577:5:70" + }, + "nativeSrc": "13577:13:70", + "nodeType": "YulFunctionCall", + "src": "13577:13:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "13568:5:70", + "nodeType": "YulIdentifier", + "src": "13568:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "13624:5:70", + "nodeType": "YulIdentifier", + "src": "13624:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "13599:24:70", + "nodeType": "YulIdentifier", + "src": "13599:24:70" + }, + "nativeSrc": "13599:31:70", + "nodeType": "YulFunctionCall", + "src": "13599:31:70" + }, + "nativeSrc": "13599:31:70", + "nodeType": "YulExpressionStatement", + "src": "13599:31:70" + } + ] + }, + "name": "abi_decode_address_fromMemory", + "nativeSrc": "13498:138:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "13537:6:70", + "nodeType": "YulTypedName", + "src": "13537:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "13548:5:70", + "nodeType": "YulTypedName", + "src": "13548:5:70", + "type": "" + } + ], + "src": "13498:138:70" + }, + { + "body": { + "nativeSrc": "13719:1062:70", + "nodeType": "YulBlock", + "src": "13719:1062:70", + "statements": [ + { + "body": { + "nativeSrc": "13765:16:70", + "nodeType": "YulBlock", + "src": "13765:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "13774:1:70", + "nodeType": "YulLiteral", + "src": "13774:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "13777:1:70", + "nodeType": "YulLiteral", + "src": "13777:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "13767:6:70", + "nodeType": "YulIdentifier", + "src": "13767:6:70" + }, + "nativeSrc": "13767:12:70", + "nodeType": "YulFunctionCall", + "src": "13767:12:70" + }, + "nativeSrc": "13767:12:70", + "nodeType": "YulExpressionStatement", + "src": "13767:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "end", + "nativeSrc": "13740:3:70", + "nodeType": "YulIdentifier", + "src": "13740:3:70" + }, + { + "name": "headStart", + "nativeSrc": "13745:9:70", + "nodeType": "YulIdentifier", + "src": "13745:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "13736:3:70", + "nodeType": "YulIdentifier", + "src": "13736:3:70" + }, + "nativeSrc": "13736:19:70", + "nodeType": "YulFunctionCall", + "src": "13736:19:70" + }, + { + "kind": "number", + "nativeSrc": "13757:6:70", + "nodeType": "YulLiteral", + "src": "13757:6:70", + "type": "", + "value": "0x0120" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "13732:3:70", + "nodeType": "YulIdentifier", + "src": "13732:3:70" + }, + "nativeSrc": "13732:32:70", + "nodeType": "YulFunctionCall", + "src": "13732:32:70" + }, + "nativeSrc": "13729:52:70", + "nodeType": "YulIf", + "src": "13729:52:70" + }, + { + "nativeSrc": "13790:31:70", + "nodeType": "YulAssignment", + "src": "13790:31:70", + "value": { + "arguments": [], + "functionName": { + "name": "allocate_memory_2390", + "nativeSrc": "13799:20:70", + "nodeType": "YulIdentifier", + "src": "13799:20:70" + }, + "nativeSrc": "13799:22:70", + "nodeType": "YulFunctionCall", + "src": "13799:22:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "13790:5:70", + "nodeType": "YulIdentifier", + "src": "13790:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "13837:5:70", + "nodeType": "YulIdentifier", + "src": "13837:5:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13874:9:70", + "nodeType": "YulIdentifier", + "src": "13874:9:70" + } + ], + "functionName": { + "name": "abi_decode_address_fromMemory", + "nativeSrc": "13844:29:70", + "nodeType": "YulIdentifier", + "src": "13844:29:70" + }, + "nativeSrc": "13844:40:70", + "nodeType": "YulFunctionCall", + "src": "13844:40:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13830:6:70", + "nodeType": "YulIdentifier", + "src": "13830:6:70" + }, + "nativeSrc": "13830:55:70", + "nodeType": "YulFunctionCall", + "src": "13830:55:70" + }, + "nativeSrc": "13830:55:70", + "nodeType": "YulExpressionStatement", + "src": "13830:55:70" + }, + { + "nativeSrc": "13894:16:70", + "nodeType": "YulVariableDeclaration", + "src": "13894:16:70", + "value": { + "kind": "number", + "nativeSrc": "13909:1:70", + "nodeType": "YulLiteral", + "src": "13909:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "13898:7:70", + "nodeType": "YulTypedName", + "src": "13898:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "13919:36:70", + "nodeType": "YulAssignment", + "src": "13919:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13940:9:70", + "nodeType": "YulIdentifier", + "src": "13940:9:70" + }, + { + "kind": "number", + "nativeSrc": "13951:2:70", + "nodeType": "YulLiteral", + "src": "13951:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13936:3:70", + "nodeType": "YulIdentifier", + "src": "13936:3:70" + }, + "nativeSrc": "13936:18:70", + "nodeType": "YulFunctionCall", + "src": "13936:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "13930:5:70", + "nodeType": "YulIdentifier", + "src": "13930:5:70" + }, + "nativeSrc": "13930:25:70", + "nodeType": "YulFunctionCall", + "src": "13930:25:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "13919:7:70", + "nodeType": "YulIdentifier", + "src": "13919:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "13975:5:70", + "nodeType": "YulIdentifier", + "src": "13975:5:70" + }, + { + "kind": "number", + "nativeSrc": "13982:2:70", + "nodeType": "YulLiteral", + "src": "13982:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13971:3:70", + "nodeType": "YulIdentifier", + "src": "13971:3:70" + }, + "nativeSrc": "13971:14:70", + "nodeType": "YulFunctionCall", + "src": "13971:14:70" + }, + { + "name": "value_1", + "nativeSrc": "13987:7:70", + "nodeType": "YulIdentifier", + "src": "13987:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13964:6:70", + "nodeType": "YulIdentifier", + "src": "13964:6:70" + }, + "nativeSrc": "13964:31:70", + "nodeType": "YulFunctionCall", + "src": "13964:31:70" + }, + "nativeSrc": "13964:31:70", + "nodeType": "YulExpressionStatement", + "src": "13964:31:70" + }, + { + "nativeSrc": "14004:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14004:16:70", + "value": { + "kind": "number", + "nativeSrc": "14019:1:70", + "nodeType": "YulLiteral", + "src": "14019:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "14008:7:70", + "nodeType": "YulTypedName", + "src": "14008:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14029:36:70", + "nodeType": "YulAssignment", + "src": "14029:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14050:9:70", + "nodeType": "YulIdentifier", + "src": "14050:9:70" + }, + { + "kind": "number", + "nativeSrc": "14061:2:70", + "nodeType": "YulLiteral", + "src": "14061:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14046:3:70", + "nodeType": "YulIdentifier", + "src": "14046:3:70" + }, + "nativeSrc": "14046:18:70", + "nodeType": "YulFunctionCall", + "src": "14046:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14040:5:70", + "nodeType": "YulIdentifier", + "src": "14040:5:70" + }, + "nativeSrc": "14040:25:70", + "nodeType": "YulFunctionCall", + "src": "14040:25:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "14029:7:70", + "nodeType": "YulIdentifier", + "src": "14029:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14085:5:70", + "nodeType": "YulIdentifier", + "src": "14085:5:70" + }, + { + "kind": "number", + "nativeSrc": "14092:2:70", + "nodeType": "YulLiteral", + "src": "14092:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14081:3:70", + "nodeType": "YulIdentifier", + "src": "14081:3:70" + }, + "nativeSrc": "14081:14:70", + "nodeType": "YulFunctionCall", + "src": "14081:14:70" + }, + { + "name": "value_2", + "nativeSrc": "14097:7:70", + "nodeType": "YulIdentifier", + "src": "14097:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14074:6:70", + "nodeType": "YulIdentifier", + "src": "14074:6:70" + }, + "nativeSrc": "14074:31:70", + "nodeType": "YulFunctionCall", + "src": "14074:31:70" + }, + "nativeSrc": "14074:31:70", + "nodeType": "YulExpressionStatement", + "src": "14074:31:70" + }, + { + "nativeSrc": "14114:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14114:16:70", + "value": { + "kind": "number", + "nativeSrc": "14129:1:70", + "nodeType": "YulLiteral", + "src": "14129:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "14118:7:70", + "nodeType": "YulTypedName", + "src": "14118:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14139:36:70", + "nodeType": "YulAssignment", + "src": "14139:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14160:9:70", + "nodeType": "YulIdentifier", + "src": "14160:9:70" + }, + { + "kind": "number", + "nativeSrc": "14171:2:70", + "nodeType": "YulLiteral", + "src": "14171:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14156:3:70", + "nodeType": "YulIdentifier", + "src": "14156:3:70" + }, + "nativeSrc": "14156:18:70", + "nodeType": "YulFunctionCall", + "src": "14156:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14150:5:70", + "nodeType": "YulIdentifier", + "src": "14150:5:70" + }, + "nativeSrc": "14150:25:70", + "nodeType": "YulFunctionCall", + "src": "14150:25:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "14139:7:70", + "nodeType": "YulIdentifier", + "src": "14139:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14195:5:70", + "nodeType": "YulIdentifier", + "src": "14195:5:70" + }, + { + "kind": "number", + "nativeSrc": "14202:2:70", + "nodeType": "YulLiteral", + "src": "14202:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14191:3:70", + "nodeType": "YulIdentifier", + "src": "14191:3:70" + }, + "nativeSrc": "14191:14:70", + "nodeType": "YulFunctionCall", + "src": "14191:14:70" + }, + { + "name": "value_3", + "nativeSrc": "14207:7:70", + "nodeType": "YulIdentifier", + "src": "14207:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14184:6:70", + "nodeType": "YulIdentifier", + "src": "14184:6:70" + }, + "nativeSrc": "14184:31:70", + "nodeType": "YulFunctionCall", + "src": "14184:31:70" + }, + "nativeSrc": "14184:31:70", + "nodeType": "YulExpressionStatement", + "src": "14184:31:70" + }, + { + "nativeSrc": "14224:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14224:16:70", + "value": { + "kind": "number", + "nativeSrc": "14239:1:70", + "nodeType": "YulLiteral", + "src": "14239:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "14228:7:70", + "nodeType": "YulTypedName", + "src": "14228:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14249:37:70", + "nodeType": "YulAssignment", + "src": "14249:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14270:9:70", + "nodeType": "YulIdentifier", + "src": "14270:9:70" + }, + { + "kind": "number", + "nativeSrc": "14281:3:70", + "nodeType": "YulLiteral", + "src": "14281:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14266:3:70", + "nodeType": "YulIdentifier", + "src": "14266:3:70" + }, + "nativeSrc": "14266:19:70", + "nodeType": "YulFunctionCall", + "src": "14266:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14260:5:70", + "nodeType": "YulIdentifier", + "src": "14260:5:70" + }, + "nativeSrc": "14260:26:70", + "nodeType": "YulFunctionCall", + "src": "14260:26:70" + }, + "variableNames": [ + { + "name": "value_4", + "nativeSrc": "14249:7:70", + "nodeType": "YulIdentifier", + "src": "14249:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14306:5:70", + "nodeType": "YulIdentifier", + "src": "14306:5:70" + }, + { + "kind": "number", + "nativeSrc": "14313:3:70", + "nodeType": "YulLiteral", + "src": "14313:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14302:3:70", + "nodeType": "YulIdentifier", + "src": "14302:3:70" + }, + "nativeSrc": "14302:15:70", + "nodeType": "YulFunctionCall", + "src": "14302:15:70" + }, + { + "name": "value_4", + "nativeSrc": "14319:7:70", + "nodeType": "YulIdentifier", + "src": "14319:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14295:6:70", + "nodeType": "YulIdentifier", + "src": "14295:6:70" + }, + "nativeSrc": "14295:32:70", + "nodeType": "YulFunctionCall", + "src": "14295:32:70" + }, + "nativeSrc": "14295:32:70", + "nodeType": "YulExpressionStatement", + "src": "14295:32:70" + }, + { + "nativeSrc": "14336:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14336:16:70", + "value": { + "kind": "number", + "nativeSrc": "14351:1:70", + "nodeType": "YulLiteral", + "src": "14351:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_5", + "nativeSrc": "14340:7:70", + "nodeType": "YulTypedName", + "src": "14340:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14361:37:70", + "nodeType": "YulAssignment", + "src": "14361:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14382:9:70", + "nodeType": "YulIdentifier", + "src": "14382:9:70" + }, + { + "kind": "number", + "nativeSrc": "14393:3:70", + "nodeType": "YulLiteral", + "src": "14393:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14378:3:70", + "nodeType": "YulIdentifier", + "src": "14378:3:70" + }, + "nativeSrc": "14378:19:70", + "nodeType": "YulFunctionCall", + "src": "14378:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14372:5:70", + "nodeType": "YulIdentifier", + "src": "14372:5:70" + }, + "nativeSrc": "14372:26:70", + "nodeType": "YulFunctionCall", + "src": "14372:26:70" + }, + "variableNames": [ + { + "name": "value_5", + "nativeSrc": "14361:7:70", + "nodeType": "YulIdentifier", + "src": "14361:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14418:5:70", + "nodeType": "YulIdentifier", + "src": "14418:5:70" + }, + { + "kind": "number", + "nativeSrc": "14425:3:70", + "nodeType": "YulLiteral", + "src": "14425:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14414:3:70", + "nodeType": "YulIdentifier", + "src": "14414:3:70" + }, + "nativeSrc": "14414:15:70", + "nodeType": "YulFunctionCall", + "src": "14414:15:70" + }, + { + "name": "value_5", + "nativeSrc": "14431:7:70", + "nodeType": "YulIdentifier", + "src": "14431:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14407:6:70", + "nodeType": "YulIdentifier", + "src": "14407:6:70" + }, + "nativeSrc": "14407:32:70", + "nodeType": "YulFunctionCall", + "src": "14407:32:70" + }, + "nativeSrc": "14407:32:70", + "nodeType": "YulExpressionStatement", + "src": "14407:32:70" + }, + { + "nativeSrc": "14448:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14448:16:70", + "value": { + "kind": "number", + "nativeSrc": "14463:1:70", + "nodeType": "YulLiteral", + "src": "14463:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_6", + "nativeSrc": "14452:7:70", + "nodeType": "YulTypedName", + "src": "14452:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14473:37:70", + "nodeType": "YulAssignment", + "src": "14473:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14494:9:70", + "nodeType": "YulIdentifier", + "src": "14494:9:70" + }, + { + "kind": "number", + "nativeSrc": "14505:3:70", + "nodeType": "YulLiteral", + "src": "14505:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14490:3:70", + "nodeType": "YulIdentifier", + "src": "14490:3:70" + }, + "nativeSrc": "14490:19:70", + "nodeType": "YulFunctionCall", + "src": "14490:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14484:5:70", + "nodeType": "YulIdentifier", + "src": "14484:5:70" + }, + "nativeSrc": "14484:26:70", + "nodeType": "YulFunctionCall", + "src": "14484:26:70" + }, + "variableNames": [ + { + "name": "value_6", + "nativeSrc": "14473:7:70", + "nodeType": "YulIdentifier", + "src": "14473:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14530:5:70", + "nodeType": "YulIdentifier", + "src": "14530:5:70" + }, + { + "kind": "number", + "nativeSrc": "14537:3:70", + "nodeType": "YulLiteral", + "src": "14537:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14526:3:70", + "nodeType": "YulIdentifier", + "src": "14526:3:70" + }, + "nativeSrc": "14526:15:70", + "nodeType": "YulFunctionCall", + "src": "14526:15:70" + }, + { + "name": "value_6", + "nativeSrc": "14543:7:70", + "nodeType": "YulIdentifier", + "src": "14543:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14519:6:70", + "nodeType": "YulIdentifier", + "src": "14519:6:70" + }, + "nativeSrc": "14519:32:70", + "nodeType": "YulFunctionCall", + "src": "14519:32:70" + }, + "nativeSrc": "14519:32:70", + "nodeType": "YulExpressionStatement", + "src": "14519:32:70" + }, + { + "nativeSrc": "14560:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14560:16:70", + "value": { + "kind": "number", + "nativeSrc": "14575:1:70", + "nodeType": "YulLiteral", + "src": "14575:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_7", + "nativeSrc": "14564:7:70", + "nodeType": "YulTypedName", + "src": "14564:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14585:37:70", + "nodeType": "YulAssignment", + "src": "14585:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14606:9:70", + "nodeType": "YulIdentifier", + "src": "14606:9:70" + }, + { + "kind": "number", + "nativeSrc": "14617:3:70", + "nodeType": "YulLiteral", + "src": "14617:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14602:3:70", + "nodeType": "YulIdentifier", + "src": "14602:3:70" + }, + "nativeSrc": "14602:19:70", + "nodeType": "YulFunctionCall", + "src": "14602:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14596:5:70", + "nodeType": "YulIdentifier", + "src": "14596:5:70" + }, + "nativeSrc": "14596:26:70", + "nodeType": "YulFunctionCall", + "src": "14596:26:70" + }, + "variableNames": [ + { + "name": "value_7", + "nativeSrc": "14585:7:70", + "nodeType": "YulIdentifier", + "src": "14585:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14642:5:70", + "nodeType": "YulIdentifier", + "src": "14642:5:70" + }, + { + "kind": "number", + "nativeSrc": "14649:3:70", + "nodeType": "YulLiteral", + "src": "14649:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14638:3:70", + "nodeType": "YulIdentifier", + "src": "14638:3:70" + }, + "nativeSrc": "14638:15:70", + "nodeType": "YulFunctionCall", + "src": "14638:15:70" + }, + { + "name": "value_7", + "nativeSrc": "14655:7:70", + "nodeType": "YulIdentifier", + "src": "14655:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14631:6:70", + "nodeType": "YulIdentifier", + "src": "14631:6:70" + }, + "nativeSrc": "14631:32:70", + "nodeType": "YulFunctionCall", + "src": "14631:32:70" + }, + "nativeSrc": "14631:32:70", + "nodeType": "YulExpressionStatement", + "src": "14631:32:70" + }, + { + "nativeSrc": "14672:16:70", + "nodeType": "YulVariableDeclaration", + "src": "14672:16:70", + "value": { + "kind": "number", + "nativeSrc": "14687:1:70", + "nodeType": "YulLiteral", + "src": "14687:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_8", + "nativeSrc": "14676:7:70", + "nodeType": "YulTypedName", + "src": "14676:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "14697:37:70", + "nodeType": "YulAssignment", + "src": "14697:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14718:9:70", + "nodeType": "YulIdentifier", + "src": "14718:9:70" + }, + { + "kind": "number", + "nativeSrc": "14729:3:70", + "nodeType": "YulLiteral", + "src": "14729:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14714:3:70", + "nodeType": "YulIdentifier", + "src": "14714:3:70" + }, + "nativeSrc": "14714:19:70", + "nodeType": "YulFunctionCall", + "src": "14714:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14708:5:70", + "nodeType": "YulIdentifier", + "src": "14708:5:70" + }, + "nativeSrc": "14708:26:70", + "nodeType": "YulFunctionCall", + "src": "14708:26:70" + }, + "variableNames": [ + { + "name": "value_8", + "nativeSrc": "14697:7:70", + "nodeType": "YulIdentifier", + "src": "14697:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "14754:5:70", + "nodeType": "YulIdentifier", + "src": "14754:5:70" + }, + { + "kind": "number", + "nativeSrc": "14761:3:70", + "nodeType": "YulLiteral", + "src": "14761:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14750:3:70", + "nodeType": "YulIdentifier", + "src": "14750:3:70" + }, + "nativeSrc": "14750:15:70", + "nodeType": "YulFunctionCall", + "src": "14750:15:70" + }, + { + "name": "value_8", + "nativeSrc": "14767:7:70", + "nodeType": "YulIdentifier", + "src": "14767:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14743:6:70", + "nodeType": "YulIdentifier", + "src": "14743:6:70" + }, + "nativeSrc": "14743:32:70", + "nodeType": "YulFunctionCall", + "src": "14743:32:70" + }, + "nativeSrc": "14743:32:70", + "nodeType": "YulExpressionStatement", + "src": "14743:32:70" + } + ] + }, + "name": "abi_decode_struct_Allocation_fromMemory", + "nativeSrc": "13641:1140:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "13690:9:70", + "nodeType": "YulTypedName", + "src": "13690:9:70", + "type": "" + }, + { + "name": "end", + "nativeSrc": "13701:3:70", + "nodeType": "YulTypedName", + "src": "13701:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "13709:5:70", + "nodeType": "YulTypedName", + "src": "13709:5:70", + "type": "" + } + ], + "src": "13641:1140:70" + }, + { + "body": { + "nativeSrc": "14895:147:70", + "nodeType": "YulBlock", + "src": "14895:147:70", + "statements": [ + { + "body": { + "nativeSrc": "14942:16:70", + "nodeType": "YulBlock", + "src": "14942:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14951:1:70", + "nodeType": "YulLiteral", + "src": "14951:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "14954:1:70", + "nodeType": "YulLiteral", + "src": "14954:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "14944:6:70", + "nodeType": "YulIdentifier", + "src": "14944:6:70" + }, + "nativeSrc": "14944:12:70", + "nodeType": "YulFunctionCall", + "src": "14944:12:70" + }, + "nativeSrc": "14944:12:70", + "nodeType": "YulExpressionStatement", + "src": "14944:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "14916:7:70", + "nodeType": "YulIdentifier", + "src": "14916:7:70" + }, + { + "name": "headStart", + "nativeSrc": "14925:9:70", + "nodeType": "YulIdentifier", + "src": "14925:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "14912:3:70", + "nodeType": "YulIdentifier", + "src": "14912:3:70" + }, + "nativeSrc": "14912:23:70", + "nodeType": "YulFunctionCall", + "src": "14912:23:70" + }, + { + "kind": "number", + "nativeSrc": "14937:3:70", + "nodeType": "YulLiteral", + "src": "14937:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "14908:3:70", + "nodeType": "YulIdentifier", + "src": "14908:3:70" + }, + "nativeSrc": "14908:33:70", + "nodeType": "YulFunctionCall", + "src": "14908:33:70" + }, + "nativeSrc": "14905:53:70", + "nodeType": "YulIf", + "src": "14905:53:70" + }, + { + "nativeSrc": "14967:69:70", + "nodeType": "YulAssignment", + "src": "14967:69:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "15017:9:70", + "nodeType": "YulIdentifier", + "src": "15017:9:70" + }, + { + "name": "dataEnd", + "nativeSrc": "15028:7:70", + "nodeType": "YulIdentifier", + "src": "15028:7:70" + } + ], + "functionName": { + "name": "abi_decode_struct_Allocation_fromMemory", + "nativeSrc": "14977:39:70", + "nodeType": "YulIdentifier", + "src": "14977:39:70" + }, + "nativeSrc": "14977:59:70", + "nodeType": "YulFunctionCall", + "src": "14977:59:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "14967:6:70", + "nodeType": "YulIdentifier", + "src": "14967:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_Allocation_$3073_memory_ptr_fromMemory", + "nativeSrc": "14786:256:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "14861:9:70", + "nodeType": "YulTypedName", + "src": "14861:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "14872:7:70", + "nodeType": "YulTypedName", + "src": "14872:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "14884:6:70", + "nodeType": "YulTypedName", + "src": "14884:6:70", + "type": "" + } + ], + "src": "14786:256:70" + }, + { + "body": { + "nativeSrc": "15079:95:70", + "nodeType": "YulBlock", + "src": "15079:95:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15096:1:70", + "nodeType": "YulLiteral", + "src": "15096:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15103:3:70", + "nodeType": "YulLiteral", + "src": "15103:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "15108:10:70", + "nodeType": "YulLiteral", + "src": "15108:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "15099:3:70", + "nodeType": "YulIdentifier", + "src": "15099:3:70" + }, + "nativeSrc": "15099:20:70", + "nodeType": "YulFunctionCall", + "src": "15099:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15089:6:70", + "nodeType": "YulIdentifier", + "src": "15089:6:70" + }, + "nativeSrc": "15089:31:70", + "nodeType": "YulFunctionCall", + "src": "15089:31:70" + }, + "nativeSrc": "15089:31:70", + "nodeType": "YulExpressionStatement", + "src": "15089:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15136:1:70", + "nodeType": "YulLiteral", + "src": "15136:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "15139:4:70", + "nodeType": "YulLiteral", + "src": "15139:4:70", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15129:6:70", + "nodeType": "YulIdentifier", + "src": "15129:6:70" + }, + "nativeSrc": "15129:15:70", + "nodeType": "YulFunctionCall", + "src": "15129:15:70" + }, + "nativeSrc": "15129:15:70", + "nodeType": "YulExpressionStatement", + "src": "15129:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15160:1:70", + "nodeType": "YulLiteral", + "src": "15160:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "15163:4:70", + "nodeType": "YulLiteral", + "src": "15163:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "15153:6:70", + "nodeType": "YulIdentifier", + "src": "15153:6:70" + }, + "nativeSrc": "15153:15:70", + "nodeType": "YulFunctionCall", + "src": "15153:15:70" + }, + "nativeSrc": "15153:15:70", + "nodeType": "YulExpressionStatement", + "src": "15153:15:70" + } + ] + }, + "name": "panic_error_0x11", + "nativeSrc": "15047:127:70", + "nodeType": "YulFunctionDefinition", + "src": "15047:127:70" + }, + { + "body": { + "nativeSrc": "15227:77:70", + "nodeType": "YulBlock", + "src": "15227:77:70", + "statements": [ + { + "nativeSrc": "15237:16:70", + "nodeType": "YulAssignment", + "src": "15237:16:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "15248:1:70", + "nodeType": "YulIdentifier", + "src": "15248:1:70" + }, + { + "name": "y", + "nativeSrc": "15251:1:70", + "nodeType": "YulIdentifier", + "src": "15251:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15244:3:70", + "nodeType": "YulIdentifier", + "src": "15244:3:70" + }, + "nativeSrc": "15244:9:70", + "nodeType": "YulFunctionCall", + "src": "15244:9:70" + }, + "variableNames": [ + { + "name": "sum", + "nativeSrc": "15237:3:70", + "nodeType": "YulIdentifier", + "src": "15237:3:70" + } + ] + }, + { + "body": { + "nativeSrc": "15276:22:70", + "nodeType": "YulBlock", + "src": "15276:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "15278:16:70", + "nodeType": "YulIdentifier", + "src": "15278:16:70" + }, + "nativeSrc": "15278:18:70", + "nodeType": "YulFunctionCall", + "src": "15278:18:70" + }, + "nativeSrc": "15278:18:70", + "nodeType": "YulExpressionStatement", + "src": "15278:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nativeSrc": "15268:1:70", + "nodeType": "YulIdentifier", + "src": "15268:1:70" + }, + { + "name": "sum", + "nativeSrc": "15271:3:70", + "nodeType": "YulIdentifier", + "src": "15271:3:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "15265:2:70", + "nodeType": "YulIdentifier", + "src": "15265:2:70" + }, + "nativeSrc": "15265:10:70", + "nodeType": "YulFunctionCall", + "src": "15265:10:70" + }, + "nativeSrc": "15262:36:70", + "nodeType": "YulIf", + "src": "15262:36:70" + } + ] + }, + "name": "checked_add_t_uint256", + "nativeSrc": "15179:125:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "15210:1:70", + "nodeType": "YulTypedName", + "src": "15210:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "15213:1:70", + "nodeType": "YulTypedName", + "src": "15213:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nativeSrc": "15219:3:70", + "nodeType": "YulTypedName", + "src": "15219:3:70", + "type": "" + } + ], + "src": "15179:125:70" + }, + { + "body": { + "nativeSrc": "15438:119:70", + "nodeType": "YulBlock", + "src": "15438:119:70", + "statements": [ + { + "nativeSrc": "15448:26:70", + "nodeType": "YulAssignment", + "src": "15448:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "15460:9:70", + "nodeType": "YulIdentifier", + "src": "15460:9:70" + }, + { + "kind": "number", + "nativeSrc": "15471:2:70", + "nodeType": "YulLiteral", + "src": "15471:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15456:3:70", + "nodeType": "YulIdentifier", + "src": "15456:3:70" + }, + "nativeSrc": "15456:18:70", + "nodeType": "YulFunctionCall", + "src": "15456:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "15448:4:70", + "nodeType": "YulIdentifier", + "src": "15448:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "15490:9:70", + "nodeType": "YulIdentifier", + "src": "15490:9:70" + }, + { + "name": "value0", + "nativeSrc": "15501:6:70", + "nodeType": "YulIdentifier", + "src": "15501:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15483:6:70", + "nodeType": "YulIdentifier", + "src": "15483:6:70" + }, + "nativeSrc": "15483:25:70", + "nodeType": "YulFunctionCall", + "src": "15483:25:70" + }, + "nativeSrc": "15483:25:70", + "nodeType": "YulExpressionStatement", + "src": "15483:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "15528:9:70", + "nodeType": "YulIdentifier", + "src": "15528:9:70" + }, + { + "kind": "number", + "nativeSrc": "15539:2:70", + "nodeType": "YulLiteral", + "src": "15539:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15524:3:70", + "nodeType": "YulIdentifier", + "src": "15524:3:70" + }, + "nativeSrc": "15524:18:70", + "nodeType": "YulFunctionCall", + "src": "15524:18:70" + }, + { + "name": "value1", + "nativeSrc": "15544:6:70", + "nodeType": "YulIdentifier", + "src": "15544:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15517:6:70", + "nodeType": "YulIdentifier", + "src": "15517:6:70" + }, + "nativeSrc": "15517:34:70", + "nodeType": "YulFunctionCall", + "src": "15517:34:70" + }, + "nativeSrc": "15517:34:70", + "nodeType": "YulExpressionStatement", + "src": "15517:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "15309:248:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "15399:9:70", + "nodeType": "YulTypedName", + "src": "15399:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "15410:6:70", + "nodeType": "YulTypedName", + "src": "15410:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "15418:6:70", + "nodeType": "YulTypedName", + "src": "15418:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "15429:4:70", + "nodeType": "YulTypedName", + "src": "15429:4:70", + "type": "" + } + ], + "src": "15309:248:70" + }, + { + "body": { + "nativeSrc": "15611:350:70", + "nodeType": "YulBlock", + "src": "15611:350:70", + "statements": [ + { + "nativeSrc": "15621:26:70", + "nodeType": "YulVariableDeclaration", + "src": "15621:26:70", + "value": { + "arguments": [ + { + "name": "value", + "nativeSrc": "15641:5:70", + "nodeType": "YulIdentifier", + "src": "15641:5:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "15635:5:70", + "nodeType": "YulIdentifier", + "src": "15635:5:70" + }, + "nativeSrc": "15635:12:70", + "nodeType": "YulFunctionCall", + "src": "15635:12:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "15625:6:70", + "nodeType": "YulTypedName", + "src": "15625:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "15663:3:70", + "nodeType": "YulIdentifier", + "src": "15663:3:70" + }, + { + "name": "length", + "nativeSrc": "15668:6:70", + "nodeType": "YulIdentifier", + "src": "15668:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15656:6:70", + "nodeType": "YulIdentifier", + "src": "15656:6:70" + }, + "nativeSrc": "15656:19:70", + "nodeType": "YulFunctionCall", + "src": "15656:19:70" + }, + "nativeSrc": "15656:19:70", + "nodeType": "YulExpressionStatement", + "src": "15656:19:70" + }, + { + "nativeSrc": "15684:10:70", + "nodeType": "YulVariableDeclaration", + "src": "15684:10:70", + "value": { + "kind": "number", + "nativeSrc": "15693:1:70", + "nodeType": "YulLiteral", + "src": "15693:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "15688:1:70", + "nodeType": "YulTypedName", + "src": "15688:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "15755:87:70", + "nodeType": "YulBlock", + "src": "15755:87:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "15784:3:70", + "nodeType": "YulIdentifier", + "src": "15784:3:70" + }, + { + "name": "i", + "nativeSrc": "15789:1:70", + "nodeType": "YulIdentifier", + "src": "15789:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15780:3:70", + "nodeType": "YulIdentifier", + "src": "15780:3:70" + }, + "nativeSrc": "15780:11:70", + "nodeType": "YulFunctionCall", + "src": "15780:11:70" + }, + { + "kind": "number", + "nativeSrc": "15793:4:70", + "nodeType": "YulLiteral", + "src": "15793:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15776:3:70", + "nodeType": "YulIdentifier", + "src": "15776:3:70" + }, + "nativeSrc": "15776:22:70", + "nodeType": "YulFunctionCall", + "src": "15776:22:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "15814:5:70", + "nodeType": "YulIdentifier", + "src": "15814:5:70" + }, + { + "name": "i", + "nativeSrc": "15821:1:70", + "nodeType": "YulIdentifier", + "src": "15821:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15810:3:70", + "nodeType": "YulIdentifier", + "src": "15810:3:70" + }, + "nativeSrc": "15810:13:70", + "nodeType": "YulFunctionCall", + "src": "15810:13:70" + }, + { + "kind": "number", + "nativeSrc": "15825:4:70", + "nodeType": "YulLiteral", + "src": "15825:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15806:3:70", + "nodeType": "YulIdentifier", + "src": "15806:3:70" + }, + "nativeSrc": "15806:24:70", + "nodeType": "YulFunctionCall", + "src": "15806:24:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "15800:5:70", + "nodeType": "YulIdentifier", + "src": "15800:5:70" + }, + "nativeSrc": "15800:31:70", + "nodeType": "YulFunctionCall", + "src": "15800:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15769:6:70", + "nodeType": "YulIdentifier", + "src": "15769:6:70" + }, + "nativeSrc": "15769:63:70", + "nodeType": "YulFunctionCall", + "src": "15769:63:70" + }, + "nativeSrc": "15769:63:70", + "nodeType": "YulExpressionStatement", + "src": "15769:63:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "15714:1:70", + "nodeType": "YulIdentifier", + "src": "15714:1:70" + }, + { + "name": "length", + "nativeSrc": "15717:6:70", + "nodeType": "YulIdentifier", + "src": "15717:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "15711:2:70", + "nodeType": "YulIdentifier", + "src": "15711:2:70" + }, + "nativeSrc": "15711:13:70", + "nodeType": "YulFunctionCall", + "src": "15711:13:70" + }, + "nativeSrc": "15703:139:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "15725:21:70", + "nodeType": "YulBlock", + "src": "15725:21:70", + "statements": [ + { + "nativeSrc": "15727:17:70", + "nodeType": "YulAssignment", + "src": "15727:17:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "15736:1:70", + "nodeType": "YulIdentifier", + "src": "15736:1:70" + }, + { + "kind": "number", + "nativeSrc": "15739:4:70", + "nodeType": "YulLiteral", + "src": "15739:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15732:3:70", + "nodeType": "YulIdentifier", + "src": "15732:3:70" + }, + "nativeSrc": "15732:12:70", + "nodeType": "YulFunctionCall", + "src": "15732:12:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "15727:1:70", + "nodeType": "YulIdentifier", + "src": "15727:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "15707:3:70", + "nodeType": "YulBlock", + "src": "15707:3:70", + "statements": [] + }, + "src": "15703:139:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "15866:3:70", + "nodeType": "YulIdentifier", + "src": "15866:3:70" + }, + { + "name": "length", + "nativeSrc": "15871:6:70", + "nodeType": "YulIdentifier", + "src": "15871:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15862:3:70", + "nodeType": "YulIdentifier", + "src": "15862:3:70" + }, + "nativeSrc": "15862:16:70", + "nodeType": "YulFunctionCall", + "src": "15862:16:70" + }, + { + "kind": "number", + "nativeSrc": "15880:4:70", + "nodeType": "YulLiteral", + "src": "15880:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15858:3:70", + "nodeType": "YulIdentifier", + "src": "15858:3:70" + }, + "nativeSrc": "15858:27:70", + "nodeType": "YulFunctionCall", + "src": "15858:27:70" + }, + { + "kind": "number", + "nativeSrc": "15887:1:70", + "nodeType": "YulLiteral", + "src": "15887:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15851:6:70", + "nodeType": "YulIdentifier", + "src": "15851:6:70" + }, + "nativeSrc": "15851:38:70", + "nodeType": "YulFunctionCall", + "src": "15851:38:70" + }, + "nativeSrc": "15851:38:70", + "nodeType": "YulExpressionStatement", + "src": "15851:38:70" + }, + { + "nativeSrc": "15898:57:70", + "nodeType": "YulAssignment", + "src": "15898:57:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "15913:3:70", + "nodeType": "YulIdentifier", + "src": "15913:3:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nativeSrc": "15926:6:70", + "nodeType": "YulIdentifier", + "src": "15926:6:70" + }, + { + "kind": "number", + "nativeSrc": "15934:2:70", + "nodeType": "YulLiteral", + "src": "15934:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15922:3:70", + "nodeType": "YulIdentifier", + "src": "15922:3:70" + }, + "nativeSrc": "15922:15:70", + "nodeType": "YulFunctionCall", + "src": "15922:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15943:2:70", + "nodeType": "YulLiteral", + "src": "15943:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "15939:3:70", + "nodeType": "YulIdentifier", + "src": "15939:3:70" + }, + "nativeSrc": "15939:7:70", + "nodeType": "YulFunctionCall", + "src": "15939:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "15918:3:70", + "nodeType": "YulIdentifier", + "src": "15918:3:70" + }, + "nativeSrc": "15918:29:70", + "nodeType": "YulFunctionCall", + "src": "15918:29:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15909:3:70", + "nodeType": "YulIdentifier", + "src": "15909:3:70" + }, + "nativeSrc": "15909:39:70", + "nodeType": "YulFunctionCall", + "src": "15909:39:70" + }, + { + "kind": "number", + "nativeSrc": "15950:4:70", + "nodeType": "YulLiteral", + "src": "15950:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15905:3:70", + "nodeType": "YulIdentifier", + "src": "15905:3:70" + }, + "nativeSrc": "15905:50:70", + "nodeType": "YulFunctionCall", + "src": "15905:50:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "15898:3:70", + "nodeType": "YulIdentifier", + "src": "15898:3:70" + } + ] + } + ] + }, + "name": "abi_encode_bytes", + "nativeSrc": "15562:399:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "15588:5:70", + "nodeType": "YulTypedName", + "src": "15588:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "15595:3:70", + "nodeType": "YulTypedName", + "src": "15595:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "15603:3:70", + "nodeType": "YulTypedName", + "src": "15603:3:70", + "type": "" + } + ], + "src": "15562:399:70" + }, + { + "body": { + "nativeSrc": "16113:167:70", + "nodeType": "YulBlock", + "src": "16113:167:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16130:9:70", + "nodeType": "YulIdentifier", + "src": "16130:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "16145:6:70", + "nodeType": "YulIdentifier", + "src": "16145:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16161:3:70", + "nodeType": "YulLiteral", + "src": "16161:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "16166:1:70", + "nodeType": "YulLiteral", + "src": "16166:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16157:3:70", + "nodeType": "YulIdentifier", + "src": "16157:3:70" + }, + "nativeSrc": "16157:11:70", + "nodeType": "YulFunctionCall", + "src": "16157:11:70" + }, + { + "kind": "number", + "nativeSrc": "16170:1:70", + "nodeType": "YulLiteral", + "src": "16170:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16153:3:70", + "nodeType": "YulIdentifier", + "src": "16153:3:70" + }, + "nativeSrc": "16153:19:70", + "nodeType": "YulFunctionCall", + "src": "16153:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "16141:3:70", + "nodeType": "YulIdentifier", + "src": "16141:3:70" + }, + "nativeSrc": "16141:32:70", + "nodeType": "YulFunctionCall", + "src": "16141:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16123:6:70", + "nodeType": "YulIdentifier", + "src": "16123:6:70" + }, + "nativeSrc": "16123:51:70", + "nodeType": "YulFunctionCall", + "src": "16123:51:70" + }, + "nativeSrc": "16123:51:70", + "nodeType": "YulExpressionStatement", + "src": "16123:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16194:9:70", + "nodeType": "YulIdentifier", + "src": "16194:9:70" + }, + { + "kind": "number", + "nativeSrc": "16205:2:70", + "nodeType": "YulLiteral", + "src": "16205:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16190:3:70", + "nodeType": "YulIdentifier", + "src": "16190:3:70" + }, + "nativeSrc": "16190:18:70", + "nodeType": "YulFunctionCall", + "src": "16190:18:70" + }, + { + "kind": "number", + "nativeSrc": "16210:2:70", + "nodeType": "YulLiteral", + "src": "16210:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16183:6:70", + "nodeType": "YulIdentifier", + "src": "16183:6:70" + }, + "nativeSrc": "16183:30:70", + "nodeType": "YulFunctionCall", + "src": "16183:30:70" + }, + "nativeSrc": "16183:30:70", + "nodeType": "YulExpressionStatement", + "src": "16183:30:70" + }, + { + "nativeSrc": "16222:52:70", + "nodeType": "YulAssignment", + "src": "16222:52:70", + "value": { + "arguments": [ + { + "name": "value1", + "nativeSrc": "16247:6:70", + "nodeType": "YulIdentifier", + "src": "16247:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16259:9:70", + "nodeType": "YulIdentifier", + "src": "16259:9:70" + }, + { + "kind": "number", + "nativeSrc": "16270:2:70", + "nodeType": "YulLiteral", + "src": "16270:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16255:3:70", + "nodeType": "YulIdentifier", + "src": "16255:3:70" + }, + "nativeSrc": "16255:18:70", + "nodeType": "YulFunctionCall", + "src": "16255:18:70" + } + ], + "functionName": { + "name": "abi_encode_bytes", + "nativeSrc": "16230:16:70", + "nodeType": "YulIdentifier", + "src": "16230:16:70" + }, + "nativeSrc": "16230:44:70", + "nodeType": "YulFunctionCall", + "src": "16230:44:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "16222:4:70", + "nodeType": "YulIdentifier", + "src": "16222:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed", + "nativeSrc": "15966:314:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "16074:9:70", + "nodeType": "YulTypedName", + "src": "16074:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "16085:6:70", + "nodeType": "YulTypedName", + "src": "16085:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "16093:6:70", + "nodeType": "YulTypedName", + "src": "16093:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "16104:4:70", + "nodeType": "YulTypedName", + "src": "16104:4:70", + "type": "" + } + ], + "src": "15966:314:70" + }, + { + "body": { + "nativeSrc": "16442:188:70", + "nodeType": "YulBlock", + "src": "16442:188:70", + "statements": [ + { + "nativeSrc": "16452:26:70", + "nodeType": "YulAssignment", + "src": "16452:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16464:9:70", + "nodeType": "YulIdentifier", + "src": "16464:9:70" + }, + { + "kind": "number", + "nativeSrc": "16475:2:70", + "nodeType": "YulLiteral", + "src": "16475:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16460:3:70", + "nodeType": "YulIdentifier", + "src": "16460:3:70" + }, + "nativeSrc": "16460:18:70", + "nodeType": "YulFunctionCall", + "src": "16460:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "16452:4:70", + "nodeType": "YulIdentifier", + "src": "16452:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16494:9:70", + "nodeType": "YulIdentifier", + "src": "16494:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "16509:6:70", + "nodeType": "YulIdentifier", + "src": "16509:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16525:3:70", + "nodeType": "YulLiteral", + "src": "16525:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "16530:1:70", + "nodeType": "YulLiteral", + "src": "16530:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16521:3:70", + "nodeType": "YulIdentifier", + "src": "16521:3:70" + }, + "nativeSrc": "16521:11:70", + "nodeType": "YulFunctionCall", + "src": "16521:11:70" + }, + { + "kind": "number", + "nativeSrc": "16534:1:70", + "nodeType": "YulLiteral", + "src": "16534:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16517:3:70", + "nodeType": "YulIdentifier", + "src": "16517:3:70" + }, + "nativeSrc": "16517:19:70", + "nodeType": "YulFunctionCall", + "src": "16517:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "16505:3:70", + "nodeType": "YulIdentifier", + "src": "16505:3:70" + }, + "nativeSrc": "16505:32:70", + "nodeType": "YulFunctionCall", + "src": "16505:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16487:6:70", + "nodeType": "YulIdentifier", + "src": "16487:6:70" + }, + "nativeSrc": "16487:51:70", + "nodeType": "YulFunctionCall", + "src": "16487:51:70" + }, + "nativeSrc": "16487:51:70", + "nodeType": "YulExpressionStatement", + "src": "16487:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16558:9:70", + "nodeType": "YulIdentifier", + "src": "16558:9:70" + }, + { + "kind": "number", + "nativeSrc": "16569:2:70", + "nodeType": "YulLiteral", + "src": "16569:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16554:3:70", + "nodeType": "YulIdentifier", + "src": "16554:3:70" + }, + "nativeSrc": "16554:18:70", + "nodeType": "YulFunctionCall", + "src": "16554:18:70" + }, + { + "name": "value1", + "nativeSrc": "16574:6:70", + "nodeType": "YulIdentifier", + "src": "16574:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16547:6:70", + "nodeType": "YulIdentifier", + "src": "16547:6:70" + }, + "nativeSrc": "16547:34:70", + "nodeType": "YulFunctionCall", + "src": "16547:34:70" + }, + "nativeSrc": "16547:34:70", + "nodeType": "YulExpressionStatement", + "src": "16547:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16601:9:70", + "nodeType": "YulIdentifier", + "src": "16601:9:70" + }, + { + "kind": "number", + "nativeSrc": "16612:2:70", + "nodeType": "YulLiteral", + "src": "16612:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16597:3:70", + "nodeType": "YulIdentifier", + "src": "16597:3:70" + }, + "nativeSrc": "16597:18:70", + "nodeType": "YulFunctionCall", + "src": "16597:18:70" + }, + { + "name": "value2", + "nativeSrc": "16617:6:70", + "nodeType": "YulIdentifier", + "src": "16617:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16590:6:70", + "nodeType": "YulIdentifier", + "src": "16590:6:70" + }, + "nativeSrc": "16590:34:70", + "nodeType": "YulFunctionCall", + "src": "16590:34:70" + }, + "nativeSrc": "16590:34:70", + "nodeType": "YulExpressionStatement", + "src": "16590:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "16285:345:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "16395:9:70", + "nodeType": "YulTypedName", + "src": "16395:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "16406:6:70", + "nodeType": "YulTypedName", + "src": "16406:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "16414:6:70", + "nodeType": "YulTypedName", + "src": "16414:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "16422:6:70", + "nodeType": "YulTypedName", + "src": "16422:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "16433:4:70", + "nodeType": "YulTypedName", + "src": "16433:4:70", + "type": "" + } + ], + "src": "16285:345:70" + }, + { + "body": { + "nativeSrc": "16764:171:70", + "nodeType": "YulBlock", + "src": "16764:171:70", + "statements": [ + { + "nativeSrc": "16774:26:70", + "nodeType": "YulAssignment", + "src": "16774:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16786:9:70", + "nodeType": "YulIdentifier", + "src": "16786:9:70" + }, + { + "kind": "number", + "nativeSrc": "16797:2:70", + "nodeType": "YulLiteral", + "src": "16797:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16782:3:70", + "nodeType": "YulIdentifier", + "src": "16782:3:70" + }, + "nativeSrc": "16782:18:70", + "nodeType": "YulFunctionCall", + "src": "16782:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "16774:4:70", + "nodeType": "YulIdentifier", + "src": "16774:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16816:9:70", + "nodeType": "YulIdentifier", + "src": "16816:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "16831:6:70", + "nodeType": "YulIdentifier", + "src": "16831:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16847:3:70", + "nodeType": "YulLiteral", + "src": "16847:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "16852:1:70", + "nodeType": "YulLiteral", + "src": "16852:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16843:3:70", + "nodeType": "YulIdentifier", + "src": "16843:3:70" + }, + "nativeSrc": "16843:11:70", + "nodeType": "YulFunctionCall", + "src": "16843:11:70" + }, + { + "kind": "number", + "nativeSrc": "16856:1:70", + "nodeType": "YulLiteral", + "src": "16856:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16839:3:70", + "nodeType": "YulIdentifier", + "src": "16839:3:70" + }, + "nativeSrc": "16839:19:70", + "nodeType": "YulFunctionCall", + "src": "16839:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "16827:3:70", + "nodeType": "YulIdentifier", + "src": "16827:3:70" + }, + "nativeSrc": "16827:32:70", + "nodeType": "YulFunctionCall", + "src": "16827:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16809:6:70", + "nodeType": "YulIdentifier", + "src": "16809:6:70" + }, + "nativeSrc": "16809:51:70", + "nodeType": "YulFunctionCall", + "src": "16809:51:70" + }, + "nativeSrc": "16809:51:70", + "nodeType": "YulExpressionStatement", + "src": "16809:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16880:9:70", + "nodeType": "YulIdentifier", + "src": "16880:9:70" + }, + { + "kind": "number", + "nativeSrc": "16891:2:70", + "nodeType": "YulLiteral", + "src": "16891:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16876:3:70", + "nodeType": "YulIdentifier", + "src": "16876:3:70" + }, + "nativeSrc": "16876:18:70", + "nodeType": "YulFunctionCall", + "src": "16876:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "16900:6:70", + "nodeType": "YulIdentifier", + "src": "16900:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16916:3:70", + "nodeType": "YulLiteral", + "src": "16916:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "16921:1:70", + "nodeType": "YulLiteral", + "src": "16921:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16912:3:70", + "nodeType": "YulIdentifier", + "src": "16912:3:70" + }, + "nativeSrc": "16912:11:70", + "nodeType": "YulFunctionCall", + "src": "16912:11:70" + }, + { + "kind": "number", + "nativeSrc": "16925:1:70", + "nodeType": "YulLiteral", + "src": "16925:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16908:3:70", + "nodeType": "YulIdentifier", + "src": "16908:3:70" + }, + "nativeSrc": "16908:19:70", + "nodeType": "YulFunctionCall", + "src": "16908:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "16896:3:70", + "nodeType": "YulIdentifier", + "src": "16896:3:70" + }, + "nativeSrc": "16896:32:70", + "nodeType": "YulFunctionCall", + "src": "16896:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16869:6:70", + "nodeType": "YulIdentifier", + "src": "16869:6:70" + }, + "nativeSrc": "16869:60:70", + "nodeType": "YulFunctionCall", + "src": "16869:60:70" + }, + "nativeSrc": "16869:60:70", + "nodeType": "YulExpressionStatement", + "src": "16869:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed", + "nativeSrc": "16635:300:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "16725:9:70", + "nodeType": "YulTypedName", + "src": "16725:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "16736:6:70", + "nodeType": "YulTypedName", + "src": "16736:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "16744:6:70", + "nodeType": "YulTypedName", + "src": "16744:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "16755:4:70", + "nodeType": "YulTypedName", + "src": "16755:4:70", + "type": "" + } + ], + "src": "16635:300:70" + }, + { + "body": { + "nativeSrc": "16999:77:70", + "nodeType": "YulBlock", + "src": "16999:77:70", + "statements": [ + { + "nativeSrc": "17009:22:70", + "nodeType": "YulAssignment", + "src": "17009:22:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "17024:6:70", + "nodeType": "YulIdentifier", + "src": "17024:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "17018:5:70", + "nodeType": "YulIdentifier", + "src": "17018:5:70" + }, + "nativeSrc": "17018:13:70", + "nodeType": "YulFunctionCall", + "src": "17018:13:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "17009:5:70", + "nodeType": "YulIdentifier", + "src": "17009:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "17064:5:70", + "nodeType": "YulIdentifier", + "src": "17064:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "17040:23:70", + "nodeType": "YulIdentifier", + "src": "17040:23:70" + }, + "nativeSrc": "17040:30:70", + "nodeType": "YulFunctionCall", + "src": "17040:30:70" + }, + "nativeSrc": "17040:30:70", + "nodeType": "YulExpressionStatement", + "src": "17040:30:70" + } + ] + }, + "name": "abi_decode_uint32_fromMemory", + "nativeSrc": "16940:136:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "16978:6:70", + "nodeType": "YulTypedName", + "src": "16978:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "16989:5:70", + "nodeType": "YulTypedName", + "src": "16989:5:70", + "type": "" + } + ], + "src": "16940:136:70" + }, + { + "body": { + "nativeSrc": "17140:77:70", + "nodeType": "YulBlock", + "src": "17140:77:70", + "statements": [ + { + "nativeSrc": "17150:22:70", + "nodeType": "YulAssignment", + "src": "17150:22:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "17165:6:70", + "nodeType": "YulIdentifier", + "src": "17165:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "17159:5:70", + "nodeType": "YulIdentifier", + "src": "17159:5:70" + }, + "nativeSrc": "17159:13:70", + "nodeType": "YulFunctionCall", + "src": "17159:13:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "17150:5:70", + "nodeType": "YulIdentifier", + "src": "17150:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "17205:5:70", + "nodeType": "YulIdentifier", + "src": "17205:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint64", + "nativeSrc": "17181:23:70", + "nodeType": "YulIdentifier", + "src": "17181:23:70" + }, + "nativeSrc": "17181:30:70", + "nodeType": "YulFunctionCall", + "src": "17181:30:70" + }, + "nativeSrc": "17181:30:70", + "nodeType": "YulExpressionStatement", + "src": "17181:30:70" + } + ] + }, + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "17081:136:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "17119:6:70", + "nodeType": "YulTypedName", + "src": "17119:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "17130:5:70", + "nodeType": "YulTypedName", + "src": "17130:5:70", + "type": "" + } + ], + "src": "17081:136:70" + }, + { + "body": { + "nativeSrc": "17330:1128:70", + "nodeType": "YulBlock", + "src": "17330:1128:70", + "statements": [ + { + "nativeSrc": "17340:43:70", + "nodeType": "YulVariableDeclaration", + "src": "17340:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "17358:7:70", + "nodeType": "YulIdentifier", + "src": "17358:7:70" + }, + { + "name": "headStart", + "nativeSrc": "17367:9:70", + "nodeType": "YulIdentifier", + "src": "17367:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "17354:3:70", + "nodeType": "YulIdentifier", + "src": "17354:3:70" + }, + "nativeSrc": "17354:23:70", + "nodeType": "YulFunctionCall", + "src": "17354:23:70" + }, + { + "kind": "number", + "nativeSrc": "17379:3:70", + "nodeType": "YulLiteral", + "src": "17379:3:70", + "type": "", + "value": "320" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "17350:3:70", + "nodeType": "YulIdentifier", + "src": "17350:3:70" + }, + "nativeSrc": "17350:33:70", + "nodeType": "YulFunctionCall", + "src": "17350:33:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "17344:2:70", + "nodeType": "YulTypedName", + "src": "17344:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "17398:16:70", + "nodeType": "YulBlock", + "src": "17398:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17407:1:70", + "nodeType": "YulLiteral", + "src": "17407:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "17410:1:70", + "nodeType": "YulLiteral", + "src": "17410:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "17400:6:70", + "nodeType": "YulIdentifier", + "src": "17400:6:70" + }, + "nativeSrc": "17400:12:70", + "nodeType": "YulFunctionCall", + "src": "17400:12:70" + }, + "nativeSrc": "17400:12:70", + "nodeType": "YulExpressionStatement", + "src": "17400:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "17395:2:70", + "nodeType": "YulIdentifier", + "src": "17395:2:70" + }, + "nativeSrc": "17392:22:70", + "nodeType": "YulIf", + "src": "17392:22:70" + }, + { + "nativeSrc": "17423:7:70", + "nodeType": "YulAssignment", + "src": "17423:7:70", + "value": { + "kind": "number", + "nativeSrc": "17429:1:70", + "nodeType": "YulLiteral", + "src": "17429:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "17423:2:70", + "nodeType": "YulIdentifier", + "src": "17423:2:70" + } + ] + }, + { + "nativeSrc": "17439:35:70", + "nodeType": "YulVariableDeclaration", + "src": "17439:35:70", + "value": { + "arguments": [], + "functionName": { + "name": "allocate_memory_2392", + "nativeSrc": "17452:20:70", + "nodeType": "YulIdentifier", + "src": "17452:20:70" + }, + "nativeSrc": "17452:22:70", + "nodeType": "YulFunctionCall", + "src": "17452:22:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "17443:5:70", + "nodeType": "YulTypedName", + "src": "17443:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "17483:17:70", + "nodeType": "YulVariableDeclaration", + "src": "17483:17:70", + "value": { + "name": "_1", + "nativeSrc": "17498:2:70", + "nodeType": "YulIdentifier", + "src": "17498:2:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "17487:7:70", + "nodeType": "YulTypedName", + "src": "17487:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "17509:27:70", + "nodeType": "YulAssignment", + "src": "17509:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "17526:9:70", + "nodeType": "YulIdentifier", + "src": "17526:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "17520:5:70", + "nodeType": "YulIdentifier", + "src": "17520:5:70" + }, + "nativeSrc": "17520:16:70", + "nodeType": "YulFunctionCall", + "src": "17520:16:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "17509:7:70", + "nodeType": "YulIdentifier", + "src": "17509:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "17552:5:70", + "nodeType": "YulIdentifier", + "src": "17552:5:70" + }, + { + "name": "value_1", + "nativeSrc": "17559:7:70", + "nodeType": "YulIdentifier", + "src": "17559:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17545:6:70", + "nodeType": "YulIdentifier", + "src": "17545:6:70" + }, + "nativeSrc": "17545:22:70", + "nodeType": "YulFunctionCall", + "src": "17545:22:70" + }, + "nativeSrc": "17545:22:70", + "nodeType": "YulExpressionStatement", + "src": "17545:22:70" + }, + { + "nativeSrc": "17576:17:70", + "nodeType": "YulVariableDeclaration", + "src": "17576:17:70", + "value": { + "name": "_1", + "nativeSrc": "17591:2:70", + "nodeType": "YulIdentifier", + "src": "17591:2:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "17580:7:70", + "nodeType": "YulTypedName", + "src": "17580:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "17602:36:70", + "nodeType": "YulAssignment", + "src": "17602:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "17623:9:70", + "nodeType": "YulIdentifier", + "src": "17623:9:70" + }, + { + "kind": "number", + "nativeSrc": "17634:2:70", + "nodeType": "YulLiteral", + "src": "17634:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17619:3:70", + "nodeType": "YulIdentifier", + "src": "17619:3:70" + }, + "nativeSrc": "17619:18:70", + "nodeType": "YulFunctionCall", + "src": "17619:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "17613:5:70", + "nodeType": "YulIdentifier", + "src": "17613:5:70" + }, + "nativeSrc": "17613:25:70", + "nodeType": "YulFunctionCall", + "src": "17613:25:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "17602:7:70", + "nodeType": "YulIdentifier", + "src": "17602:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "17658:5:70", + "nodeType": "YulIdentifier", + "src": "17658:5:70" + }, + { + "kind": "number", + "nativeSrc": "17665:2:70", + "nodeType": "YulLiteral", + "src": "17665:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17654:3:70", + "nodeType": "YulIdentifier", + "src": "17654:3:70" + }, + "nativeSrc": "17654:14:70", + "nodeType": "YulFunctionCall", + "src": "17654:14:70" + }, + { + "name": "value_2", + "nativeSrc": "17670:7:70", + "nodeType": "YulIdentifier", + "src": "17670:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17647:6:70", + "nodeType": "YulIdentifier", + "src": "17647:6:70" + }, + "nativeSrc": "17647:31:70", + "nodeType": "YulFunctionCall", + "src": "17647:31:70" + }, + "nativeSrc": "17647:31:70", + "nodeType": "YulExpressionStatement", + "src": "17647:31:70" + }, + { + "nativeSrc": "17687:17:70", + "nodeType": "YulVariableDeclaration", + "src": "17687:17:70", + "value": { + "name": "_1", + "nativeSrc": "17702:2:70", + "nodeType": "YulIdentifier", + "src": "17702:2:70" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "17691:7:70", + "nodeType": "YulTypedName", + "src": "17691:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "17713:36:70", + "nodeType": "YulAssignment", + "src": "17713:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "17734:9:70", + "nodeType": "YulIdentifier", + "src": "17734:9:70" + }, + { + "kind": "number", + "nativeSrc": "17745:2:70", + "nodeType": "YulLiteral", + "src": "17745:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17730:3:70", + "nodeType": "YulIdentifier", + "src": "17730:3:70" + }, + "nativeSrc": "17730:18:70", + "nodeType": "YulFunctionCall", + "src": "17730:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "17724:5:70", + "nodeType": "YulIdentifier", + "src": "17724:5:70" + }, + "nativeSrc": "17724:25:70", + "nodeType": "YulFunctionCall", + "src": "17724:25:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "17713:7:70", + "nodeType": "YulIdentifier", + "src": "17713:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "17769:5:70", + "nodeType": "YulIdentifier", + "src": "17769:5:70" + }, + { + "kind": "number", + "nativeSrc": "17776:2:70", + "nodeType": "YulLiteral", + "src": "17776:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17765:3:70", + "nodeType": "YulIdentifier", + "src": "17765:3:70" + }, + "nativeSrc": "17765:14:70", + "nodeType": "YulFunctionCall", + "src": "17765:14:70" + }, + { + "name": "value_3", + "nativeSrc": "17781:7:70", + "nodeType": "YulIdentifier", + "src": "17781:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17758:6:70", + "nodeType": "YulIdentifier", + "src": "17758:6:70" + }, + "nativeSrc": "17758:31:70", + "nodeType": "YulFunctionCall", + "src": "17758:31:70" + }, + "nativeSrc": "17758:31:70", + "nodeType": "YulExpressionStatement", + "src": "17758:31:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "17809:5:70", + "nodeType": "YulIdentifier", + "src": "17809:5:70" + }, + { + "kind": "number", + "nativeSrc": "17816:2:70", + "nodeType": "YulLiteral", + "src": "17816:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17805:3:70", + "nodeType": "YulIdentifier", + "src": "17805:3:70" + }, + "nativeSrc": "17805:14:70", + "nodeType": "YulFunctionCall", + "src": "17805:14:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "17854:9:70", + "nodeType": "YulIdentifier", + "src": "17854:9:70" + }, + { + "kind": "number", + "nativeSrc": "17865:2:70", + "nodeType": "YulLiteral", + "src": "17865:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17850:3:70", + "nodeType": "YulIdentifier", + "src": "17850:3:70" + }, + "nativeSrc": "17850:18:70", + "nodeType": "YulFunctionCall", + "src": "17850:18:70" + } + ], + "functionName": { + "name": "abi_decode_uint32_fromMemory", + "nativeSrc": "17821:28:70", + "nodeType": "YulIdentifier", + "src": "17821:28:70" + }, + "nativeSrc": "17821:48:70", + "nodeType": "YulFunctionCall", + "src": "17821:48:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17798:6:70", + "nodeType": "YulIdentifier", + "src": "17798:6:70" + }, + "nativeSrc": "17798:72:70", + "nodeType": "YulFunctionCall", + "src": "17798:72:70" + }, + "nativeSrc": "17798:72:70", + "nodeType": "YulExpressionStatement", + "src": "17798:72:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "17890:5:70", + "nodeType": "YulIdentifier", + "src": "17890:5:70" + }, + { + "kind": "number", + "nativeSrc": "17897:3:70", + "nodeType": "YulLiteral", + "src": "17897:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17886:3:70", + "nodeType": "YulIdentifier", + "src": "17886:3:70" + }, + "nativeSrc": "17886:15:70", + "nodeType": "YulFunctionCall", + "src": "17886:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "17936:9:70", + "nodeType": "YulIdentifier", + "src": "17936:9:70" + }, + { + "kind": "number", + "nativeSrc": "17947:3:70", + "nodeType": "YulLiteral", + "src": "17947:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17932:3:70", + "nodeType": "YulIdentifier", + "src": "17932:3:70" + }, + "nativeSrc": "17932:19:70", + "nodeType": "YulFunctionCall", + "src": "17932:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "17903:28:70", + "nodeType": "YulIdentifier", + "src": "17903:28:70" + }, + "nativeSrc": "17903:49:70", + "nodeType": "YulFunctionCall", + "src": "17903:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17879:6:70", + "nodeType": "YulIdentifier", + "src": "17879:6:70" + }, + "nativeSrc": "17879:74:70", + "nodeType": "YulFunctionCall", + "src": "17879:74:70" + }, + "nativeSrc": "17879:74:70", + "nodeType": "YulExpressionStatement", + "src": "17879:74:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "17973:5:70", + "nodeType": "YulIdentifier", + "src": "17973:5:70" + }, + { + "kind": "number", + "nativeSrc": "17980:3:70", + "nodeType": "YulLiteral", + "src": "17980:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17969:3:70", + "nodeType": "YulIdentifier", + "src": "17969:3:70" + }, + "nativeSrc": "17969:15:70", + "nodeType": "YulFunctionCall", + "src": "17969:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18019:9:70", + "nodeType": "YulIdentifier", + "src": "18019:9:70" + }, + { + "kind": "number", + "nativeSrc": "18030:3:70", + "nodeType": "YulLiteral", + "src": "18030:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18015:3:70", + "nodeType": "YulIdentifier", + "src": "18015:3:70" + }, + "nativeSrc": "18015:19:70", + "nodeType": "YulFunctionCall", + "src": "18015:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "17986:28:70", + "nodeType": "YulIdentifier", + "src": "17986:28:70" + }, + "nativeSrc": "17986:49:70", + "nodeType": "YulFunctionCall", + "src": "17986:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17962:6:70", + "nodeType": "YulIdentifier", + "src": "17962:6:70" + }, + "nativeSrc": "17962:74:70", + "nodeType": "YulFunctionCall", + "src": "17962:74:70" + }, + "nativeSrc": "17962:74:70", + "nodeType": "YulExpressionStatement", + "src": "17962:74:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "18056:5:70", + "nodeType": "YulIdentifier", + "src": "18056:5:70" + }, + { + "kind": "number", + "nativeSrc": "18063:3:70", + "nodeType": "YulLiteral", + "src": "18063:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18052:3:70", + "nodeType": "YulIdentifier", + "src": "18052:3:70" + }, + "nativeSrc": "18052:15:70", + "nodeType": "YulFunctionCall", + "src": "18052:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18102:9:70", + "nodeType": "YulIdentifier", + "src": "18102:9:70" + }, + { + "kind": "number", + "nativeSrc": "18113:3:70", + "nodeType": "YulLiteral", + "src": "18113:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18098:3:70", + "nodeType": "YulIdentifier", + "src": "18098:3:70" + }, + "nativeSrc": "18098:19:70", + "nodeType": "YulFunctionCall", + "src": "18098:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint32_fromMemory", + "nativeSrc": "18069:28:70", + "nodeType": "YulIdentifier", + "src": "18069:28:70" + }, + "nativeSrc": "18069:49:70", + "nodeType": "YulFunctionCall", + "src": "18069:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18045:6:70", + "nodeType": "YulIdentifier", + "src": "18045:6:70" + }, + "nativeSrc": "18045:74:70", + "nodeType": "YulFunctionCall", + "src": "18045:74:70" + }, + "nativeSrc": "18045:74:70", + "nodeType": "YulExpressionStatement", + "src": "18045:74:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "18139:5:70", + "nodeType": "YulIdentifier", + "src": "18139:5:70" + }, + { + "kind": "number", + "nativeSrc": "18146:3:70", + "nodeType": "YulLiteral", + "src": "18146:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18135:3:70", + "nodeType": "YulIdentifier", + "src": "18135:3:70" + }, + "nativeSrc": "18135:15:70", + "nodeType": "YulFunctionCall", + "src": "18135:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18185:9:70", + "nodeType": "YulIdentifier", + "src": "18185:9:70" + }, + { + "kind": "number", + "nativeSrc": "18196:3:70", + "nodeType": "YulLiteral", + "src": "18196:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18181:3:70", + "nodeType": "YulIdentifier", + "src": "18181:3:70" + }, + "nativeSrc": "18181:19:70", + "nodeType": "YulFunctionCall", + "src": "18181:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "18152:28:70", + "nodeType": "YulIdentifier", + "src": "18152:28:70" + }, + "nativeSrc": "18152:49:70", + "nodeType": "YulFunctionCall", + "src": "18152:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18128:6:70", + "nodeType": "YulIdentifier", + "src": "18128:6:70" + }, + "nativeSrc": "18128:74:70", + "nodeType": "YulFunctionCall", + "src": "18128:74:70" + }, + "nativeSrc": "18128:74:70", + "nodeType": "YulExpressionStatement", + "src": "18128:74:70" + }, + { + "nativeSrc": "18211:17:70", + "nodeType": "YulVariableDeclaration", + "src": "18211:17:70", + "value": { + "name": "_1", + "nativeSrc": "18226:2:70", + "nodeType": "YulIdentifier", + "src": "18226:2:70" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "18215:7:70", + "nodeType": "YulTypedName", + "src": "18215:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "18237:37:70", + "nodeType": "YulAssignment", + "src": "18237:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18258:9:70", + "nodeType": "YulIdentifier", + "src": "18258:9:70" + }, + { + "kind": "number", + "nativeSrc": "18269:3:70", + "nodeType": "YulLiteral", + "src": "18269:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18254:3:70", + "nodeType": "YulIdentifier", + "src": "18254:3:70" + }, + "nativeSrc": "18254:19:70", + "nodeType": "YulFunctionCall", + "src": "18254:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "18248:5:70", + "nodeType": "YulIdentifier", + "src": "18248:5:70" + }, + "nativeSrc": "18248:26:70", + "nodeType": "YulFunctionCall", + "src": "18248:26:70" + }, + "variableNames": [ + { + "name": "value_4", + "nativeSrc": "18237:7:70", + "nodeType": "YulIdentifier", + "src": "18237:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "18294:5:70", + "nodeType": "YulIdentifier", + "src": "18294:5:70" + }, + { + "kind": "number", + "nativeSrc": "18301:3:70", + "nodeType": "YulLiteral", + "src": "18301:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18290:3:70", + "nodeType": "YulIdentifier", + "src": "18290:3:70" + }, + "nativeSrc": "18290:15:70", + "nodeType": "YulFunctionCall", + "src": "18290:15:70" + }, + { + "name": "value_4", + "nativeSrc": "18307:7:70", + "nodeType": "YulIdentifier", + "src": "18307:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18283:6:70", + "nodeType": "YulIdentifier", + "src": "18283:6:70" + }, + "nativeSrc": "18283:32:70", + "nodeType": "YulFunctionCall", + "src": "18283:32:70" + }, + "nativeSrc": "18283:32:70", + "nodeType": "YulExpressionStatement", + "src": "18283:32:70" + }, + { + "nativeSrc": "18324:17:70", + "nodeType": "YulVariableDeclaration", + "src": "18324:17:70", + "value": { + "name": "_1", + "nativeSrc": "18339:2:70", + "nodeType": "YulIdentifier", + "src": "18339:2:70" + }, + "variables": [ + { + "name": "value_5", + "nativeSrc": "18328:7:70", + "nodeType": "YulTypedName", + "src": "18328:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "18350:37:70", + "nodeType": "YulAssignment", + "src": "18350:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18371:9:70", + "nodeType": "YulIdentifier", + "src": "18371:9:70" + }, + { + "kind": "number", + "nativeSrc": "18382:3:70", + "nodeType": "YulLiteral", + "src": "18382:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18367:3:70", + "nodeType": "YulIdentifier", + "src": "18367:3:70" + }, + "nativeSrc": "18367:19:70", + "nodeType": "YulFunctionCall", + "src": "18367:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "18361:5:70", + "nodeType": "YulIdentifier", + "src": "18361:5:70" + }, + "nativeSrc": "18361:26:70", + "nodeType": "YulFunctionCall", + "src": "18361:26:70" + }, + "variableNames": [ + { + "name": "value_5", + "nativeSrc": "18350:7:70", + "nodeType": "YulIdentifier", + "src": "18350:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "18407:5:70", + "nodeType": "YulIdentifier", + "src": "18407:5:70" + }, + { + "kind": "number", + "nativeSrc": "18414:3:70", + "nodeType": "YulLiteral", + "src": "18414:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18403:3:70", + "nodeType": "YulIdentifier", + "src": "18403:3:70" + }, + "nativeSrc": "18403:15:70", + "nodeType": "YulFunctionCall", + "src": "18403:15:70" + }, + { + "name": "value_5", + "nativeSrc": "18420:7:70", + "nodeType": "YulIdentifier", + "src": "18420:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18396:6:70", + "nodeType": "YulIdentifier", + "src": "18396:6:70" + }, + "nativeSrc": "18396:32:70", + "nodeType": "YulFunctionCall", + "src": "18396:32:70" + }, + "nativeSrc": "18396:32:70", + "nodeType": "YulExpressionStatement", + "src": "18396:32:70" + }, + { + "nativeSrc": "18437:15:70", + "nodeType": "YulAssignment", + "src": "18437:15:70", + "value": { + "name": "value", + "nativeSrc": "18447:5:70", + "nodeType": "YulIdentifier", + "src": "18447:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "18437:6:70", + "nodeType": "YulIdentifier", + "src": "18437:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_Provision_$3962_memory_ptr_fromMemory", + "nativeSrc": "17222:1236:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "17296:9:70", + "nodeType": "YulTypedName", + "src": "17296:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "17307:7:70", + "nodeType": "YulTypedName", + "src": "17307:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "17319:6:70", + "nodeType": "YulTypedName", + "src": "17319:6:70", + "type": "" + } + ], + "src": "17222:1236:70" + }, + { + "body": { + "nativeSrc": "18704:294:70", + "nodeType": "YulBlock", + "src": "18704:294:70", + "statements": [ + { + "nativeSrc": "18714:27:70", + "nodeType": "YulAssignment", + "src": "18714:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18726:9:70", + "nodeType": "YulIdentifier", + "src": "18726:9:70" + }, + { + "kind": "number", + "nativeSrc": "18737:3:70", + "nodeType": "YulLiteral", + "src": "18737:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18722:3:70", + "nodeType": "YulIdentifier", + "src": "18722:3:70" + }, + "nativeSrc": "18722:19:70", + "nodeType": "YulFunctionCall", + "src": "18722:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "18714:4:70", + "nodeType": "YulIdentifier", + "src": "18714:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18757:9:70", + "nodeType": "YulIdentifier", + "src": "18757:9:70" + }, + { + "name": "value0", + "nativeSrc": "18768:6:70", + "nodeType": "YulIdentifier", + "src": "18768:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18750:6:70", + "nodeType": "YulIdentifier", + "src": "18750:6:70" + }, + "nativeSrc": "18750:25:70", + "nodeType": "YulFunctionCall", + "src": "18750:25:70" + }, + "nativeSrc": "18750:25:70", + "nodeType": "YulExpressionStatement", + "src": "18750:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18795:9:70", + "nodeType": "YulIdentifier", + "src": "18795:9:70" + }, + { + "kind": "number", + "nativeSrc": "18806:2:70", + "nodeType": "YulLiteral", + "src": "18806:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18791:3:70", + "nodeType": "YulIdentifier", + "src": "18791:3:70" + }, + "nativeSrc": "18791:18:70", + "nodeType": "YulFunctionCall", + "src": "18791:18:70" + }, + { + "name": "value1", + "nativeSrc": "18811:6:70", + "nodeType": "YulIdentifier", + "src": "18811:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18784:6:70", + "nodeType": "YulIdentifier", + "src": "18784:6:70" + }, + "nativeSrc": "18784:34:70", + "nodeType": "YulFunctionCall", + "src": "18784:34:70" + }, + "nativeSrc": "18784:34:70", + "nodeType": "YulExpressionStatement", + "src": "18784:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18838:9:70", + "nodeType": "YulIdentifier", + "src": "18838:9:70" + }, + { + "kind": "number", + "nativeSrc": "18849:2:70", + "nodeType": "YulLiteral", + "src": "18849:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18834:3:70", + "nodeType": "YulIdentifier", + "src": "18834:3:70" + }, + "nativeSrc": "18834:18:70", + "nodeType": "YulFunctionCall", + "src": "18834:18:70" + }, + { + "name": "value2", + "nativeSrc": "18854:6:70", + "nodeType": "YulIdentifier", + "src": "18854:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18827:6:70", + "nodeType": "YulIdentifier", + "src": "18827:6:70" + }, + "nativeSrc": "18827:34:70", + "nodeType": "YulFunctionCall", + "src": "18827:34:70" + }, + "nativeSrc": "18827:34:70", + "nodeType": "YulExpressionStatement", + "src": "18827:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18881:9:70", + "nodeType": "YulIdentifier", + "src": "18881:9:70" + }, + { + "kind": "number", + "nativeSrc": "18892:2:70", + "nodeType": "YulLiteral", + "src": "18892:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18877:3:70", + "nodeType": "YulIdentifier", + "src": "18877:3:70" + }, + "nativeSrc": "18877:18:70", + "nodeType": "YulFunctionCall", + "src": "18877:18:70" + }, + { + "name": "value3", + "nativeSrc": "18897:6:70", + "nodeType": "YulIdentifier", + "src": "18897:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18870:6:70", + "nodeType": "YulIdentifier", + "src": "18870:6:70" + }, + "nativeSrc": "18870:34:70", + "nodeType": "YulFunctionCall", + "src": "18870:34:70" + }, + "nativeSrc": "18870:34:70", + "nodeType": "YulExpressionStatement", + "src": "18870:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18924:9:70", + "nodeType": "YulIdentifier", + "src": "18924:9:70" + }, + { + "kind": "number", + "nativeSrc": "18935:3:70", + "nodeType": "YulLiteral", + "src": "18935:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18920:3:70", + "nodeType": "YulIdentifier", + "src": "18920:3:70" + }, + "nativeSrc": "18920:19:70", + "nodeType": "YulFunctionCall", + "src": "18920:19:70" + }, + { + "name": "value4", + "nativeSrc": "18941:6:70", + "nodeType": "YulIdentifier", + "src": "18941:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18913:6:70", + "nodeType": "YulIdentifier", + "src": "18913:6:70" + }, + "nativeSrc": "18913:35:70", + "nodeType": "YulFunctionCall", + "src": "18913:35:70" + }, + "nativeSrc": "18913:35:70", + "nodeType": "YulExpressionStatement", + "src": "18913:35:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "18968:9:70", + "nodeType": "YulIdentifier", + "src": "18968:9:70" + }, + { + "kind": "number", + "nativeSrc": "18979:3:70", + "nodeType": "YulLiteral", + "src": "18979:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18964:3:70", + "nodeType": "YulIdentifier", + "src": "18964:3:70" + }, + "nativeSrc": "18964:19:70", + "nodeType": "YulFunctionCall", + "src": "18964:19:70" + }, + { + "name": "value5", + "nativeSrc": "18985:6:70", + "nodeType": "YulIdentifier", + "src": "18985:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "18957:6:70", + "nodeType": "YulIdentifier", + "src": "18957:6:70" + }, + "nativeSrc": "18957:35:70", + "nodeType": "YulFunctionCall", + "src": "18957:35:70" + }, + "nativeSrc": "18957:35:70", + "nodeType": "YulExpressionStatement", + "src": "18957:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32__fromStack_reversed", + "nativeSrc": "18463:535:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "18633:9:70", + "nodeType": "YulTypedName", + "src": "18633:9:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "18644:6:70", + "nodeType": "YulTypedName", + "src": "18644:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "18652:6:70", + "nodeType": "YulTypedName", + "src": "18652:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "18660:6:70", + "nodeType": "YulTypedName", + "src": "18660:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "18668:6:70", + "nodeType": "YulTypedName", + "src": "18668:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "18676:6:70", + "nodeType": "YulTypedName", + "src": "18676:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "18684:6:70", + "nodeType": "YulTypedName", + "src": "18684:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "18695:4:70", + "nodeType": "YulTypedName", + "src": "18695:4:70", + "type": "" + } + ], + "src": "18463:535:70" + }, + { + "body": { + "nativeSrc": "19049:171:70", + "nodeType": "YulBlock", + "src": "19049:171:70", + "statements": [ + { + "body": { + "nativeSrc": "19080:111:70", + "nodeType": "YulBlock", + "src": "19080:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19101:1:70", + "nodeType": "YulLiteral", + "src": "19101:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19108:3:70", + "nodeType": "YulLiteral", + "src": "19108:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "19113:10:70", + "nodeType": "YulLiteral", + "src": "19113:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "19104:3:70", + "nodeType": "YulIdentifier", + "src": "19104:3:70" + }, + "nativeSrc": "19104:20:70", + "nodeType": "YulFunctionCall", + "src": "19104:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19094:6:70", + "nodeType": "YulIdentifier", + "src": "19094:6:70" + }, + "nativeSrc": "19094:31:70", + "nodeType": "YulFunctionCall", + "src": "19094:31:70" + }, + "nativeSrc": "19094:31:70", + "nodeType": "YulExpressionStatement", + "src": "19094:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19145:1:70", + "nodeType": "YulLiteral", + "src": "19145:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "19148:4:70", + "nodeType": "YulLiteral", + "src": "19148:4:70", + "type": "", + "value": "0x12" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19138:6:70", + "nodeType": "YulIdentifier", + "src": "19138:6:70" + }, + "nativeSrc": "19138:15:70", + "nodeType": "YulFunctionCall", + "src": "19138:15:70" + }, + "nativeSrc": "19138:15:70", + "nodeType": "YulExpressionStatement", + "src": "19138:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19173:1:70", + "nodeType": "YulLiteral", + "src": "19173:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "19176:4:70", + "nodeType": "YulLiteral", + "src": "19176:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "19166:6:70", + "nodeType": "YulIdentifier", + "src": "19166:6:70" + }, + "nativeSrc": "19166:15:70", + "nodeType": "YulFunctionCall", + "src": "19166:15:70" + }, + "nativeSrc": "19166:15:70", + "nodeType": "YulExpressionStatement", + "src": "19166:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "y", + "nativeSrc": "19069:1:70", + "nodeType": "YulIdentifier", + "src": "19069:1:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "19062:6:70", + "nodeType": "YulIdentifier", + "src": "19062:6:70" + }, + "nativeSrc": "19062:9:70", + "nodeType": "YulFunctionCall", + "src": "19062:9:70" + }, + "nativeSrc": "19059:132:70", + "nodeType": "YulIf", + "src": "19059:132:70" + }, + { + "nativeSrc": "19200:14:70", + "nodeType": "YulAssignment", + "src": "19200:14:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "19209:1:70", + "nodeType": "YulIdentifier", + "src": "19209:1:70" + }, + { + "name": "y", + "nativeSrc": "19212:1:70", + "nodeType": "YulIdentifier", + "src": "19212:1:70" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "19205:3:70", + "nodeType": "YulIdentifier", + "src": "19205:3:70" + }, + "nativeSrc": "19205:9:70", + "nodeType": "YulFunctionCall", + "src": "19205:9:70" + }, + "variableNames": [ + { + "name": "r", + "nativeSrc": "19200:1:70", + "nodeType": "YulIdentifier", + "src": "19200:1:70" + } + ] + } + ] + }, + "name": "checked_div_t_uint256", + "nativeSrc": "19003:217:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "19034:1:70", + "nodeType": "YulTypedName", + "src": "19034:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "19037:1:70", + "nodeType": "YulTypedName", + "src": "19037:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "r", + "nativeSrc": "19043:1:70", + "nodeType": "YulTypedName", + "src": "19043:1:70", + "type": "" + } + ], + "src": "19003:217:70" + }, + { + "body": { + "nativeSrc": "19330:147:70", + "nodeType": "YulBlock", + "src": "19330:147:70", + "statements": [ + { + "body": { + "nativeSrc": "19377:16:70", + "nodeType": "YulBlock", + "src": "19377:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19386:1:70", + "nodeType": "YulLiteral", + "src": "19386:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "19389:1:70", + "nodeType": "YulLiteral", + "src": "19389:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "19379:6:70", + "nodeType": "YulIdentifier", + "src": "19379:6:70" + }, + "nativeSrc": "19379:12:70", + "nodeType": "YulFunctionCall", + "src": "19379:12:70" + }, + "nativeSrc": "19379:12:70", + "nodeType": "YulExpressionStatement", + "src": "19379:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "19351:7:70", + "nodeType": "YulIdentifier", + "src": "19351:7:70" + }, + { + "name": "headStart", + "nativeSrc": "19360:9:70", + "nodeType": "YulIdentifier", + "src": "19360:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "19347:3:70", + "nodeType": "YulIdentifier", + "src": "19347:3:70" + }, + "nativeSrc": "19347:23:70", + "nodeType": "YulFunctionCall", + "src": "19347:23:70" + }, + { + "kind": "number", + "nativeSrc": "19372:3:70", + "nodeType": "YulLiteral", + "src": "19372:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "19343:3:70", + "nodeType": "YulIdentifier", + "src": "19343:3:70" + }, + "nativeSrc": "19343:33:70", + "nodeType": "YulFunctionCall", + "src": "19343:33:70" + }, + "nativeSrc": "19340:53:70", + "nodeType": "YulIf", + "src": "19340:53:70" + }, + { + "nativeSrc": "19402:69:70", + "nodeType": "YulAssignment", + "src": "19402:69:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19452:9:70", + "nodeType": "YulIdentifier", + "src": "19452:9:70" + }, + { + "name": "dataEnd", + "nativeSrc": "19463:7:70", + "nodeType": "YulIdentifier", + "src": "19463:7:70" + } + ], + "functionName": { + "name": "abi_decode_struct_Allocation_fromMemory", + "nativeSrc": "19412:39:70", + "nodeType": "YulIdentifier", + "src": "19412:39:70" + }, + "nativeSrc": "19412:59:70", + "nodeType": "YulFunctionCall", + "src": "19412:59:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "19402:6:70", + "nodeType": "YulIdentifier", + "src": "19402:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_State_$15663_memory_ptr_fromMemory", + "nativeSrc": "19225:252:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "19296:9:70", + "nodeType": "YulTypedName", + "src": "19296:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "19307:7:70", + "nodeType": "YulTypedName", + "src": "19307:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "19319:6:70", + "nodeType": "YulTypedName", + "src": "19319:6:70", + "type": "" + } + ], + "src": "19225:252:70" + }, + { + "body": { + "nativeSrc": "19639:214:70", + "nodeType": "YulBlock", + "src": "19639:214:70", + "statements": [ + { + "nativeSrc": "19649:26:70", + "nodeType": "YulAssignment", + "src": "19649:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19661:9:70", + "nodeType": "YulIdentifier", + "src": "19661:9:70" + }, + { + "kind": "number", + "nativeSrc": "19672:2:70", + "nodeType": "YulLiteral", + "src": "19672:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19657:3:70", + "nodeType": "YulIdentifier", + "src": "19657:3:70" + }, + "nativeSrc": "19657:18:70", + "nodeType": "YulFunctionCall", + "src": "19657:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "19649:4:70", + "nodeType": "YulIdentifier", + "src": "19649:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19691:9:70", + "nodeType": "YulIdentifier", + "src": "19691:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "19706:6:70", + "nodeType": "YulIdentifier", + "src": "19706:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19722:3:70", + "nodeType": "YulLiteral", + "src": "19722:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "19727:1:70", + "nodeType": "YulLiteral", + "src": "19727:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "19718:3:70", + "nodeType": "YulIdentifier", + "src": "19718:3:70" + }, + "nativeSrc": "19718:11:70", + "nodeType": "YulFunctionCall", + "src": "19718:11:70" + }, + { + "kind": "number", + "nativeSrc": "19731:1:70", + "nodeType": "YulLiteral", + "src": "19731:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "19714:3:70", + "nodeType": "YulIdentifier", + "src": "19714:3:70" + }, + "nativeSrc": "19714:19:70", + "nodeType": "YulFunctionCall", + "src": "19714:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "19702:3:70", + "nodeType": "YulIdentifier", + "src": "19702:3:70" + }, + "nativeSrc": "19702:32:70", + "nodeType": "YulFunctionCall", + "src": "19702:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19684:6:70", + "nodeType": "YulIdentifier", + "src": "19684:6:70" + }, + "nativeSrc": "19684:51:70", + "nodeType": "YulFunctionCall", + "src": "19684:51:70" + }, + "nativeSrc": "19684:51:70", + "nodeType": "YulExpressionStatement", + "src": "19684:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19755:9:70", + "nodeType": "YulIdentifier", + "src": "19755:9:70" + }, + { + "kind": "number", + "nativeSrc": "19766:2:70", + "nodeType": "YulLiteral", + "src": "19766:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19751:3:70", + "nodeType": "YulIdentifier", + "src": "19751:3:70" + }, + "nativeSrc": "19751:18:70", + "nodeType": "YulFunctionCall", + "src": "19751:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "19775:6:70", + "nodeType": "YulIdentifier", + "src": "19775:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19791:3:70", + "nodeType": "YulLiteral", + "src": "19791:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "19796:1:70", + "nodeType": "YulLiteral", + "src": "19796:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "19787:3:70", + "nodeType": "YulIdentifier", + "src": "19787:3:70" + }, + "nativeSrc": "19787:11:70", + "nodeType": "YulFunctionCall", + "src": "19787:11:70" + }, + { + "kind": "number", + "nativeSrc": "19800:1:70", + "nodeType": "YulLiteral", + "src": "19800:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "19783:3:70", + "nodeType": "YulIdentifier", + "src": "19783:3:70" + }, + "nativeSrc": "19783:19:70", + "nodeType": "YulFunctionCall", + "src": "19783:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "19771:3:70", + "nodeType": "YulIdentifier", + "src": "19771:3:70" + }, + "nativeSrc": "19771:32:70", + "nodeType": "YulFunctionCall", + "src": "19771:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19744:6:70", + "nodeType": "YulIdentifier", + "src": "19744:6:70" + }, + "nativeSrc": "19744:60:70", + "nodeType": "YulFunctionCall", + "src": "19744:60:70" + }, + "nativeSrc": "19744:60:70", + "nodeType": "YulExpressionStatement", + "src": "19744:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19824:9:70", + "nodeType": "YulIdentifier", + "src": "19824:9:70" + }, + { + "kind": "number", + "nativeSrc": "19835:2:70", + "nodeType": "YulLiteral", + "src": "19835:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19820:3:70", + "nodeType": "YulIdentifier", + "src": "19820:3:70" + }, + "nativeSrc": "19820:18:70", + "nodeType": "YulFunctionCall", + "src": "19820:18:70" + }, + { + "name": "value2", + "nativeSrc": "19840:6:70", + "nodeType": "YulIdentifier", + "src": "19840:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19813:6:70", + "nodeType": "YulIdentifier", + "src": "19813:6:70" + }, + "nativeSrc": "19813:34:70", + "nodeType": "YulFunctionCall", + "src": "19813:34:70" + }, + "nativeSrc": "19813:34:70", + "nodeType": "YulExpressionStatement", + "src": "19813:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed", + "nativeSrc": "19482:371:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "19592:9:70", + "nodeType": "YulTypedName", + "src": "19592:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "19603:6:70", + "nodeType": "YulTypedName", + "src": "19603:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "19611:6:70", + "nodeType": "YulTypedName", + "src": "19611:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "19619:6:70", + "nodeType": "YulTypedName", + "src": "19619:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "19630:4:70", + "nodeType": "YulTypedName", + "src": "19630:4:70", + "type": "" + } + ], + "src": "19482:371:70" + }, + { + "body": { + "nativeSrc": "19936:167:70", + "nodeType": "YulBlock", + "src": "19936:167:70", + "statements": [ + { + "body": { + "nativeSrc": "19982:16:70", + "nodeType": "YulBlock", + "src": "19982:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19991:1:70", + "nodeType": "YulLiteral", + "src": "19991:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "19994:1:70", + "nodeType": "YulLiteral", + "src": "19994:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "19984:6:70", + "nodeType": "YulIdentifier", + "src": "19984:6:70" + }, + "nativeSrc": "19984:12:70", + "nodeType": "YulFunctionCall", + "src": "19984:12:70" + }, + "nativeSrc": "19984:12:70", + "nodeType": "YulExpressionStatement", + "src": "19984:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "19957:7:70", + "nodeType": "YulIdentifier", + "src": "19957:7:70" + }, + { + "name": "headStart", + "nativeSrc": "19966:9:70", + "nodeType": "YulIdentifier", + "src": "19966:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "19953:3:70", + "nodeType": "YulIdentifier", + "src": "19953:3:70" + }, + "nativeSrc": "19953:23:70", + "nodeType": "YulFunctionCall", + "src": "19953:23:70" + }, + { + "kind": "number", + "nativeSrc": "19978:2:70", + "nodeType": "YulLiteral", + "src": "19978:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "19949:3:70", + "nodeType": "YulIdentifier", + "src": "19949:3:70" + }, + "nativeSrc": "19949:32:70", + "nodeType": "YulFunctionCall", + "src": "19949:32:70" + }, + "nativeSrc": "19946:52:70", + "nodeType": "YulIf", + "src": "19946:52:70" + }, + { + "nativeSrc": "20007:29:70", + "nodeType": "YulVariableDeclaration", + "src": "20007:29:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20026:9:70", + "nodeType": "YulIdentifier", + "src": "20026:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "20020:5:70", + "nodeType": "YulIdentifier", + "src": "20020:5:70" + }, + "nativeSrc": "20020:16:70", + "nodeType": "YulFunctionCall", + "src": "20020:16:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "20011:5:70", + "nodeType": "YulTypedName", + "src": "20011:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "20067:5:70", + "nodeType": "YulIdentifier", + "src": "20067:5:70" + } + ], + "functionName": { + "name": "validator_revert_bool", + "nativeSrc": "20045:21:70", + "nodeType": "YulIdentifier", + "src": "20045:21:70" + }, + "nativeSrc": "20045:28:70", + "nodeType": "YulFunctionCall", + "src": "20045:28:70" + }, + "nativeSrc": "20045:28:70", + "nodeType": "YulExpressionStatement", + "src": "20045:28:70" + }, + { + "nativeSrc": "20082:15:70", + "nodeType": "YulAssignment", + "src": "20082:15:70", + "value": { + "name": "value", + "nativeSrc": "20092:5:70", + "nodeType": "YulIdentifier", + "src": "20092:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "20082:6:70", + "nodeType": "YulIdentifier", + "src": "20082:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bool_fromMemory", + "nativeSrc": "19858:245:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "19902:9:70", + "nodeType": "YulTypedName", + "src": "19902:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "19913:7:70", + "nodeType": "YulTypedName", + "src": "19913:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "19925:6:70", + "nodeType": "YulTypedName", + "src": "19925:6:70", + "type": "" + } + ], + "src": "19858:245:70" + }, + { + "body": { + "nativeSrc": "20282:158:70", + "nodeType": "YulBlock", + "src": "20282:158:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20299:9:70", + "nodeType": "YulIdentifier", + "src": "20299:9:70" + }, + { + "kind": "number", + "nativeSrc": "20310:2:70", + "nodeType": "YulLiteral", + "src": "20310:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20292:6:70", + "nodeType": "YulIdentifier", + "src": "20292:6:70" + }, + "nativeSrc": "20292:21:70", + "nodeType": "YulFunctionCall", + "src": "20292:21:70" + }, + "nativeSrc": "20292:21:70", + "nodeType": "YulExpressionStatement", + "src": "20292:21:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20333:9:70", + "nodeType": "YulIdentifier", + "src": "20333:9:70" + }, + { + "kind": "number", + "nativeSrc": "20344:2:70", + "nodeType": "YulLiteral", + "src": "20344:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20329:3:70", + "nodeType": "YulIdentifier", + "src": "20329:3:70" + }, + "nativeSrc": "20329:18:70", + "nodeType": "YulFunctionCall", + "src": "20329:18:70" + }, + { + "kind": "number", + "nativeSrc": "20349:1:70", + "nodeType": "YulLiteral", + "src": "20349:1:70", + "type": "", + "value": "9" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20322:6:70", + "nodeType": "YulIdentifier", + "src": "20322:6:70" + }, + "nativeSrc": "20322:29:70", + "nodeType": "YulFunctionCall", + "src": "20322:29:70" + }, + "nativeSrc": "20322:29:70", + "nodeType": "YulExpressionStatement", + "src": "20322:29:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20371:9:70", + "nodeType": "YulIdentifier", + "src": "20371:9:70" + }, + { + "kind": "number", + "nativeSrc": "20382:2:70", + "nodeType": "YulLiteral", + "src": "20382:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20367:3:70", + "nodeType": "YulIdentifier", + "src": "20367:3:70" + }, + "nativeSrc": "20367:18:70", + "nodeType": "YulFunctionCall", + "src": "20367:18:70" + }, + { + "hexValue": "217472616e73666572", + "kind": "string", + "nativeSrc": "20387:11:70", + "nodeType": "YulLiteral", + "src": "20387:11:70", + "type": "", + "value": "!transfer" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20360:6:70", + "nodeType": "YulIdentifier", + "src": "20360:6:70" + }, + "nativeSrc": "20360:39:70", + "nodeType": "YulFunctionCall", + "src": "20360:39:70" + }, + "nativeSrc": "20360:39:70", + "nodeType": "YulExpressionStatement", + "src": "20360:39:70" + }, + { + "nativeSrc": "20408:26:70", + "nodeType": "YulAssignment", + "src": "20408:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20420:9:70", + "nodeType": "YulIdentifier", + "src": "20420:9:70" + }, + { + "kind": "number", + "nativeSrc": "20431:2:70", + "nodeType": "YulLiteral", + "src": "20431:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20416:3:70", + "nodeType": "YulIdentifier", + "src": "20416:3:70" + }, + "nativeSrc": "20416:18:70", + "nodeType": "YulFunctionCall", + "src": "20416:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "20408:4:70", + "nodeType": "YulIdentifier", + "src": "20408:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50__to_t_string_memory_ptr__fromStack_reversed", + "nativeSrc": "20108:332:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "20259:9:70", + "nodeType": "YulTypedName", + "src": "20259:9:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "20273:4:70", + "nodeType": "YulTypedName", + "src": "20273:4:70", + "type": "" + } + ], + "src": "20108:332:70" + }, + { + "body": { + "nativeSrc": "20592:139:70", + "nodeType": "YulBlock", + "src": "20592:139:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "20609:3:70", + "nodeType": "YulIdentifier", + "src": "20609:3:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20622:2:70", + "nodeType": "YulLiteral", + "src": "20622:2:70", + "type": "", + "value": "96" + }, + { + "name": "value0", + "nativeSrc": "20626:6:70", + "nodeType": "YulIdentifier", + "src": "20626:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "20618:3:70", + "nodeType": "YulIdentifier", + "src": "20618:3:70" + }, + "nativeSrc": "20618:15:70", + "nodeType": "YulFunctionCall", + "src": "20618:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20647:2:70", + "nodeType": "YulLiteral", + "src": "20647:2:70", + "type": "", + "value": "96" + }, + { + "kind": "number", + "nativeSrc": "20651:1:70", + "nodeType": "YulLiteral", + "src": "20651:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "20643:3:70", + "nodeType": "YulIdentifier", + "src": "20643:3:70" + }, + "nativeSrc": "20643:10:70", + "nodeType": "YulFunctionCall", + "src": "20643:10:70" + }, + { + "kind": "number", + "nativeSrc": "20655:1:70", + "nodeType": "YulLiteral", + "src": "20655:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "20639:3:70", + "nodeType": "YulIdentifier", + "src": "20639:3:70" + }, + "nativeSrc": "20639:18:70", + "nodeType": "YulFunctionCall", + "src": "20639:18:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "20635:3:70", + "nodeType": "YulIdentifier", + "src": "20635:3:70" + }, + "nativeSrc": "20635:23:70", + "nodeType": "YulFunctionCall", + "src": "20635:23:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "20614:3:70", + "nodeType": "YulIdentifier", + "src": "20614:3:70" + }, + "nativeSrc": "20614:45:70", + "nodeType": "YulFunctionCall", + "src": "20614:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20602:6:70", + "nodeType": "YulIdentifier", + "src": "20602:6:70" + }, + "nativeSrc": "20602:58:70", + "nodeType": "YulFunctionCall", + "src": "20602:58:70" + }, + "nativeSrc": "20602:58:70", + "nodeType": "YulExpressionStatement", + "src": "20602:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "20680:3:70", + "nodeType": "YulIdentifier", + "src": "20680:3:70" + }, + { + "kind": "number", + "nativeSrc": "20685:2:70", + "nodeType": "YulLiteral", + "src": "20685:2:70", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20676:3:70", + "nodeType": "YulIdentifier", + "src": "20676:3:70" + }, + "nativeSrc": "20676:12:70", + "nodeType": "YulFunctionCall", + "src": "20676:12:70" + }, + { + "name": "value1", + "nativeSrc": "20690:6:70", + "nodeType": "YulIdentifier", + "src": "20690:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20669:6:70", + "nodeType": "YulIdentifier", + "src": "20669:6:70" + }, + "nativeSrc": "20669:28:70", + "nodeType": "YulFunctionCall", + "src": "20669:28:70" + }, + "nativeSrc": "20669:28:70", + "nodeType": "YulExpressionStatement", + "src": "20669:28:70" + }, + { + "nativeSrc": "20706:19:70", + "nodeType": "YulAssignment", + "src": "20706:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "20717:3:70", + "nodeType": "YulIdentifier", + "src": "20717:3:70" + }, + { + "kind": "number", + "nativeSrc": "20722:2:70", + "nodeType": "YulLiteral", + "src": "20722:2:70", + "type": "", + "value": "52" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20713:3:70", + "nodeType": "YulIdentifier", + "src": "20713:3:70" + }, + "nativeSrc": "20713:12:70", + "nodeType": "YulFunctionCall", + "src": "20713:12:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "20706:3:70", + "nodeType": "YulIdentifier", + "src": "20706:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_address_t_bytes32__to_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "20445:286:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "20560:3:70", + "nodeType": "YulTypedName", + "src": "20560:3:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "20565:6:70", + "nodeType": "YulTypedName", + "src": "20565:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "20573:6:70", + "nodeType": "YulTypedName", + "src": "20573:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "20584:3:70", + "nodeType": "YulTypedName", + "src": "20584:3:70", + "type": "" + } + ], + "src": "20445:286:70" + }, + { + "body": { + "nativeSrc": "20949:276:70", + "nodeType": "YulBlock", + "src": "20949:276:70", + "statements": [ + { + "nativeSrc": "20959:27:70", + "nodeType": "YulAssignment", + "src": "20959:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20971:9:70", + "nodeType": "YulIdentifier", + "src": "20971:9:70" + }, + { + "kind": "number", + "nativeSrc": "20982:3:70", + "nodeType": "YulLiteral", + "src": "20982:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20967:3:70", + "nodeType": "YulIdentifier", + "src": "20967:3:70" + }, + "nativeSrc": "20967:19:70", + "nodeType": "YulFunctionCall", + "src": "20967:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "20959:4:70", + "nodeType": "YulIdentifier", + "src": "20959:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21002:9:70", + "nodeType": "YulIdentifier", + "src": "21002:9:70" + }, + { + "name": "value0", + "nativeSrc": "21013:6:70", + "nodeType": "YulIdentifier", + "src": "21013:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20995:6:70", + "nodeType": "YulIdentifier", + "src": "20995:6:70" + }, + "nativeSrc": "20995:25:70", + "nodeType": "YulFunctionCall", + "src": "20995:25:70" + }, + "nativeSrc": "20995:25:70", + "nodeType": "YulExpressionStatement", + "src": "20995:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21040:9:70", + "nodeType": "YulIdentifier", + "src": "21040:9:70" + }, + { + "kind": "number", + "nativeSrc": "21051:2:70", + "nodeType": "YulLiteral", + "src": "21051:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21036:3:70", + "nodeType": "YulIdentifier", + "src": "21036:3:70" + }, + "nativeSrc": "21036:18:70", + "nodeType": "YulFunctionCall", + "src": "21036:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "21060:6:70", + "nodeType": "YulIdentifier", + "src": "21060:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21076:3:70", + "nodeType": "YulLiteral", + "src": "21076:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "21081:1:70", + "nodeType": "YulLiteral", + "src": "21081:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "21072:3:70", + "nodeType": "YulIdentifier", + "src": "21072:3:70" + }, + "nativeSrc": "21072:11:70", + "nodeType": "YulFunctionCall", + "src": "21072:11:70" + }, + { + "kind": "number", + "nativeSrc": "21085:1:70", + "nodeType": "YulLiteral", + "src": "21085:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "21068:3:70", + "nodeType": "YulIdentifier", + "src": "21068:3:70" + }, + "nativeSrc": "21068:19:70", + "nodeType": "YulFunctionCall", + "src": "21068:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "21056:3:70", + "nodeType": "YulIdentifier", + "src": "21056:3:70" + }, + "nativeSrc": "21056:32:70", + "nodeType": "YulFunctionCall", + "src": "21056:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21029:6:70", + "nodeType": "YulIdentifier", + "src": "21029:6:70" + }, + "nativeSrc": "21029:60:70", + "nodeType": "YulFunctionCall", + "src": "21029:60:70" + }, + "nativeSrc": "21029:60:70", + "nodeType": "YulExpressionStatement", + "src": "21029:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21109:9:70", + "nodeType": "YulIdentifier", + "src": "21109:9:70" + }, + { + "kind": "number", + "nativeSrc": "21120:2:70", + "nodeType": "YulLiteral", + "src": "21120:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21105:3:70", + "nodeType": "YulIdentifier", + "src": "21105:3:70" + }, + "nativeSrc": "21105:18:70", + "nodeType": "YulFunctionCall", + "src": "21105:18:70" + }, + { + "name": "value2", + "nativeSrc": "21125:6:70", + "nodeType": "YulIdentifier", + "src": "21125:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21098:6:70", + "nodeType": "YulIdentifier", + "src": "21098:6:70" + }, + "nativeSrc": "21098:34:70", + "nodeType": "YulFunctionCall", + "src": "21098:34:70" + }, + "nativeSrc": "21098:34:70", + "nodeType": "YulExpressionStatement", + "src": "21098:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21152:9:70", + "nodeType": "YulIdentifier", + "src": "21152:9:70" + }, + { + "kind": "number", + "nativeSrc": "21163:2:70", + "nodeType": "YulLiteral", + "src": "21163:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21148:3:70", + "nodeType": "YulIdentifier", + "src": "21148:3:70" + }, + "nativeSrc": "21148:18:70", + "nodeType": "YulFunctionCall", + "src": "21148:18:70" + }, + { + "name": "value3", + "nativeSrc": "21168:6:70", + "nodeType": "YulIdentifier", + "src": "21168:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21141:6:70", + "nodeType": "YulIdentifier", + "src": "21141:6:70" + }, + "nativeSrc": "21141:34:70", + "nodeType": "YulFunctionCall", + "src": "21141:34:70" + }, + "nativeSrc": "21141:34:70", + "nodeType": "YulExpressionStatement", + "src": "21141:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21195:9:70", + "nodeType": "YulIdentifier", + "src": "21195:9:70" + }, + { + "kind": "number", + "nativeSrc": "21206:3:70", + "nodeType": "YulLiteral", + "src": "21206:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21191:3:70", + "nodeType": "YulIdentifier", + "src": "21191:3:70" + }, + "nativeSrc": "21191:19:70", + "nodeType": "YulFunctionCall", + "src": "21191:19:70" + }, + { + "name": "value4", + "nativeSrc": "21212:6:70", + "nodeType": "YulIdentifier", + "src": "21212:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21184:6:70", + "nodeType": "YulIdentifier", + "src": "21184:6:70" + }, + "nativeSrc": "21184:35:70", + "nodeType": "YulFunctionCall", + "src": "21184:35:70" + }, + "nativeSrc": "21184:35:70", + "nodeType": "YulExpressionStatement", + "src": "21184:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_address_t_bytes32_t_uint256_t_uint256__to_t_uint256_t_address_t_bytes32_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "20736:489:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "20886:9:70", + "nodeType": "YulTypedName", + "src": "20886:9:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "20897:6:70", + "nodeType": "YulTypedName", + "src": "20897:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "20905:6:70", + "nodeType": "YulTypedName", + "src": "20905:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "20913:6:70", + "nodeType": "YulTypedName", + "src": "20913:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "20921:6:70", + "nodeType": "YulTypedName", + "src": "20921:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "20929:6:70", + "nodeType": "YulTypedName", + "src": "20929:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "20940:4:70", + "nodeType": "YulTypedName", + "src": "20940:4:70", + "type": "" + } + ], + "src": "20736:489:70" + }, + { + "body": { + "nativeSrc": "21415:206:70", + "nodeType": "YulBlock", + "src": "21415:206:70", + "statements": [ + { + "nativeSrc": "21425:27:70", + "nodeType": "YulAssignment", + "src": "21425:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21437:9:70", + "nodeType": "YulIdentifier", + "src": "21437:9:70" + }, + { + "kind": "number", + "nativeSrc": "21448:3:70", + "nodeType": "YulLiteral", + "src": "21448:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21433:3:70", + "nodeType": "YulIdentifier", + "src": "21433:3:70" + }, + "nativeSrc": "21433:19:70", + "nodeType": "YulFunctionCall", + "src": "21433:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "21425:4:70", + "nodeType": "YulIdentifier", + "src": "21425:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21468:9:70", + "nodeType": "YulIdentifier", + "src": "21468:9:70" + }, + { + "name": "value0", + "nativeSrc": "21479:6:70", + "nodeType": "YulIdentifier", + "src": "21479:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21461:6:70", + "nodeType": "YulIdentifier", + "src": "21461:6:70" + }, + "nativeSrc": "21461:25:70", + "nodeType": "YulFunctionCall", + "src": "21461:25:70" + }, + "nativeSrc": "21461:25:70", + "nodeType": "YulExpressionStatement", + "src": "21461:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21506:9:70", + "nodeType": "YulIdentifier", + "src": "21506:9:70" + }, + { + "kind": "number", + "nativeSrc": "21517:2:70", + "nodeType": "YulLiteral", + "src": "21517:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21502:3:70", + "nodeType": "YulIdentifier", + "src": "21502:3:70" + }, + "nativeSrc": "21502:18:70", + "nodeType": "YulFunctionCall", + "src": "21502:18:70" + }, + { + "name": "value1", + "nativeSrc": "21522:6:70", + "nodeType": "YulIdentifier", + "src": "21522:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21495:6:70", + "nodeType": "YulIdentifier", + "src": "21495:6:70" + }, + "nativeSrc": "21495:34:70", + "nodeType": "YulFunctionCall", + "src": "21495:34:70" + }, + "nativeSrc": "21495:34:70", + "nodeType": "YulExpressionStatement", + "src": "21495:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21549:9:70", + "nodeType": "YulIdentifier", + "src": "21549:9:70" + }, + { + "kind": "number", + "nativeSrc": "21560:2:70", + "nodeType": "YulLiteral", + "src": "21560:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21545:3:70", + "nodeType": "YulIdentifier", + "src": "21545:3:70" + }, + "nativeSrc": "21545:18:70", + "nodeType": "YulFunctionCall", + "src": "21545:18:70" + }, + { + "name": "value2", + "nativeSrc": "21565:6:70", + "nodeType": "YulIdentifier", + "src": "21565:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21538:6:70", + "nodeType": "YulIdentifier", + "src": "21538:6:70" + }, + "nativeSrc": "21538:34:70", + "nodeType": "YulFunctionCall", + "src": "21538:34:70" + }, + "nativeSrc": "21538:34:70", + "nodeType": "YulExpressionStatement", + "src": "21538:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "21592:9:70", + "nodeType": "YulIdentifier", + "src": "21592:9:70" + }, + { + "kind": "number", + "nativeSrc": "21603:2:70", + "nodeType": "YulLiteral", + "src": "21603:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21588:3:70", + "nodeType": "YulIdentifier", + "src": "21588:3:70" + }, + "nativeSrc": "21588:18:70", + "nodeType": "YulFunctionCall", + "src": "21588:18:70" + }, + { + "name": "value3", + "nativeSrc": "21608:6:70", + "nodeType": "YulIdentifier", + "src": "21608:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21581:6:70", + "nodeType": "YulIdentifier", + "src": "21581:6:70" + }, + "nativeSrc": "21581:34:70", + "nodeType": "YulFunctionCall", + "src": "21581:34:70" + }, + "nativeSrc": "21581:34:70", + "nodeType": "YulExpressionStatement", + "src": "21581:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_bytes32__fromStack_reversed", + "nativeSrc": "21230:391:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "21360:9:70", + "nodeType": "YulTypedName", + "src": "21360:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "21371:6:70", + "nodeType": "YulTypedName", + "src": "21371:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "21379:6:70", + "nodeType": "YulTypedName", + "src": "21379:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "21387:6:70", + "nodeType": "YulTypedName", + "src": "21387:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "21395:6:70", + "nodeType": "YulTypedName", + "src": "21395:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "21406:4:70", + "nodeType": "YulTypedName", + "src": "21406:4:70", + "type": "" + } + ], + "src": "21230:391:70" + }, + { + "body": { + "nativeSrc": "21874:144:70", + "nodeType": "YulBlock", + "src": "21874:144:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "21891:3:70", + "nodeType": "YulIdentifier", + "src": "21891:3:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21900:3:70", + "nodeType": "YulLiteral", + "src": "21900:3:70", + "type": "", + "value": "240" + }, + { + "kind": "number", + "nativeSrc": "21905:4:70", + "nodeType": "YulLiteral", + "src": "21905:4:70", + "type": "", + "value": "6401" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "21896:3:70", + "nodeType": "YulIdentifier", + "src": "21896:3:70" + }, + "nativeSrc": "21896:14:70", + "nodeType": "YulFunctionCall", + "src": "21896:14:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21884:6:70", + "nodeType": "YulIdentifier", + "src": "21884:6:70" + }, + "nativeSrc": "21884:27:70", + "nodeType": "YulFunctionCall", + "src": "21884:27:70" + }, + "nativeSrc": "21884:27:70", + "nodeType": "YulExpressionStatement", + "src": "21884:27:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "21931:3:70", + "nodeType": "YulIdentifier", + "src": "21931:3:70" + }, + { + "kind": "number", + "nativeSrc": "21936:1:70", + "nodeType": "YulLiteral", + "src": "21936:1:70", + "type": "", + "value": "2" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21927:3:70", + "nodeType": "YulIdentifier", + "src": "21927:3:70" + }, + "nativeSrc": "21927:11:70", + "nodeType": "YulFunctionCall", + "src": "21927:11:70" + }, + { + "name": "value0", + "nativeSrc": "21940:6:70", + "nodeType": "YulIdentifier", + "src": "21940:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21920:6:70", + "nodeType": "YulIdentifier", + "src": "21920:6:70" + }, + "nativeSrc": "21920:27:70", + "nodeType": "YulFunctionCall", + "src": "21920:27:70" + }, + "nativeSrc": "21920:27:70", + "nodeType": "YulExpressionStatement", + "src": "21920:27:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "21967:3:70", + "nodeType": "YulIdentifier", + "src": "21967:3:70" + }, + { + "kind": "number", + "nativeSrc": "21972:2:70", + "nodeType": "YulLiteral", + "src": "21972:2:70", + "type": "", + "value": "34" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21963:3:70", + "nodeType": "YulIdentifier", + "src": "21963:3:70" + }, + "nativeSrc": "21963:12:70", + "nodeType": "YulFunctionCall", + "src": "21963:12:70" + }, + { + "name": "value1", + "nativeSrc": "21977:6:70", + "nodeType": "YulIdentifier", + "src": "21977:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21956:6:70", + "nodeType": "YulIdentifier", + "src": "21956:6:70" + }, + "nativeSrc": "21956:28:70", + "nodeType": "YulFunctionCall", + "src": "21956:28:70" + }, + "nativeSrc": "21956:28:70", + "nodeType": "YulExpressionStatement", + "src": "21956:28:70" + }, + { + "nativeSrc": "21993:19:70", + "nodeType": "YulAssignment", + "src": "21993:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "22004:3:70", + "nodeType": "YulIdentifier", + "src": "22004:3:70" + }, + { + "kind": "number", + "nativeSrc": "22009:2:70", + "nodeType": "YulLiteral", + "src": "22009:2:70", + "type": "", + "value": "66" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22000:3:70", + "nodeType": "YulIdentifier", + "src": "22000:3:70" + }, + "nativeSrc": "22000:12:70", + "nodeType": "YulFunctionCall", + "src": "22000:12:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "21993:3:70", + "nodeType": "YulIdentifier", + "src": "21993:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_bytes32_t_bytes32__to_t_string_memory_ptr_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "21626:392:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "21842:3:70", + "nodeType": "YulTypedName", + "src": "21842:3:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "21847:6:70", + "nodeType": "YulTypedName", + "src": "21847:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "21855:6:70", + "nodeType": "YulTypedName", + "src": "21855:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "21866:3:70", + "nodeType": "YulTypedName", + "src": "21866:3:70", + "type": "" + } + ], + "src": "21626:392:70" + }, + { + "body": { + "nativeSrc": "22152:145:70", + "nodeType": "YulBlock", + "src": "22152:145:70", + "statements": [ + { + "nativeSrc": "22162:26:70", + "nodeType": "YulAssignment", + "src": "22162:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "22174:9:70", + "nodeType": "YulIdentifier", + "src": "22174:9:70" + }, + { + "kind": "number", + "nativeSrc": "22185:2:70", + "nodeType": "YulLiteral", + "src": "22185:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22170:3:70", + "nodeType": "YulIdentifier", + "src": "22170:3:70" + }, + "nativeSrc": "22170:18:70", + "nodeType": "YulFunctionCall", + "src": "22170:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "22162:4:70", + "nodeType": "YulIdentifier", + "src": "22162:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "22204:9:70", + "nodeType": "YulIdentifier", + "src": "22204:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "22219:6:70", + "nodeType": "YulIdentifier", + "src": "22219:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22235:3:70", + "nodeType": "YulLiteral", + "src": "22235:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "22240:1:70", + "nodeType": "YulLiteral", + "src": "22240:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "22231:3:70", + "nodeType": "YulIdentifier", + "src": "22231:3:70" + }, + "nativeSrc": "22231:11:70", + "nodeType": "YulFunctionCall", + "src": "22231:11:70" + }, + { + "kind": "number", + "nativeSrc": "22244:1:70", + "nodeType": "YulLiteral", + "src": "22244:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "22227:3:70", + "nodeType": "YulIdentifier", + "src": "22227:3:70" + }, + "nativeSrc": "22227:19:70", + "nodeType": "YulFunctionCall", + "src": "22227:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "22215:3:70", + "nodeType": "YulIdentifier", + "src": "22215:3:70" + }, + "nativeSrc": "22215:32:70", + "nodeType": "YulFunctionCall", + "src": "22215:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22197:6:70", + "nodeType": "YulIdentifier", + "src": "22197:6:70" + }, + "nativeSrc": "22197:51:70", + "nodeType": "YulFunctionCall", + "src": "22197:51:70" + }, + "nativeSrc": "22197:51:70", + "nodeType": "YulExpressionStatement", + "src": "22197:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "22268:9:70", + "nodeType": "YulIdentifier", + "src": "22268:9:70" + }, + { + "kind": "number", + "nativeSrc": "22279:2:70", + "nodeType": "YulLiteral", + "src": "22279:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22264:3:70", + "nodeType": "YulIdentifier", + "src": "22264:3:70" + }, + "nativeSrc": "22264:18:70", + "nodeType": "YulFunctionCall", + "src": "22264:18:70" + }, + { + "name": "value1", + "nativeSrc": "22284:6:70", + "nodeType": "YulIdentifier", + "src": "22284:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22257:6:70", + "nodeType": "YulIdentifier", + "src": "22257:6:70" + }, + "nativeSrc": "22257:34:70", + "nodeType": "YulFunctionCall", + "src": "22257:34:70" + }, + "nativeSrc": "22257:34:70", + "nodeType": "YulExpressionStatement", + "src": "22257:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed", + "nativeSrc": "22023:274:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "22113:9:70", + "nodeType": "YulTypedName", + "src": "22113:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "22124:6:70", + "nodeType": "YulTypedName", + "src": "22124:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "22132:6:70", + "nodeType": "YulTypedName", + "src": "22132:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "22143:4:70", + "nodeType": "YulTypedName", + "src": "22143:4:70", + "type": "" + } + ], + "src": "22023:274:70" + }, + { + "body": { + "nativeSrc": "22415:992:70", + "nodeType": "YulBlock", + "src": "22415:992:70", + "statements": [ + { + "nativeSrc": "22425:43:70", + "nodeType": "YulVariableDeclaration", + "src": "22425:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "22443:7:70", + "nodeType": "YulIdentifier", + "src": "22443:7:70" + }, + { + "name": "headStart", + "nativeSrc": "22452:9:70", + "nodeType": "YulIdentifier", + "src": "22452:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "22439:3:70", + "nodeType": "YulIdentifier", + "src": "22439:3:70" + }, + "nativeSrc": "22439:23:70", + "nodeType": "YulFunctionCall", + "src": "22439:23:70" + }, + { + "kind": "number", + "nativeSrc": "22464:3:70", + "nodeType": "YulLiteral", + "src": "22464:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "22435:3:70", + "nodeType": "YulIdentifier", + "src": "22435:3:70" + }, + "nativeSrc": "22435:33:70", + "nodeType": "YulFunctionCall", + "src": "22435:33:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "22429:2:70", + "nodeType": "YulTypedName", + "src": "22429:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "22483:16:70", + "nodeType": "YulBlock", + "src": "22483:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22492:1:70", + "nodeType": "YulLiteral", + "src": "22492:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "22495:1:70", + "nodeType": "YulLiteral", + "src": "22495:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "22485:6:70", + "nodeType": "YulIdentifier", + "src": "22485:6:70" + }, + "nativeSrc": "22485:12:70", + "nodeType": "YulFunctionCall", + "src": "22485:12:70" + }, + "nativeSrc": "22485:12:70", + "nodeType": "YulExpressionStatement", + "src": "22485:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "22480:2:70", + "nodeType": "YulIdentifier", + "src": "22480:2:70" + }, + "nativeSrc": "22477:22:70", + "nodeType": "YulIf", + "src": "22477:22:70" + }, + { + "nativeSrc": "22508:7:70", + "nodeType": "YulAssignment", + "src": "22508:7:70", + "value": { + "kind": "number", + "nativeSrc": "22514:1:70", + "nodeType": "YulLiteral", + "src": "22514:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "22508:2:70", + "nodeType": "YulIdentifier", + "src": "22508:2:70" + } + ] + }, + { + "nativeSrc": "22524:16:70", + "nodeType": "YulVariableDeclaration", + "src": "22524:16:70", + "value": { + "name": "_1", + "nativeSrc": "22538:2:70", + "nodeType": "YulIdentifier", + "src": "22538:2:70" + }, + "variables": [ + { + "name": "memPtr", + "nativeSrc": "22528:6:70", + "nodeType": "YulTypedName", + "src": "22528:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "22549:19:70", + "nodeType": "YulAssignment", + "src": "22549:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22565:2:70", + "nodeType": "YulLiteral", + "src": "22565:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "22559:5:70", + "nodeType": "YulIdentifier", + "src": "22559:5:70" + }, + "nativeSrc": "22559:9:70", + "nodeType": "YulFunctionCall", + "src": "22559:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "22549:6:70", + "nodeType": "YulIdentifier", + "src": "22549:6:70" + } + ] + }, + { + "nativeSrc": "22577:34:70", + "nodeType": "YulVariableDeclaration", + "src": "22577:34:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "22599:6:70", + "nodeType": "YulIdentifier", + "src": "22599:6:70" + }, + { + "kind": "number", + "nativeSrc": "22607:3:70", + "nodeType": "YulLiteral", + "src": "22607:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22595:3:70", + "nodeType": "YulIdentifier", + "src": "22595:3:70" + }, + "nativeSrc": "22595:16:70", + "nodeType": "YulFunctionCall", + "src": "22595:16:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "22581:10:70", + "nodeType": "YulTypedName", + "src": "22581:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "22694:113:70", + "nodeType": "YulBlock", + "src": "22694:113:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "22715:2:70", + "nodeType": "YulIdentifier", + "src": "22715:2:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22723:3:70", + "nodeType": "YulLiteral", + "src": "22723:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "22728:10:70", + "nodeType": "YulLiteral", + "src": "22728:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "22719:3:70", + "nodeType": "YulIdentifier", + "src": "22719:3:70" + }, + "nativeSrc": "22719:20:70", + "nodeType": "YulFunctionCall", + "src": "22719:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22708:6:70", + "nodeType": "YulIdentifier", + "src": "22708:6:70" + }, + "nativeSrc": "22708:32:70", + "nodeType": "YulFunctionCall", + "src": "22708:32:70" + }, + "nativeSrc": "22708:32:70", + "nodeType": "YulExpressionStatement", + "src": "22708:32:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22760:1:70", + "nodeType": "YulLiteral", + "src": "22760:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "22763:4:70", + "nodeType": "YulLiteral", + "src": "22763:4:70", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22753:6:70", + "nodeType": "YulIdentifier", + "src": "22753:6:70" + }, + "nativeSrc": "22753:15:70", + "nodeType": "YulFunctionCall", + "src": "22753:15:70" + }, + "nativeSrc": "22753:15:70", + "nodeType": "YulExpressionStatement", + "src": "22753:15:70" + }, + { + "expression": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "22788:2:70", + "nodeType": "YulIdentifier", + "src": "22788:2:70" + }, + { + "kind": "number", + "nativeSrc": "22792:4:70", + "nodeType": "YulLiteral", + "src": "22792:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "22781:6:70", + "nodeType": "YulIdentifier", + "src": "22781:6:70" + }, + "nativeSrc": "22781:16:70", + "nodeType": "YulFunctionCall", + "src": "22781:16:70" + }, + "nativeSrc": "22781:16:70", + "nodeType": "YulExpressionStatement", + "src": "22781:16:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "22629:10:70", + "nodeType": "YulIdentifier", + "src": "22629:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22649:2:70", + "nodeType": "YulLiteral", + "src": "22649:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "22653:1:70", + "nodeType": "YulLiteral", + "src": "22653:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "22645:3:70", + "nodeType": "YulIdentifier", + "src": "22645:3:70" + }, + "nativeSrc": "22645:10:70", + "nodeType": "YulFunctionCall", + "src": "22645:10:70" + }, + { + "kind": "number", + "nativeSrc": "22657:1:70", + "nodeType": "YulLiteral", + "src": "22657:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "22641:3:70", + "nodeType": "YulIdentifier", + "src": "22641:3:70" + }, + "nativeSrc": "22641:18:70", + "nodeType": "YulFunctionCall", + "src": "22641:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "22626:2:70", + "nodeType": "YulIdentifier", + "src": "22626:2:70" + }, + "nativeSrc": "22626:34:70", + "nodeType": "YulFunctionCall", + "src": "22626:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "22665:10:70", + "nodeType": "YulIdentifier", + "src": "22665:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "22677:6:70", + "nodeType": "YulIdentifier", + "src": "22677:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "22662:2:70", + "nodeType": "YulIdentifier", + "src": "22662:2:70" + }, + "nativeSrc": "22662:22:70", + "nodeType": "YulFunctionCall", + "src": "22662:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "22623:2:70", + "nodeType": "YulIdentifier", + "src": "22623:2:70" + }, + "nativeSrc": "22623:62:70", + "nodeType": "YulFunctionCall", + "src": "22623:62:70" + }, + "nativeSrc": "22620:187:70", + "nodeType": "YulIf", + "src": "22620:187:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22823:2:70", + "nodeType": "YulLiteral", + "src": "22823:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "22827:10:70", + "nodeType": "YulIdentifier", + "src": "22827:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22816:6:70", + "nodeType": "YulIdentifier", + "src": "22816:6:70" + }, + "nativeSrc": "22816:22:70", + "nodeType": "YulFunctionCall", + "src": "22816:22:70" + }, + "nativeSrc": "22816:22:70", + "nodeType": "YulExpressionStatement", + "src": "22816:22:70" + }, + { + "nativeSrc": "22847:15:70", + "nodeType": "YulVariableDeclaration", + "src": "22847:15:70", + "value": { + "name": "_1", + "nativeSrc": "22860:2:70", + "nodeType": "YulIdentifier", + "src": "22860:2:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "22851:5:70", + "nodeType": "YulTypedName", + "src": "22851:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "22871:25:70", + "nodeType": "YulAssignment", + "src": "22871:25:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "22886:9:70", + "nodeType": "YulIdentifier", + "src": "22886:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "22880:5:70", + "nodeType": "YulIdentifier", + "src": "22880:5:70" + }, + "nativeSrc": "22880:16:70", + "nodeType": "YulFunctionCall", + "src": "22880:16:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "22871:5:70", + "nodeType": "YulIdentifier", + "src": "22871:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "22912:6:70", + "nodeType": "YulIdentifier", + "src": "22912:6:70" + }, + { + "name": "value", + "nativeSrc": "22920:5:70", + "nodeType": "YulIdentifier", + "src": "22920:5:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22905:6:70", + "nodeType": "YulIdentifier", + "src": "22905:6:70" + }, + "nativeSrc": "22905:21:70", + "nodeType": "YulFunctionCall", + "src": "22905:21:70" + }, + "nativeSrc": "22905:21:70", + "nodeType": "YulExpressionStatement", + "src": "22905:21:70" + }, + { + "nativeSrc": "22935:17:70", + "nodeType": "YulVariableDeclaration", + "src": "22935:17:70", + "value": { + "name": "_1", + "nativeSrc": "22950:2:70", + "nodeType": "YulIdentifier", + "src": "22950:2:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "22939:7:70", + "nodeType": "YulTypedName", + "src": "22939:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "22961:36:70", + "nodeType": "YulAssignment", + "src": "22961:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "22982:9:70", + "nodeType": "YulIdentifier", + "src": "22982:9:70" + }, + { + "kind": "number", + "nativeSrc": "22993:2:70", + "nodeType": "YulLiteral", + "src": "22993:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22978:3:70", + "nodeType": "YulIdentifier", + "src": "22978:3:70" + }, + "nativeSrc": "22978:18:70", + "nodeType": "YulFunctionCall", + "src": "22978:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "22972:5:70", + "nodeType": "YulIdentifier", + "src": "22972:5:70" + }, + "nativeSrc": "22972:25:70", + "nodeType": "YulFunctionCall", + "src": "22972:25:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "22961:7:70", + "nodeType": "YulIdentifier", + "src": "22961:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "23017:6:70", + "nodeType": "YulIdentifier", + "src": "23017:6:70" + }, + { + "kind": "number", + "nativeSrc": "23025:2:70", + "nodeType": "YulLiteral", + "src": "23025:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23013:3:70", + "nodeType": "YulIdentifier", + "src": "23013:3:70" + }, + "nativeSrc": "23013:15:70", + "nodeType": "YulFunctionCall", + "src": "23013:15:70" + }, + { + "name": "value_1", + "nativeSrc": "23030:7:70", + "nodeType": "YulIdentifier", + "src": "23030:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23006:6:70", + "nodeType": "YulIdentifier", + "src": "23006:6:70" + }, + "nativeSrc": "23006:32:70", + "nodeType": "YulFunctionCall", + "src": "23006:32:70" + }, + "nativeSrc": "23006:32:70", + "nodeType": "YulExpressionStatement", + "src": "23006:32:70" + }, + { + "nativeSrc": "23047:17:70", + "nodeType": "YulVariableDeclaration", + "src": "23047:17:70", + "value": { + "name": "_1", + "nativeSrc": "23062:2:70", + "nodeType": "YulIdentifier", + "src": "23062:2:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "23051:7:70", + "nodeType": "YulTypedName", + "src": "23051:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23073:36:70", + "nodeType": "YulAssignment", + "src": "23073:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23094:9:70", + "nodeType": "YulIdentifier", + "src": "23094:9:70" + }, + { + "kind": "number", + "nativeSrc": "23105:2:70", + "nodeType": "YulLiteral", + "src": "23105:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23090:3:70", + "nodeType": "YulIdentifier", + "src": "23090:3:70" + }, + "nativeSrc": "23090:18:70", + "nodeType": "YulFunctionCall", + "src": "23090:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "23084:5:70", + "nodeType": "YulIdentifier", + "src": "23084:5:70" + }, + "nativeSrc": "23084:25:70", + "nodeType": "YulFunctionCall", + "src": "23084:25:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "23073:7:70", + "nodeType": "YulIdentifier", + "src": "23073:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "23129:6:70", + "nodeType": "YulIdentifier", + "src": "23129:6:70" + }, + { + "kind": "number", + "nativeSrc": "23137:2:70", + "nodeType": "YulLiteral", + "src": "23137:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23125:3:70", + "nodeType": "YulIdentifier", + "src": "23125:3:70" + }, + "nativeSrc": "23125:15:70", + "nodeType": "YulFunctionCall", + "src": "23125:15:70" + }, + { + "name": "value_2", + "nativeSrc": "23142:7:70", + "nodeType": "YulIdentifier", + "src": "23142:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23118:6:70", + "nodeType": "YulIdentifier", + "src": "23118:6:70" + }, + "nativeSrc": "23118:32:70", + "nodeType": "YulFunctionCall", + "src": "23118:32:70" + }, + "nativeSrc": "23118:32:70", + "nodeType": "YulExpressionStatement", + "src": "23118:32:70" + }, + { + "nativeSrc": "23159:17:70", + "nodeType": "YulVariableDeclaration", + "src": "23159:17:70", + "value": { + "name": "_1", + "nativeSrc": "23174:2:70", + "nodeType": "YulIdentifier", + "src": "23174:2:70" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "23163:7:70", + "nodeType": "YulTypedName", + "src": "23163:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23185:36:70", + "nodeType": "YulAssignment", + "src": "23185:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23206:9:70", + "nodeType": "YulIdentifier", + "src": "23206:9:70" + }, + { + "kind": "number", + "nativeSrc": "23217:2:70", + "nodeType": "YulLiteral", + "src": "23217:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23202:3:70", + "nodeType": "YulIdentifier", + "src": "23202:3:70" + }, + "nativeSrc": "23202:18:70", + "nodeType": "YulFunctionCall", + "src": "23202:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "23196:5:70", + "nodeType": "YulIdentifier", + "src": "23196:5:70" + }, + "nativeSrc": "23196:25:70", + "nodeType": "YulFunctionCall", + "src": "23196:25:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "23185:7:70", + "nodeType": "YulIdentifier", + "src": "23185:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "23241:6:70", + "nodeType": "YulIdentifier", + "src": "23241:6:70" + }, + { + "kind": "number", + "nativeSrc": "23249:2:70", + "nodeType": "YulLiteral", + "src": "23249:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23237:3:70", + "nodeType": "YulIdentifier", + "src": "23237:3:70" + }, + "nativeSrc": "23237:15:70", + "nodeType": "YulFunctionCall", + "src": "23237:15:70" + }, + { + "name": "value_3", + "nativeSrc": "23254:7:70", + "nodeType": "YulIdentifier", + "src": "23254:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23230:6:70", + "nodeType": "YulIdentifier", + "src": "23230:6:70" + }, + "nativeSrc": "23230:32:70", + "nodeType": "YulFunctionCall", + "src": "23230:32:70" + }, + "nativeSrc": "23230:32:70", + "nodeType": "YulExpressionStatement", + "src": "23230:32:70" + }, + { + "nativeSrc": "23271:17:70", + "nodeType": "YulVariableDeclaration", + "src": "23271:17:70", + "value": { + "name": "_1", + "nativeSrc": "23286:2:70", + "nodeType": "YulIdentifier", + "src": "23286:2:70" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "23275:7:70", + "nodeType": "YulTypedName", + "src": "23275:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23297:37:70", + "nodeType": "YulAssignment", + "src": "23297:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23318:9:70", + "nodeType": "YulIdentifier", + "src": "23318:9:70" + }, + { + "kind": "number", + "nativeSrc": "23329:3:70", + "nodeType": "YulLiteral", + "src": "23329:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23314:3:70", + "nodeType": "YulIdentifier", + "src": "23314:3:70" + }, + "nativeSrc": "23314:19:70", + "nodeType": "YulFunctionCall", + "src": "23314:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "23308:5:70", + "nodeType": "YulIdentifier", + "src": "23308:5:70" + }, + "nativeSrc": "23308:26:70", + "nodeType": "YulFunctionCall", + "src": "23308:26:70" + }, + "variableNames": [ + { + "name": "value_4", + "nativeSrc": "23297:7:70", + "nodeType": "YulIdentifier", + "src": "23297:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "23354:6:70", + "nodeType": "YulIdentifier", + "src": "23354:6:70" + }, + { + "kind": "number", + "nativeSrc": "23362:3:70", + "nodeType": "YulLiteral", + "src": "23362:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23350:3:70", + "nodeType": "YulIdentifier", + "src": "23350:3:70" + }, + "nativeSrc": "23350:16:70", + "nodeType": "YulFunctionCall", + "src": "23350:16:70" + }, + { + "name": "value_4", + "nativeSrc": "23368:7:70", + "nodeType": "YulIdentifier", + "src": "23368:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23343:6:70", + "nodeType": "YulIdentifier", + "src": "23343:6:70" + }, + "nativeSrc": "23343:33:70", + "nodeType": "YulFunctionCall", + "src": "23343:33:70" + }, + "nativeSrc": "23343:33:70", + "nodeType": "YulExpressionStatement", + "src": "23343:33:70" + }, + { + "nativeSrc": "23385:16:70", + "nodeType": "YulAssignment", + "src": "23385:16:70", + "value": { + "name": "memPtr", + "nativeSrc": "23395:6:70", + "nodeType": "YulIdentifier", + "src": "23395:6:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "23385:6:70", + "nodeType": "YulIdentifier", + "src": "23385:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_DelegationPool_$3992_memory_ptr_fromMemory", + "nativeSrc": "22302:1105:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "22381:9:70", + "nodeType": "YulTypedName", + "src": "22381:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "22392:7:70", + "nodeType": "YulTypedName", + "src": "22392:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "22404:6:70", + "nodeType": "YulTypedName", + "src": "22404:6:70", + "type": "" + } + ], + "src": "22302:1105:70" + }, + { + "body": { + "nativeSrc": "23527:341:70", + "nodeType": "YulBlock", + "src": "23527:341:70", + "statements": [ + { + "body": { + "nativeSrc": "23573:16:70", + "nodeType": "YulBlock", + "src": "23573:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "23582:1:70", + "nodeType": "YulLiteral", + "src": "23582:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "23585:1:70", + "nodeType": "YulLiteral", + "src": "23585:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "23575:6:70", + "nodeType": "YulIdentifier", + "src": "23575:6:70" + }, + "nativeSrc": "23575:12:70", + "nodeType": "YulFunctionCall", + "src": "23575:12:70" + }, + "nativeSrc": "23575:12:70", + "nodeType": "YulExpressionStatement", + "src": "23575:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "23548:7:70", + "nodeType": "YulIdentifier", + "src": "23548:7:70" + }, + { + "name": "headStart", + "nativeSrc": "23557:9:70", + "nodeType": "YulIdentifier", + "src": "23557:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "23544:3:70", + "nodeType": "YulIdentifier", + "src": "23544:3:70" + }, + "nativeSrc": "23544:23:70", + "nodeType": "YulFunctionCall", + "src": "23544:23:70" + }, + { + "kind": "number", + "nativeSrc": "23569:2:70", + "nodeType": "YulLiteral", + "src": "23569:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "23540:3:70", + "nodeType": "YulIdentifier", + "src": "23540:3:70" + }, + "nativeSrc": "23540:32:70", + "nodeType": "YulFunctionCall", + "src": "23540:32:70" + }, + "nativeSrc": "23537:52:70", + "nodeType": "YulIf", + "src": "23537:52:70" + }, + { + "nativeSrc": "23598:14:70", + "nodeType": "YulVariableDeclaration", + "src": "23598:14:70", + "value": { + "kind": "number", + "nativeSrc": "23611:1:70", + "nodeType": "YulLiteral", + "src": "23611:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "23602:5:70", + "nodeType": "YulTypedName", + "src": "23602:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23621:25:70", + "nodeType": "YulAssignment", + "src": "23621:25:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23636:9:70", + "nodeType": "YulIdentifier", + "src": "23636:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "23630:5:70", + "nodeType": "YulIdentifier", + "src": "23630:5:70" + }, + "nativeSrc": "23630:16:70", + "nodeType": "YulFunctionCall", + "src": "23630:16:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "23621:5:70", + "nodeType": "YulIdentifier", + "src": "23621:5:70" + } + ] + }, + { + "nativeSrc": "23655:15:70", + "nodeType": "YulAssignment", + "src": "23655:15:70", + "value": { + "name": "value", + "nativeSrc": "23665:5:70", + "nodeType": "YulIdentifier", + "src": "23665:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "23655:6:70", + "nodeType": "YulIdentifier", + "src": "23655:6:70" + } + ] + }, + { + "nativeSrc": "23679:16:70", + "nodeType": "YulVariableDeclaration", + "src": "23679:16:70", + "value": { + "kind": "number", + "nativeSrc": "23694:1:70", + "nodeType": "YulLiteral", + "src": "23694:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "23683:7:70", + "nodeType": "YulTypedName", + "src": "23683:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23704:36:70", + "nodeType": "YulAssignment", + "src": "23704:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23725:9:70", + "nodeType": "YulIdentifier", + "src": "23725:9:70" + }, + { + "kind": "number", + "nativeSrc": "23736:2:70", + "nodeType": "YulLiteral", + "src": "23736:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23721:3:70", + "nodeType": "YulIdentifier", + "src": "23721:3:70" + }, + "nativeSrc": "23721:18:70", + "nodeType": "YulFunctionCall", + "src": "23721:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "23715:5:70", + "nodeType": "YulIdentifier", + "src": "23715:5:70" + }, + "nativeSrc": "23715:25:70", + "nodeType": "YulFunctionCall", + "src": "23715:25:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "23704:7:70", + "nodeType": "YulIdentifier", + "src": "23704:7:70" + } + ] + }, + { + "nativeSrc": "23749:17:70", + "nodeType": "YulAssignment", + "src": "23749:17:70", + "value": { + "name": "value_1", + "nativeSrc": "23759:7:70", + "nodeType": "YulIdentifier", + "src": "23759:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "23749:6:70", + "nodeType": "YulIdentifier", + "src": "23749:6:70" + } + ] + }, + { + "nativeSrc": "23775:16:70", + "nodeType": "YulVariableDeclaration", + "src": "23775:16:70", + "value": { + "kind": "number", + "nativeSrc": "23790:1:70", + "nodeType": "YulLiteral", + "src": "23790:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "23779:7:70", + "nodeType": "YulTypedName", + "src": "23779:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23800:36:70", + "nodeType": "YulAssignment", + "src": "23800:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23821:9:70", + "nodeType": "YulIdentifier", + "src": "23821:9:70" + }, + { + "kind": "number", + "nativeSrc": "23832:2:70", + "nodeType": "YulLiteral", + "src": "23832:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23817:3:70", + "nodeType": "YulIdentifier", + "src": "23817:3:70" + }, + "nativeSrc": "23817:18:70", + "nodeType": "YulFunctionCall", + "src": "23817:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "23811:5:70", + "nodeType": "YulIdentifier", + "src": "23811:5:70" + }, + "nativeSrc": "23811:25:70", + "nodeType": "YulFunctionCall", + "src": "23811:25:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "23800:7:70", + "nodeType": "YulIdentifier", + "src": "23800:7:70" + } + ] + }, + { + "nativeSrc": "23845:17:70", + "nodeType": "YulAssignment", + "src": "23845:17:70", + "value": { + "name": "value_2", + "nativeSrc": "23855:7:70", + "nodeType": "YulIdentifier", + "src": "23855:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "23845:6:70", + "nodeType": "YulIdentifier", + "src": "23845:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32t_bytes32t_bytes32_fromMemory", + "nativeSrc": "23412:456:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "23477:9:70", + "nodeType": "YulTypedName", + "src": "23477:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "23488:7:70", + "nodeType": "YulTypedName", + "src": "23488:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "23500:6:70", + "nodeType": "YulTypedName", + "src": "23500:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "23508:6:70", + "nodeType": "YulTypedName", + "src": "23508:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "23516:6:70", + "nodeType": "YulTypedName", + "src": "23516:6:70", + "type": "" + } + ], + "src": "23412:456:70" + }, + { + "body": { + "nativeSrc": "24104:291:70", + "nodeType": "YulBlock", + "src": "24104:291:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "24121:3:70", + "nodeType": "YulIdentifier", + "src": "24121:3:70" + }, + { + "name": "value0", + "nativeSrc": "24126:6:70", + "nodeType": "YulIdentifier", + "src": "24126:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24114:6:70", + "nodeType": "YulIdentifier", + "src": "24114:6:70" + }, + "nativeSrc": "24114:19:70", + "nodeType": "YulFunctionCall", + "src": "24114:19:70" + }, + "nativeSrc": "24114:19:70", + "nodeType": "YulExpressionStatement", + "src": "24114:19:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "24153:3:70", + "nodeType": "YulIdentifier", + "src": "24153:3:70" + }, + { + "kind": "number", + "nativeSrc": "24158:2:70", + "nodeType": "YulLiteral", + "src": "24158:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24149:3:70", + "nodeType": "YulIdentifier", + "src": "24149:3:70" + }, + "nativeSrc": "24149:12:70", + "nodeType": "YulFunctionCall", + "src": "24149:12:70" + }, + { + "name": "value1", + "nativeSrc": "24163:6:70", + "nodeType": "YulIdentifier", + "src": "24163:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24142:6:70", + "nodeType": "YulIdentifier", + "src": "24142:6:70" + }, + "nativeSrc": "24142:28:70", + "nodeType": "YulFunctionCall", + "src": "24142:28:70" + }, + "nativeSrc": "24142:28:70", + "nodeType": "YulExpressionStatement", + "src": "24142:28:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "24190:3:70", + "nodeType": "YulIdentifier", + "src": "24190:3:70" + }, + { + "kind": "number", + "nativeSrc": "24195:2:70", + "nodeType": "YulLiteral", + "src": "24195:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24186:3:70", + "nodeType": "YulIdentifier", + "src": "24186:3:70" + }, + "nativeSrc": "24186:12:70", + "nodeType": "YulFunctionCall", + "src": "24186:12:70" + }, + { + "name": "value2", + "nativeSrc": "24200:6:70", + "nodeType": "YulIdentifier", + "src": "24200:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24179:6:70", + "nodeType": "YulIdentifier", + "src": "24179:6:70" + }, + "nativeSrc": "24179:28:70", + "nodeType": "YulFunctionCall", + "src": "24179:28:70" + }, + "nativeSrc": "24179:28:70", + "nodeType": "YulExpressionStatement", + "src": "24179:28:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "24227:3:70", + "nodeType": "YulIdentifier", + "src": "24227:3:70" + }, + { + "kind": "number", + "nativeSrc": "24232:2:70", + "nodeType": "YulLiteral", + "src": "24232:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24223:3:70", + "nodeType": "YulIdentifier", + "src": "24223:3:70" + }, + "nativeSrc": "24223:12:70", + "nodeType": "YulFunctionCall", + "src": "24223:12:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24245:2:70", + "nodeType": "YulLiteral", + "src": "24245:2:70", + "type": "", + "value": "96" + }, + { + "name": "value3", + "nativeSrc": "24249:6:70", + "nodeType": "YulIdentifier", + "src": "24249:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "24241:3:70", + "nodeType": "YulIdentifier", + "src": "24241:3:70" + }, + "nativeSrc": "24241:15:70", + "nodeType": "YulFunctionCall", + "src": "24241:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24270:2:70", + "nodeType": "YulLiteral", + "src": "24270:2:70", + "type": "", + "value": "96" + }, + { + "kind": "number", + "nativeSrc": "24274:1:70", + "nodeType": "YulLiteral", + "src": "24274:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "24266:3:70", + "nodeType": "YulIdentifier", + "src": "24266:3:70" + }, + "nativeSrc": "24266:10:70", + "nodeType": "YulFunctionCall", + "src": "24266:10:70" + }, + { + "kind": "number", + "nativeSrc": "24278:1:70", + "nodeType": "YulLiteral", + "src": "24278:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "24262:3:70", + "nodeType": "YulIdentifier", + "src": "24262:3:70" + }, + "nativeSrc": "24262:18:70", + "nodeType": "YulFunctionCall", + "src": "24262:18:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "24258:3:70", + "nodeType": "YulIdentifier", + "src": "24258:3:70" + }, + "nativeSrc": "24258:23:70", + "nodeType": "YulFunctionCall", + "src": "24258:23:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "24237:3:70", + "nodeType": "YulIdentifier", + "src": "24237:3:70" + }, + "nativeSrc": "24237:45:70", + "nodeType": "YulFunctionCall", + "src": "24237:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24216:6:70", + "nodeType": "YulIdentifier", + "src": "24216:6:70" + }, + "nativeSrc": "24216:67:70", + "nodeType": "YulFunctionCall", + "src": "24216:67:70" + }, + "nativeSrc": "24216:67:70", + "nodeType": "YulExpressionStatement", + "src": "24216:67:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "24303:3:70", + "nodeType": "YulIdentifier", + "src": "24303:3:70" + }, + { + "kind": "number", + "nativeSrc": "24308:3:70", + "nodeType": "YulLiteral", + "src": "24308:3:70", + "type": "", + "value": "116" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24299:3:70", + "nodeType": "YulIdentifier", + "src": "24299:3:70" + }, + "nativeSrc": "24299:13:70", + "nodeType": "YulFunctionCall", + "src": "24299:13:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24322:2:70", + "nodeType": "YulLiteral", + "src": "24322:2:70", + "type": "", + "value": "96" + }, + { + "name": "value4", + "nativeSrc": "24326:6:70", + "nodeType": "YulIdentifier", + "src": "24326:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "24318:3:70", + "nodeType": "YulIdentifier", + "src": "24318:3:70" + }, + "nativeSrc": "24318:15:70", + "nodeType": "YulFunctionCall", + "src": "24318:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24347:2:70", + "nodeType": "YulLiteral", + "src": "24347:2:70", + "type": "", + "value": "96" + }, + { + "kind": "number", + "nativeSrc": "24351:1:70", + "nodeType": "YulLiteral", + "src": "24351:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "24343:3:70", + "nodeType": "YulIdentifier", + "src": "24343:3:70" + }, + "nativeSrc": "24343:10:70", + "nodeType": "YulFunctionCall", + "src": "24343:10:70" + }, + { + "kind": "number", + "nativeSrc": "24355:1:70", + "nodeType": "YulLiteral", + "src": "24355:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "24339:3:70", + "nodeType": "YulIdentifier", + "src": "24339:3:70" + }, + "nativeSrc": "24339:18:70", + "nodeType": "YulFunctionCall", + "src": "24339:18:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "24335:3:70", + "nodeType": "YulIdentifier", + "src": "24335:3:70" + }, + "nativeSrc": "24335:23:70", + "nodeType": "YulFunctionCall", + "src": "24335:23:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "24314:3:70", + "nodeType": "YulIdentifier", + "src": "24314:3:70" + }, + "nativeSrc": "24314:45:70", + "nodeType": "YulFunctionCall", + "src": "24314:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24292:6:70", + "nodeType": "YulIdentifier", + "src": "24292:6:70" + }, + "nativeSrc": "24292:68:70", + "nodeType": "YulFunctionCall", + "src": "24292:68:70" + }, + "nativeSrc": "24292:68:70", + "nodeType": "YulExpressionStatement", + "src": "24292:68:70" + }, + { + "nativeSrc": "24369:20:70", + "nodeType": "YulAssignment", + "src": "24369:20:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "24380:3:70", + "nodeType": "YulIdentifier", + "src": "24380:3:70" + }, + { + "kind": "number", + "nativeSrc": "24385:3:70", + "nodeType": "YulLiteral", + "src": "24385:3:70", + "type": "", + "value": "136" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24376:3:70", + "nodeType": "YulIdentifier", + "src": "24376:3:70" + }, + "nativeSrc": "24376:13:70", + "nodeType": "YulFunctionCall", + "src": "24376:13:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "24369:3:70", + "nodeType": "YulIdentifier", + "src": "24369:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_bytes32_t_bytes32_t_bytes32_t_address_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_address_t_address__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "23873:522:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "24048:3:70", + "nodeType": "YulTypedName", + "src": "24048:3:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "24053:6:70", + "nodeType": "YulTypedName", + "src": "24053:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "24061:6:70", + "nodeType": "YulTypedName", + "src": "24061:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "24069:6:70", + "nodeType": "YulTypedName", + "src": "24069:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "24077:6:70", + "nodeType": "YulTypedName", + "src": "24077:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "24085:6:70", + "nodeType": "YulTypedName", + "src": "24085:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "24096:3:70", + "nodeType": "YulTypedName", + "src": "24096:3:70", + "type": "" + } + ], + "src": "23873:522:70" + }, + { + "body": { + "nativeSrc": "24631:273:70", + "nodeType": "YulBlock", + "src": "24631:273:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24648:9:70", + "nodeType": "YulIdentifier", + "src": "24648:9:70" + }, + { + "name": "value0", + "nativeSrc": "24659:6:70", + "nodeType": "YulIdentifier", + "src": "24659:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24641:6:70", + "nodeType": "YulIdentifier", + "src": "24641:6:70" + }, + "nativeSrc": "24641:25:70", + "nodeType": "YulFunctionCall", + "src": "24641:25:70" + }, + "nativeSrc": "24641:25:70", + "nodeType": "YulExpressionStatement", + "src": "24641:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24686:9:70", + "nodeType": "YulIdentifier", + "src": "24686:9:70" + }, + { + "kind": "number", + "nativeSrc": "24697:2:70", + "nodeType": "YulLiteral", + "src": "24697:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24682:3:70", + "nodeType": "YulIdentifier", + "src": "24682:3:70" + }, + "nativeSrc": "24682:18:70", + "nodeType": "YulFunctionCall", + "src": "24682:18:70" + }, + { + "name": "value1", + "nativeSrc": "24702:6:70", + "nodeType": "YulIdentifier", + "src": "24702:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24675:6:70", + "nodeType": "YulIdentifier", + "src": "24675:6:70" + }, + "nativeSrc": "24675:34:70", + "nodeType": "YulFunctionCall", + "src": "24675:34:70" + }, + "nativeSrc": "24675:34:70", + "nodeType": "YulExpressionStatement", + "src": "24675:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24729:9:70", + "nodeType": "YulIdentifier", + "src": "24729:9:70" + }, + { + "kind": "number", + "nativeSrc": "24740:2:70", + "nodeType": "YulLiteral", + "src": "24740:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24725:3:70", + "nodeType": "YulIdentifier", + "src": "24725:3:70" + }, + "nativeSrc": "24725:18:70", + "nodeType": "YulFunctionCall", + "src": "24725:18:70" + }, + { + "kind": "number", + "nativeSrc": "24745:3:70", + "nodeType": "YulLiteral", + "src": "24745:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24718:6:70", + "nodeType": "YulIdentifier", + "src": "24718:6:70" + }, + "nativeSrc": "24718:31:70", + "nodeType": "YulFunctionCall", + "src": "24718:31:70" + }, + "nativeSrc": "24718:31:70", + "nodeType": "YulExpressionStatement", + "src": "24718:31:70" + }, + { + "nativeSrc": "24758:53:70", + "nodeType": "YulAssignment", + "src": "24758:53:70", + "value": { + "arguments": [ + { + "name": "value2", + "nativeSrc": "24783:6:70", + "nodeType": "YulIdentifier", + "src": "24783:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24795:9:70", + "nodeType": "YulIdentifier", + "src": "24795:9:70" + }, + { + "kind": "number", + "nativeSrc": "24806:3:70", + "nodeType": "YulLiteral", + "src": "24806:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24791:3:70", + "nodeType": "YulIdentifier", + "src": "24791:3:70" + }, + "nativeSrc": "24791:19:70", + "nodeType": "YulFunctionCall", + "src": "24791:19:70" + } + ], + "functionName": { + "name": "abi_encode_bytes", + "nativeSrc": "24766:16:70", + "nodeType": "YulIdentifier", + "src": "24766:16:70" + }, + "nativeSrc": "24766:45:70", + "nodeType": "YulFunctionCall", + "src": "24766:45:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "24758:4:70", + "nodeType": "YulIdentifier", + "src": "24758:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24831:9:70", + "nodeType": "YulIdentifier", + "src": "24831:9:70" + }, + { + "kind": "number", + "nativeSrc": "24842:2:70", + "nodeType": "YulLiteral", + "src": "24842:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24827:3:70", + "nodeType": "YulIdentifier", + "src": "24827:3:70" + }, + "nativeSrc": "24827:18:70", + "nodeType": "YulFunctionCall", + "src": "24827:18:70" + }, + { + "name": "value3", + "nativeSrc": "24847:6:70", + "nodeType": "YulIdentifier", + "src": "24847:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24820:6:70", + "nodeType": "YulIdentifier", + "src": "24820:6:70" + }, + "nativeSrc": "24820:34:70", + "nodeType": "YulFunctionCall", + "src": "24820:34:70" + }, + "nativeSrc": "24820:34:70", + "nodeType": "YulExpressionStatement", + "src": "24820:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24874:9:70", + "nodeType": "YulIdentifier", + "src": "24874:9:70" + }, + { + "kind": "number", + "nativeSrc": "24885:3:70", + "nodeType": "YulLiteral", + "src": "24885:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24870:3:70", + "nodeType": "YulIdentifier", + "src": "24870:3:70" + }, + "nativeSrc": "24870:19:70", + "nodeType": "YulFunctionCall", + "src": "24870:19:70" + }, + { + "name": "value4", + "nativeSrc": "24891:6:70", + "nodeType": "YulIdentifier", + "src": "24891:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "24863:6:70", + "nodeType": "YulIdentifier", + "src": "24863:6:70" + }, + "nativeSrc": "24863:35:70", + "nodeType": "YulFunctionCall", + "src": "24863:35:70" + }, + "nativeSrc": "24863:35:70", + "nodeType": "YulExpressionStatement", + "src": "24863:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256_t_uint256__to_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "24400:504:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "24568:9:70", + "nodeType": "YulTypedName", + "src": "24568:9:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "24579:6:70", + "nodeType": "YulTypedName", + "src": "24579:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "24587:6:70", + "nodeType": "YulTypedName", + "src": "24587:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "24595:6:70", + "nodeType": "YulTypedName", + "src": "24595:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "24603:6:70", + "nodeType": "YulTypedName", + "src": "24603:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "24611:6:70", + "nodeType": "YulTypedName", + "src": "24611:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "24622:4:70", + "nodeType": "YulTypedName", + "src": "24622:4:70", + "type": "" + } + ], + "src": "24400:504:70" + }, + { + "body": { + "nativeSrc": "25080:167:70", + "nodeType": "YulBlock", + "src": "25080:167:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "25097:3:70", + "nodeType": "YulIdentifier", + "src": "25097:3:70" + }, + { + "name": "value0", + "nativeSrc": "25102:6:70", + "nodeType": "YulIdentifier", + "src": "25102:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25090:6:70", + "nodeType": "YulIdentifier", + "src": "25090:6:70" + }, + "nativeSrc": "25090:19:70", + "nodeType": "YulFunctionCall", + "src": "25090:19:70" + }, + "nativeSrc": "25090:19:70", + "nodeType": "YulExpressionStatement", + "src": "25090:19:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "25129:3:70", + "nodeType": "YulIdentifier", + "src": "25129:3:70" + }, + { + "kind": "number", + "nativeSrc": "25134:2:70", + "nodeType": "YulLiteral", + "src": "25134:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25125:3:70", + "nodeType": "YulIdentifier", + "src": "25125:3:70" + }, + "nativeSrc": "25125:12:70", + "nodeType": "YulFunctionCall", + "src": "25125:12:70" + }, + { + "name": "value1", + "nativeSrc": "25139:6:70", + "nodeType": "YulIdentifier", + "src": "25139:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25118:6:70", + "nodeType": "YulIdentifier", + "src": "25118:6:70" + }, + "nativeSrc": "25118:28:70", + "nodeType": "YulFunctionCall", + "src": "25118:28:70" + }, + "nativeSrc": "25118:28:70", + "nodeType": "YulExpressionStatement", + "src": "25118:28:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "25166:3:70", + "nodeType": "YulIdentifier", + "src": "25166:3:70" + }, + { + "kind": "number", + "nativeSrc": "25171:2:70", + "nodeType": "YulLiteral", + "src": "25171:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25162:3:70", + "nodeType": "YulIdentifier", + "src": "25162:3:70" + }, + "nativeSrc": "25162:12:70", + "nodeType": "YulFunctionCall", + "src": "25162:12:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "25184:3:70", + "nodeType": "YulLiteral", + "src": "25184:3:70", + "type": "", + "value": "248" + }, + { + "name": "value2", + "nativeSrc": "25189:6:70", + "nodeType": "YulIdentifier", + "src": "25189:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "25180:3:70", + "nodeType": "YulIdentifier", + "src": "25180:3:70" + }, + "nativeSrc": "25180:16:70", + "nodeType": "YulFunctionCall", + "src": "25180:16:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "25202:3:70", + "nodeType": "YulLiteral", + "src": "25202:3:70", + "type": "", + "value": "248" + }, + { + "kind": "number", + "nativeSrc": "25207:3:70", + "nodeType": "YulLiteral", + "src": "25207:3:70", + "type": "", + "value": "255" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "25198:3:70", + "nodeType": "YulIdentifier", + "src": "25198:3:70" + }, + "nativeSrc": "25198:13:70", + "nodeType": "YulFunctionCall", + "src": "25198:13:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "25176:3:70", + "nodeType": "YulIdentifier", + "src": "25176:3:70" + }, + "nativeSrc": "25176:36:70", + "nodeType": "YulFunctionCall", + "src": "25176:36:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25155:6:70", + "nodeType": "YulIdentifier", + "src": "25155:6:70" + }, + "nativeSrc": "25155:58:70", + "nodeType": "YulFunctionCall", + "src": "25155:58:70" + }, + "nativeSrc": "25155:58:70", + "nodeType": "YulExpressionStatement", + "src": "25155:58:70" + }, + { + "nativeSrc": "25222:19:70", + "nodeType": "YulAssignment", + "src": "25222:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "25233:3:70", + "nodeType": "YulIdentifier", + "src": "25233:3:70" + }, + { + "kind": "number", + "nativeSrc": "25238:2:70", + "nodeType": "YulLiteral", + "src": "25238:2:70", + "type": "", + "value": "65" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25229:3:70", + "nodeType": "YulIdentifier", + "src": "25229:3:70" + }, + "nativeSrc": "25229:12:70", + "nodeType": "YulFunctionCall", + "src": "25229:12:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "25222:3:70", + "nodeType": "YulIdentifier", + "src": "25222:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_bytes32_t_bytes32_t_uint8__to_t_bytes32_t_bytes32_t_uint8__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "24909:338:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "25040:3:70", + "nodeType": "YulTypedName", + "src": "25040:3:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "25045:6:70", + "nodeType": "YulTypedName", + "src": "25045:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "25053:6:70", + "nodeType": "YulTypedName", + "src": "25053:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "25061:6:70", + "nodeType": "YulTypedName", + "src": "25061:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "25072:3:70", + "nodeType": "YulTypedName", + "src": "25072:3:70", + "type": "" + } + ], + "src": "24909:338:70" + }, + { + "body": { + "nativeSrc": "25493:320:70", + "nodeType": "YulBlock", + "src": "25493:320:70", + "statements": [ + { + "nativeSrc": "25503:27:70", + "nodeType": "YulAssignment", + "src": "25503:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25515:9:70", + "nodeType": "YulIdentifier", + "src": "25515:9:70" + }, + { + "kind": "number", + "nativeSrc": "25526:3:70", + "nodeType": "YulLiteral", + "src": "25526:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25511:3:70", + "nodeType": "YulIdentifier", + "src": "25511:3:70" + }, + "nativeSrc": "25511:19:70", + "nodeType": "YulFunctionCall", + "src": "25511:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "25503:4:70", + "nodeType": "YulIdentifier", + "src": "25503:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25546:9:70", + "nodeType": "YulIdentifier", + "src": "25546:9:70" + }, + { + "name": "value0", + "nativeSrc": "25557:6:70", + "nodeType": "YulIdentifier", + "src": "25557:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25539:6:70", + "nodeType": "YulIdentifier", + "src": "25539:6:70" + }, + "nativeSrc": "25539:25:70", + "nodeType": "YulFunctionCall", + "src": "25539:25:70" + }, + "nativeSrc": "25539:25:70", + "nodeType": "YulExpressionStatement", + "src": "25539:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25584:9:70", + "nodeType": "YulIdentifier", + "src": "25584:9:70" + }, + { + "kind": "number", + "nativeSrc": "25595:2:70", + "nodeType": "YulLiteral", + "src": "25595:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25580:3:70", + "nodeType": "YulIdentifier", + "src": "25580:3:70" + }, + "nativeSrc": "25580:18:70", + "nodeType": "YulFunctionCall", + "src": "25580:18:70" + }, + { + "name": "value1", + "nativeSrc": "25600:6:70", + "nodeType": "YulIdentifier", + "src": "25600:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25573:6:70", + "nodeType": "YulIdentifier", + "src": "25573:6:70" + }, + "nativeSrc": "25573:34:70", + "nodeType": "YulFunctionCall", + "src": "25573:34:70" + }, + "nativeSrc": "25573:34:70", + "nodeType": "YulExpressionStatement", + "src": "25573:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25627:9:70", + "nodeType": "YulIdentifier", + "src": "25627:9:70" + }, + { + "kind": "number", + "nativeSrc": "25638:2:70", + "nodeType": "YulLiteral", + "src": "25638:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25623:3:70", + "nodeType": "YulIdentifier", + "src": "25623:3:70" + }, + "nativeSrc": "25623:18:70", + "nodeType": "YulFunctionCall", + "src": "25623:18:70" + }, + { + "name": "value2", + "nativeSrc": "25643:6:70", + "nodeType": "YulIdentifier", + "src": "25643:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25616:6:70", + "nodeType": "YulIdentifier", + "src": "25616:6:70" + }, + "nativeSrc": "25616:34:70", + "nodeType": "YulFunctionCall", + "src": "25616:34:70" + }, + "nativeSrc": "25616:34:70", + "nodeType": "YulExpressionStatement", + "src": "25616:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25670:9:70", + "nodeType": "YulIdentifier", + "src": "25670:9:70" + }, + { + "kind": "number", + "nativeSrc": "25681:2:70", + "nodeType": "YulLiteral", + "src": "25681:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25666:3:70", + "nodeType": "YulIdentifier", + "src": "25666:3:70" + }, + "nativeSrc": "25666:18:70", + "nodeType": "YulFunctionCall", + "src": "25666:18:70" + }, + { + "name": "value3", + "nativeSrc": "25686:6:70", + "nodeType": "YulIdentifier", + "src": "25686:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25659:6:70", + "nodeType": "YulIdentifier", + "src": "25659:6:70" + }, + "nativeSrc": "25659:34:70", + "nodeType": "YulFunctionCall", + "src": "25659:34:70" + }, + "nativeSrc": "25659:34:70", + "nodeType": "YulExpressionStatement", + "src": "25659:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25713:9:70", + "nodeType": "YulIdentifier", + "src": "25713:9:70" + }, + { + "kind": "number", + "nativeSrc": "25724:3:70", + "nodeType": "YulLiteral", + "src": "25724:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25709:3:70", + "nodeType": "YulIdentifier", + "src": "25709:3:70" + }, + "nativeSrc": "25709:19:70", + "nodeType": "YulFunctionCall", + "src": "25709:19:70" + }, + { + "arguments": [ + { + "name": "value4", + "nativeSrc": "25734:6:70", + "nodeType": "YulIdentifier", + "src": "25734:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "25750:3:70", + "nodeType": "YulLiteral", + "src": "25750:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "25755:1:70", + "nodeType": "YulLiteral", + "src": "25755:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "25746:3:70", + "nodeType": "YulIdentifier", + "src": "25746:3:70" + }, + "nativeSrc": "25746:11:70", + "nodeType": "YulFunctionCall", + "src": "25746:11:70" + }, + { + "kind": "number", + "nativeSrc": "25759:1:70", + "nodeType": "YulLiteral", + "src": "25759:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "25742:3:70", + "nodeType": "YulIdentifier", + "src": "25742:3:70" + }, + "nativeSrc": "25742:19:70", + "nodeType": "YulFunctionCall", + "src": "25742:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "25730:3:70", + "nodeType": "YulIdentifier", + "src": "25730:3:70" + }, + "nativeSrc": "25730:32:70", + "nodeType": "YulFunctionCall", + "src": "25730:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25702:6:70", + "nodeType": "YulIdentifier", + "src": "25702:6:70" + }, + "nativeSrc": "25702:61:70", + "nodeType": "YulFunctionCall", + "src": "25702:61:70" + }, + "nativeSrc": "25702:61:70", + "nodeType": "YulExpressionStatement", + "src": "25702:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25783:9:70", + "nodeType": "YulIdentifier", + "src": "25783:9:70" + }, + { + "kind": "number", + "nativeSrc": "25794:3:70", + "nodeType": "YulLiteral", + "src": "25794:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25779:3:70", + "nodeType": "YulIdentifier", + "src": "25779:3:70" + }, + "nativeSrc": "25779:19:70", + "nodeType": "YulFunctionCall", + "src": "25779:19:70" + }, + { + "name": "value5", + "nativeSrc": "25800:6:70", + "nodeType": "YulIdentifier", + "src": "25800:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25772:6:70", + "nodeType": "YulIdentifier", + "src": "25772:6:70" + }, + "nativeSrc": "25772:35:70", + "nodeType": "YulFunctionCall", + "src": "25772:35:70" + }, + "nativeSrc": "25772:35:70", + "nodeType": "YulExpressionStatement", + "src": "25772:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address_t_bytes32__fromStack_reversed", + "nativeSrc": "25252:561:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "25422:9:70", + "nodeType": "YulTypedName", + "src": "25422:9:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "25433:6:70", + "nodeType": "YulTypedName", + "src": "25433:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "25441:6:70", + "nodeType": "YulTypedName", + "src": "25441:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "25449:6:70", + "nodeType": "YulTypedName", + "src": "25449:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "25457:6:70", + "nodeType": "YulTypedName", + "src": "25457:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "25465:6:70", + "nodeType": "YulTypedName", + "src": "25465:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "25473:6:70", + "nodeType": "YulTypedName", + "src": "25473:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "25484:4:70", + "nodeType": "YulTypedName", + "src": "25484:4:70", + "type": "" + } + ], + "src": "25252:561:70" + }, + { + "body": { + "nativeSrc": "25870:116:70", + "nodeType": "YulBlock", + "src": "25870:116:70", + "statements": [ + { + "nativeSrc": "25880:20:70", + "nodeType": "YulAssignment", + "src": "25880:20:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "25895:1:70", + "nodeType": "YulIdentifier", + "src": "25895:1:70" + }, + { + "name": "y", + "nativeSrc": "25898:1:70", + "nodeType": "YulIdentifier", + "src": "25898:1:70" + } + ], + "functionName": { + "name": "mul", + "nativeSrc": "25891:3:70", + "nodeType": "YulIdentifier", + "src": "25891:3:70" + }, + "nativeSrc": "25891:9:70", + "nodeType": "YulFunctionCall", + "src": "25891:9:70" + }, + "variableNames": [ + { + "name": "product", + "nativeSrc": "25880:7:70", + "nodeType": "YulIdentifier", + "src": "25880:7:70" + } + ] + }, + { + "body": { + "nativeSrc": "25958:22:70", + "nodeType": "YulBlock", + "src": "25958:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "25960:16:70", + "nodeType": "YulIdentifier", + "src": "25960:16:70" + }, + "nativeSrc": "25960:18:70", + "nodeType": "YulFunctionCall", + "src": "25960:18:70" + }, + "nativeSrc": "25960:18:70", + "nodeType": "YulExpressionStatement", + "src": "25960:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "x", + "nativeSrc": "25929:1:70", + "nodeType": "YulIdentifier", + "src": "25929:1:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "25922:6:70", + "nodeType": "YulIdentifier", + "src": "25922:6:70" + }, + "nativeSrc": "25922:9:70", + "nodeType": "YulFunctionCall", + "src": "25922:9:70" + }, + { + "arguments": [ + { + "name": "y", + "nativeSrc": "25936:1:70", + "nodeType": "YulIdentifier", + "src": "25936:1:70" + }, + { + "arguments": [ + { + "name": "product", + "nativeSrc": "25943:7:70", + "nodeType": "YulIdentifier", + "src": "25943:7:70" + }, + { + "name": "x", + "nativeSrc": "25952:1:70", + "nodeType": "YulIdentifier", + "src": "25952:1:70" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "25939:3:70", + "nodeType": "YulIdentifier", + "src": "25939:3:70" + }, + "nativeSrc": "25939:15:70", + "nodeType": "YulFunctionCall", + "src": "25939:15:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "25933:2:70", + "nodeType": "YulIdentifier", + "src": "25933:2:70" + }, + "nativeSrc": "25933:22:70", + "nodeType": "YulFunctionCall", + "src": "25933:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "25919:2:70", + "nodeType": "YulIdentifier", + "src": "25919:2:70" + }, + "nativeSrc": "25919:37:70", + "nodeType": "YulFunctionCall", + "src": "25919:37:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "25912:6:70", + "nodeType": "YulIdentifier", + "src": "25912:6:70" + }, + "nativeSrc": "25912:45:70", + "nodeType": "YulFunctionCall", + "src": "25912:45:70" + }, + "nativeSrc": "25909:71:70", + "nodeType": "YulIf", + "src": "25909:71:70" + } + ] + }, + "name": "checked_mul_t_uint256", + "nativeSrc": "25818:168:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "25849:1:70", + "nodeType": "YulTypedName", + "src": "25849:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "25852:1:70", + "nodeType": "YulTypedName", + "src": "25852:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "product", + "nativeSrc": "25858:7:70", + "nodeType": "YulTypedName", + "src": "25858:7:70", + "type": "" + } + ], + "src": "25818:168:70" + }, + { + "body": { + "nativeSrc": "26172:217:70", + "nodeType": "YulBlock", + "src": "26172:217:70", + "statements": [ + { + "nativeSrc": "26182:27:70", + "nodeType": "YulAssignment", + "src": "26182:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26194:9:70", + "nodeType": "YulIdentifier", + "src": "26194:9:70" + }, + { + "kind": "number", + "nativeSrc": "26205:3:70", + "nodeType": "YulLiteral", + "src": "26205:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26190:3:70", + "nodeType": "YulIdentifier", + "src": "26190:3:70" + }, + "nativeSrc": "26190:19:70", + "nodeType": "YulFunctionCall", + "src": "26190:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "26182:4:70", + "nodeType": "YulIdentifier", + "src": "26182:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26225:9:70", + "nodeType": "YulIdentifier", + "src": "26225:9:70" + }, + { + "name": "value0", + "nativeSrc": "26236:6:70", + "nodeType": "YulIdentifier", + "src": "26236:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26218:6:70", + "nodeType": "YulIdentifier", + "src": "26218:6:70" + }, + "nativeSrc": "26218:25:70", + "nodeType": "YulFunctionCall", + "src": "26218:25:70" + }, + "nativeSrc": "26218:25:70", + "nodeType": "YulExpressionStatement", + "src": "26218:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26263:9:70", + "nodeType": "YulIdentifier", + "src": "26263:9:70" + }, + { + "kind": "number", + "nativeSrc": "26274:2:70", + "nodeType": "YulLiteral", + "src": "26274:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26259:3:70", + "nodeType": "YulIdentifier", + "src": "26259:3:70" + }, + "nativeSrc": "26259:18:70", + "nodeType": "YulFunctionCall", + "src": "26259:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "26283:6:70", + "nodeType": "YulIdentifier", + "src": "26283:6:70" + }, + { + "kind": "number", + "nativeSrc": "26291:4:70", + "nodeType": "YulLiteral", + "src": "26291:4:70", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "26279:3:70", + "nodeType": "YulIdentifier", + "src": "26279:3:70" + }, + "nativeSrc": "26279:17:70", + "nodeType": "YulFunctionCall", + "src": "26279:17:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26252:6:70", + "nodeType": "YulIdentifier", + "src": "26252:6:70" + }, + "nativeSrc": "26252:45:70", + "nodeType": "YulFunctionCall", + "src": "26252:45:70" + }, + "nativeSrc": "26252:45:70", + "nodeType": "YulExpressionStatement", + "src": "26252:45:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26317:9:70", + "nodeType": "YulIdentifier", + "src": "26317:9:70" + }, + { + "kind": "number", + "nativeSrc": "26328:2:70", + "nodeType": "YulLiteral", + "src": "26328:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26313:3:70", + "nodeType": "YulIdentifier", + "src": "26313:3:70" + }, + "nativeSrc": "26313:18:70", + "nodeType": "YulFunctionCall", + "src": "26313:18:70" + }, + { + "name": "value2", + "nativeSrc": "26333:6:70", + "nodeType": "YulIdentifier", + "src": "26333:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26306:6:70", + "nodeType": "YulIdentifier", + "src": "26306:6:70" + }, + "nativeSrc": "26306:34:70", + "nodeType": "YulFunctionCall", + "src": "26306:34:70" + }, + "nativeSrc": "26306:34:70", + "nodeType": "YulExpressionStatement", + "src": "26306:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26360:9:70", + "nodeType": "YulIdentifier", + "src": "26360:9:70" + }, + { + "kind": "number", + "nativeSrc": "26371:2:70", + "nodeType": "YulLiteral", + "src": "26371:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26356:3:70", + "nodeType": "YulIdentifier", + "src": "26356:3:70" + }, + "nativeSrc": "26356:18:70", + "nodeType": "YulFunctionCall", + "src": "26356:18:70" + }, + { + "name": "value3", + "nativeSrc": "26376:6:70", + "nodeType": "YulIdentifier", + "src": "26376:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26349:6:70", + "nodeType": "YulIdentifier", + "src": "26349:6:70" + }, + "nativeSrc": "26349:34:70", + "nodeType": "YulFunctionCall", + "src": "26349:34:70" + }, + "nativeSrc": "26349:34:70", + "nodeType": "YulExpressionStatement", + "src": "26349:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed", + "nativeSrc": "25991:398:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "26117:9:70", + "nodeType": "YulTypedName", + "src": "26117:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "26128:6:70", + "nodeType": "YulTypedName", + "src": "26128:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "26136:6:70", + "nodeType": "YulTypedName", + "src": "26136:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "26144:6:70", + "nodeType": "YulTypedName", + "src": "26144:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "26152:6:70", + "nodeType": "YulTypedName", + "src": "26152:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "26163:4:70", + "nodeType": "YulTypedName", + "src": "26163:4:70", + "type": "" + } + ], + "src": "25991:398:70" + } + ] + }, + "contents": "{\n { }\n function abi_decode_tuple_t_bytes32t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function validator_revert_uint64(value)\n {\n if iszero(eq(value, and(value, sub(shl(64, 1), 1)))) { revert(0, 0) }\n }\n function validator_revert_uint32(value)\n {\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_uint64t_uint256t_uint32t_uint32(headStart, dataEnd) -> value0, value1, value2, value3, value4, value5\n {\n if slt(sub(dataEnd, headStart), 192) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_uint64(value_2)\n value2 := value_2\n let value_3 := 0\n value_3 := calldataload(add(headStart, 96))\n value3 := value_3\n let value_4 := calldataload(add(headStart, 128))\n validator_revert_uint32(value_4)\n value4 := value_4\n let value_5 := calldataload(add(headStart, 160))\n validator_revert_uint32(value_5)\n value5 := value_5\n }\n function abi_decode_tuple_t_bytes32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n }\n function panic_error_0x21()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_enum_DisputeStatus(value, pos)\n {\n if iszero(lt(value, 6)) { panic_error_0x21() }\n mstore(pos, value)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256_t_bytes32_t_enum$_DisputeType_$14913_t_enum$_DisputeStatus_$14921_t_uint256_t_uint256_t_uint256__to_t_address_t_address_t_uint256_t_bytes32_t_uint8_t_uint8_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value8, value7, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 288)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n if iszero(lt(value4, 4)) { panic_error_0x21() }\n mstore(add(headStart, 128), value4)\n abi_encode_enum_DisputeStatus(value5, add(headStart, 160))\n mstore(add(headStart, 192), value6)\n mstore(add(headStart, 224), value7)\n mstore(add(headStart, 256), value8)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n }\n function abi_encode_tuple_t_contract$_ISubgraphService_$15634__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_addresst_bytes32(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n }\n function abi_decode_tuple_t_struct$_Receipt_$16044_calldata_ptr(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 96)\n if _1 { revert(0, 0) }\n _1 := 0\n value0 := headStart\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_uint32(value)\n value0 := value\n }\n function abi_decode_tuple_t_addresst_addresst_uint256t_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := 0\n value_2 := calldataload(add(headStart, 64))\n value2 := value_2\n let value_3 := 0\n value_3 := calldataload(add(headStart, 96))\n value3 := value_3\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function validator_revert_bool(value)\n {\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes32t_uint256t_boolt_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_bool(value_2)\n value2 := value_2\n let value_3 := 0\n value_3 := calldataload(add(headStart, 96))\n value3 := value_3\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, sub(shl(64, 1), 1)) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, sub(shl(64, 1), 1)) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function allocate_memory() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 192)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n mstore(64, newFreePtr)\n }\n function allocate_memory_2390() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0x0120)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n mstore(64, newFreePtr)\n }\n function allocate_memory_2392() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 320)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n mstore(64, newFreePtr)\n }\n function abi_decode_tuple_t_struct$_State_$16058_memory_ptr(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 192)\n if _1 { revert(0, 0) }\n _1 := 0\n let value := allocate_memory()\n let value_1 := _1\n value_1 := calldataload(headStart)\n mstore(value, value_1)\n let value_2 := _1\n value_2 := calldataload(add(headStart, 32))\n mstore(add(value, 32), value_2)\n let value_3 := _1\n value_3 := calldataload(add(headStart, 64))\n mstore(add(value, 64), value_3)\n let value_4 := _1\n value_4 := calldataload(add(headStart, 96))\n mstore(add(value, 96), value_4)\n let value_5 := _1\n value_5 := calldataload(add(headStart, 128))\n mstore(add(value, 128), value_5)\n let value_6 := calldataload(add(headStart, 160))\n if iszero(eq(value_6, and(value_6, 0xff))) { revert(_1, _1) }\n mstore(add(value, 160), value_6)\n value0 := value\n }\n function abi_decode_struct_State_calldata(offset, end) -> value\n {\n if slt(sub(end, offset), 192) { revert(0, 0) }\n value := offset\n }\n function abi_decode_tuple_t_struct$_State_$16058_calldata_ptrt_struct$_State_$16058_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 384) { revert(0, 0) }\n value0 := abi_decode_struct_State_calldata(headStart, dataEnd)\n value1 := abi_decode_struct_State_calldata(add(headStart, 192), dataEnd)\n }\n function abi_decode_tuple_t_uint64(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_uint64(value)\n value0 := value\n }\n function abi_encode_tuple_t_enum$_DisputeStatus_$14921__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n abi_encode_enum_DisputeStatus(value0, headStart)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint64__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n }\n function abi_decode_tuple_t_struct$_Receipt_$16044_memory_ptr(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 96)\n if _1 { revert(0, 0) }\n _1 := 0\n let memPtr := _1\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 96)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr))\n {\n mstore(_1, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(_1, 0x24)\n }\n mstore(64, newFreePtr)\n let value := _1\n value := calldataload(headStart)\n mstore(memPtr, value)\n let value_1 := _1\n value_1 := calldataload(add(headStart, 32))\n mstore(add(memPtr, 32), value_1)\n let value_2 := _1\n value_2 := calldataload(add(headStart, 64))\n mstore(add(memPtr, 64), value_2)\n value0 := memPtr\n }\n function abi_encode_tuple_packed_t_address_t_stringliteral_b7ccb6878fbded310d2d05350bca9c84568ecb568d4b626c83e0508c3193ce89__to_t_address_t_string_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, and(shl(96, value0), not(sub(shl(96, 1), 1))))\n mstore(add(pos, 20), \"legacy\")\n end := add(pos, 26)\n }\n function abi_decode_address_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_address(value)\n }\n function abi_decode_struct_Allocation_fromMemory(headStart, end) -> value\n {\n if slt(sub(end, headStart), 0x0120) { revert(0, 0) }\n value := allocate_memory_2390()\n mstore(value, abi_decode_address_fromMemory(headStart))\n let value_1 := 0\n value_1 := mload(add(headStart, 32))\n mstore(add(value, 32), value_1)\n let value_2 := 0\n value_2 := mload(add(headStart, 64))\n mstore(add(value, 64), value_2)\n let value_3 := 0\n value_3 := mload(add(headStart, 96))\n mstore(add(value, 96), value_3)\n let value_4 := 0\n value_4 := mload(add(headStart, 128))\n mstore(add(value, 128), value_4)\n let value_5 := 0\n value_5 := mload(add(headStart, 160))\n mstore(add(value, 160), value_5)\n let value_6 := 0\n value_6 := mload(add(headStart, 192))\n mstore(add(value, 192), value_6)\n let value_7 := 0\n value_7 := mload(add(headStart, 224))\n mstore(add(value, 224), value_7)\n let value_8 := 0\n value_8 := mload(add(headStart, 256))\n mstore(add(value, 256), value_8)\n }\n function abi_decode_tuple_t_struct$_Allocation_$3073_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 288) { revert(0, 0) }\n value0 := abi_decode_struct_Allocation_fromMemory(headStart, dataEnd)\n }\n function panic_error_0x11()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n mstore(add(add(pos, i), 0x20), mload(add(add(value, i), 0x20)))\n }\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), not(31))), 0x20)\n }\n function abi_encode_tuple_t_address_t_bytes_memory_ptr__to_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_encode_tuple_t_address_t_uint256_t_uint256__to_t_address_t_uint256_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n }\n function abi_decode_uint32_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_uint32(value)\n }\n function abi_decode_uint64_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_uint64(value)\n }\n function abi_decode_tuple_t_struct$_Provision_$3962_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 320)\n if _1 { revert(0, 0) }\n _1 := 0\n let value := allocate_memory_2392()\n let value_1 := _1\n value_1 := mload(headStart)\n mstore(value, value_1)\n let value_2 := _1\n value_2 := mload(add(headStart, 32))\n mstore(add(value, 32), value_2)\n let value_3 := _1\n value_3 := mload(add(headStart, 64))\n mstore(add(value, 64), value_3)\n mstore(add(value, 96), abi_decode_uint32_fromMemory(add(headStart, 96)))\n mstore(add(value, 128), abi_decode_uint64_fromMemory(add(headStart, 128)))\n mstore(add(value, 160), abi_decode_uint64_fromMemory(add(headStart, 160)))\n mstore(add(value, 192), abi_decode_uint32_fromMemory(add(headStart, 192)))\n mstore(add(value, 224), abi_decode_uint64_fromMemory(add(headStart, 224)))\n let value_4 := _1\n value_4 := mload(add(headStart, 256))\n mstore(add(value, 256), value_4)\n let value_5 := _1\n value_5 := mload(add(headStart, 288))\n mstore(add(value, 288), value_5)\n value0 := value\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32_t_bytes32__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 192)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function abi_decode_tuple_t_struct$_State_$15663_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 288) { revert(0, 0) }\n value0 := abi_decode_struct_Allocation_fromMemory(headStart, dataEnd)\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), value2)\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_bool(value)\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 9)\n mstore(add(headStart, 64), \"!transfer\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_packed_t_address_t_bytes32__to_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n mstore(pos, and(shl(96, value0), not(sub(shl(96, 1), 1))))\n mstore(add(pos, 20), value1)\n end := add(pos, 52)\n }\n function abi_encode_tuple_t_uint256_t_address_t_bytes32_t_uint256_t_uint256__to_t_uint256_t_address_t_bytes32_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_bytes32_t_bytes32__to_t_string_memory_ptr_t_bytes32_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n mstore(pos, shl(240, 6401))\n mstore(add(pos, 2), value0)\n mstore(add(pos, 34), value1)\n end := add(pos, 66)\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_struct$_DelegationPool_$3992_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 160)\n if _1 { revert(0, 0) }\n _1 := 0\n let memPtr := _1\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 160)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr))\n {\n mstore(_1, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(_1, 0x24)\n }\n mstore(64, newFreePtr)\n let value := _1\n value := mload(headStart)\n mstore(memPtr, value)\n let value_1 := _1\n value_1 := mload(add(headStart, 32))\n mstore(add(memPtr, 32), value_1)\n let value_2 := _1\n value_2 := mload(add(headStart, 64))\n mstore(add(memPtr, 64), value_2)\n let value_3 := _1\n value_3 := mload(add(headStart, 96))\n mstore(add(memPtr, 96), value_3)\n let value_4 := _1\n value_4 := mload(add(headStart, 128))\n mstore(add(memPtr, 128), value_4)\n value0 := memPtr\n }\n function abi_decode_tuple_t_bytes32t_bytes32t_bytes32_fromMemory(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := 0\n value := mload(headStart)\n value0 := value\n let value_1 := 0\n value_1 := mload(add(headStart, 32))\n value1 := value_1\n let value_2 := 0\n value_2 := mload(add(headStart, 64))\n value2 := value_2\n }\n function abi_encode_tuple_packed_t_bytes32_t_bytes32_t_bytes32_t_address_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_address_t_address__nonPadded_inplace_fromStack_reversed(pos, value4, value3, value2, value1, value0) -> end\n {\n mstore(pos, value0)\n mstore(add(pos, 32), value1)\n mstore(add(pos, 64), value2)\n mstore(add(pos, 96), and(shl(96, value3), not(sub(shl(96, 1), 1))))\n mstore(add(pos, 116), and(shl(96, value4), not(sub(shl(96, 1), 1))))\n end := add(pos, 136)\n }\n function abi_encode_tuple_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256_t_uint256__to_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), 160)\n tail := abi_encode_bytes(value2, add(headStart, 160))\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_encode_tuple_packed_t_bytes32_t_bytes32_t_uint8__to_t_bytes32_t_bytes32_t_uint8__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n mstore(pos, value0)\n mstore(add(pos, 32), value1)\n mstore(add(pos, 64), and(shl(248, value2), shl(248, 255)))\n end := add(pos, 65)\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address_t_bytes32__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address_t_bytes32__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 192)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), and(value4, sub(shl(160, 1), 1)))\n mstore(add(headStart, 160), value5)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n product := mul(x, y)\n if iszero(or(iszero(x), eq(y, div(product, x)))) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}", + "id": 70, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": { + "4591": [ + { + "length": 32, + "start": 6604 + } + ], + "4595": [ + { + "length": 32, + "start": 7971 + } + ] + }, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1A1 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x50B17AD EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0x533E1BA EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xBC7344B EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x11BE1997 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x16972978 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x17337B46 EQ PUSH2 0x28B JUMPI DUP1 PUSH4 0x1792F194 EQ PUSH2 0x295 JUMPI DUP1 PUSH4 0x26058249 EQ PUSH2 0x2A8 JUMPI DUP1 PUSH4 0x29E03FF1 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0x36167E03 EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0x4BC5839A EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0x5AEA0EC4 EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x5BF31D4D EQ PUSH2 0x326 JUMPI DUP1 PUSH4 0x6369DF6B EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0x6CC6CDE1 EQ PUSH2 0x353 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x76C993AE EQ PUSH2 0x36E JUMPI DUP1 PUSH4 0x8D4E9008 EQ PUSH2 0x381 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x394 JUMPI DUP1 PUSH4 0x902A4938 EQ PUSH2 0x39C JUMPI DUP1 PUSH4 0x9334EA52 EQ PUSH2 0x3AC JUMPI DUP1 PUSH4 0x93A90A1E EQ PUSH2 0x3BF JUMPI DUP1 PUSH4 0x9F81A7CF EQ PUSH2 0x3D2 JUMPI DUP1 PUSH4 0xB0E2F7E9 EQ PUSH2 0x3E5 JUMPI DUP1 PUSH4 0xB0EEFABE EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0xBB2A2B47 EQ PUSH2 0x40B JUMPI DUP1 PUSH4 0xBE41F384 EQ PUSH2 0x419 JUMPI DUP1 PUSH4 0xC133B429 EQ PUSH2 0x43C JUMPI DUP1 PUSH4 0xC50A77B1 EQ PUSH2 0x44F JUMPI DUP1 PUSH4 0xC894222E EQ PUSH2 0x462 JUMPI DUP1 PUSH4 0xC9747F51 EQ PUSH2 0x483 JUMPI DUP1 PUSH4 0xCC2D55CD EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0xD36FC9D4 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xD76F62D1 EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4CB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B9 PUSH2 0x1B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x2C8A JUMP JUMPDEST PUSH2 0x4DE JUMP JUMPDEST STOP JUMPDEST PUSH1 0x36 SLOAD PUSH2 0x1D2 SWAP1 PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP2 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1B9 PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x2CF9 JUMP JUMPDEST PUSH2 0x5FC JUMP JUMPDEST PUSH2 0x263 PUSH2 0x209 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x4 DUP6 ADD SLOAD PUSH1 0x5 DUP7 ADD SLOAD PUSH1 0x6 DUP8 ADD SLOAD PUSH1 0x7 SWAP1 SWAP8 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP7 DUP8 AND SWAP8 SWAP7 SWAP1 SWAP6 AND SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 PUSH1 0xFF DUP1 DUP5 AND SWAP5 PUSH2 0x100 SWAP1 SWAP5 DIV AND SWAP3 DUP10 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2DB5 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x734 JUMP JUMPDEST PUSH2 0x1D2 PUSH3 0x7A120 DUP2 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x2A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x748 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH2 0x2BB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x2D1 PUSH1 0x35 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DF JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x2ED CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x8A8 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x300 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E34 JUMP JUMPDEST PUSH2 0x9AE JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP2 SWAP1 PUSH2 0x2E60 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH2 0x319 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x34E CALLDATASIZE PUSH1 0x4 PUSH2 0x2E74 JUMP JUMPDEST PUSH2 0x9E6 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH2 0x2BB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x37C CALLDATASIZE PUSH1 0x4 PUSH2 0x2E8F JUMP JUMPDEST PUSH2 0xA13 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x38F CALLDATASIZE PUSH1 0x4 PUSH2 0x2EAC JUMP JUMPDEST PUSH2 0xA24 JUMP JUMPDEST PUSH2 0x2BB PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x36 SLOAD PUSH2 0x1D2 SWAP1 PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3BA CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0xDE0 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3CD CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0xEDF JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x2E8F JUMP JUMPDEST PUSH2 0xEF0 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x3F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x2F1D JUMP JUMPDEST PUSH2 0xF01 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x406 CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0x1062 JUMP JUMPDEST PUSH1 0x36 SLOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1D2 JUMP JUMPDEST PUSH2 0x42C PUSH2 0x427 CALLDATASIZE PUSH1 0x4 PUSH2 0x2D72 JUMP JUMPDEST PUSH2 0x1073 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1DF JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x44A CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0x10A9 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x45D CALLDATASIZE PUSH1 0x4 PUSH2 0x2FA4 JUMP JUMPDEST PUSH2 0x1141 JUMP JUMPDEST PUSH2 0x475 PUSH2 0x470 CALLDATASIZE PUSH1 0x4 PUSH2 0x2FE5 JUMP JUMPDEST PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1DF SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST PUSH2 0x2BB PUSH2 0x491 CALLDATASIZE PUSH1 0x4 PUSH2 0x30FA JUMP JUMPDEST PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x2D1 PUSH8 0xDE0B6B3A7640000 DUP2 JUMP JUMPDEST PUSH2 0x42C PUSH2 0x4B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x317C JUMP JUMPDEST PUSH2 0x14CD JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x4C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x31B2 JUMP JUMPDEST PUSH2 0x14F5 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x4D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x2EF2 JUMP JUMPDEST PUSH2 0x1506 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x509 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x513 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x53E JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x56C JUMPI PUSH2 0x56C PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0x5A6 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP4 SWAP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x40 MLOAD PUSH4 0x64D0C32B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x5F6 DUP5 DUP3 DUP6 PUSH2 0x1541 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x606 PUSH2 0x15F2 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND ISZERO SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 DUP2 ISZERO DUP1 ISZERO PUSH2 0x62D JUMPI POP DUP3 JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x1 EQ DUP1 ISZERO PUSH2 0x649 JUMPI POP ADDRESS EXTCODESIZE ISZERO JUMPDEST SWAP1 POP DUP2 ISZERO DUP1 ISZERO PUSH2 0x657 JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x675 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB NOT AND PUSH1 0x1 OR DUP6 SSTORE DUP4 ISZERO PUSH2 0x69E JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL OR DUP6 SSTORE JUMPDEST PUSH2 0x6A7 DUP12 PUSH2 0x161B JUMP JUMPDEST PUSH2 0x6AF PUSH2 0x162C JUMP JUMPDEST PUSH2 0x6B8 DUP11 PUSH2 0x163C JUMP JUMPDEST PUSH2 0x6C1 DUP10 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x6CA DUP9 PUSH2 0x1736 JUMP JUMPDEST PUSH2 0x6D3 DUP8 PUSH2 0x1799 JUMP JUMPDEST PUSH2 0x6DC DUP7 PUSH2 0x180B JUMP JUMPDEST DUP4 ISZERO PUSH2 0x727 JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND DUP6 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC7F505B2F371AE2175EE4913F4499E1F2633A7B5936321EED1CDAEB6115181D2 SWAP1 PUSH2 0x71E SWAP1 PUSH1 0x1 SWAP1 PUSH2 0x2E60 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x73C PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x1736 JUMP JUMPDEST POP JUMP JUMPDEST DUP1 PUSH2 0x752 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x774 JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x7AF JUMPI PUSH1 0x40 MLOAD PUSH4 0x82C0055 PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x7B9 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x7DB JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x809 JUMPI PUSH2 0x809 PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0x843 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x6 DUP2 ADD SLOAD TIMESTAMP LT ISZERO PUSH2 0x877 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1D7753D5 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x881 DUP5 DUP3 PUSH2 0x18C4 JUMP JUMPDEST PUSH1 0x3 DUP2 ADD SLOAD ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x5F6 SWAP2 SWAP1 PUSH2 0x18C4 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x8D3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x8DD DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0x8FF JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x92D JUMPI PUSH2 0x92D PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0x967 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD SLOAD DUP4 SWAP1 ISZERO PUSH2 0x99E JUMPI PUSH1 0x40 MLOAD PUSH4 0x64D0C32B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x9A9 DUP4 DUP3 PUSH2 0x194B JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9CF CALLER PUSH1 0x35 SLOAD PUSH2 0x9BF PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x19EE JUMP JUMPDEST PUSH2 0x9DD CALLER PUSH1 0x35 SLOAD DUP6 DUP6 PUSH2 0x1AA6 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9E0 PUSH2 0x9FA CALLDATASIZE DUP5 SWAP1 SUB DUP5 ADD DUP5 PUSH2 0x31DD JUMP JUMPDEST PUSH2 0x1E28 JUMP JUMPDEST PUSH2 0xA07 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0xA11 PUSH1 0x0 PUSH2 0x1EC5 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xA1B PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x1799 JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xA52 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 DUP8 SWAP1 SHL AND PUSH1 0x20 DUP3 ADD MSTORE PUSH6 0x6C6567616379 PUSH1 0xD0 SHL PUSH1 0x34 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH1 0x3A ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xAA0 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE022923 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xACB SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAE9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xB0D SWAP2 SWAP1 PUSH2 0x32D9 JUMP JUMPDEST MLOAD SWAP1 POP DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xB39 JUMPI PUSH1 0x40 MLOAD PUSH4 0x34789D8B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND DUP3 MSTORE DUP9 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0xA0 DUP3 ADD MSTORE TIMESTAMP PUSH1 0xC0 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x34 SLOAD PUSH1 0xE0 DUP4 ADD SWAP2 PUSH2 0xBA1 SWAP2 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND SWAP1 PUSH2 0x330C JUMP JUMPDEST DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 SWAP2 DUP3 ADD DUP2 SWAP1 MSTORE DUP5 DUP2 MSTORE PUSH1 0x37 DUP3 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP4 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP4 SSTORE SWAP4 DUP6 ADD MLOAD PUSH1 0x1 DUP1 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP6 AND OR SWAP1 SSTORE SWAP1 DUP4 ADD MLOAD PUSH1 0x2 DUP3 ADD SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x3 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x4 DUP4 ADD DUP1 SLOAD SWAP4 SWAP5 SWAP2 SWAP4 SWAP1 SWAP3 PUSH1 0xFF NOT SWAP1 SWAP2 AND SWAP2 SWAP1 DUP5 SWAP1 DUP2 GT ISZERO PUSH2 0xC2F JUMPI PUSH2 0xC2F PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 DUP4 PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xC59 JUMPI PUSH2 0xC59 PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0x5 DUP3 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0x6 DUP3 ADD SSTORE PUSH2 0x100 SWAP1 SWAP2 ADD MLOAD PUSH1 0x7 SWAP1 SWAP2 ADD SSTORE PUSH1 0x0 PUSH2 0xC89 PUSH2 0x1F45 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xCB8347FE DUP4 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xCAE SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCDA SWAP3 SWAP2 SWAP1 PUSH2 0x3365 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD08 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xD29 DUP8 DUP7 PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x1F81 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP10 SWAP1 MSTORE SWAP2 DUP2 ADD DUP8 SWAP1 MSTORE DUP2 DUP10 AND SWAP2 DUP5 AND SWAP1 DUP6 SWAP1 PUSH32 0x587A1FC7E80E653A2AB7F63F98C080F5818B8CEDCFD1374590C8C786290ED031 SWAP1 PUSH1 0x60 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x359D DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP9 PUSH1 0x40 MLOAD PUSH2 0xDB1 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xDD0 PUSH2 0x1FBC JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xE0B JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xE15 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0xE37 JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xE65 JUMPI PUSH2 0xE65 PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0xE9F JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xEB8 DUP4 DUP3 PUSH2 0x1FE0 JUMP JUMPDEST PUSH1 0x3 DUP2 ADD SLOAD ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x9A9 SWAP2 SWAP1 PUSH2 0x1FE0 JUMP JUMPDEST PUSH2 0xEE7 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x205F JUMP JUMPDEST PUSH2 0xEF8 PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x180B JUMP JUMPDEST PUSH1 0x34 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xF2C JUMPI PUSH1 0x40 MLOAD PUSH4 0xA8BAF3BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH2 0xF36 DUP2 PUSH2 0x1073 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0xF58 JUMPI PUSH1 0x40 MLOAD PUSH4 0x14A03BBD PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x4 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xF86 JUMPI PUSH2 0xF86 PUSH2 0x2D8B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP2 EQ PUSH2 0xFC0 JUMPI PUSH1 0x40 MLOAD PUSH4 0x146E540F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x31CF JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD ISZERO ISZERO DUP6 SWAP1 PUSH2 0xFFA JUMPI PUSH1 0x40 MLOAD PUSH1 0x1 PUSH3 0xD62C07 PUSH1 0xE0 SHL SUB NOT DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1014 DUP7 DUP3 DUP8 PUSH2 0x1541 JUMP JUMPDEST DUP4 ISZERO PUSH2 0x103D JUMPI PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1038 SWAP2 SWAP1 DUP6 PUSH2 0x1541 JUMP JUMPDEST PUSH2 0x105A JUMP JUMPDEST PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x105A SWAP2 SWAP1 PUSH2 0x1FE0 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x106A PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x163C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x4 ADD SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x10A1 JUMPI PUSH2 0x10A1 PUSH2 0x2D8B JUMP JUMPDEST EQ ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x10B4 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP5 PUSH2 0x10CB PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x10E8 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1106 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x112A SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST SWAP1 POP PUSH2 0x113A DUP4 DUP3 PUSH1 0x0 ADD MLOAD PUSH2 0x20D0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1152 CALLER PUSH1 0x35 SLOAD PUSH2 0x9BF PUSH2 0x19CA JUMP JUMPDEST PUSH2 0x9DD CALLER PUSH1 0x35 SLOAD PUSH2 0x1198 DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2165 SWAP3 POP POP POP JUMP JUMPDEST DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x22A5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 CALLER SWAP1 POP PUSH1 0x0 PUSH2 0x121D DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2165 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1260 DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x2165 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH2 0x126C DUP3 DUP3 PUSH2 0x25A4 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD MLOAD PUSH1 0x40 DUP1 DUP8 ADD MLOAD DUP7 MLOAD SWAP4 DUP8 ADD MLOAD SWAP2 DUP8 ADD MLOAD SWAP5 SWAP6 SWAP3 SWAP5 SWAP1 SWAP4 SWAP3 PUSH2 0x12CB JUMPI PUSH1 0x40 MLOAD PUSH4 0x6ABA5297 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x24 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x44 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD MSTORE PUSH1 0xA4 DUP3 ADD MSTORE PUSH1 0xC4 ADD PUSH2 0x535 JUMP JUMPDEST POP POP POP POP POP POP PUSH2 0x12E0 CALLER PUSH1 0x35 SLOAD PUSH2 0x9BF PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1332 DUP5 PUSH1 0x2 PUSH1 0x35 SLOAD PUSH2 0x12F5 SWAP2 SWAP1 PUSH2 0x3466 JUMP JUMPDEST DUP6 DUP14 DUP14 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x22A5 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1386 DUP6 PUSH1 0x2 PUSH1 0x35 SLOAD PUSH2 0x1349 SWAP2 SWAP1 PUSH2 0x3466 JUMP JUMPDEST DUP6 DUP13 DUP13 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x22A5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x37 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 PUSH1 0x3 SWAP1 DUP2 ADD DUP5 SWAP1 SSTORE DUP4 DUP4 MSTORE DUP2 DUP4 KECCAK256 ADD DUP6 SWAP1 SSTORE MLOAD SWAP2 SWAP3 POP DUP3 SWAP2 DUP5 SWAP2 PUSH32 0xFEC135A4CF8E5C6E13DEA23BE058BF03A8BF8F1F6FB0A021B0A5AEDDFBA81407 SWAP2 LOG3 SWAP1 SWAP11 SWAP1 SWAP10 POP SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x13EE DUP4 PUSH2 0x25D5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x13FA PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE022923 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1425 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1443 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1467 SWAP2 SWAP1 PUSH2 0x32D9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1495 JUMPI PUSH1 0x40 MLOAD PUSH4 0x34789D8B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST POP PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x20 DUP3 ADD MLOAD SWAP1 DUP2 DUP2 EQ PUSH2 0x14C3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA24CFE5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9DD PUSH2 0x14E1 CALLDATASIZE DUP6 SWAP1 SUB DUP6 ADD DUP6 PUSH2 0x30FA JUMP JUMPDEST PUSH2 0x14F0 CALLDATASIZE DUP6 SWAP1 SUB DUP6 ADD DUP6 PUSH2 0x30FA JUMP JUMPDEST PUSH2 0x25A4 JUMP JUMPDEST PUSH2 0x14FD PUSH2 0x1892 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x150E PUSH2 0x1892 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1538 JUMPI PUSH1 0x0 PUSH1 0x40 MLOAD PUSH4 0x1E4FBDF7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x1EC5 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x7 DUP4 ADD SLOAD PUSH1 0x0 SWAP2 PUSH2 0x1562 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH2 0x265E JUMP JUMPDEST PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 OR SWAP1 SSTORE PUSH1 0x1 DUP5 ADD SLOAD PUSH1 0x2 DUP6 ADD SLOAD SWAP2 SWAP3 POP PUSH2 0x15A2 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH2 0x159A SWAP1 DUP5 PUSH2 0x330C JUMP JUMPDEST PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 DUP4 ADD SLOAD DUP4 SLOAD PUSH1 0x2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP7 SWAP1 PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x359D DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE SWAP1 PUSH2 0x15DB SWAP1 DUP7 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0xF0C57E16840DF040F15088DC2F81FE391C3923BEC73E23A9662EFC9C229C6A00 PUSH2 0x9E0 JUMP JUMPDEST PUSH2 0x1623 PUSH2 0x280F JUMP JUMPDEST PUSH2 0x745 DUP2 PUSH2 0x2834 JUMP JUMPDEST PUSH2 0x1634 PUSH2 0x280F JUMP JUMPDEST PUSH2 0xA11 PUSH2 0x283C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1663 JUMPI PUSH1 0x40 MLOAD PUSH4 0x616BC441 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x34 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x51744122301B50E919F4E3D22ADF8C53ABC92195B8C667EDA98C6EF20375672E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 SUB PUSH2 0x16D7 JUMPI PUSH1 0x40 MLOAD PUSH4 0xC4411F11 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x34 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x310462A9BF49FFF4A57910EC647C77CBF8AAF2F13394554AC6CDF14FC68DB7E6 SWAP1 PUSH2 0x172B SWAP1 DUP4 SWAP1 PUSH2 0x2E60 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST DUP1 PUSH8 0xDE0B6B3A7640000 DUP2 LT ISZERO PUSH2 0x1763 JUMPI PUSH1 0x40 MLOAD PUSH4 0x33F4E05 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x35 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x97896B9DA0F97F36BF3011570BCFF930069299DE4B1E89C9CB44909841CAC2F8 SWAP1 PUSH1 0x20 ADD PUSH2 0x172B JUMP JUMPDEST DUP1 PUSH3 0x7A120 PUSH4 0xFFFFFFFF DUP3 AND GT ISZERO PUSH2 0x17C5 JUMPI PUSH1 0x40 MLOAD PUSH4 0x432E6643 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST POP PUSH1 0x36 DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC573DC0F869F6A1D0A74FC7712A63BAABCB5567131D2D98005E163924EDDCBAB SWAP1 PUSH2 0x172B SWAP1 DUP4 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST DUP1 PUSH4 0xFFFFFFFF DUP2 AND PUSH3 0xF4240 LT ISZERO PUSH2 0x1837 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4E9374FB PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2CAC JUMP JUMPDEST POP PUSH1 0x36 DUP1 SLOAD PUSH4 0xFFFFFFFF PUSH1 0x20 SHL NOT AND PUSH1 0x1 PUSH1 0x20 SHL PUSH4 0xFFFFFFFF DUP5 DUP2 AND DUP3 MUL SWAP3 SWAP1 SWAP3 OR SWAP3 DUP4 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7EFAF01BEC3CDA8D104163BB466D01D7E16F68848301C7EB0749CFA59D680502 SWAP4 PUSH2 0x172B SWAP4 SWAP3 SWAP1 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x2CAC JUMP JUMPDEST CALLER PUSH2 0x189B PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA11 JUMPI CALLER PUSH1 0x40 MLOAD PUSH4 0x118CDAA7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x4 DUP2 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x500 OR SWAP1 SSTORE PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH2 0x18F5 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH32 0x223103F8EB52E5F43A75655152ACD882A605D70DF57A5C0FEFD30F516B1756D2 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x4 DUP2 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x200 OR SWAP1 SSTORE PUSH1 0x2 DUP2 ADD SLOAD PUSH2 0x197C SWAP1 PUSH2 0x196D PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x290E JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH32 0x2226EBD23625A7938FB786DF2248BD171D2E6AD70CB2B654EA1BE830CA17224D SWAP1 PUSH1 0x20 ADD PUSH2 0x193F JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x40 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE ADDRESS PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP4 SWAP1 MSTORE DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH1 0x64 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1A6E SWAP2 SWAP1 PUSH2 0x3488 JUMP JUMPDEST PUSH2 0x9A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x10BA3930B739B332B9 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x535 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 DUP5 SWAP1 SHL AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x34 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x54 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH2 0x1AED DUP2 PUSH2 0x1073 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x1B10 JUMPI PUSH1 0x40 MLOAD PUSH4 0x124A23F1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x1B1B PUSH2 0x1F45 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE022923 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1B4B SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B69 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1B8D SWAP2 SWAP1 PUSH2 0x32D9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1BBB JUMPI PUSH1 0x40 MLOAD PUSH4 0x34789D8B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x1BC6 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP4 DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BF3 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C35 SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SUB PUSH2 0x1C5A JUMPI PUSH1 0x40 MLOAD PUSH4 0x307EFDB7 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1C6A DUP4 DUP4 PUSH1 0x0 ADD MLOAD PUSH2 0x20D0 JUMP JUMPDEST PUSH1 0x34 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x1C8D SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP PUSH2 0x330C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP8 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE DUP16 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP14 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x60 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x80 DUP2 ADD PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE PUSH1 0x60 SWAP3 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x37 DUP4 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP4 SSTORE SWAP4 DUP7 ADD MLOAD PUSH1 0x1 DUP1 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP6 AND OR SWAP1 SSTORE SWAP1 DUP5 ADD MLOAD PUSH1 0x2 DUP3 ADD SSTORE SWAP2 DUP4 ADD MLOAD PUSH1 0x3 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD SWAP2 SWAP4 SWAP1 SWAP3 PUSH1 0xFF NOT SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 GT ISZERO PUSH2 0x1D64 JUMPI PUSH2 0x1D64 PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 DUP4 PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x1D8E JUMPI PUSH2 0x1D8E PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD PUSH1 0x5 DUP3 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD PUSH1 0x6 DUP3 ADD SSTORE PUSH2 0x100 SWAP1 SWAP2 ADD MLOAD PUSH1 0x7 SWAP1 SWAP2 ADD SSTORE DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 DUP2 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP2 DUP2 ADD DUP13 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP5 SWAP1 MSTORE DUP2 DUP16 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP10 SWAP1 PUSH32 0x8A1ECCECCE948A912E2E195DE5960359755AEAC90AD88A3FDE55A77E1A73796B SWAP1 PUSH1 0xA0 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP5 SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 MLOAD PUSH1 0x20 DUP1 DUP5 ADD MLOAD PUSH1 0x40 SWAP5 DUP6 ADD MLOAD DUP6 MLOAD PUSH32 0x32DD026408194A0D7E54CC66A2AB6C856EFC55CFCD4DD258FDE5B1A55222BAA6 DUP2 DUP6 ADD MSTORE DUP1 DUP8 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 DUP4 ADD DUP6 MSTORE DUP1 MLOAD SWAP1 DUP3 ADD KECCAK256 PUSH2 0x1901 PUSH1 0xF0 SHL PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xC2 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0xE2 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP4 MLOAD DUP1 DUP4 SUB SWAP1 SWAP4 ADD DUP4 MSTORE PUSH2 0x102 SWAP1 SWAP2 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1ECF PUSH2 0x1FBC JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP4 SWAP5 POP SWAP2 AND SWAP2 DUP3 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F71 JUMPI PUSH1 0x40 MLOAD PUSH4 0xBD088B4F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x9A9 JUMPI PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP4 SWAP1 MSTORE DUP5 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH1 0x44 ADD PUSH2 0x1A2B JUMP JUMPDEST PUSH32 0x9016D09D72D40FDAE2FD8CEAC6B6234C7706214FD39C1CD1E609A0528C199300 SWAP1 JUMP JUMPDEST PUSH1 0x4 DUP2 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x300 OR SWAP1 SSTORE PUSH1 0x1 DUP2 ADD SLOAD PUSH1 0x2 DUP3 ADD SLOAD PUSH2 0x2011 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0xD19 PUSH2 0x19CA JUMP JUMPDEST PUSH1 0x1 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 PUSH32 0xF0912EFB86EA1D65A17D64D48393CDB1CA0EA5220DD2BBE438621199D30955B7 SWAP1 PUSH1 0x20 ADD PUSH2 0x193F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH4 0x616BC441 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x81DCB738DA3DABD5BB2ADBC7DD107FBBFCA936E9C8AECAB25F5B17A710A784C7 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x20DB PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x561285E4 DUP6 PUSH2 0x20F2 PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x210F SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x212C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2150 SWAP2 SWAP1 PUSH2 0x34A5 JUMP JUMPDEST MLOAD SWAP1 POP PUSH2 0x215D DUP2 DUP5 PUSH2 0x330C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH2 0x21A4 PUSH1 0x20 DUP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21AE SWAP2 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21B9 SWAP1 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST DUP3 MLOAD SWAP1 DUP2 EQ SWAP1 PUSH1 0x1 PUSH2 0x21CC PUSH1 0x20 DUP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21D6 SWAP2 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x21E1 SWAP1 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x2202 JUMPI PUSH1 0x40 MLOAD PUSH4 0x3FDF3423 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x221D SWAP2 SWAP1 PUSH2 0x3524 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 PUSH2 0x2230 DUP7 PUSH1 0x60 PUSH2 0x296E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2249 DUP8 PUSH2 0x2244 PUSH1 0x20 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x296E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x226D DUP9 PUSH1 0x20 PUSH2 0x225E DUP2 PUSH1 0x60 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x2268 SWAP2 SWAP1 PUSH2 0x330C JUMP JUMPDEST PUSH2 0x29B9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE SWAP8 DUP9 MSTORE PUSH1 0x20 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE SWAP5 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP5 ADD MSTORE POP PUSH1 0xFF AND PUSH1 0xA0 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x22B1 DUP5 PUSH2 0x13E2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22BD PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP4 PUSH2 0x22D4 PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22F1 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x230F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2333 SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SUB PUSH2 0x2358 JUMPI PUSH1 0x40 MLOAD PUSH4 0x307EFDB7 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 MLOAD PUSH1 0x20 DUP1 DUP8 ADD MLOAD PUSH1 0x40 DUP1 DUP10 ADD MLOAD DUP2 MLOAD SWAP4 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT DUP5 DUP4 SHL DUP2 AND PUSH1 0x80 DUP4 ADD MSTORE SWAP2 DUP10 SWAP1 SHL SWAP1 SWAP2 AND PUSH1 0x94 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH1 0xA8 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH2 0x23C1 DUP2 PUSH2 0x1073 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x23E4 JUMPI PUSH1 0x40 MLOAD PUSH4 0x124A23F1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x23F5 DUP5 DUP5 PUSH1 0x0 ADD MLOAD PUSH2 0x20D0 JUMP JUMPDEST PUSH1 0x34 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x2418 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP PUSH2 0x330C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND DUP3 MSTORE DUP14 AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x60 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0x80 DUP2 ADD PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP2 MSTORE TIMESTAMP PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE PUSH1 0x60 SWAP3 DUP4 ADD DUP7 SWAP1 MSTORE PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x37 DUP4 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP4 SSTORE SWAP4 DUP7 ADD MLOAD PUSH1 0x1 DUP1 DUP5 ADD DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP6 AND OR SWAP1 SSTORE SWAP1 DUP5 ADD MLOAD PUSH1 0x2 DUP3 ADD SSTORE SWAP2 DUP4 ADD MLOAD PUSH1 0x3 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x80 DUP5 ADD MLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD SWAP2 SWAP4 SWAP1 SWAP3 PUSH1 0xFF NOT SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 GT ISZERO PUSH2 0x24ED JUMPI PUSH2 0x24ED PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH2 0xFF00 NOT AND PUSH2 0x100 DUP4 PUSH1 0x5 DUP2 GT ISZERO PUSH2 0x2517 JUMPI PUSH2 0x2517 PUSH2 0x2D8B JUMP JUMPDEST MUL OR SWAP1 SSTORE POP PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD SSTORE SWAP1 POP POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH32 0xFB70FAF7306B83C2CEC6D8C1627BAAD892CB79968A02CC0353174499ECFD8B35 DUP13 DUP13 PUSH1 0x40 ADD MLOAD DUP13 DUP8 DUP10 PUSH1 0x40 MLOAD PUSH2 0x258E SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3552 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MLOAD PUSH1 0x0 SWAP2 EQ DUP1 ISZERO PUSH2 0x25BF JUMPI POP DUP2 PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD EQ JUMPDEST DUP1 ISZERO PUSH2 0x9DD JUMPI POP POP PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MLOAD EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP3 ADD MSTORE DUP3 DUP3 ADD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x0 SWAP1 DUP2 PUSH2 0x2605 DUP3 PUSH2 0x1E28 JUMP JUMPDEST SWAP1 POP PUSH2 0x215D DUP2 DUP6 PUSH1 0x60 ADD MLOAD DUP7 PUSH1 0x80 ADD MLOAD DUP8 PUSH1 0xA0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x264A SWAP4 SWAP3 SWAP2 SWAP1 SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xF8 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x41 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x2A04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2669 PUSH2 0x1F45 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2675 PUSH2 0x1F21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP8 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x26A2 SWAP3 SWAP2 SWAP1 PUSH2 0x3389 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x26E4 SWAP2 SWAP1 PUSH2 0x33B9 JUMP JUMPDEST PUSH1 0x36 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x2709 SWAP1 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0x20 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2A2E AND JUMP JUMPDEST SWAP1 POP DUP6 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x271A JUMPI POP DUP1 DUP7 GT ISZERO JUMPDEST DUP7 DUP3 SWAP1 SWAP2 PUSH2 0x273D JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC6B7C41 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP PUSH1 0x0 PUSH2 0x274F DUP8 DUP5 PUSH1 0x0 ADD MLOAD PUSH2 0x2A8E JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x36 SLOAD SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 PUSH2 0x2770 SWAP2 PUSH4 0xFFFFFFFF SWAP1 DUP2 AND SWAP2 AND PUSH2 0x2A8E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x277E DUP3 DUP5 PUSH2 0x2A2E JUMP JUMPDEST SWAP1 POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xCB8347FE DUP12 DUP12 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x27A3 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27CF SWAP3 SWAP2 SWAP1 PUSH2 0x3365 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x27FD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2817 PUSH2 0x2AA5 JUMP JUMPDEST PUSH2 0xA11 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1AFCD79F PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x150E PUSH2 0x280F JUMP JUMPDEST PUSH2 0x2844 PUSH2 0x280F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xD87CD6EF79D4E2B95E15CE8ABF732DB51EC771F1CA2EDCCF22A46C729AC56472 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x171A7FA058648750A8C5AAE430F30DB8D0100EFC3A5E1B2E8054B1C1CE28B6B4 SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x44852B2A670ADE5407E78FB2863C51DE9FCB96542A07186FE3AEDA6BB8A116D PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH32 0xA070FFB1CD7409649BF77822CCE74495468E06DBFAEF09556838BF188679B9C2 PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 PUSH1 0x0 SSTORE JUMP JUMPDEST DUP1 ISZERO PUSH2 0x296A JUMPI PUSH1 0x40 MLOAD PUSH4 0x852CD8D PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0x42966C68 SWAP1 PUSH1 0x24 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2956 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x105A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x297B PUSH1 0x20 DUP4 PUSH2 0x330C JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP2 LT ISZERO SWAP1 PUSH2 0x298D PUSH1 0x20 DUP6 PUSH2 0x330C JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x29AE JUMPI PUSH1 0x40 MLOAD PUSH4 0x3FDF3423 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29C6 PUSH1 0x1 DUP4 PUSH2 0x330C JUMP JUMPDEST DUP4 MLOAD SWAP1 DUP2 LT ISZERO SWAP1 PUSH2 0x29D8 PUSH1 0x1 DUP6 PUSH2 0x330C JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x29F9 JUMPI PUSH1 0x40 MLOAD PUSH4 0x3FDF3423 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP POP POP ADD PUSH1 0x1 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2A14 DUP7 DUP7 PUSH2 0x2ABF JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x2A24 DUP3 DUP3 PUSH2 0x2B0C JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2A3D DUP4 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP1 PUSH2 0x2A50 JUMPI POP PUSH2 0x2A50 DUP3 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP4 DUP4 SWAP1 SWAP2 PUSH2 0x2A73 JUMPI PUSH1 0x40 MLOAD PUSH4 0x768BF0EB PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x535 SWAP3 SWAP2 SWAP1 PUSH2 0x3054 JUMP JUMPDEST POP PUSH3 0xF4240 SWAP1 POP PUSH2 0x2A84 DUP4 DUP6 PUSH2 0x3585 JUMP JUMPDEST PUSH2 0x9DD SWAP2 SWAP1 PUSH2 0x3466 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x2A9E JUMPI DUP2 PUSH2 0x9DD JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AAF PUSH2 0x15F2 JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH1 0xFF AND SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 MLOAD PUSH1 0x41 SUB PUSH2 0x2AF9 JUMPI PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x2AEB DUP9 DUP3 DUP6 DUP6 PUSH2 0x2BC5 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP POP POP POP PUSH2 0x2B05 JUMP JUMPDEST POP POP DUP2 MLOAD PUSH1 0x0 SWAP2 POP PUSH1 0x2 SWAP1 JUMPDEST SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2B20 JUMPI PUSH2 0x2B20 PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x2B29 JUMPI POP POP JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2B3D JUMPI PUSH2 0x2B3D PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x2B5B JUMPI PUSH1 0x40 MLOAD PUSH4 0xF645EEDF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2B6F JUMPI PUSH2 0x2B6F PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x2B90 JUMPI PUSH1 0x40 MLOAD PUSH4 0xFCE698F7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x535 JUMP JUMPDEST PUSH1 0x3 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x2BA4 JUMPI PUSH2 0x2BA4 PUSH2 0x2D8B JUMP JUMPDEST SUB PUSH2 0x296A JUMPI PUSH1 0x40 MLOAD PUSH4 0x35E2F383 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x535 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH16 0xA2A8918CA85BAFE22016D0B997E4DF60 PUSH1 0x1 PUSH1 0xFF SHL SUB DUP5 GT ISZERO PUSH2 0x2BF6 JUMPI POP PUSH1 0x0 SWAP2 POP PUSH1 0x3 SWAP1 POP DUP3 PUSH2 0x2C80 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP10 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2C76 JUMPI POP PUSH1 0x0 SWAP3 POP PUSH1 0x1 SWAP2 POP DUP3 SWAP1 POP PUSH2 0x2C80 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 SWAP2 POP DUP2 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2C9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2D12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x2D1D DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x2D2D DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x2D3D DUP2 PUSH2 0x2CD2 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH2 0x2D54 DUP2 PUSH2 0x2CE7 JUMP JUMPDEST SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH2 0x2D64 DUP2 PUSH2 0x2CE7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2D84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 DUP2 LT PUSH2 0x2DB1 JUMPI PUSH2 0x2DB1 PUSH2 0x2D8B JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND DUP3 MSTORE DUP10 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD DUP9 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP8 SWAP1 MSTORE PUSH2 0x120 DUP2 ADD PUSH1 0x4 DUP8 LT PUSH2 0x2DEC JUMPI PUSH2 0x2DEC PUSH2 0x2D8B JUMP JUMPDEST DUP7 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x2DFF PUSH1 0xA0 DUP4 ADD DUP8 PUSH2 0x2DA1 JUMP JUMPDEST DUP5 PUSH1 0xC0 DUP4 ADD MSTORE DUP4 PUSH1 0xE0 DUP4 ADD MSTORE DUP3 PUSH2 0x100 DUP4 ADD MSTORE SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2E47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x2E52 DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x2E87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2EA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x113A DUP2 PUSH2 0x2CE7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2EC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x2ECD DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x2EDD DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2F04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x113A DUP2 PUSH2 0x2CBD JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2F33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x2F4C DUP2 PUSH2 0x2F0F JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x2F6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2F85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x2F9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2FB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2FCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2FD9 DUP6 DUP3 DUP7 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2FFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x3011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x301D DUP8 DUP3 DUP9 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP1 SWAP6 POP SWAP4 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x303C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3048 DUP8 DUP3 DUP9 ADD PUSH2 0x2F5C JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xC0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3092 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x120 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3092 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x140 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3092 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x310D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 PUSH2 0x3118 PUSH2 0x3062 JUMP JUMPDEST DUP4 CALLDATALOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x3157 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xC0 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x180 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x319A DUP5 DUP5 PUSH2 0x3164 JUMP JUMPDEST SWAP2 POP PUSH2 0x31A9 DUP5 PUSH1 0xC0 DUP6 ADD PUSH2 0x3164 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x31C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x113A DUP2 PUSH2 0x2CD2 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x9E0 DUP3 DUP5 PUSH2 0x2DA1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x31F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3222 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL DUP4 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 DUP4 REVERT JUMPDEST PUSH1 0x40 SWAP1 DUP2 MSTORE DUP5 CALLDATALOAD DUP3 MSTORE PUSH1 0x20 DUP1 DUP7 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE SWAP4 DUP5 ADD CALLDATALOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH2 0x3253 DUP2 PUSH2 0x2CBD JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x120 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x326B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3273 PUSH2 0x3098 JUMP JUMPDEST SWAP1 POP PUSH2 0x327E DUP3 PUSH2 0x3248 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xC0 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0xE0 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x100 SWAP2 DUP3 ADD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x120 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x32EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9DD DUP4 DUP4 PUSH2 0x3258 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x9E0 JUMPI PUSH2 0x9E0 PUSH2 0x32F6 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3345 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x3329 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x215D SWAP1 DUP4 ADD DUP5 PUSH2 0x331F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x3253 DUP2 PUSH2 0x2CE7 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x3253 DUP2 PUSH2 0x2CD2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x33CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 PUSH2 0x33D8 PUSH2 0x30C9 JUMP JUMPDEST DUP4 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x33FC PUSH1 0x60 DUP6 ADD PUSH2 0x33A3 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x340D PUSH1 0x80 DUP6 ADD PUSH2 0x33AE JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x341E PUSH1 0xA0 DUP6 ADD PUSH2 0x33AE JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x342F PUSH1 0xC0 DUP6 ADD PUSH2 0x33A3 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x3440 PUSH1 0xE0 DUP6 ADD PUSH2 0x33AE JUMP JUMPDEST PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x120 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3483 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x349A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x113A DUP2 PUSH2 0x2F0F JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x34B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xA0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x34EA JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL DUP4 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 DUP4 REVERT JUMPDEST PUSH1 0x40 SWAP1 DUP2 MSTORE DUP5 MLOAD DUP3 MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD SWAP1 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 SWAP1 SWAP4 ADD MLOAD SWAP1 SWAP5 SWAP3 SWAP4 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP6 DUP2 MSTORE DUP5 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0xA0 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x3571 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x331F JUMP JUMPDEST PUSH1 0x60 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x80 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x9E0 JUMPI PUSH2 0x9E0 PUSH2 0x32F6 JUMP INVALID PUSH14 0x800AAAF64B9A1F321DCD63DA0436 SWAP14 CALLER 0xD8 LOG0 0xD4 SWAP11 0xD0 0xFB 0xBA ADDMOD GAS 0xAB BLOBBASEFEE SWAP9 0xBF BALANCE 0xC4 LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD5 SIGNEXTEND RETURNDATASIZE 0xEC 0x1E TSTORE 0x2D SAR EQ SMOD CALLER 0xDC 0xA7 0xD5 AND CODECOPY STOP 0xC1 0xFC DUP9 0x29 SELFBALANCE 0xB3 KECCAK256 DUP9 PUSH5 0x910C6F452D 0xE PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "2323:25016:55:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:372;;;;;;:::i;:::-;;:::i;:::-;;1153:28:56;;;;;-1:-1:-1;;;1153:28:56;;;;;;;;;;;;;:::i;:::-;;;;;;;;4116:539:55;;;;;;:::i;:::-;;:::i;1229:77:56:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1229:77:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11543:130:55:-;;;;;;:::i;:::-;;:::i;2648:56::-;;2698:6;2648:56;;10661:517;;;;;;:::i;:::-;;:::i;583:39:56:-;;;;;-1:-1:-1;;;;;583:39:56;;;;;;;;;;:::i;866:29::-;;;;;;;;;3933:25:70;;;3921:2;3906:18;866:29:56;3787:177:70;9922:304:55;;;;;;:::i;:::-;;:::i;4697:336::-;;;;;;:::i;:::-;;:::i;12603:105::-;12688:13;;-1:-1:-1;;;12688:13:55;;-1:-1:-1;;;;;12688:13:55;12603:105;;;;;;;:::i;779:27:56:-;;;;;-1:-1:-1;;;779:27:56;;-1:-1:-1;;;;;779:27:56;;;12255:149:55;;;;;;:::i;:::-;;:::i;705:25:56:-;;;;;-1:-1:-1;;;;;705:25:56;;;3155:101:38;;;:::i;11715:147:55:-;;;;;;:::i;:::-;;:::i;7343:1360::-;;;;;;:::i;:::-;;:::i;2441:144:38:-;;;:::i;1020:32:56:-;;;;;;;;;10268:351:55;;;;;;:::i;:::-;;:::i;12077:136::-;;;;;;:::i;:::-;;:::i;11904:131::-;;;;;;:::i;:::-;;:::i;9159:721::-;;;;;;:::i;:::-;;:::i;11220:114::-;;;;;;:::i;:::-;;:::i;12446:115::-;12536:18;;;;12446:115;;14115:153;;;;;;:::i;:::-;;:::i;:::-;;;7203:14:70;;7196:22;7178:41;;7166:2;7151:18;14115:153:55;7038:187:70;12750:310:55;;;;;;:::i;:::-;;:::i;5075:452::-;;;;;;:::i;:::-;;:::i;5569:1732::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;13400:673::-;;;;;;:::i;:::-;;:::i;2768:50::-;;2814:4;2768:50;;13102:256;;;;;;:::i;:::-;;:::i;11376:125::-;;;;;;:::i;:::-;;:::i;3405:215:38:-;;;;;;:::i;:::-;;:::i;8745:372:55:-;2986:10;;-1:-1:-1;;;;;2986:10:55;2972;:24;2964:64;;;;-1:-1:-1;;;2964:64:55;;;;;;;;;;;;8882:9:::1;3231:27;3248:9;3231:16;:27::i;:::-;3289:9;3223:77;;;;;-1:-1:-1::0;;;3223:77:55::1;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;3223:77:55::1;;;;;;;;;-1:-1:-1::0;3361:37:55::1;3331:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;:67;::::0;::::1;;;;;;:::i;:::-;3444:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;::::0;3331:67:::1;3310:171;;;;-1:-1:-1::0;;;3310:171:55::1;;;;;;;;:::i;:::-;-1:-1:-1::0;8933:19:55::2;::::0;;;:8:::2;:19;::::0;;;;26223:25;;;8933:19;;26223:39;8903:95:::2;;;;-1:-1:-1::0;;;8903:95:55::2;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;8903:95:55::2;-1:-1:-1::0;9008:23:55::2;9034:19:::0;;;:8:::2;:19;::::0;;;;9063:47:::2;9043:9:::0;9034:19;9098:11;9063:14:::2;:47::i;:::-;8893:224;3038:1:::1;8745:372:::0;;:::o;4116:539::-;4158:30:39;4191:26;:24;:26::i;:::-;4302:15;;4158:59;;-1:-1:-1;4302:15:39;-1:-1:-1;;;4302:15:39;;;4301:16;;-1:-1:-1;;;;;4348:14:39;4279:19;4724:16;;:34;;;;;4744:14;4724:34;4704:54;;4768:17;4788:11;-1:-1:-1;;;;;4788:16:39;4803:1;4788:16;:50;;;;-1:-1:-1;4816:4:39;4808:25;:30;4788:50;4768:70;;4854:12;4853:13;:30;;;;;4871:12;4870:13;4853:30;4849:91;;;4906:23;;-1:-1:-1;;;4906:23:39;;;;;;;;;;;4849:91;4949:18;;-1:-1:-1;;;;;;4949:18:39;4966:1;4949:18;;;4977:67;;;;5011:22;;-1:-1:-1;;;;5011:22:39;-1:-1:-1;;;5011:22:39;;;4977:67;4366:21:55::1;4381:5;4366:14;:21::i;:::-;4397:27;:25;:27::i;:::-;4435;4450:11;4435:14;:27::i;:::-;4472:33;4490:14;4472:17;:33::i;:::-;4515:35;4534:15;4515:18;:35::i;:::-;4560:43;4583:19;4560:22;:43::i;:::-;4613:35;4632:15;4613:18;:35::i;:::-;5068:14:39::0;5064:101;;;5098:23;;-1:-1:-1;;;;5098:23:39;;;5140:14;;;;;;5098:23;;5140:14;:::i;:::-;;;;;;;;5064:101;4092:1079;;;;;4116:539:55;;;;;;:::o;11543:130::-;2334:13:38;:11;:13::i;:::-;11632:34:55::1;11651:14;11632:18;:34::i;:::-;11543:130:::0;:::o;10661:517::-;10735:9;3688:27;3705:9;3688:16;:27::i;:::-;3746:9;3680:77;;;;;-1:-1:-1;;;3680:77:55;;;;;;3933:25:70;;3921:2;3906:18;;3787:177;3680:77:55;-1:-1:-1;3789:19:55;;;;:8;:19;;;;;:29;;;-1:-1:-1;;;;;3789:29:55;3775:10;:43;3767:82;;;;-1:-1:-1;;;3767:82:55;;;;;;;;;;;;10765:9:::1;3231:27;3248:9;3231:16;:27::i;:::-;3289:9;3223:77;;;;;-1:-1:-1::0;;;3223:77:55::1;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;3223:77:55::1;-1:-1:-1::0;3361:37:55::1;3331:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;:67;::::0;::::1;;;;;;:::i;:::-;3444:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;::::0;3331:67:::1;3310:171;;;;-1:-1:-1::0;;;3310:171:55::1;;;;;;;;:::i;:::-;-1:-1:-1::0;10786:23:55::2;10812:19:::0;;;:8:::2;:19;::::0;;;;10898:21:::2;::::0;::::2;::::0;10923:15:::2;-1:-1:-1::0;10898:40:55::2;10890:91;;;;-1:-1:-1::0;;;10890:91:55::2;;;;;;;;;;;;10991:34;11006:9;11017:7;10991:14;:34::i;:::-;26223:25:::0;;;;:39;11036:136:::2;;11100:24;::::0;::::2;::::0;11126:34:::2;::::0;;;:8:::2;:34;::::0;;;;11085:76:::2;::::0;11100:24;11085:14:::2;:76::i;9922:304::-:0;2986:10;;-1:-1:-1;;;;;2986:10:55;2972;:24;2964:64;;;;-1:-1:-1;;;2964:64:55;;;;;;;;;;;;10016:9:::1;3231:27;3248:9;3231:16;:27::i;:::-;3289:9;3223:77;;;;;-1:-1:-1::0;;;3223:77:55::1;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;3223:77:55::1;-1:-1:-1::0;3361:37:55::1;3331:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;:67;::::0;::::1;;;;;;:::i;:::-;3444:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;::::0;3331:67:::1;3310:171;;;;-1:-1:-1::0;;;3310:171:55::1;;;;;;;;:::i;:::-;-1:-1:-1::0;10037:23:55::2;10063:19:::0;;;:8:::2;:19;::::0;;;;26223:25;;;;10063:19;;26223:39;10092:83:::2;;;;-1:-1:-1::0;;;10092:83:55::2;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;10092:83:55::2;;10185:34;10200:9;10211:7;10185:14;:34::i;:::-;10027:199;3038:1:::1;9922:304:::0;:::o;4697:336::-;4790:7;4845:52;4870:10;4882:14;;4845:13;:11;:13::i;:::-;-1:-1:-1;;;;;4845:24:55;;:52;:24;:52::i;:::-;4943:83;4980:10;4992:14;;5008:12;5022:3;4943:36;:83::i;:::-;4936:90;;4697:336;;;;;:::o;12255:149::-;12348:7;12374:23;;;;;;;;12389:7;12374:23;:::i;:::-;:14;:23::i;3155:101:38:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;11715:147:55:-;2334:13:38;:11;:13::i;:::-;11812:43:55::1;11835:19;11812:22;:43::i;7343:1360::-:0;2986:10;;7546:7;;-1:-1:-1;;;;;2986:10:55;2972;:24;2964:64;;;;-1:-1:-1;;;2964:64:55;;;;;;;;;;;;7625:40:::1;::::0;-1:-1:-1;;;;;;13407:2:70;13378:15;;;13374:45;7625:40:55::1;::::0;::::1;13362:58:70::0;-1:-1:-1;;;13436:12:70;;;13429:30;7595:17:55::1;::::0;13475:12:70;;7625:40:55::1;;;;;;;;;;;;7615:51;;;;;;7595:71;;7730:15;7748;:13;:15::i;:::-;-1:-1:-1::0;;;;;7748:29:55::1;;7778:12;7748:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51:::0;;-1:-1:-1;7870:12:55;-1:-1:-1;;;;;7817:21:55;::::1;7809:75;;;;-1:-1:-1::0;;;7809:75:55::1;;;;;;;;:::i;:::-;-1:-1:-1::0;7942:271:55::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;7942:271:55;;::::1;::::0;;;::::1;;::::0;::::1;::::0;-1:-1:-1;7942:271:55;;;;;;;;;;;;;8037:25:::1;7942:271:::0;;;;8076:38:::1;7942:271:::0;;;;8128:15:::1;7942:271:::0;;;;;;8175:13:::1;::::0;7942:271;;;;8157:31:::1;::::0;-1:-1:-1;;;8175:13:55;::::1;-1:-1:-1::0;;;;;8175:13:55::1;::::0;8157:31:::1;:::i;:::-;7942:271:::0;;8202:1:::1;7942:271;::::0;;::::1;::::0;;;7920:19;;;:8:::1;:19:::0;;;;;;;:293;;;;-1:-1:-1;;;;;7920:293:55;;::::1;-1:-1:-1::0;;;;;;7920:293:55;;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;:19;;:293;;;;-1:-1:-1;;7920:293:55;;::::1;::::0;;;;;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;7920:293:55::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;7920:293:55::1;;::::0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;7920:293:55::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;8289:21:55::1;:19;:21::i;:::-;8253:57;;8320:16;-1:-1:-1::0;;;;;8320:22:55::1;;8343:7;8363:11;8376:13;8352:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8320:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8434:50;8459:9;8470:13;8434;:11;:13::i;:::-;-1:-1:-1::0;;;;;8434:24:55::1;::::0;:50;:24:::1;:50::i;:::-;8500:93;::::0;;-1:-1:-1;;;;;16505:32:70;;;16487:51;;16569:2;16554:18;;16547:34;;;16597:18;;;16590:34;;;8500:93:55;;::::1;::::0;;::::1;::::0;8521:9;;8500:93:::1;::::0;16475:2:70;16460:18;8500:93:55::1;;;;;;;8644:9;-1:-1:-1::0;;;;;8608:61:55::1;8635:7;-1:-1:-1::0;;;;;8608:61:55::1;8624:9;-1:-1:-1::0;;;;;;;;;;;8655:13:55::1;8608:61;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;8608:61:55::1;;;;;;;;-1:-1:-1::0;8687:9:55;;7343:1360;-1:-1:-1;;;;;;7343:1360:55:o;2441:144:38:-;2487:7;2506:24;2533:20;:18;:20::i;:::-;2570:8;-1:-1:-1;;;;;2570:8:38;;2441:144;-1:-1:-1;;2441:144:38:o;10268:351:55:-;2986:10;;-1:-1:-1;;;;;2986:10:55;2972;:24;2964:64;;;;-1:-1:-1;;;2964:64:55;;;;;;;;;;;;10360:9:::1;3231:27;3248:9;3231:16;:27::i;:::-;3289:9;3223:77;;;;;-1:-1:-1::0;;;3223:77:55::1;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;3223:77:55::1;-1:-1:-1::0;3361:37:55::1;3331:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;:67;::::0;::::1;;;;;;:::i;:::-;3444:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;::::0;3331:67:::1;3310:171;;;;-1:-1:-1::0;;;3310:171:55::1;;;;;;;;:::i;:::-;-1:-1:-1::0;10381:23:55::2;10407:19:::0;;;:8:::2;:19;::::0;;;;10436:32:::2;10416:9:::0;10407:19;10436:12:::2;:32::i;:::-;26223:25:::0;;;;:39;10479:134:::2;;10541:24;::::0;::::2;::::0;10567:34:::2;::::0;;;:8:::2;:34;::::0;;;;10528:74:::2;::::0;10541:24;10528:12:::2;:74::i;12077:136::-:0;2334:13:38;:11;:13::i;:::-;12169:37:55::1;12189:16;12169:19;:37::i;11904:131::-:0;2334:13:38;:11;:13::i;:::-;11993:35:55::1;12012:15;11993:18;:35::i;9159:721::-:0;2986:10;;-1:-1:-1;;;;;2986:10:55;2972;:24;2964:64;;;;-1:-1:-1;;;2964:64:55;;;;;;;;;;;;9378:9:::1;3231:27;3248:9;3231:16;:27::i;:::-;3289:9;3223:77;;;;;-1:-1:-1::0;;;3223:77:55::1;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;3223:77:55::1;-1:-1:-1::0;3361:37:55::1;3331:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;:67;::::0;::::1;;;;;;:::i;:::-;3444:19;::::0;;;:8:::1;:19;::::0;;;;:26:::1;;::::0;::::1;::::0;::::1;;;::::0;3331:67:::1;3310:171;;;;-1:-1:-1::0;;;3310:171:55::1;;;;;;;;:::i;:::-;-1:-1:-1::0;9428:19:55::2;::::0;;;:8:::2;:19;::::0;;;;26223:25;;;:39;;9485:9:::2;9399:97;;;;;-1:-1:-1::0;;;;;;9399:97:55::2;;;;;;3933:25:70::0;;3921:2;3906:18;;3787:177;9399:97:55::2;-1:-1:-1::0;9506:23:55::2;9532:19:::0;;;:8:::2;:19;::::0;;;;9561:47:::2;9541:9:::0;9532:19;9596:11;9561:14:::2;:47::i;:::-;9623:23;9619:255;;;9677:24;::::0;::::2;::::0;9703:34:::2;::::0;;;:8:::2;:34;::::0;;;;9662:96:::2;::::0;9677:24;9739:18;9662:14:::2;:96::i;:::-;9619:255;;;9802:24;::::0;::::2;::::0;9828:34:::2;::::0;;;:8:::2;:34;::::0;;;;9789:74:::2;::::0;9802:24;9789:12:::2;:74::i;:::-;9389:491;3038:1:::1;9159:721:::0;;;;:::o;11220:114::-;2334:13:38;:11;:13::i;:::-;11301:26:55::1;11316:10;11301:14;:26::i;14115:153::-:0;14190:4;;14213:19;;;;:8;:19;;;;;:26;;;;;;;;:48;;;;;;;;:::i;:::-;;;;14115:153;-1:-1:-1;;14115:153:55:o;12750:310::-;12825:7;12844:42;12889:15;:13;:15::i;:::-;-1:-1:-1;;;;;12889:28:55;;12931:7;12960:21;:19;:21::i;:::-;12889:103;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12844:148;;13009:44;13027:7;13036:9;:16;;;13009:17;:44::i;:::-;13002:51;12750:310;-1:-1:-1;;;12750:310:55:o;5075:452::-;5162:7;5217:52;5242:10;5254:14;;5217:13;:11;:13::i;:52::-;5327:193;5379:10;5407:14;;5439:34;5457:15;;5439:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5439:17:55;;-1:-1:-1;;;5439:34:55:i;:::-;5491:15;;5327:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5327:34:55;;-1:-1:-1;;;5327:193:55:i;5569:1732::-;5720:7;5729;5748:17;5768:10;5748:30;;5823:37;5863:35;5881:16;;5863:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5863:17:55;;-1:-1:-1;;;5863:35:55:i;:::-;5823:75;;5908:37;5948:35;5966:16;;5948:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:17:55;;-1:-1:-1;;;5948:35:55:i;:::-;5908:75;;6065:54;6092:12;6106;6065:26;:54::i;:::-;6191:23;;6232:24;;;;;6274:33;;;;;6325:23;;6366:24;;;;6408:33;;;;6191:23;;6232:24;;6274:33;;6325:23;6044:421;;;;-1:-1:-1;;;6044:421:55;;;;;18750:25:70;;;;18791:18;;;18784:34;;;;18834:18;;;18827:34;;;;18877:18;;;18870:34;18920:19;;;18913:35;18964:19;;;18957:35;18722:19;;6044:421:55;18463:535:70;6044:421:55;;;;;;;6512:52;6537:10;6549:14;;6512:13;:11;:13::i;:52::-;6666:12;6681:155;6729:9;6769:1;6752:14;;:18;;;;:::i;:::-;6784:12;6810:16;;6681:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6681:34:55;;-1:-1:-1;;;6681:155:55:i;:::-;6666:170;;6846:12;6861:155;6909:9;6949:1;6932:14;;:18;;;;:::i;:::-;6964:12;6990:16;;6861:155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6861:34:55;;-1:-1:-1;;;6861:155:55:i;:::-;7079:14;;;;:8;:14;;;;;;:31;;;;:38;;;7127:14;;;;;;:31;:38;;;7239:25;6846:170;;-1:-1:-1;6846:170:55;;7088:4;;7239:25;;;7283:4;;;;-1:-1:-1;5569:1732:55;-1:-1:-1;;;;;;;;5569:1732:55:o;13400:673::-;13490:7;13581:20;13604:27;13619:11;13604:14;:27::i;:::-;13581:50;;13642:29;13674:21;:19;:21::i;:::-;-1:-1:-1;;;;;13674:35:55;;13710:12;13674:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13741:13;;13642:81;;-1:-1:-1;13800:12:55;;-1:-1:-1;;;;;13741:27:55;13733:81;;;;-1:-1:-1;;;13733:81:55;;;;;;;;:::i;:::-;-1:-1:-1;13875:32:55;;;;13845:26;;;;;:62;;;13824:212;;;;-1:-1:-1;;;13824:212:55;;;;;;;;;:::i;:::-;-1:-1:-1;;14053:13:55;;13400:673;-1:-1:-1;;;13400:673:55:o;13102:256::-;13274:4;13297:54;;;;;;;;13324:12;13297:54;:::i;:::-;;;;;;;;13338:12;13297:54;:::i;:::-;:26;:54::i;11376:125::-;2334:13:38;:11;:13::i;:::-;11462:32:55::1;11480:13;11462:17;:32::i;3405:215:38:-:0;2334:13;:11;:13::i;:::-;-1:-1:-1;;;;;3489:22:38;::::1;3485:91;;3562:1;3534:31;;-1:-1:-1::0;;;3534:31:38::1;;;;;;;;:::i;3485:91::-;3585:28;3604:8;3585:18;:28::i;18915:486:55:-:0;19066:16;;19100:22;;;;19027;;19052:71;;-1:-1:-1;;;;;19066:16:55;;;;19084:14;;19052:13;:71::i;:::-;19133:15;;;:56;;-1:-1:-1;;19133:56:55;;;;;-1:-1:-1;19224:18:55;;;19261:16;;;;19027:96;;-1:-1:-1;19199:79:55;;-1:-1:-1;;;;;19224:18:55;;;;19244:33;;19027:96;19244:33;:::i;:::-;19199:13;:11;:13::i;:79::-;19340:18;;;;19322:16;;19360;;;;-1:-1:-1;;;;;19340:18:55;;;;19322:16;;;;19310:10;;-1:-1:-1;;;;;;;;;;;19294:100:55;19360:33;;19379:14;;19360:33;:::i;:::-;19294:100;;3933:25:70;;;3921:2;3906:18;19294:100:55;;;;;;;19017:384;18915:486;;;:::o;9071:205:39:-;9129:30;;3147:66;9186:27;8819:122;1847:127:38;6929:20:39;:18;:20::i;:::-;1929:38:38::1;1954:12;1929:24;:38::i;1739:117:67:-:0;6929:20:39;:18;:20::i;:::-;1812:37:67::1;:35;:37::i;22959:215:55:-:0;-1:-1:-1;;;;;23030:25:55;;23022:70;;;;-1:-1:-1;;;23022:70:55;;;;;;;;;;;;23102:10;:24;;-1:-1:-1;;;;;;23102:24:55;-1:-1:-1;;;;;23102:24:55;;;;;;;;23141:26;;;;-1:-1:-1;;23141:26:55;22959:215;:::o;23359:225::-;23435:14;-1:-1:-1;;;;;23435:19:55;23453:1;23435:19;23427:63;;;;-1:-1:-1;;;23427:63:55;;;;;;;;;;;;23500:13;:30;;-1:-1:-1;;;;;;;;23500:30:55;-1:-1:-1;;;;;;;;23500:30:55;;;;;;23545:32;;;;;;23500:30;;23545:32;:::i;:::-;;;;;;;;23359:225;:::o;23814:270::-;23893:15;2814:4;23893:38;;;23885:101;;;;-1:-1:-1;;;23885:101:55;;;;;;3933:25:70;;3921:2;3906:18;;3787:177;23885:101:55;-1:-1:-1;23996:14:55;:32;;;24043:34;;3933:25:70;;;24043:34:55;;3921:2:70;3906:18;24043:34:55;3787:177:70;24312:341:55;24411:19;2698:6;24411:47;;;;;24390:149;;;;-1:-1:-1;;;24390:149:55;;;;;;;;:::i;:::-;-1:-1:-1;24549:18:55;:40;;-1:-1:-1;;24549:40:55;;;;;;;24604:42;;;;;;24549:40;;24604:42;:::i;24805:265::-;24883:35;;;;452:9:35;-1:-1:-1;2073:16:35;24875:98:55;;;;-1:-1:-1;;;24875:98:55;;;;;;;;:::i;:::-;-1:-1:-1;24983:14:55;:32;;-1:-1:-1;;;;24983:32:55;-1:-1:-1;;;24983:32:55;;;;;;;;;;;;;;25030:33;;;;;;25048:14;;;;;;;25030:33;:::i;2658:162:38:-;966:10:40;2717:7:38;:5;:7::i;:::-;-1:-1:-1;;;;;2717:23:38;;2713:101;;966:10:40;2763:40:38;;-1:-1:-1;;;2763:40:38;;;;;;;;:::i;20423:324:55:-;20511:15;;;:57;;-1:-1:-1;;20511:57:55;;;;;-1:-1:-1;20603:18:55;;;20623:16;;;;20578:62;;-1:-1:-1;;;;;20603:18:55;;20578:13;:11;:13::i;:62::-;20703:18;;;;20685:16;;20723;;;;20656:84;;3933:25:70;;;-1:-1:-1;;;;;20703:18:55;;;;20685:16;;;;20673:10;;20656:84;;3921:2:70;3906:18;20656:84:55;;;;;;;;20423:324;;:::o;19537:302::-;19625:15;;;:56;;-1:-1:-1;;19625:56:55;;;;;19643:38;19716:16;;;19691:42;;:13;:11;:13::i;:::-;-1:-1:-1;;;;;19691:24:55;;;:42::i;:::-;19795:18;;;;19777:16;;19815;;;;19749:83;;3933:25:70;;;-1:-1:-1;;;;;19795:18:55;;;;19777:16;;;;19765:10;;19749:83;;3921:2:70;3906:18;19749:83:55;3787:177:70;5825:94:37;5901:11;;5825:94::o;598:221:11:-;698:11;;694:119;;733:55;;-1:-1:-1;;;733:55:11;;-1:-1:-1;;;;;19702:32:70;;;733:55:11;;;19684:51:70;773:4:11;19751:18:70;;;19744:60;19820:18;;;19813:34;;;733:24:11;;;;;19657:18:70;;733:55:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;725:77;;;;-1:-1:-1;;;725:77:11;;20310:2:70;725:77:11;;;20292:21:70;20349:1;20329:18;;;20322:29;-1:-1:-1;;;20367:18:70;;;20360:39;20416:18;;725:77:11;20108:332:70;16970:1750:55;17225:37;;-1:-1:-1;;;;;;20647:2:70;20618:15;;;20614:45;17225:37:55;;;20602:58:70;20676:12;;;20669:28;;;17146:7:55;;;;20713:12:70;;17225:37:55;;;;;;;;;;;;17215:48;;;;;;17195:68;;17341:27;17358:9;17341:16;:27::i;:::-;17340:28;17406:9;17332:85;;;;;-1:-1:-1;;;17332:85:55;;;;;;3933:25:70;;3921:2;3906:18;;3787:177;17332:85:55;;17461:33;17497:21;:19;:21::i;:::-;17461:57;;17528:29;17560:16;-1:-1:-1;;;;;17560:30:55;;17591:13;17560:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17633:13;;17528:77;;-1:-1:-1;17717:13:55;-1:-1:-1;;;;;17664:21:55;;17656:76;;;;-1:-1:-1;;;17656:76:55;;;;;;;;:::i;:::-;;17785:42;17830:15;:13;:15::i;:::-;-1:-1:-1;;;;;17830:28:55;;17859:7;17876:16;17830:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17912:16;;17785:109;;-1:-1:-1;17912:16:55;:21;17904:58;;;;-1:-1:-1;;;17904:58:55;;;;;;;;;;;;17998:21;18022:44;18040:7;18049:9;:16;;;18022:17;:44::i;:::-;18118:13;;17998:68;;-1:-1:-1;18076:21:55;;18100:31;;-1:-1:-1;;;18118:13:55;;-1:-1:-1;;;;;18118:13:55;18100:15;:31;:::i;:::-;18163:280;;;;;;;;18184:13;;-1:-1:-1;;;;;18163:280:55;;;;;;;;;;;;;;;;;-1:-1:-1;18163:280:55;;;;18076:55;;-1:-1:-1;18163:280:55;;;18272:27;18163:280;;;;18313:37;18163:280;;18364:15;18163:280;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18141:19:55;;;:8;:19;;;;;:302;;;;-1:-1:-1;;;;;18141:302:55;;;-1:-1:-1;;;;;;18141:302:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18141:302:55;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;18141:302:55;;;;;;;;;-1:-1:-1;;18141:302:55;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;18141:302:55;;;;;;;;;;;;;;;;;;;;;;;;;;18518:13;;18459:227;;;20995:25:70;;;-1:-1:-1;;;;;21056:32:70;;;21051:2;21036:18;;21029:60;21105:18;;;21098:34;;;21163:2;21148:18;;21141:34;;;21206:3;21191:19;;21184:35;;;18459:227:55;;;;;;;;18495:9;;18459:227;;20982:3:70;20967:19;18459:227:55;;;;;;;-1:-1:-1;18704:9:55;;16970:1750;-1:-1:-1;;;;;;;;;;16970:1750:55:o;3653:669:67:-;3737:7;3915:16;4075:19;;4124:20;;;;;4174:29;;;;;3988:241;;925:89;3988:241;;;21461:25:70;21502:18;;;21495:34;;;;21545:18;;;21538:34;;;;21588:18;;;;21581:34;;;;3988:241:67;;;;;;;;;;21433:19:70;;;3988:241:67;;3953:330;;;;;;-1:-1:-1;;;3802:499:67;;;21884:27:70;21927:11;;;21920:27;;;;21963:12;;;;21956:28;;;;3802:499:67;;;;;;;;;;22000:12:70;;;;3802:499:67;;;3775:540;;;;;;3653:669::o;3774:248:38:-;3847:24;3874:20;:18;:20::i;:::-;3923:8;;-1:-1:-1;;;;;3941:19:38;;;-1:-1:-1;;;;;;3941:19:38;;;;;;3975:40;;3847:47;;-1:-1:-1;3923:8:38;;;;;3975:40;;3904:16;;3975:40;3837:185;;3774:248;:::o;6033:102:37:-;6115:13;;6033:102::o;25727:206:55:-;25824:15;;25780:16;;-1:-1:-1;;;;;25824:15:55;25808:86;;;;-1:-1:-1;;;25808:86:55;;;;;;;;;;;;-1:-1:-1;25911:15:55;;-1:-1:-1;;;;;25911:15:55;;25727:206::o;1050:198:11:-;1148:11;;1144:98;;1183:34;;-1:-1:-1;;;1183:34:11;;-1:-1:-1;;;;;22215:32:70;;;1183:34:11;;;22197:51:70;22264:18;;;22257:34;;;1183:20:11;;;;;22170:18:70;;1183:34:11;22023:274:70;1192:159:38;1313:22;;1192:159::o;19973:314:55:-;20059:15;;;:53;;-1:-1:-1;;20059:53:55;;;;;-1:-1:-1;20147:18:55;;;20167:16;;;;20122:62;;-1:-1:-1;;;;;20147:18:55;;20122:13;:11;:13::i;:62::-;20243:18;;;;20225:16;;20263;;;;20200:80;;3933:25:70;;;-1:-1:-1;;;;;20243:18:55;;;;20225:16;;;;20213:10;;20200:80;;3921:2:70;3906:18;20200:80:55;3787:177:70;25279:268:55;-1:-1:-1;;;;;25360:30:55;;25352:75;;;;-1:-1:-1;;;25352:75:55;;;;;;;;;;;;25437:15;:52;;-1:-1:-1;;;;;;25437:52:55;-1:-1:-1;;;;;25437:52:55;;;;;;;;25504:36;;;;-1:-1:-1;;25504:36:55;25279:268;:::o;27065:272::-;27155:7;27174:23;27200:15;:13;:15::i;:::-;-1:-1:-1;;;;;27200:33:55;;27234:8;27252:21;:19;:21::i;:::-;27200:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:82;;-1:-1:-1;27299:31:55;27200:82;27299:13;:31;:::i;:::-;27292:38;27065:272;-1:-1:-1;;;;27065:272:55:o;3718:820:62:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1695:1:62;2204:27;1587:2;;2204:27;:::i;:::-;:42;;;;:::i;:::-;2347:35;;1371:2;2347:35;:::i;:::-;3862:12;;:38;;;;1695:1;2204:27;1587:2;;2204:27;:::i;:::-;:42;;;;:::i;:::-;2347:35;;1371:2;2347:35;:::i;:::-;3841:150;;;;;;-1:-1:-1;;;3841:150:62;;;;;;;;;:::i;:::-;;;4029:18;4049:19;4070:28;4126:5;4102:80;;;;;;;;;;;;:::i;:::-;4028:154;;;;;;4307:9;4319:31;4330:5;1371:2;4319:10;:31::i;:::-;4307:43;-1:-1:-1;4360:9:62;4372:31;4383:5;1926:33;1479:2;1371;1926:33;:::i;:::-;4372:10;:31::i;:::-;4360:43;-1:-1:-1;4413:7:62;4423:29;4432:5;1587:2;2065:33;1587:2;1371;2065:33;:::i;:::-;:48;;;;:::i;:::-;4423:8;:29::i;:::-;4470:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4470:61:62;;;;;;;3718:820;-1:-1:-1;;3718:820:62:o;14814:1838:55:-;15021:7;15095:15;15113:35;15135:12;15113:21;:35::i;:::-;15095:53;;15196:42;15241:15;:13;:15::i;:::-;-1:-1:-1;;;;;15241:28:55;;15283:7;15312:21;:19;:21::i;:::-;15241:103;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15362:16;;15196:148;;-1:-1:-1;15362:16:55;:21;15354:58;;;;-1:-1:-1;;;15354:58:55;;;;;;;;;;;;15530:23;;15571:24;;;;;15613:33;;;;;15496:217;;;;;24114:19:70;;;;24149:12;;24142:28;24186:12;;;;24179:28;;;;-1:-1:-1;;;;;;24241:15:70;;;24237:45;;24223:12;;;24216:67;24318:15;;;;24314:45;;;24299:13;;;24292:68;15453:17:55;;24376:13:70;;15496:217:55;;;;;;;;;;;;15473:250;;;;;;15453:270;;15781:27;15798:9;15781:16;:27::i;:::-;15780:28;15846:9;15772:85;;;;;-1:-1:-1;;;15772:85:55;;;;;;3933:25:70;;3921:2;3906:18;;3787:177;15772:85:55;;15893:21;15917:44;15935:7;15944:9;:16;;;15917:17;:44::i;:::-;16013:13;;15893:68;;-1:-1:-1;15971:21:55;;15995:31;;-1:-1:-1;;;16013:13:55;;-1:-1:-1;;;;;16013:13:55;15995:15;:31;:::i;:::-;16058:294;;;;;;;;-1:-1:-1;;;;;16058:294:55;;;;;;;;;;;;;;;;;-1:-1:-1;16058:294:55;;;;15971:55;;-1:-1:-1;16058:294:55;;;16184:24;16058:294;;;;16222:37;16058:294;;16273:15;16058:294;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16036:19:55;;;:8;:19;;;;;:316;;;;-1:-1:-1;;;;;16036:316:55;;;-1:-1:-1;;;;;;16036:316:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16036:316:55;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;16036:316:55;;;;;;;;;-1:-1:-1;;16036:316:55;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16445:10;-1:-1:-1;;;;;16368:250:55;16424:7;-1:-1:-1;;;;;16368:250:55;16401:9;16368:250;16469:8;16491:12;:33;;;16538:16;16568:13;16595;16368:250;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;16636:9:55;;14814:1838;-1:-1:-1;;;;;;;;14814:1838:55:o;3164:391:62:-;3365:24;;3337;;3313:4;;3337:52;:140;;;;;3443:13;:34;;;3405:13;:34;;;:72;3337:140;:210;;;;-1:-1:-1;;3522:25:62;;;;;3493;;;:54;;;3164:391::o;2512:700:67:-;2732:151;;;;;;;;2765:23;;2732:151;;;2802:24;;;;2732:151;;;;2840:33;;;;2732:151;;;;;;;2598:7;;;2915:23;2732:151;2915:14;:23::i;:::-;2893:45;;3113:92;3127:11;3157:12;:14;;;3173:12;:14;;;3189:12;:14;;;3140:64;;;;;;;;;25090:19:70;;;25134:2;25125:12;;25118:28;;;;25202:3;25180:16;-1:-1:-1;;;;;;25176:36:70;25171:2;25162:12;;25155:58;25238:2;25229:12;;24909:338;3140:64:67;;;;;;;;;;;;;3113:13;:92::i;21229:1539:55:-;21369:7;21388:33;21424:21;:19;:21::i;:::-;21388:57;;21500:42;21545:15;:13;:15::i;:::-;-1:-1:-1;;;;;21545:28:55;;21574:8;21592:16;21545:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21723:14;;21500:110;;-1:-1:-1;21670:22:55;;21695:43;;:20;;21723:14;-1:-1:-1;;;21723:14:55;;;;;;21695:27;:43;:::i;:::-;21670:68;-1:-1:-1;21769:17:55;;;;;:51;;;21806:14;21790:12;:30;;21769:51;21867:12;21881:14;21748:158;;;;;;-1:-1:-1;;;21748:158:55;;;;;;;;;:::i;:::-;;;22406:27;22436:45;22450:12;22464:9;:16;;;22436:13;:45::i;:::-;22528:24;;;;22554:18;;22406:75;;-1:-1:-1;22491:20:55;;22514:59;;;;;;;22554:18;22514:13;:59::i;:::-;22491:82;-1:-1:-1;22583:21:55;22607:40;22491:82;22627:19;22607;:40::i;:::-;22583:64;;22658:16;-1:-1:-1;;;;;22658:22:55;;22681:8;22702:12;22716:13;22691:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22658:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22748:13:55;;21229:1539;-1:-1:-1;;;;;;;;;;;;21229:1539:55:o;7082:141:39:-;7149:17;:15;:17::i;:::-;7144:73;;7189:17;;-1:-1:-1;;;7189:17:39;;;;;;;;;;;1980:235:38;6929:20:39;:18;:20::i;1986:362:67:-;6929:20:39;:18;:20::i;:::-;2111:220:67::1;::::0;;1113:108:::1;2111:220;::::0;::::1;25539:25:70::0;1307:27:67::1;25580:18:70::0;;;25573:34;;;;1426:14:67::1;25623:18:70::0;;;25616:34;2244:13:67::1;25666:18:70::0;;;25659:34;2283:4:67::1;25709:19:70::0;;;25702:61;1521:66:67::1;25779:19:70::0;;;25772:35;25511:19;;2111:220:67::1;::::0;;-1:-1:-1;;2111:220:67;;::::1;::::0;;;;;;2088:253;;2111:220:::1;2088:253:::0;;::::1;::::0;2069:16:::1;:272:::0;1986:362::o;1404:154:11:-;1489:11;;1485:67;;1516:25;;-1:-1:-1;;;1516:25:11;;;;;3933::70;;;-1:-1:-1;;;;;1516:16:11;;;;;3906:18:70;;1516:25:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1485:67;1404:154;;:::o;5602:478:62:-;5681:7;5738:28;2583:2;5738:6;:28;:::i;:::-;5721:13;;:45;;;;;5825:28;2583:2;5825:6;:28;:::i;:::-;5700:164;;;;;;-1:-1:-1;;;5700:164:62;;;;;;;;;:::i;:::-;-1:-1:-1;;;6004:30:62;6020:4;6004:30;5998:37;;5602:478::o;4734:668::-;4811:5;4866:26;2480:1;4866:6;:26;:::i;:::-;4849:13;;:43;;;;;4951:26;2480:1;4951:6;:26;:::i;:::-;4828:160;;;;;;-1:-1:-1;;;4828:160:62;;;;;;;;;:::i;:::-;-1:-1:-1;;;5330:29:62;5346:3;5330:29;5324:36;;4734:668::o;3714:255:50:-;3792:7;3812:17;3831:18;3851:16;3871:27;3882:4;3888:9;3871:10;:27::i;:::-;3811:87;;;;;;3908:28;3920:5;3927:8;3908:11;:28::i;:::-;-1:-1:-1;3953:9:50;;3714:255;-1:-1:-1;;;;3714:255:50:o;1099:188:35:-;1160:7;1187:13;1198:1;452:9;-1:-1:-1;2073:16:35;;1992:104;1187:13;:30;;;;1204:13;1215:1;452:9;-1:-1:-1;2073:16:35;;1992:104;1204:13;1240:1;1243;1179:67;;;;;;-1:-1:-1;;;1179:67:35;;;;;;;;;:::i;:::-;-1:-1:-1;452:9:35;;-1:-1:-1;1264:5:35;1268:1;1264;:5;:::i;:::-;1263:17;;;;:::i;1325:105:34:-;1383:7;1414:1;1409;:6;;:14;;1422:1;1409:14;;;-1:-1:-1;1418:1:34;;1325:105;-1:-1:-1;1325:105:34:o;8485:120:39:-;8535:4;8558:26;:24;:26::i;:::-;:40;-1:-1:-1;;;8558:40:39;;;;;;-1:-1:-1;8485:120:39:o;2129:778:50:-;2232:17;2251:16;2269:14;2299:9;:16;2319:2;2299:22;2295:606;;2604:4;2589:20;;2583:27;2653:4;2638:20;;2632:27;2710:4;2695:20;;2689:27;2337:9;2681:36;2751:25;2762:4;2681:36;2583:27;2632;2751:10;:25::i;:::-;2744:32;;;;;;;;;;;2295:606;-1:-1:-1;;2872:16:50;;2823:1;;-1:-1:-1;2827:35:50;;2295:606;2129:778;;;;;:::o;7280:532::-;7375:20;7366:5;:29;;;;;;;;:::i;:::-;;7362:444;;7280:532;;:::o;7362:444::-;7471:29;7462:5;:38;;;;;;;;:::i;:::-;;7458:348;;7523:23;;-1:-1:-1;;;7523:23:50;;;;;;;;;;;7458:348;7576:35;7567:5;:44;;;;;;;;:::i;:::-;;7563:243;;7634:46;;-1:-1:-1;;;7634:46:50;;;;;3933:25:70;;;3906:18;;7634:46:50;3787:177:70;7563:243:50;7710:30;7701:5;:39;;;;;;;;:::i;:::-;;7697:109;;7763:32;;-1:-1:-1;;;7763:32:50;;;;;3933:25:70;;;3906:18;;7763:32:50;3787:177:70;5203:1551:50;5329:17;;;-1:-1:-1;;;;;6270:79:50;;6266:164;;;-1:-1:-1;6381:1:50;;-1:-1:-1;6385:30:50;;-1:-1:-1;6417:1:50;6365:54;;6266:164;6541:24;;;6524:14;6541:24;;;;;;;;;26218:25:70;;;26291:4;26279:17;;26259:18;;;26252:45;;;;26313:18;;;26306:34;;;26356:18;;;26349:34;;;6541:24:50;;26190:19:70;;6541:24:50;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6541:24:50;;-1:-1:-1;;6541:24:50;;;-1:-1:-1;;;;;;;6579:20:50;;6575:113;;-1:-1:-1;6631:1:50;;-1:-1:-1;6635:29:50;;-1:-1:-1;6631:1:50;;-1:-1:-1;6615:62:50;;6575:113;6706:6;-1:-1:-1;6714:20:50;;-1:-1:-1;6714:20:50;;-1:-1:-1;5203:1551:50;;;;;;;;;:::o;14:346:70:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;204:23:70;;;324:2;309:18;;;296:32;;-1:-1:-1;14:346:70:o;365:192::-;539:10;527:23;;;;509:42;;497:2;482:18;;365:192::o;562:131::-;-1:-1:-1;;;;;637:31:70;;627:42;;617:70;;683:1;680;673:12;698:129;-1:-1:-1;;;;;772:30:70;;762:41;;752:69;;817:1;814;807:12;832:121;917:10;910:5;906:22;899:5;896:33;886:61;;943:1;940;933:12;958:928;1059:6;1067;1075;1083;1091;1099;1152:3;1140:9;1131:7;1127:23;1123:33;1120:53;;;1169:1;1166;1159:12;1120:53;1208:9;1195:23;1227:31;1252:5;1227:31;:::i;:::-;1277:5;-1:-1:-1;1334:2:70;1319:18;;1306:32;1347:33;1306:32;1347:33;:::i;:::-;1399:7;-1:-1:-1;1458:2:70;1443:18;;1430:32;1471;1430;1471;:::i;:::-;1522:7;-1:-1:-1;1602:2:70;1587:18;;1574:32;;-1:-1:-1;1684:3:70;1669:19;;1656:33;1698:32;1656:33;1698:32;:::i;:::-;1749:7;-1:-1:-1;1808:3:70;1793:19;;1780:33;1822:32;1780:33;1822:32;:::i;:::-;1873:7;1863:17;;;958:928;;;;;;;;:::o;1891:226::-;1950:6;2003:2;1991:9;1982:7;1978:23;1974:32;1971:52;;;2019:1;2016;2009:12;1971:52;-1:-1:-1;2064:23:70;;1891:226;-1:-1:-1;1891:226:70:o;2122:127::-;2183:10;2178:3;2174:20;2171:1;2164:31;2214:4;2211:1;2204:15;2238:4;2235:1;2228:15;2254:144;2339:1;2332:5;2329:12;2319:46;;2345:18;;:::i;:::-;2374;;2254:144::o;2403:914::-;-1:-1:-1;;;;;2824:32:70;;;2806:51;;2893:32;;2888:2;2873:18;;2866:60;2957:2;2942:18;;2935:34;;;3000:2;2985:18;;2978:34;;;2793:3;2778:19;;3042:1;3031:13;;3021:47;;3048:18;;:::i;:::-;3105:6;3099:3;3088:9;3084:19;3077:35;3121:58;3174:3;3163:9;3159:19;3151:6;3121:58;:::i;:::-;3216:6;3210:3;3199:9;3195:19;3188:35;3260:6;3254:3;3243:9;3239:19;3232:35;3304:6;3298:3;3287:9;3283:19;3276:35;2403:914;;;;;;;;;;;;:::o;3553:229::-;-1:-1:-1;;;;;3743:32:70;;;;3725:51;;3713:2;3698:18;;3553:229::o;3969:367::-;4037:6;4045;4098:2;4086:9;4077:7;4073:23;4069:32;4066:52;;;4114:1;4111;4104:12;4066:52;4153:9;4140:23;4172:31;4197:5;4172:31;:::i;:::-;4222:5;4300:2;4285:18;;;;4272:32;;-1:-1:-1;;;3969:367:70:o;4523:200::-;-1:-1:-1;;;;;4685:31:70;;;;4667:50;;4655:2;4640:18;;4523:200::o;4728:231::-;4815:6;4875:2;4863:9;4854:7;4850:23;4846:32;4890:2;4887:22;;;4905:1;4902;4895:12;4887:22;-1:-1:-1;4944:9:70;;4728:231;-1:-1:-1;;4728:231:70:o;5172:245::-;5230:6;5283:2;5271:9;5262:7;5258:23;5254:32;5251:52;;;5299:1;5296;5289:12;5251:52;5338:9;5325:23;5357:30;5381:5;5357:30;:::i;5422:629::-;5508:6;5516;5524;5532;5585:3;5573:9;5564:7;5560:23;5556:33;5553:53;;;5602:1;5599;5592:12;5553:53;5641:9;5628:23;5660:31;5685:5;5660:31;:::i;:::-;5710:5;-1:-1:-1;5767:2:70;5752:18;;5739:32;5780:33;5739:32;5780:33;:::i;:::-;5422:629;;5832:7;;-1:-1:-1;;;;5912:2:70;5897:18;;5884:32;;6015:2;6000:18;5987:32;;5422:629::o;6056:247::-;6115:6;6168:2;6156:9;6147:7;6143:23;6139:32;6136:52;;;6184:1;6181;6174:12;6136:52;6223:9;6210:23;6242:31;6267:5;6242:31;:::i;6308:118::-;6394:5;6387:13;6380:21;6373:5;6370:32;6360:60;;6416:1;6413;6406:12;6431:602;6514:6;6522;6530;6538;6591:3;6579:9;6570:7;6566:23;6562:33;6559:53;;;6608:1;6605;6598:12;6559:53;6653:23;;;-1:-1:-1;6773:2:70;6758:18;;6745:32;;-1:-1:-1;6855:2:70;6840:18;;6827:32;6868:30;6827:32;6868:30;:::i;:::-;6431:602;;;;-1:-1:-1;6917:7:70;;6997:2;6982:18;6969:32;;-1:-1:-1;;6431:602:70:o;7230:347::-;7281:8;7291:6;7345:3;7338:4;7330:6;7326:17;7322:27;7312:55;;7363:1;7360;7353:12;7312:55;-1:-1:-1;7386:20:70;;-1:-1:-1;;;;;7418:30:70;;7415:50;;;7461:1;7458;7451:12;7415:50;7498:4;7490:6;7486:17;7474:29;;7550:3;7543:4;7534:6;7526;7522:19;7518:30;7515:39;7512:59;;;7567:1;7564;7557:12;7512:59;7230:347;;;;;:::o;7582:409::-;7652:6;7660;7713:2;7701:9;7692:7;7688:23;7684:32;7681:52;;;7729:1;7726;7719:12;7681:52;7756:23;;-1:-1:-1;;;;;7791:30:70;;7788:50;;;7834:1;7831;7824:12;7788:50;7873:58;7923:7;7914:6;7903:9;7899:22;7873:58;:::i;:::-;7950:8;;7847:84;;-1:-1:-1;7582:409:70;-1:-1:-1;;;;7582:409:70:o;7996:712::-;8086:6;8094;8102;8110;8163:2;8151:9;8142:7;8138:23;8134:32;8131:52;;;8179:1;8176;8169:12;8131:52;8206:23;;-1:-1:-1;;;;;8241:30:70;;8238:50;;;8284:1;8281;8274:12;8238:50;8323:58;8373:7;8364:6;8353:9;8349:22;8323:58;:::i;:::-;8400:8;;-1:-1:-1;8297:84:70;-1:-1:-1;;8488:2:70;8473:18;;8460:32;-1:-1:-1;;;;;8504:32:70;;8501:52;;;8549:1;8546;8539:12;8501:52;8588:60;8640:7;8629:8;8618:9;8614:24;8588:60;:::i;:::-;7996:712;;;;-1:-1:-1;8667:8:70;-1:-1:-1;;;;7996:712:70:o;8713:248::-;8887:25;;;8943:2;8928:18;;8921:34;8875:2;8860:18;;8713:248::o;8966:344::-;9033:2;9027:9;9075:3;9063:16;;-1:-1:-1;;;;;9094:34:70;;9130:22;;;9091:62;9088:185;;;9195:10;9190:3;9186:20;9183:1;9176:31;9230:4;9227:1;9220:15;9258:4;9255:1;9248:15;9088:185;9289:2;9282:22;8966:344;:::o;9315:352::-;9387:2;9381:9;9429:6;9417:19;;-1:-1:-1;;;;;9451:34:70;;9487:22;;;9448:62;9445:185;;;9552:10;9547:3;9543:20;9540:1;9533:31;9587:4;9584:1;9577:15;9615:4;9612:1;9605:15;9672:349;9744:2;9738:9;9786:3;9774:16;;-1:-1:-1;;;;;9805:34:70;;9841:22;;;9802:62;9799:185;;;9906:10;9901:3;9897:20;9894:1;9887:31;9941:4;9938:1;9931:15;9969:4;9966:1;9959:15;10026:1005;10109:6;10169:3;10157:9;10148:7;10144:23;10140:33;10185:2;10182:22;;;10200:1;10197;10190:12;10182:22;-1:-1:-1;10219:1:70;10242:17;;:::i;:::-;10305:23;;10337:22;;10433:2;10418:18;;;10405:32;10453:14;;;10446:31;10551:2;10536:18;;;10523:32;10571:14;;;10564:31;10669:2;10654:18;;;10641:32;10689:14;;;10682:31;10787:3;10772:19;;;10759:33;10808:15;;;10801:32;10885:3;10870:19;;10857:33;10934:4;10921:18;;10909:31;;10899:61;;10955:2;10951;10944:14;10899:61;10987:3;10976:15;;10969:32;10980:5;10026:1005;-1:-1:-1;;;;10026:1005:70:o;11036:154::-;11094:5;11139:3;11130:6;11125:3;11121:16;11117:26;11114:46;;;11156:1;11153;11146:12;11114:46;-1:-1:-1;11178:6:70;11036:154;-1:-1:-1;11036:154:70:o;11195:360::-;11315:6;11323;11376:3;11364:9;11355:7;11351:23;11347:33;11344:53;;;11393:1;11390;11383:12;11344:53;11416:52;11460:7;11449:9;11416:52;:::i;:::-;11406:62;;11487;11541:7;11535:3;11524:9;11520:19;11487:62;:::i;:::-;11477:72;;11195:360;;;;;:::o;11560:245::-;11618:6;11671:2;11659:9;11650:7;11646:23;11642:32;11639:52;;;11687:1;11684;11677:12;11639:52;11726:9;11713:23;11745:30;11769:5;11745:30;:::i;11810:217::-;11961:2;11946:18;;11973:48;11950:9;12003:6;11973:48;:::i;12246:881::-;12331:6;12391:2;12379:9;12370:7;12366:23;12362:32;12406:2;12403:22;;;12421:1;12418;12411:12;12403:22;-1:-1:-1;12491:2:70;12485:9;12440:1;;12533:2;12521:15;;-1:-1:-1;;;;;12551:34:70;;12587:22;;;12548:62;12545:187;;;-1:-1:-1;;;12633:32:70;;12688:4;12685:1;12678:15;12717:4;12640:2;12706:16;12545:187;12748:2;12741:22;;;12805:23;;12837:21;;12932:2;12917:18;;;12904:32;12952:15;;;12945:32;13036:18;;;13023:32;13071:15;;;13064:32;;;;-1:-1:-1;12844:6:70;;12246:881;-1:-1:-1;;12246:881:70:o;13498:138::-;13577:13;;13599:31;13577:13;13599:31;:::i;:::-;13498:138;;;:::o;13641:1140::-;13709:5;13757:6;13745:9;13740:3;13736:19;13732:32;13729:52;;;13777:1;13774;13767:12;13729:52;13799:22;;:::i;:::-;13790:31;;13844:40;13874:9;13844:40;:::i;:::-;13830:55;;13951:2;13936:18;;;13930:25;13971:14;;;13964:31;14061:2;14046:18;;;14040:25;14081:14;;;14074:31;14171:2;14156:18;;;14150:25;14191:14;;;14184:31;14281:3;14266:19;;;14260:26;14302:15;;;14295:32;14393:3;14378:19;;;14372:26;14414:15;;;14407:32;14505:3;14490:19;;;14484:26;14526:15;;;14519:32;14617:3;14602:19;;;14596:26;14638:15;;;14631:32;14729:3;14714:19;;;14708:26;14750:15;;;14743:32;;;;13837:5;13641:1140;-1:-1:-1;13641:1140:70:o;14786:256::-;14884:6;14937:3;14925:9;14916:7;14912:23;14908:33;14905:53;;;14954:1;14951;14944:12;14905:53;14977:59;15028:7;15017:9;14977:59;:::i;15047:127::-;15108:10;15103:3;15099:20;15096:1;15089:31;15139:4;15136:1;15129:15;15163:4;15160:1;15153:15;15179:125;15244:9;;;15265:10;;;15262:36;;;15278:18;;:::i;15562:399::-;15603:3;15641:5;15635:12;15668:6;15663:3;15656:19;15693:1;15703:139;15717:6;15714:1;15711:13;15703:139;;;15825:4;15810:13;;;15806:24;;15800:31;15780:11;;;15776:22;;15769:63;15732:12;15703:139;;;15707:3;15887:1;15880:4;15871:6;15866:3;15862:16;15858:27;15851:38;15950:4;15943:2;15939:7;15934:2;15926:6;15922:15;15918:29;15913:3;15909:39;15905:50;15898:57;;;15562:399;;;;:::o;15966:314::-;-1:-1:-1;;;;;16141:32:70;;16123:51;;16210:2;16205;16190:18;;16183:30;;;-1:-1:-1;;16230:44:70;;16255:18;;16247:6;16230:44;:::i;16635:300::-;-1:-1:-1;;;;;16827:32:70;;;16809:51;;16896:32;;16891:2;16876:18;;16869:60;16797:2;16782:18;;16635:300::o;16940:136::-;17018:13;;17040:30;17018:13;17040:30;:::i;17081:136::-;17159:13;;17181:30;17159:13;17181:30;:::i;17222:1236::-;17319:6;17379:3;17367:9;17358:7;17354:23;17350:33;17395:2;17392:22;;;17410:1;17407;17400:12;17392:22;-1:-1:-1;17429:1:70;17452:22;;:::i;:::-;17520:16;;17545:22;;17634:2;17619:18;;;17613:25;17654:14;;;17647:31;17745:2;17730:18;;;17724:25;17765:14;;;17758:31;17821:48;17865:2;17850:18;;17821:48;:::i;:::-;17816:2;17809:5;17805:14;17798:72;17903:49;17947:3;17936:9;17932:19;17903:49;:::i;:::-;17897:3;17890:5;17886:15;17879:74;17986:49;18030:3;18019:9;18015:19;17986:49;:::i;:::-;17980:3;17973:5;17969:15;17962:74;18069:49;18113:3;18102:9;18098:19;18069:49;:::i;:::-;18063:3;18056:5;18052:15;18045:74;18152:49;18196:3;18185:9;18181:19;18152:49;:::i;:::-;18146:3;18135:15;;18128:74;18269:3;18254:19;;;18248:26;18290:15;;;18283:32;18382:3;18367:19;;;18361:26;18403:15;;;18396:32;;;;-1:-1:-1;18139:5:70;;17222:1236;-1:-1:-1;;17222:1236:70:o;19003:217::-;19043:1;19069;19059:132;;19113:10;19108:3;19104:20;19101:1;19094:31;19148:4;19145:1;19138:15;19176:4;19173:1;19166:15;19059:132;-1:-1:-1;19205:9:70;;19003:217::o;19858:245::-;19925:6;19978:2;19966:9;19957:7;19953:23;19949:32;19946:52;;;19994:1;19991;19984:12;19946:52;20026:9;20020:16;20045:28;20067:5;20045:28;:::i;22302:1105::-;22404:6;22464:3;22452:9;22443:7;22439:23;22435:33;22480:2;22477:22;;;22495:1;22492;22485:12;22477:22;-1:-1:-1;22565:2:70;22559:9;22514:1;;22607:3;22595:16;;-1:-1:-1;;;;;22626:34:70;;22662:22;;;22623:62;22620:187;;;-1:-1:-1;;;22708:32:70;;22763:4;22760:1;22753:15;22792:4;22715:2;22781:16;22620:187;22823:2;22816:22;;;22880:16;;22905:21;;22993:2;22978:18;;;22972:25;23013:15;;;23006:32;23090:18;;;23084:25;23125:15;;;23118:32;23217:2;23202:18;;;23196:25;23237:15;;;23230:32;23329:3;23314:19;;;23308:26;23350:16;;;23343:33;;;;-1:-1:-1;22912:6:70;;22302:1105;-1:-1:-1;;22302:1105:70:o;23412:456::-;23500:6;23508;23516;23569:2;23557:9;23548:7;23544:23;23540:32;23537:52;;;23585:1;23582;23575:12;23537:52;-1:-1:-1;;23630:16:70;;23736:2;23721:18;;23715:25;23832:2;23817:18;;;23811:25;23630:16;;23715:25;;-1:-1:-1;23811:25:70;23412:456;-1:-1:-1;23412:456:70:o;24400:504::-;24659:6;24648:9;24641:25;24702:6;24697:2;24686:9;24682:18;24675:34;24745:3;24740:2;24729:9;24725:18;24718:31;24622:4;24766:45;24806:3;24795:9;24791:19;24783:6;24766:45;:::i;:::-;24842:2;24827:18;;24820:34;;;;-1:-1:-1;24885:3:70;24870:19;24863:35;24758:53;24400:504;-1:-1:-1;;;24400:504:70:o;25818:168::-;25891:9;;;25922;;25939:15;;;25933:22;;25919:37;25909:71;;25960:18;;:::i" + }, + "methodIdentifiers": { + "MAX_FISHERMAN_REWARD_CUT()": "17337b46", + "MIN_DISPUTE_DEPOSIT()": "cc2d55cd", + "acceptDispute(bytes32,uint256)": "050b17ad", + "acceptDisputeConflict(bytes32,uint256,bool,uint256)": "b0e2f7e9", + "arbitrator()": "6cc6cde1", + "areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))": "d36fc9d4", + "cancelDispute(bytes32)": "1792f194", + "createAndAcceptLegacyDispute(address,address,uint256,uint256)": "8d4e9008", + "createIndexingDispute(address,bytes32)": "4bc5839a", + "createQueryDispute(bytes)": "c50a77b1", + "createQueryDisputeConflict(bytes,bytes)": "c894222e", + "disputeDeposit()": "29e03ff1", + "disputePeriod()": "5bf31d4d", + "disputes(bytes32)": "11be1997", + "drawDispute(bytes32)": "9334ea52", + "encodeReceipt((bytes32,bytes32,bytes32))": "6369df6b", + "fishermanRewardCut()": "902a4938", + "getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))": "c9747f51", + "getDisputePeriod()": "5aea0ec4", + "getFishermanRewardCut()": "bb2a2b47", + "getStakeSnapshot(address)": "c133b429", + "initialize(address,address,uint64,uint256,uint32,uint32)": "0bc7344b", + "isDisputeCreated(bytes32)": "be41f384", + "maxSlashingCut()": "0533e1ba", + "owner()": "8da5cb5b", + "rejectDispute(bytes32)": "36167e03", + "renounceOwnership()": "715018a6", + "setArbitrator(address)": "b0eefabe", + "setDisputeDeposit(uint256)": "16972978", + "setDisputePeriod(uint64)": "d76f62d1", + "setFishermanRewardCut(uint32)": "76c993ae", + "setMaxSlashingCut(uint32)": "9f81a7cf", + "setSubgraphService(address)": "93a90a1e", + "subgraphService()": "26058249", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"}],\"name\":\"AttestationInvalidBytesLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerDisputeAlreadyCreated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerDisputeInConflict\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerDisputeNotInConflict\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum IDisputeManager.DisputeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"DisputeManagerDisputeNotPending\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerDisputePeriodNotFinished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerDisputePeriodZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"DisputeManagerIndexerNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerInvalidDispute\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"}],\"name\":\"DisputeManagerInvalidDisputeDeposit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"cut\",\"type\":\"uint32\"}],\"name\":\"DisputeManagerInvalidFishermanReward\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"maxSlashingCut\",\"type\":\"uint32\"}],\"name\":\"DisputeManagerInvalidMaxSlashingCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTokensSlash\",\"type\":\"uint256\"}],\"name\":\"DisputeManagerInvalidTokensSlash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"relatedDisputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerMustAcceptRelatedDispute\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"requestCID2\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID2\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId2\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerNonConflictingAttestations\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId2\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerNonMatchingSubgraphDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerNotArbitrator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerNotFisherman\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerSubgraphServiceNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"PPMMathInvalidMulPPM\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"arbitrator\",\"type\":\"address\"}],\"name\":\"ArbitratorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"}],\"name\":\"DisputeDepositSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeDrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId1\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId2\",\"type\":\"bytes32\"}],\"name\":\"DisputeLinked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"disputePeriod\",\"type\":\"uint64\"}],\"name\":\"DisputePeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeRejected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fishermanRewardCut\",\"type\":\"uint32\"}],\"name\":\"FishermanRewardCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeSnapshot\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cancellableAt\",\"type\":\"uint256\"}],\"name\":\"IndexingDisputeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensRewards\",\"type\":\"uint256\"}],\"name\":\"LegacyDisputeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxSlashingCut\",\"type\":\"uint32\"}],\"name\":\"MaxSlashingCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"attestation\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeSnapshot\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cancellableAt\",\"type\":\"uint256\"}],\"name\":\"QueryDisputeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"subgraphService\",\"type\":\"address\"}],\"name\":\"SubgraphServiceSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_FISHERMAN_REWARD_CUT\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_DISPUTE_DEPOSIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"}],\"name\":\"acceptDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"acceptDisputeInConflict\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlashRelated\",\"type\":\"uint256\"}],\"name\":\"acceptDisputeConflict\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"arbitrator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct Attestation.State\",\"name\":\"attestation1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct Attestation.State\",\"name\":\"attestation2\",\"type\":\"tuple\"}],\"name\":\"areConflictingAttestations\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"cancelDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensRewards\",\"type\":\"uint256\"}],\"name\":\"createAndAcceptLegacyDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"}],\"name\":\"createIndexingDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"attestationData\",\"type\":\"bytes\"}],\"name\":\"createQueryDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"attestationData1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"attestationData2\",\"type\":\"bytes\"}],\"name\":\"createQueryDisputeConflict\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputeDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputePeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"disputes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"relatedDisputeId\",\"type\":\"bytes32\"},{\"internalType\":\"enum IDisputeManager.DisputeType\",\"name\":\"disputeType\",\"type\":\"uint8\"},{\"internalType\":\"enum IDisputeManager.DisputeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cancellableAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeSnapshot\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"drawDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"internalType\":\"struct Attestation.Receipt\",\"name\":\"receipt\",\"type\":\"tuple\"}],\"name\":\"encodeReceipt\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fishermanRewardCut\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct Attestation.State\",\"name\":\"attestation\",\"type\":\"tuple\"}],\"name\":\"getAttestationIndexer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDisputePeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFishermanRewardCut\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"getStakeSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"arbitrator_\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"disputePeriod_\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"disputeDeposit_\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"fishermanRewardCut_\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxSlashingCut_\",\"type\":\"uint32\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"isDisputeCreated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSlashingCut\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"rejectDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"arbitrator\",\"type\":\"address\"}],\"name\":\"setArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"}],\"name\":\"setDisputeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"disputePeriod\",\"type\":\"uint64\"}],\"name\":\"setDisputePeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"fishermanRewardCut_\",\"type\":\"uint32\"}],\"name\":\"setFishermanRewardCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"maxSlashingCut_\",\"type\":\"uint32\"}],\"name\":\"setMaxSlashingCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"subgraphService_\",\"type\":\"address\"}],\"name\":\"setSubgraphService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subgraphService\",\"outputs\":[{\"internalType\":\"contract ISubgraphService\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"AttestationInvalidBytesLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the attestation data\",\"length\":\"The length of the attestation data\"}}],\"DisputeManagerDisputeAlreadyCreated(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerDisputeInConflict(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerDisputeNotInConflict(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerDisputeNotPending(uint8)\":[{\"params\":{\"status\":\"The status of the dispute\"}}],\"DisputeManagerIndexerNotFound(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"DisputeManagerInvalidDispute(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerInvalidDisputeDeposit(uint256)\":[{\"params\":{\"disputeDeposit\":\"The dispute deposit\"}}],\"DisputeManagerInvalidFishermanReward(uint32)\":[{\"params\":{\"cut\":\"The fisherman reward cut\"}}],\"DisputeManagerInvalidMaxSlashingCut(uint32)\":[{\"params\":{\"maxSlashingCut\":\"The max slashing cut\"}}],\"DisputeManagerInvalidTokensSlash(uint256,uint256)\":[{\"params\":{\"maxTokensSlash\":\"The max tokens slash\",\"tokensSlash\":\"The tokens slash\"}}],\"DisputeManagerMustAcceptRelatedDispute(bytes32,bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\",\"relatedDisputeId\":\"The related dispute id\"}}],\"DisputeManagerNonConflictingAttestations(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)\":[{\"params\":{\"requestCID1\":\"The request CID of the first attestation\",\"requestCID2\":\"The request CID of the second attestation\",\"responseCID1\":\"The response CID of the first attestation\",\"responseCID2\":\"The response CID of the second attestation\",\"subgraphDeploymentId1\":\"The subgraph deployment id of the first attestation\",\"subgraphDeploymentId2\":\"The subgraph deployment id of the second attestation\"}}],\"DisputeManagerNonMatchingSubgraphDeployment(bytes32,bytes32)\":[{\"params\":{\"subgraphDeploymentId1\":\"The subgraph deployment id of the first attestation\",\"subgraphDeploymentId2\":\"The subgraph deployment id of the second attestation\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"PPMMathInvalidMulPPM(uint256,uint256)\":[{\"params\":{\"a\":\"The first value in the multiplication.\",\"b\":\"The second value in the multiplication.\"}}]},\"events\":{\"ArbitratorSet(address)\":{\"params\":{\"arbitrator\":\"The address of the arbitrator.\"}},\"DisputeAccepted(bytes32,address,address,uint256)\":{\"details\":\"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.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens transferred to the fisherman, the deposit plus reward\"}},\"DisputeCancelled(bytes32,address,address,uint256)\":{\"details\":\"Emitted when a dispute is cancelled by the fisherman. The event emits the amount `tokens` returned to the fisherman.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens returned to the fisherman - the deposit\"}},\"DisputeDepositSet(uint256)\":{\"params\":{\"disputeDeposit\":\"The dispute deposit required to create a dispute.\"}},\"DisputeDrawn(bytes32,address,address,uint256)\":{\"details\":\"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.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens returned to the fisherman - the deposit\"}},\"DisputeLinked(bytes32,bytes32)\":{\"details\":\"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.\",\"params\":{\"disputeId1\":\"The first dispute id\",\"disputeId2\":\"The second dispute id\"}},\"DisputePeriodSet(uint64)\":{\"params\":{\"disputePeriod\":\"The dispute period in seconds.\"}},\"DisputeRejected(bytes32,address,address,uint256)\":{\"details\":\"Emitted when arbitrator rejects a `disputeId` for `indexer` created by `fisherman`. The event emits the amount `tokens` burned from the fisherman deposit.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens burned from the fisherman deposit\"}},\"FishermanRewardCutSet(uint32)\":{\"params\":{\"fishermanRewardCut\":\"The fisherman reward cut.\"}},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"IndexingDisputeCreated(bytes32,address,address,uint256,address,bytes32,uint256,uint256)\":{\"details\":\"Emitted when an indexing dispute is created for `allocationId` and `indexer` by `fisherman`. The event emits the amount of `tokens` deposited by the fisherman.\",\"params\":{\"allocationId\":\"The allocation id\",\"cancellableAt\":\"The timestamp when the dispute can be cancelled\",\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"poi\":\"The POI\",\"stakeSnapshot\":\"The stake snapshot of the indexer at the time of the dispute\",\"tokens\":\"The amount of tokens deposited by the fisherman\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LegacyDisputeCreated(bytes32,address,address,address,uint256,uint256)\":{\"details\":\"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.\",\"params\":{\"allocationId\":\"The allocation id\",\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address to be credited with the rewards\",\"indexer\":\"The indexer address\",\"tokensRewards\":\"The amount of tokens to reward the fisherman\",\"tokensSlash\":\"The amount of tokens to slash\"}},\"MaxSlashingCutSet(uint32)\":{\"params\":{\"maxSlashingCut\":\"The maximum slashing cut that can be set.\"}},\"QueryDisputeCreated(bytes32,address,address,uint256,bytes32,bytes,uint256,uint256)\":{\"details\":\"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.\",\"params\":{\"attestation\":\"The attestation\",\"cancellableAt\":\"The timestamp when the dispute can be cancelled\",\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"stakeSnapshot\":\"The stake snapshot of the indexer at the time of the dispute\",\"subgraphDeploymentId\":\"The subgraph deployment id\",\"tokens\":\"The amount of tokens deposited by the fisherman\"}},\"SubgraphServiceSet(address)\":{\"params\":{\"subgraphService\":\"The address of the subgraph service.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptDispute(bytes32,uint256)\":{\"details\":\"Accept a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be accepted\",\"tokensSlash\":\"Amount of tokens to slash from the indexer\"}},\"acceptDisputeConflict(bytes32,uint256,bool,uint256)\":{\"params\":{\"acceptDisputeInConflict\":\"Accept the conflicting dispute. Otherwise it will be drawn automatically\",\"disputeId\":\"Id of the dispute to be accepted\",\"tokensSlash\":\"Amount of tokens to slash from the indexer for the first dispute\",\"tokensSlashRelated\":\"Amount of tokens to slash from the indexer for the related dispute in case acceptDisputeInConflict is true, otherwise it will be ignored\"}},\"areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"params\":{\"attestation1\":\"The first attestation\",\"attestation2\":\"The second attestation\"},\"returns\":{\"_0\":\"Whether the attestations are conflicting\"}},\"cancelDispute(bytes32)\":{\"details\":\"Cancel a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be cancelled\"}},\"constructor\":{\"params\":{\"controller\":\"Address of the controller\"}},\"createAndAcceptLegacyDispute(address,address,uint256,uint256)\":{\"params\":{\"allocationId\":\"The allocation to dispute\",\"fisherman\":\"The fisherman address to be credited with the rewards\",\"tokensRewards\":\"The amount of tokens to reward the fisherman\",\"tokensSlash\":\"The amount of tokens to slash\"},\"returns\":{\"_0\":\"The dispute id\"}},\"createIndexingDispute(address,bytes32)\":{\"params\":{\"allocationId\":\"The allocation to dispute\",\"poi\":\"The Proof of Indexing (POI) being disputed\"},\"returns\":{\"_0\":\"The dispute id\"}},\"createQueryDispute(bytes)\":{\"params\":{\"attestationData\":\"Attestation bytes submitted by the fisherman\"},\"returns\":{\"_0\":\"The dispute id\"}},\"createQueryDisputeConflict(bytes,bytes)\":{\"params\":{\"attestationData1\":\"First attestation data submitted\",\"attestationData2\":\"Second attestation data submitted\"},\"returns\":{\"_0\":\"The first dispute id\",\"_1\":\"The second dispute id\"}},\"drawDispute(bytes32)\":{\"details\":\"Ignore a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be disregarded\"}},\"encodeReceipt((bytes32,bytes32,bytes32))\":{\"details\":\"Return the message hash used to sign the receipt\",\"params\":{\"receipt\":\"Receipt returned by indexer and submitted by fisherman\"},\"returns\":{\"_0\":\"Message hash used to sign the receipt\"}},\"getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"params\":{\"attestation\":\"Attestation\"},\"returns\":{\"_0\":\"indexer address\"}},\"getDisputePeriod()\":{\"returns\":{\"_0\":\"Dispute period in seconds\"}},\"getFishermanRewardCut()\":{\"returns\":{\"_0\":\"Fisherman reward cut in percentage (ppm)\"}},\"getStakeSnapshot(address)\":{\"params\":{\"indexer\":\"The indexer address\"},\"returns\":{\"_0\":\"The stake snapshot\"}},\"initialize(address,address,uint64,uint256,uint32,uint32)\":{\"params\":{\"arbitrator\":\"Arbitrator role\",\"disputeDeposit\":\"Deposit required to create a Dispute\",\"disputePeriod\":\"Dispute period in seconds\",\"fishermanRewardCut_\":\"Percent of slashed funds for fisherman (ppm)\",\"maxSlashingCut_\":\"Maximum percentage of indexer stake that can be slashed (ppm)\",\"owner\":\"The owner of the contract\"}},\"isDisputeCreated(bytes32)\":{\"details\":\"Return if dispute with Id `disputeId` exists\",\"params\":{\"disputeId\":\"True if dispute already exists\"},\"returns\":{\"_0\":\"True if dispute already exists\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"rejectDispute(bytes32)\":{\"details\":\"Reject a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be rejected\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setArbitrator(address)\":{\"details\":\"Update the arbitrator to `_arbitrator`\",\"params\":{\"arbitrator\":\"The address of the arbitration contract or party\"}},\"setDisputeDeposit(uint256)\":{\"details\":\"Update the dispute deposit to `_disputeDeposit` Graph Tokens\",\"params\":{\"disputeDeposit\":\"The dispute deposit in Graph Tokens\"}},\"setDisputePeriod(uint64)\":{\"details\":\"Update the dispute period to `_disputePeriod` in seconds\",\"params\":{\"disputePeriod\":\"Dispute period in seconds\"}},\"setFishermanRewardCut(uint32)\":{\"details\":\"Update the reward percentage to `_percentage`\",\"params\":{\"fishermanRewardCut_\":\"Reward as a percentage of indexer stake\"}},\"setMaxSlashingCut(uint32)\":{\"params\":{\"maxSlashingCut_\":\"Max percentage slashing for disputes\"}},\"setSubgraphService(address)\":{\"details\":\"Update the subgraph service to `_subgraphService`\",\"params\":{\"subgraphService\":\"The address of the subgraph service contract\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"DisputeManager\",\"version\":1},\"userdoc\":{\"errors\":{\"AttestationInvalidBytesLength(uint256,uint256)\":[{\"notice\":\"The error thrown when the attestation data length is invalid\"}],\"DisputeManagerDisputeAlreadyCreated(bytes32)\":[{\"notice\":\"Thrown when the dispute is already created\"}],\"DisputeManagerDisputeInConflict(bytes32)\":[{\"notice\":\"Thrown when the dispute is in conflict\"}],\"DisputeManagerDisputeNotInConflict(bytes32)\":[{\"notice\":\"Thrown when the dispute is not in conflict\"}],\"DisputeManagerDisputeNotPending(uint8)\":[{\"notice\":\"Thrown when the dispute is not pending\"}],\"DisputeManagerDisputePeriodNotFinished()\":[{\"notice\":\"Thrown when the dispute period is not finished\"}],\"DisputeManagerDisputePeriodZero()\":[{\"notice\":\"Thrown when the dispute period is zero\"}],\"DisputeManagerIndexerNotFound(address)\":[{\"notice\":\"Thrown when the indexer is not found\"}],\"DisputeManagerInvalidDispute(bytes32)\":[{\"notice\":\"Thrown when the dispute id is invalid\"}],\"DisputeManagerInvalidDisputeDeposit(uint256)\":[{\"notice\":\"Thrown when the dispute deposit is invalid - less than the minimum dispute deposit\"}],\"DisputeManagerInvalidFishermanReward(uint32)\":[{\"notice\":\"Thrown when the fisherman reward cut is invalid\"}],\"DisputeManagerInvalidMaxSlashingCut(uint32)\":[{\"notice\":\"Thrown when the max slashing cut is invalid\"}],\"DisputeManagerInvalidTokensSlash(uint256,uint256)\":[{\"notice\":\"Thrown when the tokens slash is invalid\"}],\"DisputeManagerInvalidZeroAddress()\":[{\"notice\":\"Thrown when the address is the zero address\"}],\"DisputeManagerMustAcceptRelatedDispute(bytes32,bytes32)\":[{\"notice\":\"Thrown when the dispute must be accepted\"}],\"DisputeManagerNonConflictingAttestations(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)\":[{\"notice\":\"Thrown when the attestations are not conflicting\"}],\"DisputeManagerNonMatchingSubgraphDeployment(bytes32,bytes32)\":[{\"notice\":\"Thrown when the subgraph deployment is not matching\"}],\"DisputeManagerNotArbitrator()\":[{\"notice\":\"Thrown when the caller is not the arbitrator\"}],\"DisputeManagerNotFisherman()\":[{\"notice\":\"Thrown when the caller is not the fisherman\"}],\"DisputeManagerSubgraphServiceNotSet()\":[{\"notice\":\"Thrown when attempting to get the subgraph service before it is set\"}],\"DisputeManagerZeroTokens()\":[{\"notice\":\"Thrown when the indexer being disputed has no provisioned tokens\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}],\"PPMMathInvalidMulPPM(uint256,uint256)\":[{\"notice\":\"Thrown when no value in a multiplication is in PPM.\"}]},\"events\":{\"ArbitratorSet(address)\":{\"notice\":\"Emitted when arbitrator is set.\"},\"DisputeDepositSet(uint256)\":{\"notice\":\"Emitted when dispute deposit is set.\"},\"DisputePeriodSet(uint64)\":{\"notice\":\"Emitted when dispute period is set.\"},\"FishermanRewardCutSet(uint32)\":{\"notice\":\"Emitted when fisherman reward cut is set.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"MaxSlashingCutSet(uint32)\":{\"notice\":\"Emitted when max slashing cut is set.\"},\"SubgraphServiceSet(address)\":{\"notice\":\"Emitted when subgraph service is set.\"}},\"kind\":\"user\",\"methods\":{\"MAX_FISHERMAN_REWARD_CUT()\":{\"notice\":\"Maximum value for fisherman reward cut in PPM\"},\"MIN_DISPUTE_DEPOSIT()\":{\"notice\":\"Minimum value for dispute deposit\"},\"acceptDispute(bytes32,uint256)\":{\"notice\":\"The arbitrator accepts a dispute as being valid. 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. This function will also revert if the dispute is in conflict, to accept a conflicting dispute use acceptDisputeConflict.\"},\"acceptDisputeConflict(bytes32,uint256,bool,uint256)\":{\"notice\":\"The arbitrator accepts a conflicting dispute as being valid. 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.\"},\"arbitrator()\":{\"notice\":\"The arbitrator is solely in control of arbitrating disputes\"},\"areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"notice\":\"Checks if two attestations are conflicting\"},\"cancelDispute(bytes32)\":{\"notice\":\"Once the dispute period ends, if the dispute status remains Pending, the fisherman can cancel the dispute and get back their initial deposit. Note that cancelling a conflicting query dispute will also cancel the related dispute.\"},\"constructor\":{\"notice\":\"Contract constructor\"},\"createAndAcceptLegacyDispute(address,address,uint256,uint256)\":{\"notice\":\"Creates and auto-accepts a legacy dispute. This disputes can be created to settle outstanding slashing amounts with an indexer that has been \\\"legacy slashed\\\" during or shortly after the transition period. See {HorizonStakingExtension.legacySlash} for more details. Note that this type of dispute: - can only be created by the arbitrator - does not require a bond - is automatically accepted when created Additionally, note that this type of disputes allow the arbitrator to directly set the slash and rewards amounts, bypassing the usual mechanisms that impose restrictions on those. This is done to give arbitrators maximum flexibility to ensure outstanding slashing amounts are settled fairly. This function needs to be removed after the transition period. Requirements: - Indexer must have been legacy slashed during or shortly after the transition period - Indexer must have provisioned funds to the Subgraph Service\"},\"createIndexingDispute(address,bytes32)\":{\"notice\":\"Create an indexing dispute for the arbitrator to resolve. The disputes are created in reference to an allocationId and specifically a POI for that allocation. This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens. Requirements: - fisherman must have previously approved this contract to pull `disputeDeposit` amount of tokens from their balance.\"},\"createQueryDispute(bytes)\":{\"notice\":\"Create a query dispute for the arbitrator to resolve. This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens. * Requirements: - fisherman must have previously approved this contract to pull `disputeDeposit` amount of tokens from their balance.\"},\"createQueryDisputeConflict(bytes,bytes)\":{\"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. Two linked disputes will be created and if the arbitrator resolve one, the other one will be automatically resolved. Note that: - it's not possible to reject a conflicting query dispute as by definition at least one of the attestations is incorrect. - if both attestations are proven to be incorrect, the arbitrator can slash the indexer twice. Requirements: - fisherman must have previously approved this contract to pull `disputeDeposit` amount of tokens from their balance.\"},\"disputeDeposit()\":{\"notice\":\"Deposit required to create a Dispute\"},\"disputePeriod()\":{\"notice\":\"dispute period in seconds\"},\"disputes(bytes32)\":{\"notice\":\"List of disputes created\"},\"drawDispute(bytes32)\":{\"notice\":\"The arbitrator draws dispute. Note that drawing a conflicting query dispute should not be possible however it is allowed to give arbitrators greater flexibility when resolving disputes.\"},\"encodeReceipt((bytes32,bytes32,bytes32))\":{\"notice\":\"Get the message hash that a indexer used to sign the receipt. Encodes a receipt using a domain separator, as described on https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification.\"},\"fishermanRewardCut()\":{\"notice\":\"Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute. In PPM.\"},\"getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"notice\":\"Returns the indexer that signed an attestation.\"},\"getDisputePeriod()\":{\"notice\":\"Get the dispute period.\"},\"getFishermanRewardCut()\":{\"notice\":\"Get the fisherman reward cut.\"},\"getStakeSnapshot(address)\":{\"notice\":\"Get the stake snapshot for an indexer.\"},\"initialize(address,address,uint64,uint256,uint32,uint32)\":{\"notice\":\"Initialize this contract.\"},\"isDisputeCreated(bytes32)\":{\"notice\":\"Return whether a dispute exists or not.\"},\"maxSlashingCut()\":{\"notice\":\"Maximum percentage of indexer stake that can be slashed on a dispute. In PPM.\"},\"rejectDispute(bytes32)\":{\"notice\":\"The arbitrator rejects a dispute as being invalid. Note that conflicting query disputes cannot be rejected.\"},\"setArbitrator(address)\":{\"notice\":\"Set the arbitrator address.\"},\"setDisputeDeposit(uint256)\":{\"notice\":\"Set the dispute deposit required to create a dispute.\"},\"setDisputePeriod(uint64)\":{\"notice\":\"Set the dispute period.\"},\"setFishermanRewardCut(uint32)\":{\"notice\":\"Set the percent reward that the fisherman gets when slashing occurs.\"},\"setMaxSlashingCut(uint32)\":{\"notice\":\"Set the maximum percentage that can be used for slashing indexers.\"},\"setSubgraphService(address)\":{\"notice\":\"Set the subgraph service address.\"},\"subgraphService()\":{\"notice\":\"The Subgraph Service contract address\"}},\"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. Query Disputes: Graph nodes receive queries and return responses with signed receipts called attestations. An attestation can be disputed if the consumer thinks the query response was invalid. Indexers use the derived private key for an allocation to sign attestations. Indexing Disputes: Indexers periodically present a Proof of Indexing (POI) to prove they are indexing a subgraph. The Subgraph Service contract emits that proof which includes the POI. Any fisherman can dispute the validity of a POI by submitting a dispute to this contract along with a deposit. Arbitration: Disputes can only be accepted, rejected or drawn by the arbitrator role that can be delegated to a EOA or DAO.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DisputeManager.sol\":\"DisputeManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\":{\"keccak256\":\"0x7bd336193785ed6f09a3bd847f9208f64aa9b87ad67c40838d00fec41bb153d5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d96d83cdb9bbb567e4eafac8bdef3ff6bdaf426338baf76bae277c11afb33cee\",\"dweb:/ipfs/QmNjr4PiJ76Wc5mFqa9H88BjsEMrUfy1jiftNHYTgd6Mp5\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/MathUtils.sol\":{\"keccak256\":\"0x24cd80c0d25f634db1e8101c0a474a284758eb7a2203ae3abf507f578fa12e0a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://69d03db4aaa31184b3ec9526bf236949683c5a35785c298cad0ac160904b695c\",\"dweb:/ipfs/Qmd2xSKW6ojrapgrRimrXCpc52GTrQ3BMAEYH17UvSfvLV\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/DisputeManager.sol\":{\"keccak256\":\"0xb431a6ab58b65a49ba79923401267b79177b483fff9331ea82a81345a03d3629\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8a20e0d7fabf30489df74320a69c03973ada601dc8fc277746f901b8165a0c3d\",\"dweb:/ipfs/QmaAmVkyzYCDg476AdBTXYRzmHJZ8bJ71LuudZFhnKxCUT\"]},\"contracts/DisputeManagerStorage.sol\":{\"keccak256\":\"0xa340be8ba8f0350d954a3b572f958eb9e1de64ebfeffd208ea3e252ebb4ebb1d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://45658c8d8b475b52e4e97b1a9f06ab4e4205765f73fad4dda56f980d88d4f6b9\",\"dweb:/ipfs/QmQ5kS2FSxoBi2fRq7szKCNVetfwNe8DVTyDhHCnixWAdH\"]},\"contracts/interfaces/IDisputeManager.sol\":{\"keccak256\":\"0x9db8ffdf7fe30954824ed706a1a5e7c2d6323b745bddba16b7166a639344f9f7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e5d810bf6188c38a028dab511c5653fde7b7feca0a173f03974402a83cb234f9\",\"dweb:/ipfs/QmYGtytqHeDFK91FmSNL5iavD8sHUFcA47WBU9BuHG3i75\"]},\"contracts/interfaces/ISubgraphService.sol\":{\"keccak256\":\"0x7516f80b0a8b2e3edeedf06c9b917f2a24e557f8c00632e6150fbb41ef8da3ce\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ad4f813111541f5ef9ea6236f42822a3a66364d24189e4568450b20e09972a5e\",\"dweb:/ipfs/QmVYQA9rT7T8YnQgAB6fokNYDJeDrgQqrjfJ8sGjySNFBo\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]},\"contracts/utilities/AttestationManager.sol\":{\"keccak256\":\"0x44218c9dd0d618b0e383cad19efd5846ec85d1a11270aa7c04b75e2fa7ddc3a4\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ee8ca0b9b9746636ff1ad549081fbc176d959544bc7798d0bfb10e3ec61af8b7\",\"dweb:/ipfs/QmcE9RJqj32uoTsWLV2ffwuEPWnBh7Vn8ZpzorXBjgosGd\"]},\"contracts/utilities/AttestationManagerStorage.sol\":{\"keccak256\":\"0x3ae176c9166fac5bfb08e875ad132fe9d1559ce67df28b906683d4f168e1afdc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2b40d4be47cc74387e3c390e081bdadc84f84062e9708a7a84d73f02e0a3853a\",\"dweb:/ipfs/QmQL8DUzrtgQABb1CvcuSeuapXntXEh5aKi4ZjE3MssBgZ\"]}},\"version\":1}" + } + }, + "contracts/DisputeManagerStorage.sol": { + "DisputeManagerV1Storage": { + "abi": [ + { + "inputs": [], + "name": "arbitrator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputeDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "disputes", + "outputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deposit", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + }, + { + "internalType": "enum IDisputeManager.DisputeType", + "name": "disputeType", + "type": "uint8" + }, + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxSlashingCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "subgraphService", + "outputs": [ + { + "internalType": "contract ISubgraphService", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "arbitrator()": "6cc6cde1", + "disputeDeposit()": "29e03ff1", + "disputePeriod()": "5bf31d4d", + "disputes(bytes32)": "11be1997", + "fishermanRewardCut()": "902a4938", + "maxSlashingCut()": "0533e1ba", + "subgraphService()": "26058249" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"arbitrator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputeDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disputePeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"disputes\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"relatedDisputeId\",\"type\":\"bytes32\"},{\"internalType\":\"enum IDisputeManager.DisputeType\",\"name\":\"disputeType\",\"type\":\"uint8\"},{\"internalType\":\"enum IDisputeManager.DisputeStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cancellableAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeSnapshot\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fishermanRewardCut\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSlashingCut\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subgraphService\",\"outputs\":[{\"internalType\":\"contract ISubgraphService\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"DisputeManagerStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"arbitrator()\":{\"notice\":\"The arbitrator is solely in control of arbitrating disputes\"},\"disputeDeposit()\":{\"notice\":\"Deposit required to create a Dispute\"},\"disputePeriod()\":{\"notice\":\"dispute period in seconds\"},\"disputes(bytes32)\":{\"notice\":\"List of disputes created\"},\"fishermanRewardCut()\":{\"notice\":\"Percentage of indexer slashed funds to assign as a reward to fisherman in successful dispute. In PPM.\"},\"maxSlashingCut()\":{\"notice\":\"Maximum percentage of indexer stake that can be slashed on a dispute. In PPM.\"},\"subgraphService()\":{\"notice\":\"The Subgraph Service contract address\"}},\"notice\":\"This contract holds all the storage variables for the Dispute Manager contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DisputeManagerStorage.sol\":\"DisputeManagerV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/DisputeManagerStorage.sol\":{\"keccak256\":\"0xa340be8ba8f0350d954a3b572f958eb9e1de64ebfeffd208ea3e252ebb4ebb1d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://45658c8d8b475b52e4e97b1a9f06ab4e4205765f73fad4dda56f980d88d4f6b9\",\"dweb:/ipfs/QmQ5kS2FSxoBi2fRq7szKCNVetfwNe8DVTyDhHCnixWAdH\"]},\"contracts/interfaces/IDisputeManager.sol\":{\"keccak256\":\"0x9db8ffdf7fe30954824ed706a1a5e7c2d6323b745bddba16b7166a639344f9f7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e5d810bf6188c38a028dab511c5653fde7b7feca0a173f03974402a83cb234f9\",\"dweb:/ipfs/QmYGtytqHeDFK91FmSNL5iavD8sHUFcA47WBU9BuHG3i75\"]},\"contracts/interfaces/ISubgraphService.sol\":{\"keccak256\":\"0x7516f80b0a8b2e3edeedf06c9b917f2a24e557f8c00632e6150fbb41ef8da3ce\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ad4f813111541f5ef9ea6236f42822a3a66364d24189e4568450b20e09972a5e\",\"dweb:/ipfs/QmVYQA9rT7T8YnQgAB6fokNYDJeDrgQqrjfJ8sGjySNFBo\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]}},\"version\":1}" + } + }, + "contracts/SubgraphService.sol": { + "SubgraphService": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + } + ], + "name": "AllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationDoesNotExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerAllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "AllocationManagerAllocationSameSize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerInvalidAllocationProof", + "type": "error" + }, + { + "inputs": [], + "name": "AllocationManagerInvalidZeroAllocationId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "DataServicePausableNotPauseGuardian", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "DataServicePausablePauseGuardianNoChange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + } + ], + "name": "DirectoryNotDisputeManager", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "LegacyAllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListEmptyList", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidIterations", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListInvalidZeroId", + "type": "error" + }, + { + "inputs": [], + "name": "LinkedListMaxElementsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "PPMMathInvalidMulPPM", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidRange", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionManagerInvalidValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "ProvisionManagerNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionManagerProvisionNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensAvailable", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRequired", + "type": "uint256" + } + ], + "name": "ProvisionTrackerInsufficientTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationIsAltruistic", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceCannotForceCloseAllocation", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyGeohash", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyUrl", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + } + ], + "name": "SubgraphServiceInconsistentCollection", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceIndexerAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "providedIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerMismatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerNotRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + } + ], + "name": "SubgraphServiceInvalidCollectionId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "SubgraphServiceInvalidCurationCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "SubgraphServiceInvalidPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ravIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceInvalidRAV", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "forceClosed", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "AllocationCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldTokens", + "type": "uint256" + } + ], + "name": "AllocationResized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "CurationCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "ratio", + "type": "uint32" + } + ], + "name": "DelegationRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensIndexerRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "poiMetadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "IndexingRewardsCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "LegacyAllocationMigrated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxPOIStaleness", + "type": "uint256" + } + ], + "name": "MaxPOIStalenessSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "PauseGuardianSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "paymentsDestination", + "type": "address" + } + ], + "name": "PaymentsDestinationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "min", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "ProvisionTokensRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCurators", + "type": "uint256" + } + ], + "name": "QueryFeesCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "StakeToFeesRatioSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "subgraphService", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "name": "SubgraphServiceDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "min", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "max", + "type": "uint64" + } + ], + "name": "ThawingPeriodRangeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "min", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "max", + "type": "uint32" + } + ], + "name": "VerifierCutRangeSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "allocationProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "nextClaim", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "claimsLists", + "outputs": [ + { + "internalType": "bytes32", + "name": "head", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "tail", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "closeStaleAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "curationFeesCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "encodeAllocationProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "feesProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastPOIPresentedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + } + ], + "internalType": "struct Allocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocationData", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCuration", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputeManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGraphTallyCollector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getLegacyAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct LegacyAllocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "getSubgraphAllocatedTokens", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "indexers", + "outputs": [ + { + "internalType": "uint256", + "name": "registeredAt", + "type": "uint256" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "string", + "name": "geoHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maximumDelegationRatio", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "isOverAllocated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxPOIStaleness", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentID", + "type": "bytes32" + } + ], + "name": "migrateLegacyAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + } + ], + "name": "pauseGuardians", + "outputs": [ + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "paymentsDestination", + "outputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "resizeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "setCurationCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "setDelegationRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxPOIStaleness_", + "type": "uint256" + } + ], + "name": "setMaxPOIStaleness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + } + ], + "name": "setMinimumProvisionTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "paymentsDestination_", + "type": "address" + } + ], + "name": "setPaymentsDestination", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeToFeesRatio_", + "type": "uint256" + } + ], + "name": "setStakeToFeesRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakeToFeesRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_13702": { + "entryPoint": null, + "id": 13702, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@_17679": { + "entryPoint": null, + "id": 17679, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@_4795": { + "entryPoint": null, + "id": 4795, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_869": { + "entryPoint": null, + "id": 869, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_disableInitializers_5345": { + "entryPoint": 1139, + "id": 5345, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_getContractFromController_4927": { + "entryPoint": 965, + "id": 4927, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_getInitializableStorage_5390": { + "entryPoint": null, + "id": 5390, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_initializableStorageSlot_5376": { + "entryPoint": null, + "id": 5376, + "parameterSlots": 0, + "returnSlots": 1 + }, + "abi_decode_address_fromMemory": { + "entryPoint": 1317, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address_fromMemory": { + "entryPoint": 1429, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_addresst_addresst_addresst_address_fromMemory": { + "entryPoint": 1345, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_encode_tuple_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_address_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address_t_address_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 8, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 1463, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + } + }, + "generatedSources": [ + { + "ast": { + "nativeSrc": "0:3424:70", + "nodeType": "YulBlock", + "src": "0:3424:70", + "statements": [ + { + "nativeSrc": "6:3:70", + "nodeType": "YulBlock", + "src": "6:3:70", + "statements": [] + }, + { + "body": { + "nativeSrc": "74:117:70", + "nodeType": "YulBlock", + "src": "74:117:70", + "statements": [ + { + "nativeSrc": "84:22:70", + "nodeType": "YulAssignment", + "src": "84:22:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "99:6:70", + "nodeType": "YulIdentifier", + "src": "99:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "93:5:70", + "nodeType": "YulIdentifier", + "src": "93:5:70" + }, + "nativeSrc": "93:13:70", + "nodeType": "YulFunctionCall", + "src": "93:13:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "84:5:70", + "nodeType": "YulIdentifier", + "src": "84:5:70" + } + ] + }, + { + "body": { + "nativeSrc": "169:16:70", + "nodeType": "YulBlock", + "src": "169:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "178:1:70", + "nodeType": "YulLiteral", + "src": "178:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "181:1:70", + "nodeType": "YulLiteral", + "src": "181:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "171:6:70", + "nodeType": "YulIdentifier", + "src": "171:6:70" + }, + "nativeSrc": "171:12:70", + "nodeType": "YulFunctionCall", + "src": "171:12:70" + }, + "nativeSrc": "171:12:70", + "nodeType": "YulExpressionStatement", + "src": "171:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "128:5:70", + "nodeType": "YulIdentifier", + "src": "128:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "139:5:70", + "nodeType": "YulIdentifier", + "src": "139:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "154:3:70", + "nodeType": "YulLiteral", + "src": "154:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "159:1:70", + "nodeType": "YulLiteral", + "src": "159:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "150:3:70", + "nodeType": "YulIdentifier", + "src": "150:3:70" + }, + "nativeSrc": "150:11:70", + "nodeType": "YulFunctionCall", + "src": "150:11:70" + }, + { + "kind": "number", + "nativeSrc": "163:1:70", + "nodeType": "YulLiteral", + "src": "163:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "146:3:70", + "nodeType": "YulIdentifier", + "src": "146:3:70" + }, + "nativeSrc": "146:19:70", + "nodeType": "YulFunctionCall", + "src": "146:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "135:3:70", + "nodeType": "YulIdentifier", + "src": "135:3:70" + }, + "nativeSrc": "135:31:70", + "nodeType": "YulFunctionCall", + "src": "135:31:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "125:2:70", + "nodeType": "YulIdentifier", + "src": "125:2:70" + }, + "nativeSrc": "125:42:70", + "nodeType": "YulFunctionCall", + "src": "125:42:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "118:6:70", + "nodeType": "YulIdentifier", + "src": "118:6:70" + }, + "nativeSrc": "118:50:70", + "nodeType": "YulFunctionCall", + "src": "118:50:70" + }, + "nativeSrc": "115:70:70", + "nodeType": "YulIf", + "src": "115:70:70" + } + ] + }, + "name": "abi_decode_address_fromMemory", + "nativeSrc": "14:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "53:6:70", + "nodeType": "YulTypedName", + "src": "53:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "64:5:70", + "nodeType": "YulTypedName", + "src": "64:5:70", + "type": "" + } + ], + "src": "14:177:70" + }, + { + "body": { + "nativeSrc": "328:332:70", + "nodeType": "YulBlock", + "src": "328:332:70", + "statements": [ + { + "body": { + "nativeSrc": "375:16:70", + "nodeType": "YulBlock", + "src": "375:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "384:1:70", + "nodeType": "YulLiteral", + "src": "384:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "387:1:70", + "nodeType": "YulLiteral", + "src": "387:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "377:6:70", + "nodeType": "YulIdentifier", + "src": "377:6:70" + }, + "nativeSrc": "377:12:70", + "nodeType": "YulFunctionCall", + "src": "377:12:70" + }, + "nativeSrc": "377:12:70", + "nodeType": "YulExpressionStatement", + "src": "377:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "349:7:70", + "nodeType": "YulIdentifier", + "src": "349:7:70" + }, + { + "name": "headStart", + "nativeSrc": "358:9:70", + "nodeType": "YulIdentifier", + "src": "358:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "345:3:70", + "nodeType": "YulIdentifier", + "src": "345:3:70" + }, + "nativeSrc": "345:23:70", + "nodeType": "YulFunctionCall", + "src": "345:23:70" + }, + { + "kind": "number", + "nativeSrc": "370:3:70", + "nodeType": "YulLiteral", + "src": "370:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "341:3:70", + "nodeType": "YulIdentifier", + "src": "341:3:70" + }, + "nativeSrc": "341:33:70", + "nodeType": "YulFunctionCall", + "src": "341:33:70" + }, + "nativeSrc": "338:53:70", + "nodeType": "YulIf", + "src": "338:53:70" + }, + { + "nativeSrc": "400:50:70", + "nodeType": "YulAssignment", + "src": "400:50:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "440:9:70", + "nodeType": "YulIdentifier", + "src": "440:9:70" + } + ], + "functionName": { + "name": "abi_decode_address_fromMemory", + "nativeSrc": "410:29:70", + "nodeType": "YulIdentifier", + "src": "410:29:70" + }, + "nativeSrc": "410:40:70", + "nodeType": "YulFunctionCall", + "src": "410:40:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "400:6:70", + "nodeType": "YulIdentifier", + "src": "400:6:70" + } + ] + }, + { + "nativeSrc": "459:59:70", + "nodeType": "YulAssignment", + "src": "459:59:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "503:9:70", + "nodeType": "YulIdentifier", + "src": "503:9:70" + }, + { + "kind": "number", + "nativeSrc": "514:2:70", + "nodeType": "YulLiteral", + "src": "514:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "499:3:70", + "nodeType": "YulIdentifier", + "src": "499:3:70" + }, + "nativeSrc": "499:18:70", + "nodeType": "YulFunctionCall", + "src": "499:18:70" + } + ], + "functionName": { + "name": "abi_decode_address_fromMemory", + "nativeSrc": "469:29:70", + "nodeType": "YulIdentifier", + "src": "469:29:70" + }, + "nativeSrc": "469:49:70", + "nodeType": "YulFunctionCall", + "src": "469:49:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "459:6:70", + "nodeType": "YulIdentifier", + "src": "459:6:70" + } + ] + }, + { + "nativeSrc": "527:59:70", + "nodeType": "YulAssignment", + "src": "527:59:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "571:9:70", + "nodeType": "YulIdentifier", + "src": "571:9:70" + }, + { + "kind": "number", + "nativeSrc": "582:2:70", + "nodeType": "YulLiteral", + "src": "582:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "567:3:70", + "nodeType": "YulIdentifier", + "src": "567:3:70" + }, + "nativeSrc": "567:18:70", + "nodeType": "YulFunctionCall", + "src": "567:18:70" + } + ], + "functionName": { + "name": "abi_decode_address_fromMemory", + "nativeSrc": "537:29:70", + "nodeType": "YulIdentifier", + "src": "537:29:70" + }, + "nativeSrc": "537:49:70", + "nodeType": "YulFunctionCall", + "src": "537:49:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "527:6:70", + "nodeType": "YulIdentifier", + "src": "527:6:70" + } + ] + }, + { + "nativeSrc": "595:59:70", + "nodeType": "YulAssignment", + "src": "595:59:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "639:9:70", + "nodeType": "YulIdentifier", + "src": "639:9:70" + }, + { + "kind": "number", + "nativeSrc": "650:2:70", + "nodeType": "YulLiteral", + "src": "650:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "635:3:70", + "nodeType": "YulIdentifier", + "src": "635:3:70" + }, + "nativeSrc": "635:18:70", + "nodeType": "YulFunctionCall", + "src": "635:18:70" + } + ], + "functionName": { + "name": "abi_decode_address_fromMemory", + "nativeSrc": "605:29:70", + "nodeType": "YulIdentifier", + "src": "605:29:70" + }, + "nativeSrc": "605:49:70", + "nodeType": "YulFunctionCall", + "src": "605:49:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "595:6:70", + "nodeType": "YulIdentifier", + "src": "595:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_addresst_address_fromMemory", + "nativeSrc": "196:464:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "270:9:70", + "nodeType": "YulTypedName", + "src": "270:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "281:7:70", + "nodeType": "YulTypedName", + "src": "281:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "293:6:70", + "nodeType": "YulTypedName", + "src": "293:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "301:6:70", + "nodeType": "YulTypedName", + "src": "301:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "309:6:70", + "nodeType": "YulTypedName", + "src": "309:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "317:6:70", + "nodeType": "YulTypedName", + "src": "317:6:70", + "type": "" + } + ], + "src": "196:464:70" + }, + { + "body": { + "nativeSrc": "838:160:70", + "nodeType": "YulBlock", + "src": "838:160:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "855:9:70", + "nodeType": "YulIdentifier", + "src": "855:9:70" + }, + { + "kind": "number", + "nativeSrc": "866:2:70", + "nodeType": "YulLiteral", + "src": "866:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "848:6:70", + "nodeType": "YulIdentifier", + "src": "848:6:70" + }, + "nativeSrc": "848:21:70", + "nodeType": "YulFunctionCall", + "src": "848:21:70" + }, + "nativeSrc": "848:21:70", + "nodeType": "YulExpressionStatement", + "src": "848:21:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "889:9:70", + "nodeType": "YulIdentifier", + "src": "889:9:70" + }, + { + "kind": "number", + "nativeSrc": "900:2:70", + "nodeType": "YulLiteral", + "src": "900:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "885:3:70", + "nodeType": "YulIdentifier", + "src": "885:3:70" + }, + "nativeSrc": "885:18:70", + "nodeType": "YulFunctionCall", + "src": "885:18:70" + }, + { + "kind": "number", + "nativeSrc": "905:2:70", + "nodeType": "YulLiteral", + "src": "905:2:70", + "type": "", + "value": "10" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "878:6:70", + "nodeType": "YulIdentifier", + "src": "878:6:70" + }, + "nativeSrc": "878:30:70", + "nodeType": "YulFunctionCall", + "src": "878:30:70" + }, + "nativeSrc": "878:30:70", + "nodeType": "YulExpressionStatement", + "src": "878:30:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "928:9:70", + "nodeType": "YulIdentifier", + "src": "928:9:70" + }, + { + "kind": "number", + "nativeSrc": "939:2:70", + "nodeType": "YulLiteral", + "src": "939:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "924:3:70", + "nodeType": "YulIdentifier", + "src": "924:3:70" + }, + "nativeSrc": "924:18:70", + "nodeType": "YulFunctionCall", + "src": "924:18:70" + }, + { + "hexValue": "436f6e74726f6c6c6572", + "kind": "string", + "nativeSrc": "944:12:70", + "nodeType": "YulLiteral", + "src": "944:12:70", + "type": "", + "value": "Controller" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "917:6:70", + "nodeType": "YulIdentifier", + "src": "917:6:70" + }, + "nativeSrc": "917:40:70", + "nodeType": "YulFunctionCall", + "src": "917:40:70" + }, + "nativeSrc": "917:40:70", + "nodeType": "YulExpressionStatement", + "src": "917:40:70" + }, + { + "nativeSrc": "966:26:70", + "nodeType": "YulAssignment", + "src": "966:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "978:9:70", + "nodeType": "YulIdentifier", + "src": "978:9:70" + }, + { + "kind": "number", + "nativeSrc": "989:2:70", + "nodeType": "YulLiteral", + "src": "989:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "974:3:70", + "nodeType": "YulIdentifier", + "src": "974:3:70" + }, + "nativeSrc": "974:18:70", + "nodeType": "YulFunctionCall", + "src": "974:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "966:4:70", + "nodeType": "YulIdentifier", + "src": "966:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a__to_t_bytes_memory_ptr__fromStack_reversed", + "nativeSrc": "665:333:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "815:9:70", + "nodeType": "YulTypedName", + "src": "815:9:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "829:4:70", + "nodeType": "YulTypedName", + "src": "829:4:70", + "type": "" + } + ], + "src": "665:333:70" + }, + { + "body": { + "nativeSrc": "1272:520:70", + "nodeType": "YulBlock", + "src": "1272:520:70", + "statements": [ + { + "nativeSrc": "1282:27:70", + "nodeType": "YulAssignment", + "src": "1282:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1294:9:70", + "nodeType": "YulIdentifier", + "src": "1294:9:70" + }, + { + "kind": "number", + "nativeSrc": "1305:3:70", + "nodeType": "YulLiteral", + "src": "1305:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1290:3:70", + "nodeType": "YulIdentifier", + "src": "1290:3:70" + }, + "nativeSrc": "1290:19:70", + "nodeType": "YulFunctionCall", + "src": "1290:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "1282:4:70", + "nodeType": "YulIdentifier", + "src": "1282:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1325:9:70", + "nodeType": "YulIdentifier", + "src": "1325:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1340:6:70", + "nodeType": "YulIdentifier", + "src": "1340:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1356:3:70", + "nodeType": "YulLiteral", + "src": "1356:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1361:1:70", + "nodeType": "YulLiteral", + "src": "1361:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1352:3:70", + "nodeType": "YulIdentifier", + "src": "1352:3:70" + }, + "nativeSrc": "1352:11:70", + "nodeType": "YulFunctionCall", + "src": "1352:11:70" + }, + { + "kind": "number", + "nativeSrc": "1365:1:70", + "nodeType": "YulLiteral", + "src": "1365:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1348:3:70", + "nodeType": "YulIdentifier", + "src": "1348:3:70" + }, + "nativeSrc": "1348:19:70", + "nodeType": "YulFunctionCall", + "src": "1348:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1336:3:70", + "nodeType": "YulIdentifier", + "src": "1336:3:70" + }, + "nativeSrc": "1336:32:70", + "nodeType": "YulFunctionCall", + "src": "1336:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1318:6:70", + "nodeType": "YulIdentifier", + "src": "1318:6:70" + }, + "nativeSrc": "1318:51:70", + "nodeType": "YulFunctionCall", + "src": "1318:51:70" + }, + "nativeSrc": "1318:51:70", + "nodeType": "YulExpressionStatement", + "src": "1318:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1389:9:70", + "nodeType": "YulIdentifier", + "src": "1389:9:70" + }, + { + "kind": "number", + "nativeSrc": "1400:2:70", + "nodeType": "YulLiteral", + "src": "1400:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1385:3:70", + "nodeType": "YulIdentifier", + "src": "1385:3:70" + }, + "nativeSrc": "1385:18:70", + "nodeType": "YulFunctionCall", + "src": "1385:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "1409:6:70", + "nodeType": "YulIdentifier", + "src": "1409:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1425:3:70", + "nodeType": "YulLiteral", + "src": "1425:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1430:1:70", + "nodeType": "YulLiteral", + "src": "1430:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1421:3:70", + "nodeType": "YulIdentifier", + "src": "1421:3:70" + }, + "nativeSrc": "1421:11:70", + "nodeType": "YulFunctionCall", + "src": "1421:11:70" + }, + { + "kind": "number", + "nativeSrc": "1434:1:70", + "nodeType": "YulLiteral", + "src": "1434:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1417:3:70", + "nodeType": "YulIdentifier", + "src": "1417:3:70" + }, + "nativeSrc": "1417:19:70", + "nodeType": "YulFunctionCall", + "src": "1417:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1405:3:70", + "nodeType": "YulIdentifier", + "src": "1405:3:70" + }, + "nativeSrc": "1405:32:70", + "nodeType": "YulFunctionCall", + "src": "1405:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1378:6:70", + "nodeType": "YulIdentifier", + "src": "1378:6:70" + }, + "nativeSrc": "1378:60:70", + "nodeType": "YulFunctionCall", + "src": "1378:60:70" + }, + "nativeSrc": "1378:60:70", + "nodeType": "YulExpressionStatement", + "src": "1378:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1458:9:70", + "nodeType": "YulIdentifier", + "src": "1458:9:70" + }, + { + "kind": "number", + "nativeSrc": "1469:2:70", + "nodeType": "YulLiteral", + "src": "1469:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1454:3:70", + "nodeType": "YulIdentifier", + "src": "1454:3:70" + }, + "nativeSrc": "1454:18:70", + "nodeType": "YulFunctionCall", + "src": "1454:18:70" + }, + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "1478:6:70", + "nodeType": "YulIdentifier", + "src": "1478:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1494:3:70", + "nodeType": "YulLiteral", + "src": "1494:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1499:1:70", + "nodeType": "YulLiteral", + "src": "1499:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1490:3:70", + "nodeType": "YulIdentifier", + "src": "1490:3:70" + }, + "nativeSrc": "1490:11:70", + "nodeType": "YulFunctionCall", + "src": "1490:11:70" + }, + { + "kind": "number", + "nativeSrc": "1503:1:70", + "nodeType": "YulLiteral", + "src": "1503:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1486:3:70", + "nodeType": "YulIdentifier", + "src": "1486:3:70" + }, + "nativeSrc": "1486:19:70", + "nodeType": "YulFunctionCall", + "src": "1486:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1474:3:70", + "nodeType": "YulIdentifier", + "src": "1474:3:70" + }, + "nativeSrc": "1474:32:70", + "nodeType": "YulFunctionCall", + "src": "1474:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1447:6:70", + "nodeType": "YulIdentifier", + "src": "1447:6:70" + }, + "nativeSrc": "1447:60:70", + "nodeType": "YulFunctionCall", + "src": "1447:60:70" + }, + "nativeSrc": "1447:60:70", + "nodeType": "YulExpressionStatement", + "src": "1447:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1527:9:70", + "nodeType": "YulIdentifier", + "src": "1527:9:70" + }, + { + "kind": "number", + "nativeSrc": "1538:2:70", + "nodeType": "YulLiteral", + "src": "1538:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1523:3:70", + "nodeType": "YulIdentifier", + "src": "1523:3:70" + }, + "nativeSrc": "1523:18:70", + "nodeType": "YulFunctionCall", + "src": "1523:18:70" + }, + { + "arguments": [ + { + "name": "value3", + "nativeSrc": "1547:6:70", + "nodeType": "YulIdentifier", + "src": "1547:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1563:3:70", + "nodeType": "YulLiteral", + "src": "1563:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1568:1:70", + "nodeType": "YulLiteral", + "src": "1568:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1559:3:70", + "nodeType": "YulIdentifier", + "src": "1559:3:70" + }, + "nativeSrc": "1559:11:70", + "nodeType": "YulFunctionCall", + "src": "1559:11:70" + }, + { + "kind": "number", + "nativeSrc": "1572:1:70", + "nodeType": "YulLiteral", + "src": "1572:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1555:3:70", + "nodeType": "YulIdentifier", + "src": "1555:3:70" + }, + "nativeSrc": "1555:19:70", + "nodeType": "YulFunctionCall", + "src": "1555:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1543:3:70", + "nodeType": "YulIdentifier", + "src": "1543:3:70" + }, + "nativeSrc": "1543:32:70", + "nodeType": "YulFunctionCall", + "src": "1543:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1516:6:70", + "nodeType": "YulIdentifier", + "src": "1516:6:70" + }, + "nativeSrc": "1516:60:70", + "nodeType": "YulFunctionCall", + "src": "1516:60:70" + }, + "nativeSrc": "1516:60:70", + "nodeType": "YulExpressionStatement", + "src": "1516:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1596:9:70", + "nodeType": "YulIdentifier", + "src": "1596:9:70" + }, + { + "kind": "number", + "nativeSrc": "1607:3:70", + "nodeType": "YulLiteral", + "src": "1607:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1592:3:70", + "nodeType": "YulIdentifier", + "src": "1592:3:70" + }, + "nativeSrc": "1592:19:70", + "nodeType": "YulFunctionCall", + "src": "1592:19:70" + }, + { + "arguments": [ + { + "name": "value4", + "nativeSrc": "1617:6:70", + "nodeType": "YulIdentifier", + "src": "1617:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1633:3:70", + "nodeType": "YulLiteral", + "src": "1633:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1638:1:70", + "nodeType": "YulLiteral", + "src": "1638:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1629:3:70", + "nodeType": "YulIdentifier", + "src": "1629:3:70" + }, + "nativeSrc": "1629:11:70", + "nodeType": "YulFunctionCall", + "src": "1629:11:70" + }, + { + "kind": "number", + "nativeSrc": "1642:1:70", + "nodeType": "YulLiteral", + "src": "1642:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1625:3:70", + "nodeType": "YulIdentifier", + "src": "1625:3:70" + }, + "nativeSrc": "1625:19:70", + "nodeType": "YulFunctionCall", + "src": "1625:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1613:3:70", + "nodeType": "YulIdentifier", + "src": "1613:3:70" + }, + "nativeSrc": "1613:32:70", + "nodeType": "YulFunctionCall", + "src": "1613:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1585:6:70", + "nodeType": "YulIdentifier", + "src": "1585:6:70" + }, + "nativeSrc": "1585:61:70", + "nodeType": "YulFunctionCall", + "src": "1585:61:70" + }, + "nativeSrc": "1585:61:70", + "nodeType": "YulExpressionStatement", + "src": "1585:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1666:9:70", + "nodeType": "YulIdentifier", + "src": "1666:9:70" + }, + { + "kind": "number", + "nativeSrc": "1677:3:70", + "nodeType": "YulLiteral", + "src": "1677:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1662:3:70", + "nodeType": "YulIdentifier", + "src": "1662:3:70" + }, + "nativeSrc": "1662:19:70", + "nodeType": "YulFunctionCall", + "src": "1662:19:70" + }, + { + "arguments": [ + { + "name": "value5", + "nativeSrc": "1687:6:70", + "nodeType": "YulIdentifier", + "src": "1687:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1703:3:70", + "nodeType": "YulLiteral", + "src": "1703:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1708:1:70", + "nodeType": "YulLiteral", + "src": "1708:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1699:3:70", + "nodeType": "YulIdentifier", + "src": "1699:3:70" + }, + "nativeSrc": "1699:11:70", + "nodeType": "YulFunctionCall", + "src": "1699:11:70" + }, + { + "kind": "number", + "nativeSrc": "1712:1:70", + "nodeType": "YulLiteral", + "src": "1712:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1695:3:70", + "nodeType": "YulIdentifier", + "src": "1695:3:70" + }, + "nativeSrc": "1695:19:70", + "nodeType": "YulFunctionCall", + "src": "1695:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1683:3:70", + "nodeType": "YulIdentifier", + "src": "1683:3:70" + }, + "nativeSrc": "1683:32:70", + "nodeType": "YulFunctionCall", + "src": "1683:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1655:6:70", + "nodeType": "YulIdentifier", + "src": "1655:6:70" + }, + "nativeSrc": "1655:61:70", + "nodeType": "YulFunctionCall", + "src": "1655:61:70" + }, + "nativeSrc": "1655:61:70", + "nodeType": "YulExpressionStatement", + "src": "1655:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1736:9:70", + "nodeType": "YulIdentifier", + "src": "1736:9:70" + }, + { + "kind": "number", + "nativeSrc": "1747:3:70", + "nodeType": "YulLiteral", + "src": "1747:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1732:3:70", + "nodeType": "YulIdentifier", + "src": "1732:3:70" + }, + "nativeSrc": "1732:19:70", + "nodeType": "YulFunctionCall", + "src": "1732:19:70" + }, + { + "arguments": [ + { + "name": "value6", + "nativeSrc": "1757:6:70", + "nodeType": "YulIdentifier", + "src": "1757:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1773:3:70", + "nodeType": "YulLiteral", + "src": "1773:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1778:1:70", + "nodeType": "YulLiteral", + "src": "1778:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1769:3:70", + "nodeType": "YulIdentifier", + "src": "1769:3:70" + }, + "nativeSrc": "1769:11:70", + "nodeType": "YulFunctionCall", + "src": "1769:11:70" + }, + { + "kind": "number", + "nativeSrc": "1782:1:70", + "nodeType": "YulLiteral", + "src": "1782:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1765:3:70", + "nodeType": "YulIdentifier", + "src": "1765:3:70" + }, + "nativeSrc": "1765:19:70", + "nodeType": "YulFunctionCall", + "src": "1765:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1753:3:70", + "nodeType": "YulIdentifier", + "src": "1753:3:70" + }, + "nativeSrc": "1753:32:70", + "nodeType": "YulFunctionCall", + "src": "1753:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1725:6:70", + "nodeType": "YulIdentifier", + "src": "1725:6:70" + }, + "nativeSrc": "1725:61:70", + "nodeType": "YulFunctionCall", + "src": "1725:61:70" + }, + "nativeSrc": "1725:61:70", + "nodeType": "YulExpressionStatement", + "src": "1725:61:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_address_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address_t_address_t_address_t_address__fromStack_reversed", + "nativeSrc": "1003:789:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1193:9:70", + "nodeType": "YulTypedName", + "src": "1193:9:70", + "type": "" + }, + { + "name": "value6", + "nativeSrc": "1204:6:70", + "nodeType": "YulTypedName", + "src": "1204:6:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "1212:6:70", + "nodeType": "YulTypedName", + "src": "1212:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "1220:6:70", + "nodeType": "YulTypedName", + "src": "1220:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "1228:6:70", + "nodeType": "YulTypedName", + "src": "1228:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "1236:6:70", + "nodeType": "YulTypedName", + "src": "1236:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "1244:6:70", + "nodeType": "YulTypedName", + "src": "1244:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "1252:6:70", + "nodeType": "YulTypedName", + "src": "1252:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "1263:4:70", + "nodeType": "YulTypedName", + "src": "1263:4:70", + "type": "" + } + ], + "src": "1003:789:70" + }, + { + "body": { + "nativeSrc": "1982:310:70", + "nodeType": "YulBlock", + "src": "1982:310:70", + "statements": [ + { + "nativeSrc": "1992:27:70", + "nodeType": "YulAssignment", + "src": "1992:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2004:9:70", + "nodeType": "YulIdentifier", + "src": "2004:9:70" + }, + { + "kind": "number", + "nativeSrc": "2015:3:70", + "nodeType": "YulLiteral", + "src": "2015:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2000:3:70", + "nodeType": "YulIdentifier", + "src": "2000:3:70" + }, + "nativeSrc": "2000:19:70", + "nodeType": "YulFunctionCall", + "src": "2000:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "1992:4:70", + "nodeType": "YulIdentifier", + "src": "1992:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2035:9:70", + "nodeType": "YulIdentifier", + "src": "2035:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "2050:6:70", + "nodeType": "YulIdentifier", + "src": "2050:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2066:3:70", + "nodeType": "YulLiteral", + "src": "2066:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "2071:1:70", + "nodeType": "YulLiteral", + "src": "2071:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2062:3:70", + "nodeType": "YulIdentifier", + "src": "2062:3:70" + }, + "nativeSrc": "2062:11:70", + "nodeType": "YulFunctionCall", + "src": "2062:11:70" + }, + { + "kind": "number", + "nativeSrc": "2075:1:70", + "nodeType": "YulLiteral", + "src": "2075:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2058:3:70", + "nodeType": "YulIdentifier", + "src": "2058:3:70" + }, + "nativeSrc": "2058:19:70", + "nodeType": "YulFunctionCall", + "src": "2058:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2046:3:70", + "nodeType": "YulIdentifier", + "src": "2046:3:70" + }, + "nativeSrc": "2046:32:70", + "nodeType": "YulFunctionCall", + "src": "2046:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2028:6:70", + "nodeType": "YulIdentifier", + "src": "2028:6:70" + }, + "nativeSrc": "2028:51:70", + "nodeType": "YulFunctionCall", + "src": "2028:51:70" + }, + "nativeSrc": "2028:51:70", + "nodeType": "YulExpressionStatement", + "src": "2028:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2099:9:70", + "nodeType": "YulIdentifier", + "src": "2099:9:70" + }, + { + "kind": "number", + "nativeSrc": "2110:2:70", + "nodeType": "YulLiteral", + "src": "2110:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2095:3:70", + "nodeType": "YulIdentifier", + "src": "2095:3:70" + }, + "nativeSrc": "2095:18:70", + "nodeType": "YulFunctionCall", + "src": "2095:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "2119:6:70", + "nodeType": "YulIdentifier", + "src": "2119:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2135:3:70", + "nodeType": "YulLiteral", + "src": "2135:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "2140:1:70", + "nodeType": "YulLiteral", + "src": "2140:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2131:3:70", + "nodeType": "YulIdentifier", + "src": "2131:3:70" + }, + "nativeSrc": "2131:11:70", + "nodeType": "YulFunctionCall", + "src": "2131:11:70" + }, + { + "kind": "number", + "nativeSrc": "2144:1:70", + "nodeType": "YulLiteral", + "src": "2144:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2127:3:70", + "nodeType": "YulIdentifier", + "src": "2127:3:70" + }, + "nativeSrc": "2127:19:70", + "nodeType": "YulFunctionCall", + "src": "2127:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2115:3:70", + "nodeType": "YulIdentifier", + "src": "2115:3:70" + }, + "nativeSrc": "2115:32:70", + "nodeType": "YulFunctionCall", + "src": "2115:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2088:6:70", + "nodeType": "YulIdentifier", + "src": "2088:6:70" + }, + "nativeSrc": "2088:60:70", + "nodeType": "YulFunctionCall", + "src": "2088:60:70" + }, + "nativeSrc": "2088:60:70", + "nodeType": "YulExpressionStatement", + "src": "2088:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2168:9:70", + "nodeType": "YulIdentifier", + "src": "2168:9:70" + }, + { + "kind": "number", + "nativeSrc": "2179:2:70", + "nodeType": "YulLiteral", + "src": "2179:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2164:3:70", + "nodeType": "YulIdentifier", + "src": "2164:3:70" + }, + "nativeSrc": "2164:18:70", + "nodeType": "YulFunctionCall", + "src": "2164:18:70" + }, + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "2188:6:70", + "nodeType": "YulIdentifier", + "src": "2188:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2204:3:70", + "nodeType": "YulLiteral", + "src": "2204:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "2209:1:70", + "nodeType": "YulLiteral", + "src": "2209:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2200:3:70", + "nodeType": "YulIdentifier", + "src": "2200:3:70" + }, + "nativeSrc": "2200:11:70", + "nodeType": "YulFunctionCall", + "src": "2200:11:70" + }, + { + "kind": "number", + "nativeSrc": "2213:1:70", + "nodeType": "YulLiteral", + "src": "2213:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2196:3:70", + "nodeType": "YulIdentifier", + "src": "2196:3:70" + }, + "nativeSrc": "2196:19:70", + "nodeType": "YulFunctionCall", + "src": "2196:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2184:3:70", + "nodeType": "YulIdentifier", + "src": "2184:3:70" + }, + "nativeSrc": "2184:32:70", + "nodeType": "YulFunctionCall", + "src": "2184:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2157:6:70", + "nodeType": "YulIdentifier", + "src": "2157:6:70" + }, + "nativeSrc": "2157:60:70", + "nodeType": "YulFunctionCall", + "src": "2157:60:70" + }, + "nativeSrc": "2157:60:70", + "nodeType": "YulExpressionStatement", + "src": "2157:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2237:9:70", + "nodeType": "YulIdentifier", + "src": "2237:9:70" + }, + { + "kind": "number", + "nativeSrc": "2248:2:70", + "nodeType": "YulLiteral", + "src": "2248:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2233:3:70", + "nodeType": "YulIdentifier", + "src": "2233:3:70" + }, + "nativeSrc": "2233:18:70", + "nodeType": "YulFunctionCall", + "src": "2233:18:70" + }, + { + "arguments": [ + { + "name": "value3", + "nativeSrc": "2257:6:70", + "nodeType": "YulIdentifier", + "src": "2257:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2273:3:70", + "nodeType": "YulLiteral", + "src": "2273:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "2278:1:70", + "nodeType": "YulLiteral", + "src": "2278:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2269:3:70", + "nodeType": "YulIdentifier", + "src": "2269:3:70" + }, + "nativeSrc": "2269:11:70", + "nodeType": "YulFunctionCall", + "src": "2269:11:70" + }, + { + "kind": "number", + "nativeSrc": "2282:1:70", + "nodeType": "YulLiteral", + "src": "2282:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2265:3:70", + "nodeType": "YulIdentifier", + "src": "2265:3:70" + }, + "nativeSrc": "2265:19:70", + "nodeType": "YulFunctionCall", + "src": "2265:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2253:3:70", + "nodeType": "YulIdentifier", + "src": "2253:3:70" + }, + "nativeSrc": "2253:32:70", + "nodeType": "YulFunctionCall", + "src": "2253:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2226:6:70", + "nodeType": "YulIdentifier", + "src": "2226:6:70" + }, + "nativeSrc": "2226:60:70", + "nodeType": "YulFunctionCall", + "src": "2226:60:70" + }, + "nativeSrc": "2226:60:70", + "nodeType": "YulExpressionStatement", + "src": "2226:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address__fromStack_reversed", + "nativeSrc": "1797:495:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1927:9:70", + "nodeType": "YulTypedName", + "src": "1927:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "1938:6:70", + "nodeType": "YulTypedName", + "src": "1938:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "1946:6:70", + "nodeType": "YulTypedName", + "src": "1946:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "1954:6:70", + "nodeType": "YulTypedName", + "src": "1954:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "1962:6:70", + "nodeType": "YulTypedName", + "src": "1962:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "1973:4:70", + "nodeType": "YulTypedName", + "src": "1973:4:70", + "type": "" + } + ], + "src": "1797:495:70" + }, + { + "body": { + "nativeSrc": "2398:76:70", + "nodeType": "YulBlock", + "src": "2398:76:70", + "statements": [ + { + "nativeSrc": "2408:26:70", + "nodeType": "YulAssignment", + "src": "2408:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2420:9:70", + "nodeType": "YulIdentifier", + "src": "2420:9:70" + }, + { + "kind": "number", + "nativeSrc": "2431:2:70", + "nodeType": "YulLiteral", + "src": "2431:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2416:3:70", + "nodeType": "YulIdentifier", + "src": "2416:3:70" + }, + "nativeSrc": "2416:18:70", + "nodeType": "YulFunctionCall", + "src": "2416:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "2408:4:70", + "nodeType": "YulIdentifier", + "src": "2408:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2450:9:70", + "nodeType": "YulIdentifier", + "src": "2450:9:70" + }, + { + "name": "value0", + "nativeSrc": "2461:6:70", + "nodeType": "YulIdentifier", + "src": "2461:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2443:6:70", + "nodeType": "YulIdentifier", + "src": "2443:6:70" + }, + "nativeSrc": "2443:25:70", + "nodeType": "YulFunctionCall", + "src": "2443:25:70" + }, + "nativeSrc": "2443:25:70", + "nodeType": "YulExpressionStatement", + "src": "2443:25:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nativeSrc": "2297:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2367:9:70", + "nodeType": "YulTypedName", + "src": "2367:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "2378:6:70", + "nodeType": "YulTypedName", + "src": "2378:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "2389:4:70", + "nodeType": "YulTypedName", + "src": "2389:4:70", + "type": "" + } + ], + "src": "2297:177:70" + }, + { + "body": { + "nativeSrc": "2560:127:70", + "nodeType": "YulBlock", + "src": "2560:127:70", + "statements": [ + { + "body": { + "nativeSrc": "2606:16:70", + "nodeType": "YulBlock", + "src": "2606:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2615:1:70", + "nodeType": "YulLiteral", + "src": "2615:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "2618:1:70", + "nodeType": "YulLiteral", + "src": "2618:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "2608:6:70", + "nodeType": "YulIdentifier", + "src": "2608:6:70" + }, + "nativeSrc": "2608:12:70", + "nodeType": "YulFunctionCall", + "src": "2608:12:70" + }, + "nativeSrc": "2608:12:70", + "nodeType": "YulExpressionStatement", + "src": "2608:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "2581:7:70", + "nodeType": "YulIdentifier", + "src": "2581:7:70" + }, + { + "name": "headStart", + "nativeSrc": "2590:9:70", + "nodeType": "YulIdentifier", + "src": "2590:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2577:3:70", + "nodeType": "YulIdentifier", + "src": "2577:3:70" + }, + "nativeSrc": "2577:23:70", + "nodeType": "YulFunctionCall", + "src": "2577:23:70" + }, + { + "kind": "number", + "nativeSrc": "2602:2:70", + "nodeType": "YulLiteral", + "src": "2602:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "2573:3:70", + "nodeType": "YulIdentifier", + "src": "2573:3:70" + }, + "nativeSrc": "2573:32:70", + "nodeType": "YulFunctionCall", + "src": "2573:32:70" + }, + "nativeSrc": "2570:52:70", + "nodeType": "YulIf", + "src": "2570:52:70" + }, + { + "nativeSrc": "2631:50:70", + "nodeType": "YulAssignment", + "src": "2631:50:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2671:9:70", + "nodeType": "YulIdentifier", + "src": "2671:9:70" + } + ], + "functionName": { + "name": "abi_decode_address_fromMemory", + "nativeSrc": "2641:29:70", + "nodeType": "YulIdentifier", + "src": "2641:29:70" + }, + "nativeSrc": "2641:40:70", + "nodeType": "YulFunctionCall", + "src": "2641:40:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "2631:6:70", + "nodeType": "YulIdentifier", + "src": "2631:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address_fromMemory", + "nativeSrc": "2479:208:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2526:9:70", + "nodeType": "YulTypedName", + "src": "2526:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "2537:7:70", + "nodeType": "YulTypedName", + "src": "2537:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "2549:6:70", + "nodeType": "YulTypedName", + "src": "2549:6:70", + "type": "" + } + ], + "src": "2479:208:70" + }, + { + "body": { + "nativeSrc": "2811:406:70", + "nodeType": "YulBlock", + "src": "2811:406:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2828:9:70", + "nodeType": "YulIdentifier", + "src": "2828:9:70" + }, + { + "kind": "number", + "nativeSrc": "2839:2:70", + "nodeType": "YulLiteral", + "src": "2839:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2821:6:70", + "nodeType": "YulIdentifier", + "src": "2821:6:70" + }, + "nativeSrc": "2821:21:70", + "nodeType": "YulFunctionCall", + "src": "2821:21:70" + }, + "nativeSrc": "2821:21:70", + "nodeType": "YulExpressionStatement", + "src": "2821:21:70" + }, + { + "nativeSrc": "2851:27:70", + "nodeType": "YulVariableDeclaration", + "src": "2851:27:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "2871:6:70", + "nodeType": "YulIdentifier", + "src": "2871:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "2865:5:70", + "nodeType": "YulIdentifier", + "src": "2865:5:70" + }, + "nativeSrc": "2865:13:70", + "nodeType": "YulFunctionCall", + "src": "2865:13:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "2855:6:70", + "nodeType": "YulTypedName", + "src": "2855:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2898:9:70", + "nodeType": "YulIdentifier", + "src": "2898:9:70" + }, + { + "kind": "number", + "nativeSrc": "2909:2:70", + "nodeType": "YulLiteral", + "src": "2909:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2894:3:70", + "nodeType": "YulIdentifier", + "src": "2894:3:70" + }, + "nativeSrc": "2894:18:70", + "nodeType": "YulFunctionCall", + "src": "2894:18:70" + }, + { + "name": "length", + "nativeSrc": "2914:6:70", + "nodeType": "YulIdentifier", + "src": "2914:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2887:6:70", + "nodeType": "YulIdentifier", + "src": "2887:6:70" + }, + "nativeSrc": "2887:34:70", + "nodeType": "YulFunctionCall", + "src": "2887:34:70" + }, + "nativeSrc": "2887:34:70", + "nodeType": "YulExpressionStatement", + "src": "2887:34:70" + }, + { + "nativeSrc": "2930:10:70", + "nodeType": "YulVariableDeclaration", + "src": "2930:10:70", + "value": { + "kind": "number", + "nativeSrc": "2939:1:70", + "nodeType": "YulLiteral", + "src": "2939:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "2934:1:70", + "nodeType": "YulTypedName", + "src": "2934:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "2999:90:70", + "nodeType": "YulBlock", + "src": "2999:90:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3028:9:70", + "nodeType": "YulIdentifier", + "src": "3028:9:70" + }, + { + "name": "i", + "nativeSrc": "3039:1:70", + "nodeType": "YulIdentifier", + "src": "3039:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3024:3:70", + "nodeType": "YulIdentifier", + "src": "3024:3:70" + }, + "nativeSrc": "3024:17:70", + "nodeType": "YulFunctionCall", + "src": "3024:17:70" + }, + { + "kind": "number", + "nativeSrc": "3043:2:70", + "nodeType": "YulLiteral", + "src": "3043:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3020:3:70", + "nodeType": "YulIdentifier", + "src": "3020:3:70" + }, + "nativeSrc": "3020:26:70", + "nodeType": "YulFunctionCall", + "src": "3020:26:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "3062:6:70", + "nodeType": "YulIdentifier", + "src": "3062:6:70" + }, + { + "name": "i", + "nativeSrc": "3070:1:70", + "nodeType": "YulIdentifier", + "src": "3070:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3058:3:70", + "nodeType": "YulIdentifier", + "src": "3058:3:70" + }, + "nativeSrc": "3058:14:70", + "nodeType": "YulFunctionCall", + "src": "3058:14:70" + }, + { + "kind": "number", + "nativeSrc": "3074:2:70", + "nodeType": "YulLiteral", + "src": "3074:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3054:3:70", + "nodeType": "YulIdentifier", + "src": "3054:3:70" + }, + "nativeSrc": "3054:23:70", + "nodeType": "YulFunctionCall", + "src": "3054:23:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "3048:5:70", + "nodeType": "YulIdentifier", + "src": "3048:5:70" + }, + "nativeSrc": "3048:30:70", + "nodeType": "YulFunctionCall", + "src": "3048:30:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3013:6:70", + "nodeType": "YulIdentifier", + "src": "3013:6:70" + }, + "nativeSrc": "3013:66:70", + "nodeType": "YulFunctionCall", + "src": "3013:66:70" + }, + "nativeSrc": "3013:66:70", + "nodeType": "YulExpressionStatement", + "src": "3013:66:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "2960:1:70", + "nodeType": "YulIdentifier", + "src": "2960:1:70" + }, + { + "name": "length", + "nativeSrc": "2963:6:70", + "nodeType": "YulIdentifier", + "src": "2963:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "2957:2:70", + "nodeType": "YulIdentifier", + "src": "2957:2:70" + }, + "nativeSrc": "2957:13:70", + "nodeType": "YulFunctionCall", + "src": "2957:13:70" + }, + "nativeSrc": "2949:140:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "2971:19:70", + "nodeType": "YulBlock", + "src": "2971:19:70", + "statements": [ + { + "nativeSrc": "2973:15:70", + "nodeType": "YulAssignment", + "src": "2973:15:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "2982:1:70", + "nodeType": "YulIdentifier", + "src": "2982:1:70" + }, + { + "kind": "number", + "nativeSrc": "2985:2:70", + "nodeType": "YulLiteral", + "src": "2985:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2978:3:70", + "nodeType": "YulIdentifier", + "src": "2978:3:70" + }, + "nativeSrc": "2978:10:70", + "nodeType": "YulFunctionCall", + "src": "2978:10:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "2973:1:70", + "nodeType": "YulIdentifier", + "src": "2973:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "2953:3:70", + "nodeType": "YulBlock", + "src": "2953:3:70", + "statements": [] + }, + "src": "2949:140:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3113:9:70", + "nodeType": "YulIdentifier", + "src": "3113:9:70" + }, + { + "name": "length", + "nativeSrc": "3124:6:70", + "nodeType": "YulIdentifier", + "src": "3124:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3109:3:70", + "nodeType": "YulIdentifier", + "src": "3109:3:70" + }, + "nativeSrc": "3109:22:70", + "nodeType": "YulFunctionCall", + "src": "3109:22:70" + }, + { + "kind": "number", + "nativeSrc": "3133:2:70", + "nodeType": "YulLiteral", + "src": "3133:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3105:3:70", + "nodeType": "YulIdentifier", + "src": "3105:3:70" + }, + "nativeSrc": "3105:31:70", + "nodeType": "YulFunctionCall", + "src": "3105:31:70" + }, + { + "kind": "number", + "nativeSrc": "3138:1:70", + "nodeType": "YulLiteral", + "src": "3138:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3098:6:70", + "nodeType": "YulIdentifier", + "src": "3098:6:70" + }, + "nativeSrc": "3098:42:70", + "nodeType": "YulFunctionCall", + "src": "3098:42:70" + }, + "nativeSrc": "3098:42:70", + "nodeType": "YulExpressionStatement", + "src": "3098:42:70" + }, + { + "nativeSrc": "3149:62:70", + "nodeType": "YulAssignment", + "src": "3149:62:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3165:9:70", + "nodeType": "YulIdentifier", + "src": "3165:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nativeSrc": "3184:6:70", + "nodeType": "YulIdentifier", + "src": "3184:6:70" + }, + { + "kind": "number", + "nativeSrc": "3192:2:70", + "nodeType": "YulLiteral", + "src": "3192:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3180:3:70", + "nodeType": "YulIdentifier", + "src": "3180:3:70" + }, + "nativeSrc": "3180:15:70", + "nodeType": "YulFunctionCall", + "src": "3180:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3201:2:70", + "nodeType": "YulLiteral", + "src": "3201:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "3197:3:70", + "nodeType": "YulIdentifier", + "src": "3197:3:70" + }, + "nativeSrc": "3197:7:70", + "nodeType": "YulFunctionCall", + "src": "3197:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "3176:3:70", + "nodeType": "YulIdentifier", + "src": "3176:3:70" + }, + "nativeSrc": "3176:29:70", + "nodeType": "YulFunctionCall", + "src": "3176:29:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3161:3:70", + "nodeType": "YulIdentifier", + "src": "3161:3:70" + }, + "nativeSrc": "3161:45:70", + "nodeType": "YulFunctionCall", + "src": "3161:45:70" + }, + { + "kind": "number", + "nativeSrc": "3208:2:70", + "nodeType": "YulLiteral", + "src": "3208:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3157:3:70", + "nodeType": "YulIdentifier", + "src": "3157:3:70" + }, + "nativeSrc": "3157:54:70", + "nodeType": "YulFunctionCall", + "src": "3157:54:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "3149:4:70", + "nodeType": "YulIdentifier", + "src": "3149:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nativeSrc": "2692:525:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2780:9:70", + "nodeType": "YulTypedName", + "src": "2780:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "2791:6:70", + "nodeType": "YulTypedName", + "src": "2791:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "2802:4:70", + "nodeType": "YulTypedName", + "src": "2802:4:70", + "type": "" + } + ], + "src": "2692:525:70" + }, + { + "body": { + "nativeSrc": "3321:101:70", + "nodeType": "YulBlock", + "src": "3321:101:70", + "statements": [ + { + "nativeSrc": "3331:26:70", + "nodeType": "YulAssignment", + "src": "3331:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3343:9:70", + "nodeType": "YulIdentifier", + "src": "3343:9:70" + }, + { + "kind": "number", + "nativeSrc": "3354:2:70", + "nodeType": "YulLiteral", + "src": "3354:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3339:3:70", + "nodeType": "YulIdentifier", + "src": "3339:3:70" + }, + "nativeSrc": "3339:18:70", + "nodeType": "YulFunctionCall", + "src": "3339:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "3331:4:70", + "nodeType": "YulIdentifier", + "src": "3331:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3373:9:70", + "nodeType": "YulIdentifier", + "src": "3373:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "3388:6:70", + "nodeType": "YulIdentifier", + "src": "3388:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3404:2:70", + "nodeType": "YulLiteral", + "src": "3404:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "3408:1:70", + "nodeType": "YulLiteral", + "src": "3408:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "3400:3:70", + "nodeType": "YulIdentifier", + "src": "3400:3:70" + }, + "nativeSrc": "3400:10:70", + "nodeType": "YulFunctionCall", + "src": "3400:10:70" + }, + { + "kind": "number", + "nativeSrc": "3412:1:70", + "nodeType": "YulLiteral", + "src": "3412:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "3396:3:70", + "nodeType": "YulIdentifier", + "src": "3396:3:70" + }, + "nativeSrc": "3396:18:70", + "nodeType": "YulFunctionCall", + "src": "3396:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "3384:3:70", + "nodeType": "YulIdentifier", + "src": "3384:3:70" + }, + "nativeSrc": "3384:31:70", + "nodeType": "YulFunctionCall", + "src": "3384:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "3366:6:70", + "nodeType": "YulIdentifier", + "src": "3366:6:70" + }, + "nativeSrc": "3366:50:70", + "nodeType": "YulFunctionCall", + "src": "3366:50:70" + }, + "nativeSrc": "3366:50:70", + "nodeType": "YulExpressionStatement", + "src": "3366:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed", + "nativeSrc": "3222:200:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "3290:9:70", + "nodeType": "YulTypedName", + "src": "3290:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "3301:6:70", + "nodeType": "YulTypedName", + "src": "3301:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "3312:4:70", + "nodeType": "YulTypedName", + "src": "3312:4:70", + "type": "" + } + ], + "src": "3222:200:70" + } + ] + }, + "contents": "{\n { }\n function abi_decode_address_fromMemory(offset) -> value\n {\n value := mload(offset)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_addresst_addresst_address_fromMemory(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n value0 := abi_decode_address_fromMemory(headStart)\n value1 := abi_decode_address_fromMemory(add(headStart, 32))\n value2 := abi_decode_address_fromMemory(add(headStart, 64))\n value3 := abi_decode_address_fromMemory(add(headStart, 96))\n }\n function abi_encode_tuple_t_stringliteral_7c20e2bbcd91c5aaa7898ba022ab8867ac32d84e959c236484db066900aa363a__to_t_bytes_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 10)\n mstore(add(headStart, 64), \"Controller\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_address_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address_t_address_t_address_t_address__fromStack_reversed(headStart, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 224)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), and(value2, sub(shl(160, 1), 1)))\n mstore(add(headStart, 96), and(value3, sub(shl(160, 1), 1)))\n mstore(add(headStart, 128), and(value4, sub(shl(160, 1), 1)))\n mstore(add(headStart, 160), and(value5, sub(shl(160, 1), 1)))\n mstore(add(headStart, 192), and(value6, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_address_t_address_t_address_t_address__to_t_address_t_address_t_address_t_address__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), and(value2, sub(shl(160, 1), 1)))\n mstore(add(headStart, 96), and(value3, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address_fromMemory(headStart)\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n let length := mload(value0)\n mstore(add(headStart, 32), length)\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), 32)))\n }\n mstore(add(add(headStart, length), 64), 0)\n tail := add(add(headStart, and(add(length, 31), not(31))), 64)\n }\n function abi_encode_tuple_t_uint64__to_t_uint64__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n }\n}", + "id": 70, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "61024060405234801561001157600080fd5b5060405161667738038061667783398101604081905261003091610541565b3083838387806001600160a01b03811661007f5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b7906103c5565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100ea906103c5565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b6020820152610123906103c5565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015d906103c5565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b6020820152610195906103c5565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101d0906103c5565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020e906103c5565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024a906103c5565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027f906103c5565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103299790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b038481166101c08190528482166101e08190528483166102008190529284166102208190526040805193845260208401929092529082019290925260608101919091527f4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda79060800160405180910390a1505050506103bc61047360201b60201c565b50505050610605565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161040091815260200190565b602060405180830381865afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104419190610595565b9050826001600160a01b03821661046c5760405163218f5add60e11b815260040161007691906105b7565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104c35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146105225780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b038116811461053c57600080fd5b919050565b6000806000806080858703121561055757600080fd5b61056085610525565b935061056e60208601610525565b925061057c60408601610525565b915061058a60608601610525565b905092959194509250565b6000602082840312156105a757600080fd5b6105b082610525565b9392505050565b602081526000825180602084015260005b818110156105e557602081860181015160408684010152016105c8565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051615fd961069e6000396000612ee2015260006132de01526000818161163b0152612fe101526000505060005050600050506000505060006137080152600061457c01526000505060005050600050506000611b6b01526000613a640152615fd96000f3fe608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "opcodes": "PUSH2 0x240 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x6677 CODESIZE SUB DUP1 PUSH2 0x6677 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x30 SWAP2 PUSH2 0x541 JUMP JUMPDEST ADDRESS DUP4 DUP4 DUP4 DUP8 DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x7F JUMPI PUSH1 0x40 MLOAD PUSH4 0x218F5ADD PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xA PUSH1 0x24 DUP3 ADD MSTORE PUSH10 0x21B7B73A3937B63632B9 PUSH1 0xB1 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x100 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xA DUP2 MSTORE PUSH10 0x23B930B8342A37B5B2B7 PUSH1 0xB1 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xB7 SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x7 DUP2 MSTORE PUSH7 0x5374616B696E67 PUSH1 0xC8 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xEA SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xA0 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD DUP2 MSTORE PUSH13 0x47726170685061796D656E7473 PUSH1 0x98 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x123 SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xC0 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH14 0x5061796D656E7473457363726F77 PUSH1 0x90 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x15D SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0xE0 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xC DUP2 MSTORE PUSH12 0x22B837B1B426B0B730B3B2B9 PUSH1 0xA1 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x195 SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x120 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH14 0x2932BBB0B93239A6B0B730B3B2B9 PUSH1 0x91 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1D0 SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x140 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH17 0x4772617068546F6B656E47617465776179 PUSH1 0x78 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x20E SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x160 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH15 0x23B930B834283937BC3CA0B236B4B7 PUSH1 0x89 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x24A SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x180 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x8 DUP2 MSTORE PUSH8 0x21BAB930BA34B7B7 PUSH1 0xC1 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x27F SWAP1 PUSH2 0x3C5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH2 0x1A0 DUP2 SWAP1 MSTORE PUSH2 0x100 MLOAD PUSH1 0xA0 MLOAD PUSH1 0x80 MLOAD PUSH1 0xC0 MLOAD PUSH1 0xE0 MLOAD PUSH2 0x120 MLOAD PUSH2 0x140 MLOAD PUSH2 0x160 MLOAD PUSH2 0x180 MLOAD PUSH1 0x40 MLOAD SWAP9 DUP12 AND SWAP11 SWAP8 DUP9 AND SWAP10 SWAP7 SWAP1 SWAP8 AND SWAP8 PUSH32 0xEF5021414834D86E36470F5C1CECF6544FB2BB723F2CA51A4C86FCD8C5919A43 SWAP8 PUSH2 0x329 SWAP8 SWAP1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 DUP8 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP7 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 DUP6 AND PUSH1 0x60 DUP6 ADD MSTORE DUP5 AND PUSH1 0x80 DUP5 ADD MSTORE DUP4 AND PUSH1 0xA0 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH2 0x1C0 DUP2 SWAP1 MSTORE DUP5 DUP3 AND PUSH2 0x1E0 DUP2 SWAP1 MSTORE DUP5 DUP4 AND PUSH2 0x200 DUP2 SWAP1 MSTORE SWAP3 DUP5 AND PUSH2 0x220 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x4175B2C37456DBAC494E08DE8666D31BB8F3F2AEE36EA5D9E06894FF3E4DDDA7 SWAP1 PUSH1 0x80 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP PUSH2 0x3BC PUSH2 0x473 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP POP POP POP PUSH2 0x605 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x100 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7641A5E DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x400 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x41D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x441 SWAP2 SWAP1 PUSH2 0x595 JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x46C JUMPI PUSH1 0x40 MLOAD PUSH4 0x218F5ADD PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x76 SWAP2 SWAP1 PUSH2 0x5B7 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0xF0C57E16840DF040F15088DC2F81FE391C3923BEC73E23A9662EFC9C229C6A00 DUP1 SLOAD PUSH9 0x10000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x4C3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND EQ PUSH2 0x522 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0xC7F505B2F371AE2175EE4913F4499E1F2633A7B5936321EED1CDAEB6115181D2 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x53C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x557 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x560 DUP6 PUSH2 0x525 JUMP JUMPDEST SWAP4 POP PUSH2 0x56E PUSH1 0x20 DUP7 ADD PUSH2 0x525 JUMP JUMPDEST SWAP3 POP PUSH2 0x57C PUSH1 0x40 DUP7 ADD PUSH2 0x525 JUMP JUMPDEST SWAP2 POP PUSH2 0x58A PUSH1 0x60 DUP7 ADD PUSH2 0x525 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5B0 DUP3 PUSH2 0x525 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5E5 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD PUSH1 0x40 DUP7 DUP5 ADD ADD MSTORE ADD PUSH2 0x5C8 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x40 DUP3 DUP6 ADD ADD MSTORE PUSH1 0x40 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND DUP5 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0xE0 MLOAD PUSH2 0x100 MLOAD PUSH2 0x120 MLOAD PUSH2 0x140 MLOAD PUSH2 0x160 MLOAD PUSH2 0x180 MLOAD PUSH2 0x1A0 MLOAD PUSH2 0x1C0 MLOAD PUSH2 0x1E0 MLOAD PUSH2 0x200 MLOAD PUSH2 0x220 MLOAD PUSH2 0x5FD9 PUSH2 0x69E PUSH1 0x0 CODECOPY PUSH1 0x0 PUSH2 0x2EE2 ADD MSTORE PUSH1 0x0 PUSH2 0x32DE ADD MSTORE PUSH1 0x0 DUP2 DUP2 PUSH2 0x163B ADD MSTORE PUSH2 0x2FE1 ADD MSTORE PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 PUSH2 0x3708 ADD MSTORE PUSH1 0x0 PUSH2 0x457C ADD MSTORE PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 POP POP PUSH1 0x0 PUSH2 0x1B6B ADD MSTORE PUSH1 0x0 PUSH2 0x3A64 ADD MSTORE PUSH2 0x5FD9 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x23B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7E736D8 EQ PUSH2 0x240 JUMPI DUP1 PUSH4 0xE022923 EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x138DEA08 EQ PUSH2 0x308 JUMPI DUP1 PUSH4 0x13C474C9 EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0x1DD42F60 EQ PUSH2 0x375 JUMPI DUP1 PUSH4 0x1EBB7C30 EQ PUSH2 0x38A JUMPI DUP1 PUSH4 0x24B8FBF6 EQ PUSH2 0x3AF JUMPI DUP1 PUSH4 0x35577962 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x3D5 JUMPI DUP1 PUSH4 0x45F54485 EQ PUSH2 0x3DD JUMPI DUP1 PUSH4 0x482468B7 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0x4F793CDC EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x55C85269 EQ PUSH2 0x428 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0x6234E216 EQ PUSH2 0x48A JUMPI DUP1 PUSH4 0x6CCEC5B8 EQ PUSH2 0x4AA JUMPI DUP1 PUSH4 0x6D9A3951 EQ PUSH2 0x4BD JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x538 JUMPI DUP1 PUSH4 0x71CE020A EQ PUSH2 0x540 JUMPI DUP1 PUSH4 0x7AA31BCE EQ PUSH2 0x556 JUMPI DUP1 PUSH4 0x7DFE6D28 EQ PUSH2 0x569 JUMPI DUP1 PUSH4 0x7E89BAC3 EQ PUSH2 0x57C JUMPI DUP1 PUSH4 0x8180083B EQ PUSH2 0x58F JUMPI DUP1 PUSH4 0x819BA366 EQ PUSH2 0x5A2 JUMPI DUP1 PUSH4 0x81E777A7 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x832BC923 EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x5DE JUMPI DUP1 PUSH4 0x84B0196E EQ PUSH2 0x5E6 JUMPI DUP1 PUSH4 0x85E82BAF EQ PUSH2 0x601 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x60A JUMPI DUP1 PUSH4 0x9384E078 EQ PUSH2 0x612 JUMPI DUP1 PUSH4 0xAC9650D8 EQ PUSH2 0x635 JUMPI DUP1 PUSH4 0xB15D2A2C EQ PUSH2 0x655 JUMPI DUP1 PUSH4 0xBA38F67D EQ PUSH2 0x668 JUMPI DUP1 PUSH4 0xC0F47497 EQ PUSH2 0x67B JUMPI DUP1 PUSH4 0xC84A5EF3 EQ PUSH2 0x683 JUMPI DUP1 PUSH4 0xCB8347FE EQ PUSH2 0x696 JUMPI DUP1 PUSH4 0xCBE5F3F2 EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0xCE0FC0CC EQ PUSH2 0x6C9 JUMPI DUP1 PUSH4 0xCE56C98B EQ PUSH2 0x6DC JUMPI DUP1 PUSH4 0xD07A7A84 EQ PUSH2 0x6EF JUMPI DUP1 PUSH4 0xDB9BEE46 EQ PUSH2 0x6F9 JUMPI DUP1 PUSH4 0xDEDF6726 EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xE2E1E8E9 EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0xE6F50054 EQ PUSH2 0x734 JUMPI DUP1 PUSH4 0xEBF6DDAF EQ PUSH2 0x747 JUMPI DUP1 PUSH4 0xEC9C218D EQ PUSH2 0x74F JUMPI DUP1 PUSH4 0xEFF0F592 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x797 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26A PUSH2 0x24E CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x109 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x293 PUSH2 0x28E CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x7AA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP2 SWAP1 PUSH1 0x0 PUSH2 0x120 DUP3 ADD SWAP1 POP PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP4 MLOAD AND DUP3 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x100 DUP4 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x312 PUSH2 0x108 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x355 PUSH2 0x32E CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x9C PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP2 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x383 CALLDATASIZE PUSH1 0x4 PUSH2 0x506E JUMP JUMPDEST PUSH2 0x837 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x3BD CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x3D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x512E JUMP JUMPDEST PUSH2 0xA7D JUMP JUMPDEST PUSH2 0x388 PUSH2 0xA93 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0xACF JUMP JUMPDEST PUSH2 0x3F8 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP3 SWAP2 SWAP1 PUSH2 0x5180 JUMP JUMPDEST PUSH2 0x419 PUSH2 0x414 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0xAEC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x51E7 JUMP JUMPDEST PUSH2 0x43B PUSH2 0x436 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0xC20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP7 ISZERO ISZERO DUP8 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x47A PUSH2 0xCDC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x498 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0xD1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x4B8 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0xCF1 JUMP JUMPDEST PUSH2 0x514 PUSH2 0x4CB CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0xD0 DUP3 MSTORE DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD SWAP1 SWAP4 AND DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD MLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0xCFB JUMP JUMPDEST PUSH2 0x548 PUSH2 0xD0D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP3 SWAP2 SWAP1 PUSH2 0x521C JUMP JUMPDEST PUSH2 0x388 PUSH2 0x564 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0xD18 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x577 CALLDATASIZE PUSH1 0x4 PUSH2 0x5236 JUMP JUMPDEST PUSH2 0xD29 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x58A CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0xD41 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x59D CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0xDB6 JUMP JUMPDEST PUSH2 0x5AA PUSH2 0xF44 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x5236 JUMP JUMPDEST PUSH2 0xF54 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x5D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0x10C4 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x10D8 JUMP JUMPDEST PUSH2 0x5EE PUSH2 0x1112 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5285 JUMP JUMPDEST PUSH2 0x312 PUSH1 0xD2 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x26A PUSH2 0x11BB JUMP JUMPDEST PUSH2 0x47A PUSH2 0x620 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x648 PUSH2 0x643 CALLDATASIZE PUSH1 0x4 PUSH2 0x531D JUMP JUMPDEST PUSH2 0x11D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP2 SWAP1 PUSH2 0x5392 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x663 CALLDATASIZE PUSH1 0x4 PUSH2 0x53F7 JUMP JUMPDEST PUSH2 0x12BE JUMP JUMPDEST PUSH2 0x47A PUSH2 0x676 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x1492 JUMP JUMPDEST PUSH2 0x26A PUSH2 0x14B0 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x691 CALLDATASIZE PUSH1 0x4 PUSH2 0x545F JUMP JUMPDEST PUSH2 0x14BA JUMP JUMPDEST PUSH2 0x388 PUSH2 0x6A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x1638 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x6B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x9A PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x6D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x1777 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x6EA CALLDATASIZE PUSH1 0x4 PUSH2 0x54A7 JUMP JUMPDEST PUSH2 0x1860 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x107 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x26A PUSH2 0x1873 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x70F CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x187D JUMP JUMPDEST PUSH2 0x312 PUSH2 0x722 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xD3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x742 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0x1A0B JUMP JUMPDEST PUSH2 0x26A PUSH2 0x1A1C JUMP JUMPDEST PUSH2 0x388 PUSH2 0x75D CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x1A26 JUMP JUMPDEST PUSH2 0x355 PUSH2 0x770 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP5 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x7A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x1AA8 JUMP JUMPDEST PUSH2 0x7B2 PUSH2 0x4FAE JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH2 0x120 DUP2 ADD DUP5 MSTORE DUP2 SLOAD SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x2 DUP2 ADD SLOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH1 0x8 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x83F PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x1B15 JUMP JUMPDEST POP JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST DUP3 PUSH2 0x859 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x888 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C9 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x8F5 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP DUP4 PUSH1 0x0 PUSH2 0x903 DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x90E DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x919 DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH2 0x921 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x931 DUP8 DUP10 ADD DUP10 PUSH2 0x5646 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP4 MLOAD GT PUSH2 0x959 JUMPI PUSH1 0x40 MLOAD PUSH4 0x7838439 PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD GT PUSH2 0x97B JUMPI PUSH1 0x40 MLOAD PUSH4 0x1E63BD95 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO PUSH2 0x9B3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xD06866D PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE TIMESTAMP DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP7 DUP2 MSTORE DUP3 DUP5 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 SWAP1 SWAP3 MSTORE SWAP3 SWAP1 KECCAK256 DUP2 MLOAD DUP2 SSTORE SWAP2 MLOAD SWAP1 SWAP2 SWAP1 PUSH1 0x1 DUP3 ADD SWAP1 PUSH2 0x9FE SWAP1 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH1 0x2 DUP3 ADD SWAP1 PUSH2 0xA13 SWAP1 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0xA2F JUMPI PUSH2 0xA2F DUP10 DUP3 PUSH2 0x1DDE JUMP JUMPDEST DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x159567BEA25499A91F60E1FBB349FF2A1F8C1B2883198F25C1E12C99EDDB44FA DUP10 DUP10 PUSH1 0x40 MLOAD PUSH2 0xA6A SWAP3 SWAP2 SWAP1 PUSH2 0x5800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xA85 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xA8F DUP3 DUP3 PUSH2 0x1E35 JUMP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xAC4 JUMPI PUSH1 0x40 MLOAD PUSH4 0x72E3EF97 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xACD PUSH2 0x1EEB JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x848 CALLER DUP3 PUSH2 0x1F37 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xAE4 PUSH2 0x1FDD JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD DUP1 SLOAD SWAP2 SWAP3 SWAP2 PUSH2 0xB0F SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xB3B SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB88 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH2 0xB9D SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xBC9 SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC16 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBEB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC16 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBF9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH2 0x120 DUP2 ADD DUP4 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH1 0x8 ADD SLOAD PUSH2 0x100 DUP4 ADD MSTORE SWAP1 DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH2 0xCB1 DUP2 PUSH2 0x2054 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0xC0 DUP6 ADD MLOAD PUSH1 0xE0 SWAP1 SWAP6 ADD MLOAD SWAP4 SWAP13 SWAP3 SWAP12 POP SWAP1 SWAP10 POP SWAP8 POP SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xCE7 PUSH2 0x2073 JUMP JUMPDEST SLOAD PUSH1 0xFF AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x848 CALLER DUP3 PUSH2 0x1DDE JUMP JUMPDEST PUSH2 0xD03 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xACD PUSH1 0x0 PUSH2 0x2097 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xAE4 PUSH2 0x20F3 JUMP JUMPDEST PUSH2 0xD20 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x216A JUMP JUMPDEST PUSH2 0xD31 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xD3C DUP4 DUP4 DUP4 PUSH2 0x219F JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD49 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xD56 DUP2 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0xD78 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1C9C717B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x108 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x6DEEF78FFE3DF79AE5CD8E40B842C36AC6077E13746B9B68A9F327537B01E4E9 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST DUP3 PUSH2 0xDBF PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xDEE SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xE0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE2F SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0xE52 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP1 DUP2 SWAP1 PUSH2 0xE90 JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xE99 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEA7 DUP5 DUP7 ADD DUP7 PUSH2 0x502B JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0xEBE PUSH1 0xCF DUP4 PUSH2 0x21F2 JUMP JUMPDEST MLOAD DUP8 SWAP2 DUP4 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEEC JUMPI PUSH1 0x40 MLOAD PUSH4 0xC0BBFF13 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH2 0xEF9 DUP2 PUSH1 0x0 PUSH2 0x2277 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x73330C218A680717E9EEE625C262DF66EDDFDF99ECB388D25F6B32D66B9A318A DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0xF34 SWAP3 SWAP2 SWAP1 PUSH2 0x5800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xAE4 PUSH1 0x0 SLOAD PUSH1 0x1 SLOAD SWAP1 SWAP2 JUMP JUMPDEST DUP3 PUSH2 0xF5D PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF8C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFA9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xFCD SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0xFF0 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP4 PUSH1 0x0 PUSH2 0xFFE DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x1009 DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x1014 DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP7 SWAP1 DUP2 SWAP1 PUSH2 0x1050 JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x1059 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x106E PUSH1 0xCF DUP9 PUSH2 0x21F2 JUMP JUMPDEST MLOAD DUP9 SWAP2 DUP9 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x109C JUMPI PUSH1 0x40 MLOAD PUSH4 0xC0BBFF13 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH2 0x10BB DUP7 DUP7 PUSH1 0x2 PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x23D9 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x10CC PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH1 0x0 NOT PUSH2 0x26D7 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1109 JUMPI PUSH1 0x40 MLOAD PUSH4 0x72E3EF97 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xACD PUSH2 0x2746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH2 0x1128 PUSH2 0x278D JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 POP ISZERO DUP1 ISZERO PUSH2 0x113C JUMPI POP PUSH1 0x1 DUP2 ADD SLOAD ISZERO JUMPDEST PUSH2 0x1180 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x1152540DCC4C8E88155B9A5B9A5D1A585B1A5E9959 PUSH1 0x5A SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH2 0x1188 PUSH2 0x27B1 JUMP JUMPDEST PUSH2 0x1190 PUSH2 0x2852 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0xF PUSH1 0xF8 SHL SWAP13 SWAP4 SWAP12 POP SWAP2 SWAP10 POP CHAINID SWAP9 POP ADDRESS SWAP8 POP SWAP6 POP SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x11C6 PUSH2 0x286F JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 SWAP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x1200 JUMPI PUSH2 0x1200 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1233 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x121E JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x12B5 JUMPI PUSH2 0x1290 ADDRESS DUP7 DUP7 DUP5 DUP2 DUP2 LT PUSH2 0x1257 JUMPI PUSH2 0x1257 PUSH2 0x5858 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1269 SWAP2 SWAP1 PUSH2 0x586E JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x127C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x58B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x2893 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x12A2 JUMPI PUSH2 0x12A2 PUSH2 0x5858 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1239 JUMP JUMPDEST POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x12C9 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x12F8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1315 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1339 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x135C JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP6 PUSH1 0x0 PUSH2 0x136A DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x1375 DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x1380 DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP9 SWAP1 DUP2 SWAP1 PUSH2 0x13BC JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x13C5 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x13DA JUMPI PUSH2 0x13DA PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x13F1 JUMPI PUSH2 0x13EA DUP11 DUP10 DUP10 PUSH2 0x2909 JUMP JUMPDEST SWAP1 POP PUSH2 0x1430 JUMP JUMPDEST PUSH1 0x2 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1405 JUMPI PUSH2 0x1405 PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x1415 JUMPI PUSH2 0x13EA DUP11 DUP10 DUP10 PUSH2 0x2E1D JUMP JUMPDEST DUP9 PUSH1 0x40 MLOAD PUSH4 0x47031CF PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5913 JUMP JUMPDEST DUP9 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1442 JUMPI PUSH2 0x1442 PUSH2 0x58DB JUMP JUMPDEST DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x54FE682BFB66381A9382E13E4B95A3DD4F960EAFBAE063FDEA3539D144FF3FF5 DUP4 PUSH1 0x40 MLOAD PUSH2 0x147D SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B8 DUP3 PUSH1 0x2 PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x2EE0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14C4 PUSH2 0x2F04 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND ISZERO SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 DUP2 ISZERO DUP1 ISZERO PUSH2 0x14EB JUMPI POP DUP3 JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x1 EQ DUP1 ISZERO PUSH2 0x1507 JUMPI POP ADDRESS EXTCODESIZE ISZERO JUMPDEST SWAP1 POP DUP2 ISZERO DUP1 ISZERO PUSH2 0x1515 JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x1533 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB NOT AND PUSH1 0x1 OR DUP6 SSTORE DUP4 ISZERO PUSH2 0x155C JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL OR DUP6 SSTORE JUMPDEST PUSH2 0x1565 DUP10 PUSH2 0x2F2D JUMP JUMPDEST PUSH2 0x156D PUSH2 0x2F3E JUMP JUMPDEST PUSH2 0x1575 PUSH2 0x2F46 JUMP JUMPDEST PUSH2 0x157D PUSH2 0x2F5E JUMP JUMPDEST PUSH2 0x15C9 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH15 0x537562677261706853657276696365 PUSH1 0x88 SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x312E3 PUSH1 0xEC SHL DUP2 MSTORE POP PUSH2 0x2F6E JUMP JUMPDEST PUSH2 0x15D5 DUP9 PUSH1 0x0 NOT PUSH2 0x26D7 JUMP JUMPDEST PUSH2 0x15DE DUP8 PUSH2 0x1B15 JUMP JUMPDEST PUSH2 0x15E7 DUP7 PUSH2 0x2F88 JUMP JUMPDEST DUP4 ISZERO PUSH2 0x162D JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND DUP6 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0xC7F505B2F371AE2175EE4913F4499E1F2633A7B5936321EED1CDAEB6115181D2 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLER PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP3 EQ PUSH2 0x1685 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCDC0567F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP DUP1 PUSH2 0x1697 DUP4 DUP6 ADD DUP6 PUSH2 0x5921 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x16A3 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE76FEDE6 DUP7 DUP5 DUP5 PUSH2 0x16BC PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP7 SWAP1 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1715 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1729 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2F2E74A11116E05B39159372CCEB6739257B08D72F7171D208FF27BB6466C58 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1768 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1780 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17AF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17CC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17F0 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x1813 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH2 0x181D PUSH2 0x1DB8 JUMP JUMPDEST PUSH2 0x1826 DUP5 PUSH2 0x3003 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP1 PUSH32 0xF53CF6521A1B5FC0C04BFFA70374A4DC2E3474F2B2AC1643C3BCC54E2DB4A939 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x186C DUP4 DUP4 PUSH2 0x3076 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x2FDF JUMP JUMPDEST DUP3 PUSH2 0x1886 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18B5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18F6 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x1919 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP4 PUSH1 0x0 PUSH2 0x1927 DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x1932 DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x193D DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP7 SWAP1 DUP2 SWAP1 PUSH2 0x1979 JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x1982 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x1993 DUP10 DUP12 ADD DUP12 PUSH2 0x5943 JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH2 0x19BB DUP12 DUP4 DUP7 DUP7 DUP6 PUSH1 0x2 PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x30E5 JUMP JUMPDEST DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD3803EB82EF5B4CDFF8646734EBBAF5B37441E96314B27FFD3D0940F12A038E7 DUP12 DUP12 PUSH1 0x40 MLOAD PUSH2 0x19F6 SWAP3 SWAP2 SWAP1 PUSH2 0x5800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1A13 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x2F88 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x32DC JUMP JUMPDEST PUSH2 0x1A2E PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A3B PUSH1 0xCF DUP4 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1A52 PUSH1 0xD2 SLOAD DUP3 PUSH2 0x3300 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x1A71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x3477B5 PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x1A7B DUP2 PUSH2 0x333D JUMP JUMPDEST ISZERO DUP3 SWAP1 PUSH2 0x1A9C JUMPI PUSH1 0x40 MLOAD PUSH4 0x17C7B35D PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xA8F DUP3 PUSH1 0x1 PUSH2 0x2277 JUMP JUMPDEST PUSH2 0x1AB0 PUSH2 0x1AE3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1ADA JUMPI PUSH1 0x0 PUSH1 0x40 MLOAD PUSH4 0x1E4FBDF7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x2097 JUMP JUMPDEST CALLER PUSH2 0x1AEC PUSH2 0x11BB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xACD JUMPI CALLER PUSH1 0x40 MLOAD PUSH4 0x118CDAA7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL PUSH4 0xFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x472ABA493F9FD1D136EC54986F619F3AA5CAFF964F0E731A9909FB9A1270211F SWAP1 PUSH1 0x20 ADD PUSH2 0xDAB JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x140 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xC0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xE0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x100 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x120 DUP2 ADD DUP3 SWAP1 MSTORE SWAP1 PUSH2 0x1BE6 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP5 ADDRESS PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1C13 SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C55 SWAP2 SWAP1 PUSH2 0x59D0 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0xA0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 EQ ISZERO DUP4 SWAP1 PUSH2 0x1C89 JUMPI PUSH1 0x40 MLOAD PUSH4 0x7B3C09BF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD DUP2 MLOAD PUSH2 0x848 SWAP2 PUSH2 0x1CA4 SWAP2 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x6 DUP2 MSTORE PUSH1 0x20 ADD PUSH6 0x746F6B656E73 PUSH1 0xD0 SHL DUP2 MSTORE POP PUSH2 0x335C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1CD9 PUSH2 0x20F3 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 DUP4 PUSH2 0x1CEE JUMPI DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x1CF4 JUMP JUMPDEST DUP5 PUSH1 0xE0 ADD MLOAD JUMPDEST SWAP1 POP PUSH2 0x1D42 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH13 0x1D1A185DDA5B99D4195C9A5BD9 PUSH1 0x9A SHL DUP2 MSTORE POP PUSH2 0x335C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D4D PUSH2 0x1FDD JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 DUP7 PUSH2 0x1D62 JUMPI DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1D68 JUMP JUMPDEST DUP8 PUSH1 0xC0 ADD MLOAD JUMPDEST SWAP1 POP PUSH2 0x1DAE DUP2 PUSH4 0xFFFFFFFF AND DUP5 PUSH4 0xFFFFFFFF AND DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xE DUP2 MSTORE PUSH1 0x20 ADD PUSH14 0x1B585E15995C9A599A595C90DD5D PUSH1 0x92 SHL DUP2 MSTORE POP PUSH2 0x335C JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1DC0 PUSH2 0xCDC JUMP JUMPDEST ISZERO PUSH2 0xACD JUMPI PUSH1 0x40 MLOAD PUSH4 0xD93C0665 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH2 0x109 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP5 DUP7 AND SWAP5 DUP6 OR SWAP1 SSTORE MLOAD PUSH31 0x3215DC05A2FC4E6A1E2C2776311D207C730EE51085AAE221ACC5CBE6FB55C1 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO DUP2 ISZERO EQ PUSH2 0x1E8A JUMPI PUSH1 0x40 MLOAD PUSH4 0x5E67E54B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x8EC JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP2 DUP3 MSTORE PUSH32 0xA95BAC2F3DF0D40E8278281C1D39D53C60E4F2BF3550CA5665738D0916E89789 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH2 0x1EF3 PUSH2 0x3390 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1EFD PUSH2 0x2073 JUMP JUMPDEST DUP1 SLOAD PUSH1 0xFF NOT AND DUP2 SSTORE SWAP1 POP PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA CALLER JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xDAB SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD SWAP3 DUP4 ADD DUP5 SWAP1 MSTORE DUP3 DUP3 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP1 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP1 MSTORE DUP2 SWAP1 PUSH2 0x1F8B SWAP1 DUP5 SWAP1 PUSH2 0x33B5 SWAP1 PUSH2 0x33CA SWAP1 PUSH2 0x34C5 SWAP1 DUP10 PUSH2 0x34EA JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x13F3FA9F0E54AF1AF76D8B5D11C3973D7C2AED6312B61EFFF2F7B49D73AD67EB DUP4 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1FCF SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1768 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1FE8 PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xBB2A2B47 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2025 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2049 SWAP2 SWAP1 PUSH2 0x5A96 JUMP JUMPDEST SWAP3 PUSH3 0xF4240 SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2063 DUP3 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x12B8 JUMPI POP POP PUSH1 0x80 ADD MLOAD ISZERO SWAP1 JUMP JUMPDEST PUSH32 0xCD5ED15C6E187E77E9AEE88184C21F4F2182AB5827CB3B7E07FBEDCD63F03300 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20A1 PUSH2 0x286F JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP4 SWAP5 POP SWAP2 AND SWAP2 DUP3 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2100 PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5AEA0EC4 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x213D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2161 SWAP2 SWAP1 PUSH2 0x5AB3 JUMP JUMPDEST SWAP4 DUP5 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0xD2 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x21774046E2611DDB52C8C46E1AD97524EEB2E3FDA7DCD9428867868B4C4D06BA SWAP1 PUSH1 0x20 ADD PUSH2 0xDAB JUMP JUMPDEST PUSH2 0x21AC PUSH1 0xD0 DUP5 DUP5 DUP5 PUSH2 0x35A4 JUMP JUMPDEST DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD54C7ABC930F6D506DA2D08AA7AEAD4F2443E1DB6D5F560384A2F652FF893E19 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH2 0x21FA PUSH2 0x4FAE JUMP JUMPDEST PUSH2 0x2204 DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 SWAP1 SWAP2 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2284 PUSH1 0xCF DUP5 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x230F DUP4 PUSH2 0x2292 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22C3 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2306 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0xCF SWAP2 SWAP1 PUSH2 0x372A JUMP JUMPDEST PUSH2 0x231A PUSH1 0xCF DUP5 PUSH2 0x37DD JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x232D SWAP2 PUSH1 0xD1 SWAP2 PUSH2 0x3893 JUMP JUMPDEST DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2354 SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8F2F865E0FB62D722A51E4D9873199BF6BF52E7D8EE5A2EE2896C9EF719F545 DUP5 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x40 MLOAD PUSH2 0x23CC SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23E6 PUSH1 0xCF DUP6 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x23F1 DUP2 PUSH2 0x2054 JUMP JUMPDEST DUP5 SWAP1 PUSH2 0x2411 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1EB5FF95 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP DUP1 PUSH1 0x40 ADD MLOAD DUP4 EQ ISZERO DUP5 DUP5 SWAP1 SWAP2 PUSH2 0x243D JUMPI PUSH1 0x40 MLOAD PUSH4 0xF32518CD PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP PUSH1 0x40 DUP2 ADD MLOAD DUP1 DUP5 GT ISZERO PUSH2 0x2473 JUMPI PUSH2 0x246E PUSH2 0x2457 PUSH2 0x1B69 JUMP JUMPDEST DUP4 MLOAD PUSH2 0x2463 DUP5 DUP9 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD1 SWAP3 SWAP2 SWAP1 DUP8 PUSH2 0x3911 JUMP JUMPDEST PUSH2 0x248C JUMP JUMPDEST DUP2 MLOAD PUSH2 0x248C SWAP1 PUSH2 0x2483 DUP7 DUP5 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD1 SWAP2 SWAP1 PUSH2 0x3893 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2496 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24C7 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x24E6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x250A SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2517 DUP5 PUSH2 0x333D JUMP JUMPDEST ISZERO PUSH2 0x2523 JUMPI PUSH1 0x0 PUSH2 0x2532 JUMP JUMPDEST PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2532 SWAP1 DUP4 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x2 DUP2 ADD DUP9 SWAP1 SSTORE PUSH1 0x6 ADD DUP4 SWAP1 SSTORE SWAP1 POP PUSH2 0x2561 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC8A5F81E DUP5 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x258E SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x25CF SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x7 ADD DUP1 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x25FA SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP3 DUP7 GT ISZERO PUSH2 0x2642 JUMPI PUSH2 0x2611 DUP4 DUP8 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP7 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x2637 SWAP2 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x2678 SWAP1 POP JUMP JUMPDEST PUSH2 0x264C DUP7 DUP5 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP7 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x2672 SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6DB4A6F9BE2D5E72EB2A2AF2374AC487971BF342A261BA0BC1CF471BF2A2C31F DUP10 DUP8 PUSH1 0x40 MLOAD PUSH2 0x26C6 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST DUP2 DUP2 DUP1 DUP3 GT ISZERO PUSH2 0x26FC JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP POP PUSH1 0x0 DUP3 SWAP1 SSTORE PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x90699B8B4BF48918FEA1129C85F9BC7B51285DF7ECC982910813C7805F568849 SWAP1 PUSH2 0x273A SWAP1 DUP5 SWAP1 DUP5 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH2 0x274E PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2758 PUSH2 0x2073 JUMP JUMPDEST DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR DUP2 SSTORE SWAP1 POP PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 PUSH2 0x1F2A CALLER SWAP1 JUMP JUMPDEST PUSH32 0xA16A46D94261C7517CC8FF89F61C0CE93598E3C849801011DEE649A6A557D100 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x27BD PUSH2 0x278D JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH2 0x27CE SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x27FA SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2847 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x281C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2847 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x282A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x285E PUSH2 0x278D JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x3 ADD DUP1 SLOAD PUSH2 0x27CE SWAP1 PUSH2 0x56C1 JUMP JUMPDEST PUSH32 0x9016D09D72D40FDAE2FD8CEAC6B6234C7706214FD39C1CD1E609A0528C199300 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD PUSH2 0x28B0 SWAP2 SWAP1 PUSH2 0x5AFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x28EB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x28F0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x2900 DUP6 DUP4 DUP4 PUSH2 0x3A0F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x2919 DUP5 DUP7 ADD DUP7 PUSH2 0x5B3A JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 ADD MLOAD SWAP2 SWAP4 POP SWAP2 POP DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2953 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1A071D07 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP2 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 GT ISZERO PUSH2 0x2983 JUMPI PUSH1 0x40 MLOAD PUSH4 0xFA4AC7A7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP DUP2 MLOAD MLOAD PUSH1 0x0 PUSH2 0x2994 PUSH1 0xCF DUP4 PUSH2 0x21F2 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP DUP9 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x29C9 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4508FBF7 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x29DB DUP10 PUSH1 0x0 PUSH2 0x1F37 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x29E8 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2A13 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2A54 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH2 0x2A5E PUSH2 0x32DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x692209CE PUSH1 0x0 PUSH2 0x2AFC DUP12 PUSH2 0x2A7A PUSH2 0x2EE0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x4C4EA0ED DUP11 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2AA7 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2AE8 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST PUSH2 0x2AF3 JUMPI PUSH1 0x0 PUSH2 0x3A86 JUMP JUMPDEST PUSH2 0x108 SLOAD PUSH2 0x3A86 JUMP JUMPDEST DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B1B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5C71 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B3A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2B5E SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP3 POP PUSH1 0x0 PUSH2 0x2B6A PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B95 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2BB2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2BD6 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP DUP2 DUP2 DUP2 DUP2 LT ISZERO PUSH2 0x2BFD JUMPI PUSH1 0x40 MLOAD PUSH4 0x9DB8BC95 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP PUSH2 0x2C0A SWAP1 POP DUP3 DUP3 PUSH2 0x5845 JUMP JUMPDEST SWAP3 POP POP DUP3 ISZERO SWAP1 POP PUSH2 0x2DB4 JUMPI PUSH2 0x2CA9 DUP12 PUSH2 0x107 SLOAD DUP5 PUSH2 0x2C28 SWAP2 SWAP1 PUSH2 0x5CA1 JUMP JUMPDEST PUSH2 0x2C30 PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5AEA0EC4 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C6D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2C91 SWAP2 SWAP1 PUSH2 0x5AB3 JUMP JUMPDEST PUSH2 0x2CA4 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP PUSH2 0x5AE9 JUMP JUMPDEST PUSH2 0x3ADA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2DB4 JUMPI PUSH2 0x2CB7 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1D1C2FEC DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2CE4 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2D03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2D27 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST POP PUSH2 0x2D4C PUSH2 0x2D33 PUSH2 0x2EE0 JUMP JUMPDEST DUP3 PUSH2 0x2D3C PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C4A JUMP JUMPDEST PUSH2 0x2D54 PUSH2 0x2EE0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x81573288 DUP5 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D81 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DAF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP7 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP7 DUP2 MSTORE SWAP3 DUP4 ADD DUP6 SWAP1 MSTORE DUP3 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND SWAP3 SWAP2 DUP2 AND SWAP2 SWAP1 DUP15 AND SWAP1 PUSH32 0x184C452047299395D4F7F147EB8E823458A450798539BE54AEED978F13D87BA2 SWAP1 PUSH1 0x60 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x2E2E DUP6 DUP8 ADD DUP8 PUSH2 0x5CB8 JUMP JUMPDEST SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x2E4A PUSH1 0xCF DUP6 PUSH2 0x21F2 JUMP JUMPDEST MLOAD DUP9 SWAP2 DUP6 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2E78 JUMPI PUSH1 0x40 MLOAD PUSH4 0xC0BBFF13 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x109 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x2EB6 SWAP3 DUP7 SWAP3 DUP7 SWAP3 DUP7 SWAP3 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP2 AND PUSH2 0x3CF9 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2ED8 PUSH2 0x2ECE PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0xD1 SWAP1 DUP6 DUP6 PUSH2 0x42D6 JUMP JUMPDEST ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0xF0C57E16840DF040F15088DC2F81FE391C3923BEC73E23A9662EFC9C229C6A00 PUSH2 0x12B8 JUMP JUMPDEST PUSH2 0x2F35 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x4395 JUMP JUMPDEST PUSH2 0xACD PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F4E PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F56 PUSH2 0x439D JUMP JUMPDEST PUSH2 0xACD PUSH2 0x2F3E JUMP JUMPDEST PUSH2 0x2F66 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F56 PUSH2 0x2F3E JUMP JUMPDEST PUSH2 0x2F76 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F80 DUP3 DUP3 PUSH2 0x43DF JUMP JUMPDEST PUSH2 0xA8F PUSH2 0x2F3E JUMP JUMPDEST DUP1 PUSH1 0x0 SUB PUSH2 0x2FA9 JUMPI PUSH1 0x40 MLOAD PUSH4 0xBC71A043 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x107 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x2AAAF20B08565EEBC0C962CD7C568E54C3C0C2B85A1F942B82CD1BD730FDCD23 SWAP1 PUSH1 0x20 ADD PUSH2 0xDAB JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x300E DUP2 PUSH1 0x1 PUSH2 0x43F1 JUMP JUMPDEST PUSH2 0x3016 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x3A78B732 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3041 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x305B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x306F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x186C PUSH32 0x4BDEE85C4B4A268F4895D1096D553C3E57BB2433C380E7B7EC8CB56CC4F74673 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x30CA SWAP4 SWAP3 SWAP2 SWAP1 SWAP3 DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x4408 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x310C JUMPI PUSH1 0x40 MLOAD PUSH4 0x4FFDF5EF PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3117 DUP7 DUP7 DUP5 PUSH2 0x4435 JUMP JUMPDEST PUSH2 0x312B PUSH2 0x3122 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0xD0 SWAP1 DUP8 PUSH2 0x4484 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3135 PUSH2 0x457A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x76671808 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3172 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3196 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3226 DUP9 DUP9 DUP9 DUP9 PUSH2 0x31A9 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP13 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x31D6 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3219 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0xCF SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 DUP9 PUSH2 0x459E JUMP JUMPDEST SWAP1 POP PUSH2 0x323E PUSH2 0x3233 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0xD1 SWAP1 DUP11 DUP9 DUP8 PUSH2 0x3911 JUMP JUMPDEST DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x3265 SWAP2 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP6 DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE5E185FAB2B992C4727FF702A867D78B15FB176DBAA20C9C312A1C351D3F7F83 DUP5 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x40 MLOAD PUSH2 0x32CA SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3315 DUP5 PUSH1 0x60 ADD MLOAD DUP6 PUSH1 0xA0 ADD MLOAD PUSH2 0x4706 JUMP JUMPDEST PUSH2 0x331F SWAP1 TIMESTAMP PUSH2 0x5845 JUMP JUMPDEST SWAP1 POP PUSH2 0x332A DUP5 PUSH2 0x2054 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x3335 JUMPI POP DUP3 DUP2 GT JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x334C DUP3 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x12B8 JUMPI POP POP PUSH1 0x40 ADD MLOAD ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x3367 DUP5 DUP5 DUP5 PUSH2 0x4716 JUMP JUMPDEST DUP2 DUP6 DUP6 DUP6 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x1DAE JUMPI PUSH1 0x40 MLOAD PUSH4 0x871E13D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5D10 JUMP JUMPDEST PUSH2 0x3398 PUSH2 0xCDC JUMP JUMPDEST PUSH2 0xACD JUMPI PUSH1 0x40 MLOAD PUSH4 0x8DFC202B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH2 0x33D9 DUP6 PUSH2 0x472D JUMP JUMPDEST SWAP1 POP TIMESTAMP DUP2 PUSH1 0x40 ADD MLOAD GT ISZERO PUSH2 0x3401 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x1 SWAP2 POP PUSH2 0x34BE JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3418 SWAP2 SWAP1 PUSH2 0x5D3F JUMP JUMPDEST DUP5 MLOAD SWAP2 SWAP4 POP SWAP2 POP PUSH2 0x342D SWAP1 PUSH1 0x9A SWAP1 DUP4 SWAP1 PUSH2 0x3893 JUMP JUMPDEST DUP7 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4C06B68820628A39C787D2DB1FAA0EEACD7B9474847B198B1E871FE6E5B93F44 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x3471 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP3 MLOAD PUSH2 0x3485 SWAP1 DUP4 PUSH2 0x5AE9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP6 POP PUSH1 0x0 DUP7 SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 DUP2 SSTORE PUSH1 0x1 DUP2 ADD DUP3 SWAP1 SSTORE PUSH1 0x2 DUP2 ADD DUP3 SWAP1 SSTORE PUSH1 0x3 ADD SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP8 PUSH1 0x3 ADD SLOAD DUP4 GT ISZERO PUSH2 0x3513 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4A411B9D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 ISZERO PUSH2 0x3521 JUMPI DUP4 PUSH2 0x3527 JUMP JUMPDEST DUP9 PUSH1 0x3 ADD SLOAD JUMPDEST DUP10 SLOAD SWAP1 SWAP5 POP JUMPDEST DUP1 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x353C JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0x3595 JUMPI PUSH1 0x0 DUP1 PUSH2 0x3552 DUP4 DUP10 DUP13 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0x3563 JUMPI POP POP PUSH2 0x3595 JUMP JUMPDEST SWAP7 POP DUP7 PUSH2 0x3571 DUP13 DUP13 DUP12 PUSH2 0x47BB JUMP JUMPDEST SWAP3 POP DUP7 PUSH2 0x357D DUP2 PUSH2 0x5D65 JUMP JUMPDEST SWAP8 POP POP DUP4 DUP1 PUSH2 0x358B SWAP1 PUSH2 0x5D7C JUMP JUMPDEST SWAP5 POP POP POP POP PUSH2 0x352D JUMP JUMPDEST POP SWAP9 SWAP4 SWAP8 POP SWAP3 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP7 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD SWAP1 SWAP4 AND DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x35E4 SWAP1 PUSH2 0x4842 JUMP JUMPDEST ISZERO DUP3 SWAP1 PUSH2 0x3605 JUMPI PUSH1 0x40 MLOAD PUSH4 0x2D7D25F1 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP4 DUP5 MSTORE SWAP4 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP6 SWAP1 SWAP4 MSTORE SWAP1 SWAP4 KECCAK256 SWAP1 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR DUP2 SSTORE SWAP1 MLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP5 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH2 0x120 DUP2 ADD DUP4 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH1 0x8 DUP2 ADD SLOAD PUSH2 0x100 DUP5 ADD MSTORE SWAP1 SWAP2 PUSH2 0x36DE SWAP1 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0x36FE JUMPI PUSH1 0x40 MLOAD PUSH4 0x42DAADAF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3736 DUP5 DUP5 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x37AD SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP5 SWAP2 PUSH2 0x37D3 JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP PUSH1 0x6 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37E9 DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x3860 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP4 SWAP2 PUSH2 0x3886 JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP TIMESTAMP PUSH1 0x4 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 SUB PUSH2 0x38A0 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP1 DUP3 LT ISZERO PUSH2 0x38DD JUMPI PUSH1 0x40 MLOAD PUSH4 0x5F8EC709 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x3907 SWAP1 DUP5 SWAP1 PUSH2 0x5845 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP JUMP JUMPDEST DUP2 ISZERO PUSH2 0x306F JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP7 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x393B SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x872D0489 DUP7 ADDRESS DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x396F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5D95 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x398C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x39B0 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP DUP1 DUP3 DUP2 DUP2 GT ISZERO PUSH2 0x39D7 JUMPI PUSH1 0x40 MLOAD PUSH4 0x5F8EC709 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP7 SWAP3 SWAP1 PUSH2 0x3A01 SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH2 0x3A24 JUMPI PUSH2 0x3A1F DUP3 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x186C JUMP JUMPDEST DUP2 MLOAD ISZERO DUP1 ISZERO PUSH2 0x3A3B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND EXTCODESIZE ISZERO JUMPDEST ISZERO PUSH2 0x3A5B JUMPI DUP4 PUSH1 0x40 MLOAD PUSH4 0x9996B315 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP DUP1 PUSH2 0x186C JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x109 PUSH1 0x20 SWAP1 DUP2 MSTORE SWAP1 DUP4 SWAP1 KECCAK256 SLOAD SWAP3 MLOAD PUSH1 0x60 SWAP4 PUSH2 0x3AC3 SWAP4 DUP8 SWAP4 DUP8 SWAP4 SWAP3 SWAP1 SWAP2 AND SWAP2 ADD PUSH2 0x5DBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0x3AFB JUMPI PUSH1 0x40 MLOAD PUSH4 0x8F4C63D9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3B27 PUSH2 0x3B06 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x9A SWAP2 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x3911 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x2 DUP1 DUP3 ADD SLOAD DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT ADDRESS PUSH1 0x60 SWAP1 DUP2 SHL DUP3 AND DUP4 DUP10 ADD MSTORE DUP12 SWAP1 SHL AND PUSH1 0x34 DUP3 ADD MSTORE PUSH1 0x48 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP5 MLOAD DUP1 DUP3 SUB SWAP1 SWAP3 ADD DUP3 MSTORE PUSH1 0x68 DUP2 ADD DUP1 DUP7 MSTORE DUP3 MLOAD SWAP3 DUP8 ADD SWAP3 SWAP1 SWAP3 KECCAK256 PUSH1 0xE8 DUP3 ADD DUP7 MSTORE DUP10 DUP4 MSTORE TIMESTAMP PUSH1 0x88 DUP4 ADD SWAP1 DUP2 MSTORE PUSH1 0xA8 DUP4 ADD DUP11 DUP2 MSTORE PUSH1 0xC8 SWAP1 SWAP4 ADD DUP10 DUP2 MSTORE DUP3 DUP11 MSTORE PUSH1 0x9B SWAP1 SWAP9 MSTORE SWAP6 SWAP1 SWAP8 KECCAK256 SWAP2 MLOAD DUP3 SSTORE SWAP4 MLOAD PUSH1 0x1 DUP3 ADD SSTORE SWAP3 MLOAD SWAP1 DUP4 ADD SSTORE SWAP2 MLOAD PUSH1 0x3 SWAP2 DUP3 ADD SSTORE DUP2 ADD SLOAD SWAP1 SWAP2 SWAP1 ISZERO PUSH2 0x3BF5 JUMPI PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD DUP2 SWAP1 SSTORE JUMPDEST PUSH2 0x3BFF DUP3 DUP3 PUSH2 0x487A JUMP JUMPDEST DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x5D9E2C5278E41138269F5F980CFBEA016D8C59816754502ABC4D2F87AAEA987F DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0x3C3B SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD3C JUMPI PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x3C7E SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x5AD0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C9D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3CC1 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST PUSH2 0xD3C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x10BA3930B739B332B9 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3D07 PUSH1 0xCF DUP9 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x3D12 DUP2 PUSH2 0x2054 JUMP JUMPDEST DUP8 SWAP1 PUSH2 0x3D32 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1EB5FF95 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x3D4A PUSH1 0xD2 SLOAD DUP4 PUSH2 0x3300 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST ISZERO DUP1 ISZERO PUSH2 0x3D5D JUMPI POP PUSH2 0x3D5B DUP3 PUSH2 0x333D JUMP JUMPDEST ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x3D68 JUMPI POP DUP7 ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x3DE0 JUMPI POP DUP2 PUSH2 0x100 ADD MLOAD PUSH2 0x3D7D PUSH2 0x457A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x76671808 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DBA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DDE SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST GT JUMPDEST PUSH2 0x3DEB JUMPI PUSH1 0x0 PUSH2 0x3E61 JUMP JUMPDEST PUSH2 0x3DF3 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xDB750926 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E1E SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E3D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3E61 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH2 0x3EA0 DUP9 PUSH2 0x3E6F PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22C3 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x3EAB PUSH1 0xCF DUP10 PUSH2 0x490D JUMP JUMPDEST PUSH2 0x3EB6 PUSH1 0xCF DUP10 PUSH2 0x49C3 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 ISZERO PUSH2 0x41EF JUMPI PUSH1 0x0 PUSH2 0x3EC9 PUSH2 0x1B69 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD PUSH4 0x7573EF4F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7573EF4F SWAP2 PUSH2 0x3EFC SWAP2 ADDRESS SWAP1 PUSH1 0x2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5E87 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3F19 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3F3D SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3F49 PUSH2 0x1B69 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x40 MLOAD PUSH4 0x1584A179 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x561285E4 SWAP2 PUSH2 0x3F79 SWAP2 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x5515 JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3F96 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3FBA SWAP2 SWAP1 PUSH2 0x5EAC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x20 ADD MLOAD GT PUSH2 0x3FCF JUMPI PUSH1 0x0 PUSH2 0x3FD9 JUMP JUMPDEST PUSH2 0x3FD9 DUP6 DUP4 PUSH2 0x4A7A JUMP JUMPDEST SWAP3 POP DUP3 ISZERO PUSH2 0x40CE JUMPI PUSH2 0x3FE9 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x95EA7B3 PUSH2 0x3FFF PUSH2 0x1B69 JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x401D SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x403C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4060 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST POP PUSH2 0x4069 PUSH2 0x1B69 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x40 MLOAD PUSH4 0xCA94B0E9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0xCA94B0E9 SWAP2 PUSH2 0x409B SWAP2 ADDRESS SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x5F1F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x40B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x40C9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x40D8 DUP4 DUP7 PUSH2 0x5845 JUMP JUMPDEST SWAP4 POP DUP4 ISZERO PUSH2 0x41EC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH2 0x41DF JUMPI PUSH2 0x40F6 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x95EA7B3 PUSH2 0x410C PUSH2 0x1B69 JUMP JUMPDEST DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x412A SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4149 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x416D SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST POP PUSH2 0x4176 PUSH2 0x1B69 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x40 MLOAD PUSH4 0x3A309049 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x74612092 SWAP2 PUSH2 0x41A8 SWAP2 ADDRESS SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x5F1F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x41C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x41D6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x41EC JUMP JUMPDEST PUSH2 0x41EC DUP9 DUP6 PUSH2 0x2D3C PUSH2 0x3A62 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND SWAP2 AND PUSH32 0x443F56BD2098D273B8C8120398789A41DA5925DB4BA2F656813FC5299AC57B1F DUP7 DUP7 DUP7 DUP16 DUP16 PUSH2 0x4231 PUSH2 0x457A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x76671808 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x426E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4292 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x42A4 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5F43 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP4 MLOAD PUSH2 0x42B8 SWAP1 DUP9 PUSH2 0x2EC1 JUMP JUMPDEST ISZERO PUSH2 0x42C8 JUMPI PUSH2 0x42C8 DUP11 PUSH1 0x1 PUSH2 0x2277 JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x872D0489 DUP6 ADDRESS DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4309 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5D95 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4326 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x434A SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD GT ISZERO SWAP2 POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x4378 PUSH2 0x4ADA JUMP JUMPDEST PUSH2 0xACD JUMPI PUSH1 0x40 MLOAD PUSH4 0x1AFCD79F PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1AB0 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x43A5 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x43B2 PUSH1 0x0 PUSH1 0x0 NOT PUSH2 0x26D7 JUMP JUMPDEST PUSH2 0x43C0 PUSH1 0x0 PUSH3 0xF4240 PUSH2 0x4AF4 JUMP JUMPDEST PUSH2 0x43D2 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH2 0x4BC5 JUMP JUMPDEST PUSH2 0xACD PUSH4 0xFFFFFFFF PUSH2 0x1B15 JUMP JUMPDEST PUSH2 0x43E7 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0xA8F DUP3 DUP3 PUSH2 0x4C52 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x43FC DUP4 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0xD3C DUP2 DUP4 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B8 PUSH2 0x4415 PUSH2 0x4C93 JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x444A PUSH2 0x4444 DUP6 DUP6 PUSH2 0x3076 JUMP JUMPDEST DUP4 PUSH2 0x4C9D JUMP JUMPDEST SWAP1 POP DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND EQ PUSH2 0x447C JUMPI PUSH1 0x40 MLOAD PUSH4 0x8C5B935D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD SWAP1 SWAP4 AND DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x44C4 SWAP1 PUSH2 0x4842 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x44E5 JUMPI PUSH1 0x40 MLOAD PUSH4 0x2D7D25F1 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH4 0x78EB06B3 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0xF1D60D66 SWAP1 PUSH2 0x4512 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x452F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4553 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x4574 JUMPI PUSH1 0x40 MLOAD PUSH4 0x2D7D25F1 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x45A6 PUSH2 0x4FAE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP11 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH2 0x120 DUP2 ADD DUP5 MSTORE DUP2 SLOAD SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x2 DUP2 ADD SLOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH1 0x8 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x4632 SWAP1 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST ISZERO DUP7 SWAP1 PUSH2 0x4653 JUMPI PUSH1 0x40 MLOAD PUSH4 0xBC4DEF5 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP7 DUP8 MSTORE DUP2 DUP4 ADD SWAP6 DUP7 MSTORE TIMESTAMP PUSH1 0x60 DUP4 ADD SWAP1 DUP2 MSTORE PUSH1 0x0 PUSH1 0x80 DUP5 ADD DUP2 DUP2 MSTORE PUSH1 0xA0 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0xC0 DUP7 ADD SWAP9 DUP10 MSTORE PUSH1 0xE0 DUP7 ADD DUP4 DUP2 MSTORE PUSH2 0x100 DUP8 ADD SWAP9 DUP10 MSTORE SWAP12 DUP14 AND DUP4 MSTORE SWAP13 SWAP1 SWAP4 MSTORE SWAP4 SWAP1 SWAP4 KECCAK256 DUP3 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP11 AND SWAP10 SWAP1 SWAP10 OR DUP10 SSTORE SWAP6 MLOAD PUSH1 0x1 DUP10 ADD SSTORE SWAP4 MLOAD PUSH1 0x2 DUP9 ADD SSTORE MLOAD PUSH1 0x3 DUP8 ADD SSTORE SWAP3 MLOAD PUSH1 0x4 DUP7 ADD SSTORE SWAP5 MLOAD PUSH1 0x5 DUP6 ADD SSTORE SWAP4 MLOAD PUSH1 0x6 DUP5 ADD SSTORE SWAP1 MLOAD PUSH1 0x7 DUP4 ADD SSTORE MLOAD PUSH1 0x8 SWAP1 SWAP2 ADD SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 XOR DUP3 DUP5 GT MUL DUP3 XOR PUSH2 0x186C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x3335 JUMPI POP POP SWAP1 SWAP2 GT ISZERO SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x475B PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x80 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP2 MSTORE PUSH1 0x1 DUP3 ADD SLOAD SWAP3 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x3 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE DUP4 SWAP1 PUSH2 0x1C89 JUMPI PUSH1 0x40 MLOAD PUSH4 0x107349A9 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH1 0x3 ADD SLOAD GT PUSH2 0x47E1 JUMPI PUSH1 0x40 MLOAD PUSH4 0xDDAF8F21 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x47F4 DUP6 PUSH1 0x0 ADD SLOAD DUP6 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x4807 DUP6 PUSH1 0x0 ADD SLOAD DUP5 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x1 DUP6 PUSH1 0x3 ADD PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x481C SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP1 DUP6 SSTORE PUSH1 0x3 DUP6 ADD SLOAD PUSH1 0x0 SUB PUSH2 0x4838 JUMPI PUSH1 0x0 PUSH1 0x1 DUP7 ADD SSTORE JUMPDEST POP POP SWAP2 SLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x4861 JUMPI DUP1 MLOAD DUP1 DUP3 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD6BDA275 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2710 DUP3 PUSH1 0x3 ADD SLOAD LT PUSH2 0x48A0 JUMPI PUSH1 0x40 MLOAD PUSH4 0x3A8C56B PUSH1 0xE6 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x48BE JUMPI PUSH1 0x40 MLOAD PUSH4 0x8F4A893D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP1 DUP4 ADD DUP3 SWAP1 SSTORE PUSH1 0x2 DUP4 ADD DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x48DA SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x0 SUB PUSH2 0x48EF JUMPI DUP1 DUP3 SSTORE JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x3 ADD PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x4904 SWAP2 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4919 DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x4990 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP4 SWAP2 PUSH2 0x49B6 JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP TIMESTAMP PUSH1 0x5 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x49CF DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x4A46 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP4 SWAP2 PUSH2 0x4A6C JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP PUSH1 0x0 PUSH1 0x7 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4A89 DUP4 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP1 PUSH2 0x4A9C JUMPI POP PUSH2 0x4A9C DUP3 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP4 DUP4 SWAP1 SWAP2 PUSH2 0x4ABF JUMPI PUSH1 0x40 MLOAD PUSH4 0x768BF0EB PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP PUSH3 0xF4240 SWAP1 POP PUSH2 0x4AD0 DUP4 DUP6 PUSH2 0x5CA1 JUMP JUMPDEST PUSH2 0x186C SWAP2 SWAP1 PUSH2 0x5F81 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4AE4 PUSH2 0x2F04 JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH1 0xFF AND SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 DUP2 PUSH4 0xFFFFFFFF DUP1 DUP3 AND SWAP1 DUP4 AND GT ISZERO PUSH2 0x4B22 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5180 JUMP JUMPDEST POP DUP3 SWAP1 POP DUP2 PUSH4 0xFFFFFFFF DUP2 AND PUSH3 0xF4240 LT ISZERO PUSH2 0x4B53 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5180 JUMP JUMPDEST POP POP PUSH1 0x2 DUP1 SLOAD PUSH4 0xFFFFFFFF DUP4 DUP2 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH4 0xFFFFFFFF PUSH1 0xA0 SHL NOT SWAP2 DUP7 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x80 SHL PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2FE5A7039987697813605CC0B9D6DB7AAB575408E3FC59E8A457BEF8D7BC0A36 SWAP1 PUSH2 0x273A SWAP1 DUP5 SWAP1 DUP5 SWAP1 PUSH2 0x5180 JUMP JUMPDEST DUP2 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND SWAP1 DUP4 AND GT ISZERO PUSH2 0x4BF6 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x521C JUMP JUMPDEST POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x40 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP1 DUP6 AND OR OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2867E04C500E438761486B78021D4F9EB97C77FF45D10C1183F5583BA4CBF7D1 SWAP1 PUSH2 0x273A SWAP1 DUP5 SWAP1 DUP5 SWAP1 PUSH2 0x521C JUMP JUMPDEST PUSH2 0x4C5A PUSH2 0x4370 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C64 PUSH2 0x278D JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP2 ADD PUSH2 0x4C74 DUP5 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP PUSH1 0x3 DUP2 ADD PUSH2 0x4C83 DUP4 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP PUSH1 0x0 DUP1 DUP3 SSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x4CC7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x4CAD DUP7 DUP7 PUSH2 0x4D3B JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x4CBD DUP3 DUP3 PUSH2 0x4D88 JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x4CF2 PUSH2 0x4E41 JUMP JUMPDEST PUSH2 0x4CFA PUSH2 0x4EA8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 MLOAD PUSH1 0x41 SUB PUSH2 0x4D75 JUMPI PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x4D67 DUP9 DUP3 DUP6 DUP6 PUSH2 0x4EE9 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP POP POP POP PUSH2 0x4D81 JUMP JUMPDEST POP POP DUP2 MLOAD PUSH1 0x0 SWAP2 POP PUSH1 0x2 SWAP1 JUMPDEST SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4D9C JUMPI PUSH2 0x4D9C PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x4DA5 JUMPI POP POP JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4DB9 JUMPI PUSH2 0x4DB9 PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x4DD7 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF645EEDF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4DEB JUMPI PUSH2 0x4DEB PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x4E0C JUMPI PUSH1 0x40 MLOAD PUSH4 0xFCE698F7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x3 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4E20 JUMPI PUSH2 0x4E20 PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0xA8F JUMPI PUSH1 0x40 MLOAD PUSH4 0x35E2F383 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x4E4C PUSH2 0x278D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x4E58 PUSH2 0x27B1 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x4E70 JUMPI DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD DUP1 ISZERO PUSH2 0x4E7F JUMPI SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xC5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470 SWAP4 POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x4EB3 PUSH2 0x278D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x4EBF PUSH2 0x2852 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x4ED7 JUMPI DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SLOAD DUP1 ISZERO PUSH2 0x4E7F JUMPI SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH16 0xA2A8918CA85BAFE22016D0B997E4DF60 PUSH1 0x1 PUSH1 0xFF SHL SUB DUP5 GT ISZERO PUSH2 0x4F1A JUMPI POP PUSH1 0x0 SWAP2 POP PUSH1 0x3 SWAP1 POP DUP3 PUSH2 0x4FA4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP10 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4F6E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x4F9A JUMPI POP PUSH1 0x0 SWAP3 POP PUSH1 0x1 SWAP2 POP DUP3 SWAP1 POP PUSH2 0x4FA4 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 SWAP2 POP DUP2 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x120 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x5026 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x503D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x186C DUP2 PUSH2 0x5006 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5080 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x186C DUP2 PUSH2 0x505C JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x509D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x50B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x34BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x50E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x50EC DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5107 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5113 DUP7 DUP3 DUP8 ADD PUSH2 0x508B JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x514C DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x515C DUP2 PUSH2 0x5120 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x51B2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x519A JUMP JUMPDEST POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x51D3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5197 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x60 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x5200 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x51BB JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x5212 DUP2 DUP6 PUSH2 0x51BB JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x524B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x5256 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x5266 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF PUSH1 0xF8 SHL DUP9 AND DUP2 MSTORE PUSH1 0xE0 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x52A4 PUSH1 0xE0 DUP4 ADD DUP10 PUSH2 0x51BB JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x52B6 DUP2 DUP10 PUSH2 0x51BB JUMP JUMPDEST PUSH1 0x60 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP5 ADD DUP7 SWAP1 MSTORE DUP4 DUP2 SUB PUSH1 0xC0 DUP6 ADD MSTORE DUP5 MLOAD DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP8 ADD SWAP4 POP SWAP1 SWAP2 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x530C JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x52EE JUMP JUMPDEST POP SWAP1 SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x5357 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x536D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD GT ISZERO PUSH2 0x5382 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP6 SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP1 DUP5 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP6 ADD SWAP2 POP PUSH1 0x40 DUP2 PUSH1 0x5 SHL DUP7 ADD ADD SWAP3 POP PUSH1 0x20 DUP7 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x53EB JUMPI PUSH1 0x3F NOT DUP8 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x53D6 DUP6 DUP4 MLOAD PUSH2 0x51BB JUMP JUMPDEST SWAP5 POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x53BA JUMP JUMPDEST POP SWAP3 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x540D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5418 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x542C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5453 DUP8 DUP3 DUP9 ADD PUSH2 0x508B JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5480 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x5497 DUP2 PUSH2 0x505C JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x54BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x54C5 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x515C DUP2 PUSH2 0x5006 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x550A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x186C DUP2 PUSH2 0x5120 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x140 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5568 JUMPI PUSH2 0x5568 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5568 JUMPI PUSH2 0x5568 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5568 JUMPI PUSH2 0x5568 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x55C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 DUP4 ADD PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP5 GT ISZERO PUSH2 0x55E3 JUMPI PUSH2 0x55E3 PUSH2 0x552F JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT PUSH1 0x1F DUP6 ADD DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD DUP2 DUP2 LT PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT OR ISZERO PUSH2 0x5611 JUMPI PUSH2 0x5611 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE SWAP1 POP DUP1 DUP3 DUP5 ADD DUP8 LT ISZERO PUSH2 0x5629 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP4 PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x565B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x567D DUP7 DUP3 DUP8 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x56A5 DUP7 DUP3 DUP8 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x56B6 DUP2 PUSH2 0x5006 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x56D5 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x56F5 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH2 0xD3C JUMPI DUP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP6 LT ISZERO PUSH2 0x5722 JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x306F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x572E JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x575B JUMPI PUSH2 0x575B PUSH2 0x552F JUMP JUMPDEST PUSH2 0x576F DUP2 PUSH2 0x5769 DUP5 SLOAD PUSH2 0x56C1 JUMP JUMPDEST DUP5 PUSH2 0x56FB JUMP JUMPDEST PUSH1 0x20 PUSH1 0x1F DUP3 GT PUSH1 0x1 DUP2 EQ PUSH2 0x57A3 JUMPI PUSH1 0x0 DUP4 ISZERO PUSH2 0x578B JUMPI POP DUP5 DUP3 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP6 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP5 SWAP1 SHL OR DUP5 SSTORE PUSH2 0x306F JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP6 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x57D3 JUMPI DUP8 DUP6 ADD MLOAD DUP3 SSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x57B3 JUMP JUMPDEST POP DUP5 DUP3 LT ISZERO PUSH2 0x57F1 JUMPI DUP7 DUP5 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP8 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE DUP2 DUP4 PUSH1 0x40 DUP4 ADD CALLDATACOPY PUSH1 0x0 DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH1 0x1F NOT AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x12B8 JUMPI PUSH2 0x12B8 PUSH2 0x582F JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5885 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x589F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x34BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP5 DUP3 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD PUSH1 0x0 DUP2 MSTORE DUP4 MLOAD PUSH2 0x58D1 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x5197 JUMP JUMPDEST ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 DUP2 LT PUSH2 0x590F JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x12B8 DUP3 DUP5 PUSH2 0x58F1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5934 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x5972 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x598D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5999 DUP8 DUP3 DUP9 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST DUP1 MLOAD PUSH2 0x5026 DUP2 PUSH2 0x505C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x5026 DUP2 PUSH2 0x59B0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x59E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 PUSH2 0x59EF PUSH2 0x5545 JUMP JUMPDEST DUP4 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x5A13 PUSH1 0x60 DUP6 ADD PUSH2 0x59A5 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x5A24 PUSH1 0x80 DUP6 ADD PUSH2 0x59C5 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x5A35 PUSH1 0xA0 DUP6 ADD PUSH2 0x59C5 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x5A46 PUSH1 0xC0 DUP6 ADD PUSH2 0x59A5 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x5A57 PUSH1 0xE0 DUP6 ADD PUSH2 0x59C5 JUMP JUMPDEST PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x120 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5A8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5AA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x186C DUP2 PUSH2 0x505C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5AC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x186C DUP2 PUSH2 0x59B0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x12B8 JUMPI PUSH2 0x12B8 PUSH2 0x582F JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x5B0E DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5197 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x5026 DUP2 PUSH2 0x59B0 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5026 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5B4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5B63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x40 DUP2 DUP7 SUB SLT ISZERO PUSH2 0x5B75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5B7D PUSH2 0x556E JUMP JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5B93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH1 0xE0 DUP2 DUP9 SUB SLT ISZERO PUSH2 0x5BA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BAD PUSH2 0x5590 JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH2 0x5BBD PUSH1 0x20 DUP4 ADD PUSH2 0x501B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x5BCE PUSH1 0x40 DUP4 ADD PUSH2 0x501B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x5BDF PUSH1 0x60 DUP4 ADD PUSH2 0x501B JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x5BF0 PUSH1 0x80 DUP4 ADD PUSH2 0x5B18 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x5C01 PUSH1 0xA0 DUP4 ADD PUSH2 0x5B23 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5C1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5C2B DUP10 DUP3 DUP6 ADD PUSH2 0x55B2 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP DUP3 MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5C4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5C59 DUP8 DUP3 DUP6 ADD PUSH2 0x55B2 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP8 SWAP6 SWAP1 SWAP2 ADD CALLDATALOAD SWAP6 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x5C7B DUP2 DUP6 PUSH2 0x58F1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x5C91 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x51BB JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x12B8 JUMPI PUSH2 0x12B8 PUSH2 0x582F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x5CCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x5CD8 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5D06 DUP7 DUP3 DUP8 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x80 DUP2 MSTORE PUSH1 0x0 PUSH2 0x5D23 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x51BB JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 SWAP1 SWAP6 MSTORE POP PUSH1 0x40 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5D52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x515C DUP2 PUSH2 0x5006 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x5D74 JUMPI PUSH2 0x5D74 PUSH2 0x582F JUMP JUMPDEST POP PUSH1 0x0 NOT ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x5D8E JUMPI PUSH2 0x5D8E PUSH2 0x582F JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP5 MLOAD PUSH1 0x40 DUP4 DUP4 ADD DUP2 SWAP1 MSTORE DUP2 MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0xC0 DUP7 ADD MSTORE SWAP1 DUP3 ADD MLOAD DUP2 AND PUSH1 0xE0 DUP6 ADD MSTORE SWAP2 DUP2 ADD MLOAD SWAP1 SWAP2 AND PUSH2 0x100 DUP4 ADD MSTORE PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND PUSH2 0x120 DUP5 ADD MSTORE PUSH1 0x0 SWAP2 SWAP1 POP PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND PUSH2 0x140 DUP6 ADD MSTORE POP PUSH1 0xC0 ADD MLOAD PUSH1 0xE0 PUSH2 0x160 DUP5 ADD MSTORE PUSH2 0x5E4B PUSH2 0x180 DUP5 ADD DUP3 PUSH2 0x51BB JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x5F NOT DUP5 DUP4 SUB ADD PUSH1 0x80 DUP6 ADD MSTORE PUSH2 0x5E68 DUP3 DUP3 PUSH2 0x51BB JUMP JUMPDEST SWAP3 POP POP POP DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3335 PUSH1 0x40 DUP4 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD PUSH2 0x3335 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x58F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x5EBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xA0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5EE5 JUMPI PUSH2 0x5EE5 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 SWAP1 DUP2 MSTORE DUP5 MLOAD DUP3 MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD SWAP1 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE DUP5 PUSH1 0x40 DUP3 ADD MSTORE DUP4 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0xC0 PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x5F6E PUSH1 0xC0 DUP4 ADD DUP6 PUSH2 0x51BB JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0xA0 DUP4 ADD MSTORE SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x5F9E JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB8 TSTORE 0xE9 SELFBALANCE LOG2 0xAD CALL MSTORE8 0xB4 0xD5 0xD6 PUSH4 0x60454C8D MOD 0x24 0xBC 0xA9 SWAP9 0xD3 0xFC DUP16 SLT 0xBD OR 0xE3 SAR PUSH21 0x127864736F6C634300081B00330000000000000000 ", + "sourceMap": "1972:23938:57:-:0;;;3174:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3367:4;3374:14;3390:19;3411:8;3332:15;;-1:-1:-1;;;;;4355:24:37;;4347:81;;;;-1:-1:-1;;;4347:81:37;;866:2:70;4347:81:37;;;848:21:70;905:2;885:18;;;878:30;-1:-1:-1;;;924:18:70;;;917:40;974:18;;4347:81:37;;;;;;;;;-1:-1:-1;;;;;4439:42:37;;;;4517:40;;;;;;;;;;;;-1:-1:-1;;;4517:40:37;;;;;;:26;:40::i;:::-;-1:-1:-1;;;;;4491:67:37;;;4600:37;;;;;;;;;;;;-1:-1:-1;;;4600:37:37;;;;;;:26;:37::i;:::-;-1:-1:-1;;;;;4568:70:37;;;4680:43;;;;;;;;;;;;-1:-1:-1;;;4680:43:37;;;;;;:26;:43::i;:::-;-1:-1:-1;;;;;4648:76:37;;;4774:44;;;;;;;;;;;;-1:-1:-1;;;4774:44:37;;;;;;:26;:44::i;:::-;-1:-1:-1;;;;;4734:85:37;;;4865:42;;;;;;;;;;;;-1:-1:-1;;;4865:42:37;;;;;;:26;:42::i;:::-;-1:-1:-1;;;;;4829:79:37;;;4958:44;;;;;;;;;;;;-1:-1:-1;;;4958:44:37;;;;;;:26;:44::i;:::-;-1:-1:-1;;;;;4918:85:37;;;5049:47;;;;;;;;;;;;-1:-1:-1;;;5049:47:37;;;;;;:26;:47::i;:::-;-1:-1:-1;;;;;5013:84:37;;;5144:45;;;;;;;;;;;;-1:-1:-1;;;5144:45:37;;;;;;:26;:45::i;:::-;-1:-1:-1;;;;;5107:83:37;;;5227:38;;;;;;;;;;;;-1:-1:-1;;;5227:38:37;;;;;;:26;:38::i;:::-;-1:-1:-1;;;;;5200:66:37;;;;;;;5480:16;;5363:13;;5329:11;;5399:14;;5436:21;;5519:19;;5561:21;;5605:19;;5647:17;;5282:430;;;;;;;;;;;;;;;;;;;5647:17;;-1:-1:-1;;;;;1336:32:70;;;1318:51;;1405:32;;;1400:2;1385:18;;1378:60;1474:32;;;1469:2;1454:18;;1447:60;1543:32;;;1538:2;1523:18;;1516:60;1613:32;;1607:3;1592:19;;1585:61;1683:32;;1356:3;1662:19;;1655:61;1753:32;;;1747:3;1732:19;;1725:61;1305:3;1290:19;;1003:789;5282:430:37;;;;;;;;-1:-1:-1;;;;;;;2913:52:69;;;;;;;2975:49;;;;;;;3034:65;;;;;;;3109:30;;;;;;;3155:99;;;2028:51:70;;;2110:2;2095:18;;2088:60;;;;2164:18;;;2157:60;;;;2248:2;2233:18;;2226:60;;;;3155:99:69;;2015:3:70;2000:19;3155:99:69;;;;;;;2795:466;;;;3431:22:57::2;:20;;;:22;;:::i;:::-;3174:286:::0;;;;1972:23938;;8217:326:37;8303:7;8322:23;8348:16;;-1:-1:-1;;;;;8348:33:37;;8392:13;8382:24;;;;;;8348:59;;;;;;;;;;;;;2443:25:70;;2431:2;2416:18;;2297:177;8348:59:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8322:85;-1:-1:-1;8489:13:37;-1:-1:-1;;;;;8425:29:37;;8417:87;;;;-1:-1:-1;;;8417:87:37;;;;;;;;:::i;:::-;-1:-1:-1;8521:15:37;8217:326;-1:-1:-1;;8217:326:37:o;7709:422:39:-;3147:66;7898:15;;;;;;;7894:76;;;7936:23;;-1:-1:-1;;;7936:23:39;;;;;;;;;;;7894:76;7983:14;;-1:-1:-1;;;;;7983:14:39;;;:34;7979:146;;8033:33;;-1:-1:-1;;;;;;8033:33:39;-1:-1:-1;;;;;8033:33:39;;;;;8085:29;;3366:50:70;;;8085:29:39;;3354:2:70;3339:18;8085:29:39;;;;;;;7979:146;7758:373;7709:422::o;14:177:70:-;93:13;;-1:-1:-1;;;;;135:31:70;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:464::-;293:6;301;309;317;370:3;358:9;349:7;345:23;341:33;338:53;;;387:1;384;377:12;338:53;410:40;440:9;410:40;:::i;:::-;400:50;;469:49;514:2;503:9;499:18;469:49;:::i;:::-;459:59;;537:49;582:2;571:9;567:18;537:49;:::i;:::-;527:59;;605:49;650:2;639:9;635:18;605:49;:::i;:::-;595:59;;196:464;;;;;;;:::o;2479:208::-;2549:6;2602:2;2590:9;2581:7;2577:23;2573:32;2570:52;;;2618:1;2615;2608:12;2570:52;2641:40;2671:9;2641:40;:::i;:::-;2631:50;2479:208;-1:-1:-1;;;2479:208:70:o;2692:525::-;2839:2;2828:9;2821:21;2802:4;2871:6;2865:13;2914:6;2909:2;2898:9;2894:18;2887:34;2939:1;2949:140;2963:6;2960:1;2957:13;2949:140;;;3074:2;3058:14;;;3054:23;;3048:30;3043:2;3024:17;;;3020:26;3013:66;2978:10;2949:140;;;2953:3;3138:1;3133:2;3124:6;3113:9;3109:22;3105:31;3098:42;3208:2;3201;3197:7;3192:2;3184:6;3180:15;3176:29;3165:9;3161:45;3157:54;3149:62;;;2692:525;;;;:::o;3222:200::-;1972:23938:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@_EIP712NameHash_5991": { + "entryPoint": 20033, + "id": 5991, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_EIP712Name_5923": { + "entryPoint": 10161, + "id": 5923, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_EIP712VersionHash_6043": { + "entryPoint": 20136, + "id": 6043, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_EIP712Version_5939": { + "entryPoint": 10322, + "id": 5939, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@__AllocationManager_init_16649": { + "entryPoint": 12142, + "id": 16649, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@__AllocationManager_init_unchained_16656": { + "entryPoint": null, + "id": 16656, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__DataServicePausable_init_1384": { + "entryPoint": 12126, + "id": 1384, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__DataServicePausable_init_unchained_1391": { + "entryPoint": null, + "id": 1391, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__DataService_init_928": { + "entryPoint": 12102, + "id": 928, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__DataService_init_unchained_935": { + "entryPoint": null, + "id": 935, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__EIP712_init_5757": { + "entryPoint": 17375, + "id": 5757, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@__EIP712_init_unchained_5797": { + "entryPoint": 19538, + "id": 5797, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@__Multicall_init_5456": { + "entryPoint": 12094, + "id": 5456, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__Ownable_init_4983": { + "entryPoint": 12077, + "id": 4983, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@__Ownable_init_unchained_5010": { + "entryPoint": 17301, + "id": 5010, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@__Pausable_init_unchained_5610": { + "entryPoint": null, + "id": 5610, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@__ProvisionManager_init_unchained_2024": { + "entryPoint": 17309, + "id": 2024, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_acceptProvisionParameters_2042": { + "entryPoint": 12291, + "id": 2042, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_allocate_16781": { + "entryPoint": 12517, + "id": 16781, + "parameterSlots": 6, + "returnSlots": 0 + }, + "@_buildDomainSeparator_5830": { + "entryPoint": 19655, + "id": 5830, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_buildStakeClaimId_1277": { + "entryPoint": null, + "id": 1277, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_checkInitializing_5299": { + "entryPoint": 17264, + "id": 5299, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_checkOwner_5051": { + "entryPoint": 6883, + "id": 5051, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_checkProvisionParameters_2226": { + "entryPoint": 17393, + "id": 2226, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_checkProvisionParameters_2282": { + "entryPoint": 7374, + "id": 2282, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_checkProvisionTokens_2203": { + "entryPoint": 7312, + "id": 2203, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_checkValueInRange_2394": { + "entryPoint": 13148, + "id": 2394, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@_closeAllocation_17273": { + "entryPoint": 8823, + "id": 17273, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_collectIndexingRewards_14812": { + "entryPoint": 11805, + "id": 14812, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@_collectQueryFees_14759": { + "entryPoint": 10505, + "id": 14759, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@_contextSuffixLength_5436": { + "entryPoint": null, + "id": 5436, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_curation_17719": { + "entryPoint": 12000, + "id": 17719, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_deleteStakeClaim_1211": { + "entryPoint": 13509, + "id": 1211, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_disputeManager_17699": { + "entryPoint": 12255, + "id": 17699, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_domainSeparatorV4_5807": { + "entryPoint": 19603, + "id": 5807, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_encodeAllocationProof_17310": { + "entryPoint": 12406, + "id": 17310, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_encodeGraphTallyData_14878": { + "entryPoint": 14982, + "id": 14878, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_getDelegationRatio_2291": { + "entryPoint": null, + "id": 2291, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getEIP712Storage_5741": { + "entryPoint": 10125, + "id": 5741, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getInitializableStorage_5390": { + "entryPoint": 12036, + "id": 5390, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getNextStakeClaim_1254": { + "entryPoint": 13237, + "id": 1254, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_getOwnableStorage_4954": { + "entryPoint": 10351, + "id": 4954, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getPausableStorage_5566": { + "entryPoint": 8307, + "id": 5566, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_getProvisionTokensRange_2304": { + "entryPoint": null, + "id": 2304, + "parameterSlots": 0, + "returnSlots": 2 + }, + "@_getProvision_2367": { + "entryPoint": 7053, + "id": 2367, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_getStakeClaim_1240": { + "entryPoint": 18221, + "id": 1240, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_getThawingPeriodRange_14505": { + "entryPoint": 8435, + "id": 14505, + "parameterSlots": 0, + "returnSlots": 2 + }, + "@_getVerifierCutRange_14522": { + "entryPoint": 8157, + "id": 14522, + "parameterSlots": 0, + "returnSlots": 2 + }, + "@_get_16032": { + "entryPoint": 13907, + "id": 16032, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_graphEpochManager_4855": { + "entryPoint": 17786, + "id": 4855, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_graphRewardsManager_4865": { + "entryPoint": 14086, + "id": 4865, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_graphStaking_4815": { + "entryPoint": 7017, + "id": 4815, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_graphTallyCollector_17709": { + "entryPoint": 13020, + "id": 17709, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_graphToken_4805": { + "entryPoint": 14946, + "id": 4805, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_hashTypedDataV4_5846": { + "entryPoint": 17416, + "id": 5846, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_initializableStorageSlot_5376": { + "entryPoint": null, + "id": 5376, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_isInitializing_5367": { + "entryPoint": 19162, + "id": 5367, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_isOverAllocated_17330": { + "entryPoint": 11969, + "id": 17330, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_lockStake_1074": { + "entryPoint": 15066, + "id": 1074, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_migrateLegacyAllocation_16681": { + "entryPoint": 8607, + "id": 16681, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_msgSender_5419": { + "entryPoint": null, + "id": 5419, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@_pause_5675": { + "entryPoint": 10054, + "id": 5675, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_presentPOI_17044": { + "entryPoint": 15609, + "id": 17044, + "parameterSlots": 5, + "returnSlots": 1 + }, + "@_processStakeClaim_1199": { + "entryPoint": 13258, + "id": 1199, + "parameterSlots": 2, + "returnSlots": 2 + }, + "@_releaseStake_1121": { + "entryPoint": 7991, + "id": 1121, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_requireNotPaused_5638": { + "entryPoint": 7608, + "id": 5638, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_requirePaused_5651": { + "entryPoint": 13200, + "id": 5651, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_resizeAllocation_17203": { + "entryPoint": 9177, + "id": 17203, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_revert_6406": { + "entryPoint": 18513, + "id": 6406, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setDelegationRatio_2057": { + "entryPoint": 6933, + "id": 2057, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setMaxPOIStaleness_17288": { + "entryPoint": 8554, + "id": 17288, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setPauseGuardian_1424": { + "entryPoint": 7733, + "id": 1424, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_setPaymentsDestination_14832": { + "entryPoint": 7646, + "id": 14832, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_setProvisionTokensRange_2089": { + "entryPoint": 9943, + "id": 2089, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_setStakeToFeesRatio_14855": { + "entryPoint": 12168, + "id": 14855, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_setThawingPeriodRange_2164": { + "entryPoint": 19397, + "id": 2164, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_setVerifierCutRange_2132": { + "entryPoint": 19188, + "id": 2132, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_throwError_8230": { + "entryPoint": 19848, + "id": 8230, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@_transferOwnership_5122": { + "entryPoint": 8343, + "id": 5122, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@_unpause_5699": { + "entryPoint": 7915, + "id": 5699, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_verifyAllocationProof_17362": { + "entryPoint": 17461, + "id": 17362, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@acceptProvisionPendingParameters_13875": { + "entryPoint": 6007, + "id": 13875, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@addTail_4172": { + "entryPoint": 18554, + "id": 4172, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@allocationProvisionTracker_17387": { + "entryPoint": null, + "id": 17387, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@check_1800": { + "entryPoint": 17110, + "id": 1800, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@claimsLists_1302": { + "entryPoint": null, + "id": 1302, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@claims_1296": { + "entryPoint": null, + "id": 1296, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@clearPendingRewards_15855": { + "entryPoint": 18883, + "id": 15855, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@closeStaleAllocation_14144": { + "entryPoint": 6694, + "id": 14144, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@close_15893": { + "entryPoint": 14301, + "id": 15893, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@collect_14055": { + "entryPoint": 4798, + "id": 14055, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@create_15741": { + "entryPoint": 17822, + "id": 15741, + "parameterSlots": 7, + "returnSlots": 1 + }, + "@curationFeesCut_14896": { + "entryPoint": null, + "id": 14896, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@eip712Domain_5907": { + "entryPoint": 4370, + "id": 5907, + "parameterSlots": 0, + "returnSlots": 7 + }, + "@encodeAllocationProof_14469": { + "entryPoint": 6240, + "id": 14469, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@exists_15961": { + "entryPoint": null, + "id": 15961, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@exists_16428": { + "entryPoint": 18498, + "id": 16428, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@feesProvisionTracker_1290": { + "entryPoint": null, + "id": 1290, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@functionDelegateCall_6324": { + "entryPoint": 10387, + "id": 6324, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@getAllocationData_14381": { + "entryPoint": 3104, + "id": 14381, + "parameterSlots": 1, + "returnSlots": 6 + }, + "@getAllocation_14337": { + "entryPoint": 1962, + "id": 14337, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@getCuration_14452": { + "entryPoint": 5296, + "id": 14452, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@getDelegationRatio_915": { + "entryPoint": null, + "id": 915, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@getDisputeManager_14424": { + "entryPoint": 6259, + "id": 14424, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@getGraphTallyCollector_14438": { + "entryPoint": 6684, + "id": 14438, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@getLegacyAllocation_14410": { + "entryPoint": null, + "id": 14410, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@getProvisionTokensRange_905": { + "entryPoint": 3908, + "id": 905, + "parameterSlots": 0, + "returnSlots": 2 + }, + "@getSubgraphAllocatedTokens_14395": { + "entryPoint": null, + "id": 14395, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@getThawingPeriodRange_881": { + "entryPoint": 3341, + "id": 881, + "parameterSlots": 0, + "returnSlots": 2 + }, + "@getVerifierCutRange_893": { + "entryPoint": 2777, + "id": 893, + "parameterSlots": 0, + "returnSlots": 2 + }, + "@get_15913": { + "entryPoint": 8690, + "id": 15913, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@indexers_14890": { + "entryPoint": 2796, + "id": 14890, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@initialize_13752": { + "entryPoint": 5306, + "id": 13752, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@isAltruistic_15999": { + "entryPoint": 13117, + "id": 15999, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@isInRange_4563": { + "entryPoint": 18198, + "id": 4563, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@isOpen_15980": { + "entryPoint": 8276, + "id": 15980, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@isOverAllocated_14484": { + "entryPoint": 5266, + "id": 14484, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@isStale_15946": { + "entryPoint": 13056, + "id": 15946, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@isValidPPM_4538": { + "entryPoint": null, + "id": 4538, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@lock_1726": { + "entryPoint": 14609, + "id": 1726, + "parameterSlots": 5, + "returnSlots": 0 + }, + "@maxPOIStaleness_17390": { + "entryPoint": null, + "id": 17390, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@max_8625": { + "entryPoint": 18182, + "id": 8625, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@migrateLegacyAllocation_14206": { + "entryPoint": 3369, + "id": 14206, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@migrate_16352": { + "entryPoint": 13732, + "id": 16352, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@mulPPM_4496": { + "entryPoint": 19066, + "id": 4496, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@multicall_5539": { + "entryPoint": 4566, + "id": 5539, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@owner_5034": { + "entryPoint": 4539, + "id": 5034, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@pauseGuardians_1328": { + "entryPoint": null, + "id": 1328, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@pause_1360": { + "entryPoint": 4312, + "id": 1360, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@paused_5626": { + "entryPoint": 3292, + "id": 5626, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@paymentsDestination_14901": { + "entryPoint": null, + "id": 14901, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@presentPOI_15779": { + "entryPoint": 18701, + "id": 15779, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@pushTokens_818": { + "entryPoint": 15434, + "id": 818, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@recover_7987": { + "entryPoint": 19613, + "id": 7987, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@register_13852": { + "entryPoint": 2128, + "id": 13852, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@releaseStake_987": { + "entryPoint": 2767, + "id": 987, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@release_1764": { + "entryPoint": 14483, + "id": 1764, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@removeHead_4246": { + "entryPoint": 18363, + "id": 4246, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@renounceOwnership_5065": { + "entryPoint": 3323, + "id": 5065, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@resizeAllocation_14186": { + "entryPoint": 3924, + "id": 14186, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@revertIfExists_16410": { + "entryPoint": 17540, + "id": 16410, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@setCurationCut_14322": { + "entryPoint": 3393, + "id": 14322, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setDelegationRatio_14266": { + "entryPoint": 2103, + "id": 14266, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setMaxPOIStaleness_14294": { + "entryPoint": 3352, + "id": 14294, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setMinimumProvisionTokens_14252": { + "entryPoint": 4292, + "id": 14252, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setPauseGuardian_14223": { + "entryPoint": 2685, + "id": 14223, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@setPaymentsDestination_14237": { + "entryPoint": 3313, + "id": 14237, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@setStakeToFeesRatio_14280": { + "entryPoint": 6667, + "id": 14280, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@slash_14099": { + "entryPoint": 5688, + "id": 14099, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@snapshotRewards_15818": { + "entryPoint": 14122, + "id": 15818, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@stakeToFeesRatio_14893": { + "entryPoint": null, + "id": 14893, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@startService_13932": { + "entryPoint": 6269, + "id": 13932, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@stopService_13984": { + "entryPoint": 3510, + "id": 13984, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@ternary_8606": { + "entryPoint": null, + "id": 8606, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@toTypedDataHash_8316": { + "entryPoint": null, + "id": 8316, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@toUint_11702": { + "entryPoint": null, + "id": 11702, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@transferOwnership_5093": { + "entryPoint": 6824, + "id": 5093, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@traverse_4363": { + "entryPoint": 13546, + "id": 4363, + "parameterSlots": 6, + "returnSlots": 2 + }, + "@tryRecover_7957": { + "entryPoint": 19771, + "id": 7957, + "parameterSlots": 2, + "returnSlots": 3 + }, + "@tryRecover_8145": { + "entryPoint": 20201, + "id": 8145, + "parameterSlots": 4, + "returnSlots": 3 + }, + "@unpause_1371": { + "entryPoint": 2707, + "id": 1371, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@verifyCallResultFromTarget_6364": { + "entryPoint": 14863, + "id": 6364, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_address": { + "entryPoint": 20507, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 20619, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_string": { + "entryPoint": 21938, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address": { + "entryPoint": 20523, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address_payable": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address_payablet_bytes32t_bytes_memory_ptr": { + "entryPoint": 23736, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_addresst_address": { + "entryPoint": 21671, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_addresst_addresst_bytes32": { + "entryPoint": 21046, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_addresst_addresst_uint256": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_addresst_bool": { + "entryPoint": 20782, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_addresst_bytes_calldata_ptr": { + "entryPoint": 20684, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_addresst_enum$_PaymentTypes_$2433t_bytes_calldata_ptr": { + "entryPoint": 21495, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_addresst_uint256t_uint32t_uint256": { + "entryPoint": 21599, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr": { + "entryPoint": 21277, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_bool_fromMemory": { + "entryPoint": 21752, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32t_uint256t_address_payablet_bytes_memory_ptr": { + "entryPoint": 22851, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_string_memory_ptrt_string_memory_ptrt_address_payable": { + "entryPoint": 22086, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_struct$_DelegationPool_$3992_memory_ptr_fromMemory": { + "entryPoint": 24236, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_Provision_$3962_memory_ptr_fromMemory": { + "entryPoint": 22992, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_struct$_SignedRAV_$2525_memory_ptrt_uint256": { + "entryPoint": 23354, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 20839, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 23165, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_address_payable_fromMemory": { + "entryPoint": 23871, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_uint256t_uint256": { + "entryPoint": 22817, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_uint32": { + "entryPoint": 20590, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint32_fromMemory": { + "entryPoint": 23190, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint64_fromMemory": { + "entryPoint": 23219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint128": { + "entryPoint": 23331, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_uint32_fromMemory": { + "entryPoint": 22949, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_uint64": { + "entryPoint": 23320, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_uint64_fromMemory": { + "entryPoint": 22981, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_enum_PaymentTypes": { + "entryPoint": 22769, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_string": { + "entryPoint": 20923, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_bytes_calldata_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed": { + "entryPoint": 22708, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed": { + "entryPoint": 23292, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": 20552, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed": { + "entryPoint": 21781, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_address__to_t_address_t_address_t_address__fromStack_reversed": { + "entryPoint": 21717, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_enum$_PaymentTypes_$2433__to_t_address_t_address_t_uint8__fromStack_reversed": { + "entryPoint": 24199, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed": { + "entryPoint": 24351, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address_t_uint32__to_t_address_t_address_t_uint32__fromStack_reversed": { + "entryPoint": 23957, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_bool__to_t_address_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed": { + "entryPoint": 23248, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_uint256_t_uint256_t_address__to_t_address_t_uint256_t_uint256_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr__to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 21394, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool_t_address_t_bytes32_t_uint256_t_uint256_t_uint256__to_t_bool_t_address_t_bytes32_t_uint256_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 7, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__to_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 21125, + "id": null, + "parameterSlots": 8, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_address_t_address__to_t_bytes32_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_uint256__to_t_bytes32_t_bytes32_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint256__to_t_bytes32_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint256_t_uint256__to_t_bytes32_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 22528, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 23824, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_enum$_PaymentTypes_$2433__to_t_uint8__fromStack_reversed": { + "entryPoint": 22803, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_enum$_PaymentTypes_$2433_t_bytes_memory_ptr_t_uint256__to_t_uint8_t_bytes_memory_ptr_t_uint256__fromStack_reversed": { + "entryPoint": 23665, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_rational_0_by_1_t_address__to_t_uint8_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_rational_1_by_1__to_t_uint64__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_2e5045ff73280aa8e8acd8c82710f23812497f87f7f576e2220a2ddd0d45eade__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_struct$_SignedRAV_$2525_memory_ptr_t_uint256_t_address__to_t_struct$_SignedRAV_$2525_memory_ptr_t_uint256_t_address__fromStack_reversed": { + "entryPoint": 23998, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_struct$_State_$15663_memory_ptr__to_t_struct$_State_$15663_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_struct$_State_$16305_memory_ptr__to_t_struct$_State_$16305_memory_ptr__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_address__to_t_uint256_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_bool__to_t_uint256_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_string_memory_ptr_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 20967, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 21111, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256__to_t_uint256_t_uint256_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256__fromStack_reversed": { + "entryPoint": 24387, + "id": null, + "parameterSlots": 7, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint32_t_uint32__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint32_t_uint32__to_t_uint32_t_uint32__fromStack_reversed": { + "entryPoint": 20864, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint64_t_uint64__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint64_t_uint64__to_t_uint64_t_uint64__fromStack_reversed": { + "entryPoint": 21020, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_uint128": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_uint64": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "access_calldata_tail_t_bytes_calldata_ptr": { + "entryPoint": 22638, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "allocate_memory": { + "entryPoint": 21904, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_memory_4297": { + "entryPoint": 21829, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_memory_4301": { + "entryPoint": 21870, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_dataslot_string_storage": { + "entryPoint": null, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "calldata_array_index_range_access_t_bytes_calldata_ptr": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 2 + }, + "checked_add_t_uint256": { + "entryPoint": 23273, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_div_t_uint256": { + "entryPoint": 24449, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_mul_t_uint256": { + "entryPoint": 23713, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_sub_t_uint256": { + "entryPoint": 22597, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "clean_up_bytearray_end_slots_string_storage": { + "entryPoint": 22267, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage": { + "entryPoint": 22338, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "copy_memory_to_memory_with_cleanup": { + "entryPoint": 20887, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "decrement_t_uint256": { + "entryPoint": 23909, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_byte_array_length": { + "entryPoint": 22209, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_used_part_and_set_length_of_short_byte_array": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "increment_t_uint256": { + "entryPoint": 23932, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 22575, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x21": { + "entryPoint": 22747, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 22616, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 21807, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 20486, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bool": { + "entryPoint": 20768, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint32": { + "entryPoint": 20572, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint64": { + "entryPoint": 22960, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nativeSrc": "0:40736:70", + "nodeType": "YulBlock", + "src": "0:40736:70", + "statements": [ + { + "nativeSrc": "6:3:70", + "nodeType": "YulBlock", + "src": "6:3:70", + "statements": [] + }, + { + "body": { + "nativeSrc": "59:86:70", + "nodeType": "YulBlock", + "src": "59:86:70", + "statements": [ + { + "body": { + "nativeSrc": "123:16:70", + "nodeType": "YulBlock", + "src": "123:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "132:1:70", + "nodeType": "YulLiteral", + "src": "132:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "135:1:70", + "nodeType": "YulLiteral", + "src": "135:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "125:6:70", + "nodeType": "YulIdentifier", + "src": "125:6:70" + }, + "nativeSrc": "125:12:70", + "nodeType": "YulFunctionCall", + "src": "125:12:70" + }, + "nativeSrc": "125:12:70", + "nodeType": "YulExpressionStatement", + "src": "125:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "82:5:70", + "nodeType": "YulIdentifier", + "src": "82:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "93:5:70", + "nodeType": "YulIdentifier", + "src": "93:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "108:3:70", + "nodeType": "YulLiteral", + "src": "108:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "113:1:70", + "nodeType": "YulLiteral", + "src": "113:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "104:3:70", + "nodeType": "YulIdentifier", + "src": "104:3:70" + }, + "nativeSrc": "104:11:70", + "nodeType": "YulFunctionCall", + "src": "104:11:70" + }, + { + "kind": "number", + "nativeSrc": "117:1:70", + "nodeType": "YulLiteral", + "src": "117:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "100:3:70", + "nodeType": "YulIdentifier", + "src": "100:3:70" + }, + "nativeSrc": "100:19:70", + "nodeType": "YulFunctionCall", + "src": "100:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "89:3:70", + "nodeType": "YulIdentifier", + "src": "89:3:70" + }, + "nativeSrc": "89:31:70", + "nodeType": "YulFunctionCall", + "src": "89:31:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "79:2:70", + "nodeType": "YulIdentifier", + "src": "79:2:70" + }, + "nativeSrc": "79:42:70", + "nodeType": "YulFunctionCall", + "src": "79:42:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "72:6:70", + "nodeType": "YulIdentifier", + "src": "72:6:70" + }, + "nativeSrc": "72:50:70", + "nodeType": "YulFunctionCall", + "src": "72:50:70" + }, + "nativeSrc": "69:70:70", + "nodeType": "YulIf", + "src": "69:70:70" + } + ] + }, + "name": "validator_revert_address", + "nativeSrc": "14:131:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "48:5:70", + "nodeType": "YulTypedName", + "src": "48:5:70", + "type": "" + } + ], + "src": "14:131:70" + }, + { + "body": { + "nativeSrc": "199:85:70", + "nodeType": "YulBlock", + "src": "199:85:70", + "statements": [ + { + "nativeSrc": "209:29:70", + "nodeType": "YulAssignment", + "src": "209:29:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "231:6:70", + "nodeType": "YulIdentifier", + "src": "231:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "218:12:70", + "nodeType": "YulIdentifier", + "src": "218:12:70" + }, + "nativeSrc": "218:20:70", + "nodeType": "YulFunctionCall", + "src": "218:20:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "209:5:70", + "nodeType": "YulIdentifier", + "src": "209:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "272:5:70", + "nodeType": "YulIdentifier", + "src": "272:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "247:24:70", + "nodeType": "YulIdentifier", + "src": "247:24:70" + }, + "nativeSrc": "247:31:70", + "nodeType": "YulFunctionCall", + "src": "247:31:70" + }, + "nativeSrc": "247:31:70", + "nodeType": "YulExpressionStatement", + "src": "247:31:70" + } + ] + }, + "name": "abi_decode_address", + "nativeSrc": "150:134:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "178:6:70", + "nodeType": "YulTypedName", + "src": "178:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "189:5:70", + "nodeType": "YulTypedName", + "src": "189:5:70", + "type": "" + } + ], + "src": "150:134:70" + }, + { + "body": { + "nativeSrc": "359:177:70", + "nodeType": "YulBlock", + "src": "359:177:70", + "statements": [ + { + "body": { + "nativeSrc": "405:16:70", + "nodeType": "YulBlock", + "src": "405:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "414:1:70", + "nodeType": "YulLiteral", + "src": "414:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "417:1:70", + "nodeType": "YulLiteral", + "src": "417:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "407:6:70", + "nodeType": "YulIdentifier", + "src": "407:6:70" + }, + "nativeSrc": "407:12:70", + "nodeType": "YulFunctionCall", + "src": "407:12:70" + }, + "nativeSrc": "407:12:70", + "nodeType": "YulExpressionStatement", + "src": "407:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "380:7:70", + "nodeType": "YulIdentifier", + "src": "380:7:70" + }, + { + "name": "headStart", + "nativeSrc": "389:9:70", + "nodeType": "YulIdentifier", + "src": "389:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "376:3:70", + "nodeType": "YulIdentifier", + "src": "376:3:70" + }, + "nativeSrc": "376:23:70", + "nodeType": "YulFunctionCall", + "src": "376:23:70" + }, + { + "kind": "number", + "nativeSrc": "401:2:70", + "nodeType": "YulLiteral", + "src": "401:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "372:3:70", + "nodeType": "YulIdentifier", + "src": "372:3:70" + }, + "nativeSrc": "372:32:70", + "nodeType": "YulFunctionCall", + "src": "372:32:70" + }, + "nativeSrc": "369:52:70", + "nodeType": "YulIf", + "src": "369:52:70" + }, + { + "nativeSrc": "430:36:70", + "nodeType": "YulVariableDeclaration", + "src": "430:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "456:9:70", + "nodeType": "YulIdentifier", + "src": "456:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "443:12:70", + "nodeType": "YulIdentifier", + "src": "443:12:70" + }, + "nativeSrc": "443:23:70", + "nodeType": "YulFunctionCall", + "src": "443:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "434:5:70", + "nodeType": "YulTypedName", + "src": "434:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "500:5:70", + "nodeType": "YulIdentifier", + "src": "500:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "475:24:70", + "nodeType": "YulIdentifier", + "src": "475:24:70" + }, + "nativeSrc": "475:31:70", + "nodeType": "YulFunctionCall", + "src": "475:31:70" + }, + "nativeSrc": "475:31:70", + "nodeType": "YulExpressionStatement", + "src": "475:31:70" + }, + { + "nativeSrc": "515:15:70", + "nodeType": "YulAssignment", + "src": "515:15:70", + "value": { + "name": "value", + "nativeSrc": "525:5:70", + "nodeType": "YulIdentifier", + "src": "525:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "515:6:70", + "nodeType": "YulIdentifier", + "src": "515:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address", + "nativeSrc": "289:247:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "325:9:70", + "nodeType": "YulTypedName", + "src": "325:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "336:7:70", + "nodeType": "YulTypedName", + "src": "336:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "348:6:70", + "nodeType": "YulTypedName", + "src": "348:6:70", + "type": "" + } + ], + "src": "289:247:70" + }, + { + "body": { + "nativeSrc": "585:60:70", + "nodeType": "YulBlock", + "src": "585:60:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "602:3:70", + "nodeType": "YulIdentifier", + "src": "602:3:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "611:5:70", + "nodeType": "YulIdentifier", + "src": "611:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "626:3:70", + "nodeType": "YulLiteral", + "src": "626:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "631:1:70", + "nodeType": "YulLiteral", + "src": "631:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "622:3:70", + "nodeType": "YulIdentifier", + "src": "622:3:70" + }, + "nativeSrc": "622:11:70", + "nodeType": "YulFunctionCall", + "src": "622:11:70" + }, + { + "kind": "number", + "nativeSrc": "635:1:70", + "nodeType": "YulLiteral", + "src": "635:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "618:3:70", + "nodeType": "YulIdentifier", + "src": "618:3:70" + }, + "nativeSrc": "618:19:70", + "nodeType": "YulFunctionCall", + "src": "618:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "607:3:70", + "nodeType": "YulIdentifier", + "src": "607:3:70" + }, + "nativeSrc": "607:31:70", + "nodeType": "YulFunctionCall", + "src": "607:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "595:6:70", + "nodeType": "YulIdentifier", + "src": "595:6:70" + }, + "nativeSrc": "595:44:70", + "nodeType": "YulFunctionCall", + "src": "595:44:70" + }, + "nativeSrc": "595:44:70", + "nodeType": "YulExpressionStatement", + "src": "595:44:70" + } + ] + }, + "name": "abi_encode_address", + "nativeSrc": "541:104:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "569:5:70", + "nodeType": "YulTypedName", + "src": "569:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "576:3:70", + "nodeType": "YulTypedName", + "src": "576:3:70", + "type": "" + } + ], + "src": "541:104:70" + }, + { + "body": { + "nativeSrc": "751:102:70", + "nodeType": "YulBlock", + "src": "751:102:70", + "statements": [ + { + "nativeSrc": "761:26:70", + "nodeType": "YulAssignment", + "src": "761:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "773:9:70", + "nodeType": "YulIdentifier", + "src": "773:9:70" + }, + { + "kind": "number", + "nativeSrc": "784:2:70", + "nodeType": "YulLiteral", + "src": "784:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "769:3:70", + "nodeType": "YulIdentifier", + "src": "769:3:70" + }, + "nativeSrc": "769:18:70", + "nodeType": "YulFunctionCall", + "src": "769:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "761:4:70", + "nodeType": "YulIdentifier", + "src": "761:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "803:9:70", + "nodeType": "YulIdentifier", + "src": "803:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "818:6:70", + "nodeType": "YulIdentifier", + "src": "818:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "834:3:70", + "nodeType": "YulLiteral", + "src": "834:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "839:1:70", + "nodeType": "YulLiteral", + "src": "839:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "830:3:70", + "nodeType": "YulIdentifier", + "src": "830:3:70" + }, + "nativeSrc": "830:11:70", + "nodeType": "YulFunctionCall", + "src": "830:11:70" + }, + { + "kind": "number", + "nativeSrc": "843:1:70", + "nodeType": "YulLiteral", + "src": "843:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "826:3:70", + "nodeType": "YulIdentifier", + "src": "826:3:70" + }, + "nativeSrc": "826:19:70", + "nodeType": "YulFunctionCall", + "src": "826:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "814:3:70", + "nodeType": "YulIdentifier", + "src": "814:3:70" + }, + "nativeSrc": "814:32:70", + "nodeType": "YulFunctionCall", + "src": "814:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "796:6:70", + "nodeType": "YulIdentifier", + "src": "796:6:70" + }, + "nativeSrc": "796:51:70", + "nodeType": "YulFunctionCall", + "src": "796:51:70" + }, + "nativeSrc": "796:51:70", + "nodeType": "YulExpressionStatement", + "src": "796:51:70" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nativeSrc": "650:203:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "720:9:70", + "nodeType": "YulTypedName", + "src": "720:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "731:6:70", + "nodeType": "YulTypedName", + "src": "731:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "742:4:70", + "nodeType": "YulTypedName", + "src": "742:4:70", + "type": "" + } + ], + "src": "650:203:70" + }, + { + "body": { + "nativeSrc": "1007:618:70", + "nodeType": "YulBlock", + "src": "1007:618:70", + "statements": [ + { + "nativeSrc": "1017:27:70", + "nodeType": "YulAssignment", + "src": "1017:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1029:9:70", + "nodeType": "YulIdentifier", + "src": "1029:9:70" + }, + { + "kind": "number", + "nativeSrc": "1040:3:70", + "nodeType": "YulLiteral", + "src": "1040:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1025:3:70", + "nodeType": "YulIdentifier", + "src": "1025:3:70" + }, + "nativeSrc": "1025:19:70", + "nodeType": "YulFunctionCall", + "src": "1025:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "1017:4:70", + "nodeType": "YulIdentifier", + "src": "1017:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1060:9:70", + "nodeType": "YulIdentifier", + "src": "1060:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1081:6:70", + "nodeType": "YulIdentifier", + "src": "1081:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1075:5:70", + "nodeType": "YulIdentifier", + "src": "1075:5:70" + }, + "nativeSrc": "1075:13:70", + "nodeType": "YulFunctionCall", + "src": "1075:13:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "1098:3:70", + "nodeType": "YulLiteral", + "src": "1098:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "1103:1:70", + "nodeType": "YulLiteral", + "src": "1103:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "1094:3:70", + "nodeType": "YulIdentifier", + "src": "1094:3:70" + }, + "nativeSrc": "1094:11:70", + "nodeType": "YulFunctionCall", + "src": "1094:11:70" + }, + { + "kind": "number", + "nativeSrc": "1107:1:70", + "nodeType": "YulLiteral", + "src": "1107:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "1090:3:70", + "nodeType": "YulIdentifier", + "src": "1090:3:70" + }, + "nativeSrc": "1090:19:70", + "nodeType": "YulFunctionCall", + "src": "1090:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "1071:3:70", + "nodeType": "YulIdentifier", + "src": "1071:3:70" + }, + "nativeSrc": "1071:39:70", + "nodeType": "YulFunctionCall", + "src": "1071:39:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1053:6:70", + "nodeType": "YulIdentifier", + "src": "1053:6:70" + }, + "nativeSrc": "1053:58:70", + "nodeType": "YulFunctionCall", + "src": "1053:58:70" + }, + "nativeSrc": "1053:58:70", + "nodeType": "YulExpressionStatement", + "src": "1053:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1131:9:70", + "nodeType": "YulIdentifier", + "src": "1131:9:70" + }, + { + "kind": "number", + "nativeSrc": "1142:4:70", + "nodeType": "YulLiteral", + "src": "1142:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1127:3:70", + "nodeType": "YulIdentifier", + "src": "1127:3:70" + }, + "nativeSrc": "1127:20:70", + "nodeType": "YulFunctionCall", + "src": "1127:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1159:6:70", + "nodeType": "YulIdentifier", + "src": "1159:6:70" + }, + { + "kind": "number", + "nativeSrc": "1167:4:70", + "nodeType": "YulLiteral", + "src": "1167:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1155:3:70", + "nodeType": "YulIdentifier", + "src": "1155:3:70" + }, + "nativeSrc": "1155:17:70", + "nodeType": "YulFunctionCall", + "src": "1155:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1149:5:70", + "nodeType": "YulIdentifier", + "src": "1149:5:70" + }, + "nativeSrc": "1149:24:70", + "nodeType": "YulFunctionCall", + "src": "1149:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1120:6:70", + "nodeType": "YulIdentifier", + "src": "1120:6:70" + }, + "nativeSrc": "1120:54:70", + "nodeType": "YulFunctionCall", + "src": "1120:54:70" + }, + "nativeSrc": "1120:54:70", + "nodeType": "YulExpressionStatement", + "src": "1120:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1194:9:70", + "nodeType": "YulIdentifier", + "src": "1194:9:70" + }, + { + "kind": "number", + "nativeSrc": "1205:4:70", + "nodeType": "YulLiteral", + "src": "1205:4:70", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1190:3:70", + "nodeType": "YulIdentifier", + "src": "1190:3:70" + }, + "nativeSrc": "1190:20:70", + "nodeType": "YulFunctionCall", + "src": "1190:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1222:6:70", + "nodeType": "YulIdentifier", + "src": "1222:6:70" + }, + { + "kind": "number", + "nativeSrc": "1230:4:70", + "nodeType": "YulLiteral", + "src": "1230:4:70", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1218:3:70", + "nodeType": "YulIdentifier", + "src": "1218:3:70" + }, + "nativeSrc": "1218:17:70", + "nodeType": "YulFunctionCall", + "src": "1218:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1212:5:70", + "nodeType": "YulIdentifier", + "src": "1212:5:70" + }, + "nativeSrc": "1212:24:70", + "nodeType": "YulFunctionCall", + "src": "1212:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1183:6:70", + "nodeType": "YulIdentifier", + "src": "1183:6:70" + }, + "nativeSrc": "1183:54:70", + "nodeType": "YulFunctionCall", + "src": "1183:54:70" + }, + "nativeSrc": "1183:54:70", + "nodeType": "YulExpressionStatement", + "src": "1183:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1257:9:70", + "nodeType": "YulIdentifier", + "src": "1257:9:70" + }, + { + "kind": "number", + "nativeSrc": "1268:4:70", + "nodeType": "YulLiteral", + "src": "1268:4:70", + "type": "", + "value": "0x60" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1253:3:70", + "nodeType": "YulIdentifier", + "src": "1253:3:70" + }, + "nativeSrc": "1253:20:70", + "nodeType": "YulFunctionCall", + "src": "1253:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1285:6:70", + "nodeType": "YulIdentifier", + "src": "1285:6:70" + }, + { + "kind": "number", + "nativeSrc": "1293:4:70", + "nodeType": "YulLiteral", + "src": "1293:4:70", + "type": "", + "value": "0x60" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1281:3:70", + "nodeType": "YulIdentifier", + "src": "1281:3:70" + }, + "nativeSrc": "1281:17:70", + "nodeType": "YulFunctionCall", + "src": "1281:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1275:5:70", + "nodeType": "YulIdentifier", + "src": "1275:5:70" + }, + "nativeSrc": "1275:24:70", + "nodeType": "YulFunctionCall", + "src": "1275:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1246:6:70", + "nodeType": "YulIdentifier", + "src": "1246:6:70" + }, + "nativeSrc": "1246:54:70", + "nodeType": "YulFunctionCall", + "src": "1246:54:70" + }, + "nativeSrc": "1246:54:70", + "nodeType": "YulExpressionStatement", + "src": "1246:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1320:9:70", + "nodeType": "YulIdentifier", + "src": "1320:9:70" + }, + { + "kind": "number", + "nativeSrc": "1331:4:70", + "nodeType": "YulLiteral", + "src": "1331:4:70", + "type": "", + "value": "0x80" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1316:3:70", + "nodeType": "YulIdentifier", + "src": "1316:3:70" + }, + "nativeSrc": "1316:20:70", + "nodeType": "YulFunctionCall", + "src": "1316:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1348:6:70", + "nodeType": "YulIdentifier", + "src": "1348:6:70" + }, + { + "kind": "number", + "nativeSrc": "1356:4:70", + "nodeType": "YulLiteral", + "src": "1356:4:70", + "type": "", + "value": "0x80" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1344:3:70", + "nodeType": "YulIdentifier", + "src": "1344:3:70" + }, + "nativeSrc": "1344:17:70", + "nodeType": "YulFunctionCall", + "src": "1344:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1338:5:70", + "nodeType": "YulIdentifier", + "src": "1338:5:70" + }, + "nativeSrc": "1338:24:70", + "nodeType": "YulFunctionCall", + "src": "1338:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1309:6:70", + "nodeType": "YulIdentifier", + "src": "1309:6:70" + }, + "nativeSrc": "1309:54:70", + "nodeType": "YulFunctionCall", + "src": "1309:54:70" + }, + "nativeSrc": "1309:54:70", + "nodeType": "YulExpressionStatement", + "src": "1309:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1383:9:70", + "nodeType": "YulIdentifier", + "src": "1383:9:70" + }, + { + "kind": "number", + "nativeSrc": "1394:4:70", + "nodeType": "YulLiteral", + "src": "1394:4:70", + "type": "", + "value": "0xa0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1379:3:70", + "nodeType": "YulIdentifier", + "src": "1379:3:70" + }, + "nativeSrc": "1379:20:70", + "nodeType": "YulFunctionCall", + "src": "1379:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1411:6:70", + "nodeType": "YulIdentifier", + "src": "1411:6:70" + }, + { + "kind": "number", + "nativeSrc": "1419:4:70", + "nodeType": "YulLiteral", + "src": "1419:4:70", + "type": "", + "value": "0xa0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1407:3:70", + "nodeType": "YulIdentifier", + "src": "1407:3:70" + }, + "nativeSrc": "1407:17:70", + "nodeType": "YulFunctionCall", + "src": "1407:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1401:5:70", + "nodeType": "YulIdentifier", + "src": "1401:5:70" + }, + "nativeSrc": "1401:24:70", + "nodeType": "YulFunctionCall", + "src": "1401:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1372:6:70", + "nodeType": "YulIdentifier", + "src": "1372:6:70" + }, + "nativeSrc": "1372:54:70", + "nodeType": "YulFunctionCall", + "src": "1372:54:70" + }, + "nativeSrc": "1372:54:70", + "nodeType": "YulExpressionStatement", + "src": "1372:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1446:9:70", + "nodeType": "YulIdentifier", + "src": "1446:9:70" + }, + { + "kind": "number", + "nativeSrc": "1457:4:70", + "nodeType": "YulLiteral", + "src": "1457:4:70", + "type": "", + "value": "0xc0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1442:3:70", + "nodeType": "YulIdentifier", + "src": "1442:3:70" + }, + "nativeSrc": "1442:20:70", + "nodeType": "YulFunctionCall", + "src": "1442:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1474:6:70", + "nodeType": "YulIdentifier", + "src": "1474:6:70" + }, + { + "kind": "number", + "nativeSrc": "1482:4:70", + "nodeType": "YulLiteral", + "src": "1482:4:70", + "type": "", + "value": "0xc0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1470:3:70", + "nodeType": "YulIdentifier", + "src": "1470:3:70" + }, + "nativeSrc": "1470:17:70", + "nodeType": "YulFunctionCall", + "src": "1470:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1464:5:70", + "nodeType": "YulIdentifier", + "src": "1464:5:70" + }, + "nativeSrc": "1464:24:70", + "nodeType": "YulFunctionCall", + "src": "1464:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1435:6:70", + "nodeType": "YulIdentifier", + "src": "1435:6:70" + }, + "nativeSrc": "1435:54:70", + "nodeType": "YulFunctionCall", + "src": "1435:54:70" + }, + "nativeSrc": "1435:54:70", + "nodeType": "YulExpressionStatement", + "src": "1435:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1509:9:70", + "nodeType": "YulIdentifier", + "src": "1509:9:70" + }, + { + "kind": "number", + "nativeSrc": "1520:4:70", + "nodeType": "YulLiteral", + "src": "1520:4:70", + "type": "", + "value": "0xe0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1505:3:70", + "nodeType": "YulIdentifier", + "src": "1505:3:70" + }, + "nativeSrc": "1505:20:70", + "nodeType": "YulFunctionCall", + "src": "1505:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1537:6:70", + "nodeType": "YulIdentifier", + "src": "1537:6:70" + }, + { + "kind": "number", + "nativeSrc": "1545:4:70", + "nodeType": "YulLiteral", + "src": "1545:4:70", + "type": "", + "value": "0xe0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1533:3:70", + "nodeType": "YulIdentifier", + "src": "1533:3:70" + }, + "nativeSrc": "1533:17:70", + "nodeType": "YulFunctionCall", + "src": "1533:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1527:5:70", + "nodeType": "YulIdentifier", + "src": "1527:5:70" + }, + "nativeSrc": "1527:24:70", + "nodeType": "YulFunctionCall", + "src": "1527:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1498:6:70", + "nodeType": "YulIdentifier", + "src": "1498:6:70" + }, + "nativeSrc": "1498:54:70", + "nodeType": "YulFunctionCall", + "src": "1498:54:70" + }, + "nativeSrc": "1498:54:70", + "nodeType": "YulExpressionStatement", + "src": "1498:54:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1572:9:70", + "nodeType": "YulIdentifier", + "src": "1572:9:70" + }, + { + "kind": "number", + "nativeSrc": "1583:6:70", + "nodeType": "YulLiteral", + "src": "1583:6:70", + "type": "", + "value": "0x0100" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1568:3:70", + "nodeType": "YulIdentifier", + "src": "1568:3:70" + }, + "nativeSrc": "1568:22:70", + "nodeType": "YulFunctionCall", + "src": "1568:22:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "1602:6:70", + "nodeType": "YulIdentifier", + "src": "1602:6:70" + }, + { + "kind": "number", + "nativeSrc": "1610:6:70", + "nodeType": "YulLiteral", + "src": "1610:6:70", + "type": "", + "value": "0x0100" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1598:3:70", + "nodeType": "YulIdentifier", + "src": "1598:3:70" + }, + "nativeSrc": "1598:19:70", + "nodeType": "YulFunctionCall", + "src": "1598:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "1592:5:70", + "nodeType": "YulIdentifier", + "src": "1592:5:70" + }, + "nativeSrc": "1592:26:70", + "nodeType": "YulFunctionCall", + "src": "1592:26:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1561:6:70", + "nodeType": "YulIdentifier", + "src": "1561:6:70" + }, + "nativeSrc": "1561:58:70", + "nodeType": "YulFunctionCall", + "src": "1561:58:70" + }, + "nativeSrc": "1561:58:70", + "nodeType": "YulExpressionStatement", + "src": "1561:58:70" + } + ] + }, + "name": "abi_encode_tuple_t_struct$_State_$15663_memory_ptr__to_t_struct$_State_$15663_memory_ptr__fromStack_reversed", + "nativeSrc": "858:767:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "976:9:70", + "nodeType": "YulTypedName", + "src": "976:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "987:6:70", + "nodeType": "YulTypedName", + "src": "987:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "998:4:70", + "nodeType": "YulTypedName", + "src": "998:4:70", + "type": "" + } + ], + "src": "858:767:70" + }, + { + "body": { + "nativeSrc": "1731:76:70", + "nodeType": "YulBlock", + "src": "1731:76:70", + "statements": [ + { + "nativeSrc": "1741:26:70", + "nodeType": "YulAssignment", + "src": "1741:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1753:9:70", + "nodeType": "YulIdentifier", + "src": "1753:9:70" + }, + { + "kind": "number", + "nativeSrc": "1764:2:70", + "nodeType": "YulLiteral", + "src": "1764:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "1749:3:70", + "nodeType": "YulIdentifier", + "src": "1749:3:70" + }, + "nativeSrc": "1749:18:70", + "nodeType": "YulFunctionCall", + "src": "1749:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "1741:4:70", + "nodeType": "YulIdentifier", + "src": "1741:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "1783:9:70", + "nodeType": "YulIdentifier", + "src": "1783:9:70" + }, + { + "name": "value0", + "nativeSrc": "1794:6:70", + "nodeType": "YulIdentifier", + "src": "1794:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "1776:6:70", + "nodeType": "YulIdentifier", + "src": "1776:6:70" + }, + "nativeSrc": "1776:25:70", + "nodeType": "YulFunctionCall", + "src": "1776:25:70" + }, + "nativeSrc": "1776:25:70", + "nodeType": "YulExpressionStatement", + "src": "1776:25:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nativeSrc": "1630:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1700:9:70", + "nodeType": "YulTypedName", + "src": "1700:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "1711:6:70", + "nodeType": "YulTypedName", + "src": "1711:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "1722:4:70", + "nodeType": "YulTypedName", + "src": "1722:4:70", + "type": "" + } + ], + "src": "1630:177:70" + }, + { + "body": { + "nativeSrc": "1997:206:70", + "nodeType": "YulBlock", + "src": "1997:206:70", + "statements": [ + { + "nativeSrc": "2007:27:70", + "nodeType": "YulAssignment", + "src": "2007:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2019:9:70", + "nodeType": "YulIdentifier", + "src": "2019:9:70" + }, + { + "kind": "number", + "nativeSrc": "2030:3:70", + "nodeType": "YulLiteral", + "src": "2030:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2015:3:70", + "nodeType": "YulIdentifier", + "src": "2015:3:70" + }, + "nativeSrc": "2015:19:70", + "nodeType": "YulFunctionCall", + "src": "2015:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "2007:4:70", + "nodeType": "YulIdentifier", + "src": "2007:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2050:9:70", + "nodeType": "YulIdentifier", + "src": "2050:9:70" + }, + { + "name": "value0", + "nativeSrc": "2061:6:70", + "nodeType": "YulIdentifier", + "src": "2061:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2043:6:70", + "nodeType": "YulIdentifier", + "src": "2043:6:70" + }, + "nativeSrc": "2043:25:70", + "nodeType": "YulFunctionCall", + "src": "2043:25:70" + }, + "nativeSrc": "2043:25:70", + "nodeType": "YulExpressionStatement", + "src": "2043:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2088:9:70", + "nodeType": "YulIdentifier", + "src": "2088:9:70" + }, + { + "kind": "number", + "nativeSrc": "2099:2:70", + "nodeType": "YulLiteral", + "src": "2099:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2084:3:70", + "nodeType": "YulIdentifier", + "src": "2084:3:70" + }, + "nativeSrc": "2084:18:70", + "nodeType": "YulFunctionCall", + "src": "2084:18:70" + }, + { + "name": "value1", + "nativeSrc": "2104:6:70", + "nodeType": "YulIdentifier", + "src": "2104:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2077:6:70", + "nodeType": "YulIdentifier", + "src": "2077:6:70" + }, + "nativeSrc": "2077:34:70", + "nodeType": "YulFunctionCall", + "src": "2077:34:70" + }, + "nativeSrc": "2077:34:70", + "nodeType": "YulExpressionStatement", + "src": "2077:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2131:9:70", + "nodeType": "YulIdentifier", + "src": "2131:9:70" + }, + { + "kind": "number", + "nativeSrc": "2142:2:70", + "nodeType": "YulLiteral", + "src": "2142:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2127:3:70", + "nodeType": "YulIdentifier", + "src": "2127:3:70" + }, + "nativeSrc": "2127:18:70", + "nodeType": "YulFunctionCall", + "src": "2127:18:70" + }, + { + "name": "value2", + "nativeSrc": "2147:6:70", + "nodeType": "YulIdentifier", + "src": "2147:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2120:6:70", + "nodeType": "YulIdentifier", + "src": "2120:6:70" + }, + "nativeSrc": "2120:34:70", + "nodeType": "YulFunctionCall", + "src": "2120:34:70" + }, + "nativeSrc": "2120:34:70", + "nodeType": "YulExpressionStatement", + "src": "2120:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2174:9:70", + "nodeType": "YulIdentifier", + "src": "2174:9:70" + }, + { + "kind": "number", + "nativeSrc": "2185:2:70", + "nodeType": "YulLiteral", + "src": "2185:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2170:3:70", + "nodeType": "YulIdentifier", + "src": "2170:3:70" + }, + "nativeSrc": "2170:18:70", + "nodeType": "YulFunctionCall", + "src": "2170:18:70" + }, + { + "name": "value3", + "nativeSrc": "2190:6:70", + "nodeType": "YulIdentifier", + "src": "2190:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2163:6:70", + "nodeType": "YulIdentifier", + "src": "2163:6:70" + }, + "nativeSrc": "2163:34:70", + "nodeType": "YulFunctionCall", + "src": "2163:34:70" + }, + "nativeSrc": "2163:34:70", + "nodeType": "YulExpressionStatement", + "src": "2163:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_uint256__to_t_bytes32_t_bytes32_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "1812:391:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "1942:9:70", + "nodeType": "YulTypedName", + "src": "1942:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "1953:6:70", + "nodeType": "YulTypedName", + "src": "1953:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "1961:6:70", + "nodeType": "YulTypedName", + "src": "1961:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "1969:6:70", + "nodeType": "YulTypedName", + "src": "1969:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "1977:6:70", + "nodeType": "YulTypedName", + "src": "1977:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "1988:4:70", + "nodeType": "YulTypedName", + "src": "1988:4:70", + "type": "" + } + ], + "src": "1812:391:70" + }, + { + "body": { + "nativeSrc": "2252:77:70", + "nodeType": "YulBlock", + "src": "2252:77:70", + "statements": [ + { + "body": { + "nativeSrc": "2307:16:70", + "nodeType": "YulBlock", + "src": "2307:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2316:1:70", + "nodeType": "YulLiteral", + "src": "2316:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "2319:1:70", + "nodeType": "YulLiteral", + "src": "2319:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "2309:6:70", + "nodeType": "YulIdentifier", + "src": "2309:6:70" + }, + "nativeSrc": "2309:12:70", + "nodeType": "YulFunctionCall", + "src": "2309:12:70" + }, + "nativeSrc": "2309:12:70", + "nodeType": "YulExpressionStatement", + "src": "2309:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "2275:5:70", + "nodeType": "YulIdentifier", + "src": "2275:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "2286:5:70", + "nodeType": "YulIdentifier", + "src": "2286:5:70" + }, + { + "kind": "number", + "nativeSrc": "2293:10:70", + "nodeType": "YulLiteral", + "src": "2293:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2282:3:70", + "nodeType": "YulIdentifier", + "src": "2282:3:70" + }, + "nativeSrc": "2282:22:70", + "nodeType": "YulFunctionCall", + "src": "2282:22:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "2272:2:70", + "nodeType": "YulIdentifier", + "src": "2272:2:70" + }, + "nativeSrc": "2272:33:70", + "nodeType": "YulFunctionCall", + "src": "2272:33:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "2265:6:70", + "nodeType": "YulIdentifier", + "src": "2265:6:70" + }, + "nativeSrc": "2265:41:70", + "nodeType": "YulFunctionCall", + "src": "2265:41:70" + }, + "nativeSrc": "2262:61:70", + "nodeType": "YulIf", + "src": "2262:61:70" + } + ] + }, + "name": "validator_revert_uint32", + "nativeSrc": "2208:121:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "2241:5:70", + "nodeType": "YulTypedName", + "src": "2241:5:70", + "type": "" + } + ], + "src": "2208:121:70" + }, + { + "body": { + "nativeSrc": "2403:176:70", + "nodeType": "YulBlock", + "src": "2403:176:70", + "statements": [ + { + "body": { + "nativeSrc": "2449:16:70", + "nodeType": "YulBlock", + "src": "2449:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2458:1:70", + "nodeType": "YulLiteral", + "src": "2458:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "2461:1:70", + "nodeType": "YulLiteral", + "src": "2461:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "2451:6:70", + "nodeType": "YulIdentifier", + "src": "2451:6:70" + }, + "nativeSrc": "2451:12:70", + "nodeType": "YulFunctionCall", + "src": "2451:12:70" + }, + "nativeSrc": "2451:12:70", + "nodeType": "YulExpressionStatement", + "src": "2451:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "2424:7:70", + "nodeType": "YulIdentifier", + "src": "2424:7:70" + }, + { + "name": "headStart", + "nativeSrc": "2433:9:70", + "nodeType": "YulIdentifier", + "src": "2433:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2420:3:70", + "nodeType": "YulIdentifier", + "src": "2420:3:70" + }, + "nativeSrc": "2420:23:70", + "nodeType": "YulFunctionCall", + "src": "2420:23:70" + }, + { + "kind": "number", + "nativeSrc": "2445:2:70", + "nodeType": "YulLiteral", + "src": "2445:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "2416:3:70", + "nodeType": "YulIdentifier", + "src": "2416:3:70" + }, + "nativeSrc": "2416:32:70", + "nodeType": "YulFunctionCall", + "src": "2416:32:70" + }, + "nativeSrc": "2413:52:70", + "nodeType": "YulIf", + "src": "2413:52:70" + }, + { + "nativeSrc": "2474:36:70", + "nodeType": "YulVariableDeclaration", + "src": "2474:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2500:9:70", + "nodeType": "YulIdentifier", + "src": "2500:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "2487:12:70", + "nodeType": "YulIdentifier", + "src": "2487:12:70" + }, + "nativeSrc": "2487:23:70", + "nodeType": "YulFunctionCall", + "src": "2487:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "2478:5:70", + "nodeType": "YulTypedName", + "src": "2478:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "2543:5:70", + "nodeType": "YulIdentifier", + "src": "2543:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "2519:23:70", + "nodeType": "YulIdentifier", + "src": "2519:23:70" + }, + "nativeSrc": "2519:30:70", + "nodeType": "YulFunctionCall", + "src": "2519:30:70" + }, + "nativeSrc": "2519:30:70", + "nodeType": "YulExpressionStatement", + "src": "2519:30:70" + }, + { + "nativeSrc": "2558:15:70", + "nodeType": "YulAssignment", + "src": "2558:15:70", + "value": { + "name": "value", + "nativeSrc": "2568:5:70", + "nodeType": "YulIdentifier", + "src": "2568:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "2558:6:70", + "nodeType": "YulIdentifier", + "src": "2558:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint32", + "nativeSrc": "2334:245:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2369:9:70", + "nodeType": "YulTypedName", + "src": "2369:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "2380:7:70", + "nodeType": "YulTypedName", + "src": "2380:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "2392:6:70", + "nodeType": "YulTypedName", + "src": "2392:6:70", + "type": "" + } + ], + "src": "2334:245:70" + }, + { + "body": { + "nativeSrc": "2683:93:70", + "nodeType": "YulBlock", + "src": "2683:93:70", + "statements": [ + { + "nativeSrc": "2693:26:70", + "nodeType": "YulAssignment", + "src": "2693:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2705:9:70", + "nodeType": "YulIdentifier", + "src": "2705:9:70" + }, + { + "kind": "number", + "nativeSrc": "2716:2:70", + "nodeType": "YulLiteral", + "src": "2716:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2701:3:70", + "nodeType": "YulIdentifier", + "src": "2701:3:70" + }, + "nativeSrc": "2701:18:70", + "nodeType": "YulFunctionCall", + "src": "2701:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "2693:4:70", + "nodeType": "YulIdentifier", + "src": "2693:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "2735:9:70", + "nodeType": "YulIdentifier", + "src": "2735:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "2750:6:70", + "nodeType": "YulIdentifier", + "src": "2750:6:70" + }, + { + "kind": "number", + "nativeSrc": "2758:10:70", + "nodeType": "YulLiteral", + "src": "2758:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "2746:3:70", + "nodeType": "YulIdentifier", + "src": "2746:3:70" + }, + "nativeSrc": "2746:23:70", + "nodeType": "YulFunctionCall", + "src": "2746:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "2728:6:70", + "nodeType": "YulIdentifier", + "src": "2728:6:70" + }, + "nativeSrc": "2728:42:70", + "nodeType": "YulFunctionCall", + "src": "2728:42:70" + }, + "nativeSrc": "2728:42:70", + "nodeType": "YulExpressionStatement", + "src": "2728:42:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed", + "nativeSrc": "2584:192:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "2652:9:70", + "nodeType": "YulTypedName", + "src": "2652:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "2663:6:70", + "nodeType": "YulTypedName", + "src": "2663:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "2674:4:70", + "nodeType": "YulTypedName", + "src": "2674:4:70", + "type": "" + } + ], + "src": "2584:192:70" + }, + { + "body": { + "nativeSrc": "2853:275:70", + "nodeType": "YulBlock", + "src": "2853:275:70", + "statements": [ + { + "body": { + "nativeSrc": "2902:16:70", + "nodeType": "YulBlock", + "src": "2902:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2911:1:70", + "nodeType": "YulLiteral", + "src": "2911:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "2914:1:70", + "nodeType": "YulLiteral", + "src": "2914:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "2904:6:70", + "nodeType": "YulIdentifier", + "src": "2904:6:70" + }, + "nativeSrc": "2904:12:70", + "nodeType": "YulFunctionCall", + "src": "2904:12:70" + }, + "nativeSrc": "2904:12:70", + "nodeType": "YulExpressionStatement", + "src": "2904:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nativeSrc": "2881:6:70", + "nodeType": "YulIdentifier", + "src": "2881:6:70" + }, + { + "kind": "number", + "nativeSrc": "2889:4:70", + "nodeType": "YulLiteral", + "src": "2889:4:70", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "2877:3:70", + "nodeType": "YulIdentifier", + "src": "2877:3:70" + }, + "nativeSrc": "2877:17:70", + "nodeType": "YulFunctionCall", + "src": "2877:17:70" + }, + { + "name": "end", + "nativeSrc": "2896:3:70", + "nodeType": "YulIdentifier", + "src": "2896:3:70" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "2873:3:70", + "nodeType": "YulIdentifier", + "src": "2873:3:70" + }, + "nativeSrc": "2873:27:70", + "nodeType": "YulFunctionCall", + "src": "2873:27:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "2866:6:70", + "nodeType": "YulIdentifier", + "src": "2866:6:70" + }, + "nativeSrc": "2866:35:70", + "nodeType": "YulFunctionCall", + "src": "2866:35:70" + }, + "nativeSrc": "2863:55:70", + "nodeType": "YulIf", + "src": "2863:55:70" + }, + { + "nativeSrc": "2927:30:70", + "nodeType": "YulAssignment", + "src": "2927:30:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "2950:6:70", + "nodeType": "YulIdentifier", + "src": "2950:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "2937:12:70", + "nodeType": "YulIdentifier", + "src": "2937:12:70" + }, + "nativeSrc": "2937:20:70", + "nodeType": "YulFunctionCall", + "src": "2937:20:70" + }, + "variableNames": [ + { + "name": "length", + "nativeSrc": "2927:6:70", + "nodeType": "YulIdentifier", + "src": "2927:6:70" + } + ] + }, + { + "body": { + "nativeSrc": "3000:16:70", + "nodeType": "YulBlock", + "src": "3000:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3009:1:70", + "nodeType": "YulLiteral", + "src": "3009:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3012:1:70", + "nodeType": "YulLiteral", + "src": "3012:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3002:6:70", + "nodeType": "YulIdentifier", + "src": "3002:6:70" + }, + "nativeSrc": "3002:12:70", + "nodeType": "YulFunctionCall", + "src": "3002:12:70" + }, + "nativeSrc": "3002:12:70", + "nodeType": "YulExpressionStatement", + "src": "3002:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nativeSrc": "2972:6:70", + "nodeType": "YulIdentifier", + "src": "2972:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "2988:2:70", + "nodeType": "YulLiteral", + "src": "2988:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "2992:1:70", + "nodeType": "YulLiteral", + "src": "2992:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "2984:3:70", + "nodeType": "YulIdentifier", + "src": "2984:3:70" + }, + "nativeSrc": "2984:10:70", + "nodeType": "YulFunctionCall", + "src": "2984:10:70" + }, + { + "kind": "number", + "nativeSrc": "2996:1:70", + "nodeType": "YulLiteral", + "src": "2996:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "2980:3:70", + "nodeType": "YulIdentifier", + "src": "2980:3:70" + }, + "nativeSrc": "2980:18:70", + "nodeType": "YulFunctionCall", + "src": "2980:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "2969:2:70", + "nodeType": "YulIdentifier", + "src": "2969:2:70" + }, + "nativeSrc": "2969:30:70", + "nodeType": "YulFunctionCall", + "src": "2969:30:70" + }, + "nativeSrc": "2966:50:70", + "nodeType": "YulIf", + "src": "2966:50:70" + }, + { + "nativeSrc": "3025:29:70", + "nodeType": "YulAssignment", + "src": "3025:29:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "3041:6:70", + "nodeType": "YulIdentifier", + "src": "3041:6:70" + }, + { + "kind": "number", + "nativeSrc": "3049:4:70", + "nodeType": "YulLiteral", + "src": "3049:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3037:3:70", + "nodeType": "YulIdentifier", + "src": "3037:3:70" + }, + "nativeSrc": "3037:17:70", + "nodeType": "YulFunctionCall", + "src": "3037:17:70" + }, + "variableNames": [ + { + "name": "arrayPos", + "nativeSrc": "3025:8:70", + "nodeType": "YulIdentifier", + "src": "3025:8:70" + } + ] + }, + { + "body": { + "nativeSrc": "3106:16:70", + "nodeType": "YulBlock", + "src": "3106:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3115:1:70", + "nodeType": "YulLiteral", + "src": "3115:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3118:1:70", + "nodeType": "YulLiteral", + "src": "3118:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3108:6:70", + "nodeType": "YulIdentifier", + "src": "3108:6:70" + }, + "nativeSrc": "3108:12:70", + "nodeType": "YulFunctionCall", + "src": "3108:12:70" + }, + "nativeSrc": "3108:12:70", + "nodeType": "YulExpressionStatement", + "src": "3108:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nativeSrc": "3077:6:70", + "nodeType": "YulIdentifier", + "src": "3077:6:70" + }, + { + "name": "length", + "nativeSrc": "3085:6:70", + "nodeType": "YulIdentifier", + "src": "3085:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3073:3:70", + "nodeType": "YulIdentifier", + "src": "3073:3:70" + }, + "nativeSrc": "3073:19:70", + "nodeType": "YulFunctionCall", + "src": "3073:19:70" + }, + { + "kind": "number", + "nativeSrc": "3094:4:70", + "nodeType": "YulLiteral", + "src": "3094:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3069:3:70", + "nodeType": "YulIdentifier", + "src": "3069:3:70" + }, + "nativeSrc": "3069:30:70", + "nodeType": "YulFunctionCall", + "src": "3069:30:70" + }, + { + "name": "end", + "nativeSrc": "3101:3:70", + "nodeType": "YulIdentifier", + "src": "3101:3:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "3066:2:70", + "nodeType": "YulIdentifier", + "src": "3066:2:70" + }, + "nativeSrc": "3066:39:70", + "nodeType": "YulFunctionCall", + "src": "3066:39:70" + }, + "nativeSrc": "3063:59:70", + "nodeType": "YulIf", + "src": "3063:59:70" + } + ] + }, + "name": "abi_decode_bytes_calldata", + "nativeSrc": "2781:347:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "2816:6:70", + "nodeType": "YulTypedName", + "src": "2816:6:70", + "type": "" + }, + { + "name": "end", + "nativeSrc": "2824:3:70", + "nodeType": "YulTypedName", + "src": "2824:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nativeSrc": "2832:8:70", + "nodeType": "YulTypedName", + "src": "2832:8:70", + "type": "" + }, + { + "name": "length", + "nativeSrc": "2842:6:70", + "nodeType": "YulTypedName", + "src": "2842:6:70", + "type": "" + } + ], + "src": "2781:347:70" + }, + { + "body": { + "nativeSrc": "3239:438:70", + "nodeType": "YulBlock", + "src": "3239:438:70", + "statements": [ + { + "body": { + "nativeSrc": "3285:16:70", + "nodeType": "YulBlock", + "src": "3285:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3294:1:70", + "nodeType": "YulLiteral", + "src": "3294:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3297:1:70", + "nodeType": "YulLiteral", + "src": "3297:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3287:6:70", + "nodeType": "YulIdentifier", + "src": "3287:6:70" + }, + "nativeSrc": "3287:12:70", + "nodeType": "YulFunctionCall", + "src": "3287:12:70" + }, + "nativeSrc": "3287:12:70", + "nodeType": "YulExpressionStatement", + "src": "3287:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "3260:7:70", + "nodeType": "YulIdentifier", + "src": "3260:7:70" + }, + { + "name": "headStart", + "nativeSrc": "3269:9:70", + "nodeType": "YulIdentifier", + "src": "3269:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "3256:3:70", + "nodeType": "YulIdentifier", + "src": "3256:3:70" + }, + "nativeSrc": "3256:23:70", + "nodeType": "YulFunctionCall", + "src": "3256:23:70" + }, + { + "kind": "number", + "nativeSrc": "3281:2:70", + "nodeType": "YulLiteral", + "src": "3281:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "3252:3:70", + "nodeType": "YulIdentifier", + "src": "3252:3:70" + }, + "nativeSrc": "3252:32:70", + "nodeType": "YulFunctionCall", + "src": "3252:32:70" + }, + "nativeSrc": "3249:52:70", + "nodeType": "YulIf", + "src": "3249:52:70" + }, + { + "nativeSrc": "3310:36:70", + "nodeType": "YulVariableDeclaration", + "src": "3310:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3336:9:70", + "nodeType": "YulIdentifier", + "src": "3336:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "3323:12:70", + "nodeType": "YulIdentifier", + "src": "3323:12:70" + }, + "nativeSrc": "3323:23:70", + "nodeType": "YulFunctionCall", + "src": "3323:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "3314:5:70", + "nodeType": "YulTypedName", + "src": "3314:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "3380:5:70", + "nodeType": "YulIdentifier", + "src": "3380:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "3355:24:70", + "nodeType": "YulIdentifier", + "src": "3355:24:70" + }, + "nativeSrc": "3355:31:70", + "nodeType": "YulFunctionCall", + "src": "3355:31:70" + }, + "nativeSrc": "3355:31:70", + "nodeType": "YulExpressionStatement", + "src": "3355:31:70" + }, + { + "nativeSrc": "3395:15:70", + "nodeType": "YulAssignment", + "src": "3395:15:70", + "value": { + "name": "value", + "nativeSrc": "3405:5:70", + "nodeType": "YulIdentifier", + "src": "3405:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "3395:6:70", + "nodeType": "YulIdentifier", + "src": "3395:6:70" + } + ] + }, + { + "nativeSrc": "3419:46:70", + "nodeType": "YulVariableDeclaration", + "src": "3419:46:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3450:9:70", + "nodeType": "YulIdentifier", + "src": "3450:9:70" + }, + { + "kind": "number", + "nativeSrc": "3461:2:70", + "nodeType": "YulLiteral", + "src": "3461:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3446:3:70", + "nodeType": "YulIdentifier", + "src": "3446:3:70" + }, + "nativeSrc": "3446:18:70", + "nodeType": "YulFunctionCall", + "src": "3446:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "3433:12:70", + "nodeType": "YulIdentifier", + "src": "3433:12:70" + }, + "nativeSrc": "3433:32:70", + "nodeType": "YulFunctionCall", + "src": "3433:32:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "3423:6:70", + "nodeType": "YulTypedName", + "src": "3423:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "3508:16:70", + "nodeType": "YulBlock", + "src": "3508:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3517:1:70", + "nodeType": "YulLiteral", + "src": "3517:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3520:1:70", + "nodeType": "YulLiteral", + "src": "3520:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3510:6:70", + "nodeType": "YulIdentifier", + "src": "3510:6:70" + }, + "nativeSrc": "3510:12:70", + "nodeType": "YulFunctionCall", + "src": "3510:12:70" + }, + "nativeSrc": "3510:12:70", + "nodeType": "YulExpressionStatement", + "src": "3510:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "3480:6:70", + "nodeType": "YulIdentifier", + "src": "3480:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3496:2:70", + "nodeType": "YulLiteral", + "src": "3496:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "3500:1:70", + "nodeType": "YulLiteral", + "src": "3500:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "3492:3:70", + "nodeType": "YulIdentifier", + "src": "3492:3:70" + }, + "nativeSrc": "3492:10:70", + "nodeType": "YulFunctionCall", + "src": "3492:10:70" + }, + { + "kind": "number", + "nativeSrc": "3504:1:70", + "nodeType": "YulLiteral", + "src": "3504:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "3488:3:70", + "nodeType": "YulIdentifier", + "src": "3488:3:70" + }, + "nativeSrc": "3488:18:70", + "nodeType": "YulFunctionCall", + "src": "3488:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "3477:2:70", + "nodeType": "YulIdentifier", + "src": "3477:2:70" + }, + "nativeSrc": "3477:30:70", + "nodeType": "YulFunctionCall", + "src": "3477:30:70" + }, + "nativeSrc": "3474:50:70", + "nodeType": "YulIf", + "src": "3474:50:70" + }, + { + "nativeSrc": "3533:84:70", + "nodeType": "YulVariableDeclaration", + "src": "3533:84:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3589:9:70", + "nodeType": "YulIdentifier", + "src": "3589:9:70" + }, + { + "name": "offset", + "nativeSrc": "3600:6:70", + "nodeType": "YulIdentifier", + "src": "3600:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "3585:3:70", + "nodeType": "YulIdentifier", + "src": "3585:3:70" + }, + "nativeSrc": "3585:22:70", + "nodeType": "YulFunctionCall", + "src": "3585:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "3609:7:70", + "nodeType": "YulIdentifier", + "src": "3609:7:70" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nativeSrc": "3559:25:70", + "nodeType": "YulIdentifier", + "src": "3559:25:70" + }, + "nativeSrc": "3559:58:70", + "nodeType": "YulFunctionCall", + "src": "3559:58:70" + }, + "variables": [ + { + "name": "value1_1", + "nativeSrc": "3537:8:70", + "nodeType": "YulTypedName", + "src": "3537:8:70", + "type": "" + }, + { + "name": "value2_1", + "nativeSrc": "3547:8:70", + "nodeType": "YulTypedName", + "src": "3547:8:70", + "type": "" + } + ] + }, + { + "nativeSrc": "3626:18:70", + "nodeType": "YulAssignment", + "src": "3626:18:70", + "value": { + "name": "value1_1", + "nativeSrc": "3636:8:70", + "nodeType": "YulIdentifier", + "src": "3636:8:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "3626:6:70", + "nodeType": "YulIdentifier", + "src": "3626:6:70" + } + ] + }, + { + "nativeSrc": "3653:18:70", + "nodeType": "YulAssignment", + "src": "3653:18:70", + "value": { + "name": "value2_1", + "nativeSrc": "3663:8:70", + "nodeType": "YulIdentifier", + "src": "3663:8:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "3653:6:70", + "nodeType": "YulIdentifier", + "src": "3653:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_bytes_calldata_ptr", + "nativeSrc": "3133:544:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "3189:9:70", + "nodeType": "YulTypedName", + "src": "3189:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "3200:7:70", + "nodeType": "YulTypedName", + "src": "3200:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "3212:6:70", + "nodeType": "YulTypedName", + "src": "3212:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "3220:6:70", + "nodeType": "YulTypedName", + "src": "3220:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "3228:6:70", + "nodeType": "YulTypedName", + "src": "3228:6:70", + "type": "" + } + ], + "src": "3133:544:70" + }, + { + "body": { + "nativeSrc": "3724:76:70", + "nodeType": "YulBlock", + "src": "3724:76:70", + "statements": [ + { + "body": { + "nativeSrc": "3778:16:70", + "nodeType": "YulBlock", + "src": "3778:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3787:1:70", + "nodeType": "YulLiteral", + "src": "3787:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3790:1:70", + "nodeType": "YulLiteral", + "src": "3790:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3780:6:70", + "nodeType": "YulIdentifier", + "src": "3780:6:70" + }, + "nativeSrc": "3780:12:70", + "nodeType": "YulFunctionCall", + "src": "3780:12:70" + }, + "nativeSrc": "3780:12:70", + "nodeType": "YulExpressionStatement", + "src": "3780:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "3747:5:70", + "nodeType": "YulIdentifier", + "src": "3747:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "3768:5:70", + "nodeType": "YulIdentifier", + "src": "3768:5:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "3761:6:70", + "nodeType": "YulIdentifier", + "src": "3761:6:70" + }, + "nativeSrc": "3761:13:70", + "nodeType": "YulFunctionCall", + "src": "3761:13:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "3754:6:70", + "nodeType": "YulIdentifier", + "src": "3754:6:70" + }, + "nativeSrc": "3754:21:70", + "nodeType": "YulFunctionCall", + "src": "3754:21:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "3744:2:70", + "nodeType": "YulIdentifier", + "src": "3744:2:70" + }, + "nativeSrc": "3744:32:70", + "nodeType": "YulFunctionCall", + "src": "3744:32:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "3737:6:70", + "nodeType": "YulIdentifier", + "src": "3737:6:70" + }, + "nativeSrc": "3737:40:70", + "nodeType": "YulFunctionCall", + "src": "3737:40:70" + }, + "nativeSrc": "3734:60:70", + "nodeType": "YulIf", + "src": "3734:60:70" + } + ] + }, + "name": "validator_revert_bool", + "nativeSrc": "3682:118:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "3713:5:70", + "nodeType": "YulTypedName", + "src": "3713:5:70", + "type": "" + } + ], + "src": "3682:118:70" + }, + { + "body": { + "nativeSrc": "3889:298:70", + "nodeType": "YulBlock", + "src": "3889:298:70", + "statements": [ + { + "body": { + "nativeSrc": "3935:16:70", + "nodeType": "YulBlock", + "src": "3935:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "3944:1:70", + "nodeType": "YulLiteral", + "src": "3944:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "3947:1:70", + "nodeType": "YulLiteral", + "src": "3947:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "3937:6:70", + "nodeType": "YulIdentifier", + "src": "3937:6:70" + }, + "nativeSrc": "3937:12:70", + "nodeType": "YulFunctionCall", + "src": "3937:12:70" + }, + "nativeSrc": "3937:12:70", + "nodeType": "YulExpressionStatement", + "src": "3937:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "3910:7:70", + "nodeType": "YulIdentifier", + "src": "3910:7:70" + }, + { + "name": "headStart", + "nativeSrc": "3919:9:70", + "nodeType": "YulIdentifier", + "src": "3919:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "3906:3:70", + "nodeType": "YulIdentifier", + "src": "3906:3:70" + }, + "nativeSrc": "3906:23:70", + "nodeType": "YulFunctionCall", + "src": "3906:23:70" + }, + { + "kind": "number", + "nativeSrc": "3931:2:70", + "nodeType": "YulLiteral", + "src": "3931:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "3902:3:70", + "nodeType": "YulIdentifier", + "src": "3902:3:70" + }, + "nativeSrc": "3902:32:70", + "nodeType": "YulFunctionCall", + "src": "3902:32:70" + }, + "nativeSrc": "3899:52:70", + "nodeType": "YulIf", + "src": "3899:52:70" + }, + { + "nativeSrc": "3960:36:70", + "nodeType": "YulVariableDeclaration", + "src": "3960:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "3986:9:70", + "nodeType": "YulIdentifier", + "src": "3986:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "3973:12:70", + "nodeType": "YulIdentifier", + "src": "3973:12:70" + }, + "nativeSrc": "3973:23:70", + "nodeType": "YulFunctionCall", + "src": "3973:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "3964:5:70", + "nodeType": "YulTypedName", + "src": "3964:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "4030:5:70", + "nodeType": "YulIdentifier", + "src": "4030:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "4005:24:70", + "nodeType": "YulIdentifier", + "src": "4005:24:70" + }, + "nativeSrc": "4005:31:70", + "nodeType": "YulFunctionCall", + "src": "4005:31:70" + }, + "nativeSrc": "4005:31:70", + "nodeType": "YulExpressionStatement", + "src": "4005:31:70" + }, + { + "nativeSrc": "4045:15:70", + "nodeType": "YulAssignment", + "src": "4045:15:70", + "value": { + "name": "value", + "nativeSrc": "4055:5:70", + "nodeType": "YulIdentifier", + "src": "4055:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "4045:6:70", + "nodeType": "YulIdentifier", + "src": "4045:6:70" + } + ] + }, + { + "nativeSrc": "4069:47:70", + "nodeType": "YulVariableDeclaration", + "src": "4069:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4101:9:70", + "nodeType": "YulIdentifier", + "src": "4101:9:70" + }, + { + "kind": "number", + "nativeSrc": "4112:2:70", + "nodeType": "YulLiteral", + "src": "4112:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4097:3:70", + "nodeType": "YulIdentifier", + "src": "4097:3:70" + }, + "nativeSrc": "4097:18:70", + "nodeType": "YulFunctionCall", + "src": "4097:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "4084:12:70", + "nodeType": "YulIdentifier", + "src": "4084:12:70" + }, + "nativeSrc": "4084:32:70", + "nodeType": "YulFunctionCall", + "src": "4084:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "4073:7:70", + "nodeType": "YulTypedName", + "src": "4073:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "4147:7:70", + "nodeType": "YulIdentifier", + "src": "4147:7:70" + } + ], + "functionName": { + "name": "validator_revert_bool", + "nativeSrc": "4125:21:70", + "nodeType": "YulIdentifier", + "src": "4125:21:70" + }, + "nativeSrc": "4125:30:70", + "nodeType": "YulFunctionCall", + "src": "4125:30:70" + }, + "nativeSrc": "4125:30:70", + "nodeType": "YulExpressionStatement", + "src": "4125:30:70" + }, + { + "nativeSrc": "4164:17:70", + "nodeType": "YulAssignment", + "src": "4164:17:70", + "value": { + "name": "value_1", + "nativeSrc": "4174:7:70", + "nodeType": "YulIdentifier", + "src": "4174:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "4164:6:70", + "nodeType": "YulIdentifier", + "src": "4164:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_bool", + "nativeSrc": "3805:382:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "3847:9:70", + "nodeType": "YulTypedName", + "src": "3847:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "3858:7:70", + "nodeType": "YulTypedName", + "src": "3858:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "3870:6:70", + "nodeType": "YulTypedName", + "src": "3870:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "3878:6:70", + "nodeType": "YulTypedName", + "src": "3878:6:70", + "type": "" + } + ], + "src": "3805:382:70" + }, + { + "body": { + "nativeSrc": "4262:156:70", + "nodeType": "YulBlock", + "src": "4262:156:70", + "statements": [ + { + "body": { + "nativeSrc": "4308:16:70", + "nodeType": "YulBlock", + "src": "4308:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "4317:1:70", + "nodeType": "YulLiteral", + "src": "4317:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "4320:1:70", + "nodeType": "YulLiteral", + "src": "4320:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "4310:6:70", + "nodeType": "YulIdentifier", + "src": "4310:6:70" + }, + "nativeSrc": "4310:12:70", + "nodeType": "YulFunctionCall", + "src": "4310:12:70" + }, + "nativeSrc": "4310:12:70", + "nodeType": "YulExpressionStatement", + "src": "4310:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "4283:7:70", + "nodeType": "YulIdentifier", + "src": "4283:7:70" + }, + { + "name": "headStart", + "nativeSrc": "4292:9:70", + "nodeType": "YulIdentifier", + "src": "4292:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "4279:3:70", + "nodeType": "YulIdentifier", + "src": "4279:3:70" + }, + "nativeSrc": "4279:23:70", + "nodeType": "YulFunctionCall", + "src": "4279:23:70" + }, + { + "kind": "number", + "nativeSrc": "4304:2:70", + "nodeType": "YulLiteral", + "src": "4304:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "4275:3:70", + "nodeType": "YulIdentifier", + "src": "4275:3:70" + }, + "nativeSrc": "4275:32:70", + "nodeType": "YulFunctionCall", + "src": "4275:32:70" + }, + "nativeSrc": "4272:52:70", + "nodeType": "YulIf", + "src": "4272:52:70" + }, + { + "nativeSrc": "4333:14:70", + "nodeType": "YulVariableDeclaration", + "src": "4333:14:70", + "value": { + "kind": "number", + "nativeSrc": "4346:1:70", + "nodeType": "YulLiteral", + "src": "4346:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "4337:5:70", + "nodeType": "YulTypedName", + "src": "4337:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "4356:32:70", + "nodeType": "YulAssignment", + "src": "4356:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4378:9:70", + "nodeType": "YulIdentifier", + "src": "4378:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "4365:12:70", + "nodeType": "YulIdentifier", + "src": "4365:12:70" + }, + "nativeSrc": "4365:23:70", + "nodeType": "YulFunctionCall", + "src": "4365:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "4356:5:70", + "nodeType": "YulIdentifier", + "src": "4356:5:70" + } + ] + }, + { + "nativeSrc": "4397:15:70", + "nodeType": "YulAssignment", + "src": "4397:15:70", + "value": { + "name": "value", + "nativeSrc": "4407:5:70", + "nodeType": "YulIdentifier", + "src": "4407:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "4397:6:70", + "nodeType": "YulIdentifier", + "src": "4397:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nativeSrc": "4192:226:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "4228:9:70", + "nodeType": "YulTypedName", + "src": "4228:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "4239:7:70", + "nodeType": "YulTypedName", + "src": "4239:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "4251:6:70", + "nodeType": "YulTypedName", + "src": "4251:6:70", + "type": "" + } + ], + "src": "4192:226:70" + }, + { + "body": { + "nativeSrc": "4548:153:70", + "nodeType": "YulBlock", + "src": "4548:153:70", + "statements": [ + { + "nativeSrc": "4558:26:70", + "nodeType": "YulAssignment", + "src": "4558:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4570:9:70", + "nodeType": "YulIdentifier", + "src": "4570:9:70" + }, + { + "kind": "number", + "nativeSrc": "4581:2:70", + "nodeType": "YulLiteral", + "src": "4581:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4566:3:70", + "nodeType": "YulIdentifier", + "src": "4566:3:70" + }, + "nativeSrc": "4566:18:70", + "nodeType": "YulFunctionCall", + "src": "4566:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "4558:4:70", + "nodeType": "YulIdentifier", + "src": "4558:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4600:9:70", + "nodeType": "YulIdentifier", + "src": "4600:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "4615:6:70", + "nodeType": "YulIdentifier", + "src": "4615:6:70" + }, + { + "kind": "number", + "nativeSrc": "4623:10:70", + "nodeType": "YulLiteral", + "src": "4623:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "4611:3:70", + "nodeType": "YulIdentifier", + "src": "4611:3:70" + }, + "nativeSrc": "4611:23:70", + "nodeType": "YulFunctionCall", + "src": "4611:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4593:6:70", + "nodeType": "YulIdentifier", + "src": "4593:6:70" + }, + "nativeSrc": "4593:42:70", + "nodeType": "YulFunctionCall", + "src": "4593:42:70" + }, + "nativeSrc": "4593:42:70", + "nodeType": "YulExpressionStatement", + "src": "4593:42:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "4655:9:70", + "nodeType": "YulIdentifier", + "src": "4655:9:70" + }, + { + "kind": "number", + "nativeSrc": "4666:2:70", + "nodeType": "YulLiteral", + "src": "4666:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4651:3:70", + "nodeType": "YulIdentifier", + "src": "4651:3:70" + }, + "nativeSrc": "4651:18:70", + "nodeType": "YulFunctionCall", + "src": "4651:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "4675:6:70", + "nodeType": "YulIdentifier", + "src": "4675:6:70" + }, + { + "kind": "number", + "nativeSrc": "4683:10:70", + "nodeType": "YulLiteral", + "src": "4683:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "4671:3:70", + "nodeType": "YulIdentifier", + "src": "4671:3:70" + }, + "nativeSrc": "4671:23:70", + "nodeType": "YulFunctionCall", + "src": "4671:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4644:6:70", + "nodeType": "YulIdentifier", + "src": "4644:6:70" + }, + "nativeSrc": "4644:51:70", + "nodeType": "YulFunctionCall", + "src": "4644:51:70" + }, + "nativeSrc": "4644:51:70", + "nodeType": "YulExpressionStatement", + "src": "4644:51:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint32_t_uint32__to_t_uint32_t_uint32__fromStack_reversed", + "nativeSrc": "4423:278:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "4509:9:70", + "nodeType": "YulTypedName", + "src": "4509:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "4520:6:70", + "nodeType": "YulTypedName", + "src": "4520:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "4528:6:70", + "nodeType": "YulTypedName", + "src": "4528:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "4539:4:70", + "nodeType": "YulTypedName", + "src": "4539:4:70", + "type": "" + } + ], + "src": "4423:278:70" + }, + { + "body": { + "nativeSrc": "4772:184:70", + "nodeType": "YulBlock", + "src": "4772:184:70", + "statements": [ + { + "nativeSrc": "4782:10:70", + "nodeType": "YulVariableDeclaration", + "src": "4782:10:70", + "value": { + "kind": "number", + "nativeSrc": "4791:1:70", + "nodeType": "YulLiteral", + "src": "4791:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "4786:1:70", + "nodeType": "YulTypedName", + "src": "4786:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "4851:63:70", + "nodeType": "YulBlock", + "src": "4851:63:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "dst", + "nativeSrc": "4876:3:70", + "nodeType": "YulIdentifier", + "src": "4876:3:70" + }, + { + "name": "i", + "nativeSrc": "4881:1:70", + "nodeType": "YulIdentifier", + "src": "4881:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4872:3:70", + "nodeType": "YulIdentifier", + "src": "4872:3:70" + }, + "nativeSrc": "4872:11:70", + "nodeType": "YulFunctionCall", + "src": "4872:11:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "src", + "nativeSrc": "4895:3:70", + "nodeType": "YulIdentifier", + "src": "4895:3:70" + }, + { + "name": "i", + "nativeSrc": "4900:1:70", + "nodeType": "YulIdentifier", + "src": "4900:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4891:3:70", + "nodeType": "YulIdentifier", + "src": "4891:3:70" + }, + "nativeSrc": "4891:11:70", + "nodeType": "YulFunctionCall", + "src": "4891:11:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "4885:5:70", + "nodeType": "YulIdentifier", + "src": "4885:5:70" + }, + "nativeSrc": "4885:18:70", + "nodeType": "YulFunctionCall", + "src": "4885:18:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4865:6:70", + "nodeType": "YulIdentifier", + "src": "4865:6:70" + }, + "nativeSrc": "4865:39:70", + "nodeType": "YulFunctionCall", + "src": "4865:39:70" + }, + "nativeSrc": "4865:39:70", + "nodeType": "YulExpressionStatement", + "src": "4865:39:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "4812:1:70", + "nodeType": "YulIdentifier", + "src": "4812:1:70" + }, + { + "name": "length", + "nativeSrc": "4815:6:70", + "nodeType": "YulIdentifier", + "src": "4815:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "4809:2:70", + "nodeType": "YulIdentifier", + "src": "4809:2:70" + }, + "nativeSrc": "4809:13:70", + "nodeType": "YulFunctionCall", + "src": "4809:13:70" + }, + "nativeSrc": "4801:113:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "4823:19:70", + "nodeType": "YulBlock", + "src": "4823:19:70", + "statements": [ + { + "nativeSrc": "4825:15:70", + "nodeType": "YulAssignment", + "src": "4825:15:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "4834:1:70", + "nodeType": "YulIdentifier", + "src": "4834:1:70" + }, + { + "kind": "number", + "nativeSrc": "4837:2:70", + "nodeType": "YulLiteral", + "src": "4837:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4830:3:70", + "nodeType": "YulIdentifier", + "src": "4830:3:70" + }, + "nativeSrc": "4830:10:70", + "nodeType": "YulFunctionCall", + "src": "4830:10:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "4825:1:70", + "nodeType": "YulIdentifier", + "src": "4825:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "4805:3:70", + "nodeType": "YulBlock", + "src": "4805:3:70", + "statements": [] + }, + "src": "4801:113:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "dst", + "nativeSrc": "4934:3:70", + "nodeType": "YulIdentifier", + "src": "4934:3:70" + }, + { + "name": "length", + "nativeSrc": "4939:6:70", + "nodeType": "YulIdentifier", + "src": "4939:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "4930:3:70", + "nodeType": "YulIdentifier", + "src": "4930:3:70" + }, + "nativeSrc": "4930:16:70", + "nodeType": "YulFunctionCall", + "src": "4930:16:70" + }, + { + "kind": "number", + "nativeSrc": "4948:1:70", + "nodeType": "YulLiteral", + "src": "4948:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "4923:6:70", + "nodeType": "YulIdentifier", + "src": "4923:6:70" + }, + "nativeSrc": "4923:27:70", + "nodeType": "YulFunctionCall", + "src": "4923:27:70" + }, + "nativeSrc": "4923:27:70", + "nodeType": "YulExpressionStatement", + "src": "4923:27:70" + } + ] + }, + "name": "copy_memory_to_memory_with_cleanup", + "nativeSrc": "4706:250:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "src", + "nativeSrc": "4750:3:70", + "nodeType": "YulTypedName", + "src": "4750:3:70", + "type": "" + }, + { + "name": "dst", + "nativeSrc": "4755:3:70", + "nodeType": "YulTypedName", + "src": "4755:3:70", + "type": "" + }, + { + "name": "length", + "nativeSrc": "4760:6:70", + "nodeType": "YulTypedName", + "src": "4760:6:70", + "type": "" + } + ], + "src": "4706:250:70" + }, + { + "body": { + "nativeSrc": "5011:221:70", + "nodeType": "YulBlock", + "src": "5011:221:70", + "statements": [ + { + "nativeSrc": "5021:26:70", + "nodeType": "YulVariableDeclaration", + "src": "5021:26:70", + "value": { + "arguments": [ + { + "name": "value", + "nativeSrc": "5041:5:70", + "nodeType": "YulIdentifier", + "src": "5041:5:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "5035:5:70", + "nodeType": "YulIdentifier", + "src": "5035:5:70" + }, + "nativeSrc": "5035:12:70", + "nodeType": "YulFunctionCall", + "src": "5035:12:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "5025:6:70", + "nodeType": "YulTypedName", + "src": "5025:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "5063:3:70", + "nodeType": "YulIdentifier", + "src": "5063:3:70" + }, + { + "name": "length", + "nativeSrc": "5068:6:70", + "nodeType": "YulIdentifier", + "src": "5068:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "5056:6:70", + "nodeType": "YulIdentifier", + "src": "5056:6:70" + }, + "nativeSrc": "5056:19:70", + "nodeType": "YulFunctionCall", + "src": "5056:19:70" + }, + "nativeSrc": "5056:19:70", + "nodeType": "YulExpressionStatement", + "src": "5056:19:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "5123:5:70", + "nodeType": "YulIdentifier", + "src": "5123:5:70" + }, + { + "kind": "number", + "nativeSrc": "5130:4:70", + "nodeType": "YulLiteral", + "src": "5130:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5119:3:70", + "nodeType": "YulIdentifier", + "src": "5119:3:70" + }, + "nativeSrc": "5119:16:70", + "nodeType": "YulFunctionCall", + "src": "5119:16:70" + }, + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "5141:3:70", + "nodeType": "YulIdentifier", + "src": "5141:3:70" + }, + { + "kind": "number", + "nativeSrc": "5146:4:70", + "nodeType": "YulLiteral", + "src": "5146:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5137:3:70", + "nodeType": "YulIdentifier", + "src": "5137:3:70" + }, + "nativeSrc": "5137:14:70", + "nodeType": "YulFunctionCall", + "src": "5137:14:70" + }, + { + "name": "length", + "nativeSrc": "5153:6:70", + "nodeType": "YulIdentifier", + "src": "5153:6:70" + } + ], + "functionName": { + "name": "copy_memory_to_memory_with_cleanup", + "nativeSrc": "5084:34:70", + "nodeType": "YulIdentifier", + "src": "5084:34:70" + }, + "nativeSrc": "5084:76:70", + "nodeType": "YulFunctionCall", + "src": "5084:76:70" + }, + "nativeSrc": "5084:76:70", + "nodeType": "YulExpressionStatement", + "src": "5084:76:70" + }, + { + "nativeSrc": "5169:57:70", + "nodeType": "YulAssignment", + "src": "5169:57:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "5184:3:70", + "nodeType": "YulIdentifier", + "src": "5184:3:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nativeSrc": "5197:6:70", + "nodeType": "YulIdentifier", + "src": "5197:6:70" + }, + { + "kind": "number", + "nativeSrc": "5205:2:70", + "nodeType": "YulLiteral", + "src": "5205:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5193:3:70", + "nodeType": "YulIdentifier", + "src": "5193:3:70" + }, + "nativeSrc": "5193:15:70", + "nodeType": "YulFunctionCall", + "src": "5193:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "5214:2:70", + "nodeType": "YulLiteral", + "src": "5214:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "5210:3:70", + "nodeType": "YulIdentifier", + "src": "5210:3:70" + }, + "nativeSrc": "5210:7:70", + "nodeType": "YulFunctionCall", + "src": "5210:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "5189:3:70", + "nodeType": "YulIdentifier", + "src": "5189:3:70" + }, + "nativeSrc": "5189:29:70", + "nodeType": "YulFunctionCall", + "src": "5189:29:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5180:3:70", + "nodeType": "YulIdentifier", + "src": "5180:3:70" + }, + "nativeSrc": "5180:39:70", + "nodeType": "YulFunctionCall", + "src": "5180:39:70" + }, + { + "kind": "number", + "nativeSrc": "5221:4:70", + "nodeType": "YulLiteral", + "src": "5221:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5176:3:70", + "nodeType": "YulIdentifier", + "src": "5176:3:70" + }, + "nativeSrc": "5176:50:70", + "nodeType": "YulFunctionCall", + "src": "5176:50:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "5169:3:70", + "nodeType": "YulIdentifier", + "src": "5169:3:70" + } + ] + } + ] + }, + "name": "abi_encode_string", + "nativeSrc": "4961:271:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "4988:5:70", + "nodeType": "YulTypedName", + "src": "4988:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "4995:3:70", + "nodeType": "YulTypedName", + "src": "4995:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "5003:3:70", + "nodeType": "YulTypedName", + "src": "5003:3:70", + "type": "" + } + ], + "src": "4961:271:70" + }, + { + "body": { + "nativeSrc": "5434:257:70", + "nodeType": "YulBlock", + "src": "5434:257:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5451:9:70", + "nodeType": "YulIdentifier", + "src": "5451:9:70" + }, + { + "name": "value0", + "nativeSrc": "5462:6:70", + "nodeType": "YulIdentifier", + "src": "5462:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "5444:6:70", + "nodeType": "YulIdentifier", + "src": "5444:6:70" + }, + "nativeSrc": "5444:25:70", + "nodeType": "YulFunctionCall", + "src": "5444:25:70" + }, + "nativeSrc": "5444:25:70", + "nodeType": "YulExpressionStatement", + "src": "5444:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5489:9:70", + "nodeType": "YulIdentifier", + "src": "5489:9:70" + }, + { + "kind": "number", + "nativeSrc": "5500:2:70", + "nodeType": "YulLiteral", + "src": "5500:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5485:3:70", + "nodeType": "YulIdentifier", + "src": "5485:3:70" + }, + "nativeSrc": "5485:18:70", + "nodeType": "YulFunctionCall", + "src": "5485:18:70" + }, + { + "kind": "number", + "nativeSrc": "5505:2:70", + "nodeType": "YulLiteral", + "src": "5505:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "5478:6:70", + "nodeType": "YulIdentifier", + "src": "5478:6:70" + }, + "nativeSrc": "5478:30:70", + "nodeType": "YulFunctionCall", + "src": "5478:30:70" + }, + "nativeSrc": "5478:30:70", + "nodeType": "YulExpressionStatement", + "src": "5478:30:70" + }, + { + "nativeSrc": "5517:59:70", + "nodeType": "YulVariableDeclaration", + "src": "5517:59:70", + "value": { + "arguments": [ + { + "name": "value1", + "nativeSrc": "5549:6:70", + "nodeType": "YulIdentifier", + "src": "5549:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5561:9:70", + "nodeType": "YulIdentifier", + "src": "5561:9:70" + }, + { + "kind": "number", + "nativeSrc": "5572:2:70", + "nodeType": "YulLiteral", + "src": "5572:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5557:3:70", + "nodeType": "YulIdentifier", + "src": "5557:3:70" + }, + "nativeSrc": "5557:18:70", + "nodeType": "YulFunctionCall", + "src": "5557:18:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "5531:17:70", + "nodeType": "YulIdentifier", + "src": "5531:17:70" + }, + "nativeSrc": "5531:45:70", + "nodeType": "YulFunctionCall", + "src": "5531:45:70" + }, + "variables": [ + { + "name": "tail_1", + "nativeSrc": "5521:6:70", + "nodeType": "YulTypedName", + "src": "5521:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5596:9:70", + "nodeType": "YulIdentifier", + "src": "5596:9:70" + }, + { + "kind": "number", + "nativeSrc": "5607:2:70", + "nodeType": "YulLiteral", + "src": "5607:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5592:3:70", + "nodeType": "YulIdentifier", + "src": "5592:3:70" + }, + "nativeSrc": "5592:18:70", + "nodeType": "YulFunctionCall", + "src": "5592:18:70" + }, + { + "arguments": [ + { + "name": "tail_1", + "nativeSrc": "5616:6:70", + "nodeType": "YulIdentifier", + "src": "5616:6:70" + }, + { + "name": "headStart", + "nativeSrc": "5624:9:70", + "nodeType": "YulIdentifier", + "src": "5624:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "5612:3:70", + "nodeType": "YulIdentifier", + "src": "5612:3:70" + }, + "nativeSrc": "5612:22:70", + "nodeType": "YulFunctionCall", + "src": "5612:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "5585:6:70", + "nodeType": "YulIdentifier", + "src": "5585:6:70" + }, + "nativeSrc": "5585:50:70", + "nodeType": "YulFunctionCall", + "src": "5585:50:70" + }, + "nativeSrc": "5585:50:70", + "nodeType": "YulExpressionStatement", + "src": "5585:50:70" + }, + { + "nativeSrc": "5644:41:70", + "nodeType": "YulAssignment", + "src": "5644:41:70", + "value": { + "arguments": [ + { + "name": "value2", + "nativeSrc": "5670:6:70", + "nodeType": "YulIdentifier", + "src": "5670:6:70" + }, + { + "name": "tail_1", + "nativeSrc": "5678:6:70", + "nodeType": "YulIdentifier", + "src": "5678:6:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "5652:17:70", + "nodeType": "YulIdentifier", + "src": "5652:17:70" + }, + "nativeSrc": "5652:33:70", + "nodeType": "YulFunctionCall", + "src": "5652:33:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "5644:4:70", + "nodeType": "YulIdentifier", + "src": "5644:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_string_memory_ptr_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr_t_string_memory_ptr__fromStack_reversed", + "nativeSrc": "5237:454:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "5387:9:70", + "nodeType": "YulTypedName", + "src": "5387:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "5398:6:70", + "nodeType": "YulTypedName", + "src": "5398:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "5406:6:70", + "nodeType": "YulTypedName", + "src": "5406:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "5414:6:70", + "nodeType": "YulTypedName", + "src": "5414:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "5425:4:70", + "nodeType": "YulTypedName", + "src": "5425:4:70", + "type": "" + } + ], + "src": "5237:454:70" + }, + { + "body": { + "nativeSrc": "5931:336:70", + "nodeType": "YulBlock", + "src": "5931:336:70", + "statements": [ + { + "nativeSrc": "5941:27:70", + "nodeType": "YulAssignment", + "src": "5941:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5953:9:70", + "nodeType": "YulIdentifier", + "src": "5953:9:70" + }, + { + "kind": "number", + "nativeSrc": "5964:3:70", + "nodeType": "YulLiteral", + "src": "5964:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "5949:3:70", + "nodeType": "YulIdentifier", + "src": "5949:3:70" + }, + "nativeSrc": "5949:19:70", + "nodeType": "YulFunctionCall", + "src": "5949:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "5941:4:70", + "nodeType": "YulIdentifier", + "src": "5941:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "5984:9:70", + "nodeType": "YulIdentifier", + "src": "5984:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "6009:6:70", + "nodeType": "YulIdentifier", + "src": "6009:6:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "6002:6:70", + "nodeType": "YulIdentifier", + "src": "6002:6:70" + }, + "nativeSrc": "6002:14:70", + "nodeType": "YulFunctionCall", + "src": "6002:14:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "5995:6:70", + "nodeType": "YulIdentifier", + "src": "5995:6:70" + }, + "nativeSrc": "5995:22:70", + "nodeType": "YulFunctionCall", + "src": "5995:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "5977:6:70", + "nodeType": "YulIdentifier", + "src": "5977:6:70" + }, + "nativeSrc": "5977:41:70", + "nodeType": "YulFunctionCall", + "src": "5977:41:70" + }, + "nativeSrc": "5977:41:70", + "nodeType": "YulExpressionStatement", + "src": "5977:41:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6038:9:70", + "nodeType": "YulIdentifier", + "src": "6038:9:70" + }, + { + "kind": "number", + "nativeSrc": "6049:2:70", + "nodeType": "YulLiteral", + "src": "6049:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6034:3:70", + "nodeType": "YulIdentifier", + "src": "6034:3:70" + }, + "nativeSrc": "6034:18:70", + "nodeType": "YulFunctionCall", + "src": "6034:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "6058:6:70", + "nodeType": "YulIdentifier", + "src": "6058:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "6074:3:70", + "nodeType": "YulLiteral", + "src": "6074:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "6079:1:70", + "nodeType": "YulLiteral", + "src": "6079:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "6070:3:70", + "nodeType": "YulIdentifier", + "src": "6070:3:70" + }, + "nativeSrc": "6070:11:70", + "nodeType": "YulFunctionCall", + "src": "6070:11:70" + }, + { + "kind": "number", + "nativeSrc": "6083:1:70", + "nodeType": "YulLiteral", + "src": "6083:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "6066:3:70", + "nodeType": "YulIdentifier", + "src": "6066:3:70" + }, + "nativeSrc": "6066:19:70", + "nodeType": "YulFunctionCall", + "src": "6066:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "6054:3:70", + "nodeType": "YulIdentifier", + "src": "6054:3:70" + }, + "nativeSrc": "6054:32:70", + "nodeType": "YulFunctionCall", + "src": "6054:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6027:6:70", + "nodeType": "YulIdentifier", + "src": "6027:6:70" + }, + "nativeSrc": "6027:60:70", + "nodeType": "YulFunctionCall", + "src": "6027:60:70" + }, + "nativeSrc": "6027:60:70", + "nodeType": "YulExpressionStatement", + "src": "6027:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6107:9:70", + "nodeType": "YulIdentifier", + "src": "6107:9:70" + }, + { + "kind": "number", + "nativeSrc": "6118:2:70", + "nodeType": "YulLiteral", + "src": "6118:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6103:3:70", + "nodeType": "YulIdentifier", + "src": "6103:3:70" + }, + "nativeSrc": "6103:18:70", + "nodeType": "YulFunctionCall", + "src": "6103:18:70" + }, + { + "name": "value2", + "nativeSrc": "6123:6:70", + "nodeType": "YulIdentifier", + "src": "6123:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6096:6:70", + "nodeType": "YulIdentifier", + "src": "6096:6:70" + }, + "nativeSrc": "6096:34:70", + "nodeType": "YulFunctionCall", + "src": "6096:34:70" + }, + "nativeSrc": "6096:34:70", + "nodeType": "YulExpressionStatement", + "src": "6096:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6150:9:70", + "nodeType": "YulIdentifier", + "src": "6150:9:70" + }, + { + "kind": "number", + "nativeSrc": "6161:2:70", + "nodeType": "YulLiteral", + "src": "6161:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6146:3:70", + "nodeType": "YulIdentifier", + "src": "6146:3:70" + }, + "nativeSrc": "6146:18:70", + "nodeType": "YulFunctionCall", + "src": "6146:18:70" + }, + { + "name": "value3", + "nativeSrc": "6166:6:70", + "nodeType": "YulIdentifier", + "src": "6166:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6139:6:70", + "nodeType": "YulIdentifier", + "src": "6139:6:70" + }, + "nativeSrc": "6139:34:70", + "nodeType": "YulFunctionCall", + "src": "6139:34:70" + }, + "nativeSrc": "6139:34:70", + "nodeType": "YulExpressionStatement", + "src": "6139:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6193:9:70", + "nodeType": "YulIdentifier", + "src": "6193:9:70" + }, + { + "kind": "number", + "nativeSrc": "6204:3:70", + "nodeType": "YulLiteral", + "src": "6204:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6189:3:70", + "nodeType": "YulIdentifier", + "src": "6189:3:70" + }, + "nativeSrc": "6189:19:70", + "nodeType": "YulFunctionCall", + "src": "6189:19:70" + }, + { + "name": "value4", + "nativeSrc": "6210:6:70", + "nodeType": "YulIdentifier", + "src": "6210:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6182:6:70", + "nodeType": "YulIdentifier", + "src": "6182:6:70" + }, + "nativeSrc": "6182:35:70", + "nodeType": "YulFunctionCall", + "src": "6182:35:70" + }, + "nativeSrc": "6182:35:70", + "nodeType": "YulExpressionStatement", + "src": "6182:35:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6237:9:70", + "nodeType": "YulIdentifier", + "src": "6237:9:70" + }, + { + "kind": "number", + "nativeSrc": "6248:3:70", + "nodeType": "YulLiteral", + "src": "6248:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6233:3:70", + "nodeType": "YulIdentifier", + "src": "6233:3:70" + }, + "nativeSrc": "6233:19:70", + "nodeType": "YulFunctionCall", + "src": "6233:19:70" + }, + { + "name": "value5", + "nativeSrc": "6254:6:70", + "nodeType": "YulIdentifier", + "src": "6254:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6226:6:70", + "nodeType": "YulIdentifier", + "src": "6226:6:70" + }, + "nativeSrc": "6226:35:70", + "nodeType": "YulFunctionCall", + "src": "6226:35:70" + }, + "nativeSrc": "6226:35:70", + "nodeType": "YulExpressionStatement", + "src": "6226:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_bool_t_address_t_bytes32_t_uint256_t_uint256_t_uint256__to_t_bool_t_address_t_bytes32_t_uint256_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "5696:571:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "5860:9:70", + "nodeType": "YulTypedName", + "src": "5860:9:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "5871:6:70", + "nodeType": "YulTypedName", + "src": "5871:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "5879:6:70", + "nodeType": "YulTypedName", + "src": "5879:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "5887:6:70", + "nodeType": "YulTypedName", + "src": "5887:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "5895:6:70", + "nodeType": "YulTypedName", + "src": "5895:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "5903:6:70", + "nodeType": "YulTypedName", + "src": "5903:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "5911:6:70", + "nodeType": "YulTypedName", + "src": "5911:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "5922:4:70", + "nodeType": "YulTypedName", + "src": "5922:4:70", + "type": "" + } + ], + "src": "5696:571:70" + }, + { + "body": { + "nativeSrc": "6367:92:70", + "nodeType": "YulBlock", + "src": "6367:92:70", + "statements": [ + { + "nativeSrc": "6377:26:70", + "nodeType": "YulAssignment", + "src": "6377:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6389:9:70", + "nodeType": "YulIdentifier", + "src": "6389:9:70" + }, + { + "kind": "number", + "nativeSrc": "6400:2:70", + "nodeType": "YulLiteral", + "src": "6400:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6385:3:70", + "nodeType": "YulIdentifier", + "src": "6385:3:70" + }, + "nativeSrc": "6385:18:70", + "nodeType": "YulFunctionCall", + "src": "6385:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "6377:4:70", + "nodeType": "YulIdentifier", + "src": "6377:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6419:9:70", + "nodeType": "YulIdentifier", + "src": "6419:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "6444:6:70", + "nodeType": "YulIdentifier", + "src": "6444:6:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "6437:6:70", + "nodeType": "YulIdentifier", + "src": "6437:6:70" + }, + "nativeSrc": "6437:14:70", + "nodeType": "YulFunctionCall", + "src": "6437:14:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "6430:6:70", + "nodeType": "YulIdentifier", + "src": "6430:6:70" + }, + "nativeSrc": "6430:22:70", + "nodeType": "YulFunctionCall", + "src": "6430:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6412:6:70", + "nodeType": "YulIdentifier", + "src": "6412:6:70" + }, + "nativeSrc": "6412:41:70", + "nodeType": "YulFunctionCall", + "src": "6412:41:70" + }, + "nativeSrc": "6412:41:70", + "nodeType": "YulExpressionStatement", + "src": "6412:41:70" + } + ] + }, + "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed", + "nativeSrc": "6272:187:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "6336:9:70", + "nodeType": "YulTypedName", + "src": "6336:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "6347:6:70", + "nodeType": "YulTypedName", + "src": "6347:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "6358:4:70", + "nodeType": "YulTypedName", + "src": "6358:4:70", + "type": "" + } + ], + "src": "6272:187:70" + }, + { + "body": { + "nativeSrc": "6613:172:70", + "nodeType": "YulBlock", + "src": "6613:172:70", + "statements": [ + { + "nativeSrc": "6623:26:70", + "nodeType": "YulAssignment", + "src": "6623:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6635:9:70", + "nodeType": "YulIdentifier", + "src": "6635:9:70" + }, + { + "kind": "number", + "nativeSrc": "6646:2:70", + "nodeType": "YulLiteral", + "src": "6646:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6631:3:70", + "nodeType": "YulIdentifier", + "src": "6631:3:70" + }, + "nativeSrc": "6631:18:70", + "nodeType": "YulFunctionCall", + "src": "6631:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "6623:4:70", + "nodeType": "YulIdentifier", + "src": "6623:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6665:9:70", + "nodeType": "YulIdentifier", + "src": "6665:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "6686:6:70", + "nodeType": "YulIdentifier", + "src": "6686:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "6680:5:70", + "nodeType": "YulIdentifier", + "src": "6680:5:70" + }, + "nativeSrc": "6680:13:70", + "nodeType": "YulFunctionCall", + "src": "6680:13:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "6703:3:70", + "nodeType": "YulLiteral", + "src": "6703:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "6708:1:70", + "nodeType": "YulLiteral", + "src": "6708:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "6699:3:70", + "nodeType": "YulIdentifier", + "src": "6699:3:70" + }, + "nativeSrc": "6699:11:70", + "nodeType": "YulFunctionCall", + "src": "6699:11:70" + }, + { + "kind": "number", + "nativeSrc": "6712:1:70", + "nodeType": "YulLiteral", + "src": "6712:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "6695:3:70", + "nodeType": "YulIdentifier", + "src": "6695:3:70" + }, + "nativeSrc": "6695:19:70", + "nodeType": "YulFunctionCall", + "src": "6695:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "6676:3:70", + "nodeType": "YulIdentifier", + "src": "6676:3:70" + }, + "nativeSrc": "6676:39:70", + "nodeType": "YulFunctionCall", + "src": "6676:39:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6658:6:70", + "nodeType": "YulIdentifier", + "src": "6658:6:70" + }, + "nativeSrc": "6658:58:70", + "nodeType": "YulFunctionCall", + "src": "6658:58:70" + }, + "nativeSrc": "6658:58:70", + "nodeType": "YulExpressionStatement", + "src": "6658:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "6736:9:70", + "nodeType": "YulIdentifier", + "src": "6736:9:70" + }, + { + "kind": "number", + "nativeSrc": "6747:4:70", + "nodeType": "YulLiteral", + "src": "6747:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6732:3:70", + "nodeType": "YulIdentifier", + "src": "6732:3:70" + }, + "nativeSrc": "6732:20:70", + "nodeType": "YulFunctionCall", + "src": "6732:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "6764:6:70", + "nodeType": "YulIdentifier", + "src": "6764:6:70" + }, + { + "kind": "number", + "nativeSrc": "6772:4:70", + "nodeType": "YulLiteral", + "src": "6772:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "6760:3:70", + "nodeType": "YulIdentifier", + "src": "6760:3:70" + }, + "nativeSrc": "6760:17:70", + "nodeType": "YulFunctionCall", + "src": "6760:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "6754:5:70", + "nodeType": "YulIdentifier", + "src": "6754:5:70" + }, + "nativeSrc": "6754:24:70", + "nodeType": "YulFunctionCall", + "src": "6754:24:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6725:6:70", + "nodeType": "YulIdentifier", + "src": "6725:6:70" + }, + "nativeSrc": "6725:54:70", + "nodeType": "YulFunctionCall", + "src": "6725:54:70" + }, + "nativeSrc": "6725:54:70", + "nodeType": "YulExpressionStatement", + "src": "6725:54:70" + } + ] + }, + "name": "abi_encode_tuple_t_struct$_State_$16305_memory_ptr__to_t_struct$_State_$16305_memory_ptr__fromStack_reversed", + "nativeSrc": "6464:321:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "6582:9:70", + "nodeType": "YulTypedName", + "src": "6582:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "6593:6:70", + "nodeType": "YulTypedName", + "src": "6593:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "6604:4:70", + "nodeType": "YulTypedName", + "src": "6604:4:70", + "type": "" + } + ], + "src": "6464:321:70" + }, + { + "body": { + "nativeSrc": "6833:59:70", + "nodeType": "YulBlock", + "src": "6833:59:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "6850:3:70", + "nodeType": "YulIdentifier", + "src": "6850:3:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "6859:5:70", + "nodeType": "YulIdentifier", + "src": "6859:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "6874:2:70", + "nodeType": "YulLiteral", + "src": "6874:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "6878:1:70", + "nodeType": "YulLiteral", + "src": "6878:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "6870:3:70", + "nodeType": "YulIdentifier", + "src": "6870:3:70" + }, + "nativeSrc": "6870:10:70", + "nodeType": "YulFunctionCall", + "src": "6870:10:70" + }, + { + "kind": "number", + "nativeSrc": "6882:1:70", + "nodeType": "YulLiteral", + "src": "6882:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "6866:3:70", + "nodeType": "YulIdentifier", + "src": "6866:3:70" + }, + "nativeSrc": "6866:18:70", + "nodeType": "YulFunctionCall", + "src": "6866:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "6855:3:70", + "nodeType": "YulIdentifier", + "src": "6855:3:70" + }, + "nativeSrc": "6855:30:70", + "nodeType": "YulFunctionCall", + "src": "6855:30:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "6843:6:70", + "nodeType": "YulIdentifier", + "src": "6843:6:70" + }, + "nativeSrc": "6843:43:70", + "nodeType": "YulFunctionCall", + "src": "6843:43:70" + }, + "nativeSrc": "6843:43:70", + "nodeType": "YulExpressionStatement", + "src": "6843:43:70" + } + ] + }, + "name": "abi_encode_uint64", + "nativeSrc": "6790:102:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "6817:5:70", + "nodeType": "YulTypedName", + "src": "6817:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "6824:3:70", + "nodeType": "YulTypedName", + "src": "6824:3:70", + "type": "" + } + ], + "src": "6790:102:70" + }, + { + "body": { + "nativeSrc": "7022:169:70", + "nodeType": "YulBlock", + "src": "7022:169:70", + "statements": [ + { + "nativeSrc": "7032:26:70", + "nodeType": "YulAssignment", + "src": "7032:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7044:9:70", + "nodeType": "YulIdentifier", + "src": "7044:9:70" + }, + { + "kind": "number", + "nativeSrc": "7055:2:70", + "nodeType": "YulLiteral", + "src": "7055:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7040:3:70", + "nodeType": "YulIdentifier", + "src": "7040:3:70" + }, + "nativeSrc": "7040:18:70", + "nodeType": "YulFunctionCall", + "src": "7040:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "7032:4:70", + "nodeType": "YulIdentifier", + "src": "7032:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7074:9:70", + "nodeType": "YulIdentifier", + "src": "7074:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "7089:6:70", + "nodeType": "YulIdentifier", + "src": "7089:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7105:2:70", + "nodeType": "YulLiteral", + "src": "7105:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "7109:1:70", + "nodeType": "YulLiteral", + "src": "7109:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "7101:3:70", + "nodeType": "YulIdentifier", + "src": "7101:3:70" + }, + "nativeSrc": "7101:10:70", + "nodeType": "YulFunctionCall", + "src": "7101:10:70" + }, + { + "kind": "number", + "nativeSrc": "7113:1:70", + "nodeType": "YulLiteral", + "src": "7113:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "7097:3:70", + "nodeType": "YulIdentifier", + "src": "7097:3:70" + }, + "nativeSrc": "7097:18:70", + "nodeType": "YulFunctionCall", + "src": "7097:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "7085:3:70", + "nodeType": "YulIdentifier", + "src": "7085:3:70" + }, + "nativeSrc": "7085:31:70", + "nodeType": "YulFunctionCall", + "src": "7085:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "7067:6:70", + "nodeType": "YulIdentifier", + "src": "7067:6:70" + }, + "nativeSrc": "7067:50:70", + "nodeType": "YulFunctionCall", + "src": "7067:50:70" + }, + "nativeSrc": "7067:50:70", + "nodeType": "YulExpressionStatement", + "src": "7067:50:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7137:9:70", + "nodeType": "YulIdentifier", + "src": "7137:9:70" + }, + { + "kind": "number", + "nativeSrc": "7148:2:70", + "nodeType": "YulLiteral", + "src": "7148:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7133:3:70", + "nodeType": "YulIdentifier", + "src": "7133:3:70" + }, + "nativeSrc": "7133:18:70", + "nodeType": "YulFunctionCall", + "src": "7133:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "7157:6:70", + "nodeType": "YulIdentifier", + "src": "7157:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7173:2:70", + "nodeType": "YulLiteral", + "src": "7173:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "7177:1:70", + "nodeType": "YulLiteral", + "src": "7177:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "7169:3:70", + "nodeType": "YulIdentifier", + "src": "7169:3:70" + }, + "nativeSrc": "7169:10:70", + "nodeType": "YulFunctionCall", + "src": "7169:10:70" + }, + { + "kind": "number", + "nativeSrc": "7181:1:70", + "nodeType": "YulLiteral", + "src": "7181:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "7165:3:70", + "nodeType": "YulIdentifier", + "src": "7165:3:70" + }, + "nativeSrc": "7165:18:70", + "nodeType": "YulFunctionCall", + "src": "7165:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "7153:3:70", + "nodeType": "YulIdentifier", + "src": "7153:3:70" + }, + "nativeSrc": "7153:31:70", + "nodeType": "YulFunctionCall", + "src": "7153:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "7126:6:70", + "nodeType": "YulIdentifier", + "src": "7126:6:70" + }, + "nativeSrc": "7126:59:70", + "nodeType": "YulFunctionCall", + "src": "7126:59:70" + }, + "nativeSrc": "7126:59:70", + "nodeType": "YulExpressionStatement", + "src": "7126:59:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint64_t_uint64__to_t_uint64_t_uint64__fromStack_reversed", + "nativeSrc": "6897:294:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "6983:9:70", + "nodeType": "YulTypedName", + "src": "6983:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "6994:6:70", + "nodeType": "YulTypedName", + "src": "6994:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "7002:6:70", + "nodeType": "YulTypedName", + "src": "7002:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "7013:4:70", + "nodeType": "YulTypedName", + "src": "7013:4:70", + "type": "" + } + ], + "src": "6897:294:70" + }, + { + "body": { + "nativeSrc": "7300:404:70", + "nodeType": "YulBlock", + "src": "7300:404:70", + "statements": [ + { + "body": { + "nativeSrc": "7346:16:70", + "nodeType": "YulBlock", + "src": "7346:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "7355:1:70", + "nodeType": "YulLiteral", + "src": "7355:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "7358:1:70", + "nodeType": "YulLiteral", + "src": "7358:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "7348:6:70", + "nodeType": "YulIdentifier", + "src": "7348:6:70" + }, + "nativeSrc": "7348:12:70", + "nodeType": "YulFunctionCall", + "src": "7348:12:70" + }, + "nativeSrc": "7348:12:70", + "nodeType": "YulExpressionStatement", + "src": "7348:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "7321:7:70", + "nodeType": "YulIdentifier", + "src": "7321:7:70" + }, + { + "name": "headStart", + "nativeSrc": "7330:9:70", + "nodeType": "YulIdentifier", + "src": "7330:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "7317:3:70", + "nodeType": "YulIdentifier", + "src": "7317:3:70" + }, + "nativeSrc": "7317:23:70", + "nodeType": "YulFunctionCall", + "src": "7317:23:70" + }, + { + "kind": "number", + "nativeSrc": "7342:2:70", + "nodeType": "YulLiteral", + "src": "7342:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "7313:3:70", + "nodeType": "YulIdentifier", + "src": "7313:3:70" + }, + "nativeSrc": "7313:32:70", + "nodeType": "YulFunctionCall", + "src": "7313:32:70" + }, + "nativeSrc": "7310:52:70", + "nodeType": "YulIf", + "src": "7310:52:70" + }, + { + "nativeSrc": "7371:36:70", + "nodeType": "YulVariableDeclaration", + "src": "7371:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7397:9:70", + "nodeType": "YulIdentifier", + "src": "7397:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "7384:12:70", + "nodeType": "YulIdentifier", + "src": "7384:12:70" + }, + "nativeSrc": "7384:23:70", + "nodeType": "YulFunctionCall", + "src": "7384:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "7375:5:70", + "nodeType": "YulTypedName", + "src": "7375:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "7441:5:70", + "nodeType": "YulIdentifier", + "src": "7441:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "7416:24:70", + "nodeType": "YulIdentifier", + "src": "7416:24:70" + }, + "nativeSrc": "7416:31:70", + "nodeType": "YulFunctionCall", + "src": "7416:31:70" + }, + "nativeSrc": "7416:31:70", + "nodeType": "YulExpressionStatement", + "src": "7416:31:70" + }, + { + "nativeSrc": "7456:15:70", + "nodeType": "YulAssignment", + "src": "7456:15:70", + "value": { + "name": "value", + "nativeSrc": "7466:5:70", + "nodeType": "YulIdentifier", + "src": "7466:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "7456:6:70", + "nodeType": "YulIdentifier", + "src": "7456:6:70" + } + ] + }, + { + "nativeSrc": "7480:47:70", + "nodeType": "YulVariableDeclaration", + "src": "7480:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7512:9:70", + "nodeType": "YulIdentifier", + "src": "7512:9:70" + }, + { + "kind": "number", + "nativeSrc": "7523:2:70", + "nodeType": "YulLiteral", + "src": "7523:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7508:3:70", + "nodeType": "YulIdentifier", + "src": "7508:3:70" + }, + "nativeSrc": "7508:18:70", + "nodeType": "YulFunctionCall", + "src": "7508:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "7495:12:70", + "nodeType": "YulIdentifier", + "src": "7495:12:70" + }, + "nativeSrc": "7495:32:70", + "nodeType": "YulFunctionCall", + "src": "7495:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "7484:7:70", + "nodeType": "YulTypedName", + "src": "7484:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "7561:7:70", + "nodeType": "YulIdentifier", + "src": "7561:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "7536:24:70", + "nodeType": "YulIdentifier", + "src": "7536:24:70" + }, + "nativeSrc": "7536:33:70", + "nodeType": "YulFunctionCall", + "src": "7536:33:70" + }, + "nativeSrc": "7536:33:70", + "nodeType": "YulExpressionStatement", + "src": "7536:33:70" + }, + { + "nativeSrc": "7578:17:70", + "nodeType": "YulAssignment", + "src": "7578:17:70", + "value": { + "name": "value_1", + "nativeSrc": "7588:7:70", + "nodeType": "YulIdentifier", + "src": "7588:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "7578:6:70", + "nodeType": "YulIdentifier", + "src": "7578:6:70" + } + ] + }, + { + "nativeSrc": "7604:16:70", + "nodeType": "YulVariableDeclaration", + "src": "7604:16:70", + "value": { + "kind": "number", + "nativeSrc": "7619:1:70", + "nodeType": "YulLiteral", + "src": "7619:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "7608:7:70", + "nodeType": "YulTypedName", + "src": "7608:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "7629:43:70", + "nodeType": "YulAssignment", + "src": "7629:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7657:9:70", + "nodeType": "YulIdentifier", + "src": "7657:9:70" + }, + { + "kind": "number", + "nativeSrc": "7668:2:70", + "nodeType": "YulLiteral", + "src": "7668:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7653:3:70", + "nodeType": "YulIdentifier", + "src": "7653:3:70" + }, + "nativeSrc": "7653:18:70", + "nodeType": "YulFunctionCall", + "src": "7653:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "7640:12:70", + "nodeType": "YulIdentifier", + "src": "7640:12:70" + }, + "nativeSrc": "7640:32:70", + "nodeType": "YulFunctionCall", + "src": "7640:32:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "7629:7:70", + "nodeType": "YulIdentifier", + "src": "7629:7:70" + } + ] + }, + { + "nativeSrc": "7681:17:70", + "nodeType": "YulAssignment", + "src": "7681:17:70", + "value": { + "name": "value_2", + "nativeSrc": "7691:7:70", + "nodeType": "YulIdentifier", + "src": "7691:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "7681:6:70", + "nodeType": "YulIdentifier", + "src": "7681:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_bytes32", + "nativeSrc": "7196:508:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "7250:9:70", + "nodeType": "YulTypedName", + "src": "7250:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "7261:7:70", + "nodeType": "YulTypedName", + "src": "7261:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "7273:6:70", + "nodeType": "YulTypedName", + "src": "7273:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "7281:6:70", + "nodeType": "YulTypedName", + "src": "7281:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "7289:6:70", + "nodeType": "YulTypedName", + "src": "7289:6:70", + "type": "" + } + ], + "src": "7196:508:70" + }, + { + "body": { + "nativeSrc": "7838:119:70", + "nodeType": "YulBlock", + "src": "7838:119:70", + "statements": [ + { + "nativeSrc": "7848:26:70", + "nodeType": "YulAssignment", + "src": "7848:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7860:9:70", + "nodeType": "YulIdentifier", + "src": "7860:9:70" + }, + { + "kind": "number", + "nativeSrc": "7871:2:70", + "nodeType": "YulLiteral", + "src": "7871:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7856:3:70", + "nodeType": "YulIdentifier", + "src": "7856:3:70" + }, + "nativeSrc": "7856:18:70", + "nodeType": "YulFunctionCall", + "src": "7856:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "7848:4:70", + "nodeType": "YulIdentifier", + "src": "7848:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7890:9:70", + "nodeType": "YulIdentifier", + "src": "7890:9:70" + }, + { + "name": "value0", + "nativeSrc": "7901:6:70", + "nodeType": "YulIdentifier", + "src": "7901:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "7883:6:70", + "nodeType": "YulIdentifier", + "src": "7883:6:70" + }, + "nativeSrc": "7883:25:70", + "nodeType": "YulFunctionCall", + "src": "7883:25:70" + }, + "nativeSrc": "7883:25:70", + "nodeType": "YulExpressionStatement", + "src": "7883:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "7928:9:70", + "nodeType": "YulIdentifier", + "src": "7928:9:70" + }, + { + "kind": "number", + "nativeSrc": "7939:2:70", + "nodeType": "YulLiteral", + "src": "7939:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "7924:3:70", + "nodeType": "YulIdentifier", + "src": "7924:3:70" + }, + "nativeSrc": "7924:18:70", + "nodeType": "YulFunctionCall", + "src": "7924:18:70" + }, + { + "name": "value1", + "nativeSrc": "7944:6:70", + "nodeType": "YulIdentifier", + "src": "7944:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "7917:6:70", + "nodeType": "YulIdentifier", + "src": "7917:6:70" + }, + "nativeSrc": "7917:34:70", + "nodeType": "YulFunctionCall", + "src": "7917:34:70" + }, + "nativeSrc": "7917:34:70", + "nodeType": "YulExpressionStatement", + "src": "7917:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "7709:248:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "7799:9:70", + "nodeType": "YulTypedName", + "src": "7799:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "7810:6:70", + "nodeType": "YulTypedName", + "src": "7810:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "7818:6:70", + "nodeType": "YulTypedName", + "src": "7818:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "7829:4:70", + "nodeType": "YulTypedName", + "src": "7829:4:70", + "type": "" + } + ], + "src": "7709:248:70" + }, + { + "body": { + "nativeSrc": "8066:404:70", + "nodeType": "YulBlock", + "src": "8066:404:70", + "statements": [ + { + "body": { + "nativeSrc": "8112:16:70", + "nodeType": "YulBlock", + "src": "8112:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8121:1:70", + "nodeType": "YulLiteral", + "src": "8121:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "8124:1:70", + "nodeType": "YulLiteral", + "src": "8124:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "8114:6:70", + "nodeType": "YulIdentifier", + "src": "8114:6:70" + }, + "nativeSrc": "8114:12:70", + "nodeType": "YulFunctionCall", + "src": "8114:12:70" + }, + "nativeSrc": "8114:12:70", + "nodeType": "YulExpressionStatement", + "src": "8114:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "8087:7:70", + "nodeType": "YulIdentifier", + "src": "8087:7:70" + }, + { + "name": "headStart", + "nativeSrc": "8096:9:70", + "nodeType": "YulIdentifier", + "src": "8096:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "8083:3:70", + "nodeType": "YulIdentifier", + "src": "8083:3:70" + }, + "nativeSrc": "8083:23:70", + "nodeType": "YulFunctionCall", + "src": "8083:23:70" + }, + { + "kind": "number", + "nativeSrc": "8108:2:70", + "nodeType": "YulLiteral", + "src": "8108:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "8079:3:70", + "nodeType": "YulIdentifier", + "src": "8079:3:70" + }, + "nativeSrc": "8079:32:70", + "nodeType": "YulFunctionCall", + "src": "8079:32:70" + }, + "nativeSrc": "8076:52:70", + "nodeType": "YulIf", + "src": "8076:52:70" + }, + { + "nativeSrc": "8137:36:70", + "nodeType": "YulVariableDeclaration", + "src": "8137:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8163:9:70", + "nodeType": "YulIdentifier", + "src": "8163:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "8150:12:70", + "nodeType": "YulIdentifier", + "src": "8150:12:70" + }, + "nativeSrc": "8150:23:70", + "nodeType": "YulFunctionCall", + "src": "8150:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "8141:5:70", + "nodeType": "YulTypedName", + "src": "8141:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "8207:5:70", + "nodeType": "YulIdentifier", + "src": "8207:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "8182:24:70", + "nodeType": "YulIdentifier", + "src": "8182:24:70" + }, + "nativeSrc": "8182:31:70", + "nodeType": "YulFunctionCall", + "src": "8182:31:70" + }, + "nativeSrc": "8182:31:70", + "nodeType": "YulExpressionStatement", + "src": "8182:31:70" + }, + { + "nativeSrc": "8222:15:70", + "nodeType": "YulAssignment", + "src": "8222:15:70", + "value": { + "name": "value", + "nativeSrc": "8232:5:70", + "nodeType": "YulIdentifier", + "src": "8232:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "8222:6:70", + "nodeType": "YulIdentifier", + "src": "8222:6:70" + } + ] + }, + { + "nativeSrc": "8246:47:70", + "nodeType": "YulVariableDeclaration", + "src": "8246:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8278:9:70", + "nodeType": "YulIdentifier", + "src": "8278:9:70" + }, + { + "kind": "number", + "nativeSrc": "8289:2:70", + "nodeType": "YulLiteral", + "src": "8289:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8274:3:70", + "nodeType": "YulIdentifier", + "src": "8274:3:70" + }, + "nativeSrc": "8274:18:70", + "nodeType": "YulFunctionCall", + "src": "8274:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "8261:12:70", + "nodeType": "YulIdentifier", + "src": "8261:12:70" + }, + "nativeSrc": "8261:32:70", + "nodeType": "YulFunctionCall", + "src": "8261:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "8250:7:70", + "nodeType": "YulTypedName", + "src": "8250:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "8327:7:70", + "nodeType": "YulIdentifier", + "src": "8327:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "8302:24:70", + "nodeType": "YulIdentifier", + "src": "8302:24:70" + }, + "nativeSrc": "8302:33:70", + "nodeType": "YulFunctionCall", + "src": "8302:33:70" + }, + "nativeSrc": "8302:33:70", + "nodeType": "YulExpressionStatement", + "src": "8302:33:70" + }, + { + "nativeSrc": "8344:17:70", + "nodeType": "YulAssignment", + "src": "8344:17:70", + "value": { + "name": "value_1", + "nativeSrc": "8354:7:70", + "nodeType": "YulIdentifier", + "src": "8354:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "8344:6:70", + "nodeType": "YulIdentifier", + "src": "8344:6:70" + } + ] + }, + { + "nativeSrc": "8370:16:70", + "nodeType": "YulVariableDeclaration", + "src": "8370:16:70", + "value": { + "kind": "number", + "nativeSrc": "8385:1:70", + "nodeType": "YulLiteral", + "src": "8385:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "8374:7:70", + "nodeType": "YulTypedName", + "src": "8374:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "8395:43:70", + "nodeType": "YulAssignment", + "src": "8395:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8423:9:70", + "nodeType": "YulIdentifier", + "src": "8423:9:70" + }, + { + "kind": "number", + "nativeSrc": "8434:2:70", + "nodeType": "YulLiteral", + "src": "8434:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8419:3:70", + "nodeType": "YulIdentifier", + "src": "8419:3:70" + }, + "nativeSrc": "8419:18:70", + "nodeType": "YulFunctionCall", + "src": "8419:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "8406:12:70", + "nodeType": "YulIdentifier", + "src": "8406:12:70" + }, + "nativeSrc": "8406:32:70", + "nodeType": "YulFunctionCall", + "src": "8406:32:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "8395:7:70", + "nodeType": "YulIdentifier", + "src": "8395:7:70" + } + ] + }, + { + "nativeSrc": "8447:17:70", + "nodeType": "YulAssignment", + "src": "8447:17:70", + "value": { + "name": "value_2", + "nativeSrc": "8457:7:70", + "nodeType": "YulIdentifier", + "src": "8457:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "8447:6:70", + "nodeType": "YulIdentifier", + "src": "8447:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_addresst_uint256", + "nativeSrc": "7962:508:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "8016:9:70", + "nodeType": "YulTypedName", + "src": "8016:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "8027:7:70", + "nodeType": "YulTypedName", + "src": "8027:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "8039:6:70", + "nodeType": "YulTypedName", + "src": "8039:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "8047:6:70", + "nodeType": "YulTypedName", + "src": "8047:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "8055:6:70", + "nodeType": "YulTypedName", + "src": "8055:6:70", + "type": "" + } + ], + "src": "7962:508:70" + }, + { + "body": { + "nativeSrc": "8832:881:70", + "nodeType": "YulBlock", + "src": "8832:881:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8849:9:70", + "nodeType": "YulIdentifier", + "src": "8849:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "8864:6:70", + "nodeType": "YulIdentifier", + "src": "8864:6:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "8876:3:70", + "nodeType": "YulLiteral", + "src": "8876:3:70", + "type": "", + "value": "248" + }, + { + "kind": "number", + "nativeSrc": "8881:3:70", + "nodeType": "YulLiteral", + "src": "8881:3:70", + "type": "", + "value": "255" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "8872:3:70", + "nodeType": "YulIdentifier", + "src": "8872:3:70" + }, + "nativeSrc": "8872:13:70", + "nodeType": "YulFunctionCall", + "src": "8872:13:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "8860:3:70", + "nodeType": "YulIdentifier", + "src": "8860:3:70" + }, + "nativeSrc": "8860:26:70", + "nodeType": "YulFunctionCall", + "src": "8860:26:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "8842:6:70", + "nodeType": "YulIdentifier", + "src": "8842:6:70" + }, + "nativeSrc": "8842:45:70", + "nodeType": "YulFunctionCall", + "src": "8842:45:70" + }, + "nativeSrc": "8842:45:70", + "nodeType": "YulExpressionStatement", + "src": "8842:45:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8907:9:70", + "nodeType": "YulIdentifier", + "src": "8907:9:70" + }, + { + "kind": "number", + "nativeSrc": "8918:2:70", + "nodeType": "YulLiteral", + "src": "8918:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8903:3:70", + "nodeType": "YulIdentifier", + "src": "8903:3:70" + }, + "nativeSrc": "8903:18:70", + "nodeType": "YulFunctionCall", + "src": "8903:18:70" + }, + { + "kind": "number", + "nativeSrc": "8923:3:70", + "nodeType": "YulLiteral", + "src": "8923:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "8896:6:70", + "nodeType": "YulIdentifier", + "src": "8896:6:70" + }, + "nativeSrc": "8896:31:70", + "nodeType": "YulFunctionCall", + "src": "8896:31:70" + }, + "nativeSrc": "8896:31:70", + "nodeType": "YulExpressionStatement", + "src": "8896:31:70" + }, + { + "nativeSrc": "8936:60:70", + "nodeType": "YulVariableDeclaration", + "src": "8936:60:70", + "value": { + "arguments": [ + { + "name": "value1", + "nativeSrc": "8968:6:70", + "nodeType": "YulIdentifier", + "src": "8968:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "8980:9:70", + "nodeType": "YulIdentifier", + "src": "8980:9:70" + }, + { + "kind": "number", + "nativeSrc": "8991:3:70", + "nodeType": "YulLiteral", + "src": "8991:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "8976:3:70", + "nodeType": "YulIdentifier", + "src": "8976:3:70" + }, + "nativeSrc": "8976:19:70", + "nodeType": "YulFunctionCall", + "src": "8976:19:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "8950:17:70", + "nodeType": "YulIdentifier", + "src": "8950:17:70" + }, + "nativeSrc": "8950:46:70", + "nodeType": "YulFunctionCall", + "src": "8950:46:70" + }, + "variables": [ + { + "name": "tail_1", + "nativeSrc": "8940:6:70", + "nodeType": "YulTypedName", + "src": "8940:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "9016:9:70", + "nodeType": "YulIdentifier", + "src": "9016:9:70" + }, + { + "kind": "number", + "nativeSrc": "9027:2:70", + "nodeType": "YulLiteral", + "src": "9027:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9012:3:70", + "nodeType": "YulIdentifier", + "src": "9012:3:70" + }, + "nativeSrc": "9012:18:70", + "nodeType": "YulFunctionCall", + "src": "9012:18:70" + }, + { + "arguments": [ + { + "name": "tail_1", + "nativeSrc": "9036:6:70", + "nodeType": "YulIdentifier", + "src": "9036:6:70" + }, + { + "name": "headStart", + "nativeSrc": "9044:9:70", + "nodeType": "YulIdentifier", + "src": "9044:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9032:3:70", + "nodeType": "YulIdentifier", + "src": "9032:3:70" + }, + "nativeSrc": "9032:22:70", + "nodeType": "YulFunctionCall", + "src": "9032:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9005:6:70", + "nodeType": "YulIdentifier", + "src": "9005:6:70" + }, + "nativeSrc": "9005:50:70", + "nodeType": "YulFunctionCall", + "src": "9005:50:70" + }, + "nativeSrc": "9005:50:70", + "nodeType": "YulExpressionStatement", + "src": "9005:50:70" + }, + { + "nativeSrc": "9064:47:70", + "nodeType": "YulVariableDeclaration", + "src": "9064:47:70", + "value": { + "arguments": [ + { + "name": "value2", + "nativeSrc": "9096:6:70", + "nodeType": "YulIdentifier", + "src": "9096:6:70" + }, + { + "name": "tail_1", + "nativeSrc": "9104:6:70", + "nodeType": "YulIdentifier", + "src": "9104:6:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "9078:17:70", + "nodeType": "YulIdentifier", + "src": "9078:17:70" + }, + "nativeSrc": "9078:33:70", + "nodeType": "YulFunctionCall", + "src": "9078:33:70" + }, + "variables": [ + { + "name": "tail_2", + "nativeSrc": "9068:6:70", + "nodeType": "YulTypedName", + "src": "9068:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "9131:9:70", + "nodeType": "YulIdentifier", + "src": "9131:9:70" + }, + { + "kind": "number", + "nativeSrc": "9142:2:70", + "nodeType": "YulLiteral", + "src": "9142:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9127:3:70", + "nodeType": "YulIdentifier", + "src": "9127:3:70" + }, + "nativeSrc": "9127:18:70", + "nodeType": "YulFunctionCall", + "src": "9127:18:70" + }, + { + "name": "value3", + "nativeSrc": "9147:6:70", + "nodeType": "YulIdentifier", + "src": "9147:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9120:6:70", + "nodeType": "YulIdentifier", + "src": "9120:6:70" + }, + "nativeSrc": "9120:34:70", + "nodeType": "YulFunctionCall", + "src": "9120:34:70" + }, + "nativeSrc": "9120:34:70", + "nodeType": "YulExpressionStatement", + "src": "9120:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "9174:9:70", + "nodeType": "YulIdentifier", + "src": "9174:9:70" + }, + { + "kind": "number", + "nativeSrc": "9185:3:70", + "nodeType": "YulLiteral", + "src": "9185:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9170:3:70", + "nodeType": "YulIdentifier", + "src": "9170:3:70" + }, + "nativeSrc": "9170:19:70", + "nodeType": "YulFunctionCall", + "src": "9170:19:70" + }, + { + "arguments": [ + { + "name": "value4", + "nativeSrc": "9195:6:70", + "nodeType": "YulIdentifier", + "src": "9195:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9211:3:70", + "nodeType": "YulLiteral", + "src": "9211:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "9216:1:70", + "nodeType": "YulLiteral", + "src": "9216:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9207:3:70", + "nodeType": "YulIdentifier", + "src": "9207:3:70" + }, + "nativeSrc": "9207:11:70", + "nodeType": "YulFunctionCall", + "src": "9207:11:70" + }, + { + "kind": "number", + "nativeSrc": "9220:1:70", + "nodeType": "YulLiteral", + "src": "9220:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9203:3:70", + "nodeType": "YulIdentifier", + "src": "9203:3:70" + }, + "nativeSrc": "9203:19:70", + "nodeType": "YulFunctionCall", + "src": "9203:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "9191:3:70", + "nodeType": "YulIdentifier", + "src": "9191:3:70" + }, + "nativeSrc": "9191:32:70", + "nodeType": "YulFunctionCall", + "src": "9191:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9163:6:70", + "nodeType": "YulIdentifier", + "src": "9163:6:70" + }, + "nativeSrc": "9163:61:70", + "nodeType": "YulFunctionCall", + "src": "9163:61:70" + }, + "nativeSrc": "9163:61:70", + "nodeType": "YulExpressionStatement", + "src": "9163:61:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "9244:9:70", + "nodeType": "YulIdentifier", + "src": "9244:9:70" + }, + { + "kind": "number", + "nativeSrc": "9255:3:70", + "nodeType": "YulLiteral", + "src": "9255:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9240:3:70", + "nodeType": "YulIdentifier", + "src": "9240:3:70" + }, + "nativeSrc": "9240:19:70", + "nodeType": "YulFunctionCall", + "src": "9240:19:70" + }, + { + "name": "value5", + "nativeSrc": "9261:6:70", + "nodeType": "YulIdentifier", + "src": "9261:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9233:6:70", + "nodeType": "YulIdentifier", + "src": "9233:6:70" + }, + "nativeSrc": "9233:35:70", + "nodeType": "YulFunctionCall", + "src": "9233:35:70" + }, + "nativeSrc": "9233:35:70", + "nodeType": "YulExpressionStatement", + "src": "9233:35:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "9288:9:70", + "nodeType": "YulIdentifier", + "src": "9288:9:70" + }, + { + "kind": "number", + "nativeSrc": "9299:3:70", + "nodeType": "YulLiteral", + "src": "9299:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9284:3:70", + "nodeType": "YulIdentifier", + "src": "9284:3:70" + }, + "nativeSrc": "9284:19:70", + "nodeType": "YulFunctionCall", + "src": "9284:19:70" + }, + { + "arguments": [ + { + "name": "tail_2", + "nativeSrc": "9309:6:70", + "nodeType": "YulIdentifier", + "src": "9309:6:70" + }, + { + "name": "headStart", + "nativeSrc": "9317:9:70", + "nodeType": "YulIdentifier", + "src": "9317:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9305:3:70", + "nodeType": "YulIdentifier", + "src": "9305:3:70" + }, + "nativeSrc": "9305:22:70", + "nodeType": "YulFunctionCall", + "src": "9305:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9277:6:70", + "nodeType": "YulIdentifier", + "src": "9277:6:70" + }, + "nativeSrc": "9277:51:70", + "nodeType": "YulFunctionCall", + "src": "9277:51:70" + }, + "nativeSrc": "9277:51:70", + "nodeType": "YulExpressionStatement", + "src": "9277:51:70" + }, + { + "nativeSrc": "9337:17:70", + "nodeType": "YulVariableDeclaration", + "src": "9337:17:70", + "value": { + "name": "tail_2", + "nativeSrc": "9348:6:70", + "nodeType": "YulIdentifier", + "src": "9348:6:70" + }, + "variables": [ + { + "name": "pos", + "nativeSrc": "9341:3:70", + "nodeType": "YulTypedName", + "src": "9341:3:70", + "type": "" + } + ] + }, + { + "nativeSrc": "9363:27:70", + "nodeType": "YulVariableDeclaration", + "src": "9363:27:70", + "value": { + "arguments": [ + { + "name": "value6", + "nativeSrc": "9383:6:70", + "nodeType": "YulIdentifier", + "src": "9383:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "9377:5:70", + "nodeType": "YulIdentifier", + "src": "9377:5:70" + }, + "nativeSrc": "9377:13:70", + "nodeType": "YulFunctionCall", + "src": "9377:13:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "9367:6:70", + "nodeType": "YulTypedName", + "src": "9367:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tail_2", + "nativeSrc": "9406:6:70", + "nodeType": "YulIdentifier", + "src": "9406:6:70" + }, + { + "name": "length", + "nativeSrc": "9414:6:70", + "nodeType": "YulIdentifier", + "src": "9414:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9399:6:70", + "nodeType": "YulIdentifier", + "src": "9399:6:70" + }, + "nativeSrc": "9399:22:70", + "nodeType": "YulFunctionCall", + "src": "9399:22:70" + }, + "nativeSrc": "9399:22:70", + "nodeType": "YulExpressionStatement", + "src": "9399:22:70" + }, + { + "nativeSrc": "9430:22:70", + "nodeType": "YulAssignment", + "src": "9430:22:70", + "value": { + "arguments": [ + { + "name": "tail_2", + "nativeSrc": "9441:6:70", + "nodeType": "YulIdentifier", + "src": "9441:6:70" + }, + { + "kind": "number", + "nativeSrc": "9449:2:70", + "nodeType": "YulLiteral", + "src": "9449:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9437:3:70", + "nodeType": "YulIdentifier", + "src": "9437:3:70" + }, + "nativeSrc": "9437:15:70", + "nodeType": "YulFunctionCall", + "src": "9437:15:70" + }, + "variableNames": [ + { + "name": "pos", + "nativeSrc": "9430:3:70", + "nodeType": "YulIdentifier", + "src": "9430:3:70" + } + ] + }, + { + "nativeSrc": "9461:29:70", + "nodeType": "YulVariableDeclaration", + "src": "9461:29:70", + "value": { + "arguments": [ + { + "name": "value6", + "nativeSrc": "9479:6:70", + "nodeType": "YulIdentifier", + "src": "9479:6:70" + }, + { + "kind": "number", + "nativeSrc": "9487:2:70", + "nodeType": "YulLiteral", + "src": "9487:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9475:3:70", + "nodeType": "YulIdentifier", + "src": "9475:3:70" + }, + "nativeSrc": "9475:15:70", + "nodeType": "YulFunctionCall", + "src": "9475:15:70" + }, + "variables": [ + { + "name": "srcPtr", + "nativeSrc": "9465:6:70", + "nodeType": "YulTypedName", + "src": "9465:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "9499:10:70", + "nodeType": "YulVariableDeclaration", + "src": "9499:10:70", + "value": { + "kind": "number", + "nativeSrc": "9508:1:70", + "nodeType": "YulLiteral", + "src": "9508:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "9503:1:70", + "nodeType": "YulTypedName", + "src": "9503:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "9567:120:70", + "nodeType": "YulBlock", + "src": "9567:120:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "9588:3:70", + "nodeType": "YulIdentifier", + "src": "9588:3:70" + }, + { + "arguments": [ + { + "name": "srcPtr", + "nativeSrc": "9599:6:70", + "nodeType": "YulIdentifier", + "src": "9599:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "9593:5:70", + "nodeType": "YulIdentifier", + "src": "9593:5:70" + }, + "nativeSrc": "9593:13:70", + "nodeType": "YulFunctionCall", + "src": "9593:13:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "9581:6:70", + "nodeType": "YulIdentifier", + "src": "9581:6:70" + }, + "nativeSrc": "9581:26:70", + "nodeType": "YulFunctionCall", + "src": "9581:26:70" + }, + "nativeSrc": "9581:26:70", + "nodeType": "YulExpressionStatement", + "src": "9581:26:70" + }, + { + "nativeSrc": "9620:19:70", + "nodeType": "YulAssignment", + "src": "9620:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "9631:3:70", + "nodeType": "YulIdentifier", + "src": "9631:3:70" + }, + { + "kind": "number", + "nativeSrc": "9636:2:70", + "nodeType": "YulLiteral", + "src": "9636:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9627:3:70", + "nodeType": "YulIdentifier", + "src": "9627:3:70" + }, + "nativeSrc": "9627:12:70", + "nodeType": "YulFunctionCall", + "src": "9627:12:70" + }, + "variableNames": [ + { + "name": "pos", + "nativeSrc": "9620:3:70", + "nodeType": "YulIdentifier", + "src": "9620:3:70" + } + ] + }, + { + "nativeSrc": "9652:25:70", + "nodeType": "YulAssignment", + "src": "9652:25:70", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nativeSrc": "9666:6:70", + "nodeType": "YulIdentifier", + "src": "9666:6:70" + }, + { + "kind": "number", + "nativeSrc": "9674:2:70", + "nodeType": "YulLiteral", + "src": "9674:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9662:3:70", + "nodeType": "YulIdentifier", + "src": "9662:3:70" + }, + "nativeSrc": "9662:15:70", + "nodeType": "YulFunctionCall", + "src": "9662:15:70" + }, + "variableNames": [ + { + "name": "srcPtr", + "nativeSrc": "9652:6:70", + "nodeType": "YulIdentifier", + "src": "9652:6:70" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "9529:1:70", + "nodeType": "YulIdentifier", + "src": "9529:1:70" + }, + { + "name": "length", + "nativeSrc": "9532:6:70", + "nodeType": "YulIdentifier", + "src": "9532:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "9526:2:70", + "nodeType": "YulIdentifier", + "src": "9526:2:70" + }, + "nativeSrc": "9526:13:70", + "nodeType": "YulFunctionCall", + "src": "9526:13:70" + }, + "nativeSrc": "9518:169:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "9540:18:70", + "nodeType": "YulBlock", + "src": "9540:18:70", + "statements": [ + { + "nativeSrc": "9542:14:70", + "nodeType": "YulAssignment", + "src": "9542:14:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "9551:1:70", + "nodeType": "YulIdentifier", + "src": "9551:1:70" + }, + { + "kind": "number", + "nativeSrc": "9554:1:70", + "nodeType": "YulLiteral", + "src": "9554:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "9547:3:70", + "nodeType": "YulIdentifier", + "src": "9547:3:70" + }, + "nativeSrc": "9547:9:70", + "nodeType": "YulFunctionCall", + "src": "9547:9:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "9542:1:70", + "nodeType": "YulIdentifier", + "src": "9542:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "9522:3:70", + "nodeType": "YulBlock", + "src": "9522:3:70", + "statements": [] + }, + "src": "9518:169:70" + }, + { + "nativeSrc": "9696:11:70", + "nodeType": "YulAssignment", + "src": "9696:11:70", + "value": { + "name": "pos", + "nativeSrc": "9704:3:70", + "nodeType": "YulIdentifier", + "src": "9704:3:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "9696:4:70", + "nodeType": "YulIdentifier", + "src": "9696:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__to_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed", + "nativeSrc": "8475:1238:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "8753:9:70", + "nodeType": "YulTypedName", + "src": "8753:9:70", + "type": "" + }, + { + "name": "value6", + "nativeSrc": "8764:6:70", + "nodeType": "YulTypedName", + "src": "8764:6:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "8772:6:70", + "nodeType": "YulTypedName", + "src": "8772:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "8780:6:70", + "nodeType": "YulTypedName", + "src": "8780:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "8788:6:70", + "nodeType": "YulTypedName", + "src": "8788:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "8796:6:70", + "nodeType": "YulTypedName", + "src": "8796:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "8804:6:70", + "nodeType": "YulTypedName", + "src": "8804:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "8812:6:70", + "nodeType": "YulTypedName", + "src": "8812:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "8823:4:70", + "nodeType": "YulTypedName", + "src": "8823:4:70", + "type": "" + } + ], + "src": "8475:1238:70" + }, + { + "body": { + "nativeSrc": "9834:505:70", + "nodeType": "YulBlock", + "src": "9834:505:70", + "statements": [ + { + "body": { + "nativeSrc": "9880:16:70", + "nodeType": "YulBlock", + "src": "9880:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9889:1:70", + "nodeType": "YulLiteral", + "src": "9889:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "9892:1:70", + "nodeType": "YulLiteral", + "src": "9892:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "9882:6:70", + "nodeType": "YulIdentifier", + "src": "9882:6:70" + }, + "nativeSrc": "9882:12:70", + "nodeType": "YulFunctionCall", + "src": "9882:12:70" + }, + "nativeSrc": "9882:12:70", + "nodeType": "YulExpressionStatement", + "src": "9882:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "9855:7:70", + "nodeType": "YulIdentifier", + "src": "9855:7:70" + }, + { + "name": "headStart", + "nativeSrc": "9864:9:70", + "nodeType": "YulIdentifier", + "src": "9864:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9851:3:70", + "nodeType": "YulIdentifier", + "src": "9851:3:70" + }, + "nativeSrc": "9851:23:70", + "nodeType": "YulFunctionCall", + "src": "9851:23:70" + }, + { + "kind": "number", + "nativeSrc": "9876:2:70", + "nodeType": "YulLiteral", + "src": "9876:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "9847:3:70", + "nodeType": "YulIdentifier", + "src": "9847:3:70" + }, + "nativeSrc": "9847:32:70", + "nodeType": "YulFunctionCall", + "src": "9847:32:70" + }, + "nativeSrc": "9844:52:70", + "nodeType": "YulIf", + "src": "9844:52:70" + }, + { + "nativeSrc": "9905:37:70", + "nodeType": "YulVariableDeclaration", + "src": "9905:37:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "9932:9:70", + "nodeType": "YulIdentifier", + "src": "9932:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "9919:12:70", + "nodeType": "YulIdentifier", + "src": "9919:12:70" + }, + "nativeSrc": "9919:23:70", + "nodeType": "YulFunctionCall", + "src": "9919:23:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "9909:6:70", + "nodeType": "YulTypedName", + "src": "9909:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "9985:16:70", + "nodeType": "YulBlock", + "src": "9985:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9994:1:70", + "nodeType": "YulLiteral", + "src": "9994:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "9997:1:70", + "nodeType": "YulLiteral", + "src": "9997:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "9987:6:70", + "nodeType": "YulIdentifier", + "src": "9987:6:70" + }, + "nativeSrc": "9987:12:70", + "nodeType": "YulFunctionCall", + "src": "9987:12:70" + }, + "nativeSrc": "9987:12:70", + "nodeType": "YulExpressionStatement", + "src": "9987:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "9957:6:70", + "nodeType": "YulIdentifier", + "src": "9957:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "9973:2:70", + "nodeType": "YulLiteral", + "src": "9973:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "9977:1:70", + "nodeType": "YulLiteral", + "src": "9977:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "9969:3:70", + "nodeType": "YulIdentifier", + "src": "9969:3:70" + }, + "nativeSrc": "9969:10:70", + "nodeType": "YulFunctionCall", + "src": "9969:10:70" + }, + { + "kind": "number", + "nativeSrc": "9981:1:70", + "nodeType": "YulLiteral", + "src": "9981:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "9965:3:70", + "nodeType": "YulIdentifier", + "src": "9965:3:70" + }, + "nativeSrc": "9965:18:70", + "nodeType": "YulFunctionCall", + "src": "9965:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "9954:2:70", + "nodeType": "YulIdentifier", + "src": "9954:2:70" + }, + "nativeSrc": "9954:30:70", + "nodeType": "YulFunctionCall", + "src": "9954:30:70" + }, + "nativeSrc": "9951:50:70", + "nodeType": "YulIf", + "src": "9951:50:70" + }, + { + "nativeSrc": "10010:32:70", + "nodeType": "YulVariableDeclaration", + "src": "10010:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10024:9:70", + "nodeType": "YulIdentifier", + "src": "10024:9:70" + }, + { + "name": "offset", + "nativeSrc": "10035:6:70", + "nodeType": "YulIdentifier", + "src": "10035:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10020:3:70", + "nodeType": "YulIdentifier", + "src": "10020:3:70" + }, + "nativeSrc": "10020:22:70", + "nodeType": "YulFunctionCall", + "src": "10020:22:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "10014:2:70", + "nodeType": "YulTypedName", + "src": "10014:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "10090:16:70", + "nodeType": "YulBlock", + "src": "10090:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10099:1:70", + "nodeType": "YulLiteral", + "src": "10099:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "10102:1:70", + "nodeType": "YulLiteral", + "src": "10102:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "10092:6:70", + "nodeType": "YulIdentifier", + "src": "10092:6:70" + }, + "nativeSrc": "10092:12:70", + "nodeType": "YulFunctionCall", + "src": "10092:12:70" + }, + "nativeSrc": "10092:12:70", + "nodeType": "YulExpressionStatement", + "src": "10092:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_1", + "nativeSrc": "10069:2:70", + "nodeType": "YulIdentifier", + "src": "10069:2:70" + }, + { + "kind": "number", + "nativeSrc": "10073:4:70", + "nodeType": "YulLiteral", + "src": "10073:4:70", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10065:3:70", + "nodeType": "YulIdentifier", + "src": "10065:3:70" + }, + "nativeSrc": "10065:13:70", + "nodeType": "YulFunctionCall", + "src": "10065:13:70" + }, + { + "name": "dataEnd", + "nativeSrc": "10080:7:70", + "nodeType": "YulIdentifier", + "src": "10080:7:70" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "10061:3:70", + "nodeType": "YulIdentifier", + "src": "10061:3:70" + }, + "nativeSrc": "10061:27:70", + "nodeType": "YulFunctionCall", + "src": "10061:27:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "10054:6:70", + "nodeType": "YulIdentifier", + "src": "10054:6:70" + }, + "nativeSrc": "10054:35:70", + "nodeType": "YulFunctionCall", + "src": "10054:35:70" + }, + "nativeSrc": "10051:55:70", + "nodeType": "YulIf", + "src": "10051:55:70" + }, + { + "nativeSrc": "10115:30:70", + "nodeType": "YulVariableDeclaration", + "src": "10115:30:70", + "value": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "10142:2:70", + "nodeType": "YulIdentifier", + "src": "10142:2:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "10129:12:70", + "nodeType": "YulIdentifier", + "src": "10129:12:70" + }, + "nativeSrc": "10129:16:70", + "nodeType": "YulFunctionCall", + "src": "10129:16:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "10119:6:70", + "nodeType": "YulTypedName", + "src": "10119:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "10188:16:70", + "nodeType": "YulBlock", + "src": "10188:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10197:1:70", + "nodeType": "YulLiteral", + "src": "10197:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "10200:1:70", + "nodeType": "YulLiteral", + "src": "10200:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "10190:6:70", + "nodeType": "YulIdentifier", + "src": "10190:6:70" + }, + "nativeSrc": "10190:12:70", + "nodeType": "YulFunctionCall", + "src": "10190:12:70" + }, + "nativeSrc": "10190:12:70", + "nodeType": "YulExpressionStatement", + "src": "10190:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nativeSrc": "10160:6:70", + "nodeType": "YulIdentifier", + "src": "10160:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10176:2:70", + "nodeType": "YulLiteral", + "src": "10176:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "10180:1:70", + "nodeType": "YulLiteral", + "src": "10180:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "10172:3:70", + "nodeType": "YulIdentifier", + "src": "10172:3:70" + }, + "nativeSrc": "10172:10:70", + "nodeType": "YulFunctionCall", + "src": "10172:10:70" + }, + { + "kind": "number", + "nativeSrc": "10184:1:70", + "nodeType": "YulLiteral", + "src": "10184:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "10168:3:70", + "nodeType": "YulIdentifier", + "src": "10168:3:70" + }, + "nativeSrc": "10168:18:70", + "nodeType": "YulFunctionCall", + "src": "10168:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "10157:2:70", + "nodeType": "YulIdentifier", + "src": "10157:2:70" + }, + "nativeSrc": "10157:30:70", + "nodeType": "YulFunctionCall", + "src": "10157:30:70" + }, + "nativeSrc": "10154:50:70", + "nodeType": "YulIf", + "src": "10154:50:70" + }, + { + "body": { + "nativeSrc": "10262:16:70", + "nodeType": "YulBlock", + "src": "10262:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10271:1:70", + "nodeType": "YulLiteral", + "src": "10271:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "10274:1:70", + "nodeType": "YulLiteral", + "src": "10274:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "10264:6:70", + "nodeType": "YulIdentifier", + "src": "10264:6:70" + }, + "nativeSrc": "10264:12:70", + "nodeType": "YulFunctionCall", + "src": "10264:12:70" + }, + "nativeSrc": "10264:12:70", + "nodeType": "YulExpressionStatement", + "src": "10264:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_1", + "nativeSrc": "10227:2:70", + "nodeType": "YulIdentifier", + "src": "10227:2:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10235:1:70", + "nodeType": "YulLiteral", + "src": "10235:1:70", + "type": "", + "value": "5" + }, + { + "name": "length", + "nativeSrc": "10238:6:70", + "nodeType": "YulIdentifier", + "src": "10238:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "10231:3:70", + "nodeType": "YulIdentifier", + "src": "10231:3:70" + }, + "nativeSrc": "10231:14:70", + "nodeType": "YulFunctionCall", + "src": "10231:14:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10223:3:70", + "nodeType": "YulIdentifier", + "src": "10223:3:70" + }, + "nativeSrc": "10223:23:70", + "nodeType": "YulFunctionCall", + "src": "10223:23:70" + }, + { + "kind": "number", + "nativeSrc": "10248:2:70", + "nodeType": "YulLiteral", + "src": "10248:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10219:3:70", + "nodeType": "YulIdentifier", + "src": "10219:3:70" + }, + "nativeSrc": "10219:32:70", + "nodeType": "YulFunctionCall", + "src": "10219:32:70" + }, + { + "name": "dataEnd", + "nativeSrc": "10253:7:70", + "nodeType": "YulIdentifier", + "src": "10253:7:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "10216:2:70", + "nodeType": "YulIdentifier", + "src": "10216:2:70" + }, + "nativeSrc": "10216:45:70", + "nodeType": "YulFunctionCall", + "src": "10216:45:70" + }, + "nativeSrc": "10213:65:70", + "nodeType": "YulIf", + "src": "10213:65:70" + }, + { + "nativeSrc": "10287:21:70", + "nodeType": "YulAssignment", + "src": "10287:21:70", + "value": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "10301:2:70", + "nodeType": "YulIdentifier", + "src": "10301:2:70" + }, + { + "kind": "number", + "nativeSrc": "10305:2:70", + "nodeType": "YulLiteral", + "src": "10305:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10297:3:70", + "nodeType": "YulIdentifier", + "src": "10297:3:70" + }, + "nativeSrc": "10297:11:70", + "nodeType": "YulFunctionCall", + "src": "10297:11:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "10287:6:70", + "nodeType": "YulIdentifier", + "src": "10287:6:70" + } + ] + }, + { + "nativeSrc": "10317:16:70", + "nodeType": "YulAssignment", + "src": "10317:16:70", + "value": { + "name": "length", + "nativeSrc": "10327:6:70", + "nodeType": "YulIdentifier", + "src": "10327:6:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "10317:6:70", + "nodeType": "YulIdentifier", + "src": "10317:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", + "nativeSrc": "9718:621:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "9792:9:70", + "nodeType": "YulTypedName", + "src": "9792:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "9803:7:70", + "nodeType": "YulTypedName", + "src": "9803:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "9815:6:70", + "nodeType": "YulTypedName", + "src": "9815:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "9823:6:70", + "nodeType": "YulTypedName", + "src": "9823:6:70", + "type": "" + } + ], + "src": "9718:621:70" + }, + { + "body": { + "nativeSrc": "10513:611:70", + "nodeType": "YulBlock", + "src": "10513:611:70", + "statements": [ + { + "nativeSrc": "10523:32:70", + "nodeType": "YulVariableDeclaration", + "src": "10523:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10541:9:70", + "nodeType": "YulIdentifier", + "src": "10541:9:70" + }, + { + "kind": "number", + "nativeSrc": "10552:2:70", + "nodeType": "YulLiteral", + "src": "10552:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10537:3:70", + "nodeType": "YulIdentifier", + "src": "10537:3:70" + }, + "nativeSrc": "10537:18:70", + "nodeType": "YulFunctionCall", + "src": "10537:18:70" + }, + "variables": [ + { + "name": "tail_1", + "nativeSrc": "10527:6:70", + "nodeType": "YulTypedName", + "src": "10527:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10571:9:70", + "nodeType": "YulIdentifier", + "src": "10571:9:70" + }, + { + "kind": "number", + "nativeSrc": "10582:2:70", + "nodeType": "YulLiteral", + "src": "10582:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10564:6:70", + "nodeType": "YulIdentifier", + "src": "10564:6:70" + }, + "nativeSrc": "10564:21:70", + "nodeType": "YulFunctionCall", + "src": "10564:21:70" + }, + "nativeSrc": "10564:21:70", + "nodeType": "YulExpressionStatement", + "src": "10564:21:70" + }, + { + "nativeSrc": "10594:17:70", + "nodeType": "YulVariableDeclaration", + "src": "10594:17:70", + "value": { + "name": "tail_1", + "nativeSrc": "10605:6:70", + "nodeType": "YulIdentifier", + "src": "10605:6:70" + }, + "variables": [ + { + "name": "pos", + "nativeSrc": "10598:3:70", + "nodeType": "YulTypedName", + "src": "10598:3:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10620:27:70", + "nodeType": "YulVariableDeclaration", + "src": "10620:27:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "10640:6:70", + "nodeType": "YulIdentifier", + "src": "10640:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "10634:5:70", + "nodeType": "YulIdentifier", + "src": "10634:5:70" + }, + "nativeSrc": "10634:13:70", + "nodeType": "YulFunctionCall", + "src": "10634:13:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "10624:6:70", + "nodeType": "YulTypedName", + "src": "10624:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tail_1", + "nativeSrc": "10663:6:70", + "nodeType": "YulIdentifier", + "src": "10663:6:70" + }, + { + "name": "length", + "nativeSrc": "10671:6:70", + "nodeType": "YulIdentifier", + "src": "10671:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10656:6:70", + "nodeType": "YulIdentifier", + "src": "10656:6:70" + }, + "nativeSrc": "10656:22:70", + "nodeType": "YulFunctionCall", + "src": "10656:22:70" + }, + "nativeSrc": "10656:22:70", + "nodeType": "YulExpressionStatement", + "src": "10656:22:70" + }, + { + "nativeSrc": "10687:25:70", + "nodeType": "YulAssignment", + "src": "10687:25:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10698:9:70", + "nodeType": "YulIdentifier", + "src": "10698:9:70" + }, + { + "kind": "number", + "nativeSrc": "10709:2:70", + "nodeType": "YulLiteral", + "src": "10709:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10694:3:70", + "nodeType": "YulIdentifier", + "src": "10694:3:70" + }, + "nativeSrc": "10694:18:70", + "nodeType": "YulFunctionCall", + "src": "10694:18:70" + }, + "variableNames": [ + { + "name": "pos", + "nativeSrc": "10687:3:70", + "nodeType": "YulIdentifier", + "src": "10687:3:70" + } + ] + }, + { + "nativeSrc": "10721:53:70", + "nodeType": "YulVariableDeclaration", + "src": "10721:53:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "10743:9:70", + "nodeType": "YulIdentifier", + "src": "10743:9:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10758:1:70", + "nodeType": "YulLiteral", + "src": "10758:1:70", + "type": "", + "value": "5" + }, + { + "name": "length", + "nativeSrc": "10761:6:70", + "nodeType": "YulIdentifier", + "src": "10761:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "10754:3:70", + "nodeType": "YulIdentifier", + "src": "10754:3:70" + }, + "nativeSrc": "10754:14:70", + "nodeType": "YulFunctionCall", + "src": "10754:14:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10739:3:70", + "nodeType": "YulIdentifier", + "src": "10739:3:70" + }, + "nativeSrc": "10739:30:70", + "nodeType": "YulFunctionCall", + "src": "10739:30:70" + }, + { + "kind": "number", + "nativeSrc": "10771:2:70", + "nodeType": "YulLiteral", + "src": "10771:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10735:3:70", + "nodeType": "YulIdentifier", + "src": "10735:3:70" + }, + "nativeSrc": "10735:39:70", + "nodeType": "YulFunctionCall", + "src": "10735:39:70" + }, + "variables": [ + { + "name": "tail_2", + "nativeSrc": "10725:6:70", + "nodeType": "YulTypedName", + "src": "10725:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10783:29:70", + "nodeType": "YulVariableDeclaration", + "src": "10783:29:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "10801:6:70", + "nodeType": "YulIdentifier", + "src": "10801:6:70" + }, + { + "kind": "number", + "nativeSrc": "10809:2:70", + "nodeType": "YulLiteral", + "src": "10809:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10797:3:70", + "nodeType": "YulIdentifier", + "src": "10797:3:70" + }, + "nativeSrc": "10797:15:70", + "nodeType": "YulFunctionCall", + "src": "10797:15:70" + }, + "variables": [ + { + "name": "srcPtr", + "nativeSrc": "10787:6:70", + "nodeType": "YulTypedName", + "src": "10787:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "10821:10:70", + "nodeType": "YulVariableDeclaration", + "src": "10821:10:70", + "value": { + "kind": "number", + "nativeSrc": "10830:1:70", + "nodeType": "YulLiteral", + "src": "10830:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "10825:1:70", + "nodeType": "YulTypedName", + "src": "10825:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "10889:206:70", + "nodeType": "YulBlock", + "src": "10889:206:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "10910:3:70", + "nodeType": "YulIdentifier", + "src": "10910:3:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "tail_2", + "nativeSrc": "10923:6:70", + "nodeType": "YulIdentifier", + "src": "10923:6:70" + }, + { + "name": "headStart", + "nativeSrc": "10931:9:70", + "nodeType": "YulIdentifier", + "src": "10931:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "10919:3:70", + "nodeType": "YulIdentifier", + "src": "10919:3:70" + }, + "nativeSrc": "10919:22:70", + "nodeType": "YulFunctionCall", + "src": "10919:22:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "10947:2:70", + "nodeType": "YulLiteral", + "src": "10947:2:70", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "10943:3:70", + "nodeType": "YulIdentifier", + "src": "10943:3:70" + }, + "nativeSrc": "10943:7:70", + "nodeType": "YulFunctionCall", + "src": "10943:7:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10915:3:70", + "nodeType": "YulIdentifier", + "src": "10915:3:70" + }, + "nativeSrc": "10915:36:70", + "nodeType": "YulFunctionCall", + "src": "10915:36:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "10903:6:70", + "nodeType": "YulIdentifier", + "src": "10903:6:70" + }, + "nativeSrc": "10903:49:70", + "nodeType": "YulFunctionCall", + "src": "10903:49:70" + }, + "nativeSrc": "10903:49:70", + "nodeType": "YulExpressionStatement", + "src": "10903:49:70" + }, + { + "nativeSrc": "10965:50:70", + "nodeType": "YulAssignment", + "src": "10965:50:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "srcPtr", + "nativeSrc": "10999:6:70", + "nodeType": "YulIdentifier", + "src": "10999:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "10993:5:70", + "nodeType": "YulIdentifier", + "src": "10993:5:70" + }, + "nativeSrc": "10993:13:70", + "nodeType": "YulFunctionCall", + "src": "10993:13:70" + }, + { + "name": "tail_2", + "nativeSrc": "11008:6:70", + "nodeType": "YulIdentifier", + "src": "11008:6:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "10975:17:70", + "nodeType": "YulIdentifier", + "src": "10975:17:70" + }, + "nativeSrc": "10975:40:70", + "nodeType": "YulFunctionCall", + "src": "10975:40:70" + }, + "variableNames": [ + { + "name": "tail_2", + "nativeSrc": "10965:6:70", + "nodeType": "YulIdentifier", + "src": "10965:6:70" + } + ] + }, + { + "nativeSrc": "11028:25:70", + "nodeType": "YulAssignment", + "src": "11028:25:70", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nativeSrc": "11042:6:70", + "nodeType": "YulIdentifier", + "src": "11042:6:70" + }, + { + "kind": "number", + "nativeSrc": "11050:2:70", + "nodeType": "YulLiteral", + "src": "11050:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11038:3:70", + "nodeType": "YulIdentifier", + "src": "11038:3:70" + }, + "nativeSrc": "11038:15:70", + "nodeType": "YulFunctionCall", + "src": "11038:15:70" + }, + "variableNames": [ + { + "name": "srcPtr", + "nativeSrc": "11028:6:70", + "nodeType": "YulIdentifier", + "src": "11028:6:70" + } + ] + }, + { + "nativeSrc": "11066:19:70", + "nodeType": "YulAssignment", + "src": "11066:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "11077:3:70", + "nodeType": "YulIdentifier", + "src": "11077:3:70" + }, + { + "kind": "number", + "nativeSrc": "11082:2:70", + "nodeType": "YulLiteral", + "src": "11082:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11073:3:70", + "nodeType": "YulIdentifier", + "src": "11073:3:70" + }, + "nativeSrc": "11073:12:70", + "nodeType": "YulFunctionCall", + "src": "11073:12:70" + }, + "variableNames": [ + { + "name": "pos", + "nativeSrc": "11066:3:70", + "nodeType": "YulIdentifier", + "src": "11066:3:70" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "10851:1:70", + "nodeType": "YulIdentifier", + "src": "10851:1:70" + }, + { + "name": "length", + "nativeSrc": "10854:6:70", + "nodeType": "YulIdentifier", + "src": "10854:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "10848:2:70", + "nodeType": "YulIdentifier", + "src": "10848:2:70" + }, + "nativeSrc": "10848:13:70", + "nodeType": "YulFunctionCall", + "src": "10848:13:70" + }, + "nativeSrc": "10840:255:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "10862:18:70", + "nodeType": "YulBlock", + "src": "10862:18:70", + "statements": [ + { + "nativeSrc": "10864:14:70", + "nodeType": "YulAssignment", + "src": "10864:14:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "10873:1:70", + "nodeType": "YulIdentifier", + "src": "10873:1:70" + }, + { + "kind": "number", + "nativeSrc": "10876:1:70", + "nodeType": "YulLiteral", + "src": "10876:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "10869:3:70", + "nodeType": "YulIdentifier", + "src": "10869:3:70" + }, + "nativeSrc": "10869:9:70", + "nodeType": "YulFunctionCall", + "src": "10869:9:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "10864:1:70", + "nodeType": "YulIdentifier", + "src": "10864:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "10844:3:70", + "nodeType": "YulBlock", + "src": "10844:3:70", + "statements": [] + }, + "src": "10840:255:70" + }, + { + "nativeSrc": "11104:14:70", + "nodeType": "YulAssignment", + "src": "11104:14:70", + "value": { + "name": "tail_2", + "nativeSrc": "11112:6:70", + "nodeType": "YulIdentifier", + "src": "11112:6:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "11104:4:70", + "nodeType": "YulIdentifier", + "src": "11104:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr__to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr__fromStack_reversed", + "nativeSrc": "10344:780:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "10482:9:70", + "nodeType": "YulTypedName", + "src": "10482:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "10493:6:70", + "nodeType": "YulTypedName", + "src": "10493:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "10504:4:70", + "nodeType": "YulTypedName", + "src": "10504:4:70", + "type": "" + } + ], + "src": "10344:780:70" + }, + { + "body": { + "nativeSrc": "11269:571:70", + "nodeType": "YulBlock", + "src": "11269:571:70", + "statements": [ + { + "body": { + "nativeSrc": "11315:16:70", + "nodeType": "YulBlock", + "src": "11315:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11324:1:70", + "nodeType": "YulLiteral", + "src": "11324:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "11327:1:70", + "nodeType": "YulLiteral", + "src": "11327:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "11317:6:70", + "nodeType": "YulIdentifier", + "src": "11317:6:70" + }, + "nativeSrc": "11317:12:70", + "nodeType": "YulFunctionCall", + "src": "11317:12:70" + }, + "nativeSrc": "11317:12:70", + "nodeType": "YulExpressionStatement", + "src": "11317:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "11290:7:70", + "nodeType": "YulIdentifier", + "src": "11290:7:70" + }, + { + "name": "headStart", + "nativeSrc": "11299:9:70", + "nodeType": "YulIdentifier", + "src": "11299:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "11286:3:70", + "nodeType": "YulIdentifier", + "src": "11286:3:70" + }, + "nativeSrc": "11286:23:70", + "nodeType": "YulFunctionCall", + "src": "11286:23:70" + }, + { + "kind": "number", + "nativeSrc": "11311:2:70", + "nodeType": "YulLiteral", + "src": "11311:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "11282:3:70", + "nodeType": "YulIdentifier", + "src": "11282:3:70" + }, + "nativeSrc": "11282:32:70", + "nodeType": "YulFunctionCall", + "src": "11282:32:70" + }, + "nativeSrc": "11279:52:70", + "nodeType": "YulIf", + "src": "11279:52:70" + }, + { + "nativeSrc": "11340:36:70", + "nodeType": "YulVariableDeclaration", + "src": "11340:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11366:9:70", + "nodeType": "YulIdentifier", + "src": "11366:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "11353:12:70", + "nodeType": "YulIdentifier", + "src": "11353:12:70" + }, + "nativeSrc": "11353:23:70", + "nodeType": "YulFunctionCall", + "src": "11353:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "11344:5:70", + "nodeType": "YulTypedName", + "src": "11344:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "11410:5:70", + "nodeType": "YulIdentifier", + "src": "11410:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "11385:24:70", + "nodeType": "YulIdentifier", + "src": "11385:24:70" + }, + "nativeSrc": "11385:31:70", + "nodeType": "YulFunctionCall", + "src": "11385:31:70" + }, + "nativeSrc": "11385:31:70", + "nodeType": "YulExpressionStatement", + "src": "11385:31:70" + }, + { + "nativeSrc": "11425:15:70", + "nodeType": "YulAssignment", + "src": "11425:15:70", + "value": { + "name": "value", + "nativeSrc": "11435:5:70", + "nodeType": "YulIdentifier", + "src": "11435:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "11425:6:70", + "nodeType": "YulIdentifier", + "src": "11425:6:70" + } + ] + }, + { + "nativeSrc": "11449:47:70", + "nodeType": "YulVariableDeclaration", + "src": "11449:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11481:9:70", + "nodeType": "YulIdentifier", + "src": "11481:9:70" + }, + { + "kind": "number", + "nativeSrc": "11492:2:70", + "nodeType": "YulLiteral", + "src": "11492:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11477:3:70", + "nodeType": "YulIdentifier", + "src": "11477:3:70" + }, + "nativeSrc": "11477:18:70", + "nodeType": "YulFunctionCall", + "src": "11477:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "11464:12:70", + "nodeType": "YulIdentifier", + "src": "11464:12:70" + }, + "nativeSrc": "11464:32:70", + "nodeType": "YulFunctionCall", + "src": "11464:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "11453:7:70", + "nodeType": "YulTypedName", + "src": "11453:7:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "11531:16:70", + "nodeType": "YulBlock", + "src": "11531:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11540:1:70", + "nodeType": "YulLiteral", + "src": "11540:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "11543:1:70", + "nodeType": "YulLiteral", + "src": "11543:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "11533:6:70", + "nodeType": "YulIdentifier", + "src": "11533:6:70" + }, + "nativeSrc": "11533:12:70", + "nodeType": "YulFunctionCall", + "src": "11533:12:70" + }, + "nativeSrc": "11533:12:70", + "nodeType": "YulExpressionStatement", + "src": "11533:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "11518:7:70", + "nodeType": "YulIdentifier", + "src": "11518:7:70" + }, + { + "kind": "number", + "nativeSrc": "11527:1:70", + "nodeType": "YulLiteral", + "src": "11527:1:70", + "type": "", + "value": "3" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "11515:2:70", + "nodeType": "YulIdentifier", + "src": "11515:2:70" + }, + "nativeSrc": "11515:14:70", + "nodeType": "YulFunctionCall", + "src": "11515:14:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "11508:6:70", + "nodeType": "YulIdentifier", + "src": "11508:6:70" + }, + "nativeSrc": "11508:22:70", + "nodeType": "YulFunctionCall", + "src": "11508:22:70" + }, + "nativeSrc": "11505:42:70", + "nodeType": "YulIf", + "src": "11505:42:70" + }, + { + "nativeSrc": "11556:17:70", + "nodeType": "YulAssignment", + "src": "11556:17:70", + "value": { + "name": "value_1", + "nativeSrc": "11566:7:70", + "nodeType": "YulIdentifier", + "src": "11566:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "11556:6:70", + "nodeType": "YulIdentifier", + "src": "11556:6:70" + } + ] + }, + { + "nativeSrc": "11582:46:70", + "nodeType": "YulVariableDeclaration", + "src": "11582:46:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11613:9:70", + "nodeType": "YulIdentifier", + "src": "11613:9:70" + }, + { + "kind": "number", + "nativeSrc": "11624:2:70", + "nodeType": "YulLiteral", + "src": "11624:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11609:3:70", + "nodeType": "YulIdentifier", + "src": "11609:3:70" + }, + "nativeSrc": "11609:18:70", + "nodeType": "YulFunctionCall", + "src": "11609:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "11596:12:70", + "nodeType": "YulIdentifier", + "src": "11596:12:70" + }, + "nativeSrc": "11596:32:70", + "nodeType": "YulFunctionCall", + "src": "11596:32:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "11586:6:70", + "nodeType": "YulTypedName", + "src": "11586:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "11671:16:70", + "nodeType": "YulBlock", + "src": "11671:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11680:1:70", + "nodeType": "YulLiteral", + "src": "11680:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "11683:1:70", + "nodeType": "YulLiteral", + "src": "11683:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "11673:6:70", + "nodeType": "YulIdentifier", + "src": "11673:6:70" + }, + "nativeSrc": "11673:12:70", + "nodeType": "YulFunctionCall", + "src": "11673:12:70" + }, + "nativeSrc": "11673:12:70", + "nodeType": "YulExpressionStatement", + "src": "11673:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "11643:6:70", + "nodeType": "YulIdentifier", + "src": "11643:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "11659:2:70", + "nodeType": "YulLiteral", + "src": "11659:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "11663:1:70", + "nodeType": "YulLiteral", + "src": "11663:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "11655:3:70", + "nodeType": "YulIdentifier", + "src": "11655:3:70" + }, + "nativeSrc": "11655:10:70", + "nodeType": "YulFunctionCall", + "src": "11655:10:70" + }, + { + "kind": "number", + "nativeSrc": "11667:1:70", + "nodeType": "YulLiteral", + "src": "11667:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "11651:3:70", + "nodeType": "YulIdentifier", + "src": "11651:3:70" + }, + "nativeSrc": "11651:18:70", + "nodeType": "YulFunctionCall", + "src": "11651:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "11640:2:70", + "nodeType": "YulIdentifier", + "src": "11640:2:70" + }, + "nativeSrc": "11640:30:70", + "nodeType": "YulFunctionCall", + "src": "11640:30:70" + }, + "nativeSrc": "11637:50:70", + "nodeType": "YulIf", + "src": "11637:50:70" + }, + { + "nativeSrc": "11696:84:70", + "nodeType": "YulVariableDeclaration", + "src": "11696:84:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "11752:9:70", + "nodeType": "YulIdentifier", + "src": "11752:9:70" + }, + { + "name": "offset", + "nativeSrc": "11763:6:70", + "nodeType": "YulIdentifier", + "src": "11763:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "11748:3:70", + "nodeType": "YulIdentifier", + "src": "11748:3:70" + }, + "nativeSrc": "11748:22:70", + "nodeType": "YulFunctionCall", + "src": "11748:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "11772:7:70", + "nodeType": "YulIdentifier", + "src": "11772:7:70" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nativeSrc": "11722:25:70", + "nodeType": "YulIdentifier", + "src": "11722:25:70" + }, + "nativeSrc": "11722:58:70", + "nodeType": "YulFunctionCall", + "src": "11722:58:70" + }, + "variables": [ + { + "name": "value2_1", + "nativeSrc": "11700:8:70", + "nodeType": "YulTypedName", + "src": "11700:8:70", + "type": "" + }, + { + "name": "value3_1", + "nativeSrc": "11710:8:70", + "nodeType": "YulTypedName", + "src": "11710:8:70", + "type": "" + } + ] + }, + { + "nativeSrc": "11789:18:70", + "nodeType": "YulAssignment", + "src": "11789:18:70", + "value": { + "name": "value2_1", + "nativeSrc": "11799:8:70", + "nodeType": "YulIdentifier", + "src": "11799:8:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "11789:6:70", + "nodeType": "YulIdentifier", + "src": "11789:6:70" + } + ] + }, + { + "nativeSrc": "11816:18:70", + "nodeType": "YulAssignment", + "src": "11816:18:70", + "value": { + "name": "value3_1", + "nativeSrc": "11826:8:70", + "nodeType": "YulIdentifier", + "src": "11826:8:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "11816:6:70", + "nodeType": "YulIdentifier", + "src": "11816:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_enum$_PaymentTypes_$2433t_bytes_calldata_ptr", + "nativeSrc": "11129:711:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "11211:9:70", + "nodeType": "YulTypedName", + "src": "11211:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "11222:7:70", + "nodeType": "YulTypedName", + "src": "11222:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "11234:6:70", + "nodeType": "YulTypedName", + "src": "11234:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "11242:6:70", + "nodeType": "YulTypedName", + "src": "11242:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "11250:6:70", + "nodeType": "YulTypedName", + "src": "11250:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "11258:6:70", + "nodeType": "YulTypedName", + "src": "11258:6:70", + "type": "" + } + ], + "src": "11129:711:70" + }, + { + "body": { + "nativeSrc": "11965:507:70", + "nodeType": "YulBlock", + "src": "11965:507:70", + "statements": [ + { + "body": { + "nativeSrc": "12012:16:70", + "nodeType": "YulBlock", + "src": "12012:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12021:1:70", + "nodeType": "YulLiteral", + "src": "12021:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "12024:1:70", + "nodeType": "YulLiteral", + "src": "12024:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "12014:6:70", + "nodeType": "YulIdentifier", + "src": "12014:6:70" + }, + "nativeSrc": "12014:12:70", + "nodeType": "YulFunctionCall", + "src": "12014:12:70" + }, + "nativeSrc": "12014:12:70", + "nodeType": "YulExpressionStatement", + "src": "12014:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "11986:7:70", + "nodeType": "YulIdentifier", + "src": "11986:7:70" + }, + { + "name": "headStart", + "nativeSrc": "11995:9:70", + "nodeType": "YulIdentifier", + "src": "11995:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "11982:3:70", + "nodeType": "YulIdentifier", + "src": "11982:3:70" + }, + "nativeSrc": "11982:23:70", + "nodeType": "YulFunctionCall", + "src": "11982:23:70" + }, + { + "kind": "number", + "nativeSrc": "12007:3:70", + "nodeType": "YulLiteral", + "src": "12007:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "11978:3:70", + "nodeType": "YulIdentifier", + "src": "11978:3:70" + }, + "nativeSrc": "11978:33:70", + "nodeType": "YulFunctionCall", + "src": "11978:33:70" + }, + "nativeSrc": "11975:53:70", + "nodeType": "YulIf", + "src": "11975:53:70" + }, + { + "nativeSrc": "12037:36:70", + "nodeType": "YulVariableDeclaration", + "src": "12037:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12063:9:70", + "nodeType": "YulIdentifier", + "src": "12063:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12050:12:70", + "nodeType": "YulIdentifier", + "src": "12050:12:70" + }, + "nativeSrc": "12050:23:70", + "nodeType": "YulFunctionCall", + "src": "12050:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "12041:5:70", + "nodeType": "YulTypedName", + "src": "12041:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "12107:5:70", + "nodeType": "YulIdentifier", + "src": "12107:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "12082:24:70", + "nodeType": "YulIdentifier", + "src": "12082:24:70" + }, + "nativeSrc": "12082:31:70", + "nodeType": "YulFunctionCall", + "src": "12082:31:70" + }, + "nativeSrc": "12082:31:70", + "nodeType": "YulExpressionStatement", + "src": "12082:31:70" + }, + { + "nativeSrc": "12122:15:70", + "nodeType": "YulAssignment", + "src": "12122:15:70", + "value": { + "name": "value", + "nativeSrc": "12132:5:70", + "nodeType": "YulIdentifier", + "src": "12132:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "12122:6:70", + "nodeType": "YulIdentifier", + "src": "12122:6:70" + } + ] + }, + { + "nativeSrc": "12146:16:70", + "nodeType": "YulVariableDeclaration", + "src": "12146:16:70", + "value": { + "kind": "number", + "nativeSrc": "12161:1:70", + "nodeType": "YulLiteral", + "src": "12161:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "12150:7:70", + "nodeType": "YulTypedName", + "src": "12150:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "12171:43:70", + "nodeType": "YulAssignment", + "src": "12171:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12199:9:70", + "nodeType": "YulIdentifier", + "src": "12199:9:70" + }, + { + "kind": "number", + "nativeSrc": "12210:2:70", + "nodeType": "YulLiteral", + "src": "12210:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12195:3:70", + "nodeType": "YulIdentifier", + "src": "12195:3:70" + }, + "nativeSrc": "12195:18:70", + "nodeType": "YulFunctionCall", + "src": "12195:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12182:12:70", + "nodeType": "YulIdentifier", + "src": "12182:12:70" + }, + "nativeSrc": "12182:32:70", + "nodeType": "YulFunctionCall", + "src": "12182:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "12171:7:70", + "nodeType": "YulIdentifier", + "src": "12171:7:70" + } + ] + }, + { + "nativeSrc": "12223:17:70", + "nodeType": "YulAssignment", + "src": "12223:17:70", + "value": { + "name": "value_1", + "nativeSrc": "12233:7:70", + "nodeType": "YulIdentifier", + "src": "12233:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "12223:6:70", + "nodeType": "YulIdentifier", + "src": "12223:6:70" + } + ] + }, + { + "nativeSrc": "12249:47:70", + "nodeType": "YulVariableDeclaration", + "src": "12249:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12281:9:70", + "nodeType": "YulIdentifier", + "src": "12281:9:70" + }, + { + "kind": "number", + "nativeSrc": "12292:2:70", + "nodeType": "YulLiteral", + "src": "12292:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12277:3:70", + "nodeType": "YulIdentifier", + "src": "12277:3:70" + }, + "nativeSrc": "12277:18:70", + "nodeType": "YulFunctionCall", + "src": "12277:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12264:12:70", + "nodeType": "YulIdentifier", + "src": "12264:12:70" + }, + "nativeSrc": "12264:32:70", + "nodeType": "YulFunctionCall", + "src": "12264:32:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "12253:7:70", + "nodeType": "YulTypedName", + "src": "12253:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_2", + "nativeSrc": "12329:7:70", + "nodeType": "YulIdentifier", + "src": "12329:7:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "12305:23:70", + "nodeType": "YulIdentifier", + "src": "12305:23:70" + }, + "nativeSrc": "12305:32:70", + "nodeType": "YulFunctionCall", + "src": "12305:32:70" + }, + "nativeSrc": "12305:32:70", + "nodeType": "YulExpressionStatement", + "src": "12305:32:70" + }, + { + "nativeSrc": "12346:17:70", + "nodeType": "YulAssignment", + "src": "12346:17:70", + "value": { + "name": "value_2", + "nativeSrc": "12356:7:70", + "nodeType": "YulIdentifier", + "src": "12356:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "12346:6:70", + "nodeType": "YulIdentifier", + "src": "12346:6:70" + } + ] + }, + { + "nativeSrc": "12372:16:70", + "nodeType": "YulVariableDeclaration", + "src": "12372:16:70", + "value": { + "kind": "number", + "nativeSrc": "12387:1:70", + "nodeType": "YulLiteral", + "src": "12387:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "12376:7:70", + "nodeType": "YulTypedName", + "src": "12376:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "12397:43:70", + "nodeType": "YulAssignment", + "src": "12397:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12425:9:70", + "nodeType": "YulIdentifier", + "src": "12425:9:70" + }, + { + "kind": "number", + "nativeSrc": "12436:2:70", + "nodeType": "YulLiteral", + "src": "12436:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12421:3:70", + "nodeType": "YulIdentifier", + "src": "12421:3:70" + }, + "nativeSrc": "12421:18:70", + "nodeType": "YulFunctionCall", + "src": "12421:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12408:12:70", + "nodeType": "YulIdentifier", + "src": "12408:12:70" + }, + "nativeSrc": "12408:32:70", + "nodeType": "YulFunctionCall", + "src": "12408:32:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "12397:7:70", + "nodeType": "YulIdentifier", + "src": "12397:7:70" + } + ] + }, + { + "nativeSrc": "12449:17:70", + "nodeType": "YulAssignment", + "src": "12449:17:70", + "value": { + "name": "value_3", + "nativeSrc": "12459:7:70", + "nodeType": "YulIdentifier", + "src": "12459:7:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "12449:6:70", + "nodeType": "YulIdentifier", + "src": "12449:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_uint256t_uint32t_uint256", + "nativeSrc": "11845:627:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "11907:9:70", + "nodeType": "YulTypedName", + "src": "11907:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "11918:7:70", + "nodeType": "YulTypedName", + "src": "11918:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "11930:6:70", + "nodeType": "YulTypedName", + "src": "11930:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "11938:6:70", + "nodeType": "YulTypedName", + "src": "11938:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "11946:6:70", + "nodeType": "YulTypedName", + "src": "11946:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "11954:6:70", + "nodeType": "YulTypedName", + "src": "11954:6:70", + "type": "" + } + ], + "src": "11845:627:70" + }, + { + "body": { + "nativeSrc": "12564:301:70", + "nodeType": "YulBlock", + "src": "12564:301:70", + "statements": [ + { + "body": { + "nativeSrc": "12610:16:70", + "nodeType": "YulBlock", + "src": "12610:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "12619:1:70", + "nodeType": "YulLiteral", + "src": "12619:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "12622:1:70", + "nodeType": "YulLiteral", + "src": "12622:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "12612:6:70", + "nodeType": "YulIdentifier", + "src": "12612:6:70" + }, + "nativeSrc": "12612:12:70", + "nodeType": "YulFunctionCall", + "src": "12612:12:70" + }, + "nativeSrc": "12612:12:70", + "nodeType": "YulExpressionStatement", + "src": "12612:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "12585:7:70", + "nodeType": "YulIdentifier", + "src": "12585:7:70" + }, + { + "name": "headStart", + "nativeSrc": "12594:9:70", + "nodeType": "YulIdentifier", + "src": "12594:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "12581:3:70", + "nodeType": "YulIdentifier", + "src": "12581:3:70" + }, + "nativeSrc": "12581:23:70", + "nodeType": "YulFunctionCall", + "src": "12581:23:70" + }, + { + "kind": "number", + "nativeSrc": "12606:2:70", + "nodeType": "YulLiteral", + "src": "12606:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "12577:3:70", + "nodeType": "YulIdentifier", + "src": "12577:3:70" + }, + "nativeSrc": "12577:32:70", + "nodeType": "YulFunctionCall", + "src": "12577:32:70" + }, + "nativeSrc": "12574:52:70", + "nodeType": "YulIf", + "src": "12574:52:70" + }, + { + "nativeSrc": "12635:36:70", + "nodeType": "YulVariableDeclaration", + "src": "12635:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12661:9:70", + "nodeType": "YulIdentifier", + "src": "12661:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12648:12:70", + "nodeType": "YulIdentifier", + "src": "12648:12:70" + }, + "nativeSrc": "12648:23:70", + "nodeType": "YulFunctionCall", + "src": "12648:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "12639:5:70", + "nodeType": "YulTypedName", + "src": "12639:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "12705:5:70", + "nodeType": "YulIdentifier", + "src": "12705:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "12680:24:70", + "nodeType": "YulIdentifier", + "src": "12680:24:70" + }, + "nativeSrc": "12680:31:70", + "nodeType": "YulFunctionCall", + "src": "12680:31:70" + }, + "nativeSrc": "12680:31:70", + "nodeType": "YulExpressionStatement", + "src": "12680:31:70" + }, + { + "nativeSrc": "12720:15:70", + "nodeType": "YulAssignment", + "src": "12720:15:70", + "value": { + "name": "value", + "nativeSrc": "12730:5:70", + "nodeType": "YulIdentifier", + "src": "12730:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "12720:6:70", + "nodeType": "YulIdentifier", + "src": "12720:6:70" + } + ] + }, + { + "nativeSrc": "12744:47:70", + "nodeType": "YulVariableDeclaration", + "src": "12744:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12776:9:70", + "nodeType": "YulIdentifier", + "src": "12776:9:70" + }, + { + "kind": "number", + "nativeSrc": "12787:2:70", + "nodeType": "YulLiteral", + "src": "12787:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12772:3:70", + "nodeType": "YulIdentifier", + "src": "12772:3:70" + }, + "nativeSrc": "12772:18:70", + "nodeType": "YulFunctionCall", + "src": "12772:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "12759:12:70", + "nodeType": "YulIdentifier", + "src": "12759:12:70" + }, + "nativeSrc": "12759:32:70", + "nodeType": "YulFunctionCall", + "src": "12759:32:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "12748:7:70", + "nodeType": "YulTypedName", + "src": "12748:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "12825:7:70", + "nodeType": "YulIdentifier", + "src": "12825:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "12800:24:70", + "nodeType": "YulIdentifier", + "src": "12800:24:70" + }, + "nativeSrc": "12800:33:70", + "nodeType": "YulFunctionCall", + "src": "12800:33:70" + }, + "nativeSrc": "12800:33:70", + "nodeType": "YulExpressionStatement", + "src": "12800:33:70" + }, + { + "nativeSrc": "12842:17:70", + "nodeType": "YulAssignment", + "src": "12842:17:70", + "value": { + "name": "value_1", + "nativeSrc": "12852:7:70", + "nodeType": "YulIdentifier", + "src": "12852:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "12842:6:70", + "nodeType": "YulIdentifier", + "src": "12842:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_addresst_address", + "nativeSrc": "12477:388:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "12522:9:70", + "nodeType": "YulTypedName", + "src": "12522:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "12533:7:70", + "nodeType": "YulTypedName", + "src": "12533:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "12545:6:70", + "nodeType": "YulTypedName", + "src": "12545:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "12553:6:70", + "nodeType": "YulTypedName", + "src": "12553:6:70", + "type": "" + } + ], + "src": "12477:388:70" + }, + { + "body": { + "nativeSrc": "12971:76:70", + "nodeType": "YulBlock", + "src": "12971:76:70", + "statements": [ + { + "nativeSrc": "12981:26:70", + "nodeType": "YulAssignment", + "src": "12981:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "12993:9:70", + "nodeType": "YulIdentifier", + "src": "12993:9:70" + }, + { + "kind": "number", + "nativeSrc": "13004:2:70", + "nodeType": "YulLiteral", + "src": "13004:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "12989:3:70", + "nodeType": "YulIdentifier", + "src": "12989:3:70" + }, + "nativeSrc": "12989:18:70", + "nodeType": "YulFunctionCall", + "src": "12989:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "12981:4:70", + "nodeType": "YulIdentifier", + "src": "12981:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13023:9:70", + "nodeType": "YulIdentifier", + "src": "13023:9:70" + }, + { + "name": "value0", + "nativeSrc": "13034:6:70", + "nodeType": "YulIdentifier", + "src": "13034:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13016:6:70", + "nodeType": "YulIdentifier", + "src": "13016:6:70" + }, + "nativeSrc": "13016:25:70", + "nodeType": "YulFunctionCall", + "src": "13016:25:70" + }, + "nativeSrc": "13016:25:70", + "nodeType": "YulExpressionStatement", + "src": "13016:25:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nativeSrc": "12870:177:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "12940:9:70", + "nodeType": "YulTypedName", + "src": "12940:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "12951:6:70", + "nodeType": "YulTypedName", + "src": "12951:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "12962:4:70", + "nodeType": "YulTypedName", + "src": "12962:4:70", + "type": "" + } + ], + "src": "12870:177:70" + }, + { + "body": { + "nativeSrc": "13122:156:70", + "nodeType": "YulBlock", + "src": "13122:156:70", + "statements": [ + { + "body": { + "nativeSrc": "13168:16:70", + "nodeType": "YulBlock", + "src": "13168:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "13177:1:70", + "nodeType": "YulLiteral", + "src": "13177:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "13180:1:70", + "nodeType": "YulLiteral", + "src": "13180:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "13170:6:70", + "nodeType": "YulIdentifier", + "src": "13170:6:70" + }, + "nativeSrc": "13170:12:70", + "nodeType": "YulFunctionCall", + "src": "13170:12:70" + }, + "nativeSrc": "13170:12:70", + "nodeType": "YulExpressionStatement", + "src": "13170:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "13143:7:70", + "nodeType": "YulIdentifier", + "src": "13143:7:70" + }, + { + "name": "headStart", + "nativeSrc": "13152:9:70", + "nodeType": "YulIdentifier", + "src": "13152:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "13139:3:70", + "nodeType": "YulIdentifier", + "src": "13139:3:70" + }, + "nativeSrc": "13139:23:70", + "nodeType": "YulFunctionCall", + "src": "13139:23:70" + }, + { + "kind": "number", + "nativeSrc": "13164:2:70", + "nodeType": "YulLiteral", + "src": "13164:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "13135:3:70", + "nodeType": "YulIdentifier", + "src": "13135:3:70" + }, + "nativeSrc": "13135:32:70", + "nodeType": "YulFunctionCall", + "src": "13135:32:70" + }, + "nativeSrc": "13132:52:70", + "nodeType": "YulIf", + "src": "13132:52:70" + }, + { + "nativeSrc": "13193:14:70", + "nodeType": "YulVariableDeclaration", + "src": "13193:14:70", + "value": { + "kind": "number", + "nativeSrc": "13206:1:70", + "nodeType": "YulLiteral", + "src": "13206:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "13197:5:70", + "nodeType": "YulTypedName", + "src": "13197:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "13216:32:70", + "nodeType": "YulAssignment", + "src": "13216:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13238:9:70", + "nodeType": "YulIdentifier", + "src": "13238:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "13225:12:70", + "nodeType": "YulIdentifier", + "src": "13225:12:70" + }, + "nativeSrc": "13225:23:70", + "nodeType": "YulFunctionCall", + "src": "13225:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "13216:5:70", + "nodeType": "YulIdentifier", + "src": "13216:5:70" + } + ] + }, + { + "nativeSrc": "13257:15:70", + "nodeType": "YulAssignment", + "src": "13257:15:70", + "value": { + "name": "value", + "nativeSrc": "13267:5:70", + "nodeType": "YulIdentifier", + "src": "13267:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "13257:6:70", + "nodeType": "YulIdentifier", + "src": "13257:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32", + "nativeSrc": "13052:226:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "13088:9:70", + "nodeType": "YulTypedName", + "src": "13088:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "13099:7:70", + "nodeType": "YulTypedName", + "src": "13099:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "13111:6:70", + "nodeType": "YulTypedName", + "src": "13111:6:70", + "type": "" + } + ], + "src": "13052:226:70" + }, + { + "body": { + "nativeSrc": "13468:206:70", + "nodeType": "YulBlock", + "src": "13468:206:70", + "statements": [ + { + "nativeSrc": "13478:27:70", + "nodeType": "YulAssignment", + "src": "13478:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13490:9:70", + "nodeType": "YulIdentifier", + "src": "13490:9:70" + }, + { + "kind": "number", + "nativeSrc": "13501:3:70", + "nodeType": "YulLiteral", + "src": "13501:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13486:3:70", + "nodeType": "YulIdentifier", + "src": "13486:3:70" + }, + "nativeSrc": "13486:19:70", + "nodeType": "YulFunctionCall", + "src": "13486:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "13478:4:70", + "nodeType": "YulIdentifier", + "src": "13478:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13521:9:70", + "nodeType": "YulIdentifier", + "src": "13521:9:70" + }, + { + "name": "value0", + "nativeSrc": "13532:6:70", + "nodeType": "YulIdentifier", + "src": "13532:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13514:6:70", + "nodeType": "YulIdentifier", + "src": "13514:6:70" + }, + "nativeSrc": "13514:25:70", + "nodeType": "YulFunctionCall", + "src": "13514:25:70" + }, + "nativeSrc": "13514:25:70", + "nodeType": "YulExpressionStatement", + "src": "13514:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13559:9:70", + "nodeType": "YulIdentifier", + "src": "13559:9:70" + }, + { + "kind": "number", + "nativeSrc": "13570:2:70", + "nodeType": "YulLiteral", + "src": "13570:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13555:3:70", + "nodeType": "YulIdentifier", + "src": "13555:3:70" + }, + "nativeSrc": "13555:18:70", + "nodeType": "YulFunctionCall", + "src": "13555:18:70" + }, + { + "name": "value1", + "nativeSrc": "13575:6:70", + "nodeType": "YulIdentifier", + "src": "13575:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13548:6:70", + "nodeType": "YulIdentifier", + "src": "13548:6:70" + }, + "nativeSrc": "13548:34:70", + "nodeType": "YulFunctionCall", + "src": "13548:34:70" + }, + "nativeSrc": "13548:34:70", + "nodeType": "YulExpressionStatement", + "src": "13548:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13602:9:70", + "nodeType": "YulIdentifier", + "src": "13602:9:70" + }, + { + "kind": "number", + "nativeSrc": "13613:2:70", + "nodeType": "YulLiteral", + "src": "13613:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13598:3:70", + "nodeType": "YulIdentifier", + "src": "13598:3:70" + }, + "nativeSrc": "13598:18:70", + "nodeType": "YulFunctionCall", + "src": "13598:18:70" + }, + { + "name": "value2", + "nativeSrc": "13618:6:70", + "nodeType": "YulIdentifier", + "src": "13618:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13591:6:70", + "nodeType": "YulIdentifier", + "src": "13591:6:70" + }, + "nativeSrc": "13591:34:70", + "nodeType": "YulFunctionCall", + "src": "13591:34:70" + }, + "nativeSrc": "13591:34:70", + "nodeType": "YulExpressionStatement", + "src": "13591:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13645:9:70", + "nodeType": "YulIdentifier", + "src": "13645:9:70" + }, + { + "kind": "number", + "nativeSrc": "13656:2:70", + "nodeType": "YulLiteral", + "src": "13656:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13641:3:70", + "nodeType": "YulIdentifier", + "src": "13641:3:70" + }, + "nativeSrc": "13641:18:70", + "nodeType": "YulFunctionCall", + "src": "13641:18:70" + }, + { + "name": "value3", + "nativeSrc": "13661:6:70", + "nodeType": "YulIdentifier", + "src": "13661:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13634:6:70", + "nodeType": "YulIdentifier", + "src": "13634:6:70" + }, + "nativeSrc": "13634:34:70", + "nodeType": "YulFunctionCall", + "src": "13634:34:70" + }, + "nativeSrc": "13634:34:70", + "nodeType": "YulExpressionStatement", + "src": "13634:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed", + "nativeSrc": "13283:391:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "13413:9:70", + "nodeType": "YulTypedName", + "src": "13413:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "13424:6:70", + "nodeType": "YulTypedName", + "src": "13424:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "13432:6:70", + "nodeType": "YulTypedName", + "src": "13432:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "13440:6:70", + "nodeType": "YulTypedName", + "src": "13440:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "13448:6:70", + "nodeType": "YulTypedName", + "src": "13448:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "13459:4:70", + "nodeType": "YulTypedName", + "src": "13459:4:70", + "type": "" + } + ], + "src": "13283:391:70" + }, + { + "body": { + "nativeSrc": "13836:240:70", + "nodeType": "YulBlock", + "src": "13836:240:70", + "statements": [ + { + "nativeSrc": "13846:26:70", + "nodeType": "YulAssignment", + "src": "13846:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13858:9:70", + "nodeType": "YulIdentifier", + "src": "13858:9:70" + }, + { + "kind": "number", + "nativeSrc": "13869:2:70", + "nodeType": "YulLiteral", + "src": "13869:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13854:3:70", + "nodeType": "YulIdentifier", + "src": "13854:3:70" + }, + "nativeSrc": "13854:18:70", + "nodeType": "YulFunctionCall", + "src": "13854:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "13846:4:70", + "nodeType": "YulIdentifier", + "src": "13846:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13888:9:70", + "nodeType": "YulIdentifier", + "src": "13888:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "13903:6:70", + "nodeType": "YulIdentifier", + "src": "13903:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "13919:3:70", + "nodeType": "YulLiteral", + "src": "13919:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "13924:1:70", + "nodeType": "YulLiteral", + "src": "13924:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "13915:3:70", + "nodeType": "YulIdentifier", + "src": "13915:3:70" + }, + "nativeSrc": "13915:11:70", + "nodeType": "YulFunctionCall", + "src": "13915:11:70" + }, + { + "kind": "number", + "nativeSrc": "13928:1:70", + "nodeType": "YulLiteral", + "src": "13928:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "13911:3:70", + "nodeType": "YulIdentifier", + "src": "13911:3:70" + }, + "nativeSrc": "13911:19:70", + "nodeType": "YulFunctionCall", + "src": "13911:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "13899:3:70", + "nodeType": "YulIdentifier", + "src": "13899:3:70" + }, + "nativeSrc": "13899:32:70", + "nodeType": "YulFunctionCall", + "src": "13899:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13881:6:70", + "nodeType": "YulIdentifier", + "src": "13881:6:70" + }, + "nativeSrc": "13881:51:70", + "nodeType": "YulFunctionCall", + "src": "13881:51:70" + }, + "nativeSrc": "13881:51:70", + "nodeType": "YulExpressionStatement", + "src": "13881:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "13952:9:70", + "nodeType": "YulIdentifier", + "src": "13952:9:70" + }, + { + "kind": "number", + "nativeSrc": "13963:2:70", + "nodeType": "YulLiteral", + "src": "13963:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "13948:3:70", + "nodeType": "YulIdentifier", + "src": "13948:3:70" + }, + "nativeSrc": "13948:18:70", + "nodeType": "YulFunctionCall", + "src": "13948:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "13972:6:70", + "nodeType": "YulIdentifier", + "src": "13972:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "13988:3:70", + "nodeType": "YulLiteral", + "src": "13988:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "13993:1:70", + "nodeType": "YulLiteral", + "src": "13993:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "13984:3:70", + "nodeType": "YulIdentifier", + "src": "13984:3:70" + }, + "nativeSrc": "13984:11:70", + "nodeType": "YulFunctionCall", + "src": "13984:11:70" + }, + { + "kind": "number", + "nativeSrc": "13997:1:70", + "nodeType": "YulLiteral", + "src": "13997:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "13980:3:70", + "nodeType": "YulIdentifier", + "src": "13980:3:70" + }, + "nativeSrc": "13980:19:70", + "nodeType": "YulFunctionCall", + "src": "13980:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "13968:3:70", + "nodeType": "YulIdentifier", + "src": "13968:3:70" + }, + "nativeSrc": "13968:32:70", + "nodeType": "YulFunctionCall", + "src": "13968:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "13941:6:70", + "nodeType": "YulIdentifier", + "src": "13941:6:70" + }, + "nativeSrc": "13941:60:70", + "nodeType": "YulFunctionCall", + "src": "13941:60:70" + }, + "nativeSrc": "13941:60:70", + "nodeType": "YulExpressionStatement", + "src": "13941:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14021:9:70", + "nodeType": "YulIdentifier", + "src": "14021:9:70" + }, + { + "kind": "number", + "nativeSrc": "14032:2:70", + "nodeType": "YulLiteral", + "src": "14032:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14017:3:70", + "nodeType": "YulIdentifier", + "src": "14017:3:70" + }, + "nativeSrc": "14017:18:70", + "nodeType": "YulFunctionCall", + "src": "14017:18:70" + }, + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "14041:6:70", + "nodeType": "YulIdentifier", + "src": "14041:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14057:3:70", + "nodeType": "YulLiteral", + "src": "14057:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "14062:1:70", + "nodeType": "YulLiteral", + "src": "14062:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "14053:3:70", + "nodeType": "YulIdentifier", + "src": "14053:3:70" + }, + "nativeSrc": "14053:11:70", + "nodeType": "YulFunctionCall", + "src": "14053:11:70" + }, + { + "kind": "number", + "nativeSrc": "14066:1:70", + "nodeType": "YulLiteral", + "src": "14066:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "14049:3:70", + "nodeType": "YulIdentifier", + "src": "14049:3:70" + }, + "nativeSrc": "14049:19:70", + "nodeType": "YulFunctionCall", + "src": "14049:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "14037:3:70", + "nodeType": "YulIdentifier", + "src": "14037:3:70" + }, + "nativeSrc": "14037:32:70", + "nodeType": "YulFunctionCall", + "src": "14037:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14010:6:70", + "nodeType": "YulIdentifier", + "src": "14010:6:70" + }, + "nativeSrc": "14010:60:70", + "nodeType": "YulFunctionCall", + "src": "14010:60:70" + }, + "nativeSrc": "14010:60:70", + "nodeType": "YulExpressionStatement", + "src": "14010:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_address__to_t_address_t_address_t_address__fromStack_reversed", + "nativeSrc": "13679:397:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "13789:9:70", + "nodeType": "YulTypedName", + "src": "13789:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "13800:6:70", + "nodeType": "YulTypedName", + "src": "13800:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "13808:6:70", + "nodeType": "YulTypedName", + "src": "13808:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "13816:6:70", + "nodeType": "YulTypedName", + "src": "13816:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "13827:4:70", + "nodeType": "YulTypedName", + "src": "13827:4:70", + "type": "" + } + ], + "src": "13679:397:70" + }, + { + "body": { + "nativeSrc": "14159:167:70", + "nodeType": "YulBlock", + "src": "14159:167:70", + "statements": [ + { + "body": { + "nativeSrc": "14205:16:70", + "nodeType": "YulBlock", + "src": "14205:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14214:1:70", + "nodeType": "YulLiteral", + "src": "14214:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "14217:1:70", + "nodeType": "YulLiteral", + "src": "14217:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "14207:6:70", + "nodeType": "YulIdentifier", + "src": "14207:6:70" + }, + "nativeSrc": "14207:12:70", + "nodeType": "YulFunctionCall", + "src": "14207:12:70" + }, + "nativeSrc": "14207:12:70", + "nodeType": "YulExpressionStatement", + "src": "14207:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "14180:7:70", + "nodeType": "YulIdentifier", + "src": "14180:7:70" + }, + { + "name": "headStart", + "nativeSrc": "14189:9:70", + "nodeType": "YulIdentifier", + "src": "14189:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "14176:3:70", + "nodeType": "YulIdentifier", + "src": "14176:3:70" + }, + "nativeSrc": "14176:23:70", + "nodeType": "YulFunctionCall", + "src": "14176:23:70" + }, + { + "kind": "number", + "nativeSrc": "14201:2:70", + "nodeType": "YulLiteral", + "src": "14201:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "14172:3:70", + "nodeType": "YulIdentifier", + "src": "14172:3:70" + }, + "nativeSrc": "14172:32:70", + "nodeType": "YulFunctionCall", + "src": "14172:32:70" + }, + "nativeSrc": "14169:52:70", + "nodeType": "YulIf", + "src": "14169:52:70" + }, + { + "nativeSrc": "14230:29:70", + "nodeType": "YulVariableDeclaration", + "src": "14230:29:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14249:9:70", + "nodeType": "YulIdentifier", + "src": "14249:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14243:5:70", + "nodeType": "YulIdentifier", + "src": "14243:5:70" + }, + "nativeSrc": "14243:16:70", + "nodeType": "YulFunctionCall", + "src": "14243:16:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "14234:5:70", + "nodeType": "YulTypedName", + "src": "14234:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "14290:5:70", + "nodeType": "YulIdentifier", + "src": "14290:5:70" + } + ], + "functionName": { + "name": "validator_revert_bool", + "nativeSrc": "14268:21:70", + "nodeType": "YulIdentifier", + "src": "14268:21:70" + }, + "nativeSrc": "14268:28:70", + "nodeType": "YulFunctionCall", + "src": "14268:28:70" + }, + "nativeSrc": "14268:28:70", + "nodeType": "YulExpressionStatement", + "src": "14268:28:70" + }, + { + "nativeSrc": "14305:15:70", + "nodeType": "YulAssignment", + "src": "14305:15:70", + "value": { + "name": "value", + "nativeSrc": "14315:5:70", + "nodeType": "YulIdentifier", + "src": "14315:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "14305:6:70", + "nodeType": "YulIdentifier", + "src": "14305:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bool_fromMemory", + "nativeSrc": "14081:245:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "14125:9:70", + "nodeType": "YulTypedName", + "src": "14125:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "14136:7:70", + "nodeType": "YulTypedName", + "src": "14136:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "14148:6:70", + "nodeType": "YulTypedName", + "src": "14148:6:70", + "type": "" + } + ], + "src": "14081:245:70" + }, + { + "body": { + "nativeSrc": "14460:171:70", + "nodeType": "YulBlock", + "src": "14460:171:70", + "statements": [ + { + "nativeSrc": "14470:26:70", + "nodeType": "YulAssignment", + "src": "14470:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14482:9:70", + "nodeType": "YulIdentifier", + "src": "14482:9:70" + }, + { + "kind": "number", + "nativeSrc": "14493:2:70", + "nodeType": "YulLiteral", + "src": "14493:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14478:3:70", + "nodeType": "YulIdentifier", + "src": "14478:3:70" + }, + "nativeSrc": "14478:18:70", + "nodeType": "YulFunctionCall", + "src": "14478:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "14470:4:70", + "nodeType": "YulIdentifier", + "src": "14470:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14512:9:70", + "nodeType": "YulIdentifier", + "src": "14512:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "14527:6:70", + "nodeType": "YulIdentifier", + "src": "14527:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14543:3:70", + "nodeType": "YulLiteral", + "src": "14543:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "14548:1:70", + "nodeType": "YulLiteral", + "src": "14548:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "14539:3:70", + "nodeType": "YulIdentifier", + "src": "14539:3:70" + }, + "nativeSrc": "14539:11:70", + "nodeType": "YulFunctionCall", + "src": "14539:11:70" + }, + { + "kind": "number", + "nativeSrc": "14552:1:70", + "nodeType": "YulLiteral", + "src": "14552:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "14535:3:70", + "nodeType": "YulIdentifier", + "src": "14535:3:70" + }, + "nativeSrc": "14535:19:70", + "nodeType": "YulFunctionCall", + "src": "14535:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "14523:3:70", + "nodeType": "YulIdentifier", + "src": "14523:3:70" + }, + "nativeSrc": "14523:32:70", + "nodeType": "YulFunctionCall", + "src": "14523:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14505:6:70", + "nodeType": "YulIdentifier", + "src": "14505:6:70" + }, + "nativeSrc": "14505:51:70", + "nodeType": "YulFunctionCall", + "src": "14505:51:70" + }, + "nativeSrc": "14505:51:70", + "nodeType": "YulExpressionStatement", + "src": "14505:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "14576:9:70", + "nodeType": "YulIdentifier", + "src": "14576:9:70" + }, + { + "kind": "number", + "nativeSrc": "14587:2:70", + "nodeType": "YulLiteral", + "src": "14587:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14572:3:70", + "nodeType": "YulIdentifier", + "src": "14572:3:70" + }, + "nativeSrc": "14572:18:70", + "nodeType": "YulFunctionCall", + "src": "14572:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "14596:6:70", + "nodeType": "YulIdentifier", + "src": "14596:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14612:3:70", + "nodeType": "YulLiteral", + "src": "14612:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "14617:1:70", + "nodeType": "YulLiteral", + "src": "14617:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "14608:3:70", + "nodeType": "YulIdentifier", + "src": "14608:3:70" + }, + "nativeSrc": "14608:11:70", + "nodeType": "YulFunctionCall", + "src": "14608:11:70" + }, + { + "kind": "number", + "nativeSrc": "14621:1:70", + "nodeType": "YulLiteral", + "src": "14621:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "14604:3:70", + "nodeType": "YulIdentifier", + "src": "14604:3:70" + }, + "nativeSrc": "14604:19:70", + "nodeType": "YulFunctionCall", + "src": "14604:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "14592:3:70", + "nodeType": "YulIdentifier", + "src": "14592:3:70" + }, + "nativeSrc": "14592:32:70", + "nodeType": "YulFunctionCall", + "src": "14592:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14565:6:70", + "nodeType": "YulIdentifier", + "src": "14565:6:70" + }, + "nativeSrc": "14565:60:70", + "nodeType": "YulFunctionCall", + "src": "14565:60:70" + }, + "nativeSrc": "14565:60:70", + "nodeType": "YulExpressionStatement", + "src": "14565:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed", + "nativeSrc": "14331:300:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "14421:9:70", + "nodeType": "YulTypedName", + "src": "14421:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "14432:6:70", + "nodeType": "YulTypedName", + "src": "14432:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "14440:6:70", + "nodeType": "YulTypedName", + "src": "14440:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "14451:4:70", + "nodeType": "YulTypedName", + "src": "14451:4:70", + "type": "" + } + ], + "src": "14331:300:70" + }, + { + "body": { + "nativeSrc": "14668:95:70", + "nodeType": "YulBlock", + "src": "14668:95:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14685:1:70", + "nodeType": "YulLiteral", + "src": "14685:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14692:3:70", + "nodeType": "YulLiteral", + "src": "14692:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "14697:10:70", + "nodeType": "YulLiteral", + "src": "14697:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "14688:3:70", + "nodeType": "YulIdentifier", + "src": "14688:3:70" + }, + "nativeSrc": "14688:20:70", + "nodeType": "YulFunctionCall", + "src": "14688:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14678:6:70", + "nodeType": "YulIdentifier", + "src": "14678:6:70" + }, + "nativeSrc": "14678:31:70", + "nodeType": "YulFunctionCall", + "src": "14678:31:70" + }, + "nativeSrc": "14678:31:70", + "nodeType": "YulExpressionStatement", + "src": "14678:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14725:1:70", + "nodeType": "YulLiteral", + "src": "14725:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "14728:4:70", + "nodeType": "YulLiteral", + "src": "14728:4:70", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14718:6:70", + "nodeType": "YulIdentifier", + "src": "14718:6:70" + }, + "nativeSrc": "14718:15:70", + "nodeType": "YulFunctionCall", + "src": "14718:15:70" + }, + "nativeSrc": "14718:15:70", + "nodeType": "YulExpressionStatement", + "src": "14718:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14749:1:70", + "nodeType": "YulLiteral", + "src": "14749:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "14752:4:70", + "nodeType": "YulLiteral", + "src": "14752:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "14742:6:70", + "nodeType": "YulIdentifier", + "src": "14742:6:70" + }, + "nativeSrc": "14742:15:70", + "nodeType": "YulFunctionCall", + "src": "14742:15:70" + }, + "nativeSrc": "14742:15:70", + "nodeType": "YulExpressionStatement", + "src": "14742:15:70" + } + ] + }, + "name": "panic_error_0x41", + "nativeSrc": "14636:127:70", + "nodeType": "YulFunctionDefinition", + "src": "14636:127:70" + }, + { + "body": { + "nativeSrc": "14814:206:70", + "nodeType": "YulBlock", + "src": "14814:206:70", + "statements": [ + { + "nativeSrc": "14824:19:70", + "nodeType": "YulAssignment", + "src": "14824:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14840:2:70", + "nodeType": "YulLiteral", + "src": "14840:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "14834:5:70", + "nodeType": "YulIdentifier", + "src": "14834:5:70" + }, + "nativeSrc": "14834:9:70", + "nodeType": "YulFunctionCall", + "src": "14834:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "14824:6:70", + "nodeType": "YulIdentifier", + "src": "14824:6:70" + } + ] + }, + { + "nativeSrc": "14852:34:70", + "nodeType": "YulVariableDeclaration", + "src": "14852:34:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "14874:6:70", + "nodeType": "YulIdentifier", + "src": "14874:6:70" + }, + { + "kind": "number", + "nativeSrc": "14882:3:70", + "nodeType": "YulLiteral", + "src": "14882:3:70", + "type": "", + "value": "320" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "14870:3:70", + "nodeType": "YulIdentifier", + "src": "14870:3:70" + }, + "nativeSrc": "14870:16:70", + "nodeType": "YulFunctionCall", + "src": "14870:16:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "14856:10:70", + "nodeType": "YulTypedName", + "src": "14856:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "14961:22:70", + "nodeType": "YulBlock", + "src": "14961:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "14963:16:70", + "nodeType": "YulIdentifier", + "src": "14963:16:70" + }, + "nativeSrc": "14963:18:70", + "nodeType": "YulFunctionCall", + "src": "14963:18:70" + }, + "nativeSrc": "14963:18:70", + "nodeType": "YulExpressionStatement", + "src": "14963:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "14904:10:70", + "nodeType": "YulIdentifier", + "src": "14904:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14924:2:70", + "nodeType": "YulLiteral", + "src": "14924:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "14928:1:70", + "nodeType": "YulLiteral", + "src": "14928:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "14920:3:70", + "nodeType": "YulIdentifier", + "src": "14920:3:70" + }, + "nativeSrc": "14920:10:70", + "nodeType": "YulFunctionCall", + "src": "14920:10:70" + }, + { + "kind": "number", + "nativeSrc": "14932:1:70", + "nodeType": "YulLiteral", + "src": "14932:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "14916:3:70", + "nodeType": "YulIdentifier", + "src": "14916:3:70" + }, + "nativeSrc": "14916:18:70", + "nodeType": "YulFunctionCall", + "src": "14916:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "14901:2:70", + "nodeType": "YulIdentifier", + "src": "14901:2:70" + }, + "nativeSrc": "14901:34:70", + "nodeType": "YulFunctionCall", + "src": "14901:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "14940:10:70", + "nodeType": "YulIdentifier", + "src": "14940:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "14952:6:70", + "nodeType": "YulIdentifier", + "src": "14952:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "14937:2:70", + "nodeType": "YulIdentifier", + "src": "14937:2:70" + }, + "nativeSrc": "14937:22:70", + "nodeType": "YulFunctionCall", + "src": "14937:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "14898:2:70", + "nodeType": "YulIdentifier", + "src": "14898:2:70" + }, + "nativeSrc": "14898:62:70", + "nodeType": "YulFunctionCall", + "src": "14898:62:70" + }, + "nativeSrc": "14895:88:70", + "nodeType": "YulIf", + "src": "14895:88:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "14999:2:70", + "nodeType": "YulLiteral", + "src": "14999:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "15003:10:70", + "nodeType": "YulIdentifier", + "src": "15003:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "14992:6:70", + "nodeType": "YulIdentifier", + "src": "14992:6:70" + }, + "nativeSrc": "14992:22:70", + "nodeType": "YulFunctionCall", + "src": "14992:22:70" + }, + "nativeSrc": "14992:22:70", + "nodeType": "YulExpressionStatement", + "src": "14992:22:70" + } + ] + }, + "name": "allocate_memory_4297", + "nativeSrc": "14768:252:70", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nativeSrc": "14803:6:70", + "nodeType": "YulTypedName", + "src": "14803:6:70", + "type": "" + } + ], + "src": "14768:252:70" + }, + { + "body": { + "nativeSrc": "15071:205:70", + "nodeType": "YulBlock", + "src": "15071:205:70", + "statements": [ + { + "nativeSrc": "15081:19:70", + "nodeType": "YulAssignment", + "src": "15081:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15097:2:70", + "nodeType": "YulLiteral", + "src": "15097:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "15091:5:70", + "nodeType": "YulIdentifier", + "src": "15091:5:70" + }, + "nativeSrc": "15091:9:70", + "nodeType": "YulFunctionCall", + "src": "15091:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "15081:6:70", + "nodeType": "YulIdentifier", + "src": "15081:6:70" + } + ] + }, + { + "nativeSrc": "15109:33:70", + "nodeType": "YulVariableDeclaration", + "src": "15109:33:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "15131:6:70", + "nodeType": "YulIdentifier", + "src": "15131:6:70" + }, + { + "kind": "number", + "nativeSrc": "15139:2:70", + "nodeType": "YulLiteral", + "src": "15139:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15127:3:70", + "nodeType": "YulIdentifier", + "src": "15127:3:70" + }, + "nativeSrc": "15127:15:70", + "nodeType": "YulFunctionCall", + "src": "15127:15:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "15113:10:70", + "nodeType": "YulTypedName", + "src": "15113:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "15217:22:70", + "nodeType": "YulBlock", + "src": "15217:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "15219:16:70", + "nodeType": "YulIdentifier", + "src": "15219:16:70" + }, + "nativeSrc": "15219:18:70", + "nodeType": "YulFunctionCall", + "src": "15219:18:70" + }, + "nativeSrc": "15219:18:70", + "nodeType": "YulExpressionStatement", + "src": "15219:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "15160:10:70", + "nodeType": "YulIdentifier", + "src": "15160:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15180:2:70", + "nodeType": "YulLiteral", + "src": "15180:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "15184:1:70", + "nodeType": "YulLiteral", + "src": "15184:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "15176:3:70", + "nodeType": "YulIdentifier", + "src": "15176:3:70" + }, + "nativeSrc": "15176:10:70", + "nodeType": "YulFunctionCall", + "src": "15176:10:70" + }, + { + "kind": "number", + "nativeSrc": "15188:1:70", + "nodeType": "YulLiteral", + "src": "15188:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "15172:3:70", + "nodeType": "YulIdentifier", + "src": "15172:3:70" + }, + "nativeSrc": "15172:18:70", + "nodeType": "YulFunctionCall", + "src": "15172:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "15157:2:70", + "nodeType": "YulIdentifier", + "src": "15157:2:70" + }, + "nativeSrc": "15157:34:70", + "nodeType": "YulFunctionCall", + "src": "15157:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "15196:10:70", + "nodeType": "YulIdentifier", + "src": "15196:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "15208:6:70", + "nodeType": "YulIdentifier", + "src": "15208:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "15193:2:70", + "nodeType": "YulIdentifier", + "src": "15193:2:70" + }, + "nativeSrc": "15193:22:70", + "nodeType": "YulFunctionCall", + "src": "15193:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "15154:2:70", + "nodeType": "YulIdentifier", + "src": "15154:2:70" + }, + "nativeSrc": "15154:62:70", + "nodeType": "YulFunctionCall", + "src": "15154:62:70" + }, + "nativeSrc": "15151:88:70", + "nodeType": "YulIf", + "src": "15151:88:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15255:2:70", + "nodeType": "YulLiteral", + "src": "15255:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "15259:10:70", + "nodeType": "YulIdentifier", + "src": "15259:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15248:6:70", + "nodeType": "YulIdentifier", + "src": "15248:6:70" + }, + "nativeSrc": "15248:22:70", + "nodeType": "YulFunctionCall", + "src": "15248:22:70" + }, + "nativeSrc": "15248:22:70", + "nodeType": "YulExpressionStatement", + "src": "15248:22:70" + } + ] + }, + "name": "allocate_memory_4301", + "nativeSrc": "15025:251:70", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nativeSrc": "15060:6:70", + "nodeType": "YulTypedName", + "src": "15060:6:70", + "type": "" + } + ], + "src": "15025:251:70" + }, + { + "body": { + "nativeSrc": "15322:207:70", + "nodeType": "YulBlock", + "src": "15322:207:70", + "statements": [ + { + "nativeSrc": "15332:19:70", + "nodeType": "YulAssignment", + "src": "15332:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15348:2:70", + "nodeType": "YulLiteral", + "src": "15348:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "15342:5:70", + "nodeType": "YulIdentifier", + "src": "15342:5:70" + }, + "nativeSrc": "15342:9:70", + "nodeType": "YulFunctionCall", + "src": "15342:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "15332:6:70", + "nodeType": "YulIdentifier", + "src": "15332:6:70" + } + ] + }, + { + "nativeSrc": "15360:35:70", + "nodeType": "YulVariableDeclaration", + "src": "15360:35:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "15382:6:70", + "nodeType": "YulIdentifier", + "src": "15382:6:70" + }, + { + "kind": "number", + "nativeSrc": "15390:4:70", + "nodeType": "YulLiteral", + "src": "15390:4:70", + "type": "", + "value": "0xe0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15378:3:70", + "nodeType": "YulIdentifier", + "src": "15378:3:70" + }, + "nativeSrc": "15378:17:70", + "nodeType": "YulFunctionCall", + "src": "15378:17:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "15364:10:70", + "nodeType": "YulTypedName", + "src": "15364:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "15470:22:70", + "nodeType": "YulBlock", + "src": "15470:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "15472:16:70", + "nodeType": "YulIdentifier", + "src": "15472:16:70" + }, + "nativeSrc": "15472:18:70", + "nodeType": "YulFunctionCall", + "src": "15472:18:70" + }, + "nativeSrc": "15472:18:70", + "nodeType": "YulExpressionStatement", + "src": "15472:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "15413:10:70", + "nodeType": "YulIdentifier", + "src": "15413:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15433:2:70", + "nodeType": "YulLiteral", + "src": "15433:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "15437:1:70", + "nodeType": "YulLiteral", + "src": "15437:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "15429:3:70", + "nodeType": "YulIdentifier", + "src": "15429:3:70" + }, + "nativeSrc": "15429:10:70", + "nodeType": "YulFunctionCall", + "src": "15429:10:70" + }, + { + "kind": "number", + "nativeSrc": "15441:1:70", + "nodeType": "YulLiteral", + "src": "15441:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "15425:3:70", + "nodeType": "YulIdentifier", + "src": "15425:3:70" + }, + "nativeSrc": "15425:18:70", + "nodeType": "YulFunctionCall", + "src": "15425:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "15410:2:70", + "nodeType": "YulIdentifier", + "src": "15410:2:70" + }, + "nativeSrc": "15410:34:70", + "nodeType": "YulFunctionCall", + "src": "15410:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "15449:10:70", + "nodeType": "YulIdentifier", + "src": "15449:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "15461:6:70", + "nodeType": "YulIdentifier", + "src": "15461:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "15446:2:70", + "nodeType": "YulIdentifier", + "src": "15446:2:70" + }, + "nativeSrc": "15446:22:70", + "nodeType": "YulFunctionCall", + "src": "15446:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "15407:2:70", + "nodeType": "YulIdentifier", + "src": "15407:2:70" + }, + "nativeSrc": "15407:62:70", + "nodeType": "YulFunctionCall", + "src": "15407:62:70" + }, + "nativeSrc": "15404:88:70", + "nodeType": "YulIf", + "src": "15404:88:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15508:2:70", + "nodeType": "YulLiteral", + "src": "15508:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "15512:10:70", + "nodeType": "YulIdentifier", + "src": "15512:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "15501:6:70", + "nodeType": "YulIdentifier", + "src": "15501:6:70" + }, + "nativeSrc": "15501:22:70", + "nodeType": "YulFunctionCall", + "src": "15501:22:70" + }, + "nativeSrc": "15501:22:70", + "nodeType": "YulExpressionStatement", + "src": "15501:22:70" + } + ] + }, + "name": "allocate_memory", + "nativeSrc": "15281:248:70", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nativeSrc": "15311:6:70", + "nodeType": "YulTypedName", + "src": "15311:6:70", + "type": "" + } + ], + "src": "15281:248:70" + }, + { + "body": { + "nativeSrc": "15587:836:70", + "nodeType": "YulBlock", + "src": "15587:836:70", + "statements": [ + { + "body": { + "nativeSrc": "15636:16:70", + "nodeType": "YulBlock", + "src": "15636:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15645:1:70", + "nodeType": "YulLiteral", + "src": "15645:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "15648:1:70", + "nodeType": "YulLiteral", + "src": "15648:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "15638:6:70", + "nodeType": "YulIdentifier", + "src": "15638:6:70" + }, + "nativeSrc": "15638:12:70", + "nodeType": "YulFunctionCall", + "src": "15638:12:70" + }, + "nativeSrc": "15638:12:70", + "nodeType": "YulExpressionStatement", + "src": "15638:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nativeSrc": "15615:6:70", + "nodeType": "YulIdentifier", + "src": "15615:6:70" + }, + { + "kind": "number", + "nativeSrc": "15623:4:70", + "nodeType": "YulLiteral", + "src": "15623:4:70", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15611:3:70", + "nodeType": "YulIdentifier", + "src": "15611:3:70" + }, + "nativeSrc": "15611:17:70", + "nodeType": "YulFunctionCall", + "src": "15611:17:70" + }, + { + "name": "end", + "nativeSrc": "15630:3:70", + "nodeType": "YulIdentifier", + "src": "15630:3:70" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "15607:3:70", + "nodeType": "YulIdentifier", + "src": "15607:3:70" + }, + "nativeSrc": "15607:27:70", + "nodeType": "YulFunctionCall", + "src": "15607:27:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "15600:6:70", + "nodeType": "YulIdentifier", + "src": "15600:6:70" + }, + "nativeSrc": "15600:35:70", + "nodeType": "YulFunctionCall", + "src": "15600:35:70" + }, + "nativeSrc": "15597:55:70", + "nodeType": "YulIf", + "src": "15597:55:70" + }, + { + "nativeSrc": "15661:34:70", + "nodeType": "YulVariableDeclaration", + "src": "15661:34:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "15688:6:70", + "nodeType": "YulIdentifier", + "src": "15688:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "15675:12:70", + "nodeType": "YulIdentifier", + "src": "15675:12:70" + }, + "nativeSrc": "15675:20:70", + "nodeType": "YulFunctionCall", + "src": "15675:20:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "15665:6:70", + "nodeType": "YulTypedName", + "src": "15665:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "15704:28:70", + "nodeType": "YulVariableDeclaration", + "src": "15704:28:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "15719:6:70", + "nodeType": "YulIdentifier", + "src": "15719:6:70" + }, + { + "kind": "number", + "nativeSrc": "15727:4:70", + "nodeType": "YulLiteral", + "src": "15727:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15715:3:70", + "nodeType": "YulIdentifier", + "src": "15715:3:70" + }, + "nativeSrc": "15715:17:70", + "nodeType": "YulFunctionCall", + "src": "15715:17:70" + }, + "variables": [ + { + "name": "src", + "nativeSrc": "15708:3:70", + "nodeType": "YulTypedName", + "src": "15708:3:70", + "type": "" + } + ] + }, + { + "nativeSrc": "15741:16:70", + "nodeType": "YulVariableDeclaration", + "src": "15741:16:70", + "value": { + "kind": "number", + "nativeSrc": "15756:1:70", + "nodeType": "YulLiteral", + "src": "15756:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "array_1", + "nativeSrc": "15745:7:70", + "nodeType": "YulTypedName", + "src": "15745:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "15766:13:70", + "nodeType": "YulVariableDeclaration", + "src": "15766:13:70", + "value": { + "kind": "number", + "nativeSrc": "15778:1:70", + "nodeType": "YulLiteral", + "src": "15778:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "size", + "nativeSrc": "15770:4:70", + "nodeType": "YulTypedName", + "src": "15770:4:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "15822:22:70", + "nodeType": "YulBlock", + "src": "15822:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "15824:16:70", + "nodeType": "YulIdentifier", + "src": "15824:16:70" + }, + "nativeSrc": "15824:18:70", + "nodeType": "YulFunctionCall", + "src": "15824:18:70" + }, + "nativeSrc": "15824:18:70", + "nodeType": "YulExpressionStatement", + "src": "15824:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nativeSrc": "15794:6:70", + "nodeType": "YulIdentifier", + "src": "15794:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15810:2:70", + "nodeType": "YulLiteral", + "src": "15810:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "15814:1:70", + "nodeType": "YulLiteral", + "src": "15814:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "15806:3:70", + "nodeType": "YulIdentifier", + "src": "15806:3:70" + }, + "nativeSrc": "15806:10:70", + "nodeType": "YulFunctionCall", + "src": "15806:10:70" + }, + { + "kind": "number", + "nativeSrc": "15818:1:70", + "nodeType": "YulLiteral", + "src": "15818:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "15802:3:70", + "nodeType": "YulIdentifier", + "src": "15802:3:70" + }, + "nativeSrc": "15802:18:70", + "nodeType": "YulFunctionCall", + "src": "15802:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "15791:2:70", + "nodeType": "YulIdentifier", + "src": "15791:2:70" + }, + "nativeSrc": "15791:30:70", + "nodeType": "YulFunctionCall", + "src": "15791:30:70" + }, + "nativeSrc": "15788:56:70", + "nodeType": "YulIf", + "src": "15788:56:70" + }, + { + "nativeSrc": "15853:43:70", + "nodeType": "YulVariableDeclaration", + "src": "15853:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nativeSrc": "15875:6:70", + "nodeType": "YulIdentifier", + "src": "15875:6:70" + }, + { + "kind": "number", + "nativeSrc": "15883:2:70", + "nodeType": "YulLiteral", + "src": "15883:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15871:3:70", + "nodeType": "YulIdentifier", + "src": "15871:3:70" + }, + "nativeSrc": "15871:15:70", + "nodeType": "YulFunctionCall", + "src": "15871:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15892:2:70", + "nodeType": "YulLiteral", + "src": "15892:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "15888:3:70", + "nodeType": "YulIdentifier", + "src": "15888:3:70" + }, + "nativeSrc": "15888:7:70", + "nodeType": "YulFunctionCall", + "src": "15888:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "15867:3:70", + "nodeType": "YulIdentifier", + "src": "15867:3:70" + }, + "nativeSrc": "15867:29:70", + "nodeType": "YulFunctionCall", + "src": "15867:29:70" + }, + "variables": [ + { + "name": "result", + "nativeSrc": "15857:6:70", + "nodeType": "YulTypedName", + "src": "15857:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "15905:25:70", + "nodeType": "YulAssignment", + "src": "15905:25:70", + "value": { + "arguments": [ + { + "name": "result", + "nativeSrc": "15917:6:70", + "nodeType": "YulIdentifier", + "src": "15917:6:70" + }, + { + "kind": "number", + "nativeSrc": "15925:4:70", + "nodeType": "YulLiteral", + "src": "15925:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "15913:3:70", + "nodeType": "YulIdentifier", + "src": "15913:3:70" + }, + "nativeSrc": "15913:17:70", + "nodeType": "YulFunctionCall", + "src": "15913:17:70" + }, + "variableNames": [ + { + "name": "size", + "nativeSrc": "15905:4:70", + "nodeType": "YulIdentifier", + "src": "15905:4:70" + } + ] + }, + { + "nativeSrc": "15939:15:70", + "nodeType": "YulVariableDeclaration", + "src": "15939:15:70", + "value": { + "kind": "number", + "nativeSrc": "15953:1:70", + "nodeType": "YulLiteral", + "src": "15953:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "memPtr", + "nativeSrc": "15943:6:70", + "nodeType": "YulTypedName", + "src": "15943:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "15963:19:70", + "nodeType": "YulAssignment", + "src": "15963:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "15979:2:70", + "nodeType": "YulLiteral", + "src": "15979:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "15973:5:70", + "nodeType": "YulIdentifier", + "src": "15973:5:70" + }, + "nativeSrc": "15973:9:70", + "nodeType": "YulFunctionCall", + "src": "15973:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "15963:6:70", + "nodeType": "YulIdentifier", + "src": "15963:6:70" + } + ] + }, + { + "nativeSrc": "15991:60:70", + "nodeType": "YulVariableDeclaration", + "src": "15991:60:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "16013:6:70", + "nodeType": "YulIdentifier", + "src": "16013:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "result", + "nativeSrc": "16029:6:70", + "nodeType": "YulIdentifier", + "src": "16029:6:70" + }, + { + "kind": "number", + "nativeSrc": "16037:2:70", + "nodeType": "YulLiteral", + "src": "16037:2:70", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16025:3:70", + "nodeType": "YulIdentifier", + "src": "16025:3:70" + }, + "nativeSrc": "16025:15:70", + "nodeType": "YulFunctionCall", + "src": "16025:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16046:2:70", + "nodeType": "YulLiteral", + "src": "16046:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "16042:3:70", + "nodeType": "YulIdentifier", + "src": "16042:3:70" + }, + "nativeSrc": "16042:7:70", + "nodeType": "YulFunctionCall", + "src": "16042:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "16021:3:70", + "nodeType": "YulIdentifier", + "src": "16021:3:70" + }, + "nativeSrc": "16021:29:70", + "nodeType": "YulFunctionCall", + "src": "16021:29:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16009:3:70", + "nodeType": "YulIdentifier", + "src": "16009:3:70" + }, + "nativeSrc": "16009:42:70", + "nodeType": "YulFunctionCall", + "src": "16009:42:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "15995:10:70", + "nodeType": "YulTypedName", + "src": "15995:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "16126:22:70", + "nodeType": "YulBlock", + "src": "16126:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "16128:16:70", + "nodeType": "YulIdentifier", + "src": "16128:16:70" + }, + "nativeSrc": "16128:18:70", + "nodeType": "YulFunctionCall", + "src": "16128:18:70" + }, + "nativeSrc": "16128:18:70", + "nodeType": "YulExpressionStatement", + "src": "16128:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "16069:10:70", + "nodeType": "YulIdentifier", + "src": "16069:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16089:2:70", + "nodeType": "YulLiteral", + "src": "16089:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "16093:1:70", + "nodeType": "YulLiteral", + "src": "16093:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16085:3:70", + "nodeType": "YulIdentifier", + "src": "16085:3:70" + }, + "nativeSrc": "16085:10:70", + "nodeType": "YulFunctionCall", + "src": "16085:10:70" + }, + { + "kind": "number", + "nativeSrc": "16097:1:70", + "nodeType": "YulLiteral", + "src": "16097:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16081:3:70", + "nodeType": "YulIdentifier", + "src": "16081:3:70" + }, + "nativeSrc": "16081:18:70", + "nodeType": "YulFunctionCall", + "src": "16081:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "16066:2:70", + "nodeType": "YulIdentifier", + "src": "16066:2:70" + }, + "nativeSrc": "16066:34:70", + "nodeType": "YulFunctionCall", + "src": "16066:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "16105:10:70", + "nodeType": "YulIdentifier", + "src": "16105:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "16117:6:70", + "nodeType": "YulIdentifier", + "src": "16117:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "16102:2:70", + "nodeType": "YulIdentifier", + "src": "16102:2:70" + }, + "nativeSrc": "16102:22:70", + "nodeType": "YulFunctionCall", + "src": "16102:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "16063:2:70", + "nodeType": "YulIdentifier", + "src": "16063:2:70" + }, + "nativeSrc": "16063:62:70", + "nodeType": "YulFunctionCall", + "src": "16063:62:70" + }, + "nativeSrc": "16060:88:70", + "nodeType": "YulIf", + "src": "16060:88:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16164:2:70", + "nodeType": "YulLiteral", + "src": "16164:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "16168:10:70", + "nodeType": "YulIdentifier", + "src": "16168:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16157:6:70", + "nodeType": "YulIdentifier", + "src": "16157:6:70" + }, + "nativeSrc": "16157:22:70", + "nodeType": "YulFunctionCall", + "src": "16157:22:70" + }, + "nativeSrc": "16157:22:70", + "nodeType": "YulExpressionStatement", + "src": "16157:22:70" + }, + { + "nativeSrc": "16188:17:70", + "nodeType": "YulAssignment", + "src": "16188:17:70", + "value": { + "name": "memPtr", + "nativeSrc": "16199:6:70", + "nodeType": "YulIdentifier", + "src": "16199:6:70" + }, + "variableNames": [ + { + "name": "array_1", + "nativeSrc": "16188:7:70", + "nodeType": "YulIdentifier", + "src": "16188:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "16221:6:70", + "nodeType": "YulIdentifier", + "src": "16221:6:70" + }, + { + "name": "length", + "nativeSrc": "16229:6:70", + "nodeType": "YulIdentifier", + "src": "16229:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16214:6:70", + "nodeType": "YulIdentifier", + "src": "16214:6:70" + }, + "nativeSrc": "16214:22:70", + "nodeType": "YulFunctionCall", + "src": "16214:22:70" + }, + "nativeSrc": "16214:22:70", + "nodeType": "YulExpressionStatement", + "src": "16214:22:70" + }, + { + "body": { + "nativeSrc": "16274:16:70", + "nodeType": "YulBlock", + "src": "16274:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16283:1:70", + "nodeType": "YulLiteral", + "src": "16283:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "16286:1:70", + "nodeType": "YulLiteral", + "src": "16286:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "16276:6:70", + "nodeType": "YulIdentifier", + "src": "16276:6:70" + }, + "nativeSrc": "16276:12:70", + "nodeType": "YulFunctionCall", + "src": "16276:12:70" + }, + "nativeSrc": "16276:12:70", + "nodeType": "YulExpressionStatement", + "src": "16276:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "src", + "nativeSrc": "16255:3:70", + "nodeType": "YulIdentifier", + "src": "16255:3:70" + }, + { + "name": "length", + "nativeSrc": "16260:6:70", + "nodeType": "YulIdentifier", + "src": "16260:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16251:3:70", + "nodeType": "YulIdentifier", + "src": "16251:3:70" + }, + "nativeSrc": "16251:16:70", + "nodeType": "YulFunctionCall", + "src": "16251:16:70" + }, + { + "name": "end", + "nativeSrc": "16269:3:70", + "nodeType": "YulIdentifier", + "src": "16269:3:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "16248:2:70", + "nodeType": "YulIdentifier", + "src": "16248:2:70" + }, + "nativeSrc": "16248:25:70", + "nodeType": "YulFunctionCall", + "src": "16248:25:70" + }, + "nativeSrc": "16245:45:70", + "nodeType": "YulIf", + "src": "16245:45:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "16316:6:70", + "nodeType": "YulIdentifier", + "src": "16316:6:70" + }, + { + "kind": "number", + "nativeSrc": "16324:4:70", + "nodeType": "YulLiteral", + "src": "16324:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16312:3:70", + "nodeType": "YulIdentifier", + "src": "16312:3:70" + }, + "nativeSrc": "16312:17:70", + "nodeType": "YulFunctionCall", + "src": "16312:17:70" + }, + { + "name": "src", + "nativeSrc": "16331:3:70", + "nodeType": "YulIdentifier", + "src": "16331:3:70" + }, + { + "name": "length", + "nativeSrc": "16336:6:70", + "nodeType": "YulIdentifier", + "src": "16336:6:70" + } + ], + "functionName": { + "name": "calldatacopy", + "nativeSrc": "16299:12:70", + "nodeType": "YulIdentifier", + "src": "16299:12:70" + }, + "nativeSrc": "16299:44:70", + "nodeType": "YulFunctionCall", + "src": "16299:44:70" + }, + "nativeSrc": "16299:44:70", + "nodeType": "YulExpressionStatement", + "src": "16299:44:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "16367:6:70", + "nodeType": "YulIdentifier", + "src": "16367:6:70" + }, + { + "name": "length", + "nativeSrc": "16375:6:70", + "nodeType": "YulIdentifier", + "src": "16375:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16363:3:70", + "nodeType": "YulIdentifier", + "src": "16363:3:70" + }, + "nativeSrc": "16363:19:70", + "nodeType": "YulFunctionCall", + "src": "16363:19:70" + }, + { + "kind": "number", + "nativeSrc": "16384:4:70", + "nodeType": "YulLiteral", + "src": "16384:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16359:3:70", + "nodeType": "YulIdentifier", + "src": "16359:3:70" + }, + "nativeSrc": "16359:30:70", + "nodeType": "YulFunctionCall", + "src": "16359:30:70" + }, + { + "kind": "number", + "nativeSrc": "16391:1:70", + "nodeType": "YulLiteral", + "src": "16391:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "16352:6:70", + "nodeType": "YulIdentifier", + "src": "16352:6:70" + }, + "nativeSrc": "16352:41:70", + "nodeType": "YulFunctionCall", + "src": "16352:41:70" + }, + "nativeSrc": "16352:41:70", + "nodeType": "YulExpressionStatement", + "src": "16352:41:70" + }, + { + "nativeSrc": "16402:15:70", + "nodeType": "YulAssignment", + "src": "16402:15:70", + "value": { + "name": "memPtr", + "nativeSrc": "16411:6:70", + "nodeType": "YulIdentifier", + "src": "16411:6:70" + }, + "variableNames": [ + { + "name": "array", + "nativeSrc": "16402:5:70", + "nodeType": "YulIdentifier", + "src": "16402:5:70" + } + ] + } + ] + }, + "name": "abi_decode_string", + "nativeSrc": "15534:889:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "15561:6:70", + "nodeType": "YulTypedName", + "src": "15561:6:70", + "type": "" + }, + { + "name": "end", + "nativeSrc": "15569:3:70", + "nodeType": "YulTypedName", + "src": "15569:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "array", + "nativeSrc": "15577:5:70", + "nodeType": "YulTypedName", + "src": "15577:5:70", + "type": "" + } + ], + "src": "15534:889:70" + }, + { + "body": { + "nativeSrc": "16560:549:70", + "nodeType": "YulBlock", + "src": "16560:549:70", + "statements": [ + { + "body": { + "nativeSrc": "16606:16:70", + "nodeType": "YulBlock", + "src": "16606:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16615:1:70", + "nodeType": "YulLiteral", + "src": "16615:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "16618:1:70", + "nodeType": "YulLiteral", + "src": "16618:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "16608:6:70", + "nodeType": "YulIdentifier", + "src": "16608:6:70" + }, + "nativeSrc": "16608:12:70", + "nodeType": "YulFunctionCall", + "src": "16608:12:70" + }, + "nativeSrc": "16608:12:70", + "nodeType": "YulExpressionStatement", + "src": "16608:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "16581:7:70", + "nodeType": "YulIdentifier", + "src": "16581:7:70" + }, + { + "name": "headStart", + "nativeSrc": "16590:9:70", + "nodeType": "YulIdentifier", + "src": "16590:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16577:3:70", + "nodeType": "YulIdentifier", + "src": "16577:3:70" + }, + "nativeSrc": "16577:23:70", + "nodeType": "YulFunctionCall", + "src": "16577:23:70" + }, + { + "kind": "number", + "nativeSrc": "16602:2:70", + "nodeType": "YulLiteral", + "src": "16602:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "16573:3:70", + "nodeType": "YulIdentifier", + "src": "16573:3:70" + }, + "nativeSrc": "16573:32:70", + "nodeType": "YulFunctionCall", + "src": "16573:32:70" + }, + "nativeSrc": "16570:52:70", + "nodeType": "YulIf", + "src": "16570:52:70" + }, + { + "nativeSrc": "16631:37:70", + "nodeType": "YulVariableDeclaration", + "src": "16631:37:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16658:9:70", + "nodeType": "YulIdentifier", + "src": "16658:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "16645:12:70", + "nodeType": "YulIdentifier", + "src": "16645:12:70" + }, + "nativeSrc": "16645:23:70", + "nodeType": "YulFunctionCall", + "src": "16645:23:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "16635:6:70", + "nodeType": "YulTypedName", + "src": "16635:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "16711:16:70", + "nodeType": "YulBlock", + "src": "16711:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16720:1:70", + "nodeType": "YulLiteral", + "src": "16720:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "16723:1:70", + "nodeType": "YulLiteral", + "src": "16723:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "16713:6:70", + "nodeType": "YulIdentifier", + "src": "16713:6:70" + }, + "nativeSrc": "16713:12:70", + "nodeType": "YulFunctionCall", + "src": "16713:12:70" + }, + "nativeSrc": "16713:12:70", + "nodeType": "YulExpressionStatement", + "src": "16713:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "16683:6:70", + "nodeType": "YulIdentifier", + "src": "16683:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16699:2:70", + "nodeType": "YulLiteral", + "src": "16699:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "16703:1:70", + "nodeType": "YulLiteral", + "src": "16703:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16695:3:70", + "nodeType": "YulIdentifier", + "src": "16695:3:70" + }, + "nativeSrc": "16695:10:70", + "nodeType": "YulFunctionCall", + "src": "16695:10:70" + }, + { + "kind": "number", + "nativeSrc": "16707:1:70", + "nodeType": "YulLiteral", + "src": "16707:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16691:3:70", + "nodeType": "YulIdentifier", + "src": "16691:3:70" + }, + "nativeSrc": "16691:18:70", + "nodeType": "YulFunctionCall", + "src": "16691:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "16680:2:70", + "nodeType": "YulIdentifier", + "src": "16680:2:70" + }, + "nativeSrc": "16680:30:70", + "nodeType": "YulFunctionCall", + "src": "16680:30:70" + }, + "nativeSrc": "16677:50:70", + "nodeType": "YulIf", + "src": "16677:50:70" + }, + { + "nativeSrc": "16736:60:70", + "nodeType": "YulAssignment", + "src": "16736:60:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16768:9:70", + "nodeType": "YulIdentifier", + "src": "16768:9:70" + }, + { + "name": "offset", + "nativeSrc": "16779:6:70", + "nodeType": "YulIdentifier", + "src": "16779:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16764:3:70", + "nodeType": "YulIdentifier", + "src": "16764:3:70" + }, + "nativeSrc": "16764:22:70", + "nodeType": "YulFunctionCall", + "src": "16764:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "16788:7:70", + "nodeType": "YulIdentifier", + "src": "16788:7:70" + } + ], + "functionName": { + "name": "abi_decode_string", + "nativeSrc": "16746:17:70", + "nodeType": "YulIdentifier", + "src": "16746:17:70" + }, + "nativeSrc": "16746:50:70", + "nodeType": "YulFunctionCall", + "src": "16746:50:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "16736:6:70", + "nodeType": "YulIdentifier", + "src": "16736:6:70" + } + ] + }, + { + "nativeSrc": "16805:48:70", + "nodeType": "YulVariableDeclaration", + "src": "16805:48:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16838:9:70", + "nodeType": "YulIdentifier", + "src": "16838:9:70" + }, + { + "kind": "number", + "nativeSrc": "16849:2:70", + "nodeType": "YulLiteral", + "src": "16849:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16834:3:70", + "nodeType": "YulIdentifier", + "src": "16834:3:70" + }, + "nativeSrc": "16834:18:70", + "nodeType": "YulFunctionCall", + "src": "16834:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "16821:12:70", + "nodeType": "YulIdentifier", + "src": "16821:12:70" + }, + "nativeSrc": "16821:32:70", + "nodeType": "YulFunctionCall", + "src": "16821:32:70" + }, + "variables": [ + { + "name": "offset_1", + "nativeSrc": "16809:8:70", + "nodeType": "YulTypedName", + "src": "16809:8:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "16898:16:70", + "nodeType": "YulBlock", + "src": "16898:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16907:1:70", + "nodeType": "YulLiteral", + "src": "16907:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "16910:1:70", + "nodeType": "YulLiteral", + "src": "16910:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "16900:6:70", + "nodeType": "YulIdentifier", + "src": "16900:6:70" + }, + "nativeSrc": "16900:12:70", + "nodeType": "YulFunctionCall", + "src": "16900:12:70" + }, + "nativeSrc": "16900:12:70", + "nodeType": "YulExpressionStatement", + "src": "16900:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nativeSrc": "16868:8:70", + "nodeType": "YulIdentifier", + "src": "16868:8:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "16886:2:70", + "nodeType": "YulLiteral", + "src": "16886:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "16890:1:70", + "nodeType": "YulLiteral", + "src": "16890:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "16882:3:70", + "nodeType": "YulIdentifier", + "src": "16882:3:70" + }, + "nativeSrc": "16882:10:70", + "nodeType": "YulFunctionCall", + "src": "16882:10:70" + }, + { + "kind": "number", + "nativeSrc": "16894:1:70", + "nodeType": "YulLiteral", + "src": "16894:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "16878:3:70", + "nodeType": "YulIdentifier", + "src": "16878:3:70" + }, + "nativeSrc": "16878:18:70", + "nodeType": "YulFunctionCall", + "src": "16878:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "16865:2:70", + "nodeType": "YulIdentifier", + "src": "16865:2:70" + }, + "nativeSrc": "16865:32:70", + "nodeType": "YulFunctionCall", + "src": "16865:32:70" + }, + "nativeSrc": "16862:52:70", + "nodeType": "YulIf", + "src": "16862:52:70" + }, + { + "nativeSrc": "16923:62:70", + "nodeType": "YulAssignment", + "src": "16923:62:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "16955:9:70", + "nodeType": "YulIdentifier", + "src": "16955:9:70" + }, + { + "name": "offset_1", + "nativeSrc": "16966:8:70", + "nodeType": "YulIdentifier", + "src": "16966:8:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "16951:3:70", + "nodeType": "YulIdentifier", + "src": "16951:3:70" + }, + "nativeSrc": "16951:24:70", + "nodeType": "YulFunctionCall", + "src": "16951:24:70" + }, + { + "name": "dataEnd", + "nativeSrc": "16977:7:70", + "nodeType": "YulIdentifier", + "src": "16977:7:70" + } + ], + "functionName": { + "name": "abi_decode_string", + "nativeSrc": "16933:17:70", + "nodeType": "YulIdentifier", + "src": "16933:17:70" + }, + "nativeSrc": "16933:52:70", + "nodeType": "YulFunctionCall", + "src": "16933:52:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "16923:6:70", + "nodeType": "YulIdentifier", + "src": "16923:6:70" + } + ] + }, + { + "nativeSrc": "16994:45:70", + "nodeType": "YulVariableDeclaration", + "src": "16994:45:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "17024:9:70", + "nodeType": "YulIdentifier", + "src": "17024:9:70" + }, + { + "kind": "number", + "nativeSrc": "17035:2:70", + "nodeType": "YulLiteral", + "src": "17035:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17020:3:70", + "nodeType": "YulIdentifier", + "src": "17020:3:70" + }, + "nativeSrc": "17020:18:70", + "nodeType": "YulFunctionCall", + "src": "17020:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "17007:12:70", + "nodeType": "YulIdentifier", + "src": "17007:12:70" + }, + "nativeSrc": "17007:32:70", + "nodeType": "YulFunctionCall", + "src": "17007:32:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "16998:5:70", + "nodeType": "YulTypedName", + "src": "16998:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "17073:5:70", + "nodeType": "YulIdentifier", + "src": "17073:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "17048:24:70", + "nodeType": "YulIdentifier", + "src": "17048:24:70" + }, + "nativeSrc": "17048:31:70", + "nodeType": "YulFunctionCall", + "src": "17048:31:70" + }, + "nativeSrc": "17048:31:70", + "nodeType": "YulExpressionStatement", + "src": "17048:31:70" + }, + { + "nativeSrc": "17088:15:70", + "nodeType": "YulAssignment", + "src": "17088:15:70", + "value": { + "name": "value", + "nativeSrc": "17098:5:70", + "nodeType": "YulIdentifier", + "src": "17098:5:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "17088:6:70", + "nodeType": "YulIdentifier", + "src": "17088:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_string_memory_ptrt_string_memory_ptrt_address_payable", + "nativeSrc": "16428:681:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "16510:9:70", + "nodeType": "YulTypedName", + "src": "16510:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "16521:7:70", + "nodeType": "YulTypedName", + "src": "16521:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "16533:6:70", + "nodeType": "YulTypedName", + "src": "16533:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "16541:6:70", + "nodeType": "YulTypedName", + "src": "16541:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "16549:6:70", + "nodeType": "YulTypedName", + "src": "16549:6:70", + "type": "" + } + ], + "src": "16428:681:70" + }, + { + "body": { + "nativeSrc": "17169:325:70", + "nodeType": "YulBlock", + "src": "17169:325:70", + "statements": [ + { + "nativeSrc": "17179:22:70", + "nodeType": "YulAssignment", + "src": "17179:22:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17193:1:70", + "nodeType": "YulLiteral", + "src": "17193:1:70", + "type": "", + "value": "1" + }, + { + "name": "data", + "nativeSrc": "17196:4:70", + "nodeType": "YulIdentifier", + "src": "17196:4:70" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "17189:3:70", + "nodeType": "YulIdentifier", + "src": "17189:3:70" + }, + "nativeSrc": "17189:12:70", + "nodeType": "YulFunctionCall", + "src": "17189:12:70" + }, + "variableNames": [ + { + "name": "length", + "nativeSrc": "17179:6:70", + "nodeType": "YulIdentifier", + "src": "17179:6:70" + } + ] + }, + { + "nativeSrc": "17210:38:70", + "nodeType": "YulVariableDeclaration", + "src": "17210:38:70", + "value": { + "arguments": [ + { + "name": "data", + "nativeSrc": "17240:4:70", + "nodeType": "YulIdentifier", + "src": "17240:4:70" + }, + { + "kind": "number", + "nativeSrc": "17246:1:70", + "nodeType": "YulLiteral", + "src": "17246:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "17236:3:70", + "nodeType": "YulIdentifier", + "src": "17236:3:70" + }, + "nativeSrc": "17236:12:70", + "nodeType": "YulFunctionCall", + "src": "17236:12:70" + }, + "variables": [ + { + "name": "outOfPlaceEncoding", + "nativeSrc": "17214:18:70", + "nodeType": "YulTypedName", + "src": "17214:18:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "17287:31:70", + "nodeType": "YulBlock", + "src": "17287:31:70", + "statements": [ + { + "nativeSrc": "17289:27:70", + "nodeType": "YulAssignment", + "src": "17289:27:70", + "value": { + "arguments": [ + { + "name": "length", + "nativeSrc": "17303:6:70", + "nodeType": "YulIdentifier", + "src": "17303:6:70" + }, + { + "kind": "number", + "nativeSrc": "17311:4:70", + "nodeType": "YulLiteral", + "src": "17311:4:70", + "type": "", + "value": "0x7f" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "17299:3:70", + "nodeType": "YulIdentifier", + "src": "17299:3:70" + }, + "nativeSrc": "17299:17:70", + "nodeType": "YulFunctionCall", + "src": "17299:17:70" + }, + "variableNames": [ + { + "name": "length", + "nativeSrc": "17289:6:70", + "nodeType": "YulIdentifier", + "src": "17289:6:70" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "outOfPlaceEncoding", + "nativeSrc": "17267:18:70", + "nodeType": "YulIdentifier", + "src": "17267:18:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "17260:6:70", + "nodeType": "YulIdentifier", + "src": "17260:6:70" + }, + "nativeSrc": "17260:26:70", + "nodeType": "YulFunctionCall", + "src": "17260:26:70" + }, + "nativeSrc": "17257:61:70", + "nodeType": "YulIf", + "src": "17257:61:70" + }, + { + "body": { + "nativeSrc": "17377:111:70", + "nodeType": "YulBlock", + "src": "17377:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17398:1:70", + "nodeType": "YulLiteral", + "src": "17398:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17405:3:70", + "nodeType": "YulLiteral", + "src": "17405:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "17410:10:70", + "nodeType": "YulLiteral", + "src": "17410:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "17401:3:70", + "nodeType": "YulIdentifier", + "src": "17401:3:70" + }, + "nativeSrc": "17401:20:70", + "nodeType": "YulFunctionCall", + "src": "17401:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17391:6:70", + "nodeType": "YulIdentifier", + "src": "17391:6:70" + }, + "nativeSrc": "17391:31:70", + "nodeType": "YulFunctionCall", + "src": "17391:31:70" + }, + "nativeSrc": "17391:31:70", + "nodeType": "YulExpressionStatement", + "src": "17391:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17442:1:70", + "nodeType": "YulLiteral", + "src": "17442:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "17445:4:70", + "nodeType": "YulLiteral", + "src": "17445:4:70", + "type": "", + "value": "0x22" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17435:6:70", + "nodeType": "YulIdentifier", + "src": "17435:6:70" + }, + "nativeSrc": "17435:15:70", + "nodeType": "YulFunctionCall", + "src": "17435:15:70" + }, + "nativeSrc": "17435:15:70", + "nodeType": "YulExpressionStatement", + "src": "17435:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17470:1:70", + "nodeType": "YulLiteral", + "src": "17470:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "17473:4:70", + "nodeType": "YulLiteral", + "src": "17473:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "17463:6:70", + "nodeType": "YulIdentifier", + "src": "17463:6:70" + }, + "nativeSrc": "17463:15:70", + "nodeType": "YulFunctionCall", + "src": "17463:15:70" + }, + "nativeSrc": "17463:15:70", + "nodeType": "YulExpressionStatement", + "src": "17463:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "outOfPlaceEncoding", + "nativeSrc": "17333:18:70", + "nodeType": "YulIdentifier", + "src": "17333:18:70" + }, + { + "arguments": [ + { + "name": "length", + "nativeSrc": "17356:6:70", + "nodeType": "YulIdentifier", + "src": "17356:6:70" + }, + { + "kind": "number", + "nativeSrc": "17364:2:70", + "nodeType": "YulLiteral", + "src": "17364:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "17353:2:70", + "nodeType": "YulIdentifier", + "src": "17353:2:70" + }, + "nativeSrc": "17353:14:70", + "nodeType": "YulFunctionCall", + "src": "17353:14:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "17330:2:70", + "nodeType": "YulIdentifier", + "src": "17330:2:70" + }, + "nativeSrc": "17330:38:70", + "nodeType": "YulFunctionCall", + "src": "17330:38:70" + }, + "nativeSrc": "17327:161:70", + "nodeType": "YulIf", + "src": "17327:161:70" + } + ] + }, + "name": "extract_byte_array_length", + "nativeSrc": "17114:380:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "data", + "nativeSrc": "17149:4:70", + "nodeType": "YulTypedName", + "src": "17149:4:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "length", + "nativeSrc": "17158:6:70", + "nodeType": "YulTypedName", + "src": "17158:6:70", + "type": "" + } + ], + "src": "17114:380:70" + }, + { + "body": { + "nativeSrc": "17555:65:70", + "nodeType": "YulBlock", + "src": "17555:65:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17572:1:70", + "nodeType": "YulLiteral", + "src": "17572:1:70", + "type": "", + "value": "0" + }, + { + "name": "ptr", + "nativeSrc": "17575:3:70", + "nodeType": "YulIdentifier", + "src": "17575:3:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17565:6:70", + "nodeType": "YulIdentifier", + "src": "17565:6:70" + }, + "nativeSrc": "17565:14:70", + "nodeType": "YulFunctionCall", + "src": "17565:14:70" + }, + "nativeSrc": "17565:14:70", + "nodeType": "YulExpressionStatement", + "src": "17565:14:70" + }, + { + "nativeSrc": "17588:26:70", + "nodeType": "YulAssignment", + "src": "17588:26:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17606:1:70", + "nodeType": "YulLiteral", + "src": "17606:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "17609:4:70", + "nodeType": "YulLiteral", + "src": "17609:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "keccak256", + "nativeSrc": "17596:9:70", + "nodeType": "YulIdentifier", + "src": "17596:9:70" + }, + "nativeSrc": "17596:18:70", + "nodeType": "YulFunctionCall", + "src": "17596:18:70" + }, + "variableNames": [ + { + "name": "data", + "nativeSrc": "17588:4:70", + "nodeType": "YulIdentifier", + "src": "17588:4:70" + } + ] + } + ] + }, + "name": "array_dataslot_string_storage", + "nativeSrc": "17499:121:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "ptr", + "nativeSrc": "17538:3:70", + "nodeType": "YulTypedName", + "src": "17538:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "data", + "nativeSrc": "17546:4:70", + "nodeType": "YulTypedName", + "src": "17546:4:70", + "type": "" + } + ], + "src": "17499:121:70" + }, + { + "body": { + "nativeSrc": "17706:437:70", + "nodeType": "YulBlock", + "src": "17706:437:70", + "statements": [ + { + "body": { + "nativeSrc": "17739:398:70", + "nodeType": "YulBlock", + "src": "17739:398:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17760:1:70", + "nodeType": "YulLiteral", + "src": "17760:1:70", + "type": "", + "value": "0" + }, + { + "name": "array", + "nativeSrc": "17763:5:70", + "nodeType": "YulIdentifier", + "src": "17763:5:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "17753:6:70", + "nodeType": "YulIdentifier", + "src": "17753:6:70" + }, + "nativeSrc": "17753:16:70", + "nodeType": "YulFunctionCall", + "src": "17753:16:70" + }, + "nativeSrc": "17753:16:70", + "nodeType": "YulExpressionStatement", + "src": "17753:16:70" + }, + { + "nativeSrc": "17782:30:70", + "nodeType": "YulVariableDeclaration", + "src": "17782:30:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17804:1:70", + "nodeType": "YulLiteral", + "src": "17804:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "17807:4:70", + "nodeType": "YulLiteral", + "src": "17807:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "keccak256", + "nativeSrc": "17794:9:70", + "nodeType": "YulIdentifier", + "src": "17794:9:70" + }, + "nativeSrc": "17794:18:70", + "nodeType": "YulFunctionCall", + "src": "17794:18:70" + }, + "variables": [ + { + "name": "data", + "nativeSrc": "17786:4:70", + "nodeType": "YulTypedName", + "src": "17786:4:70", + "type": "" + } + ] + }, + { + "nativeSrc": "17825:57:70", + "nodeType": "YulVariableDeclaration", + "src": "17825:57:70", + "value": { + "arguments": [ + { + "name": "data", + "nativeSrc": "17848:4:70", + "nodeType": "YulIdentifier", + "src": "17848:4:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17858:1:70", + "nodeType": "YulLiteral", + "src": "17858:1:70", + "type": "", + "value": "5" + }, + { + "arguments": [ + { + "name": "startIndex", + "nativeSrc": "17865:10:70", + "nodeType": "YulIdentifier", + "src": "17865:10:70" + }, + { + "kind": "number", + "nativeSrc": "17877:2:70", + "nodeType": "YulLiteral", + "src": "17877:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17861:3:70", + "nodeType": "YulIdentifier", + "src": "17861:3:70" + }, + "nativeSrc": "17861:19:70", + "nodeType": "YulFunctionCall", + "src": "17861:19:70" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "17854:3:70", + "nodeType": "YulIdentifier", + "src": "17854:3:70" + }, + "nativeSrc": "17854:27:70", + "nodeType": "YulFunctionCall", + "src": "17854:27:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17844:3:70", + "nodeType": "YulIdentifier", + "src": "17844:3:70" + }, + "nativeSrc": "17844:38:70", + "nodeType": "YulFunctionCall", + "src": "17844:38:70" + }, + "variables": [ + { + "name": "deleteStart", + "nativeSrc": "17829:11:70", + "nodeType": "YulTypedName", + "src": "17829:11:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "17919:23:70", + "nodeType": "YulBlock", + "src": "17919:23:70", + "statements": [ + { + "nativeSrc": "17921:19:70", + "nodeType": "YulAssignment", + "src": "17921:19:70", + "value": { + "name": "data", + "nativeSrc": "17936:4:70", + "nodeType": "YulIdentifier", + "src": "17936:4:70" + }, + "variableNames": [ + { + "name": "deleteStart", + "nativeSrc": "17921:11:70", + "nodeType": "YulIdentifier", + "src": "17921:11:70" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "startIndex", + "nativeSrc": "17901:10:70", + "nodeType": "YulIdentifier", + "src": "17901:10:70" + }, + { + "kind": "number", + "nativeSrc": "17913:4:70", + "nodeType": "YulLiteral", + "src": "17913:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "17898:2:70", + "nodeType": "YulIdentifier", + "src": "17898:2:70" + }, + "nativeSrc": "17898:20:70", + "nodeType": "YulFunctionCall", + "src": "17898:20:70" + }, + "nativeSrc": "17895:47:70", + "nodeType": "YulIf", + "src": "17895:47:70" + }, + { + "nativeSrc": "17955:41:70", + "nodeType": "YulVariableDeclaration", + "src": "17955:41:70", + "value": { + "arguments": [ + { + "name": "data", + "nativeSrc": "17969:4:70", + "nodeType": "YulIdentifier", + "src": "17969:4:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "17979:1:70", + "nodeType": "YulLiteral", + "src": "17979:1:70", + "type": "", + "value": "5" + }, + { + "arguments": [ + { + "name": "len", + "nativeSrc": "17986:3:70", + "nodeType": "YulIdentifier", + "src": "17986:3:70" + }, + { + "kind": "number", + "nativeSrc": "17991:2:70", + "nodeType": "YulLiteral", + "src": "17991:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17982:3:70", + "nodeType": "YulIdentifier", + "src": "17982:3:70" + }, + "nativeSrc": "17982:12:70", + "nodeType": "YulFunctionCall", + "src": "17982:12:70" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "17975:3:70", + "nodeType": "YulIdentifier", + "src": "17975:3:70" + }, + "nativeSrc": "17975:20:70", + "nodeType": "YulFunctionCall", + "src": "17975:20:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "17965:3:70", + "nodeType": "YulIdentifier", + "src": "17965:3:70" + }, + "nativeSrc": "17965:31:70", + "nodeType": "YulFunctionCall", + "src": "17965:31:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "17959:2:70", + "nodeType": "YulTypedName", + "src": "17959:2:70", + "type": "" + } + ] + }, + { + "nativeSrc": "18009:24:70", + "nodeType": "YulVariableDeclaration", + "src": "18009:24:70", + "value": { + "name": "deleteStart", + "nativeSrc": "18022:11:70", + "nodeType": "YulIdentifier", + "src": "18022:11:70" + }, + "variables": [ + { + "name": "start", + "nativeSrc": "18013:5:70", + "nodeType": "YulTypedName", + "src": "18013:5:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "18107:20:70", + "nodeType": "YulBlock", + "src": "18107:20:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "start", + "nativeSrc": "18116:5:70", + "nodeType": "YulIdentifier", + "src": "18116:5:70" + }, + { + "kind": "number", + "nativeSrc": "18123:1:70", + "nodeType": "YulLiteral", + "src": "18123:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "sstore", + "nativeSrc": "18109:6:70", + "nodeType": "YulIdentifier", + "src": "18109:6:70" + }, + "nativeSrc": "18109:16:70", + "nodeType": "YulFunctionCall", + "src": "18109:16:70" + }, + "nativeSrc": "18109:16:70", + "nodeType": "YulExpressionStatement", + "src": "18109:16:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "start", + "nativeSrc": "18057:5:70", + "nodeType": "YulIdentifier", + "src": "18057:5:70" + }, + { + "name": "_1", + "nativeSrc": "18064:2:70", + "nodeType": "YulIdentifier", + "src": "18064:2:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "18054:2:70", + "nodeType": "YulIdentifier", + "src": "18054:2:70" + }, + "nativeSrc": "18054:13:70", + "nodeType": "YulFunctionCall", + "src": "18054:13:70" + }, + "nativeSrc": "18046:81:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "18068:26:70", + "nodeType": "YulBlock", + "src": "18068:26:70", + "statements": [ + { + "nativeSrc": "18070:22:70", + "nodeType": "YulAssignment", + "src": "18070:22:70", + "value": { + "arguments": [ + { + "name": "start", + "nativeSrc": "18083:5:70", + "nodeType": "YulIdentifier", + "src": "18083:5:70" + }, + { + "kind": "number", + "nativeSrc": "18090:1:70", + "nodeType": "YulLiteral", + "src": "18090:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18079:3:70", + "nodeType": "YulIdentifier", + "src": "18079:3:70" + }, + "nativeSrc": "18079:13:70", + "nodeType": "YulFunctionCall", + "src": "18079:13:70" + }, + "variableNames": [ + { + "name": "start", + "nativeSrc": "18070:5:70", + "nodeType": "YulIdentifier", + "src": "18070:5:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "18050:3:70", + "nodeType": "YulBlock", + "src": "18050:3:70", + "statements": [] + }, + "src": "18046:81:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "len", + "nativeSrc": "17722:3:70", + "nodeType": "YulIdentifier", + "src": "17722:3:70" + }, + { + "kind": "number", + "nativeSrc": "17727:2:70", + "nodeType": "YulLiteral", + "src": "17727:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "17719:2:70", + "nodeType": "YulIdentifier", + "src": "17719:2:70" + }, + "nativeSrc": "17719:11:70", + "nodeType": "YulFunctionCall", + "src": "17719:11:70" + }, + "nativeSrc": "17716:421:70", + "nodeType": "YulIf", + "src": "17716:421:70" + } + ] + }, + "name": "clean_up_bytearray_end_slots_string_storage", + "nativeSrc": "17625:518:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "array", + "nativeSrc": "17678:5:70", + "nodeType": "YulTypedName", + "src": "17678:5:70", + "type": "" + }, + { + "name": "len", + "nativeSrc": "17685:3:70", + "nodeType": "YulTypedName", + "src": "17685:3:70", + "type": "" + }, + { + "name": "startIndex", + "nativeSrc": "17690:10:70", + "nodeType": "YulTypedName", + "src": "17690:10:70", + "type": "" + } + ], + "src": "17625:518:70" + }, + { + "body": { + "nativeSrc": "18233:81:70", + "nodeType": "YulBlock", + "src": "18233:81:70", + "statements": [ + { + "nativeSrc": "18243:65:70", + "nodeType": "YulAssignment", + "src": "18243:65:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "data", + "nativeSrc": "18258:4:70", + "nodeType": "YulIdentifier", + "src": "18258:4:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18276:1:70", + "nodeType": "YulLiteral", + "src": "18276:1:70", + "type": "", + "value": "3" + }, + { + "name": "len", + "nativeSrc": "18279:3:70", + "nodeType": "YulIdentifier", + "src": "18279:3:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "18272:3:70", + "nodeType": "YulIdentifier", + "src": "18272:3:70" + }, + "nativeSrc": "18272:11:70", + "nodeType": "YulFunctionCall", + "src": "18272:11:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18289:1:70", + "nodeType": "YulLiteral", + "src": "18289:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "18285:3:70", + "nodeType": "YulIdentifier", + "src": "18285:3:70" + }, + "nativeSrc": "18285:6:70", + "nodeType": "YulFunctionCall", + "src": "18285:6:70" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "18268:3:70", + "nodeType": "YulIdentifier", + "src": "18268:3:70" + }, + "nativeSrc": "18268:24:70", + "nodeType": "YulFunctionCall", + "src": "18268:24:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "18264:3:70", + "nodeType": "YulIdentifier", + "src": "18264:3:70" + }, + "nativeSrc": "18264:29:70", + "nodeType": "YulFunctionCall", + "src": "18264:29:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "18254:3:70", + "nodeType": "YulIdentifier", + "src": "18254:3:70" + }, + "nativeSrc": "18254:40:70", + "nodeType": "YulFunctionCall", + "src": "18254:40:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18300:1:70", + "nodeType": "YulLiteral", + "src": "18300:1:70", + "type": "", + "value": "1" + }, + { + "name": "len", + "nativeSrc": "18303:3:70", + "nodeType": "YulIdentifier", + "src": "18303:3:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "18296:3:70", + "nodeType": "YulIdentifier", + "src": "18296:3:70" + }, + "nativeSrc": "18296:11:70", + "nodeType": "YulFunctionCall", + "src": "18296:11:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "18251:2:70", + "nodeType": "YulIdentifier", + "src": "18251:2:70" + }, + "nativeSrc": "18251:57:70", + "nodeType": "YulFunctionCall", + "src": "18251:57:70" + }, + "variableNames": [ + { + "name": "used", + "nativeSrc": "18243:4:70", + "nodeType": "YulIdentifier", + "src": "18243:4:70" + } + ] + } + ] + }, + "name": "extract_used_part_and_set_length_of_short_byte_array", + "nativeSrc": "18148:166:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "data", + "nativeSrc": "18210:4:70", + "nodeType": "YulTypedName", + "src": "18210:4:70", + "type": "" + }, + { + "name": "len", + "nativeSrc": "18216:3:70", + "nodeType": "YulTypedName", + "src": "18216:3:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "used", + "nativeSrc": "18224:4:70", + "nodeType": "YulTypedName", + "src": "18224:4:70", + "type": "" + } + ], + "src": "18148:166:70" + }, + { + "body": { + "nativeSrc": "18415:1203:70", + "nodeType": "YulBlock", + "src": "18415:1203:70", + "statements": [ + { + "nativeSrc": "18425:24:70", + "nodeType": "YulVariableDeclaration", + "src": "18425:24:70", + "value": { + "arguments": [ + { + "name": "src", + "nativeSrc": "18445:3:70", + "nodeType": "YulIdentifier", + "src": "18445:3:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "18439:5:70", + "nodeType": "YulIdentifier", + "src": "18439:5:70" + }, + "nativeSrc": "18439:10:70", + "nodeType": "YulFunctionCall", + "src": "18439:10:70" + }, + "variables": [ + { + "name": "newLen", + "nativeSrc": "18429:6:70", + "nodeType": "YulTypedName", + "src": "18429:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "18492:22:70", + "nodeType": "YulBlock", + "src": "18492:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "18494:16:70", + "nodeType": "YulIdentifier", + "src": "18494:16:70" + }, + "nativeSrc": "18494:18:70", + "nodeType": "YulFunctionCall", + "src": "18494:18:70" + }, + "nativeSrc": "18494:18:70", + "nodeType": "YulExpressionStatement", + "src": "18494:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "newLen", + "nativeSrc": "18464:6:70", + "nodeType": "YulIdentifier", + "src": "18464:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18480:2:70", + "nodeType": "YulLiteral", + "src": "18480:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "18484:1:70", + "nodeType": "YulLiteral", + "src": "18484:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "18476:3:70", + "nodeType": "YulIdentifier", + "src": "18476:3:70" + }, + "nativeSrc": "18476:10:70", + "nodeType": "YulFunctionCall", + "src": "18476:10:70" + }, + { + "kind": "number", + "nativeSrc": "18488:1:70", + "nodeType": "YulLiteral", + "src": "18488:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "18472:3:70", + "nodeType": "YulIdentifier", + "src": "18472:3:70" + }, + "nativeSrc": "18472:18:70", + "nodeType": "YulFunctionCall", + "src": "18472:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "18461:2:70", + "nodeType": "YulIdentifier", + "src": "18461:2:70" + }, + "nativeSrc": "18461:30:70", + "nodeType": "YulFunctionCall", + "src": "18461:30:70" + }, + "nativeSrc": "18458:56:70", + "nodeType": "YulIf", + "src": "18458:56:70" + }, + { + "expression": { + "arguments": [ + { + "name": "slot", + "nativeSrc": "18567:4:70", + "nodeType": "YulIdentifier", + "src": "18567:4:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "slot", + "nativeSrc": "18605:4:70", + "nodeType": "YulIdentifier", + "src": "18605:4:70" + } + ], + "functionName": { + "name": "sload", + "nativeSrc": "18599:5:70", + "nodeType": "YulIdentifier", + "src": "18599:5:70" + }, + "nativeSrc": "18599:11:70", + "nodeType": "YulFunctionCall", + "src": "18599:11:70" + } + ], + "functionName": { + "name": "extract_byte_array_length", + "nativeSrc": "18573:25:70", + "nodeType": "YulIdentifier", + "src": "18573:25:70" + }, + "nativeSrc": "18573:38:70", + "nodeType": "YulFunctionCall", + "src": "18573:38:70" + }, + { + "name": "newLen", + "nativeSrc": "18613:6:70", + "nodeType": "YulIdentifier", + "src": "18613:6:70" + } + ], + "functionName": { + "name": "clean_up_bytearray_end_slots_string_storage", + "nativeSrc": "18523:43:70", + "nodeType": "YulIdentifier", + "src": "18523:43:70" + }, + "nativeSrc": "18523:97:70", + "nodeType": "YulFunctionCall", + "src": "18523:97:70" + }, + "nativeSrc": "18523:97:70", + "nodeType": "YulExpressionStatement", + "src": "18523:97:70" + }, + { + "nativeSrc": "18629:18:70", + "nodeType": "YulVariableDeclaration", + "src": "18629:18:70", + "value": { + "kind": "number", + "nativeSrc": "18646:1:70", + "nodeType": "YulLiteral", + "src": "18646:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "srcOffset", + "nativeSrc": "18633:9:70", + "nodeType": "YulTypedName", + "src": "18633:9:70", + "type": "" + } + ] + }, + { + "nativeSrc": "18656:17:70", + "nodeType": "YulAssignment", + "src": "18656:17:70", + "value": { + "kind": "number", + "nativeSrc": "18669:4:70", + "nodeType": "YulLiteral", + "src": "18669:4:70", + "type": "", + "value": "0x20" + }, + "variableNames": [ + { + "name": "srcOffset", + "nativeSrc": "18656:9:70", + "nodeType": "YulIdentifier", + "src": "18656:9:70" + } + ] + }, + { + "cases": [ + { + "body": { + "nativeSrc": "18719:642:70", + "nodeType": "YulBlock", + "src": "18719:642:70", + "statements": [ + { + "nativeSrc": "18733:35:70", + "nodeType": "YulVariableDeclaration", + "src": "18733:35:70", + "value": { + "arguments": [ + { + "name": "newLen", + "nativeSrc": "18752:6:70", + "nodeType": "YulIdentifier", + "src": "18752:6:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "18764:2:70", + "nodeType": "YulLiteral", + "src": "18764:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "18760:3:70", + "nodeType": "YulIdentifier", + "src": "18760:3:70" + }, + "nativeSrc": "18760:7:70", + "nodeType": "YulFunctionCall", + "src": "18760:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "18748:3:70", + "nodeType": "YulIdentifier", + "src": "18748:3:70" + }, + "nativeSrc": "18748:20:70", + "nodeType": "YulFunctionCall", + "src": "18748:20:70" + }, + "variables": [ + { + "name": "loopEnd", + "nativeSrc": "18737:7:70", + "nodeType": "YulTypedName", + "src": "18737:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "18781:49:70", + "nodeType": "YulVariableDeclaration", + "src": "18781:49:70", + "value": { + "arguments": [ + { + "name": "slot", + "nativeSrc": "18825:4:70", + "nodeType": "YulIdentifier", + "src": "18825:4:70" + } + ], + "functionName": { + "name": "array_dataslot_string_storage", + "nativeSrc": "18795:29:70", + "nodeType": "YulIdentifier", + "src": "18795:29:70" + }, + "nativeSrc": "18795:35:70", + "nodeType": "YulFunctionCall", + "src": "18795:35:70" + }, + "variables": [ + { + "name": "dstPtr", + "nativeSrc": "18785:6:70", + "nodeType": "YulTypedName", + "src": "18785:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "18843:10:70", + "nodeType": "YulVariableDeclaration", + "src": "18843:10:70", + "value": { + "kind": "number", + "nativeSrc": "18852:1:70", + "nodeType": "YulLiteral", + "src": "18852:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nativeSrc": "18847:1:70", + "nodeType": "YulTypedName", + "src": "18847:1:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "18923:165:70", + "nodeType": "YulBlock", + "src": "18923:165:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "dstPtr", + "nativeSrc": "18948:6:70", + "nodeType": "YulIdentifier", + "src": "18948:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "src", + "nativeSrc": "18966:3:70", + "nodeType": "YulIdentifier", + "src": "18966:3:70" + }, + { + "name": "srcOffset", + "nativeSrc": "18971:9:70", + "nodeType": "YulIdentifier", + "src": "18971:9:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18962:3:70", + "nodeType": "YulIdentifier", + "src": "18962:3:70" + }, + "nativeSrc": "18962:19:70", + "nodeType": "YulFunctionCall", + "src": "18962:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "18956:5:70", + "nodeType": "YulIdentifier", + "src": "18956:5:70" + }, + "nativeSrc": "18956:26:70", + "nodeType": "YulFunctionCall", + "src": "18956:26:70" + } + ], + "functionName": { + "name": "sstore", + "nativeSrc": "18941:6:70", + "nodeType": "YulIdentifier", + "src": "18941:6:70" + }, + "nativeSrc": "18941:42:70", + "nodeType": "YulFunctionCall", + "src": "18941:42:70" + }, + "nativeSrc": "18941:42:70", + "nodeType": "YulExpressionStatement", + "src": "18941:42:70" + }, + { + "nativeSrc": "19000:24:70", + "nodeType": "YulAssignment", + "src": "19000:24:70", + "value": { + "arguments": [ + { + "name": "dstPtr", + "nativeSrc": "19014:6:70", + "nodeType": "YulIdentifier", + "src": "19014:6:70" + }, + { + "kind": "number", + "nativeSrc": "19022:1:70", + "nodeType": "YulLiteral", + "src": "19022:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19010:3:70", + "nodeType": "YulIdentifier", + "src": "19010:3:70" + }, + "nativeSrc": "19010:14:70", + "nodeType": "YulFunctionCall", + "src": "19010:14:70" + }, + "variableNames": [ + { + "name": "dstPtr", + "nativeSrc": "19000:6:70", + "nodeType": "YulIdentifier", + "src": "19000:6:70" + } + ] + }, + { + "nativeSrc": "19041:33:70", + "nodeType": "YulAssignment", + "src": "19041:33:70", + "value": { + "arguments": [ + { + "name": "srcOffset", + "nativeSrc": "19058:9:70", + "nodeType": "YulIdentifier", + "src": "19058:9:70" + }, + { + "kind": "number", + "nativeSrc": "19069:4:70", + "nodeType": "YulLiteral", + "src": "19069:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19054:3:70", + "nodeType": "YulIdentifier", + "src": "19054:3:70" + }, + "nativeSrc": "19054:20:70", + "nodeType": "YulFunctionCall", + "src": "19054:20:70" + }, + "variableNames": [ + { + "name": "srcOffset", + "nativeSrc": "19041:9:70", + "nodeType": "YulIdentifier", + "src": "19041:9:70" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nativeSrc": "18877:1:70", + "nodeType": "YulIdentifier", + "src": "18877:1:70" + }, + { + "name": "loopEnd", + "nativeSrc": "18880:7:70", + "nodeType": "YulIdentifier", + "src": "18880:7:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "18874:2:70", + "nodeType": "YulIdentifier", + "src": "18874:2:70" + }, + "nativeSrc": "18874:14:70", + "nodeType": "YulFunctionCall", + "src": "18874:14:70" + }, + "nativeSrc": "18866:222:70", + "nodeType": "YulForLoop", + "post": { + "nativeSrc": "18889:21:70", + "nodeType": "YulBlock", + "src": "18889:21:70", + "statements": [ + { + "nativeSrc": "18891:17:70", + "nodeType": "YulAssignment", + "src": "18891:17:70", + "value": { + "arguments": [ + { + "name": "i", + "nativeSrc": "18900:1:70", + "nodeType": "YulIdentifier", + "src": "18900:1:70" + }, + { + "kind": "number", + "nativeSrc": "18903:4:70", + "nodeType": "YulLiteral", + "src": "18903:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "18896:3:70", + "nodeType": "YulIdentifier", + "src": "18896:3:70" + }, + "nativeSrc": "18896:12:70", + "nodeType": "YulFunctionCall", + "src": "18896:12:70" + }, + "variableNames": [ + { + "name": "i", + "nativeSrc": "18891:1:70", + "nodeType": "YulIdentifier", + "src": "18891:1:70" + } + ] + } + ] + }, + "pre": { + "nativeSrc": "18870:3:70", + "nodeType": "YulBlock", + "src": "18870:3:70", + "statements": [] + }, + "src": "18866:222:70" + }, + { + "body": { + "nativeSrc": "19136:166:70", + "nodeType": "YulBlock", + "src": "19136:166:70", + "statements": [ + { + "nativeSrc": "19154:43:70", + "nodeType": "YulVariableDeclaration", + "src": "19154:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "src", + "nativeSrc": "19181:3:70", + "nodeType": "YulIdentifier", + "src": "19181:3:70" + }, + { + "name": "srcOffset", + "nativeSrc": "19186:9:70", + "nodeType": "YulIdentifier", + "src": "19186:9:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19177:3:70", + "nodeType": "YulIdentifier", + "src": "19177:3:70" + }, + "nativeSrc": "19177:19:70", + "nodeType": "YulFunctionCall", + "src": "19177:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "19171:5:70", + "nodeType": "YulIdentifier", + "src": "19171:5:70" + }, + "nativeSrc": "19171:26:70", + "nodeType": "YulFunctionCall", + "src": "19171:26:70" + }, + "variables": [ + { + "name": "lastValue", + "nativeSrc": "19158:9:70", + "nodeType": "YulTypedName", + "src": "19158:9:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "dstPtr", + "nativeSrc": "19221:6:70", + "nodeType": "YulIdentifier", + "src": "19221:6:70" + }, + { + "arguments": [ + { + "name": "lastValue", + "nativeSrc": "19233:9:70", + "nodeType": "YulIdentifier", + "src": "19233:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19260:1:70", + "nodeType": "YulLiteral", + "src": "19260:1:70", + "type": "", + "value": "3" + }, + { + "name": "newLen", + "nativeSrc": "19263:6:70", + "nodeType": "YulIdentifier", + "src": "19263:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "19256:3:70", + "nodeType": "YulIdentifier", + "src": "19256:3:70" + }, + "nativeSrc": "19256:14:70", + "nodeType": "YulFunctionCall", + "src": "19256:14:70" + }, + { + "kind": "number", + "nativeSrc": "19272:3:70", + "nodeType": "YulLiteral", + "src": "19272:3:70", + "type": "", + "value": "248" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "19252:3:70", + "nodeType": "YulIdentifier", + "src": "19252:3:70" + }, + "nativeSrc": "19252:24:70", + "nodeType": "YulFunctionCall", + "src": "19252:24:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19282:1:70", + "nodeType": "YulLiteral", + "src": "19282:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "19278:3:70", + "nodeType": "YulIdentifier", + "src": "19278:3:70" + }, + "nativeSrc": "19278:6:70", + "nodeType": "YulFunctionCall", + "src": "19278:6:70" + } + ], + "functionName": { + "name": "shr", + "nativeSrc": "19248:3:70", + "nodeType": "YulIdentifier", + "src": "19248:3:70" + }, + "nativeSrc": "19248:37:70", + "nodeType": "YulFunctionCall", + "src": "19248:37:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "19244:3:70", + "nodeType": "YulIdentifier", + "src": "19244:3:70" + }, + "nativeSrc": "19244:42:70", + "nodeType": "YulFunctionCall", + "src": "19244:42:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "19229:3:70", + "nodeType": "YulIdentifier", + "src": "19229:3:70" + }, + "nativeSrc": "19229:58:70", + "nodeType": "YulFunctionCall", + "src": "19229:58:70" + } + ], + "functionName": { + "name": "sstore", + "nativeSrc": "19214:6:70", + "nodeType": "YulIdentifier", + "src": "19214:6:70" + }, + "nativeSrc": "19214:74:70", + "nodeType": "YulFunctionCall", + "src": "19214:74:70" + }, + "nativeSrc": "19214:74:70", + "nodeType": "YulExpressionStatement", + "src": "19214:74:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "loopEnd", + "nativeSrc": "19107:7:70", + "nodeType": "YulIdentifier", + "src": "19107:7:70" + }, + { + "name": "newLen", + "nativeSrc": "19116:6:70", + "nodeType": "YulIdentifier", + "src": "19116:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "19104:2:70", + "nodeType": "YulIdentifier", + "src": "19104:2:70" + }, + "nativeSrc": "19104:19:70", + "nodeType": "YulFunctionCall", + "src": "19104:19:70" + }, + "nativeSrc": "19101:201:70", + "nodeType": "YulIf", + "src": "19101:201:70" + }, + { + "expression": { + "arguments": [ + { + "name": "slot", + "nativeSrc": "19322:4:70", + "nodeType": "YulIdentifier", + "src": "19322:4:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19336:1:70", + "nodeType": "YulLiteral", + "src": "19336:1:70", + "type": "", + "value": "1" + }, + { + "name": "newLen", + "nativeSrc": "19339:6:70", + "nodeType": "YulIdentifier", + "src": "19339:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "19332:3:70", + "nodeType": "YulIdentifier", + "src": "19332:3:70" + }, + "nativeSrc": "19332:14:70", + "nodeType": "YulFunctionCall", + "src": "19332:14:70" + }, + { + "kind": "number", + "nativeSrc": "19348:1:70", + "nodeType": "YulLiteral", + "src": "19348:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19328:3:70", + "nodeType": "YulIdentifier", + "src": "19328:3:70" + }, + "nativeSrc": "19328:22:70", + "nodeType": "YulFunctionCall", + "src": "19328:22:70" + } + ], + "functionName": { + "name": "sstore", + "nativeSrc": "19315:6:70", + "nodeType": "YulIdentifier", + "src": "19315:6:70" + }, + "nativeSrc": "19315:36:70", + "nodeType": "YulFunctionCall", + "src": "19315:36:70" + }, + "nativeSrc": "19315:36:70", + "nodeType": "YulExpressionStatement", + "src": "19315:36:70" + } + ] + }, + "nativeSrc": "18712:649:70", + "nodeType": "YulCase", + "src": "18712:649:70", + "value": { + "kind": "number", + "nativeSrc": "18717:1:70", + "nodeType": "YulLiteral", + "src": "18717:1:70", + "type": "", + "value": "1" + } + }, + { + "body": { + "nativeSrc": "19378:234:70", + "nodeType": "YulBlock", + "src": "19378:234:70", + "statements": [ + { + "nativeSrc": "19392:14:70", + "nodeType": "YulVariableDeclaration", + "src": "19392:14:70", + "value": { + "kind": "number", + "nativeSrc": "19405:1:70", + "nodeType": "YulLiteral", + "src": "19405:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "19396:5:70", + "nodeType": "YulTypedName", + "src": "19396:5:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "19441:67:70", + "nodeType": "YulBlock", + "src": "19441:67:70", + "statements": [ + { + "nativeSrc": "19459:35:70", + "nodeType": "YulAssignment", + "src": "19459:35:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "src", + "nativeSrc": "19478:3:70", + "nodeType": "YulIdentifier", + "src": "19478:3:70" + }, + { + "name": "srcOffset", + "nativeSrc": "19483:9:70", + "nodeType": "YulIdentifier", + "src": "19483:9:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19474:3:70", + "nodeType": "YulIdentifier", + "src": "19474:3:70" + }, + "nativeSrc": "19474:19:70", + "nodeType": "YulFunctionCall", + "src": "19474:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "19468:5:70", + "nodeType": "YulIdentifier", + "src": "19468:5:70" + }, + "nativeSrc": "19468:26:70", + "nodeType": "YulFunctionCall", + "src": "19468:26:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "19459:5:70", + "nodeType": "YulIdentifier", + "src": "19459:5:70" + } + ] + } + ] + }, + "condition": { + "name": "newLen", + "nativeSrc": "19422:6:70", + "nodeType": "YulIdentifier", + "src": "19422:6:70" + }, + "nativeSrc": "19419:89:70", + "nodeType": "YulIf", + "src": "19419:89:70" + }, + { + "expression": { + "arguments": [ + { + "name": "slot", + "nativeSrc": "19528:4:70", + "nodeType": "YulIdentifier", + "src": "19528:4:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "19587:5:70", + "nodeType": "YulIdentifier", + "src": "19587:5:70" + }, + { + "name": "newLen", + "nativeSrc": "19594:6:70", + "nodeType": "YulIdentifier", + "src": "19594:6:70" + } + ], + "functionName": { + "name": "extract_used_part_and_set_length_of_short_byte_array", + "nativeSrc": "19534:52:70", + "nodeType": "YulIdentifier", + "src": "19534:52:70" + }, + "nativeSrc": "19534:67:70", + "nodeType": "YulFunctionCall", + "src": "19534:67:70" + } + ], + "functionName": { + "name": "sstore", + "nativeSrc": "19521:6:70", + "nodeType": "YulIdentifier", + "src": "19521:6:70" + }, + "nativeSrc": "19521:81:70", + "nodeType": "YulFunctionCall", + "src": "19521:81:70" + }, + "nativeSrc": "19521:81:70", + "nodeType": "YulExpressionStatement", + "src": "19521:81:70" + } + ] + }, + "nativeSrc": "19370:242:70", + "nodeType": "YulCase", + "src": "19370:242:70", + "value": "default" + } + ], + "expression": { + "arguments": [ + { + "name": "newLen", + "nativeSrc": "18692:6:70", + "nodeType": "YulIdentifier", + "src": "18692:6:70" + }, + { + "kind": "number", + "nativeSrc": "18700:2:70", + "nodeType": "YulLiteral", + "src": "18700:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "18689:2:70", + "nodeType": "YulIdentifier", + "src": "18689:2:70" + }, + "nativeSrc": "18689:14:70", + "nodeType": "YulFunctionCall", + "src": "18689:14:70" + }, + "nativeSrc": "18682:930:70", + "nodeType": "YulSwitch", + "src": "18682:930:70" + } + ] + }, + "name": "copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage", + "nativeSrc": "18319:1299:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "slot", + "nativeSrc": "18400:4:70", + "nodeType": "YulTypedName", + "src": "18400:4:70", + "type": "" + }, + { + "name": "src", + "nativeSrc": "18406:3:70", + "nodeType": "YulTypedName", + "src": "18406:3:70", + "type": "" + } + ], + "src": "18319:1299:70" + }, + { + "body": { + "nativeSrc": "19752:259:70", + "nodeType": "YulBlock", + "src": "19752:259:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19769:9:70", + "nodeType": "YulIdentifier", + "src": "19769:9:70" + }, + { + "kind": "number", + "nativeSrc": "19780:2:70", + "nodeType": "YulLiteral", + "src": "19780:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19762:6:70", + "nodeType": "YulIdentifier", + "src": "19762:6:70" + }, + "nativeSrc": "19762:21:70", + "nodeType": "YulFunctionCall", + "src": "19762:21:70" + }, + "nativeSrc": "19762:21:70", + "nodeType": "YulExpressionStatement", + "src": "19762:21:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19803:9:70", + "nodeType": "YulIdentifier", + "src": "19803:9:70" + }, + { + "kind": "number", + "nativeSrc": "19814:2:70", + "nodeType": "YulLiteral", + "src": "19814:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19799:3:70", + "nodeType": "YulIdentifier", + "src": "19799:3:70" + }, + "nativeSrc": "19799:18:70", + "nodeType": "YulFunctionCall", + "src": "19799:18:70" + }, + { + "name": "value1", + "nativeSrc": "19819:6:70", + "nodeType": "YulIdentifier", + "src": "19819:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19792:6:70", + "nodeType": "YulIdentifier", + "src": "19792:6:70" + }, + "nativeSrc": "19792:34:70", + "nodeType": "YulFunctionCall", + "src": "19792:34:70" + }, + "nativeSrc": "19792:34:70", + "nodeType": "YulExpressionStatement", + "src": "19792:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19852:9:70", + "nodeType": "YulIdentifier", + "src": "19852:9:70" + }, + { + "kind": "number", + "nativeSrc": "19863:2:70", + "nodeType": "YulLiteral", + "src": "19863:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19848:3:70", + "nodeType": "YulIdentifier", + "src": "19848:3:70" + }, + "nativeSrc": "19848:18:70", + "nodeType": "YulFunctionCall", + "src": "19848:18:70" + }, + { + "name": "value0", + "nativeSrc": "19868:6:70", + "nodeType": "YulIdentifier", + "src": "19868:6:70" + }, + { + "name": "value1", + "nativeSrc": "19876:6:70", + "nodeType": "YulIdentifier", + "src": "19876:6:70" + } + ], + "functionName": { + "name": "calldatacopy", + "nativeSrc": "19835:12:70", + "nodeType": "YulIdentifier", + "src": "19835:12:70" + }, + "nativeSrc": "19835:48:70", + "nodeType": "YulFunctionCall", + "src": "19835:48:70" + }, + "nativeSrc": "19835:48:70", + "nodeType": "YulExpressionStatement", + "src": "19835:48:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19907:9:70", + "nodeType": "YulIdentifier", + "src": "19907:9:70" + }, + { + "name": "value1", + "nativeSrc": "19918:6:70", + "nodeType": "YulIdentifier", + "src": "19918:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19903:3:70", + "nodeType": "YulIdentifier", + "src": "19903:3:70" + }, + "nativeSrc": "19903:22:70", + "nodeType": "YulFunctionCall", + "src": "19903:22:70" + }, + { + "kind": "number", + "nativeSrc": "19927:2:70", + "nodeType": "YulLiteral", + "src": "19927:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19899:3:70", + "nodeType": "YulIdentifier", + "src": "19899:3:70" + }, + "nativeSrc": "19899:31:70", + "nodeType": "YulFunctionCall", + "src": "19899:31:70" + }, + { + "kind": "number", + "nativeSrc": "19932:1:70", + "nodeType": "YulLiteral", + "src": "19932:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "19892:6:70", + "nodeType": "YulIdentifier", + "src": "19892:6:70" + }, + "nativeSrc": "19892:42:70", + "nodeType": "YulFunctionCall", + "src": "19892:42:70" + }, + "nativeSrc": "19892:42:70", + "nodeType": "YulExpressionStatement", + "src": "19892:42:70" + }, + { + "nativeSrc": "19943:62:70", + "nodeType": "YulAssignment", + "src": "19943:62:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "19959:9:70", + "nodeType": "YulIdentifier", + "src": "19959:9:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "19978:6:70", + "nodeType": "YulIdentifier", + "src": "19978:6:70" + }, + { + "kind": "number", + "nativeSrc": "19986:2:70", + "nodeType": "YulLiteral", + "src": "19986:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19974:3:70", + "nodeType": "YulIdentifier", + "src": "19974:3:70" + }, + "nativeSrc": "19974:15:70", + "nodeType": "YulFunctionCall", + "src": "19974:15:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "19995:2:70", + "nodeType": "YulLiteral", + "src": "19995:2:70", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "19991:3:70", + "nodeType": "YulIdentifier", + "src": "19991:3:70" + }, + "nativeSrc": "19991:7:70", + "nodeType": "YulFunctionCall", + "src": "19991:7:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "19970:3:70", + "nodeType": "YulIdentifier", + "src": "19970:3:70" + }, + "nativeSrc": "19970:29:70", + "nodeType": "YulFunctionCall", + "src": "19970:29:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19955:3:70", + "nodeType": "YulIdentifier", + "src": "19955:3:70" + }, + "nativeSrc": "19955:45:70", + "nodeType": "YulFunctionCall", + "src": "19955:45:70" + }, + { + "kind": "number", + "nativeSrc": "20002:2:70", + "nodeType": "YulLiteral", + "src": "20002:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "19951:3:70", + "nodeType": "YulIdentifier", + "src": "19951:3:70" + }, + "nativeSrc": "19951:54:70", + "nodeType": "YulFunctionCall", + "src": "19951:54:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "19943:4:70", + "nodeType": "YulIdentifier", + "src": "19943:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nativeSrc": "19623:388:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "19713:9:70", + "nodeType": "YulTypedName", + "src": "19713:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "19724:6:70", + "nodeType": "YulTypedName", + "src": "19724:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "19732:6:70", + "nodeType": "YulTypedName", + "src": "19732:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "19743:4:70", + "nodeType": "YulTypedName", + "src": "19743:4:70", + "type": "" + } + ], + "src": "19623:388:70" + }, + { + "body": { + "nativeSrc": "20094:177:70", + "nodeType": "YulBlock", + "src": "20094:177:70", + "statements": [ + { + "body": { + "nativeSrc": "20140:16:70", + "nodeType": "YulBlock", + "src": "20140:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20149:1:70", + "nodeType": "YulLiteral", + "src": "20149:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "20152:1:70", + "nodeType": "YulLiteral", + "src": "20152:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "20142:6:70", + "nodeType": "YulIdentifier", + "src": "20142:6:70" + }, + "nativeSrc": "20142:12:70", + "nodeType": "YulFunctionCall", + "src": "20142:12:70" + }, + "nativeSrc": "20142:12:70", + "nodeType": "YulExpressionStatement", + "src": "20142:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "20115:7:70", + "nodeType": "YulIdentifier", + "src": "20115:7:70" + }, + { + "name": "headStart", + "nativeSrc": "20124:9:70", + "nodeType": "YulIdentifier", + "src": "20124:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "20111:3:70", + "nodeType": "YulIdentifier", + "src": "20111:3:70" + }, + "nativeSrc": "20111:23:70", + "nodeType": "YulFunctionCall", + "src": "20111:23:70" + }, + { + "kind": "number", + "nativeSrc": "20136:2:70", + "nodeType": "YulLiteral", + "src": "20136:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "20107:3:70", + "nodeType": "YulIdentifier", + "src": "20107:3:70" + }, + "nativeSrc": "20107:32:70", + "nodeType": "YulFunctionCall", + "src": "20107:32:70" + }, + "nativeSrc": "20104:52:70", + "nodeType": "YulIf", + "src": "20104:52:70" + }, + { + "nativeSrc": "20165:36:70", + "nodeType": "YulVariableDeclaration", + "src": "20165:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20191:9:70", + "nodeType": "YulIdentifier", + "src": "20191:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "20178:12:70", + "nodeType": "YulIdentifier", + "src": "20178:12:70" + }, + "nativeSrc": "20178:23:70", + "nodeType": "YulFunctionCall", + "src": "20178:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "20169:5:70", + "nodeType": "YulTypedName", + "src": "20169:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "20235:5:70", + "nodeType": "YulIdentifier", + "src": "20235:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "20210:24:70", + "nodeType": "YulIdentifier", + "src": "20210:24:70" + }, + "nativeSrc": "20210:31:70", + "nodeType": "YulFunctionCall", + "src": "20210:31:70" + }, + "nativeSrc": "20210:31:70", + "nodeType": "YulExpressionStatement", + "src": "20210:31:70" + }, + { + "nativeSrc": "20250:15:70", + "nodeType": "YulAssignment", + "src": "20250:15:70", + "value": { + "name": "value", + "nativeSrc": "20260:5:70", + "nodeType": "YulIdentifier", + "src": "20260:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "20250:6:70", + "nodeType": "YulIdentifier", + "src": "20250:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address_payable", + "nativeSrc": "20016:255:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "20060:9:70", + "nodeType": "YulTypedName", + "src": "20060:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "20071:7:70", + "nodeType": "YulTypedName", + "src": "20071:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "20083:6:70", + "nodeType": "YulTypedName", + "src": "20083:6:70", + "type": "" + } + ], + "src": "20016:255:70" + }, + { + "body": { + "nativeSrc": "20450:171:70", + "nodeType": "YulBlock", + "src": "20450:171:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20467:9:70", + "nodeType": "YulIdentifier", + "src": "20467:9:70" + }, + { + "kind": "number", + "nativeSrc": "20478:2:70", + "nodeType": "YulLiteral", + "src": "20478:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20460:6:70", + "nodeType": "YulIdentifier", + "src": "20460:6:70" + }, + "nativeSrc": "20460:21:70", + "nodeType": "YulFunctionCall", + "src": "20460:21:70" + }, + "nativeSrc": "20460:21:70", + "nodeType": "YulExpressionStatement", + "src": "20460:21:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20501:9:70", + "nodeType": "YulIdentifier", + "src": "20501:9:70" + }, + { + "kind": "number", + "nativeSrc": "20512:2:70", + "nodeType": "YulLiteral", + "src": "20512:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20497:3:70", + "nodeType": "YulIdentifier", + "src": "20497:3:70" + }, + "nativeSrc": "20497:18:70", + "nodeType": "YulFunctionCall", + "src": "20497:18:70" + }, + { + "kind": "number", + "nativeSrc": "20517:2:70", + "nodeType": "YulLiteral", + "src": "20517:2:70", + "type": "", + "value": "21" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20490:6:70", + "nodeType": "YulIdentifier", + "src": "20490:6:70" + }, + "nativeSrc": "20490:30:70", + "nodeType": "YulFunctionCall", + "src": "20490:30:70" + }, + "nativeSrc": "20490:30:70", + "nodeType": "YulExpressionStatement", + "src": "20490:30:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20540:9:70", + "nodeType": "YulIdentifier", + "src": "20540:9:70" + }, + { + "kind": "number", + "nativeSrc": "20551:2:70", + "nodeType": "YulLiteral", + "src": "20551:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20536:3:70", + "nodeType": "YulIdentifier", + "src": "20536:3:70" + }, + "nativeSrc": "20536:18:70", + "nodeType": "YulFunctionCall", + "src": "20536:18:70" + }, + { + "hexValue": "4549503731323a20556e696e697469616c697a6564", + "kind": "string", + "nativeSrc": "20556:23:70", + "nodeType": "YulLiteral", + "src": "20556:23:70", + "type": "", + "value": "EIP712: Uninitialized" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20529:6:70", + "nodeType": "YulIdentifier", + "src": "20529:6:70" + }, + "nativeSrc": "20529:51:70", + "nodeType": "YulFunctionCall", + "src": "20529:51:70" + }, + "nativeSrc": "20529:51:70", + "nodeType": "YulExpressionStatement", + "src": "20529:51:70" + }, + { + "nativeSrc": "20589:26:70", + "nodeType": "YulAssignment", + "src": "20589:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "20601:9:70", + "nodeType": "YulIdentifier", + "src": "20601:9:70" + }, + { + "kind": "number", + "nativeSrc": "20612:2:70", + "nodeType": "YulLiteral", + "src": "20612:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "20597:3:70", + "nodeType": "YulIdentifier", + "src": "20597:3:70" + }, + "nativeSrc": "20597:18:70", + "nodeType": "YulFunctionCall", + "src": "20597:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "20589:4:70", + "nodeType": "YulIdentifier", + "src": "20589:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_2e5045ff73280aa8e8acd8c82710f23812497f87f7f576e2220a2ddd0d45eade__to_t_string_memory_ptr__fromStack_reversed", + "nativeSrc": "20276:345:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "20427:9:70", + "nodeType": "YulTypedName", + "src": "20427:9:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "20441:4:70", + "nodeType": "YulTypedName", + "src": "20441:4:70", + "type": "" + } + ], + "src": "20276:345:70" + }, + { + "body": { + "nativeSrc": "20658:95:70", + "nodeType": "YulBlock", + "src": "20658:95:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20675:1:70", + "nodeType": "YulLiteral", + "src": "20675:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20682:3:70", + "nodeType": "YulLiteral", + "src": "20682:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "20687:10:70", + "nodeType": "YulLiteral", + "src": "20687:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "20678:3:70", + "nodeType": "YulIdentifier", + "src": "20678:3:70" + }, + "nativeSrc": "20678:20:70", + "nodeType": "YulFunctionCall", + "src": "20678:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20668:6:70", + "nodeType": "YulIdentifier", + "src": "20668:6:70" + }, + "nativeSrc": "20668:31:70", + "nodeType": "YulFunctionCall", + "src": "20668:31:70" + }, + "nativeSrc": "20668:31:70", + "nodeType": "YulExpressionStatement", + "src": "20668:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20715:1:70", + "nodeType": "YulLiteral", + "src": "20715:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "20718:4:70", + "nodeType": "YulLiteral", + "src": "20718:4:70", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "20708:6:70", + "nodeType": "YulIdentifier", + "src": "20708:6:70" + }, + "nativeSrc": "20708:15:70", + "nodeType": "YulFunctionCall", + "src": "20708:15:70" + }, + "nativeSrc": "20708:15:70", + "nodeType": "YulExpressionStatement", + "src": "20708:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "20739:1:70", + "nodeType": "YulLiteral", + "src": "20739:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "20742:4:70", + "nodeType": "YulLiteral", + "src": "20742:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "20732:6:70", + "nodeType": "YulIdentifier", + "src": "20732:6:70" + }, + "nativeSrc": "20732:15:70", + "nodeType": "YulFunctionCall", + "src": "20732:15:70" + }, + "nativeSrc": "20732:15:70", + "nodeType": "YulExpressionStatement", + "src": "20732:15:70" + } + ] + }, + "name": "panic_error_0x11", + "nativeSrc": "20626:127:70", + "nodeType": "YulFunctionDefinition", + "src": "20626:127:70" + }, + { + "body": { + "nativeSrc": "20807:79:70", + "nodeType": "YulBlock", + "src": "20807:79:70", + "statements": [ + { + "nativeSrc": "20817:17:70", + "nodeType": "YulAssignment", + "src": "20817:17:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "20829:1:70", + "nodeType": "YulIdentifier", + "src": "20829:1:70" + }, + { + "name": "y", + "nativeSrc": "20832:1:70", + "nodeType": "YulIdentifier", + "src": "20832:1:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "20825:3:70", + "nodeType": "YulIdentifier", + "src": "20825:3:70" + }, + "nativeSrc": "20825:9:70", + "nodeType": "YulFunctionCall", + "src": "20825:9:70" + }, + "variableNames": [ + { + "name": "diff", + "nativeSrc": "20817:4:70", + "nodeType": "YulIdentifier", + "src": "20817:4:70" + } + ] + }, + { + "body": { + "nativeSrc": "20858:22:70", + "nodeType": "YulBlock", + "src": "20858:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "20860:16:70", + "nodeType": "YulIdentifier", + "src": "20860:16:70" + }, + "nativeSrc": "20860:18:70", + "nodeType": "YulFunctionCall", + "src": "20860:18:70" + }, + "nativeSrc": "20860:18:70", + "nodeType": "YulExpressionStatement", + "src": "20860:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "diff", + "nativeSrc": "20849:4:70", + "nodeType": "YulIdentifier", + "src": "20849:4:70" + }, + { + "name": "x", + "nativeSrc": "20855:1:70", + "nodeType": "YulIdentifier", + "src": "20855:1:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "20846:2:70", + "nodeType": "YulIdentifier", + "src": "20846:2:70" + }, + "nativeSrc": "20846:11:70", + "nodeType": "YulFunctionCall", + "src": "20846:11:70" + }, + "nativeSrc": "20843:37:70", + "nodeType": "YulIf", + "src": "20843:37:70" + } + ] + }, + "name": "checked_sub_t_uint256", + "nativeSrc": "20758:128:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "20789:1:70", + "nodeType": "YulTypedName", + "src": "20789:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "20792:1:70", + "nodeType": "YulTypedName", + "src": "20792:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "diff", + "nativeSrc": "20798:4:70", + "nodeType": "YulTypedName", + "src": "20798:4:70", + "type": "" + } + ], + "src": "20758:128:70" + }, + { + "body": { + "nativeSrc": "21021:201:70", + "nodeType": "YulBlock", + "src": "21021:201:70", + "statements": [ + { + "body": { + "nativeSrc": "21059:16:70", + "nodeType": "YulBlock", + "src": "21059:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21068:1:70", + "nodeType": "YulLiteral", + "src": "21068:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "21071:1:70", + "nodeType": "YulLiteral", + "src": "21071:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "21061:6:70", + "nodeType": "YulIdentifier", + "src": "21061:6:70" + }, + "nativeSrc": "21061:12:70", + "nodeType": "YulFunctionCall", + "src": "21061:12:70" + }, + "nativeSrc": "21061:12:70", + "nodeType": "YulExpressionStatement", + "src": "21061:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "startIndex", + "nativeSrc": "21037:10:70", + "nodeType": "YulIdentifier", + "src": "21037:10:70" + }, + { + "name": "endIndex", + "nativeSrc": "21049:8:70", + "nodeType": "YulIdentifier", + "src": "21049:8:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "21034:2:70", + "nodeType": "YulIdentifier", + "src": "21034:2:70" + }, + "nativeSrc": "21034:24:70", + "nodeType": "YulFunctionCall", + "src": "21034:24:70" + }, + "nativeSrc": "21031:44:70", + "nodeType": "YulIf", + "src": "21031:44:70" + }, + { + "body": { + "nativeSrc": "21108:16:70", + "nodeType": "YulBlock", + "src": "21108:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21117:1:70", + "nodeType": "YulLiteral", + "src": "21117:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "21120:1:70", + "nodeType": "YulLiteral", + "src": "21120:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "21110:6:70", + "nodeType": "YulIdentifier", + "src": "21110:6:70" + }, + "nativeSrc": "21110:12:70", + "nodeType": "YulFunctionCall", + "src": "21110:12:70" + }, + "nativeSrc": "21110:12:70", + "nodeType": "YulExpressionStatement", + "src": "21110:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "endIndex", + "nativeSrc": "21090:8:70", + "nodeType": "YulIdentifier", + "src": "21090:8:70" + }, + { + "name": "length", + "nativeSrc": "21100:6:70", + "nodeType": "YulIdentifier", + "src": "21100:6:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "21087:2:70", + "nodeType": "YulIdentifier", + "src": "21087:2:70" + }, + "nativeSrc": "21087:20:70", + "nodeType": "YulFunctionCall", + "src": "21087:20:70" + }, + "nativeSrc": "21084:40:70", + "nodeType": "YulIf", + "src": "21084:40:70" + }, + { + "nativeSrc": "21133:36:70", + "nodeType": "YulAssignment", + "src": "21133:36:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "21150:6:70", + "nodeType": "YulIdentifier", + "src": "21150:6:70" + }, + { + "name": "startIndex", + "nativeSrc": "21158:10:70", + "nodeType": "YulIdentifier", + "src": "21158:10:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21146:3:70", + "nodeType": "YulIdentifier", + "src": "21146:3:70" + }, + "nativeSrc": "21146:23:70", + "nodeType": "YulFunctionCall", + "src": "21146:23:70" + }, + "variableNames": [ + { + "name": "offsetOut", + "nativeSrc": "21133:9:70", + "nodeType": "YulIdentifier", + "src": "21133:9:70" + } + ] + }, + { + "nativeSrc": "21178:38:70", + "nodeType": "YulAssignment", + "src": "21178:38:70", + "value": { + "arguments": [ + { + "name": "endIndex", + "nativeSrc": "21195:8:70", + "nodeType": "YulIdentifier", + "src": "21195:8:70" + }, + { + "name": "startIndex", + "nativeSrc": "21205:10:70", + "nodeType": "YulIdentifier", + "src": "21205:10:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "21191:3:70", + "nodeType": "YulIdentifier", + "src": "21191:3:70" + }, + "nativeSrc": "21191:25:70", + "nodeType": "YulFunctionCall", + "src": "21191:25:70" + }, + "variableNames": [ + { + "name": "lengthOut", + "nativeSrc": "21178:9:70", + "nodeType": "YulIdentifier", + "src": "21178:9:70" + } + ] + } + ] + }, + "name": "calldata_array_index_range_access_t_bytes_calldata_ptr", + "nativeSrc": "20891:331:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "20955:6:70", + "nodeType": "YulTypedName", + "src": "20955:6:70", + "type": "" + }, + { + "name": "length", + "nativeSrc": "20963:6:70", + "nodeType": "YulTypedName", + "src": "20963:6:70", + "type": "" + }, + { + "name": "startIndex", + "nativeSrc": "20971:10:70", + "nodeType": "YulTypedName", + "src": "20971:10:70", + "type": "" + }, + { + "name": "endIndex", + "nativeSrc": "20983:8:70", + "nodeType": "YulTypedName", + "src": "20983:8:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "offsetOut", + "nativeSrc": "20996:9:70", + "nodeType": "YulTypedName", + "src": "20996:9:70", + "type": "" + }, + { + "name": "lengthOut", + "nativeSrc": "21007:9:70", + "nodeType": "YulTypedName", + "src": "21007:9:70", + "type": "" + } + ], + "src": "20891:331:70" + }, + { + "body": { + "nativeSrc": "21259:95:70", + "nodeType": "YulBlock", + "src": "21259:95:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21276:1:70", + "nodeType": "YulLiteral", + "src": "21276:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21283:3:70", + "nodeType": "YulLiteral", + "src": "21283:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "21288:10:70", + "nodeType": "YulLiteral", + "src": "21288:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "21279:3:70", + "nodeType": "YulIdentifier", + "src": "21279:3:70" + }, + "nativeSrc": "21279:20:70", + "nodeType": "YulFunctionCall", + "src": "21279:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21269:6:70", + "nodeType": "YulIdentifier", + "src": "21269:6:70" + }, + "nativeSrc": "21269:31:70", + "nodeType": "YulFunctionCall", + "src": "21269:31:70" + }, + "nativeSrc": "21269:31:70", + "nodeType": "YulExpressionStatement", + "src": "21269:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21316:1:70", + "nodeType": "YulLiteral", + "src": "21316:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "21319:4:70", + "nodeType": "YulLiteral", + "src": "21319:4:70", + "type": "", + "value": "0x32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "21309:6:70", + "nodeType": "YulIdentifier", + "src": "21309:6:70" + }, + "nativeSrc": "21309:15:70", + "nodeType": "YulFunctionCall", + "src": "21309:15:70" + }, + "nativeSrc": "21309:15:70", + "nodeType": "YulExpressionStatement", + "src": "21309:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21340:1:70", + "nodeType": "YulLiteral", + "src": "21340:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "21343:4:70", + "nodeType": "YulLiteral", + "src": "21343:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "21333:6:70", + "nodeType": "YulIdentifier", + "src": "21333:6:70" + }, + "nativeSrc": "21333:15:70", + "nodeType": "YulFunctionCall", + "src": "21333:15:70" + }, + "nativeSrc": "21333:15:70", + "nodeType": "YulExpressionStatement", + "src": "21333:15:70" + } + ] + }, + "name": "panic_error_0x32", + "nativeSrc": "21227:127:70", + "nodeType": "YulFunctionDefinition", + "src": "21227:127:70" + }, + { + "body": { + "nativeSrc": "21453:427:70", + "nodeType": "YulBlock", + "src": "21453:427:70", + "statements": [ + { + "nativeSrc": "21463:51:70", + "nodeType": "YulVariableDeclaration", + "src": "21463:51:70", + "value": { + "arguments": [ + { + "name": "ptr_to_tail", + "nativeSrc": "21502:11:70", + "nodeType": "YulIdentifier", + "src": "21502:11:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "21489:12:70", + "nodeType": "YulIdentifier", + "src": "21489:12:70" + }, + "nativeSrc": "21489:25:70", + "nodeType": "YulFunctionCall", + "src": "21489:25:70" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nativeSrc": "21467:18:70", + "nodeType": "YulTypedName", + "src": "21467:18:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "21603:16:70", + "nodeType": "YulBlock", + "src": "21603:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21612:1:70", + "nodeType": "YulLiteral", + "src": "21612:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "21615:1:70", + "nodeType": "YulLiteral", + "src": "21615:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "21605:6:70", + "nodeType": "YulIdentifier", + "src": "21605:6:70" + }, + "nativeSrc": "21605:12:70", + "nodeType": "YulFunctionCall", + "src": "21605:12:70" + }, + "nativeSrc": "21605:12:70", + "nodeType": "YulExpressionStatement", + "src": "21605:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nativeSrc": "21537:18:70", + "nodeType": "YulIdentifier", + "src": "21537:18:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nativeSrc": "21565:12:70", + "nodeType": "YulIdentifier", + "src": "21565:12:70" + }, + "nativeSrc": "21565:14:70", + "nodeType": "YulFunctionCall", + "src": "21565:14:70" + }, + { + "name": "base_ref", + "nativeSrc": "21581:8:70", + "nodeType": "YulIdentifier", + "src": "21581:8:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "21561:3:70", + "nodeType": "YulIdentifier", + "src": "21561:3:70" + }, + "nativeSrc": "21561:29:70", + "nodeType": "YulFunctionCall", + "src": "21561:29:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21596:2:70", + "nodeType": "YulLiteral", + "src": "21596:2:70", + "type": "", + "value": "30" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "21592:3:70", + "nodeType": "YulIdentifier", + "src": "21592:3:70" + }, + "nativeSrc": "21592:7:70", + "nodeType": "YulFunctionCall", + "src": "21592:7:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21557:3:70", + "nodeType": "YulIdentifier", + "src": "21557:3:70" + }, + "nativeSrc": "21557:43:70", + "nodeType": "YulFunctionCall", + "src": "21557:43:70" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "21533:3:70", + "nodeType": "YulIdentifier", + "src": "21533:3:70" + }, + "nativeSrc": "21533:68:70", + "nodeType": "YulFunctionCall", + "src": "21533:68:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "21526:6:70", + "nodeType": "YulIdentifier", + "src": "21526:6:70" + }, + "nativeSrc": "21526:76:70", + "nodeType": "YulFunctionCall", + "src": "21526:76:70" + }, + "nativeSrc": "21523:96:70", + "nodeType": "YulIf", + "src": "21523:96:70" + }, + { + "nativeSrc": "21628:47:70", + "nodeType": "YulVariableDeclaration", + "src": "21628:47:70", + "value": { + "arguments": [ + { + "name": "base_ref", + "nativeSrc": "21646:8:70", + "nodeType": "YulIdentifier", + "src": "21646:8:70" + }, + { + "name": "rel_offset_of_tail", + "nativeSrc": "21656:18:70", + "nodeType": "YulIdentifier", + "src": "21656:18:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21642:3:70", + "nodeType": "YulIdentifier", + "src": "21642:3:70" + }, + "nativeSrc": "21642:33:70", + "nodeType": "YulFunctionCall", + "src": "21642:33:70" + }, + "variables": [ + { + "name": "addr_1", + "nativeSrc": "21632:6:70", + "nodeType": "YulTypedName", + "src": "21632:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "21684:30:70", + "nodeType": "YulAssignment", + "src": "21684:30:70", + "value": { + "arguments": [ + { + "name": "addr_1", + "nativeSrc": "21707:6:70", + "nodeType": "YulIdentifier", + "src": "21707:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "21694:12:70", + "nodeType": "YulIdentifier", + "src": "21694:12:70" + }, + "nativeSrc": "21694:20:70", + "nodeType": "YulFunctionCall", + "src": "21694:20:70" + }, + "variableNames": [ + { + "name": "length", + "nativeSrc": "21684:6:70", + "nodeType": "YulIdentifier", + "src": "21684:6:70" + } + ] + }, + { + "body": { + "nativeSrc": "21757:16:70", + "nodeType": "YulBlock", + "src": "21757:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21766:1:70", + "nodeType": "YulLiteral", + "src": "21766:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "21769:1:70", + "nodeType": "YulLiteral", + "src": "21769:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "21759:6:70", + "nodeType": "YulIdentifier", + "src": "21759:6:70" + }, + "nativeSrc": "21759:12:70", + "nodeType": "YulFunctionCall", + "src": "21759:12:70" + }, + "nativeSrc": "21759:12:70", + "nodeType": "YulExpressionStatement", + "src": "21759:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nativeSrc": "21729:6:70", + "nodeType": "YulIdentifier", + "src": "21729:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21745:2:70", + "nodeType": "YulLiteral", + "src": "21745:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "21749:1:70", + "nodeType": "YulLiteral", + "src": "21749:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "21741:3:70", + "nodeType": "YulIdentifier", + "src": "21741:3:70" + }, + "nativeSrc": "21741:10:70", + "nodeType": "YulFunctionCall", + "src": "21741:10:70" + }, + { + "kind": "number", + "nativeSrc": "21753:1:70", + "nodeType": "YulLiteral", + "src": "21753:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "21737:3:70", + "nodeType": "YulIdentifier", + "src": "21737:3:70" + }, + "nativeSrc": "21737:18:70", + "nodeType": "YulFunctionCall", + "src": "21737:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "21726:2:70", + "nodeType": "YulIdentifier", + "src": "21726:2:70" + }, + "nativeSrc": "21726:30:70", + "nodeType": "YulFunctionCall", + "src": "21726:30:70" + }, + "nativeSrc": "21723:50:70", + "nodeType": "YulIf", + "src": "21723:50:70" + }, + { + "nativeSrc": "21782:25:70", + "nodeType": "YulAssignment", + "src": "21782:25:70", + "value": { + "arguments": [ + { + "name": "addr_1", + "nativeSrc": "21794:6:70", + "nodeType": "YulIdentifier", + "src": "21794:6:70" + }, + { + "kind": "number", + "nativeSrc": "21802:4:70", + "nodeType": "YulLiteral", + "src": "21802:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "21790:3:70", + "nodeType": "YulIdentifier", + "src": "21790:3:70" + }, + "nativeSrc": "21790:17:70", + "nodeType": "YulFunctionCall", + "src": "21790:17:70" + }, + "variableNames": [ + { + "name": "addr", + "nativeSrc": "21782:4:70", + "nodeType": "YulIdentifier", + "src": "21782:4:70" + } + ] + }, + { + "body": { + "nativeSrc": "21858:16:70", + "nodeType": "YulBlock", + "src": "21858:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "21867:1:70", + "nodeType": "YulLiteral", + "src": "21867:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "21870:1:70", + "nodeType": "YulLiteral", + "src": "21870:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "21860:6:70", + "nodeType": "YulIdentifier", + "src": "21860:6:70" + }, + "nativeSrc": "21860:12:70", + "nodeType": "YulFunctionCall", + "src": "21860:12:70" + }, + "nativeSrc": "21860:12:70", + "nodeType": "YulExpressionStatement", + "src": "21860:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "addr", + "nativeSrc": "21823:4:70", + "nodeType": "YulIdentifier", + "src": "21823:4:70" + }, + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nativeSrc": "21833:12:70", + "nodeType": "YulIdentifier", + "src": "21833:12:70" + }, + "nativeSrc": "21833:14:70", + "nodeType": "YulFunctionCall", + "src": "21833:14:70" + }, + { + "name": "length", + "nativeSrc": "21849:6:70", + "nodeType": "YulIdentifier", + "src": "21849:6:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "21829:3:70", + "nodeType": "YulIdentifier", + "src": "21829:3:70" + }, + "nativeSrc": "21829:27:70", + "nodeType": "YulFunctionCall", + "src": "21829:27:70" + } + ], + "functionName": { + "name": "sgt", + "nativeSrc": "21819:3:70", + "nodeType": "YulIdentifier", + "src": "21819:3:70" + }, + "nativeSrc": "21819:38:70", + "nodeType": "YulFunctionCall", + "src": "21819:38:70" + }, + "nativeSrc": "21816:58:70", + "nodeType": "YulIf", + "src": "21816:58:70" + } + ] + }, + "name": "access_calldata_tail_t_bytes_calldata_ptr", + "nativeSrc": "21359:521:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "base_ref", + "nativeSrc": "21410:8:70", + "nodeType": "YulTypedName", + "src": "21410:8:70", + "type": "" + }, + { + "name": "ptr_to_tail", + "nativeSrc": "21420:11:70", + "nodeType": "YulTypedName", + "src": "21420:11:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "addr", + "nativeSrc": "21436:4:70", + "nodeType": "YulTypedName", + "src": "21436:4:70", + "type": "" + }, + { + "name": "length", + "nativeSrc": "21442:6:70", + "nodeType": "YulTypedName", + "src": "21442:6:70", + "type": "" + } + ], + "src": "21359:521:70" + }, + { + "body": { + "nativeSrc": "22078:247:70", + "nodeType": "YulBlock", + "src": "22078:247:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "22101:3:70", + "nodeType": "YulIdentifier", + "src": "22101:3:70" + }, + { + "name": "value0", + "nativeSrc": "22106:6:70", + "nodeType": "YulIdentifier", + "src": "22106:6:70" + }, + { + "name": "value1", + "nativeSrc": "22114:6:70", + "nodeType": "YulIdentifier", + "src": "22114:6:70" + } + ], + "functionName": { + "name": "calldatacopy", + "nativeSrc": "22088:12:70", + "nodeType": "YulIdentifier", + "src": "22088:12:70" + }, + "nativeSrc": "22088:33:70", + "nodeType": "YulFunctionCall", + "src": "22088:33:70" + }, + "nativeSrc": "22088:33:70", + "nodeType": "YulExpressionStatement", + "src": "22088:33:70" + }, + { + "nativeSrc": "22130:26:70", + "nodeType": "YulVariableDeclaration", + "src": "22130:26:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "22144:3:70", + "nodeType": "YulIdentifier", + "src": "22144:3:70" + }, + { + "name": "value1", + "nativeSrc": "22149:6:70", + "nodeType": "YulIdentifier", + "src": "22149:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22140:3:70", + "nodeType": "YulIdentifier", + "src": "22140:3:70" + }, + "nativeSrc": "22140:16:70", + "nodeType": "YulFunctionCall", + "src": "22140:16:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "22134:2:70", + "nodeType": "YulTypedName", + "src": "22134:2:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "22172:2:70", + "nodeType": "YulIdentifier", + "src": "22172:2:70" + }, + { + "kind": "number", + "nativeSrc": "22176:1:70", + "nodeType": "YulLiteral", + "src": "22176:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22165:6:70", + "nodeType": "YulIdentifier", + "src": "22165:6:70" + }, + "nativeSrc": "22165:13:70", + "nodeType": "YulFunctionCall", + "src": "22165:13:70" + }, + "nativeSrc": "22165:13:70", + "nodeType": "YulExpressionStatement", + "src": "22165:13:70" + }, + { + "nativeSrc": "22187:27:70", + "nodeType": "YulVariableDeclaration", + "src": "22187:27:70", + "value": { + "arguments": [ + { + "name": "value2", + "nativeSrc": "22207:6:70", + "nodeType": "YulIdentifier", + "src": "22207:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "22201:5:70", + "nodeType": "YulIdentifier", + "src": "22201:5:70" + }, + "nativeSrc": "22201:13:70", + "nodeType": "YulFunctionCall", + "src": "22201:13:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "22191:6:70", + "nodeType": "YulTypedName", + "src": "22191:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "22262:6:70", + "nodeType": "YulIdentifier", + "src": "22262:6:70" + }, + { + "kind": "number", + "nativeSrc": "22270:4:70", + "nodeType": "YulLiteral", + "src": "22270:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22258:3:70", + "nodeType": "YulIdentifier", + "src": "22258:3:70" + }, + "nativeSrc": "22258:17:70", + "nodeType": "YulFunctionCall", + "src": "22258:17:70" + }, + { + "name": "_1", + "nativeSrc": "22277:2:70", + "nodeType": "YulIdentifier", + "src": "22277:2:70" + }, + { + "name": "length", + "nativeSrc": "22281:6:70", + "nodeType": "YulIdentifier", + "src": "22281:6:70" + } + ], + "functionName": { + "name": "copy_memory_to_memory_with_cleanup", + "nativeSrc": "22223:34:70", + "nodeType": "YulIdentifier", + "src": "22223:34:70" + }, + "nativeSrc": "22223:65:70", + "nodeType": "YulFunctionCall", + "src": "22223:65:70" + }, + "nativeSrc": "22223:65:70", + "nodeType": "YulExpressionStatement", + "src": "22223:65:70" + }, + { + "nativeSrc": "22297:22:70", + "nodeType": "YulAssignment", + "src": "22297:22:70", + "value": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "22308:2:70", + "nodeType": "YulIdentifier", + "src": "22308:2:70" + }, + { + "name": "length", + "nativeSrc": "22312:6:70", + "nodeType": "YulIdentifier", + "src": "22312:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22304:3:70", + "nodeType": "YulIdentifier", + "src": "22304:3:70" + }, + "nativeSrc": "22304:15:70", + "nodeType": "YulFunctionCall", + "src": "22304:15:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "22297:3:70", + "nodeType": "YulIdentifier", + "src": "22297:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_bytes_calldata_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "21885:440:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "22038:3:70", + "nodeType": "YulTypedName", + "src": "22038:3:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "22043:6:70", + "nodeType": "YulTypedName", + "src": "22043:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "22051:6:70", + "nodeType": "YulTypedName", + "src": "22051:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "22059:6:70", + "nodeType": "YulTypedName", + "src": "22059:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "22070:3:70", + "nodeType": "YulTypedName", + "src": "22070:3:70", + "type": "" + } + ], + "src": "21885:440:70" + }, + { + "body": { + "nativeSrc": "22362:95:70", + "nodeType": "YulBlock", + "src": "22362:95:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22379:1:70", + "nodeType": "YulLiteral", + "src": "22379:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22386:3:70", + "nodeType": "YulLiteral", + "src": "22386:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "22391:10:70", + "nodeType": "YulLiteral", + "src": "22391:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "22382:3:70", + "nodeType": "YulIdentifier", + "src": "22382:3:70" + }, + "nativeSrc": "22382:20:70", + "nodeType": "YulFunctionCall", + "src": "22382:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22372:6:70", + "nodeType": "YulIdentifier", + "src": "22372:6:70" + }, + "nativeSrc": "22372:31:70", + "nodeType": "YulFunctionCall", + "src": "22372:31:70" + }, + "nativeSrc": "22372:31:70", + "nodeType": "YulExpressionStatement", + "src": "22372:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22419:1:70", + "nodeType": "YulLiteral", + "src": "22419:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "22422:4:70", + "nodeType": "YulLiteral", + "src": "22422:4:70", + "type": "", + "value": "0x21" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22412:6:70", + "nodeType": "YulIdentifier", + "src": "22412:6:70" + }, + "nativeSrc": "22412:15:70", + "nodeType": "YulFunctionCall", + "src": "22412:15:70" + }, + "nativeSrc": "22412:15:70", + "nodeType": "YulExpressionStatement", + "src": "22412:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22443:1:70", + "nodeType": "YulLiteral", + "src": "22443:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "22446:4:70", + "nodeType": "YulLiteral", + "src": "22446:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "22436:6:70", + "nodeType": "YulIdentifier", + "src": "22436:6:70" + }, + "nativeSrc": "22436:15:70", + "nodeType": "YulFunctionCall", + "src": "22436:15:70" + }, + "nativeSrc": "22436:15:70", + "nodeType": "YulExpressionStatement", + "src": "22436:15:70" + } + ] + }, + "name": "panic_error_0x21", + "nativeSrc": "22330:127:70", + "nodeType": "YulFunctionDefinition", + "src": "22330:127:70" + }, + { + "body": { + "nativeSrc": "22516:186:70", + "nodeType": "YulBlock", + "src": "22516:186:70", + "statements": [ + { + "body": { + "nativeSrc": "22558:111:70", + "nodeType": "YulBlock", + "src": "22558:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22579:1:70", + "nodeType": "YulLiteral", + "src": "22579:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22586:3:70", + "nodeType": "YulLiteral", + "src": "22586:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "22591:10:70", + "nodeType": "YulLiteral", + "src": "22591:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "22582:3:70", + "nodeType": "YulIdentifier", + "src": "22582:3:70" + }, + "nativeSrc": "22582:20:70", + "nodeType": "YulFunctionCall", + "src": "22582:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22572:6:70", + "nodeType": "YulIdentifier", + "src": "22572:6:70" + }, + "nativeSrc": "22572:31:70", + "nodeType": "YulFunctionCall", + "src": "22572:31:70" + }, + "nativeSrc": "22572:31:70", + "nodeType": "YulExpressionStatement", + "src": "22572:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22623:1:70", + "nodeType": "YulLiteral", + "src": "22623:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "22626:4:70", + "nodeType": "YulLiteral", + "src": "22626:4:70", + "type": "", + "value": "0x21" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22616:6:70", + "nodeType": "YulIdentifier", + "src": "22616:6:70" + }, + "nativeSrc": "22616:15:70", + "nodeType": "YulFunctionCall", + "src": "22616:15:70" + }, + "nativeSrc": "22616:15:70", + "nodeType": "YulExpressionStatement", + "src": "22616:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "22651:1:70", + "nodeType": "YulLiteral", + "src": "22651:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "22654:4:70", + "nodeType": "YulLiteral", + "src": "22654:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "22644:6:70", + "nodeType": "YulIdentifier", + "src": "22644:6:70" + }, + "nativeSrc": "22644:15:70", + "nodeType": "YulFunctionCall", + "src": "22644:15:70" + }, + "nativeSrc": "22644:15:70", + "nodeType": "YulExpressionStatement", + "src": "22644:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "22539:5:70", + "nodeType": "YulIdentifier", + "src": "22539:5:70" + }, + { + "kind": "number", + "nativeSrc": "22546:1:70", + "nodeType": "YulLiteral", + "src": "22546:1:70", + "type": "", + "value": "3" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "22536:2:70", + "nodeType": "YulIdentifier", + "src": "22536:2:70" + }, + "nativeSrc": "22536:12:70", + "nodeType": "YulFunctionCall", + "src": "22536:12:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "22529:6:70", + "nodeType": "YulIdentifier", + "src": "22529:6:70" + }, + "nativeSrc": "22529:20:70", + "nodeType": "YulFunctionCall", + "src": "22529:20:70" + }, + "nativeSrc": "22526:143:70", + "nodeType": "YulIf", + "src": "22526:143:70" + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "22685:3:70", + "nodeType": "YulIdentifier", + "src": "22685:3:70" + }, + { + "name": "value", + "nativeSrc": "22690:5:70", + "nodeType": "YulIdentifier", + "src": "22690:5:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "22678:6:70", + "nodeType": "YulIdentifier", + "src": "22678:6:70" + }, + "nativeSrc": "22678:18:70", + "nodeType": "YulFunctionCall", + "src": "22678:18:70" + }, + "nativeSrc": "22678:18:70", + "nodeType": "YulExpressionStatement", + "src": "22678:18:70" + } + ] + }, + "name": "abi_encode_enum_PaymentTypes", + "nativeSrc": "22462:240:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "22500:5:70", + "nodeType": "YulTypedName", + "src": "22500:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "22507:3:70", + "nodeType": "YulTypedName", + "src": "22507:3:70", + "type": "" + } + ], + "src": "22462:240:70" + }, + { + "body": { + "nativeSrc": "22823:98:70", + "nodeType": "YulBlock", + "src": "22823:98:70", + "statements": [ + { + "nativeSrc": "22833:26:70", + "nodeType": "YulAssignment", + "src": "22833:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "22845:9:70", + "nodeType": "YulIdentifier", + "src": "22845:9:70" + }, + { + "kind": "number", + "nativeSrc": "22856:2:70", + "nodeType": "YulLiteral", + "src": "22856:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "22841:3:70", + "nodeType": "YulIdentifier", + "src": "22841:3:70" + }, + "nativeSrc": "22841:18:70", + "nodeType": "YulFunctionCall", + "src": "22841:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "22833:4:70", + "nodeType": "YulIdentifier", + "src": "22833:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "22897:6:70", + "nodeType": "YulIdentifier", + "src": "22897:6:70" + }, + { + "name": "headStart", + "nativeSrc": "22905:9:70", + "nodeType": "YulIdentifier", + "src": "22905:9:70" + } + ], + "functionName": { + "name": "abi_encode_enum_PaymentTypes", + "nativeSrc": "22868:28:70", + "nodeType": "YulIdentifier", + "src": "22868:28:70" + }, + "nativeSrc": "22868:47:70", + "nodeType": "YulFunctionCall", + "src": "22868:47:70" + }, + "nativeSrc": "22868:47:70", + "nodeType": "YulExpressionStatement", + "src": "22868:47:70" + } + ] + }, + "name": "abi_encode_tuple_t_enum$_PaymentTypes_$2433__to_t_uint8__fromStack_reversed", + "nativeSrc": "22707:214:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "22792:9:70", + "nodeType": "YulTypedName", + "src": "22792:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "22803:6:70", + "nodeType": "YulTypedName", + "src": "22803:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "22814:4:70", + "nodeType": "YulTypedName", + "src": "22814:4:70", + "type": "" + } + ], + "src": "22707:214:70" + }, + { + "body": { + "nativeSrc": "23034:101:70", + "nodeType": "YulBlock", + "src": "23034:101:70", + "statements": [ + { + "nativeSrc": "23044:26:70", + "nodeType": "YulAssignment", + "src": "23044:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23056:9:70", + "nodeType": "YulIdentifier", + "src": "23056:9:70" + }, + { + "kind": "number", + "nativeSrc": "23067:2:70", + "nodeType": "YulLiteral", + "src": "23067:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23052:3:70", + "nodeType": "YulIdentifier", + "src": "23052:3:70" + }, + "nativeSrc": "23052:18:70", + "nodeType": "YulFunctionCall", + "src": "23052:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "23044:4:70", + "nodeType": "YulIdentifier", + "src": "23044:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23086:9:70", + "nodeType": "YulIdentifier", + "src": "23086:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "23101:6:70", + "nodeType": "YulIdentifier", + "src": "23101:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "23117:2:70", + "nodeType": "YulLiteral", + "src": "23117:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "23121:1:70", + "nodeType": "YulLiteral", + "src": "23121:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "23113:3:70", + "nodeType": "YulIdentifier", + "src": "23113:3:70" + }, + "nativeSrc": "23113:10:70", + "nodeType": "YulFunctionCall", + "src": "23113:10:70" + }, + { + "kind": "number", + "nativeSrc": "23125:1:70", + "nodeType": "YulLiteral", + "src": "23125:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "23109:3:70", + "nodeType": "YulIdentifier", + "src": "23109:3:70" + }, + "nativeSrc": "23109:18:70", + "nodeType": "YulFunctionCall", + "src": "23109:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "23097:3:70", + "nodeType": "YulIdentifier", + "src": "23097:3:70" + }, + "nativeSrc": "23097:31:70", + "nodeType": "YulFunctionCall", + "src": "23097:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23079:6:70", + "nodeType": "YulIdentifier", + "src": "23079:6:70" + }, + "nativeSrc": "23079:50:70", + "nodeType": "YulFunctionCall", + "src": "23079:50:70" + }, + "nativeSrc": "23079:50:70", + "nodeType": "YulExpressionStatement", + "src": "23079:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_rational_1_by_1__to_t_uint64__fromStack_reversed", + "nativeSrc": "22926:209:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "23003:9:70", + "nodeType": "YulTypedName", + "src": "23003:9:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "23014:6:70", + "nodeType": "YulTypedName", + "src": "23014:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "23025:4:70", + "nodeType": "YulTypedName", + "src": "23025:4:70", + "type": "" + } + ], + "src": "22926:209:70" + }, + { + "body": { + "nativeSrc": "23227:259:70", + "nodeType": "YulBlock", + "src": "23227:259:70", + "statements": [ + { + "body": { + "nativeSrc": "23273:16:70", + "nodeType": "YulBlock", + "src": "23273:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "23282:1:70", + "nodeType": "YulLiteral", + "src": "23282:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "23285:1:70", + "nodeType": "YulLiteral", + "src": "23285:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "23275:6:70", + "nodeType": "YulIdentifier", + "src": "23275:6:70" + }, + "nativeSrc": "23275:12:70", + "nodeType": "YulFunctionCall", + "src": "23275:12:70" + }, + "nativeSrc": "23275:12:70", + "nodeType": "YulExpressionStatement", + "src": "23275:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "23248:7:70", + "nodeType": "YulIdentifier", + "src": "23248:7:70" + }, + { + "name": "headStart", + "nativeSrc": "23257:9:70", + "nodeType": "YulIdentifier", + "src": "23257:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "23244:3:70", + "nodeType": "YulIdentifier", + "src": "23244:3:70" + }, + "nativeSrc": "23244:23:70", + "nodeType": "YulFunctionCall", + "src": "23244:23:70" + }, + { + "kind": "number", + "nativeSrc": "23269:2:70", + "nodeType": "YulLiteral", + "src": "23269:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "23240:3:70", + "nodeType": "YulIdentifier", + "src": "23240:3:70" + }, + "nativeSrc": "23240:32:70", + "nodeType": "YulFunctionCall", + "src": "23240:32:70" + }, + "nativeSrc": "23237:52:70", + "nodeType": "YulIf", + "src": "23237:52:70" + }, + { + "nativeSrc": "23298:14:70", + "nodeType": "YulVariableDeclaration", + "src": "23298:14:70", + "value": { + "kind": "number", + "nativeSrc": "23311:1:70", + "nodeType": "YulLiteral", + "src": "23311:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "23302:5:70", + "nodeType": "YulTypedName", + "src": "23302:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23321:32:70", + "nodeType": "YulAssignment", + "src": "23321:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23343:9:70", + "nodeType": "YulIdentifier", + "src": "23343:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "23330:12:70", + "nodeType": "YulIdentifier", + "src": "23330:12:70" + }, + "nativeSrc": "23330:23:70", + "nodeType": "YulFunctionCall", + "src": "23330:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "23321:5:70", + "nodeType": "YulIdentifier", + "src": "23321:5:70" + } + ] + }, + { + "nativeSrc": "23362:15:70", + "nodeType": "YulAssignment", + "src": "23362:15:70", + "value": { + "name": "value", + "nativeSrc": "23372:5:70", + "nodeType": "YulIdentifier", + "src": "23372:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "23362:6:70", + "nodeType": "YulIdentifier", + "src": "23362:6:70" + } + ] + }, + { + "nativeSrc": "23386:16:70", + "nodeType": "YulVariableDeclaration", + "src": "23386:16:70", + "value": { + "kind": "number", + "nativeSrc": "23401:1:70", + "nodeType": "YulLiteral", + "src": "23401:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "23390:7:70", + "nodeType": "YulTypedName", + "src": "23390:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "23411:43:70", + "nodeType": "YulAssignment", + "src": "23411:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23439:9:70", + "nodeType": "YulIdentifier", + "src": "23439:9:70" + }, + { + "kind": "number", + "nativeSrc": "23450:2:70", + "nodeType": "YulLiteral", + "src": "23450:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23435:3:70", + "nodeType": "YulIdentifier", + "src": "23435:3:70" + }, + "nativeSrc": "23435:18:70", + "nodeType": "YulFunctionCall", + "src": "23435:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "23422:12:70", + "nodeType": "YulIdentifier", + "src": "23422:12:70" + }, + "nativeSrc": "23422:32:70", + "nodeType": "YulFunctionCall", + "src": "23422:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "23411:7:70", + "nodeType": "YulIdentifier", + "src": "23411:7:70" + } + ] + }, + { + "nativeSrc": "23463:17:70", + "nodeType": "YulAssignment", + "src": "23463:17:70", + "value": { + "name": "value_1", + "nativeSrc": "23473:7:70", + "nodeType": "YulIdentifier", + "src": "23473:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "23463:6:70", + "nodeType": "YulIdentifier", + "src": "23463:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256", + "nativeSrc": "23140:346:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "23185:9:70", + "nodeType": "YulTypedName", + "src": "23185:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "23196:7:70", + "nodeType": "YulTypedName", + "src": "23196:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "23208:6:70", + "nodeType": "YulTypedName", + "src": "23208:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "23216:6:70", + "nodeType": "YulTypedName", + "src": "23216:6:70", + "type": "" + } + ], + "src": "23140:346:70" + }, + { + "body": { + "nativeSrc": "23676:258:70", + "nodeType": "YulBlock", + "src": "23676:258:70", + "statements": [ + { + "nativeSrc": "23686:27:70", + "nodeType": "YulAssignment", + "src": "23686:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23698:9:70", + "nodeType": "YulIdentifier", + "src": "23698:9:70" + }, + { + "kind": "number", + "nativeSrc": "23709:3:70", + "nodeType": "YulLiteral", + "src": "23709:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23694:3:70", + "nodeType": "YulIdentifier", + "src": "23694:3:70" + }, + "nativeSrc": "23694:19:70", + "nodeType": "YulFunctionCall", + "src": "23694:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "23686:4:70", + "nodeType": "YulIdentifier", + "src": "23686:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23729:9:70", + "nodeType": "YulIdentifier", + "src": "23729:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "23744:6:70", + "nodeType": "YulIdentifier", + "src": "23744:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "23760:3:70", + "nodeType": "YulLiteral", + "src": "23760:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "23765:1:70", + "nodeType": "YulLiteral", + "src": "23765:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "23756:3:70", + "nodeType": "YulIdentifier", + "src": "23756:3:70" + }, + "nativeSrc": "23756:11:70", + "nodeType": "YulFunctionCall", + "src": "23756:11:70" + }, + { + "kind": "number", + "nativeSrc": "23769:1:70", + "nodeType": "YulLiteral", + "src": "23769:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "23752:3:70", + "nodeType": "YulIdentifier", + "src": "23752:3:70" + }, + "nativeSrc": "23752:19:70", + "nodeType": "YulFunctionCall", + "src": "23752:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "23740:3:70", + "nodeType": "YulIdentifier", + "src": "23740:3:70" + }, + "nativeSrc": "23740:32:70", + "nodeType": "YulFunctionCall", + "src": "23740:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23722:6:70", + "nodeType": "YulIdentifier", + "src": "23722:6:70" + }, + "nativeSrc": "23722:51:70", + "nodeType": "YulFunctionCall", + "src": "23722:51:70" + }, + "nativeSrc": "23722:51:70", + "nodeType": "YulExpressionStatement", + "src": "23722:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23793:9:70", + "nodeType": "YulIdentifier", + "src": "23793:9:70" + }, + { + "kind": "number", + "nativeSrc": "23804:2:70", + "nodeType": "YulLiteral", + "src": "23804:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23789:3:70", + "nodeType": "YulIdentifier", + "src": "23789:3:70" + }, + "nativeSrc": "23789:18:70", + "nodeType": "YulFunctionCall", + "src": "23789:18:70" + }, + { + "name": "value1", + "nativeSrc": "23809:6:70", + "nodeType": "YulIdentifier", + "src": "23809:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23782:6:70", + "nodeType": "YulIdentifier", + "src": "23782:6:70" + }, + "nativeSrc": "23782:34:70", + "nodeType": "YulFunctionCall", + "src": "23782:34:70" + }, + "nativeSrc": "23782:34:70", + "nodeType": "YulExpressionStatement", + "src": "23782:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23836:9:70", + "nodeType": "YulIdentifier", + "src": "23836:9:70" + }, + { + "kind": "number", + "nativeSrc": "23847:2:70", + "nodeType": "YulLiteral", + "src": "23847:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23832:3:70", + "nodeType": "YulIdentifier", + "src": "23832:3:70" + }, + "nativeSrc": "23832:18:70", + "nodeType": "YulFunctionCall", + "src": "23832:18:70" + }, + { + "name": "value2", + "nativeSrc": "23852:6:70", + "nodeType": "YulIdentifier", + "src": "23852:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23825:6:70", + "nodeType": "YulIdentifier", + "src": "23825:6:70" + }, + "nativeSrc": "23825:34:70", + "nodeType": "YulFunctionCall", + "src": "23825:34:70" + }, + "nativeSrc": "23825:34:70", + "nodeType": "YulExpressionStatement", + "src": "23825:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "23879:9:70", + "nodeType": "YulIdentifier", + "src": "23879:9:70" + }, + { + "kind": "number", + "nativeSrc": "23890:2:70", + "nodeType": "YulLiteral", + "src": "23890:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "23875:3:70", + "nodeType": "YulIdentifier", + "src": "23875:3:70" + }, + "nativeSrc": "23875:18:70", + "nodeType": "YulFunctionCall", + "src": "23875:18:70" + }, + { + "arguments": [ + { + "name": "value3", + "nativeSrc": "23899:6:70", + "nodeType": "YulIdentifier", + "src": "23899:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "23915:3:70", + "nodeType": "YulLiteral", + "src": "23915:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "23920:1:70", + "nodeType": "YulLiteral", + "src": "23920:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "23911:3:70", + "nodeType": "YulIdentifier", + "src": "23911:3:70" + }, + "nativeSrc": "23911:11:70", + "nodeType": "YulFunctionCall", + "src": "23911:11:70" + }, + { + "kind": "number", + "nativeSrc": "23924:1:70", + "nodeType": "YulLiteral", + "src": "23924:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "23907:3:70", + "nodeType": "YulIdentifier", + "src": "23907:3:70" + }, + "nativeSrc": "23907:19:70", + "nodeType": "YulFunctionCall", + "src": "23907:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "23895:3:70", + "nodeType": "YulIdentifier", + "src": "23895:3:70" + }, + "nativeSrc": "23895:32:70", + "nodeType": "YulFunctionCall", + "src": "23895:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "23868:6:70", + "nodeType": "YulIdentifier", + "src": "23868:6:70" + }, + "nativeSrc": "23868:60:70", + "nodeType": "YulFunctionCall", + "src": "23868:60:70" + }, + "nativeSrc": "23868:60:70", + "nodeType": "YulExpressionStatement", + "src": "23868:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_uint256_t_uint256_t_address__to_t_address_t_uint256_t_uint256_t_address__fromStack_reversed", + "nativeSrc": "23491:443:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "23621:9:70", + "nodeType": "YulTypedName", + "src": "23621:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "23632:6:70", + "nodeType": "YulTypedName", + "src": "23632:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "23640:6:70", + "nodeType": "YulTypedName", + "src": "23640:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "23648:6:70", + "nodeType": "YulTypedName", + "src": "23648:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "23656:6:70", + "nodeType": "YulTypedName", + "src": "23656:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "23667:4:70", + "nodeType": "YulTypedName", + "src": "23667:4:70", + "type": "" + } + ], + "src": "23491:443:70" + }, + { + "body": { + "nativeSrc": "24077:567:70", + "nodeType": "YulBlock", + "src": "24077:567:70", + "statements": [ + { + "body": { + "nativeSrc": "24124:16:70", + "nodeType": "YulBlock", + "src": "24124:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24133:1:70", + "nodeType": "YulLiteral", + "src": "24133:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "24136:1:70", + "nodeType": "YulLiteral", + "src": "24136:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "24126:6:70", + "nodeType": "YulIdentifier", + "src": "24126:6:70" + }, + "nativeSrc": "24126:12:70", + "nodeType": "YulFunctionCall", + "src": "24126:12:70" + }, + "nativeSrc": "24126:12:70", + "nodeType": "YulExpressionStatement", + "src": "24126:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "24098:7:70", + "nodeType": "YulIdentifier", + "src": "24098:7:70" + }, + { + "name": "headStart", + "nativeSrc": "24107:9:70", + "nodeType": "YulIdentifier", + "src": "24107:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "24094:3:70", + "nodeType": "YulIdentifier", + "src": "24094:3:70" + }, + "nativeSrc": "24094:23:70", + "nodeType": "YulFunctionCall", + "src": "24094:23:70" + }, + { + "kind": "number", + "nativeSrc": "24119:3:70", + "nodeType": "YulLiteral", + "src": "24119:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "24090:3:70", + "nodeType": "YulIdentifier", + "src": "24090:3:70" + }, + "nativeSrc": "24090:33:70", + "nodeType": "YulFunctionCall", + "src": "24090:33:70" + }, + "nativeSrc": "24087:53:70", + "nodeType": "YulIf", + "src": "24087:53:70" + }, + { + "nativeSrc": "24149:14:70", + "nodeType": "YulVariableDeclaration", + "src": "24149:14:70", + "value": { + "kind": "number", + "nativeSrc": "24162:1:70", + "nodeType": "YulLiteral", + "src": "24162:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "24153:5:70", + "nodeType": "YulTypedName", + "src": "24153:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "24172:32:70", + "nodeType": "YulAssignment", + "src": "24172:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24194:9:70", + "nodeType": "YulIdentifier", + "src": "24194:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "24181:12:70", + "nodeType": "YulIdentifier", + "src": "24181:12:70" + }, + "nativeSrc": "24181:23:70", + "nodeType": "YulFunctionCall", + "src": "24181:23:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "24172:5:70", + "nodeType": "YulIdentifier", + "src": "24172:5:70" + } + ] + }, + { + "nativeSrc": "24213:15:70", + "nodeType": "YulAssignment", + "src": "24213:15:70", + "value": { + "name": "value", + "nativeSrc": "24223:5:70", + "nodeType": "YulIdentifier", + "src": "24223:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "24213:6:70", + "nodeType": "YulIdentifier", + "src": "24213:6:70" + } + ] + }, + { + "nativeSrc": "24237:16:70", + "nodeType": "YulVariableDeclaration", + "src": "24237:16:70", + "value": { + "kind": "number", + "nativeSrc": "24252:1:70", + "nodeType": "YulLiteral", + "src": "24252:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "24241:7:70", + "nodeType": "YulTypedName", + "src": "24241:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "24262:43:70", + "nodeType": "YulAssignment", + "src": "24262:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24290:9:70", + "nodeType": "YulIdentifier", + "src": "24290:9:70" + }, + { + "kind": "number", + "nativeSrc": "24301:2:70", + "nodeType": "YulLiteral", + "src": "24301:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24286:3:70", + "nodeType": "YulIdentifier", + "src": "24286:3:70" + }, + "nativeSrc": "24286:18:70", + "nodeType": "YulFunctionCall", + "src": "24286:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "24273:12:70", + "nodeType": "YulIdentifier", + "src": "24273:12:70" + }, + "nativeSrc": "24273:32:70", + "nodeType": "YulFunctionCall", + "src": "24273:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "24262:7:70", + "nodeType": "YulIdentifier", + "src": "24262:7:70" + } + ] + }, + { + "nativeSrc": "24314:17:70", + "nodeType": "YulAssignment", + "src": "24314:17:70", + "value": { + "name": "value_1", + "nativeSrc": "24324:7:70", + "nodeType": "YulIdentifier", + "src": "24324:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "24314:6:70", + "nodeType": "YulIdentifier", + "src": "24314:6:70" + } + ] + }, + { + "nativeSrc": "24340:47:70", + "nodeType": "YulVariableDeclaration", + "src": "24340:47:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24372:9:70", + "nodeType": "YulIdentifier", + "src": "24372:9:70" + }, + { + "kind": "number", + "nativeSrc": "24383:2:70", + "nodeType": "YulLiteral", + "src": "24383:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24368:3:70", + "nodeType": "YulIdentifier", + "src": "24368:3:70" + }, + "nativeSrc": "24368:18:70", + "nodeType": "YulFunctionCall", + "src": "24368:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "24355:12:70", + "nodeType": "YulIdentifier", + "src": "24355:12:70" + }, + "nativeSrc": "24355:32:70", + "nodeType": "YulFunctionCall", + "src": "24355:32:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "24344:7:70", + "nodeType": "YulTypedName", + "src": "24344:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_2", + "nativeSrc": "24421:7:70", + "nodeType": "YulIdentifier", + "src": "24421:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "24396:24:70", + "nodeType": "YulIdentifier", + "src": "24396:24:70" + }, + "nativeSrc": "24396:33:70", + "nodeType": "YulFunctionCall", + "src": "24396:33:70" + }, + "nativeSrc": "24396:33:70", + "nodeType": "YulExpressionStatement", + "src": "24396:33:70" + }, + { + "nativeSrc": "24438:17:70", + "nodeType": "YulAssignment", + "src": "24438:17:70", + "value": { + "name": "value_2", + "nativeSrc": "24448:7:70", + "nodeType": "YulIdentifier", + "src": "24448:7:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "24438:6:70", + "nodeType": "YulIdentifier", + "src": "24438:6:70" + } + ] + }, + { + "nativeSrc": "24464:46:70", + "nodeType": "YulVariableDeclaration", + "src": "24464:46:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24495:9:70", + "nodeType": "YulIdentifier", + "src": "24495:9:70" + }, + { + "kind": "number", + "nativeSrc": "24506:2:70", + "nodeType": "YulLiteral", + "src": "24506:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24491:3:70", + "nodeType": "YulIdentifier", + "src": "24491:3:70" + }, + "nativeSrc": "24491:18:70", + "nodeType": "YulFunctionCall", + "src": "24491:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "24478:12:70", + "nodeType": "YulIdentifier", + "src": "24478:12:70" + }, + "nativeSrc": "24478:32:70", + "nodeType": "YulFunctionCall", + "src": "24478:32:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "24468:6:70", + "nodeType": "YulTypedName", + "src": "24468:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "24553:16:70", + "nodeType": "YulBlock", + "src": "24553:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24562:1:70", + "nodeType": "YulLiteral", + "src": "24562:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "24565:1:70", + "nodeType": "YulLiteral", + "src": "24565:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "24555:6:70", + "nodeType": "YulIdentifier", + "src": "24555:6:70" + }, + "nativeSrc": "24555:12:70", + "nodeType": "YulFunctionCall", + "src": "24555:12:70" + }, + "nativeSrc": "24555:12:70", + "nodeType": "YulExpressionStatement", + "src": "24555:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "24525:6:70", + "nodeType": "YulIdentifier", + "src": "24525:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24541:2:70", + "nodeType": "YulLiteral", + "src": "24541:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "24545:1:70", + "nodeType": "YulLiteral", + "src": "24545:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "24537:3:70", + "nodeType": "YulIdentifier", + "src": "24537:3:70" + }, + "nativeSrc": "24537:10:70", + "nodeType": "YulFunctionCall", + "src": "24537:10:70" + }, + { + "kind": "number", + "nativeSrc": "24549:1:70", + "nodeType": "YulLiteral", + "src": "24549:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "24533:3:70", + "nodeType": "YulIdentifier", + "src": "24533:3:70" + }, + "nativeSrc": "24533:18:70", + "nodeType": "YulFunctionCall", + "src": "24533:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "24522:2:70", + "nodeType": "YulIdentifier", + "src": "24522:2:70" + }, + "nativeSrc": "24522:30:70", + "nodeType": "YulFunctionCall", + "src": "24522:30:70" + }, + "nativeSrc": "24519:50:70", + "nodeType": "YulIf", + "src": "24519:50:70" + }, + { + "nativeSrc": "24578:60:70", + "nodeType": "YulAssignment", + "src": "24578:60:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "24610:9:70", + "nodeType": "YulIdentifier", + "src": "24610:9:70" + }, + { + "name": "offset", + "nativeSrc": "24621:6:70", + "nodeType": "YulIdentifier", + "src": "24621:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "24606:3:70", + "nodeType": "YulIdentifier", + "src": "24606:3:70" + }, + "nativeSrc": "24606:22:70", + "nodeType": "YulFunctionCall", + "src": "24606:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "24630:7:70", + "nodeType": "YulIdentifier", + "src": "24630:7:70" + } + ], + "functionName": { + "name": "abi_decode_string", + "nativeSrc": "24588:17:70", + "nodeType": "YulIdentifier", + "src": "24588:17:70" + }, + "nativeSrc": "24588:50:70", + "nodeType": "YulFunctionCall", + "src": "24588:50:70" + }, + "variableNames": [ + { + "name": "value3", + "nativeSrc": "24578:6:70", + "nodeType": "YulIdentifier", + "src": "24578:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32t_uint256t_address_payablet_bytes_memory_ptr", + "nativeSrc": "23939:705:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "24019:9:70", + "nodeType": "YulTypedName", + "src": "24019:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "24030:7:70", + "nodeType": "YulTypedName", + "src": "24030:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "24042:6:70", + "nodeType": "YulTypedName", + "src": "24042:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "24050:6:70", + "nodeType": "YulTypedName", + "src": "24050:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "24058:6:70", + "nodeType": "YulTypedName", + "src": "24058:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "24066:6:70", + "nodeType": "YulTypedName", + "src": "24066:6:70", + "type": "" + } + ], + "src": "23939:705:70" + }, + { + "body": { + "nativeSrc": "24708:77:70", + "nodeType": "YulBlock", + "src": "24708:77:70", + "statements": [ + { + "nativeSrc": "24718:22:70", + "nodeType": "YulAssignment", + "src": "24718:22:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "24733:6:70", + "nodeType": "YulIdentifier", + "src": "24733:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "24727:5:70", + "nodeType": "YulIdentifier", + "src": "24727:5:70" + }, + "nativeSrc": "24727:13:70", + "nodeType": "YulFunctionCall", + "src": "24727:13:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "24718:5:70", + "nodeType": "YulIdentifier", + "src": "24718:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "24773:5:70", + "nodeType": "YulIdentifier", + "src": "24773:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "24749:23:70", + "nodeType": "YulIdentifier", + "src": "24749:23:70" + }, + "nativeSrc": "24749:30:70", + "nodeType": "YulFunctionCall", + "src": "24749:30:70" + }, + "nativeSrc": "24749:30:70", + "nodeType": "YulExpressionStatement", + "src": "24749:30:70" + } + ] + }, + "name": "abi_decode_uint32_fromMemory", + "nativeSrc": "24649:136:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "24687:6:70", + "nodeType": "YulTypedName", + "src": "24687:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "24698:5:70", + "nodeType": "YulTypedName", + "src": "24698:5:70", + "type": "" + } + ], + "src": "24649:136:70" + }, + { + "body": { + "nativeSrc": "24834:85:70", + "nodeType": "YulBlock", + "src": "24834:85:70", + "statements": [ + { + "body": { + "nativeSrc": "24897:16:70", + "nodeType": "YulBlock", + "src": "24897:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24906:1:70", + "nodeType": "YulLiteral", + "src": "24906:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "24909:1:70", + "nodeType": "YulLiteral", + "src": "24909:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "24899:6:70", + "nodeType": "YulIdentifier", + "src": "24899:6:70" + }, + "nativeSrc": "24899:12:70", + "nodeType": "YulFunctionCall", + "src": "24899:12:70" + }, + "nativeSrc": "24899:12:70", + "nodeType": "YulExpressionStatement", + "src": "24899:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "24857:5:70", + "nodeType": "YulIdentifier", + "src": "24857:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "24868:5:70", + "nodeType": "YulIdentifier", + "src": "24868:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "24883:2:70", + "nodeType": "YulLiteral", + "src": "24883:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "24887:1:70", + "nodeType": "YulLiteral", + "src": "24887:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "24879:3:70", + "nodeType": "YulIdentifier", + "src": "24879:3:70" + }, + "nativeSrc": "24879:10:70", + "nodeType": "YulFunctionCall", + "src": "24879:10:70" + }, + { + "kind": "number", + "nativeSrc": "24891:1:70", + "nodeType": "YulLiteral", + "src": "24891:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "24875:3:70", + "nodeType": "YulIdentifier", + "src": "24875:3:70" + }, + "nativeSrc": "24875:18:70", + "nodeType": "YulFunctionCall", + "src": "24875:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "24864:3:70", + "nodeType": "YulIdentifier", + "src": "24864:3:70" + }, + "nativeSrc": "24864:30:70", + "nodeType": "YulFunctionCall", + "src": "24864:30:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "24854:2:70", + "nodeType": "YulIdentifier", + "src": "24854:2:70" + }, + "nativeSrc": "24854:41:70", + "nodeType": "YulFunctionCall", + "src": "24854:41:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "24847:6:70", + "nodeType": "YulIdentifier", + "src": "24847:6:70" + }, + "nativeSrc": "24847:49:70", + "nodeType": "YulFunctionCall", + "src": "24847:49:70" + }, + "nativeSrc": "24844:69:70", + "nodeType": "YulIf", + "src": "24844:69:70" + } + ] + }, + "name": "validator_revert_uint64", + "nativeSrc": "24790:129:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "24823:5:70", + "nodeType": "YulTypedName", + "src": "24823:5:70", + "type": "" + } + ], + "src": "24790:129:70" + }, + { + "body": { + "nativeSrc": "24983:77:70", + "nodeType": "YulBlock", + "src": "24983:77:70", + "statements": [ + { + "nativeSrc": "24993:22:70", + "nodeType": "YulAssignment", + "src": "24993:22:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "25008:6:70", + "nodeType": "YulIdentifier", + "src": "25008:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "25002:5:70", + "nodeType": "YulIdentifier", + "src": "25002:5:70" + }, + "nativeSrc": "25002:13:70", + "nodeType": "YulFunctionCall", + "src": "25002:13:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "24993:5:70", + "nodeType": "YulIdentifier", + "src": "24993:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "25048:5:70", + "nodeType": "YulIdentifier", + "src": "25048:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint64", + "nativeSrc": "25024:23:70", + "nodeType": "YulIdentifier", + "src": "25024:23:70" + }, + "nativeSrc": "25024:30:70", + "nodeType": "YulFunctionCall", + "src": "25024:30:70" + }, + "nativeSrc": "25024:30:70", + "nodeType": "YulExpressionStatement", + "src": "25024:30:70" + } + ] + }, + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "24924:136:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "24962:6:70", + "nodeType": "YulTypedName", + "src": "24962:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "24973:5:70", + "nodeType": "YulTypedName", + "src": "24973:5:70", + "type": "" + } + ], + "src": "24924:136:70" + }, + { + "body": { + "nativeSrc": "25173:1128:70", + "nodeType": "YulBlock", + "src": "25173:1128:70", + "statements": [ + { + "nativeSrc": "25183:43:70", + "nodeType": "YulVariableDeclaration", + "src": "25183:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "25201:7:70", + "nodeType": "YulIdentifier", + "src": "25201:7:70" + }, + { + "name": "headStart", + "nativeSrc": "25210:9:70", + "nodeType": "YulIdentifier", + "src": "25210:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "25197:3:70", + "nodeType": "YulIdentifier", + "src": "25197:3:70" + }, + "nativeSrc": "25197:23:70", + "nodeType": "YulFunctionCall", + "src": "25197:23:70" + }, + { + "kind": "number", + "nativeSrc": "25222:3:70", + "nodeType": "YulLiteral", + "src": "25222:3:70", + "type": "", + "value": "320" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "25193:3:70", + "nodeType": "YulIdentifier", + "src": "25193:3:70" + }, + "nativeSrc": "25193:33:70", + "nodeType": "YulFunctionCall", + "src": "25193:33:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "25187:2:70", + "nodeType": "YulTypedName", + "src": "25187:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "25241:16:70", + "nodeType": "YulBlock", + "src": "25241:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "25250:1:70", + "nodeType": "YulLiteral", + "src": "25250:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "25253:1:70", + "nodeType": "YulLiteral", + "src": "25253:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "25243:6:70", + "nodeType": "YulIdentifier", + "src": "25243:6:70" + }, + "nativeSrc": "25243:12:70", + "nodeType": "YulFunctionCall", + "src": "25243:12:70" + }, + "nativeSrc": "25243:12:70", + "nodeType": "YulExpressionStatement", + "src": "25243:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "25238:2:70", + "nodeType": "YulIdentifier", + "src": "25238:2:70" + }, + "nativeSrc": "25235:22:70", + "nodeType": "YulIf", + "src": "25235:22:70" + }, + { + "nativeSrc": "25266:7:70", + "nodeType": "YulAssignment", + "src": "25266:7:70", + "value": { + "kind": "number", + "nativeSrc": "25272:1:70", + "nodeType": "YulLiteral", + "src": "25272:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "25266:2:70", + "nodeType": "YulIdentifier", + "src": "25266:2:70" + } + ] + }, + { + "nativeSrc": "25282:35:70", + "nodeType": "YulVariableDeclaration", + "src": "25282:35:70", + "value": { + "arguments": [], + "functionName": { + "name": "allocate_memory_4297", + "nativeSrc": "25295:20:70", + "nodeType": "YulIdentifier", + "src": "25295:20:70" + }, + "nativeSrc": "25295:22:70", + "nodeType": "YulFunctionCall", + "src": "25295:22:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "25286:5:70", + "nodeType": "YulTypedName", + "src": "25286:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "25326:17:70", + "nodeType": "YulVariableDeclaration", + "src": "25326:17:70", + "value": { + "name": "_1", + "nativeSrc": "25341:2:70", + "nodeType": "YulIdentifier", + "src": "25341:2:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "25330:7:70", + "nodeType": "YulTypedName", + "src": "25330:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "25352:27:70", + "nodeType": "YulAssignment", + "src": "25352:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25369:9:70", + "nodeType": "YulIdentifier", + "src": "25369:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "25363:5:70", + "nodeType": "YulIdentifier", + "src": "25363:5:70" + }, + "nativeSrc": "25363:16:70", + "nodeType": "YulFunctionCall", + "src": "25363:16:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "25352:7:70", + "nodeType": "YulIdentifier", + "src": "25352:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "25395:5:70", + "nodeType": "YulIdentifier", + "src": "25395:5:70" + }, + { + "name": "value_1", + "nativeSrc": "25402:7:70", + "nodeType": "YulIdentifier", + "src": "25402:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25388:6:70", + "nodeType": "YulIdentifier", + "src": "25388:6:70" + }, + "nativeSrc": "25388:22:70", + "nodeType": "YulFunctionCall", + "src": "25388:22:70" + }, + "nativeSrc": "25388:22:70", + "nodeType": "YulExpressionStatement", + "src": "25388:22:70" + }, + { + "nativeSrc": "25419:17:70", + "nodeType": "YulVariableDeclaration", + "src": "25419:17:70", + "value": { + "name": "_1", + "nativeSrc": "25434:2:70", + "nodeType": "YulIdentifier", + "src": "25434:2:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "25423:7:70", + "nodeType": "YulTypedName", + "src": "25423:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "25445:36:70", + "nodeType": "YulAssignment", + "src": "25445:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25466:9:70", + "nodeType": "YulIdentifier", + "src": "25466:9:70" + }, + { + "kind": "number", + "nativeSrc": "25477:2:70", + "nodeType": "YulLiteral", + "src": "25477:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25462:3:70", + "nodeType": "YulIdentifier", + "src": "25462:3:70" + }, + "nativeSrc": "25462:18:70", + "nodeType": "YulFunctionCall", + "src": "25462:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "25456:5:70", + "nodeType": "YulIdentifier", + "src": "25456:5:70" + }, + "nativeSrc": "25456:25:70", + "nodeType": "YulFunctionCall", + "src": "25456:25:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "25445:7:70", + "nodeType": "YulIdentifier", + "src": "25445:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25501:5:70", + "nodeType": "YulIdentifier", + "src": "25501:5:70" + }, + { + "kind": "number", + "nativeSrc": "25508:2:70", + "nodeType": "YulLiteral", + "src": "25508:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25497:3:70", + "nodeType": "YulIdentifier", + "src": "25497:3:70" + }, + "nativeSrc": "25497:14:70", + "nodeType": "YulFunctionCall", + "src": "25497:14:70" + }, + { + "name": "value_2", + "nativeSrc": "25513:7:70", + "nodeType": "YulIdentifier", + "src": "25513:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25490:6:70", + "nodeType": "YulIdentifier", + "src": "25490:6:70" + }, + "nativeSrc": "25490:31:70", + "nodeType": "YulFunctionCall", + "src": "25490:31:70" + }, + "nativeSrc": "25490:31:70", + "nodeType": "YulExpressionStatement", + "src": "25490:31:70" + }, + { + "nativeSrc": "25530:17:70", + "nodeType": "YulVariableDeclaration", + "src": "25530:17:70", + "value": { + "name": "_1", + "nativeSrc": "25545:2:70", + "nodeType": "YulIdentifier", + "src": "25545:2:70" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "25534:7:70", + "nodeType": "YulTypedName", + "src": "25534:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "25556:36:70", + "nodeType": "YulAssignment", + "src": "25556:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25577:9:70", + "nodeType": "YulIdentifier", + "src": "25577:9:70" + }, + { + "kind": "number", + "nativeSrc": "25588:2:70", + "nodeType": "YulLiteral", + "src": "25588:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25573:3:70", + "nodeType": "YulIdentifier", + "src": "25573:3:70" + }, + "nativeSrc": "25573:18:70", + "nodeType": "YulFunctionCall", + "src": "25573:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "25567:5:70", + "nodeType": "YulIdentifier", + "src": "25567:5:70" + }, + "nativeSrc": "25567:25:70", + "nodeType": "YulFunctionCall", + "src": "25567:25:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "25556:7:70", + "nodeType": "YulIdentifier", + "src": "25556:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25612:5:70", + "nodeType": "YulIdentifier", + "src": "25612:5:70" + }, + { + "kind": "number", + "nativeSrc": "25619:2:70", + "nodeType": "YulLiteral", + "src": "25619:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25608:3:70", + "nodeType": "YulIdentifier", + "src": "25608:3:70" + }, + "nativeSrc": "25608:14:70", + "nodeType": "YulFunctionCall", + "src": "25608:14:70" + }, + { + "name": "value_3", + "nativeSrc": "25624:7:70", + "nodeType": "YulIdentifier", + "src": "25624:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25601:6:70", + "nodeType": "YulIdentifier", + "src": "25601:6:70" + }, + "nativeSrc": "25601:31:70", + "nodeType": "YulFunctionCall", + "src": "25601:31:70" + }, + "nativeSrc": "25601:31:70", + "nodeType": "YulExpressionStatement", + "src": "25601:31:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25652:5:70", + "nodeType": "YulIdentifier", + "src": "25652:5:70" + }, + { + "kind": "number", + "nativeSrc": "25659:2:70", + "nodeType": "YulLiteral", + "src": "25659:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25648:3:70", + "nodeType": "YulIdentifier", + "src": "25648:3:70" + }, + "nativeSrc": "25648:14:70", + "nodeType": "YulFunctionCall", + "src": "25648:14:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25697:9:70", + "nodeType": "YulIdentifier", + "src": "25697:9:70" + }, + { + "kind": "number", + "nativeSrc": "25708:2:70", + "nodeType": "YulLiteral", + "src": "25708:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25693:3:70", + "nodeType": "YulIdentifier", + "src": "25693:3:70" + }, + "nativeSrc": "25693:18:70", + "nodeType": "YulFunctionCall", + "src": "25693:18:70" + } + ], + "functionName": { + "name": "abi_decode_uint32_fromMemory", + "nativeSrc": "25664:28:70", + "nodeType": "YulIdentifier", + "src": "25664:28:70" + }, + "nativeSrc": "25664:48:70", + "nodeType": "YulFunctionCall", + "src": "25664:48:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25641:6:70", + "nodeType": "YulIdentifier", + "src": "25641:6:70" + }, + "nativeSrc": "25641:72:70", + "nodeType": "YulFunctionCall", + "src": "25641:72:70" + }, + "nativeSrc": "25641:72:70", + "nodeType": "YulExpressionStatement", + "src": "25641:72:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25733:5:70", + "nodeType": "YulIdentifier", + "src": "25733:5:70" + }, + { + "kind": "number", + "nativeSrc": "25740:3:70", + "nodeType": "YulLiteral", + "src": "25740:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25729:3:70", + "nodeType": "YulIdentifier", + "src": "25729:3:70" + }, + "nativeSrc": "25729:15:70", + "nodeType": "YulFunctionCall", + "src": "25729:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25779:9:70", + "nodeType": "YulIdentifier", + "src": "25779:9:70" + }, + { + "kind": "number", + "nativeSrc": "25790:3:70", + "nodeType": "YulLiteral", + "src": "25790:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25775:3:70", + "nodeType": "YulIdentifier", + "src": "25775:3:70" + }, + "nativeSrc": "25775:19:70", + "nodeType": "YulFunctionCall", + "src": "25775:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "25746:28:70", + "nodeType": "YulIdentifier", + "src": "25746:28:70" + }, + "nativeSrc": "25746:49:70", + "nodeType": "YulFunctionCall", + "src": "25746:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25722:6:70", + "nodeType": "YulIdentifier", + "src": "25722:6:70" + }, + "nativeSrc": "25722:74:70", + "nodeType": "YulFunctionCall", + "src": "25722:74:70" + }, + "nativeSrc": "25722:74:70", + "nodeType": "YulExpressionStatement", + "src": "25722:74:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25816:5:70", + "nodeType": "YulIdentifier", + "src": "25816:5:70" + }, + { + "kind": "number", + "nativeSrc": "25823:3:70", + "nodeType": "YulLiteral", + "src": "25823:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25812:3:70", + "nodeType": "YulIdentifier", + "src": "25812:3:70" + }, + "nativeSrc": "25812:15:70", + "nodeType": "YulFunctionCall", + "src": "25812:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25862:9:70", + "nodeType": "YulIdentifier", + "src": "25862:9:70" + }, + { + "kind": "number", + "nativeSrc": "25873:3:70", + "nodeType": "YulLiteral", + "src": "25873:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25858:3:70", + "nodeType": "YulIdentifier", + "src": "25858:3:70" + }, + "nativeSrc": "25858:19:70", + "nodeType": "YulFunctionCall", + "src": "25858:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "25829:28:70", + "nodeType": "YulIdentifier", + "src": "25829:28:70" + }, + "nativeSrc": "25829:49:70", + "nodeType": "YulFunctionCall", + "src": "25829:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25805:6:70", + "nodeType": "YulIdentifier", + "src": "25805:6:70" + }, + "nativeSrc": "25805:74:70", + "nodeType": "YulFunctionCall", + "src": "25805:74:70" + }, + "nativeSrc": "25805:74:70", + "nodeType": "YulExpressionStatement", + "src": "25805:74:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25899:5:70", + "nodeType": "YulIdentifier", + "src": "25899:5:70" + }, + { + "kind": "number", + "nativeSrc": "25906:3:70", + "nodeType": "YulLiteral", + "src": "25906:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25895:3:70", + "nodeType": "YulIdentifier", + "src": "25895:3:70" + }, + "nativeSrc": "25895:15:70", + "nodeType": "YulFunctionCall", + "src": "25895:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "25945:9:70", + "nodeType": "YulIdentifier", + "src": "25945:9:70" + }, + { + "kind": "number", + "nativeSrc": "25956:3:70", + "nodeType": "YulLiteral", + "src": "25956:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25941:3:70", + "nodeType": "YulIdentifier", + "src": "25941:3:70" + }, + "nativeSrc": "25941:19:70", + "nodeType": "YulFunctionCall", + "src": "25941:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint32_fromMemory", + "nativeSrc": "25912:28:70", + "nodeType": "YulIdentifier", + "src": "25912:28:70" + }, + "nativeSrc": "25912:49:70", + "nodeType": "YulFunctionCall", + "src": "25912:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25888:6:70", + "nodeType": "YulIdentifier", + "src": "25888:6:70" + }, + "nativeSrc": "25888:74:70", + "nodeType": "YulFunctionCall", + "src": "25888:74:70" + }, + "nativeSrc": "25888:74:70", + "nodeType": "YulExpressionStatement", + "src": "25888:74:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "25982:5:70", + "nodeType": "YulIdentifier", + "src": "25982:5:70" + }, + { + "kind": "number", + "nativeSrc": "25989:3:70", + "nodeType": "YulLiteral", + "src": "25989:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "25978:3:70", + "nodeType": "YulIdentifier", + "src": "25978:3:70" + }, + "nativeSrc": "25978:15:70", + "nodeType": "YulFunctionCall", + "src": "25978:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26028:9:70", + "nodeType": "YulIdentifier", + "src": "26028:9:70" + }, + { + "kind": "number", + "nativeSrc": "26039:3:70", + "nodeType": "YulLiteral", + "src": "26039:3:70", + "type": "", + "value": "224" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26024:3:70", + "nodeType": "YulIdentifier", + "src": "26024:3:70" + }, + "nativeSrc": "26024:19:70", + "nodeType": "YulFunctionCall", + "src": "26024:19:70" + } + ], + "functionName": { + "name": "abi_decode_uint64_fromMemory", + "nativeSrc": "25995:28:70", + "nodeType": "YulIdentifier", + "src": "25995:28:70" + }, + "nativeSrc": "25995:49:70", + "nodeType": "YulFunctionCall", + "src": "25995:49:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "25971:6:70", + "nodeType": "YulIdentifier", + "src": "25971:6:70" + }, + "nativeSrc": "25971:74:70", + "nodeType": "YulFunctionCall", + "src": "25971:74:70" + }, + "nativeSrc": "25971:74:70", + "nodeType": "YulExpressionStatement", + "src": "25971:74:70" + }, + { + "nativeSrc": "26054:17:70", + "nodeType": "YulVariableDeclaration", + "src": "26054:17:70", + "value": { + "name": "_1", + "nativeSrc": "26069:2:70", + "nodeType": "YulIdentifier", + "src": "26069:2:70" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "26058:7:70", + "nodeType": "YulTypedName", + "src": "26058:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "26080:37:70", + "nodeType": "YulAssignment", + "src": "26080:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26101:9:70", + "nodeType": "YulIdentifier", + "src": "26101:9:70" + }, + { + "kind": "number", + "nativeSrc": "26112:3:70", + "nodeType": "YulLiteral", + "src": "26112:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26097:3:70", + "nodeType": "YulIdentifier", + "src": "26097:3:70" + }, + "nativeSrc": "26097:19:70", + "nodeType": "YulFunctionCall", + "src": "26097:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "26091:5:70", + "nodeType": "YulIdentifier", + "src": "26091:5:70" + }, + "nativeSrc": "26091:26:70", + "nodeType": "YulFunctionCall", + "src": "26091:26:70" + }, + "variableNames": [ + { + "name": "value_4", + "nativeSrc": "26080:7:70", + "nodeType": "YulIdentifier", + "src": "26080:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "26137:5:70", + "nodeType": "YulIdentifier", + "src": "26137:5:70" + }, + { + "kind": "number", + "nativeSrc": "26144:3:70", + "nodeType": "YulLiteral", + "src": "26144:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26133:3:70", + "nodeType": "YulIdentifier", + "src": "26133:3:70" + }, + "nativeSrc": "26133:15:70", + "nodeType": "YulFunctionCall", + "src": "26133:15:70" + }, + { + "name": "value_4", + "nativeSrc": "26150:7:70", + "nodeType": "YulIdentifier", + "src": "26150:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26126:6:70", + "nodeType": "YulIdentifier", + "src": "26126:6:70" + }, + "nativeSrc": "26126:32:70", + "nodeType": "YulFunctionCall", + "src": "26126:32:70" + }, + "nativeSrc": "26126:32:70", + "nodeType": "YulExpressionStatement", + "src": "26126:32:70" + }, + { + "nativeSrc": "26167:17:70", + "nodeType": "YulVariableDeclaration", + "src": "26167:17:70", + "value": { + "name": "_1", + "nativeSrc": "26182:2:70", + "nodeType": "YulIdentifier", + "src": "26182:2:70" + }, + "variables": [ + { + "name": "value_5", + "nativeSrc": "26171:7:70", + "nodeType": "YulTypedName", + "src": "26171:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "26193:37:70", + "nodeType": "YulAssignment", + "src": "26193:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26214:9:70", + "nodeType": "YulIdentifier", + "src": "26214:9:70" + }, + { + "kind": "number", + "nativeSrc": "26225:3:70", + "nodeType": "YulLiteral", + "src": "26225:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26210:3:70", + "nodeType": "YulIdentifier", + "src": "26210:3:70" + }, + "nativeSrc": "26210:19:70", + "nodeType": "YulFunctionCall", + "src": "26210:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "26204:5:70", + "nodeType": "YulIdentifier", + "src": "26204:5:70" + }, + "nativeSrc": "26204:26:70", + "nodeType": "YulFunctionCall", + "src": "26204:26:70" + }, + "variableNames": [ + { + "name": "value_5", + "nativeSrc": "26193:7:70", + "nodeType": "YulIdentifier", + "src": "26193:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "26250:5:70", + "nodeType": "YulIdentifier", + "src": "26250:5:70" + }, + { + "kind": "number", + "nativeSrc": "26257:3:70", + "nodeType": "YulLiteral", + "src": "26257:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26246:3:70", + "nodeType": "YulIdentifier", + "src": "26246:3:70" + }, + "nativeSrc": "26246:15:70", + "nodeType": "YulFunctionCall", + "src": "26246:15:70" + }, + { + "name": "value_5", + "nativeSrc": "26263:7:70", + "nodeType": "YulIdentifier", + "src": "26263:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26239:6:70", + "nodeType": "YulIdentifier", + "src": "26239:6:70" + }, + "nativeSrc": "26239:32:70", + "nodeType": "YulFunctionCall", + "src": "26239:32:70" + }, + "nativeSrc": "26239:32:70", + "nodeType": "YulExpressionStatement", + "src": "26239:32:70" + }, + { + "nativeSrc": "26280:15:70", + "nodeType": "YulAssignment", + "src": "26280:15:70", + "value": { + "name": "value", + "nativeSrc": "26290:5:70", + "nodeType": "YulIdentifier", + "src": "26290:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "26280:6:70", + "nodeType": "YulIdentifier", + "src": "26280:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_Provision_$3962_memory_ptr_fromMemory", + "nativeSrc": "25065:1236:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "25139:9:70", + "nodeType": "YulTypedName", + "src": "25139:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "25150:7:70", + "nodeType": "YulTypedName", + "src": "25150:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "25162:6:70", + "nodeType": "YulTypedName", + "src": "25162:6:70", + "type": "" + } + ], + "src": "25065:1236:70" + }, + { + "body": { + "nativeSrc": "26429:161:70", + "nodeType": "YulBlock", + "src": "26429:161:70", + "statements": [ + { + "nativeSrc": "26439:26:70", + "nodeType": "YulAssignment", + "src": "26439:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26451:9:70", + "nodeType": "YulIdentifier", + "src": "26451:9:70" + }, + { + "kind": "number", + "nativeSrc": "26462:2:70", + "nodeType": "YulLiteral", + "src": "26462:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26447:3:70", + "nodeType": "YulIdentifier", + "src": "26447:3:70" + }, + "nativeSrc": "26447:18:70", + "nodeType": "YulFunctionCall", + "src": "26447:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "26439:4:70", + "nodeType": "YulIdentifier", + "src": "26439:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26481:9:70", + "nodeType": "YulIdentifier", + "src": "26481:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "26496:6:70", + "nodeType": "YulIdentifier", + "src": "26496:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "26512:3:70", + "nodeType": "YulLiteral", + "src": "26512:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "26517:1:70", + "nodeType": "YulLiteral", + "src": "26517:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "26508:3:70", + "nodeType": "YulIdentifier", + "src": "26508:3:70" + }, + "nativeSrc": "26508:11:70", + "nodeType": "YulFunctionCall", + "src": "26508:11:70" + }, + { + "kind": "number", + "nativeSrc": "26521:1:70", + "nodeType": "YulLiteral", + "src": "26521:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "26504:3:70", + "nodeType": "YulIdentifier", + "src": "26504:3:70" + }, + "nativeSrc": "26504:19:70", + "nodeType": "YulFunctionCall", + "src": "26504:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "26492:3:70", + "nodeType": "YulIdentifier", + "src": "26492:3:70" + }, + "nativeSrc": "26492:32:70", + "nodeType": "YulFunctionCall", + "src": "26492:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26474:6:70", + "nodeType": "YulIdentifier", + "src": "26474:6:70" + }, + "nativeSrc": "26474:51:70", + "nodeType": "YulFunctionCall", + "src": "26474:51:70" + }, + "nativeSrc": "26474:51:70", + "nodeType": "YulExpressionStatement", + "src": "26474:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26545:9:70", + "nodeType": "YulIdentifier", + "src": "26545:9:70" + }, + { + "kind": "number", + "nativeSrc": "26556:2:70", + "nodeType": "YulLiteral", + "src": "26556:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26541:3:70", + "nodeType": "YulIdentifier", + "src": "26541:3:70" + }, + "nativeSrc": "26541:18:70", + "nodeType": "YulFunctionCall", + "src": "26541:18:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "26575:6:70", + "nodeType": "YulIdentifier", + "src": "26575:6:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "26568:6:70", + "nodeType": "YulIdentifier", + "src": "26568:6:70" + }, + "nativeSrc": "26568:14:70", + "nodeType": "YulFunctionCall", + "src": "26568:14:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "26561:6:70", + "nodeType": "YulIdentifier", + "src": "26561:6:70" + }, + "nativeSrc": "26561:22:70", + "nodeType": "YulFunctionCall", + "src": "26561:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26534:6:70", + "nodeType": "YulIdentifier", + "src": "26534:6:70" + }, + "nativeSrc": "26534:50:70", + "nodeType": "YulFunctionCall", + "src": "26534:50:70" + }, + "nativeSrc": "26534:50:70", + "nodeType": "YulExpressionStatement", + "src": "26534:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_bool__to_t_address_t_bool__fromStack_reversed", + "nativeSrc": "26306:284:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "26390:9:70", + "nodeType": "YulTypedName", + "src": "26390:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "26401:6:70", + "nodeType": "YulTypedName", + "src": "26401:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "26409:6:70", + "nodeType": "YulTypedName", + "src": "26409:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "26420:4:70", + "nodeType": "YulTypedName", + "src": "26420:4:70", + "type": "" + } + ], + "src": "26306:284:70" + }, + { + "body": { + "nativeSrc": "26730:156:70", + "nodeType": "YulBlock", + "src": "26730:156:70", + "statements": [ + { + "nativeSrc": "26740:26:70", + "nodeType": "YulAssignment", + "src": "26740:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26752:9:70", + "nodeType": "YulIdentifier", + "src": "26752:9:70" + }, + { + "kind": "number", + "nativeSrc": "26763:2:70", + "nodeType": "YulLiteral", + "src": "26763:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26748:3:70", + "nodeType": "YulIdentifier", + "src": "26748:3:70" + }, + "nativeSrc": "26748:18:70", + "nodeType": "YulFunctionCall", + "src": "26748:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "26740:4:70", + "nodeType": "YulIdentifier", + "src": "26740:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26782:9:70", + "nodeType": "YulIdentifier", + "src": "26782:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "26797:6:70", + "nodeType": "YulIdentifier", + "src": "26797:6:70" + }, + { + "kind": "number", + "nativeSrc": "26805:4:70", + "nodeType": "YulLiteral", + "src": "26805:4:70", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "26793:3:70", + "nodeType": "YulIdentifier", + "src": "26793:3:70" + }, + "nativeSrc": "26793:17:70", + "nodeType": "YulFunctionCall", + "src": "26793:17:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26775:6:70", + "nodeType": "YulIdentifier", + "src": "26775:6:70" + }, + "nativeSrc": "26775:36:70", + "nodeType": "YulFunctionCall", + "src": "26775:36:70" + }, + "nativeSrc": "26775:36:70", + "nodeType": "YulExpressionStatement", + "src": "26775:36:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "26831:9:70", + "nodeType": "YulIdentifier", + "src": "26831:9:70" + }, + { + "kind": "number", + "nativeSrc": "26842:2:70", + "nodeType": "YulLiteral", + "src": "26842:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "26827:3:70", + "nodeType": "YulIdentifier", + "src": "26827:3:70" + }, + "nativeSrc": "26827:18:70", + "nodeType": "YulFunctionCall", + "src": "26827:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "26851:6:70", + "nodeType": "YulIdentifier", + "src": "26851:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "26867:3:70", + "nodeType": "YulLiteral", + "src": "26867:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "26872:1:70", + "nodeType": "YulLiteral", + "src": "26872:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "26863:3:70", + "nodeType": "YulIdentifier", + "src": "26863:3:70" + }, + "nativeSrc": "26863:11:70", + "nodeType": "YulFunctionCall", + "src": "26863:11:70" + }, + { + "kind": "number", + "nativeSrc": "26876:1:70", + "nodeType": "YulLiteral", + "src": "26876:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "26859:3:70", + "nodeType": "YulIdentifier", + "src": "26859:3:70" + }, + "nativeSrc": "26859:19:70", + "nodeType": "YulFunctionCall", + "src": "26859:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "26847:3:70", + "nodeType": "YulIdentifier", + "src": "26847:3:70" + }, + "nativeSrc": "26847:32:70", + "nodeType": "YulFunctionCall", + "src": "26847:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "26820:6:70", + "nodeType": "YulIdentifier", + "src": "26820:6:70" + }, + "nativeSrc": "26820:60:70", + "nodeType": "YulFunctionCall", + "src": "26820:60:70" + }, + "nativeSrc": "26820:60:70", + "nodeType": "YulExpressionStatement", + "src": "26820:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_rational_0_by_1_t_address__to_t_uint8_t_address__fromStack_reversed", + "nativeSrc": "26595:291:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "26691:9:70", + "nodeType": "YulTypedName", + "src": "26691:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "26702:6:70", + "nodeType": "YulTypedName", + "src": "26702:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "26710:6:70", + "nodeType": "YulTypedName", + "src": "26710:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "26721:4:70", + "nodeType": "YulTypedName", + "src": "26721:4:70", + "type": "" + } + ], + "src": "26595:291:70" + }, + { + "body": { + "nativeSrc": "26972:149:70", + "nodeType": "YulBlock", + "src": "26972:149:70", + "statements": [ + { + "body": { + "nativeSrc": "27018:16:70", + "nodeType": "YulBlock", + "src": "27018:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "27027:1:70", + "nodeType": "YulLiteral", + "src": "27027:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "27030:1:70", + "nodeType": "YulLiteral", + "src": "27030:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "27020:6:70", + "nodeType": "YulIdentifier", + "src": "27020:6:70" + }, + "nativeSrc": "27020:12:70", + "nodeType": "YulFunctionCall", + "src": "27020:12:70" + }, + "nativeSrc": "27020:12:70", + "nodeType": "YulExpressionStatement", + "src": "27020:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "26993:7:70", + "nodeType": "YulIdentifier", + "src": "26993:7:70" + }, + { + "name": "headStart", + "nativeSrc": "27002:9:70", + "nodeType": "YulIdentifier", + "src": "27002:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "26989:3:70", + "nodeType": "YulIdentifier", + "src": "26989:3:70" + }, + "nativeSrc": "26989:23:70", + "nodeType": "YulFunctionCall", + "src": "26989:23:70" + }, + { + "kind": "number", + "nativeSrc": "27014:2:70", + "nodeType": "YulLiteral", + "src": "27014:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "26985:3:70", + "nodeType": "YulIdentifier", + "src": "26985:3:70" + }, + "nativeSrc": "26985:32:70", + "nodeType": "YulFunctionCall", + "src": "26985:32:70" + }, + "nativeSrc": "26982:52:70", + "nodeType": "YulIf", + "src": "26982:52:70" + }, + { + "nativeSrc": "27043:14:70", + "nodeType": "YulVariableDeclaration", + "src": "27043:14:70", + "value": { + "kind": "number", + "nativeSrc": "27056:1:70", + "nodeType": "YulLiteral", + "src": "27056:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "27047:5:70", + "nodeType": "YulTypedName", + "src": "27047:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "27066:25:70", + "nodeType": "YulAssignment", + "src": "27066:25:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "27081:9:70", + "nodeType": "YulIdentifier", + "src": "27081:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "27075:5:70", + "nodeType": "YulIdentifier", + "src": "27075:5:70" + }, + "nativeSrc": "27075:16:70", + "nodeType": "YulFunctionCall", + "src": "27075:16:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "27066:5:70", + "nodeType": "YulIdentifier", + "src": "27066:5:70" + } + ] + }, + { + "nativeSrc": "27100:15:70", + "nodeType": "YulAssignment", + "src": "27100:15:70", + "value": { + "name": "value", + "nativeSrc": "27110:5:70", + "nodeType": "YulIdentifier", + "src": "27110:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "27100:6:70", + "nodeType": "YulIdentifier", + "src": "27100:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nativeSrc": "26891:230:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "26938:9:70", + "nodeType": "YulTypedName", + "src": "26938:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "26949:7:70", + "nodeType": "YulTypedName", + "src": "26949:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "26961:6:70", + "nodeType": "YulTypedName", + "src": "26961:6:70", + "type": "" + } + ], + "src": "26891:230:70" + }, + { + "body": { + "nativeSrc": "27206:169:70", + "nodeType": "YulBlock", + "src": "27206:169:70", + "statements": [ + { + "body": { + "nativeSrc": "27252:16:70", + "nodeType": "YulBlock", + "src": "27252:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "27261:1:70", + "nodeType": "YulLiteral", + "src": "27261:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "27264:1:70", + "nodeType": "YulLiteral", + "src": "27264:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "27254:6:70", + "nodeType": "YulIdentifier", + "src": "27254:6:70" + }, + "nativeSrc": "27254:12:70", + "nodeType": "YulFunctionCall", + "src": "27254:12:70" + }, + "nativeSrc": "27254:12:70", + "nodeType": "YulExpressionStatement", + "src": "27254:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "27227:7:70", + "nodeType": "YulIdentifier", + "src": "27227:7:70" + }, + { + "name": "headStart", + "nativeSrc": "27236:9:70", + "nodeType": "YulIdentifier", + "src": "27236:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "27223:3:70", + "nodeType": "YulIdentifier", + "src": "27223:3:70" + }, + "nativeSrc": "27223:23:70", + "nodeType": "YulFunctionCall", + "src": "27223:23:70" + }, + { + "kind": "number", + "nativeSrc": "27248:2:70", + "nodeType": "YulLiteral", + "src": "27248:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "27219:3:70", + "nodeType": "YulIdentifier", + "src": "27219:3:70" + }, + "nativeSrc": "27219:32:70", + "nodeType": "YulFunctionCall", + "src": "27219:32:70" + }, + "nativeSrc": "27216:52:70", + "nodeType": "YulIf", + "src": "27216:52:70" + }, + { + "nativeSrc": "27277:29:70", + "nodeType": "YulVariableDeclaration", + "src": "27277:29:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "27296:9:70", + "nodeType": "YulIdentifier", + "src": "27296:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "27290:5:70", + "nodeType": "YulIdentifier", + "src": "27290:5:70" + }, + "nativeSrc": "27290:16:70", + "nodeType": "YulFunctionCall", + "src": "27290:16:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "27281:5:70", + "nodeType": "YulTypedName", + "src": "27281:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "27339:5:70", + "nodeType": "YulIdentifier", + "src": "27339:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint32", + "nativeSrc": "27315:23:70", + "nodeType": "YulIdentifier", + "src": "27315:23:70" + }, + "nativeSrc": "27315:30:70", + "nodeType": "YulFunctionCall", + "src": "27315:30:70" + }, + "nativeSrc": "27315:30:70", + "nodeType": "YulExpressionStatement", + "src": "27315:30:70" + }, + { + "nativeSrc": "27354:15:70", + "nodeType": "YulAssignment", + "src": "27354:15:70", + "value": { + "name": "value", + "nativeSrc": "27364:5:70", + "nodeType": "YulIdentifier", + "src": "27364:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "27354:6:70", + "nodeType": "YulIdentifier", + "src": "27354:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint32_fromMemory", + "nativeSrc": "27126:249:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "27172:9:70", + "nodeType": "YulTypedName", + "src": "27172:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "27183:7:70", + "nodeType": "YulTypedName", + "src": "27183:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "27195:6:70", + "nodeType": "YulTypedName", + "src": "27195:6:70", + "type": "" + } + ], + "src": "27126:249:70" + }, + { + "body": { + "nativeSrc": "27460:169:70", + "nodeType": "YulBlock", + "src": "27460:169:70", + "statements": [ + { + "body": { + "nativeSrc": "27506:16:70", + "nodeType": "YulBlock", + "src": "27506:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "27515:1:70", + "nodeType": "YulLiteral", + "src": "27515:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "27518:1:70", + "nodeType": "YulLiteral", + "src": "27518:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "27508:6:70", + "nodeType": "YulIdentifier", + "src": "27508:6:70" + }, + "nativeSrc": "27508:12:70", + "nodeType": "YulFunctionCall", + "src": "27508:12:70" + }, + "nativeSrc": "27508:12:70", + "nodeType": "YulExpressionStatement", + "src": "27508:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "27481:7:70", + "nodeType": "YulIdentifier", + "src": "27481:7:70" + }, + { + "name": "headStart", + "nativeSrc": "27490:9:70", + "nodeType": "YulIdentifier", + "src": "27490:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "27477:3:70", + "nodeType": "YulIdentifier", + "src": "27477:3:70" + }, + "nativeSrc": "27477:23:70", + "nodeType": "YulFunctionCall", + "src": "27477:23:70" + }, + { + "kind": "number", + "nativeSrc": "27502:2:70", + "nodeType": "YulLiteral", + "src": "27502:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "27473:3:70", + "nodeType": "YulIdentifier", + "src": "27473:3:70" + }, + "nativeSrc": "27473:32:70", + "nodeType": "YulFunctionCall", + "src": "27473:32:70" + }, + "nativeSrc": "27470:52:70", + "nodeType": "YulIf", + "src": "27470:52:70" + }, + { + "nativeSrc": "27531:29:70", + "nodeType": "YulVariableDeclaration", + "src": "27531:29:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "27550:9:70", + "nodeType": "YulIdentifier", + "src": "27550:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "27544:5:70", + "nodeType": "YulIdentifier", + "src": "27544:5:70" + }, + "nativeSrc": "27544:16:70", + "nodeType": "YulFunctionCall", + "src": "27544:16:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "27535:5:70", + "nodeType": "YulTypedName", + "src": "27535:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "27593:5:70", + "nodeType": "YulIdentifier", + "src": "27593:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint64", + "nativeSrc": "27569:23:70", + "nodeType": "YulIdentifier", + "src": "27569:23:70" + }, + "nativeSrc": "27569:30:70", + "nodeType": "YulFunctionCall", + "src": "27569:30:70" + }, + "nativeSrc": "27569:30:70", + "nodeType": "YulExpressionStatement", + "src": "27569:30:70" + }, + { + "nativeSrc": "27608:15:70", + "nodeType": "YulAssignment", + "src": "27608:15:70", + "value": { + "name": "value", + "nativeSrc": "27618:5:70", + "nodeType": "YulIdentifier", + "src": "27618:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "27608:6:70", + "nodeType": "YulIdentifier", + "src": "27608:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint64_fromMemory", + "nativeSrc": "27380:249:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "27426:9:70", + "nodeType": "YulTypedName", + "src": "27426:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "27437:7:70", + "nodeType": "YulTypedName", + "src": "27437:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "27449:6:70", + "nodeType": "YulTypedName", + "src": "27449:6:70", + "type": "" + } + ], + "src": "27380:249:70" + }, + { + "body": { + "nativeSrc": "27757:135:70", + "nodeType": "YulBlock", + "src": "27757:135:70", + "statements": [ + { + "nativeSrc": "27767:26:70", + "nodeType": "YulAssignment", + "src": "27767:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "27779:9:70", + "nodeType": "YulIdentifier", + "src": "27779:9:70" + }, + { + "kind": "number", + "nativeSrc": "27790:2:70", + "nodeType": "YulLiteral", + "src": "27790:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "27775:3:70", + "nodeType": "YulIdentifier", + "src": "27775:3:70" + }, + "nativeSrc": "27775:18:70", + "nodeType": "YulFunctionCall", + "src": "27775:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "27767:4:70", + "nodeType": "YulIdentifier", + "src": "27767:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "27809:9:70", + "nodeType": "YulIdentifier", + "src": "27809:9:70" + }, + { + "name": "value0", + "nativeSrc": "27820:6:70", + "nodeType": "YulIdentifier", + "src": "27820:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "27802:6:70", + "nodeType": "YulIdentifier", + "src": "27802:6:70" + }, + "nativeSrc": "27802:25:70", + "nodeType": "YulFunctionCall", + "src": "27802:25:70" + }, + "nativeSrc": "27802:25:70", + "nodeType": "YulExpressionStatement", + "src": "27802:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "27847:9:70", + "nodeType": "YulIdentifier", + "src": "27847:9:70" + }, + { + "kind": "number", + "nativeSrc": "27858:2:70", + "nodeType": "YulLiteral", + "src": "27858:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "27843:3:70", + "nodeType": "YulIdentifier", + "src": "27843:3:70" + }, + "nativeSrc": "27843:18:70", + "nodeType": "YulFunctionCall", + "src": "27843:18:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "27877:6:70", + "nodeType": "YulIdentifier", + "src": "27877:6:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "27870:6:70", + "nodeType": "YulIdentifier", + "src": "27870:6:70" + }, + "nativeSrc": "27870:14:70", + "nodeType": "YulFunctionCall", + "src": "27870:14:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "27863:6:70", + "nodeType": "YulIdentifier", + "src": "27863:6:70" + }, + "nativeSrc": "27863:22:70", + "nodeType": "YulFunctionCall", + "src": "27863:22:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "27836:6:70", + "nodeType": "YulIdentifier", + "src": "27836:6:70" + }, + "nativeSrc": "27836:50:70", + "nodeType": "YulFunctionCall", + "src": "27836:50:70" + }, + "nativeSrc": "27836:50:70", + "nodeType": "YulExpressionStatement", + "src": "27836:50:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_bool__to_t_uint256_t_bool__fromStack_reversed", + "nativeSrc": "27634:258:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "27718:9:70", + "nodeType": "YulTypedName", + "src": "27718:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "27729:6:70", + "nodeType": "YulTypedName", + "src": "27729:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "27737:6:70", + "nodeType": "YulTypedName", + "src": "27737:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "27748:4:70", + "nodeType": "YulTypedName", + "src": "27748:4:70", + "type": "" + } + ], + "src": "27634:258:70" + }, + { + "body": { + "nativeSrc": "28026:145:70", + "nodeType": "YulBlock", + "src": "28026:145:70", + "statements": [ + { + "nativeSrc": "28036:26:70", + "nodeType": "YulAssignment", + "src": "28036:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "28048:9:70", + "nodeType": "YulIdentifier", + "src": "28048:9:70" + }, + { + "kind": "number", + "nativeSrc": "28059:2:70", + "nodeType": "YulLiteral", + "src": "28059:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "28044:3:70", + "nodeType": "YulIdentifier", + "src": "28044:3:70" + }, + "nativeSrc": "28044:18:70", + "nodeType": "YulFunctionCall", + "src": "28044:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "28036:4:70", + "nodeType": "YulIdentifier", + "src": "28036:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "28078:9:70", + "nodeType": "YulIdentifier", + "src": "28078:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "28093:6:70", + "nodeType": "YulIdentifier", + "src": "28093:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "28109:3:70", + "nodeType": "YulLiteral", + "src": "28109:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "28114:1:70", + "nodeType": "YulLiteral", + "src": "28114:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "28105:3:70", + "nodeType": "YulIdentifier", + "src": "28105:3:70" + }, + "nativeSrc": "28105:11:70", + "nodeType": "YulFunctionCall", + "src": "28105:11:70" + }, + { + "kind": "number", + "nativeSrc": "28118:1:70", + "nodeType": "YulLiteral", + "src": "28118:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "28101:3:70", + "nodeType": "YulIdentifier", + "src": "28101:3:70" + }, + "nativeSrc": "28101:19:70", + "nodeType": "YulFunctionCall", + "src": "28101:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "28089:3:70", + "nodeType": "YulIdentifier", + "src": "28089:3:70" + }, + "nativeSrc": "28089:32:70", + "nodeType": "YulFunctionCall", + "src": "28089:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "28071:6:70", + "nodeType": "YulIdentifier", + "src": "28071:6:70" + }, + "nativeSrc": "28071:51:70", + "nodeType": "YulFunctionCall", + "src": "28071:51:70" + }, + "nativeSrc": "28071:51:70", + "nodeType": "YulExpressionStatement", + "src": "28071:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "28142:9:70", + "nodeType": "YulIdentifier", + "src": "28142:9:70" + }, + { + "kind": "number", + "nativeSrc": "28153:2:70", + "nodeType": "YulLiteral", + "src": "28153:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "28138:3:70", + "nodeType": "YulIdentifier", + "src": "28138:3:70" + }, + "nativeSrc": "28138:18:70", + "nodeType": "YulFunctionCall", + "src": "28138:18:70" + }, + { + "name": "value1", + "nativeSrc": "28158:6:70", + "nodeType": "YulIdentifier", + "src": "28158:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "28131:6:70", + "nodeType": "YulIdentifier", + "src": "28131:6:70" + }, + "nativeSrc": "28131:34:70", + "nodeType": "YulFunctionCall", + "src": "28131:34:70" + }, + "nativeSrc": "28131:34:70", + "nodeType": "YulExpressionStatement", + "src": "28131:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed", + "nativeSrc": "27897:274:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "27987:9:70", + "nodeType": "YulTypedName", + "src": "27987:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "27998:6:70", + "nodeType": "YulTypedName", + "src": "27998:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "28006:6:70", + "nodeType": "YulTypedName", + "src": "28006:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "28017:4:70", + "nodeType": "YulTypedName", + "src": "28017:4:70", + "type": "" + } + ], + "src": "27897:274:70" + }, + { + "body": { + "nativeSrc": "28224:77:70", + "nodeType": "YulBlock", + "src": "28224:77:70", + "statements": [ + { + "nativeSrc": "28234:16:70", + "nodeType": "YulAssignment", + "src": "28234:16:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "28245:1:70", + "nodeType": "YulIdentifier", + "src": "28245:1:70" + }, + { + "name": "y", + "nativeSrc": "28248:1:70", + "nodeType": "YulIdentifier", + "src": "28248:1:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "28241:3:70", + "nodeType": "YulIdentifier", + "src": "28241:3:70" + }, + "nativeSrc": "28241:9:70", + "nodeType": "YulFunctionCall", + "src": "28241:9:70" + }, + "variableNames": [ + { + "name": "sum", + "nativeSrc": "28234:3:70", + "nodeType": "YulIdentifier", + "src": "28234:3:70" + } + ] + }, + { + "body": { + "nativeSrc": "28273:22:70", + "nodeType": "YulBlock", + "src": "28273:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "28275:16:70", + "nodeType": "YulIdentifier", + "src": "28275:16:70" + }, + "nativeSrc": "28275:18:70", + "nodeType": "YulFunctionCall", + "src": "28275:18:70" + }, + "nativeSrc": "28275:18:70", + "nodeType": "YulExpressionStatement", + "src": "28275:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nativeSrc": "28265:1:70", + "nodeType": "YulIdentifier", + "src": "28265:1:70" + }, + { + "name": "sum", + "nativeSrc": "28268:3:70", + "nodeType": "YulIdentifier", + "src": "28268:3:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "28262:2:70", + "nodeType": "YulIdentifier", + "src": "28262:2:70" + }, + "nativeSrc": "28262:10:70", + "nodeType": "YulFunctionCall", + "src": "28262:10:70" + }, + "nativeSrc": "28259:36:70", + "nodeType": "YulIf", + "src": "28259:36:70" + } + ] + }, + "name": "checked_add_t_uint256", + "nativeSrc": "28176:125:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "28207:1:70", + "nodeType": "YulTypedName", + "src": "28207:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "28210:1:70", + "nodeType": "YulTypedName", + "src": "28210:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nativeSrc": "28216:3:70", + "nodeType": "YulTypedName", + "src": "28216:3:70", + "type": "" + } + ], + "src": "28176:125:70" + }, + { + "body": { + "nativeSrc": "28443:150:70", + "nodeType": "YulBlock", + "src": "28443:150:70", + "statements": [ + { + "nativeSrc": "28453:27:70", + "nodeType": "YulVariableDeclaration", + "src": "28453:27:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "28473:6:70", + "nodeType": "YulIdentifier", + "src": "28473:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "28467:5:70", + "nodeType": "YulIdentifier", + "src": "28467:5:70" + }, + "nativeSrc": "28467:13:70", + "nodeType": "YulFunctionCall", + "src": "28467:13:70" + }, + "variables": [ + { + "name": "length", + "nativeSrc": "28457:6:70", + "nodeType": "YulTypedName", + "src": "28457:6:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "28528:6:70", + "nodeType": "YulIdentifier", + "src": "28528:6:70" + }, + { + "kind": "number", + "nativeSrc": "28536:4:70", + "nodeType": "YulLiteral", + "src": "28536:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "28524:3:70", + "nodeType": "YulIdentifier", + "src": "28524:3:70" + }, + "nativeSrc": "28524:17:70", + "nodeType": "YulFunctionCall", + "src": "28524:17:70" + }, + { + "name": "pos", + "nativeSrc": "28543:3:70", + "nodeType": "YulIdentifier", + "src": "28543:3:70" + }, + { + "name": "length", + "nativeSrc": "28548:6:70", + "nodeType": "YulIdentifier", + "src": "28548:6:70" + } + ], + "functionName": { + "name": "copy_memory_to_memory_with_cleanup", + "nativeSrc": "28489:34:70", + "nodeType": "YulIdentifier", + "src": "28489:34:70" + }, + "nativeSrc": "28489:66:70", + "nodeType": "YulFunctionCall", + "src": "28489:66:70" + }, + "nativeSrc": "28489:66:70", + "nodeType": "YulExpressionStatement", + "src": "28489:66:70" + }, + { + "nativeSrc": "28564:23:70", + "nodeType": "YulAssignment", + "src": "28564:23:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "28575:3:70", + "nodeType": "YulIdentifier", + "src": "28575:3:70" + }, + { + "name": "length", + "nativeSrc": "28580:6:70", + "nodeType": "YulIdentifier", + "src": "28580:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "28571:3:70", + "nodeType": "YulIdentifier", + "src": "28571:3:70" + }, + "nativeSrc": "28571:16:70", + "nodeType": "YulFunctionCall", + "src": "28571:16:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "28564:3:70", + "nodeType": "YulIdentifier", + "src": "28564:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "28306:287:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "28419:3:70", + "nodeType": "YulTypedName", + "src": "28419:3:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "28424:6:70", + "nodeType": "YulTypedName", + "src": "28424:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "28435:3:70", + "nodeType": "YulTypedName", + "src": "28435:3:70", + "type": "" + } + ], + "src": "28306:287:70" + }, + { + "body": { + "nativeSrc": "28646:84:70", + "nodeType": "YulBlock", + "src": "28646:84:70", + "statements": [ + { + "nativeSrc": "28656:29:70", + "nodeType": "YulAssignment", + "src": "28656:29:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "28678:6:70", + "nodeType": "YulIdentifier", + "src": "28678:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "28665:12:70", + "nodeType": "YulIdentifier", + "src": "28665:12:70" + }, + "nativeSrc": "28665:20:70", + "nodeType": "YulFunctionCall", + "src": "28665:20:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "28656:5:70", + "nodeType": "YulIdentifier", + "src": "28656:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "28718:5:70", + "nodeType": "YulIdentifier", + "src": "28718:5:70" + } + ], + "functionName": { + "name": "validator_revert_uint64", + "nativeSrc": "28694:23:70", + "nodeType": "YulIdentifier", + "src": "28694:23:70" + }, + "nativeSrc": "28694:30:70", + "nodeType": "YulFunctionCall", + "src": "28694:30:70" + }, + "nativeSrc": "28694:30:70", + "nodeType": "YulExpressionStatement", + "src": "28694:30:70" + } + ] + }, + "name": "abi_decode_uint64", + "nativeSrc": "28598:132:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "28625:6:70", + "nodeType": "YulTypedName", + "src": "28625:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "28636:5:70", + "nodeType": "YulTypedName", + "src": "28636:5:70", + "type": "" + } + ], + "src": "28598:132:70" + }, + { + "body": { + "nativeSrc": "28784:124:70", + "nodeType": "YulBlock", + "src": "28784:124:70", + "statements": [ + { + "nativeSrc": "28794:29:70", + "nodeType": "YulAssignment", + "src": "28794:29:70", + "value": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "28816:6:70", + "nodeType": "YulIdentifier", + "src": "28816:6:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "28803:12:70", + "nodeType": "YulIdentifier", + "src": "28803:12:70" + }, + "nativeSrc": "28803:20:70", + "nodeType": "YulFunctionCall", + "src": "28803:20:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "28794:5:70", + "nodeType": "YulIdentifier", + "src": "28794:5:70" + } + ] + }, + { + "body": { + "nativeSrc": "28886:16:70", + "nodeType": "YulBlock", + "src": "28886:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "28895:1:70", + "nodeType": "YulLiteral", + "src": "28895:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "28898:1:70", + "nodeType": "YulLiteral", + "src": "28898:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "28888:6:70", + "nodeType": "YulIdentifier", + "src": "28888:6:70" + }, + "nativeSrc": "28888:12:70", + "nodeType": "YulFunctionCall", + "src": "28888:12:70" + }, + "nativeSrc": "28888:12:70", + "nodeType": "YulExpressionStatement", + "src": "28888:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "28845:5:70", + "nodeType": "YulIdentifier", + "src": "28845:5:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "28856:5:70", + "nodeType": "YulIdentifier", + "src": "28856:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "28871:3:70", + "nodeType": "YulLiteral", + "src": "28871:3:70", + "type": "", + "value": "128" + }, + { + "kind": "number", + "nativeSrc": "28876:1:70", + "nodeType": "YulLiteral", + "src": "28876:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "28867:3:70", + "nodeType": "YulIdentifier", + "src": "28867:3:70" + }, + "nativeSrc": "28867:11:70", + "nodeType": "YulFunctionCall", + "src": "28867:11:70" + }, + { + "kind": "number", + "nativeSrc": "28880:1:70", + "nodeType": "YulLiteral", + "src": "28880:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "28863:3:70", + "nodeType": "YulIdentifier", + "src": "28863:3:70" + }, + "nativeSrc": "28863:19:70", + "nodeType": "YulFunctionCall", + "src": "28863:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "28852:3:70", + "nodeType": "YulIdentifier", + "src": "28852:3:70" + }, + "nativeSrc": "28852:31:70", + "nodeType": "YulFunctionCall", + "src": "28852:31:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "28842:2:70", + "nodeType": "YulIdentifier", + "src": "28842:2:70" + }, + "nativeSrc": "28842:42:70", + "nodeType": "YulFunctionCall", + "src": "28842:42:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "28835:6:70", + "nodeType": "YulIdentifier", + "src": "28835:6:70" + }, + "nativeSrc": "28835:50:70", + "nodeType": "YulFunctionCall", + "src": "28835:50:70" + }, + "nativeSrc": "28832:70:70", + "nodeType": "YulIf", + "src": "28832:70:70" + } + ] + }, + "name": "abi_decode_uint128", + "nativeSrc": "28735:173:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nativeSrc": "28763:6:70", + "nodeType": "YulTypedName", + "src": "28763:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nativeSrc": "28774:5:70", + "nodeType": "YulTypedName", + "src": "28774:5:70", + "type": "" + } + ], + "src": "28735:173:70" + }, + { + "body": { + "nativeSrc": "29027:1514:70", + "nodeType": "YulBlock", + "src": "29027:1514:70", + "statements": [ + { + "body": { + "nativeSrc": "29073:16:70", + "nodeType": "YulBlock", + "src": "29073:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29082:1:70", + "nodeType": "YulLiteral", + "src": "29082:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "29085:1:70", + "nodeType": "YulLiteral", + "src": "29085:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "29075:6:70", + "nodeType": "YulIdentifier", + "src": "29075:6:70" + }, + "nativeSrc": "29075:12:70", + "nodeType": "YulFunctionCall", + "src": "29075:12:70" + }, + "nativeSrc": "29075:12:70", + "nodeType": "YulExpressionStatement", + "src": "29075:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "29048:7:70", + "nodeType": "YulIdentifier", + "src": "29048:7:70" + }, + { + "name": "headStart", + "nativeSrc": "29057:9:70", + "nodeType": "YulIdentifier", + "src": "29057:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "29044:3:70", + "nodeType": "YulIdentifier", + "src": "29044:3:70" + }, + "nativeSrc": "29044:23:70", + "nodeType": "YulFunctionCall", + "src": "29044:23:70" + }, + { + "kind": "number", + "nativeSrc": "29069:2:70", + "nodeType": "YulLiteral", + "src": "29069:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "29040:3:70", + "nodeType": "YulIdentifier", + "src": "29040:3:70" + }, + "nativeSrc": "29040:32:70", + "nodeType": "YulFunctionCall", + "src": "29040:32:70" + }, + "nativeSrc": "29037:52:70", + "nodeType": "YulIf", + "src": "29037:52:70" + }, + { + "nativeSrc": "29098:37:70", + "nodeType": "YulVariableDeclaration", + "src": "29098:37:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "29125:9:70", + "nodeType": "YulIdentifier", + "src": "29125:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "29112:12:70", + "nodeType": "YulIdentifier", + "src": "29112:12:70" + }, + "nativeSrc": "29112:23:70", + "nodeType": "YulFunctionCall", + "src": "29112:23:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "29102:6:70", + "nodeType": "YulTypedName", + "src": "29102:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "29178:16:70", + "nodeType": "YulBlock", + "src": "29178:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29187:1:70", + "nodeType": "YulLiteral", + "src": "29187:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "29190:1:70", + "nodeType": "YulLiteral", + "src": "29190:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "29180:6:70", + "nodeType": "YulIdentifier", + "src": "29180:6:70" + }, + "nativeSrc": "29180:12:70", + "nodeType": "YulFunctionCall", + "src": "29180:12:70" + }, + "nativeSrc": "29180:12:70", + "nodeType": "YulExpressionStatement", + "src": "29180:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "29150:6:70", + "nodeType": "YulIdentifier", + "src": "29150:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29166:2:70", + "nodeType": "YulLiteral", + "src": "29166:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "29170:1:70", + "nodeType": "YulLiteral", + "src": "29170:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "29162:3:70", + "nodeType": "YulIdentifier", + "src": "29162:3:70" + }, + "nativeSrc": "29162:10:70", + "nodeType": "YulFunctionCall", + "src": "29162:10:70" + }, + { + "kind": "number", + "nativeSrc": "29174:1:70", + "nodeType": "YulLiteral", + "src": "29174:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "29158:3:70", + "nodeType": "YulIdentifier", + "src": "29158:3:70" + }, + "nativeSrc": "29158:18:70", + "nodeType": "YulFunctionCall", + "src": "29158:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "29147:2:70", + "nodeType": "YulIdentifier", + "src": "29147:2:70" + }, + "nativeSrc": "29147:30:70", + "nodeType": "YulFunctionCall", + "src": "29147:30:70" + }, + "nativeSrc": "29144:50:70", + "nodeType": "YulIf", + "src": "29144:50:70" + }, + { + "nativeSrc": "29203:32:70", + "nodeType": "YulVariableDeclaration", + "src": "29203:32:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "29217:9:70", + "nodeType": "YulIdentifier", + "src": "29217:9:70" + }, + { + "name": "offset", + "nativeSrc": "29228:6:70", + "nodeType": "YulIdentifier", + "src": "29228:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29213:3:70", + "nodeType": "YulIdentifier", + "src": "29213:3:70" + }, + "nativeSrc": "29213:22:70", + "nodeType": "YulFunctionCall", + "src": "29213:22:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "29207:2:70", + "nodeType": "YulTypedName", + "src": "29207:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "29273:16:70", + "nodeType": "YulBlock", + "src": "29273:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29282:1:70", + "nodeType": "YulLiteral", + "src": "29282:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "29285:1:70", + "nodeType": "YulLiteral", + "src": "29285:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "29275:6:70", + "nodeType": "YulIdentifier", + "src": "29275:6:70" + }, + "nativeSrc": "29275:12:70", + "nodeType": "YulFunctionCall", + "src": "29275:12:70" + }, + "nativeSrc": "29275:12:70", + "nodeType": "YulExpressionStatement", + "src": "29275:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "29255:7:70", + "nodeType": "YulIdentifier", + "src": "29255:7:70" + }, + { + "name": "_1", + "nativeSrc": "29264:2:70", + "nodeType": "YulIdentifier", + "src": "29264:2:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "29251:3:70", + "nodeType": "YulIdentifier", + "src": "29251:3:70" + }, + "nativeSrc": "29251:16:70", + "nodeType": "YulFunctionCall", + "src": "29251:16:70" + }, + { + "kind": "number", + "nativeSrc": "29269:2:70", + "nodeType": "YulLiteral", + "src": "29269:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "29247:3:70", + "nodeType": "YulIdentifier", + "src": "29247:3:70" + }, + "nativeSrc": "29247:25:70", + "nodeType": "YulFunctionCall", + "src": "29247:25:70" + }, + "nativeSrc": "29244:45:70", + "nodeType": "YulIf", + "src": "29244:45:70" + }, + { + "nativeSrc": "29298:35:70", + "nodeType": "YulVariableDeclaration", + "src": "29298:35:70", + "value": { + "arguments": [], + "functionName": { + "name": "allocate_memory_4301", + "nativeSrc": "29311:20:70", + "nodeType": "YulIdentifier", + "src": "29311:20:70" + }, + "nativeSrc": "29311:22:70", + "nodeType": "YulFunctionCall", + "src": "29311:22:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "29302:5:70", + "nodeType": "YulTypedName", + "src": "29302:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "29342:32:70", + "nodeType": "YulVariableDeclaration", + "src": "29342:32:70", + "value": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "29371:2:70", + "nodeType": "YulIdentifier", + "src": "29371:2:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "29358:12:70", + "nodeType": "YulIdentifier", + "src": "29358:12:70" + }, + "nativeSrc": "29358:16:70", + "nodeType": "YulFunctionCall", + "src": "29358:16:70" + }, + "variables": [ + { + "name": "offset_1", + "nativeSrc": "29346:8:70", + "nodeType": "YulTypedName", + "src": "29346:8:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "29419:16:70", + "nodeType": "YulBlock", + "src": "29419:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29428:1:70", + "nodeType": "YulLiteral", + "src": "29428:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "29431:1:70", + "nodeType": "YulLiteral", + "src": "29431:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "29421:6:70", + "nodeType": "YulIdentifier", + "src": "29421:6:70" + }, + "nativeSrc": "29421:12:70", + "nodeType": "YulFunctionCall", + "src": "29421:12:70" + }, + "nativeSrc": "29421:12:70", + "nodeType": "YulExpressionStatement", + "src": "29421:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nativeSrc": "29389:8:70", + "nodeType": "YulIdentifier", + "src": "29389:8:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29407:2:70", + "nodeType": "YulLiteral", + "src": "29407:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "29411:1:70", + "nodeType": "YulLiteral", + "src": "29411:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "29403:3:70", + "nodeType": "YulIdentifier", + "src": "29403:3:70" + }, + "nativeSrc": "29403:10:70", + "nodeType": "YulFunctionCall", + "src": "29403:10:70" + }, + { + "kind": "number", + "nativeSrc": "29415:1:70", + "nodeType": "YulLiteral", + "src": "29415:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "29399:3:70", + "nodeType": "YulIdentifier", + "src": "29399:3:70" + }, + "nativeSrc": "29399:18:70", + "nodeType": "YulFunctionCall", + "src": "29399:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "29386:2:70", + "nodeType": "YulIdentifier", + "src": "29386:2:70" + }, + "nativeSrc": "29386:32:70", + "nodeType": "YulFunctionCall", + "src": "29386:32:70" + }, + "nativeSrc": "29383:52:70", + "nodeType": "YulIf", + "src": "29383:52:70" + }, + { + "nativeSrc": "29444:27:70", + "nodeType": "YulVariableDeclaration", + "src": "29444:27:70", + "value": { + "arguments": [ + { + "name": "_1", + "nativeSrc": "29458:2:70", + "nodeType": "YulIdentifier", + "src": "29458:2:70" + }, + { + "name": "offset_1", + "nativeSrc": "29462:8:70", + "nodeType": "YulIdentifier", + "src": "29462:8:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29454:3:70", + "nodeType": "YulIdentifier", + "src": "29454:3:70" + }, + "nativeSrc": "29454:17:70", + "nodeType": "YulFunctionCall", + "src": "29454:17:70" + }, + "variables": [ + { + "name": "_2", + "nativeSrc": "29448:2:70", + "nodeType": "YulTypedName", + "src": "29448:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "29511:16:70", + "nodeType": "YulBlock", + "src": "29511:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "29520:1:70", + "nodeType": "YulLiteral", + "src": "29520:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "29523:1:70", + "nodeType": "YulLiteral", + "src": "29523:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "29513:6:70", + "nodeType": "YulIdentifier", + "src": "29513:6:70" + }, + "nativeSrc": "29513:12:70", + "nodeType": "YulFunctionCall", + "src": "29513:12:70" + }, + "nativeSrc": "29513:12:70", + "nodeType": "YulExpressionStatement", + "src": "29513:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "29491:7:70", + "nodeType": "YulIdentifier", + "src": "29491:7:70" + }, + { + "name": "_2", + "nativeSrc": "29500:2:70", + "nodeType": "YulIdentifier", + "src": "29500:2:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "29487:3:70", + "nodeType": "YulIdentifier", + "src": "29487:3:70" + }, + "nativeSrc": "29487:16:70", + "nodeType": "YulFunctionCall", + "src": "29487:16:70" + }, + { + "kind": "number", + "nativeSrc": "29505:4:70", + "nodeType": "YulLiteral", + "src": "29505:4:70", + "type": "", + "value": "0xe0" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "29483:3:70", + "nodeType": "YulIdentifier", + "src": "29483:3:70" + }, + "nativeSrc": "29483:27:70", + "nodeType": "YulFunctionCall", + "src": "29483:27:70" + }, + "nativeSrc": "29480:47:70", + "nodeType": "YulIf", + "src": "29480:47:70" + }, + { + "nativeSrc": "29536:32:70", + "nodeType": "YulVariableDeclaration", + "src": "29536:32:70", + "value": { + "arguments": [], + "functionName": { + "name": "allocate_memory", + "nativeSrc": "29551:15:70", + "nodeType": "YulIdentifier", + "src": "29551:15:70" + }, + "nativeSrc": "29551:17:70", + "nodeType": "YulFunctionCall", + "src": "29551:17:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "29540:7:70", + "nodeType": "YulTypedName", + "src": "29540:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "29577:16:70", + "nodeType": "YulVariableDeclaration", + "src": "29577:16:70", + "value": { + "kind": "number", + "nativeSrc": "29592:1:70", + "nodeType": "YulLiteral", + "src": "29592:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "29581:7:70", + "nodeType": "YulTypedName", + "src": "29581:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "29602:27:70", + "nodeType": "YulAssignment", + "src": "29602:27:70", + "value": { + "arguments": [ + { + "name": "_2", + "nativeSrc": "29626:2:70", + "nodeType": "YulIdentifier", + "src": "29626:2:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "29613:12:70", + "nodeType": "YulIdentifier", + "src": "29613:12:70" + }, + "nativeSrc": "29613:16:70", + "nodeType": "YulFunctionCall", + "src": "29613:16:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "29602:7:70", + "nodeType": "YulIdentifier", + "src": "29602:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "29645:7:70", + "nodeType": "YulIdentifier", + "src": "29645:7:70" + }, + { + "name": "value_2", + "nativeSrc": "29654:7:70", + "nodeType": "YulIdentifier", + "src": "29654:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "29638:6:70", + "nodeType": "YulIdentifier", + "src": "29638:6:70" + }, + "nativeSrc": "29638:24:70", + "nodeType": "YulFunctionCall", + "src": "29638:24:70" + }, + "nativeSrc": "29638:24:70", + "nodeType": "YulExpressionStatement", + "src": "29638:24:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "29682:7:70", + "nodeType": "YulIdentifier", + "src": "29682:7:70" + }, + { + "kind": "number", + "nativeSrc": "29691:2:70", + "nodeType": "YulLiteral", + "src": "29691:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29678:3:70", + "nodeType": "YulIdentifier", + "src": "29678:3:70" + }, + "nativeSrc": "29678:16:70", + "nodeType": "YulFunctionCall", + "src": "29678:16:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "29719:2:70", + "nodeType": "YulIdentifier", + "src": "29719:2:70" + }, + { + "kind": "number", + "nativeSrc": "29723:2:70", + "nodeType": "YulLiteral", + "src": "29723:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29715:3:70", + "nodeType": "YulIdentifier", + "src": "29715:3:70" + }, + "nativeSrc": "29715:11:70", + "nodeType": "YulFunctionCall", + "src": "29715:11:70" + } + ], + "functionName": { + "name": "abi_decode_address", + "nativeSrc": "29696:18:70", + "nodeType": "YulIdentifier", + "src": "29696:18:70" + }, + "nativeSrc": "29696:31:70", + "nodeType": "YulFunctionCall", + "src": "29696:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "29671:6:70", + "nodeType": "YulIdentifier", + "src": "29671:6:70" + }, + "nativeSrc": "29671:57:70", + "nodeType": "YulFunctionCall", + "src": "29671:57:70" + }, + "nativeSrc": "29671:57:70", + "nodeType": "YulExpressionStatement", + "src": "29671:57:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "29748:7:70", + "nodeType": "YulIdentifier", + "src": "29748:7:70" + }, + { + "kind": "number", + "nativeSrc": "29757:2:70", + "nodeType": "YulLiteral", + "src": "29757:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29744:3:70", + "nodeType": "YulIdentifier", + "src": "29744:3:70" + }, + "nativeSrc": "29744:16:70", + "nodeType": "YulFunctionCall", + "src": "29744:16:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "29785:2:70", + "nodeType": "YulIdentifier", + "src": "29785:2:70" + }, + { + "kind": "number", + "nativeSrc": "29789:2:70", + "nodeType": "YulLiteral", + "src": "29789:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29781:3:70", + "nodeType": "YulIdentifier", + "src": "29781:3:70" + }, + "nativeSrc": "29781:11:70", + "nodeType": "YulFunctionCall", + "src": "29781:11:70" + } + ], + "functionName": { + "name": "abi_decode_address", + "nativeSrc": "29762:18:70", + "nodeType": "YulIdentifier", + "src": "29762:18:70" + }, + "nativeSrc": "29762:31:70", + "nodeType": "YulFunctionCall", + "src": "29762:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "29737:6:70", + "nodeType": "YulIdentifier", + "src": "29737:6:70" + }, + "nativeSrc": "29737:57:70", + "nodeType": "YulFunctionCall", + "src": "29737:57:70" + }, + "nativeSrc": "29737:57:70", + "nodeType": "YulExpressionStatement", + "src": "29737:57:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "29814:7:70", + "nodeType": "YulIdentifier", + "src": "29814:7:70" + }, + { + "kind": "number", + "nativeSrc": "29823:2:70", + "nodeType": "YulLiteral", + "src": "29823:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29810:3:70", + "nodeType": "YulIdentifier", + "src": "29810:3:70" + }, + "nativeSrc": "29810:16:70", + "nodeType": "YulFunctionCall", + "src": "29810:16:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "29851:2:70", + "nodeType": "YulIdentifier", + "src": "29851:2:70" + }, + { + "kind": "number", + "nativeSrc": "29855:2:70", + "nodeType": "YulLiteral", + "src": "29855:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29847:3:70", + "nodeType": "YulIdentifier", + "src": "29847:3:70" + }, + "nativeSrc": "29847:11:70", + "nodeType": "YulFunctionCall", + "src": "29847:11:70" + } + ], + "functionName": { + "name": "abi_decode_address", + "nativeSrc": "29828:18:70", + "nodeType": "YulIdentifier", + "src": "29828:18:70" + }, + "nativeSrc": "29828:31:70", + "nodeType": "YulFunctionCall", + "src": "29828:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "29803:6:70", + "nodeType": "YulIdentifier", + "src": "29803:6:70" + }, + "nativeSrc": "29803:57:70", + "nodeType": "YulFunctionCall", + "src": "29803:57:70" + }, + "nativeSrc": "29803:57:70", + "nodeType": "YulExpressionStatement", + "src": "29803:57:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "29880:7:70", + "nodeType": "YulIdentifier", + "src": "29880:7:70" + }, + { + "kind": "number", + "nativeSrc": "29889:3:70", + "nodeType": "YulLiteral", + "src": "29889:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29876:3:70", + "nodeType": "YulIdentifier", + "src": "29876:3:70" + }, + "nativeSrc": "29876:17:70", + "nodeType": "YulFunctionCall", + "src": "29876:17:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "29917:2:70", + "nodeType": "YulIdentifier", + "src": "29917:2:70" + }, + { + "kind": "number", + "nativeSrc": "29921:3:70", + "nodeType": "YulLiteral", + "src": "29921:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29913:3:70", + "nodeType": "YulIdentifier", + "src": "29913:3:70" + }, + "nativeSrc": "29913:12:70", + "nodeType": "YulFunctionCall", + "src": "29913:12:70" + } + ], + "functionName": { + "name": "abi_decode_uint64", + "nativeSrc": "29895:17:70", + "nodeType": "YulIdentifier", + "src": "29895:17:70" + }, + "nativeSrc": "29895:31:70", + "nodeType": "YulFunctionCall", + "src": "29895:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "29869:6:70", + "nodeType": "YulIdentifier", + "src": "29869:6:70" + }, + "nativeSrc": "29869:58:70", + "nodeType": "YulFunctionCall", + "src": "29869:58:70" + }, + "nativeSrc": "29869:58:70", + "nodeType": "YulExpressionStatement", + "src": "29869:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "29947:7:70", + "nodeType": "YulIdentifier", + "src": "29947:7:70" + }, + { + "kind": "number", + "nativeSrc": "29956:3:70", + "nodeType": "YulLiteral", + "src": "29956:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29943:3:70", + "nodeType": "YulIdentifier", + "src": "29943:3:70" + }, + "nativeSrc": "29943:17:70", + "nodeType": "YulFunctionCall", + "src": "29943:17:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "29985:2:70", + "nodeType": "YulIdentifier", + "src": "29985:2:70" + }, + { + "kind": "number", + "nativeSrc": "29989:3:70", + "nodeType": "YulLiteral", + "src": "29989:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "29981:3:70", + "nodeType": "YulIdentifier", + "src": "29981:3:70" + }, + "nativeSrc": "29981:12:70", + "nodeType": "YulFunctionCall", + "src": "29981:12:70" + } + ], + "functionName": { + "name": "abi_decode_uint128", + "nativeSrc": "29962:18:70", + "nodeType": "YulIdentifier", + "src": "29962:18:70" + }, + "nativeSrc": "29962:32:70", + "nodeType": "YulFunctionCall", + "src": "29962:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "29936:6:70", + "nodeType": "YulIdentifier", + "src": "29936:6:70" + }, + "nativeSrc": "29936:59:70", + "nodeType": "YulFunctionCall", + "src": "29936:59:70" + }, + "nativeSrc": "29936:59:70", + "nodeType": "YulExpressionStatement", + "src": "29936:59:70" + }, + { + "nativeSrc": "30004:42:70", + "nodeType": "YulVariableDeclaration", + "src": "30004:42:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "30037:2:70", + "nodeType": "YulIdentifier", + "src": "30037:2:70" + }, + { + "kind": "number", + "nativeSrc": "30041:3:70", + "nodeType": "YulLiteral", + "src": "30041:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30033:3:70", + "nodeType": "YulIdentifier", + "src": "30033:3:70" + }, + "nativeSrc": "30033:12:70", + "nodeType": "YulFunctionCall", + "src": "30033:12:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "30020:12:70", + "nodeType": "YulIdentifier", + "src": "30020:12:70" + }, + "nativeSrc": "30020:26:70", + "nodeType": "YulFunctionCall", + "src": "30020:26:70" + }, + "variables": [ + { + "name": "offset_2", + "nativeSrc": "30008:8:70", + "nodeType": "YulTypedName", + "src": "30008:8:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "30091:16:70", + "nodeType": "YulBlock", + "src": "30091:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "30100:1:70", + "nodeType": "YulLiteral", + "src": "30100:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "30103:1:70", + "nodeType": "YulLiteral", + "src": "30103:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "30093:6:70", + "nodeType": "YulIdentifier", + "src": "30093:6:70" + }, + "nativeSrc": "30093:12:70", + "nodeType": "YulFunctionCall", + "src": "30093:12:70" + }, + "nativeSrc": "30093:12:70", + "nodeType": "YulExpressionStatement", + "src": "30093:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_2", + "nativeSrc": "30061:8:70", + "nodeType": "YulIdentifier", + "src": "30061:8:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "30079:2:70", + "nodeType": "YulLiteral", + "src": "30079:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "30083:1:70", + "nodeType": "YulLiteral", + "src": "30083:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "30075:3:70", + "nodeType": "YulIdentifier", + "src": "30075:3:70" + }, + "nativeSrc": "30075:10:70", + "nodeType": "YulFunctionCall", + "src": "30075:10:70" + }, + { + "kind": "number", + "nativeSrc": "30087:1:70", + "nodeType": "YulLiteral", + "src": "30087:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "30071:3:70", + "nodeType": "YulIdentifier", + "src": "30071:3:70" + }, + "nativeSrc": "30071:18:70", + "nodeType": "YulFunctionCall", + "src": "30071:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "30058:2:70", + "nodeType": "YulIdentifier", + "src": "30058:2:70" + }, + "nativeSrc": "30058:32:70", + "nodeType": "YulFunctionCall", + "src": "30058:32:70" + }, + "nativeSrc": "30055:52:70", + "nodeType": "YulIf", + "src": "30055:52:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "30127:7:70", + "nodeType": "YulIdentifier", + "src": "30127:7:70" + }, + { + "kind": "number", + "nativeSrc": "30136:3:70", + "nodeType": "YulLiteral", + "src": "30136:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30123:3:70", + "nodeType": "YulIdentifier", + "src": "30123:3:70" + }, + "nativeSrc": "30123:17:70", + "nodeType": "YulFunctionCall", + "src": "30123:17:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nativeSrc": "30164:2:70", + "nodeType": "YulIdentifier", + "src": "30164:2:70" + }, + { + "name": "offset_2", + "nativeSrc": "30168:8:70", + "nodeType": "YulIdentifier", + "src": "30168:8:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30160:3:70", + "nodeType": "YulIdentifier", + "src": "30160:3:70" + }, + "nativeSrc": "30160:17:70", + "nodeType": "YulFunctionCall", + "src": "30160:17:70" + }, + { + "name": "dataEnd", + "nativeSrc": "30179:7:70", + "nodeType": "YulIdentifier", + "src": "30179:7:70" + } + ], + "functionName": { + "name": "abi_decode_string", + "nativeSrc": "30142:17:70", + "nodeType": "YulIdentifier", + "src": "30142:17:70" + }, + "nativeSrc": "30142:45:70", + "nodeType": "YulFunctionCall", + "src": "30142:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "30116:6:70", + "nodeType": "YulIdentifier", + "src": "30116:6:70" + }, + "nativeSrc": "30116:72:70", + "nodeType": "YulFunctionCall", + "src": "30116:72:70" + }, + "nativeSrc": "30116:72:70", + "nodeType": "YulExpressionStatement", + "src": "30116:72:70" + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "30204:5:70", + "nodeType": "YulIdentifier", + "src": "30204:5:70" + }, + { + "name": "value_1", + "nativeSrc": "30211:7:70", + "nodeType": "YulIdentifier", + "src": "30211:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "30197:6:70", + "nodeType": "YulIdentifier", + "src": "30197:6:70" + }, + "nativeSrc": "30197:22:70", + "nodeType": "YulFunctionCall", + "src": "30197:22:70" + }, + "nativeSrc": "30197:22:70", + "nodeType": "YulExpressionStatement", + "src": "30197:22:70" + }, + { + "nativeSrc": "30228:41:70", + "nodeType": "YulVariableDeclaration", + "src": "30228:41:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_1", + "nativeSrc": "30261:2:70", + "nodeType": "YulIdentifier", + "src": "30261:2:70" + }, + { + "kind": "number", + "nativeSrc": "30265:2:70", + "nodeType": "YulLiteral", + "src": "30265:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30257:3:70", + "nodeType": "YulIdentifier", + "src": "30257:3:70" + }, + "nativeSrc": "30257:11:70", + "nodeType": "YulFunctionCall", + "src": "30257:11:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "30244:12:70", + "nodeType": "YulIdentifier", + "src": "30244:12:70" + }, + "nativeSrc": "30244:25:70", + "nodeType": "YulFunctionCall", + "src": "30244:25:70" + }, + "variables": [ + { + "name": "offset_3", + "nativeSrc": "30232:8:70", + "nodeType": "YulTypedName", + "src": "30232:8:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "30314:16:70", + "nodeType": "YulBlock", + "src": "30314:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "30323:1:70", + "nodeType": "YulLiteral", + "src": "30323:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "30326:1:70", + "nodeType": "YulLiteral", + "src": "30326:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "30316:6:70", + "nodeType": "YulIdentifier", + "src": "30316:6:70" + }, + "nativeSrc": "30316:12:70", + "nodeType": "YulFunctionCall", + "src": "30316:12:70" + }, + "nativeSrc": "30316:12:70", + "nodeType": "YulExpressionStatement", + "src": "30316:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_3", + "nativeSrc": "30284:8:70", + "nodeType": "YulIdentifier", + "src": "30284:8:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "30302:2:70", + "nodeType": "YulLiteral", + "src": "30302:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "30306:1:70", + "nodeType": "YulLiteral", + "src": "30306:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "30298:3:70", + "nodeType": "YulIdentifier", + "src": "30298:3:70" + }, + "nativeSrc": "30298:10:70", + "nodeType": "YulFunctionCall", + "src": "30298:10:70" + }, + { + "kind": "number", + "nativeSrc": "30310:1:70", + "nodeType": "YulLiteral", + "src": "30310:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "30294:3:70", + "nodeType": "YulIdentifier", + "src": "30294:3:70" + }, + "nativeSrc": "30294:18:70", + "nodeType": "YulFunctionCall", + "src": "30294:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "30281:2:70", + "nodeType": "YulIdentifier", + "src": "30281:2:70" + }, + "nativeSrc": "30281:32:70", + "nodeType": "YulFunctionCall", + "src": "30281:32:70" + }, + "nativeSrc": "30278:52:70", + "nodeType": "YulIf", + "src": "30278:52:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nativeSrc": "30350:5:70", + "nodeType": "YulIdentifier", + "src": "30350:5:70" + }, + { + "kind": "number", + "nativeSrc": "30357:2:70", + "nodeType": "YulLiteral", + "src": "30357:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30346:3:70", + "nodeType": "YulIdentifier", + "src": "30346:3:70" + }, + "nativeSrc": "30346:14:70", + "nodeType": "YulFunctionCall", + "src": "30346:14:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "_1", + "nativeSrc": "30384:2:70", + "nodeType": "YulIdentifier", + "src": "30384:2:70" + }, + { + "name": "offset_3", + "nativeSrc": "30388:8:70", + "nodeType": "YulIdentifier", + "src": "30388:8:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30380:3:70", + "nodeType": "YulIdentifier", + "src": "30380:3:70" + }, + "nativeSrc": "30380:17:70", + "nodeType": "YulFunctionCall", + "src": "30380:17:70" + }, + { + "name": "dataEnd", + "nativeSrc": "30399:7:70", + "nodeType": "YulIdentifier", + "src": "30399:7:70" + } + ], + "functionName": { + "name": "abi_decode_string", + "nativeSrc": "30362:17:70", + "nodeType": "YulIdentifier", + "src": "30362:17:70" + }, + "nativeSrc": "30362:45:70", + "nodeType": "YulFunctionCall", + "src": "30362:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "30339:6:70", + "nodeType": "YulIdentifier", + "src": "30339:6:70" + }, + "nativeSrc": "30339:69:70", + "nodeType": "YulFunctionCall", + "src": "30339:69:70" + }, + "nativeSrc": "30339:69:70", + "nodeType": "YulExpressionStatement", + "src": "30339:69:70" + }, + { + "nativeSrc": "30417:15:70", + "nodeType": "YulAssignment", + "src": "30417:15:70", + "value": { + "name": "value", + "nativeSrc": "30427:5:70", + "nodeType": "YulIdentifier", + "src": "30427:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "30417:6:70", + "nodeType": "YulIdentifier", + "src": "30417:6:70" + } + ] + }, + { + "nativeSrc": "30441:16:70", + "nodeType": "YulVariableDeclaration", + "src": "30441:16:70", + "value": { + "kind": "number", + "nativeSrc": "30456:1:70", + "nodeType": "YulLiteral", + "src": "30456:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "30445:7:70", + "nodeType": "YulTypedName", + "src": "30445:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "30466:43:70", + "nodeType": "YulAssignment", + "src": "30466:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "30494:9:70", + "nodeType": "YulIdentifier", + "src": "30494:9:70" + }, + { + "kind": "number", + "nativeSrc": "30505:2:70", + "nodeType": "YulLiteral", + "src": "30505:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30490:3:70", + "nodeType": "YulIdentifier", + "src": "30490:3:70" + }, + "nativeSrc": "30490:18:70", + "nodeType": "YulFunctionCall", + "src": "30490:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "30477:12:70", + "nodeType": "YulIdentifier", + "src": "30477:12:70" + }, + "nativeSrc": "30477:32:70", + "nodeType": "YulFunctionCall", + "src": "30477:32:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "30466:7:70", + "nodeType": "YulIdentifier", + "src": "30466:7:70" + } + ] + }, + { + "nativeSrc": "30518:17:70", + "nodeType": "YulAssignment", + "src": "30518:17:70", + "value": { + "name": "value_3", + "nativeSrc": "30528:7:70", + "nodeType": "YulIdentifier", + "src": "30528:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "30518:6:70", + "nodeType": "YulIdentifier", + "src": "30518:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_SignedRAV_$2525_memory_ptrt_uint256", + "nativeSrc": "28913:1628:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "28985:9:70", + "nodeType": "YulTypedName", + "src": "28985:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "28996:7:70", + "nodeType": "YulTypedName", + "src": "28996:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "29008:6:70", + "nodeType": "YulTypedName", + "src": "29008:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "29016:6:70", + "nodeType": "YulTypedName", + "src": "29016:6:70", + "type": "" + } + ], + "src": "28913:1628:70" + }, + { + "body": { + "nativeSrc": "30736:207:70", + "nodeType": "YulBlock", + "src": "30736:207:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "30775:6:70", + "nodeType": "YulIdentifier", + "src": "30775:6:70" + }, + { + "name": "headStart", + "nativeSrc": "30783:9:70", + "nodeType": "YulIdentifier", + "src": "30783:9:70" + } + ], + "functionName": { + "name": "abi_encode_enum_PaymentTypes", + "nativeSrc": "30746:28:70", + "nodeType": "YulIdentifier", + "src": "30746:28:70" + }, + "nativeSrc": "30746:47:70", + "nodeType": "YulFunctionCall", + "src": "30746:47:70" + }, + "nativeSrc": "30746:47:70", + "nodeType": "YulExpressionStatement", + "src": "30746:47:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "30813:9:70", + "nodeType": "YulIdentifier", + "src": "30813:9:70" + }, + { + "kind": "number", + "nativeSrc": "30824:2:70", + "nodeType": "YulLiteral", + "src": "30824:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30809:3:70", + "nodeType": "YulIdentifier", + "src": "30809:3:70" + }, + "nativeSrc": "30809:18:70", + "nodeType": "YulFunctionCall", + "src": "30809:18:70" + }, + { + "kind": "number", + "nativeSrc": "30829:2:70", + "nodeType": "YulLiteral", + "src": "30829:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "30802:6:70", + "nodeType": "YulIdentifier", + "src": "30802:6:70" + }, + "nativeSrc": "30802:30:70", + "nodeType": "YulFunctionCall", + "src": "30802:30:70" + }, + "nativeSrc": "30802:30:70", + "nodeType": "YulExpressionStatement", + "src": "30802:30:70" + }, + { + "nativeSrc": "30841:53:70", + "nodeType": "YulAssignment", + "src": "30841:53:70", + "value": { + "arguments": [ + { + "name": "value1", + "nativeSrc": "30867:6:70", + "nodeType": "YulIdentifier", + "src": "30867:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "30879:9:70", + "nodeType": "YulIdentifier", + "src": "30879:9:70" + }, + { + "kind": "number", + "nativeSrc": "30890:2:70", + "nodeType": "YulLiteral", + "src": "30890:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30875:3:70", + "nodeType": "YulIdentifier", + "src": "30875:3:70" + }, + "nativeSrc": "30875:18:70", + "nodeType": "YulFunctionCall", + "src": "30875:18:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "30849:17:70", + "nodeType": "YulIdentifier", + "src": "30849:17:70" + }, + "nativeSrc": "30849:45:70", + "nodeType": "YulFunctionCall", + "src": "30849:45:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "30841:4:70", + "nodeType": "YulIdentifier", + "src": "30841:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "30914:9:70", + "nodeType": "YulIdentifier", + "src": "30914:9:70" + }, + { + "kind": "number", + "nativeSrc": "30925:2:70", + "nodeType": "YulLiteral", + "src": "30925:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "30910:3:70", + "nodeType": "YulIdentifier", + "src": "30910:3:70" + }, + "nativeSrc": "30910:18:70", + "nodeType": "YulFunctionCall", + "src": "30910:18:70" + }, + { + "name": "value2", + "nativeSrc": "30930:6:70", + "nodeType": "YulIdentifier", + "src": "30930:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "30903:6:70", + "nodeType": "YulIdentifier", + "src": "30903:6:70" + }, + "nativeSrc": "30903:34:70", + "nodeType": "YulFunctionCall", + "src": "30903:34:70" + }, + "nativeSrc": "30903:34:70", + "nodeType": "YulExpressionStatement", + "src": "30903:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_enum$_PaymentTypes_$2433_t_bytes_memory_ptr_t_uint256__to_t_uint8_t_bytes_memory_ptr_t_uint256__fromStack_reversed", + "nativeSrc": "30546:397:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "30689:9:70", + "nodeType": "YulTypedName", + "src": "30689:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "30700:6:70", + "nodeType": "YulTypedName", + "src": "30700:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "30708:6:70", + "nodeType": "YulTypedName", + "src": "30708:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "30716:6:70", + "nodeType": "YulTypedName", + "src": "30716:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "30727:4:70", + "nodeType": "YulTypedName", + "src": "30727:4:70", + "type": "" + } + ], + "src": "30546:397:70" + }, + { + "body": { + "nativeSrc": "31000:116:70", + "nodeType": "YulBlock", + "src": "31000:116:70", + "statements": [ + { + "nativeSrc": "31010:20:70", + "nodeType": "YulAssignment", + "src": "31010:20:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "31025:1:70", + "nodeType": "YulIdentifier", + "src": "31025:1:70" + }, + { + "name": "y", + "nativeSrc": "31028:1:70", + "nodeType": "YulIdentifier", + "src": "31028:1:70" + } + ], + "functionName": { + "name": "mul", + "nativeSrc": "31021:3:70", + "nodeType": "YulIdentifier", + "src": "31021:3:70" + }, + "nativeSrc": "31021:9:70", + "nodeType": "YulFunctionCall", + "src": "31021:9:70" + }, + "variableNames": [ + { + "name": "product", + "nativeSrc": "31010:7:70", + "nodeType": "YulIdentifier", + "src": "31010:7:70" + } + ] + }, + { + "body": { + "nativeSrc": "31088:22:70", + "nodeType": "YulBlock", + "src": "31088:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "31090:16:70", + "nodeType": "YulIdentifier", + "src": "31090:16:70" + }, + "nativeSrc": "31090:18:70", + "nodeType": "YulFunctionCall", + "src": "31090:18:70" + }, + "nativeSrc": "31090:18:70", + "nodeType": "YulExpressionStatement", + "src": "31090:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "x", + "nativeSrc": "31059:1:70", + "nodeType": "YulIdentifier", + "src": "31059:1:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "31052:6:70", + "nodeType": "YulIdentifier", + "src": "31052:6:70" + }, + "nativeSrc": "31052:9:70", + "nodeType": "YulFunctionCall", + "src": "31052:9:70" + }, + { + "arguments": [ + { + "name": "y", + "nativeSrc": "31066:1:70", + "nodeType": "YulIdentifier", + "src": "31066:1:70" + }, + { + "arguments": [ + { + "name": "product", + "nativeSrc": "31073:7:70", + "nodeType": "YulIdentifier", + "src": "31073:7:70" + }, + { + "name": "x", + "nativeSrc": "31082:1:70", + "nodeType": "YulIdentifier", + "src": "31082:1:70" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "31069:3:70", + "nodeType": "YulIdentifier", + "src": "31069:3:70" + }, + "nativeSrc": "31069:15:70", + "nodeType": "YulFunctionCall", + "src": "31069:15:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "31063:2:70", + "nodeType": "YulIdentifier", + "src": "31063:2:70" + }, + "nativeSrc": "31063:22:70", + "nodeType": "YulFunctionCall", + "src": "31063:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "31049:2:70", + "nodeType": "YulIdentifier", + "src": "31049:2:70" + }, + "nativeSrc": "31049:37:70", + "nodeType": "YulFunctionCall", + "src": "31049:37:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "31042:6:70", + "nodeType": "YulIdentifier", + "src": "31042:6:70" + }, + "nativeSrc": "31042:45:70", + "nodeType": "YulFunctionCall", + "src": "31042:45:70" + }, + "nativeSrc": "31039:71:70", + "nodeType": "YulIf", + "src": "31039:71:70" + } + ] + }, + "name": "checked_mul_t_uint256", + "nativeSrc": "30948:168:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "30979:1:70", + "nodeType": "YulTypedName", + "src": "30979:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "30982:1:70", + "nodeType": "YulTypedName", + "src": "30982:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "product", + "nativeSrc": "30988:7:70", + "nodeType": "YulTypedName", + "src": "30988:7:70", + "type": "" + } + ], + "src": "30948:168:70" + }, + { + "body": { + "nativeSrc": "31250:119:70", + "nodeType": "YulBlock", + "src": "31250:119:70", + "statements": [ + { + "nativeSrc": "31260:26:70", + "nodeType": "YulAssignment", + "src": "31260:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31272:9:70", + "nodeType": "YulIdentifier", + "src": "31272:9:70" + }, + { + "kind": "number", + "nativeSrc": "31283:2:70", + "nodeType": "YulLiteral", + "src": "31283:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "31268:3:70", + "nodeType": "YulIdentifier", + "src": "31268:3:70" + }, + "nativeSrc": "31268:18:70", + "nodeType": "YulFunctionCall", + "src": "31268:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "31260:4:70", + "nodeType": "YulIdentifier", + "src": "31260:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31302:9:70", + "nodeType": "YulIdentifier", + "src": "31302:9:70" + }, + { + "name": "value0", + "nativeSrc": "31313:6:70", + "nodeType": "YulIdentifier", + "src": "31313:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "31295:6:70", + "nodeType": "YulIdentifier", + "src": "31295:6:70" + }, + "nativeSrc": "31295:25:70", + "nodeType": "YulFunctionCall", + "src": "31295:25:70" + }, + "nativeSrc": "31295:25:70", + "nodeType": "YulExpressionStatement", + "src": "31295:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31340:9:70", + "nodeType": "YulIdentifier", + "src": "31340:9:70" + }, + { + "kind": "number", + "nativeSrc": "31351:2:70", + "nodeType": "YulLiteral", + "src": "31351:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "31336:3:70", + "nodeType": "YulIdentifier", + "src": "31336:3:70" + }, + "nativeSrc": "31336:18:70", + "nodeType": "YulFunctionCall", + "src": "31336:18:70" + }, + { + "name": "value1", + "nativeSrc": "31356:6:70", + "nodeType": "YulIdentifier", + "src": "31356:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "31329:6:70", + "nodeType": "YulIdentifier", + "src": "31329:6:70" + }, + "nativeSrc": "31329:34:70", + "nodeType": "YulFunctionCall", + "src": "31329:34:70" + }, + "nativeSrc": "31329:34:70", + "nodeType": "YulExpressionStatement", + "src": "31329:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint256__to_t_bytes32_t_uint256__fromStack_reversed", + "nativeSrc": "31121:248:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "31211:9:70", + "nodeType": "YulTypedName", + "src": "31211:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "31222:6:70", + "nodeType": "YulTypedName", + "src": "31222:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "31230:6:70", + "nodeType": "YulTypedName", + "src": "31230:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "31241:4:70", + "nodeType": "YulTypedName", + "src": "31241:4:70", + "type": "" + } + ], + "src": "31121:248:70" + }, + { + "body": { + "nativeSrc": "31531:162:70", + "nodeType": "YulBlock", + "src": "31531:162:70", + "statements": [ + { + "nativeSrc": "31541:26:70", + "nodeType": "YulAssignment", + "src": "31541:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31553:9:70", + "nodeType": "YulIdentifier", + "src": "31553:9:70" + }, + { + "kind": "number", + "nativeSrc": "31564:2:70", + "nodeType": "YulLiteral", + "src": "31564:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "31549:3:70", + "nodeType": "YulIdentifier", + "src": "31549:3:70" + }, + "nativeSrc": "31549:18:70", + "nodeType": "YulFunctionCall", + "src": "31549:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "31541:4:70", + "nodeType": "YulIdentifier", + "src": "31541:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31583:9:70", + "nodeType": "YulIdentifier", + "src": "31583:9:70" + }, + { + "name": "value0", + "nativeSrc": "31594:6:70", + "nodeType": "YulIdentifier", + "src": "31594:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "31576:6:70", + "nodeType": "YulIdentifier", + "src": "31576:6:70" + }, + "nativeSrc": "31576:25:70", + "nodeType": "YulFunctionCall", + "src": "31576:25:70" + }, + "nativeSrc": "31576:25:70", + "nodeType": "YulExpressionStatement", + "src": "31576:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31621:9:70", + "nodeType": "YulIdentifier", + "src": "31621:9:70" + }, + { + "kind": "number", + "nativeSrc": "31632:2:70", + "nodeType": "YulLiteral", + "src": "31632:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "31617:3:70", + "nodeType": "YulIdentifier", + "src": "31617:3:70" + }, + "nativeSrc": "31617:18:70", + "nodeType": "YulFunctionCall", + "src": "31617:18:70" + }, + { + "name": "value1", + "nativeSrc": "31637:6:70", + "nodeType": "YulIdentifier", + "src": "31637:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "31610:6:70", + "nodeType": "YulIdentifier", + "src": "31610:6:70" + }, + "nativeSrc": "31610:34:70", + "nodeType": "YulFunctionCall", + "src": "31610:34:70" + }, + "nativeSrc": "31610:34:70", + "nodeType": "YulExpressionStatement", + "src": "31610:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31664:9:70", + "nodeType": "YulIdentifier", + "src": "31664:9:70" + }, + { + "kind": "number", + "nativeSrc": "31675:2:70", + "nodeType": "YulLiteral", + "src": "31675:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "31660:3:70", + "nodeType": "YulIdentifier", + "src": "31660:3:70" + }, + "nativeSrc": "31660:18:70", + "nodeType": "YulFunctionCall", + "src": "31660:18:70" + }, + { + "name": "value2", + "nativeSrc": "31680:6:70", + "nodeType": "YulIdentifier", + "src": "31680:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "31653:6:70", + "nodeType": "YulIdentifier", + "src": "31653:6:70" + }, + "nativeSrc": "31653:34:70", + "nodeType": "YulFunctionCall", + "src": "31653:34:70" + }, + "nativeSrc": "31653:34:70", + "nodeType": "YulExpressionStatement", + "src": "31653:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint256_t_uint256__to_t_bytes32_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "31374:319:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "31484:9:70", + "nodeType": "YulTypedName", + "src": "31484:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "31495:6:70", + "nodeType": "YulTypedName", + "src": "31495:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "31503:6:70", + "nodeType": "YulTypedName", + "src": "31503:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "31511:6:70", + "nodeType": "YulTypedName", + "src": "31511:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "31522:4:70", + "nodeType": "YulTypedName", + "src": "31522:4:70", + "type": "" + } + ], + "src": "31374:319:70" + }, + { + "body": { + "nativeSrc": "31819:463:70", + "nodeType": "YulBlock", + "src": "31819:463:70", + "statements": [ + { + "body": { + "nativeSrc": "31865:16:70", + "nodeType": "YulBlock", + "src": "31865:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "31874:1:70", + "nodeType": "YulLiteral", + "src": "31874:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "31877:1:70", + "nodeType": "YulLiteral", + "src": "31877:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "31867:6:70", + "nodeType": "YulIdentifier", + "src": "31867:6:70" + }, + "nativeSrc": "31867:12:70", + "nodeType": "YulFunctionCall", + "src": "31867:12:70" + }, + "nativeSrc": "31867:12:70", + "nodeType": "YulExpressionStatement", + "src": "31867:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "31840:7:70", + "nodeType": "YulIdentifier", + "src": "31840:7:70" + }, + { + "name": "headStart", + "nativeSrc": "31849:9:70", + "nodeType": "YulIdentifier", + "src": "31849:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "31836:3:70", + "nodeType": "YulIdentifier", + "src": "31836:3:70" + }, + "nativeSrc": "31836:23:70", + "nodeType": "YulFunctionCall", + "src": "31836:23:70" + }, + { + "kind": "number", + "nativeSrc": "31861:2:70", + "nodeType": "YulLiteral", + "src": "31861:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "31832:3:70", + "nodeType": "YulIdentifier", + "src": "31832:3:70" + }, + "nativeSrc": "31832:32:70", + "nodeType": "YulFunctionCall", + "src": "31832:32:70" + }, + "nativeSrc": "31829:52:70", + "nodeType": "YulIf", + "src": "31829:52:70" + }, + { + "nativeSrc": "31890:36:70", + "nodeType": "YulVariableDeclaration", + "src": "31890:36:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "31916:9:70", + "nodeType": "YulIdentifier", + "src": "31916:9:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "31903:12:70", + "nodeType": "YulIdentifier", + "src": "31903:12:70" + }, + "nativeSrc": "31903:23:70", + "nodeType": "YulFunctionCall", + "src": "31903:23:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "31894:5:70", + "nodeType": "YulTypedName", + "src": "31894:5:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nativeSrc": "31960:5:70", + "nodeType": "YulIdentifier", + "src": "31960:5:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "31935:24:70", + "nodeType": "YulIdentifier", + "src": "31935:24:70" + }, + "nativeSrc": "31935:31:70", + "nodeType": "YulFunctionCall", + "src": "31935:31:70" + }, + "nativeSrc": "31935:31:70", + "nodeType": "YulExpressionStatement", + "src": "31935:31:70" + }, + { + "nativeSrc": "31975:15:70", + "nodeType": "YulAssignment", + "src": "31975:15:70", + "value": { + "name": "value", + "nativeSrc": "31985:5:70", + "nodeType": "YulIdentifier", + "src": "31985:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "31975:6:70", + "nodeType": "YulIdentifier", + "src": "31975:6:70" + } + ] + }, + { + "nativeSrc": "31999:16:70", + "nodeType": "YulVariableDeclaration", + "src": "31999:16:70", + "value": { + "kind": "number", + "nativeSrc": "32014:1:70", + "nodeType": "YulLiteral", + "src": "32014:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "32003:7:70", + "nodeType": "YulTypedName", + "src": "32003:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "32024:43:70", + "nodeType": "YulAssignment", + "src": "32024:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32052:9:70", + "nodeType": "YulIdentifier", + "src": "32052:9:70" + }, + { + "kind": "number", + "nativeSrc": "32063:2:70", + "nodeType": "YulLiteral", + "src": "32063:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32048:3:70", + "nodeType": "YulIdentifier", + "src": "32048:3:70" + }, + "nativeSrc": "32048:18:70", + "nodeType": "YulFunctionCall", + "src": "32048:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "32035:12:70", + "nodeType": "YulIdentifier", + "src": "32035:12:70" + }, + "nativeSrc": "32035:32:70", + "nodeType": "YulFunctionCall", + "src": "32035:32:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "32024:7:70", + "nodeType": "YulIdentifier", + "src": "32024:7:70" + } + ] + }, + { + "nativeSrc": "32076:17:70", + "nodeType": "YulAssignment", + "src": "32076:17:70", + "value": { + "name": "value_1", + "nativeSrc": "32086:7:70", + "nodeType": "YulIdentifier", + "src": "32086:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "32076:6:70", + "nodeType": "YulIdentifier", + "src": "32076:6:70" + } + ] + }, + { + "nativeSrc": "32102:46:70", + "nodeType": "YulVariableDeclaration", + "src": "32102:46:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32133:9:70", + "nodeType": "YulIdentifier", + "src": "32133:9:70" + }, + { + "kind": "number", + "nativeSrc": "32144:2:70", + "nodeType": "YulLiteral", + "src": "32144:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32129:3:70", + "nodeType": "YulIdentifier", + "src": "32129:3:70" + }, + "nativeSrc": "32129:18:70", + "nodeType": "YulFunctionCall", + "src": "32129:18:70" + } + ], + "functionName": { + "name": "calldataload", + "nativeSrc": "32116:12:70", + "nodeType": "YulIdentifier", + "src": "32116:12:70" + }, + "nativeSrc": "32116:32:70", + "nodeType": "YulFunctionCall", + "src": "32116:32:70" + }, + "variables": [ + { + "name": "offset", + "nativeSrc": "32106:6:70", + "nodeType": "YulTypedName", + "src": "32106:6:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "32191:16:70", + "nodeType": "YulBlock", + "src": "32191:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "32200:1:70", + "nodeType": "YulLiteral", + "src": "32200:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "32203:1:70", + "nodeType": "YulLiteral", + "src": "32203:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "32193:6:70", + "nodeType": "YulIdentifier", + "src": "32193:6:70" + }, + "nativeSrc": "32193:12:70", + "nodeType": "YulFunctionCall", + "src": "32193:12:70" + }, + "nativeSrc": "32193:12:70", + "nodeType": "YulExpressionStatement", + "src": "32193:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nativeSrc": "32163:6:70", + "nodeType": "YulIdentifier", + "src": "32163:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "32179:2:70", + "nodeType": "YulLiteral", + "src": "32179:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "32183:1:70", + "nodeType": "YulLiteral", + "src": "32183:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "32175:3:70", + "nodeType": "YulIdentifier", + "src": "32175:3:70" + }, + "nativeSrc": "32175:10:70", + "nodeType": "YulFunctionCall", + "src": "32175:10:70" + }, + { + "kind": "number", + "nativeSrc": "32187:1:70", + "nodeType": "YulLiteral", + "src": "32187:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "32171:3:70", + "nodeType": "YulIdentifier", + "src": "32171:3:70" + }, + "nativeSrc": "32171:18:70", + "nodeType": "YulFunctionCall", + "src": "32171:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "32160:2:70", + "nodeType": "YulIdentifier", + "src": "32160:2:70" + }, + "nativeSrc": "32160:30:70", + "nodeType": "YulFunctionCall", + "src": "32160:30:70" + }, + "nativeSrc": "32157:50:70", + "nodeType": "YulIf", + "src": "32157:50:70" + }, + { + "nativeSrc": "32216:60:70", + "nodeType": "YulAssignment", + "src": "32216:60:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32248:9:70", + "nodeType": "YulIdentifier", + "src": "32248:9:70" + }, + { + "name": "offset", + "nativeSrc": "32259:6:70", + "nodeType": "YulIdentifier", + "src": "32259:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32244:3:70", + "nodeType": "YulIdentifier", + "src": "32244:3:70" + }, + "nativeSrc": "32244:22:70", + "nodeType": "YulFunctionCall", + "src": "32244:22:70" + }, + { + "name": "dataEnd", + "nativeSrc": "32268:7:70", + "nodeType": "YulIdentifier", + "src": "32268:7:70" + } + ], + "functionName": { + "name": "abi_decode_string", + "nativeSrc": "32226:17:70", + "nodeType": "YulIdentifier", + "src": "32226:17:70" + }, + "nativeSrc": "32226:50:70", + "nodeType": "YulFunctionCall", + "src": "32226:50:70" + }, + "variableNames": [ + { + "name": "value2", + "nativeSrc": "32216:6:70", + "nodeType": "YulIdentifier", + "src": "32216:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address_payablet_bytes32t_bytes_memory_ptr", + "nativeSrc": "31698:584:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "31769:9:70", + "nodeType": "YulTypedName", + "src": "31769:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "31780:7:70", + "nodeType": "YulTypedName", + "src": "31780:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "31792:6:70", + "nodeType": "YulTypedName", + "src": "31792:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "31800:6:70", + "nodeType": "YulTypedName", + "src": "31800:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "31808:6:70", + "nodeType": "YulTypedName", + "src": "31808:6:70", + "type": "" + } + ], + "src": "31698:584:70" + }, + { + "body": { + "nativeSrc": "32444:214:70", + "nodeType": "YulBlock", + "src": "32444:214:70", + "statements": [ + { + "nativeSrc": "32454:26:70", + "nodeType": "YulAssignment", + "src": "32454:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32466:9:70", + "nodeType": "YulIdentifier", + "src": "32466:9:70" + }, + { + "kind": "number", + "nativeSrc": "32477:2:70", + "nodeType": "YulLiteral", + "src": "32477:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32462:3:70", + "nodeType": "YulIdentifier", + "src": "32462:3:70" + }, + "nativeSrc": "32462:18:70", + "nodeType": "YulFunctionCall", + "src": "32462:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "32454:4:70", + "nodeType": "YulIdentifier", + "src": "32454:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32496:9:70", + "nodeType": "YulIdentifier", + "src": "32496:9:70" + }, + { + "name": "value0", + "nativeSrc": "32507:6:70", + "nodeType": "YulIdentifier", + "src": "32507:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "32489:6:70", + "nodeType": "YulIdentifier", + "src": "32489:6:70" + }, + "nativeSrc": "32489:25:70", + "nodeType": "YulFunctionCall", + "src": "32489:25:70" + }, + "nativeSrc": "32489:25:70", + "nodeType": "YulExpressionStatement", + "src": "32489:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32534:9:70", + "nodeType": "YulIdentifier", + "src": "32534:9:70" + }, + { + "kind": "number", + "nativeSrc": "32545:2:70", + "nodeType": "YulLiteral", + "src": "32545:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32530:3:70", + "nodeType": "YulIdentifier", + "src": "32530:3:70" + }, + "nativeSrc": "32530:18:70", + "nodeType": "YulFunctionCall", + "src": "32530:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "32554:6:70", + "nodeType": "YulIdentifier", + "src": "32554:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "32570:3:70", + "nodeType": "YulLiteral", + "src": "32570:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "32575:1:70", + "nodeType": "YulLiteral", + "src": "32575:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "32566:3:70", + "nodeType": "YulIdentifier", + "src": "32566:3:70" + }, + "nativeSrc": "32566:11:70", + "nodeType": "YulFunctionCall", + "src": "32566:11:70" + }, + { + "kind": "number", + "nativeSrc": "32579:1:70", + "nodeType": "YulLiteral", + "src": "32579:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "32562:3:70", + "nodeType": "YulIdentifier", + "src": "32562:3:70" + }, + "nativeSrc": "32562:19:70", + "nodeType": "YulFunctionCall", + "src": "32562:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "32550:3:70", + "nodeType": "YulIdentifier", + "src": "32550:3:70" + }, + "nativeSrc": "32550:32:70", + "nodeType": "YulFunctionCall", + "src": "32550:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "32523:6:70", + "nodeType": "YulIdentifier", + "src": "32523:6:70" + }, + "nativeSrc": "32523:60:70", + "nodeType": "YulFunctionCall", + "src": "32523:60:70" + }, + "nativeSrc": "32523:60:70", + "nodeType": "YulExpressionStatement", + "src": "32523:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32603:9:70", + "nodeType": "YulIdentifier", + "src": "32603:9:70" + }, + { + "kind": "number", + "nativeSrc": "32614:2:70", + "nodeType": "YulLiteral", + "src": "32614:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32599:3:70", + "nodeType": "YulIdentifier", + "src": "32599:3:70" + }, + "nativeSrc": "32599:18:70", + "nodeType": "YulFunctionCall", + "src": "32599:18:70" + }, + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "32623:6:70", + "nodeType": "YulIdentifier", + "src": "32623:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "32639:3:70", + "nodeType": "YulLiteral", + "src": "32639:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "32644:1:70", + "nodeType": "YulLiteral", + "src": "32644:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "32635:3:70", + "nodeType": "YulIdentifier", + "src": "32635:3:70" + }, + "nativeSrc": "32635:11:70", + "nodeType": "YulFunctionCall", + "src": "32635:11:70" + }, + { + "kind": "number", + "nativeSrc": "32648:1:70", + "nodeType": "YulLiteral", + "src": "32648:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "32631:3:70", + "nodeType": "YulIdentifier", + "src": "32631:3:70" + }, + "nativeSrc": "32631:19:70", + "nodeType": "YulFunctionCall", + "src": "32631:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "32619:3:70", + "nodeType": "YulIdentifier", + "src": "32619:3:70" + }, + "nativeSrc": "32619:32:70", + "nodeType": "YulFunctionCall", + "src": "32619:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "32592:6:70", + "nodeType": "YulIdentifier", + "src": "32592:6:70" + }, + "nativeSrc": "32592:60:70", + "nodeType": "YulFunctionCall", + "src": "32592:60:70" + }, + "nativeSrc": "32592:60:70", + "nodeType": "YulExpressionStatement", + "src": "32592:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_address_t_address__to_t_bytes32_t_address_t_address__fromStack_reversed", + "nativeSrc": "32287:371:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "32397:9:70", + "nodeType": "YulTypedName", + "src": "32397:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "32408:6:70", + "nodeType": "YulTypedName", + "src": "32408:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "32416:6:70", + "nodeType": "YulTypedName", + "src": "32416:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "32424:6:70", + "nodeType": "YulTypedName", + "src": "32424:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "32435:4:70", + "nodeType": "YulTypedName", + "src": "32435:4:70", + "type": "" + } + ], + "src": "32287:371:70" + }, + { + "body": { + "nativeSrc": "32866:230:70", + "nodeType": "YulBlock", + "src": "32866:230:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32883:9:70", + "nodeType": "YulIdentifier", + "src": "32883:9:70" + }, + { + "kind": "number", + "nativeSrc": "32894:3:70", + "nodeType": "YulLiteral", + "src": "32894:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "32876:6:70", + "nodeType": "YulIdentifier", + "src": "32876:6:70" + }, + "nativeSrc": "32876:22:70", + "nodeType": "YulFunctionCall", + "src": "32876:22:70" + }, + "nativeSrc": "32876:22:70", + "nodeType": "YulExpressionStatement", + "src": "32876:22:70" + }, + { + "nativeSrc": "32907:54:70", + "nodeType": "YulAssignment", + "src": "32907:54:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "32933:6:70", + "nodeType": "YulIdentifier", + "src": "32933:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32945:9:70", + "nodeType": "YulIdentifier", + "src": "32945:9:70" + }, + { + "kind": "number", + "nativeSrc": "32956:3:70", + "nodeType": "YulLiteral", + "src": "32956:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32941:3:70", + "nodeType": "YulIdentifier", + "src": "32941:3:70" + }, + "nativeSrc": "32941:19:70", + "nodeType": "YulFunctionCall", + "src": "32941:19:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "32915:17:70", + "nodeType": "YulIdentifier", + "src": "32915:17:70" + }, + "nativeSrc": "32915:46:70", + "nodeType": "YulFunctionCall", + "src": "32915:46:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "32907:4:70", + "nodeType": "YulIdentifier", + "src": "32907:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "32981:9:70", + "nodeType": "YulIdentifier", + "src": "32981:9:70" + }, + { + "kind": "number", + "nativeSrc": "32992:2:70", + "nodeType": "YulLiteral", + "src": "32992:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "32977:3:70", + "nodeType": "YulIdentifier", + "src": "32977:3:70" + }, + "nativeSrc": "32977:18:70", + "nodeType": "YulFunctionCall", + "src": "32977:18:70" + }, + { + "name": "value1", + "nativeSrc": "32997:6:70", + "nodeType": "YulIdentifier", + "src": "32997:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "32970:6:70", + "nodeType": "YulIdentifier", + "src": "32970:6:70" + }, + "nativeSrc": "32970:34:70", + "nodeType": "YulFunctionCall", + "src": "32970:34:70" + }, + "nativeSrc": "32970:34:70", + "nodeType": "YulExpressionStatement", + "src": "32970:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33024:9:70", + "nodeType": "YulIdentifier", + "src": "33024:9:70" + }, + { + "kind": "number", + "nativeSrc": "33035:2:70", + "nodeType": "YulLiteral", + "src": "33035:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "33020:3:70", + "nodeType": "YulIdentifier", + "src": "33020:3:70" + }, + "nativeSrc": "33020:18:70", + "nodeType": "YulFunctionCall", + "src": "33020:18:70" + }, + { + "name": "value2", + "nativeSrc": "33040:6:70", + "nodeType": "YulIdentifier", + "src": "33040:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "33013:6:70", + "nodeType": "YulIdentifier", + "src": "33013:6:70" + }, + "nativeSrc": "33013:34:70", + "nodeType": "YulFunctionCall", + "src": "33013:34:70" + }, + "nativeSrc": "33013:34:70", + "nodeType": "YulExpressionStatement", + "src": "33013:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33067:9:70", + "nodeType": "YulIdentifier", + "src": "33067:9:70" + }, + { + "kind": "number", + "nativeSrc": "33078:2:70", + "nodeType": "YulLiteral", + "src": "33078:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "33063:3:70", + "nodeType": "YulIdentifier", + "src": "33063:3:70" + }, + "nativeSrc": "33063:18:70", + "nodeType": "YulFunctionCall", + "src": "33063:18:70" + }, + { + "name": "value3", + "nativeSrc": "33083:6:70", + "nodeType": "YulIdentifier", + "src": "33083:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "33056:6:70", + "nodeType": "YulIdentifier", + "src": "33056:6:70" + }, + "nativeSrc": "33056:34:70", + "nodeType": "YulFunctionCall", + "src": "33056:34:70" + }, + "nativeSrc": "33056:34:70", + "nodeType": "YulExpressionStatement", + "src": "33056:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "32663:433:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "32811:9:70", + "nodeType": "YulTypedName", + "src": "32811:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "32822:6:70", + "nodeType": "YulTypedName", + "src": "32822:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "32830:6:70", + "nodeType": "YulTypedName", + "src": "32830:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "32838:6:70", + "nodeType": "YulTypedName", + "src": "32838:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "32846:6:70", + "nodeType": "YulTypedName", + "src": "32846:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "32857:4:70", + "nodeType": "YulTypedName", + "src": "32857:4:70", + "type": "" + } + ], + "src": "32663:433:70" + }, + { + "body": { + "nativeSrc": "33207:266:70", + "nodeType": "YulBlock", + "src": "33207:266:70", + "statements": [ + { + "body": { + "nativeSrc": "33253:16:70", + "nodeType": "YulBlock", + "src": "33253:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "33262:1:70", + "nodeType": "YulLiteral", + "src": "33262:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "33265:1:70", + "nodeType": "YulLiteral", + "src": "33265:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "33255:6:70", + "nodeType": "YulIdentifier", + "src": "33255:6:70" + }, + "nativeSrc": "33255:12:70", + "nodeType": "YulFunctionCall", + "src": "33255:12:70" + }, + "nativeSrc": "33255:12:70", + "nodeType": "YulExpressionStatement", + "src": "33255:12:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "33228:7:70", + "nodeType": "YulIdentifier", + "src": "33228:7:70" + }, + { + "name": "headStart", + "nativeSrc": "33237:9:70", + "nodeType": "YulIdentifier", + "src": "33237:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "33224:3:70", + "nodeType": "YulIdentifier", + "src": "33224:3:70" + }, + "nativeSrc": "33224:23:70", + "nodeType": "YulFunctionCall", + "src": "33224:23:70" + }, + { + "kind": "number", + "nativeSrc": "33249:2:70", + "nodeType": "YulLiteral", + "src": "33249:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "33220:3:70", + "nodeType": "YulIdentifier", + "src": "33220:3:70" + }, + "nativeSrc": "33220:32:70", + "nodeType": "YulFunctionCall", + "src": "33220:32:70" + }, + "nativeSrc": "33217:52:70", + "nodeType": "YulIf", + "src": "33217:52:70" + }, + { + "nativeSrc": "33278:14:70", + "nodeType": "YulVariableDeclaration", + "src": "33278:14:70", + "value": { + "kind": "number", + "nativeSrc": "33291:1:70", + "nodeType": "YulLiteral", + "src": "33291:1:70", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "33282:5:70", + "nodeType": "YulTypedName", + "src": "33282:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "33301:25:70", + "nodeType": "YulAssignment", + "src": "33301:25:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33316:9:70", + "nodeType": "YulIdentifier", + "src": "33316:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "33310:5:70", + "nodeType": "YulIdentifier", + "src": "33310:5:70" + }, + "nativeSrc": "33310:16:70", + "nodeType": "YulFunctionCall", + "src": "33310:16:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "33301:5:70", + "nodeType": "YulIdentifier", + "src": "33301:5:70" + } + ] + }, + { + "nativeSrc": "33335:15:70", + "nodeType": "YulAssignment", + "src": "33335:15:70", + "value": { + "name": "value", + "nativeSrc": "33345:5:70", + "nodeType": "YulIdentifier", + "src": "33345:5:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "33335:6:70", + "nodeType": "YulIdentifier", + "src": "33335:6:70" + } + ] + }, + { + "nativeSrc": "33359:40:70", + "nodeType": "YulVariableDeclaration", + "src": "33359:40:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33384:9:70", + "nodeType": "YulIdentifier", + "src": "33384:9:70" + }, + { + "kind": "number", + "nativeSrc": "33395:2:70", + "nodeType": "YulLiteral", + "src": "33395:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "33380:3:70", + "nodeType": "YulIdentifier", + "src": "33380:3:70" + }, + "nativeSrc": "33380:18:70", + "nodeType": "YulFunctionCall", + "src": "33380:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "33374:5:70", + "nodeType": "YulIdentifier", + "src": "33374:5:70" + }, + "nativeSrc": "33374:25:70", + "nodeType": "YulFunctionCall", + "src": "33374:25:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "33363:7:70", + "nodeType": "YulTypedName", + "src": "33363:7:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value_1", + "nativeSrc": "33433:7:70", + "nodeType": "YulIdentifier", + "src": "33433:7:70" + } + ], + "functionName": { + "name": "validator_revert_address", + "nativeSrc": "33408:24:70", + "nodeType": "YulIdentifier", + "src": "33408:24:70" + }, + "nativeSrc": "33408:33:70", + "nodeType": "YulFunctionCall", + "src": "33408:33:70" + }, + "nativeSrc": "33408:33:70", + "nodeType": "YulExpressionStatement", + "src": "33408:33:70" + }, + { + "nativeSrc": "33450:17:70", + "nodeType": "YulAssignment", + "src": "33450:17:70", + "value": { + "name": "value_1", + "nativeSrc": "33460:7:70", + "nodeType": "YulIdentifier", + "src": "33460:7:70" + }, + "variableNames": [ + { + "name": "value1", + "nativeSrc": "33450:6:70", + "nodeType": "YulIdentifier", + "src": "33450:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_address_payable_fromMemory", + "nativeSrc": "33101:372:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "33165:9:70", + "nodeType": "YulTypedName", + "src": "33165:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "33176:7:70", + "nodeType": "YulTypedName", + "src": "33176:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "33188:6:70", + "nodeType": "YulTypedName", + "src": "33188:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "33196:6:70", + "nodeType": "YulTypedName", + "src": "33196:6:70", + "type": "" + } + ], + "src": "33101:372:70" + }, + { + "body": { + "nativeSrc": "33607:145:70", + "nodeType": "YulBlock", + "src": "33607:145:70", + "statements": [ + { + "nativeSrc": "33617:26:70", + "nodeType": "YulAssignment", + "src": "33617:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33629:9:70", + "nodeType": "YulIdentifier", + "src": "33629:9:70" + }, + { + "kind": "number", + "nativeSrc": "33640:2:70", + "nodeType": "YulLiteral", + "src": "33640:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "33625:3:70", + "nodeType": "YulIdentifier", + "src": "33625:3:70" + }, + "nativeSrc": "33625:18:70", + "nodeType": "YulFunctionCall", + "src": "33625:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "33617:4:70", + "nodeType": "YulIdentifier", + "src": "33617:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33659:9:70", + "nodeType": "YulIdentifier", + "src": "33659:9:70" + }, + { + "name": "value0", + "nativeSrc": "33670:6:70", + "nodeType": "YulIdentifier", + "src": "33670:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "33652:6:70", + "nodeType": "YulIdentifier", + "src": "33652:6:70" + }, + "nativeSrc": "33652:25:70", + "nodeType": "YulFunctionCall", + "src": "33652:25:70" + }, + "nativeSrc": "33652:25:70", + "nodeType": "YulExpressionStatement", + "src": "33652:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "33697:9:70", + "nodeType": "YulIdentifier", + "src": "33697:9:70" + }, + { + "kind": "number", + "nativeSrc": "33708:2:70", + "nodeType": "YulLiteral", + "src": "33708:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "33693:3:70", + "nodeType": "YulIdentifier", + "src": "33693:3:70" + }, + "nativeSrc": "33693:18:70", + "nodeType": "YulFunctionCall", + "src": "33693:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "33717:6:70", + "nodeType": "YulIdentifier", + "src": "33717:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "33733:3:70", + "nodeType": "YulLiteral", + "src": "33733:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "33738:1:70", + "nodeType": "YulLiteral", + "src": "33738:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "33729:3:70", + "nodeType": "YulIdentifier", + "src": "33729:3:70" + }, + "nativeSrc": "33729:11:70", + "nodeType": "YulFunctionCall", + "src": "33729:11:70" + }, + { + "kind": "number", + "nativeSrc": "33742:1:70", + "nodeType": "YulLiteral", + "src": "33742:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "33725:3:70", + "nodeType": "YulIdentifier", + "src": "33725:3:70" + }, + "nativeSrc": "33725:19:70", + "nodeType": "YulFunctionCall", + "src": "33725:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "33713:3:70", + "nodeType": "YulIdentifier", + "src": "33713:3:70" + }, + "nativeSrc": "33713:32:70", + "nodeType": "YulFunctionCall", + "src": "33713:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "33686:6:70", + "nodeType": "YulIdentifier", + "src": "33686:6:70" + }, + "nativeSrc": "33686:60:70", + "nodeType": "YulFunctionCall", + "src": "33686:60:70" + }, + "nativeSrc": "33686:60:70", + "nodeType": "YulExpressionStatement", + "src": "33686:60:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_address__to_t_uint256_t_address__fromStack_reversed", + "nativeSrc": "33478:274:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "33568:9:70", + "nodeType": "YulTypedName", + "src": "33568:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "33579:6:70", + "nodeType": "YulTypedName", + "src": "33579:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "33587:6:70", + "nodeType": "YulTypedName", + "src": "33587:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "33598:4:70", + "nodeType": "YulTypedName", + "src": "33598:4:70", + "type": "" + } + ], + "src": "33478:274:70" + }, + { + "body": { + "nativeSrc": "33804:89:70", + "nodeType": "YulBlock", + "src": "33804:89:70", + "statements": [ + { + "body": { + "nativeSrc": "33831:22:70", + "nodeType": "YulBlock", + "src": "33831:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "33833:16:70", + "nodeType": "YulIdentifier", + "src": "33833:16:70" + }, + "nativeSrc": "33833:18:70", + "nodeType": "YulFunctionCall", + "src": "33833:18:70" + }, + "nativeSrc": "33833:18:70", + "nodeType": "YulExpressionStatement", + "src": "33833:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value", + "nativeSrc": "33824:5:70", + "nodeType": "YulIdentifier", + "src": "33824:5:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "33817:6:70", + "nodeType": "YulIdentifier", + "src": "33817:6:70" + }, + "nativeSrc": "33817:13:70", + "nodeType": "YulFunctionCall", + "src": "33817:13:70" + }, + "nativeSrc": "33814:39:70", + "nodeType": "YulIf", + "src": "33814:39:70" + }, + { + "nativeSrc": "33862:25:70", + "nodeType": "YulAssignment", + "src": "33862:25:70", + "value": { + "arguments": [ + { + "name": "value", + "nativeSrc": "33873:5:70", + "nodeType": "YulIdentifier", + "src": "33873:5:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "33884:1:70", + "nodeType": "YulLiteral", + "src": "33884:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "33880:3:70", + "nodeType": "YulIdentifier", + "src": "33880:3:70" + }, + "nativeSrc": "33880:6:70", + "nodeType": "YulFunctionCall", + "src": "33880:6:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "33869:3:70", + "nodeType": "YulIdentifier", + "src": "33869:3:70" + }, + "nativeSrc": "33869:18:70", + "nodeType": "YulFunctionCall", + "src": "33869:18:70" + }, + "variableNames": [ + { + "name": "ret", + "nativeSrc": "33862:3:70", + "nodeType": "YulIdentifier", + "src": "33862:3:70" + } + ] + } + ] + }, + "name": "decrement_t_uint256", + "nativeSrc": "33757:136:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "33786:5:70", + "nodeType": "YulTypedName", + "src": "33786:5:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "ret", + "nativeSrc": "33796:3:70", + "nodeType": "YulTypedName", + "src": "33796:3:70", + "type": "" + } + ], + "src": "33757:136:70" + }, + { + "body": { + "nativeSrc": "33945:88:70", + "nodeType": "YulBlock", + "src": "33945:88:70", + "statements": [ + { + "body": { + "nativeSrc": "33976:22:70", + "nodeType": "YulBlock", + "src": "33976:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nativeSrc": "33978:16:70", + "nodeType": "YulIdentifier", + "src": "33978:16:70" + }, + "nativeSrc": "33978:18:70", + "nodeType": "YulFunctionCall", + "src": "33978:18:70" + }, + "nativeSrc": "33978:18:70", + "nodeType": "YulExpressionStatement", + "src": "33978:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value", + "nativeSrc": "33961:5:70", + "nodeType": "YulIdentifier", + "src": "33961:5:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "33972:1:70", + "nodeType": "YulLiteral", + "src": "33972:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "33968:3:70", + "nodeType": "YulIdentifier", + "src": "33968:3:70" + }, + "nativeSrc": "33968:6:70", + "nodeType": "YulFunctionCall", + "src": "33968:6:70" + } + ], + "functionName": { + "name": "eq", + "nativeSrc": "33958:2:70", + "nodeType": "YulIdentifier", + "src": "33958:2:70" + }, + "nativeSrc": "33958:17:70", + "nodeType": "YulFunctionCall", + "src": "33958:17:70" + }, + "nativeSrc": "33955:43:70", + "nodeType": "YulIf", + "src": "33955:43:70" + }, + { + "nativeSrc": "34007:20:70", + "nodeType": "YulAssignment", + "src": "34007:20:70", + "value": { + "arguments": [ + { + "name": "value", + "nativeSrc": "34018:5:70", + "nodeType": "YulIdentifier", + "src": "34018:5:70" + }, + { + "kind": "number", + "nativeSrc": "34025:1:70", + "nodeType": "YulLiteral", + "src": "34025:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34014:3:70", + "nodeType": "YulIdentifier", + "src": "34014:3:70" + }, + "nativeSrc": "34014:13:70", + "nodeType": "YulFunctionCall", + "src": "34014:13:70" + }, + "variableNames": [ + { + "name": "ret", + "nativeSrc": "34007:3:70", + "nodeType": "YulIdentifier", + "src": "34007:3:70" + } + ] + } + ] + }, + "name": "increment_t_uint256", + "nativeSrc": "33898:135:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "33927:5:70", + "nodeType": "YulTypedName", + "src": "33927:5:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "ret", + "nativeSrc": "33937:3:70", + "nodeType": "YulTypedName", + "src": "33937:3:70", + "type": "" + } + ], + "src": "33898:135:70" + }, + { + "body": { + "nativeSrc": "34193:231:70", + "nodeType": "YulBlock", + "src": "34193:231:70", + "statements": [ + { + "nativeSrc": "34203:26:70", + "nodeType": "YulAssignment", + "src": "34203:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34215:9:70", + "nodeType": "YulIdentifier", + "src": "34215:9:70" + }, + { + "kind": "number", + "nativeSrc": "34226:2:70", + "nodeType": "YulLiteral", + "src": "34226:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34211:3:70", + "nodeType": "YulIdentifier", + "src": "34211:3:70" + }, + "nativeSrc": "34211:18:70", + "nodeType": "YulFunctionCall", + "src": "34211:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "34203:4:70", + "nodeType": "YulIdentifier", + "src": "34203:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34245:9:70", + "nodeType": "YulIdentifier", + "src": "34245:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "34260:6:70", + "nodeType": "YulIdentifier", + "src": "34260:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "34276:3:70", + "nodeType": "YulLiteral", + "src": "34276:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "34281:1:70", + "nodeType": "YulLiteral", + "src": "34281:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "34272:3:70", + "nodeType": "YulIdentifier", + "src": "34272:3:70" + }, + "nativeSrc": "34272:11:70", + "nodeType": "YulFunctionCall", + "src": "34272:11:70" + }, + { + "kind": "number", + "nativeSrc": "34285:1:70", + "nodeType": "YulLiteral", + "src": "34285:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "34268:3:70", + "nodeType": "YulIdentifier", + "src": "34268:3:70" + }, + "nativeSrc": "34268:19:70", + "nodeType": "YulFunctionCall", + "src": "34268:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "34256:3:70", + "nodeType": "YulIdentifier", + "src": "34256:3:70" + }, + "nativeSrc": "34256:32:70", + "nodeType": "YulFunctionCall", + "src": "34256:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34238:6:70", + "nodeType": "YulIdentifier", + "src": "34238:6:70" + }, + "nativeSrc": "34238:51:70", + "nodeType": "YulFunctionCall", + "src": "34238:51:70" + }, + "nativeSrc": "34238:51:70", + "nodeType": "YulExpressionStatement", + "src": "34238:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34309:9:70", + "nodeType": "YulIdentifier", + "src": "34309:9:70" + }, + { + "kind": "number", + "nativeSrc": "34320:2:70", + "nodeType": "YulLiteral", + "src": "34320:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34305:3:70", + "nodeType": "YulIdentifier", + "src": "34305:3:70" + }, + "nativeSrc": "34305:18:70", + "nodeType": "YulFunctionCall", + "src": "34305:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "34329:6:70", + "nodeType": "YulIdentifier", + "src": "34329:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "34345:3:70", + "nodeType": "YulLiteral", + "src": "34345:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "34350:1:70", + "nodeType": "YulLiteral", + "src": "34350:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "34341:3:70", + "nodeType": "YulIdentifier", + "src": "34341:3:70" + }, + "nativeSrc": "34341:11:70", + "nodeType": "YulFunctionCall", + "src": "34341:11:70" + }, + { + "kind": "number", + "nativeSrc": "34354:1:70", + "nodeType": "YulLiteral", + "src": "34354:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "34337:3:70", + "nodeType": "YulIdentifier", + "src": "34337:3:70" + }, + "nativeSrc": "34337:19:70", + "nodeType": "YulFunctionCall", + "src": "34337:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "34325:3:70", + "nodeType": "YulIdentifier", + "src": "34325:3:70" + }, + "nativeSrc": "34325:32:70", + "nodeType": "YulFunctionCall", + "src": "34325:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34298:6:70", + "nodeType": "YulIdentifier", + "src": "34298:6:70" + }, + "nativeSrc": "34298:60:70", + "nodeType": "YulFunctionCall", + "src": "34298:60:70" + }, + "nativeSrc": "34298:60:70", + "nodeType": "YulExpressionStatement", + "src": "34298:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34378:9:70", + "nodeType": "YulIdentifier", + "src": "34378:9:70" + }, + { + "kind": "number", + "nativeSrc": "34389:2:70", + "nodeType": "YulLiteral", + "src": "34389:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34374:3:70", + "nodeType": "YulIdentifier", + "src": "34374:3:70" + }, + "nativeSrc": "34374:18:70", + "nodeType": "YulFunctionCall", + "src": "34374:18:70" + }, + { + "arguments": [ + { + "name": "value2", + "nativeSrc": "34398:6:70", + "nodeType": "YulIdentifier", + "src": "34398:6:70" + }, + { + "kind": "number", + "nativeSrc": "34406:10:70", + "nodeType": "YulLiteral", + "src": "34406:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "34394:3:70", + "nodeType": "YulIdentifier", + "src": "34394:3:70" + }, + "nativeSrc": "34394:23:70", + "nodeType": "YulFunctionCall", + "src": "34394:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34367:6:70", + "nodeType": "YulIdentifier", + "src": "34367:6:70" + }, + "nativeSrc": "34367:51:70", + "nodeType": "YulFunctionCall", + "src": "34367:51:70" + }, + "nativeSrc": "34367:51:70", + "nodeType": "YulExpressionStatement", + "src": "34367:51:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_uint32__to_t_address_t_address_t_uint32__fromStack_reversed", + "nativeSrc": "34038:386:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "34146:9:70", + "nodeType": "YulTypedName", + "src": "34146:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "34157:6:70", + "nodeType": "YulTypedName", + "src": "34157:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "34165:6:70", + "nodeType": "YulTypedName", + "src": "34165:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "34173:6:70", + "nodeType": "YulTypedName", + "src": "34173:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "34184:4:70", + "nodeType": "YulTypedName", + "src": "34184:4:70", + "type": "" + } + ], + "src": "34038:386:70" + }, + { + "body": { + "nativeSrc": "34473:60:70", + "nodeType": "YulBlock", + "src": "34473:60:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "34490:3:70", + "nodeType": "YulIdentifier", + "src": "34490:3:70" + }, + { + "arguments": [ + { + "name": "value", + "nativeSrc": "34499:5:70", + "nodeType": "YulIdentifier", + "src": "34499:5:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "34514:3:70", + "nodeType": "YulLiteral", + "src": "34514:3:70", + "type": "", + "value": "128" + }, + { + "kind": "number", + "nativeSrc": "34519:1:70", + "nodeType": "YulLiteral", + "src": "34519:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "34510:3:70", + "nodeType": "YulIdentifier", + "src": "34510:3:70" + }, + "nativeSrc": "34510:11:70", + "nodeType": "YulFunctionCall", + "src": "34510:11:70" + }, + { + "kind": "number", + "nativeSrc": "34523:1:70", + "nodeType": "YulLiteral", + "src": "34523:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "34506:3:70", + "nodeType": "YulIdentifier", + "src": "34506:3:70" + }, + "nativeSrc": "34506:19:70", + "nodeType": "YulFunctionCall", + "src": "34506:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "34495:3:70", + "nodeType": "YulIdentifier", + "src": "34495:3:70" + }, + "nativeSrc": "34495:31:70", + "nodeType": "YulFunctionCall", + "src": "34495:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34483:6:70", + "nodeType": "YulIdentifier", + "src": "34483:6:70" + }, + "nativeSrc": "34483:44:70", + "nodeType": "YulFunctionCall", + "src": "34483:44:70" + }, + "nativeSrc": "34483:44:70", + "nodeType": "YulExpressionStatement", + "src": "34483:44:70" + } + ] + }, + "name": "abi_encode_uint128", + "nativeSrc": "34429:104:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nativeSrc": "34457:5:70", + "nodeType": "YulTypedName", + "src": "34457:5:70", + "type": "" + }, + { + "name": "pos", + "nativeSrc": "34464:3:70", + "nodeType": "YulTypedName", + "src": "34464:3:70", + "type": "" + } + ], + "src": "34429:104:70" + }, + { + "body": { + "nativeSrc": "34749:1166:70", + "nodeType": "YulBlock", + "src": "34749:1166:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34766:9:70", + "nodeType": "YulIdentifier", + "src": "34766:9:70" + }, + { + "kind": "number", + "nativeSrc": "34777:2:70", + "nodeType": "YulLiteral", + "src": "34777:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34759:6:70", + "nodeType": "YulIdentifier", + "src": "34759:6:70" + }, + "nativeSrc": "34759:21:70", + "nodeType": "YulFunctionCall", + "src": "34759:21:70" + }, + "nativeSrc": "34759:21:70", + "nodeType": "YulExpressionStatement", + "src": "34759:21:70" + }, + { + "nativeSrc": "34789:33:70", + "nodeType": "YulVariableDeclaration", + "src": "34789:33:70", + "value": { + "arguments": [ + { + "name": "value0", + "nativeSrc": "34815:6:70", + "nodeType": "YulIdentifier", + "src": "34815:6:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "34809:5:70", + "nodeType": "YulIdentifier", + "src": "34809:5:70" + }, + "nativeSrc": "34809:13:70", + "nodeType": "YulFunctionCall", + "src": "34809:13:70" + }, + "variables": [ + { + "name": "memberValue0", + "nativeSrc": "34793:12:70", + "nodeType": "YulTypedName", + "src": "34793:12:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34842:9:70", + "nodeType": "YulIdentifier", + "src": "34842:9:70" + }, + { + "kind": "number", + "nativeSrc": "34853:2:70", + "nodeType": "YulLiteral", + "src": "34853:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34838:3:70", + "nodeType": "YulIdentifier", + "src": "34838:3:70" + }, + "nativeSrc": "34838:18:70", + "nodeType": "YulFunctionCall", + "src": "34838:18:70" + }, + { + "kind": "number", + "nativeSrc": "34858:4:70", + "nodeType": "YulLiteral", + "src": "34858:4:70", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34831:6:70", + "nodeType": "YulIdentifier", + "src": "34831:6:70" + }, + "nativeSrc": "34831:32:70", + "nodeType": "YulFunctionCall", + "src": "34831:32:70" + }, + "nativeSrc": "34831:32:70", + "nodeType": "YulExpressionStatement", + "src": "34831:32:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34883:9:70", + "nodeType": "YulIdentifier", + "src": "34883:9:70" + }, + { + "kind": "number", + "nativeSrc": "34894:3:70", + "nodeType": "YulLiteral", + "src": "34894:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34879:3:70", + "nodeType": "YulIdentifier", + "src": "34879:3:70" + }, + "nativeSrc": "34879:19:70", + "nodeType": "YulFunctionCall", + "src": "34879:19:70" + }, + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "34906:12:70", + "nodeType": "YulIdentifier", + "src": "34906:12:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "34900:5:70", + "nodeType": "YulIdentifier", + "src": "34900:5:70" + }, + "nativeSrc": "34900:19:70", + "nodeType": "YulFunctionCall", + "src": "34900:19:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34872:6:70", + "nodeType": "YulIdentifier", + "src": "34872:6:70" + }, + "nativeSrc": "34872:48:70", + "nodeType": "YulFunctionCall", + "src": "34872:48:70" + }, + "nativeSrc": "34872:48:70", + "nodeType": "YulExpressionStatement", + "src": "34872:48:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "34940:9:70", + "nodeType": "YulIdentifier", + "src": "34940:9:70" + }, + { + "kind": "number", + "nativeSrc": "34951:3:70", + "nodeType": "YulLiteral", + "src": "34951:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34936:3:70", + "nodeType": "YulIdentifier", + "src": "34936:3:70" + }, + "nativeSrc": "34936:19:70", + "nodeType": "YulFunctionCall", + "src": "34936:19:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "34971:12:70", + "nodeType": "YulIdentifier", + "src": "34971:12:70" + }, + { + "kind": "number", + "nativeSrc": "34985:4:70", + "nodeType": "YulLiteral", + "src": "34985:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "34967:3:70", + "nodeType": "YulIdentifier", + "src": "34967:3:70" + }, + "nativeSrc": "34967:23:70", + "nodeType": "YulFunctionCall", + "src": "34967:23:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "34961:5:70", + "nodeType": "YulIdentifier", + "src": "34961:5:70" + }, + "nativeSrc": "34961:30:70", + "nodeType": "YulFunctionCall", + "src": "34961:30:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "35001:3:70", + "nodeType": "YulLiteral", + "src": "35001:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "35006:1:70", + "nodeType": "YulLiteral", + "src": "35006:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "34997:3:70", + "nodeType": "YulIdentifier", + "src": "34997:3:70" + }, + "nativeSrc": "34997:11:70", + "nodeType": "YulFunctionCall", + "src": "34997:11:70" + }, + { + "kind": "number", + "nativeSrc": "35010:1:70", + "nodeType": "YulLiteral", + "src": "35010:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "34993:3:70", + "nodeType": "YulIdentifier", + "src": "34993:3:70" + }, + "nativeSrc": "34993:19:70", + "nodeType": "YulFunctionCall", + "src": "34993:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "34957:3:70", + "nodeType": "YulIdentifier", + "src": "34957:3:70" + }, + "nativeSrc": "34957:56:70", + "nodeType": "YulFunctionCall", + "src": "34957:56:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "34929:6:70", + "nodeType": "YulIdentifier", + "src": "34929:6:70" + }, + "nativeSrc": "34929:85:70", + "nodeType": "YulFunctionCall", + "src": "34929:85:70" + }, + "nativeSrc": "34929:85:70", + "nodeType": "YulExpressionStatement", + "src": "34929:85:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35034:9:70", + "nodeType": "YulIdentifier", + "src": "35034:9:70" + }, + { + "kind": "number", + "nativeSrc": "35045:4:70", + "nodeType": "YulLiteral", + "src": "35045:4:70", + "type": "", + "value": "0xe0" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35030:3:70", + "nodeType": "YulIdentifier", + "src": "35030:3:70" + }, + "nativeSrc": "35030:20:70", + "nodeType": "YulFunctionCall", + "src": "35030:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "35066:12:70", + "nodeType": "YulIdentifier", + "src": "35066:12:70" + }, + { + "kind": "number", + "nativeSrc": "35080:4:70", + "nodeType": "YulLiteral", + "src": "35080:4:70", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35062:3:70", + "nodeType": "YulIdentifier", + "src": "35062:3:70" + }, + "nativeSrc": "35062:23:70", + "nodeType": "YulFunctionCall", + "src": "35062:23:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "35056:5:70", + "nodeType": "YulIdentifier", + "src": "35056:5:70" + }, + "nativeSrc": "35056:30:70", + "nodeType": "YulFunctionCall", + "src": "35056:30:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "35096:3:70", + "nodeType": "YulLiteral", + "src": "35096:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "35101:1:70", + "nodeType": "YulLiteral", + "src": "35101:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "35092:3:70", + "nodeType": "YulIdentifier", + "src": "35092:3:70" + }, + "nativeSrc": "35092:11:70", + "nodeType": "YulFunctionCall", + "src": "35092:11:70" + }, + { + "kind": "number", + "nativeSrc": "35105:1:70", + "nodeType": "YulLiteral", + "src": "35105:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "35088:3:70", + "nodeType": "YulIdentifier", + "src": "35088:3:70" + }, + "nativeSrc": "35088:19:70", + "nodeType": "YulFunctionCall", + "src": "35088:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "35052:3:70", + "nodeType": "YulIdentifier", + "src": "35052:3:70" + }, + "nativeSrc": "35052:56:70", + "nodeType": "YulFunctionCall", + "src": "35052:56:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "35023:6:70", + "nodeType": "YulIdentifier", + "src": "35023:6:70" + }, + "nativeSrc": "35023:86:70", + "nodeType": "YulFunctionCall", + "src": "35023:86:70" + }, + "nativeSrc": "35023:86:70", + "nodeType": "YulExpressionStatement", + "src": "35023:86:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35129:9:70", + "nodeType": "YulIdentifier", + "src": "35129:9:70" + }, + { + "kind": "number", + "nativeSrc": "35140:3:70", + "nodeType": "YulLiteral", + "src": "35140:3:70", + "type": "", + "value": "256" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35125:3:70", + "nodeType": "YulIdentifier", + "src": "35125:3:70" + }, + "nativeSrc": "35125:19:70", + "nodeType": "YulFunctionCall", + "src": "35125:19:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "35160:12:70", + "nodeType": "YulIdentifier", + "src": "35160:12:70" + }, + { + "kind": "number", + "nativeSrc": "35174:2:70", + "nodeType": "YulLiteral", + "src": "35174:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35156:3:70", + "nodeType": "YulIdentifier", + "src": "35156:3:70" + }, + "nativeSrc": "35156:21:70", + "nodeType": "YulFunctionCall", + "src": "35156:21:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "35150:5:70", + "nodeType": "YulIdentifier", + "src": "35150:5:70" + }, + "nativeSrc": "35150:28:70", + "nodeType": "YulFunctionCall", + "src": "35150:28:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "35188:3:70", + "nodeType": "YulLiteral", + "src": "35188:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "35193:1:70", + "nodeType": "YulLiteral", + "src": "35193:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "35184:3:70", + "nodeType": "YulIdentifier", + "src": "35184:3:70" + }, + "nativeSrc": "35184:11:70", + "nodeType": "YulFunctionCall", + "src": "35184:11:70" + }, + { + "kind": "number", + "nativeSrc": "35197:1:70", + "nodeType": "YulLiteral", + "src": "35197:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "35180:3:70", + "nodeType": "YulIdentifier", + "src": "35180:3:70" + }, + "nativeSrc": "35180:19:70", + "nodeType": "YulFunctionCall", + "src": "35180:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "35146:3:70", + "nodeType": "YulIdentifier", + "src": "35146:3:70" + }, + "nativeSrc": "35146:54:70", + "nodeType": "YulFunctionCall", + "src": "35146:54:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "35118:6:70", + "nodeType": "YulIdentifier", + "src": "35118:6:70" + }, + "nativeSrc": "35118:83:70", + "nodeType": "YulFunctionCall", + "src": "35118:83:70" + }, + "nativeSrc": "35118:83:70", + "nodeType": "YulExpressionStatement", + "src": "35118:83:70" + }, + { + "nativeSrc": "35210:52:70", + "nodeType": "YulVariableDeclaration", + "src": "35210:52:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "35242:12:70", + "nodeType": "YulIdentifier", + "src": "35242:12:70" + }, + { + "kind": "number", + "nativeSrc": "35256:4:70", + "nodeType": "YulLiteral", + "src": "35256:4:70", + "type": "", + "value": "0x80" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35238:3:70", + "nodeType": "YulIdentifier", + "src": "35238:3:70" + }, + "nativeSrc": "35238:23:70", + "nodeType": "YulFunctionCall", + "src": "35238:23:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "35232:5:70", + "nodeType": "YulIdentifier", + "src": "35232:5:70" + }, + "nativeSrc": "35232:30:70", + "nodeType": "YulFunctionCall", + "src": "35232:30:70" + }, + "variables": [ + { + "name": "memberValue0_1", + "nativeSrc": "35214:14:70", + "nodeType": "YulTypedName", + "src": "35214:14:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memberValue0_1", + "nativeSrc": "35289:14:70", + "nodeType": "YulIdentifier", + "src": "35289:14:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35309:9:70", + "nodeType": "YulIdentifier", + "src": "35309:9:70" + }, + { + "kind": "number", + "nativeSrc": "35320:3:70", + "nodeType": "YulLiteral", + "src": "35320:3:70", + "type": "", + "value": "288" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35305:3:70", + "nodeType": "YulIdentifier", + "src": "35305:3:70" + }, + "nativeSrc": "35305:19:70", + "nodeType": "YulFunctionCall", + "src": "35305:19:70" + } + ], + "functionName": { + "name": "abi_encode_uint64", + "nativeSrc": "35271:17:70", + "nodeType": "YulIdentifier", + "src": "35271:17:70" + }, + "nativeSrc": "35271:54:70", + "nodeType": "YulFunctionCall", + "src": "35271:54:70" + }, + "nativeSrc": "35271:54:70", + "nodeType": "YulExpressionStatement", + "src": "35271:54:70" + }, + { + "nativeSrc": "35334:51:70", + "nodeType": "YulVariableDeclaration", + "src": "35334:51:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "35366:12:70", + "nodeType": "YulIdentifier", + "src": "35366:12:70" + }, + { + "kind": "number", + "nativeSrc": "35380:3:70", + "nodeType": "YulLiteral", + "src": "35380:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35362:3:70", + "nodeType": "YulIdentifier", + "src": "35362:3:70" + }, + "nativeSrc": "35362:22:70", + "nodeType": "YulFunctionCall", + "src": "35362:22:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "35356:5:70", + "nodeType": "YulIdentifier", + "src": "35356:5:70" + }, + "nativeSrc": "35356:29:70", + "nodeType": "YulFunctionCall", + "src": "35356:29:70" + }, + "variables": [ + { + "name": "memberValue0_2", + "nativeSrc": "35338:14:70", + "nodeType": "YulTypedName", + "src": "35338:14:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memberValue0_2", + "nativeSrc": "35413:14:70", + "nodeType": "YulIdentifier", + "src": "35413:14:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35433:9:70", + "nodeType": "YulIdentifier", + "src": "35433:9:70" + }, + { + "kind": "number", + "nativeSrc": "35444:3:70", + "nodeType": "YulLiteral", + "src": "35444:3:70", + "type": "", + "value": "320" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35429:3:70", + "nodeType": "YulIdentifier", + "src": "35429:3:70" + }, + "nativeSrc": "35429:19:70", + "nodeType": "YulFunctionCall", + "src": "35429:19:70" + } + ], + "functionName": { + "name": "abi_encode_uint128", + "nativeSrc": "35394:18:70", + "nodeType": "YulIdentifier", + "src": "35394:18:70" + }, + "nativeSrc": "35394:55:70", + "nodeType": "YulFunctionCall", + "src": "35394:55:70" + }, + "nativeSrc": "35394:55:70", + "nodeType": "YulExpressionStatement", + "src": "35394:55:70" + }, + { + "nativeSrc": "35458:51:70", + "nodeType": "YulVariableDeclaration", + "src": "35458:51:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "memberValue0", + "nativeSrc": "35490:12:70", + "nodeType": "YulIdentifier", + "src": "35490:12:70" + }, + { + "kind": "number", + "nativeSrc": "35504:3:70", + "nodeType": "YulLiteral", + "src": "35504:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35486:3:70", + "nodeType": "YulIdentifier", + "src": "35486:3:70" + }, + "nativeSrc": "35486:22:70", + "nodeType": "YulFunctionCall", + "src": "35486:22:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "35480:5:70", + "nodeType": "YulIdentifier", + "src": "35480:5:70" + }, + "nativeSrc": "35480:29:70", + "nodeType": "YulFunctionCall", + "src": "35480:29:70" + }, + "variables": [ + { + "name": "memberValue0_3", + "nativeSrc": "35462:14:70", + "nodeType": "YulTypedName", + "src": "35462:14:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35529:9:70", + "nodeType": "YulIdentifier", + "src": "35529:9:70" + }, + { + "kind": "number", + "nativeSrc": "35540:3:70", + "nodeType": "YulLiteral", + "src": "35540:3:70", + "type": "", + "value": "352" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35525:3:70", + "nodeType": "YulIdentifier", + "src": "35525:3:70" + }, + "nativeSrc": "35525:19:70", + "nodeType": "YulFunctionCall", + "src": "35525:19:70" + }, + { + "kind": "number", + "nativeSrc": "35546:4:70", + "nodeType": "YulLiteral", + "src": "35546:4:70", + "type": "", + "value": "0xe0" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "35518:6:70", + "nodeType": "YulIdentifier", + "src": "35518:6:70" + }, + "nativeSrc": "35518:33:70", + "nodeType": "YulFunctionCall", + "src": "35518:33:70" + }, + "nativeSrc": "35518:33:70", + "nodeType": "YulExpressionStatement", + "src": "35518:33:70" + }, + { + "nativeSrc": "35560:65:70", + "nodeType": "YulVariableDeclaration", + "src": "35560:65:70", + "value": { + "arguments": [ + { + "name": "memberValue0_3", + "nativeSrc": "35589:14:70", + "nodeType": "YulIdentifier", + "src": "35589:14:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35609:9:70", + "nodeType": "YulIdentifier", + "src": "35609:9:70" + }, + { + "kind": "number", + "nativeSrc": "35620:3:70", + "nodeType": "YulLiteral", + "src": "35620:3:70", + "type": "", + "value": "384" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35605:3:70", + "nodeType": "YulIdentifier", + "src": "35605:3:70" + }, + "nativeSrc": "35605:19:70", + "nodeType": "YulFunctionCall", + "src": "35605:19:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "35571:17:70", + "nodeType": "YulIdentifier", + "src": "35571:17:70" + }, + "nativeSrc": "35571:54:70", + "nodeType": "YulFunctionCall", + "src": "35571:54:70" + }, + "variables": [ + { + "name": "end", + "nativeSrc": "35564:3:70", + "nodeType": "YulTypedName", + "src": "35564:3:70", + "type": "" + } + ] + }, + { + "nativeSrc": "35634:46:70", + "nodeType": "YulVariableDeclaration", + "src": "35634:46:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "35666:6:70", + "nodeType": "YulIdentifier", + "src": "35666:6:70" + }, + { + "kind": "number", + "nativeSrc": "35674:4:70", + "nodeType": "YulLiteral", + "src": "35674:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35662:3:70", + "nodeType": "YulIdentifier", + "src": "35662:3:70" + }, + "nativeSrc": "35662:17:70", + "nodeType": "YulFunctionCall", + "src": "35662:17:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "35656:5:70", + "nodeType": "YulIdentifier", + "src": "35656:5:70" + }, + "nativeSrc": "35656:24:70", + "nodeType": "YulFunctionCall", + "src": "35656:24:70" + }, + "variables": [ + { + "name": "memberValue0_4", + "nativeSrc": "35638:14:70", + "nodeType": "YulTypedName", + "src": "35638:14:70", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35700:9:70", + "nodeType": "YulIdentifier", + "src": "35700:9:70" + }, + { + "kind": "number", + "nativeSrc": "35711:4:70", + "nodeType": "YulLiteral", + "src": "35711:4:70", + "type": "", + "value": "0x80" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35696:3:70", + "nodeType": "YulIdentifier", + "src": "35696:3:70" + }, + "nativeSrc": "35696:20:70", + "nodeType": "YulFunctionCall", + "src": "35696:20:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "end", + "nativeSrc": "35726:3:70", + "nodeType": "YulIdentifier", + "src": "35726:3:70" + }, + { + "name": "headStart", + "nativeSrc": "35731:9:70", + "nodeType": "YulIdentifier", + "src": "35731:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "35722:3:70", + "nodeType": "YulIdentifier", + "src": "35722:3:70" + }, + "nativeSrc": "35722:19:70", + "nodeType": "YulFunctionCall", + "src": "35722:19:70" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "35747:2:70", + "nodeType": "YulLiteral", + "src": "35747:2:70", + "type": "", + "value": "95" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "35743:3:70", + "nodeType": "YulIdentifier", + "src": "35743:3:70" + }, + "nativeSrc": "35743:7:70", + "nodeType": "YulFunctionCall", + "src": "35743:7:70" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35718:3:70", + "nodeType": "YulIdentifier", + "src": "35718:3:70" + }, + "nativeSrc": "35718:33:70", + "nodeType": "YulFunctionCall", + "src": "35718:33:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "35689:6:70", + "nodeType": "YulIdentifier", + "src": "35689:6:70" + }, + "nativeSrc": "35689:63:70", + "nodeType": "YulFunctionCall", + "src": "35689:63:70" + }, + "nativeSrc": "35689:63:70", + "nodeType": "YulExpressionStatement", + "src": "35689:63:70" + }, + { + "nativeSrc": "35761:46:70", + "nodeType": "YulAssignment", + "src": "35761:46:70", + "value": { + "arguments": [ + { + "name": "memberValue0_4", + "nativeSrc": "35787:14:70", + "nodeType": "YulIdentifier", + "src": "35787:14:70" + }, + { + "name": "end", + "nativeSrc": "35803:3:70", + "nodeType": "YulIdentifier", + "src": "35803:3:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "35769:17:70", + "nodeType": "YulIdentifier", + "src": "35769:17:70" + }, + "nativeSrc": "35769:38:70", + "nodeType": "YulFunctionCall", + "src": "35769:38:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "35761:4:70", + "nodeType": "YulIdentifier", + "src": "35761:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35827:9:70", + "nodeType": "YulIdentifier", + "src": "35827:9:70" + }, + { + "kind": "number", + "nativeSrc": "35838:4:70", + "nodeType": "YulLiteral", + "src": "35838:4:70", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35823:3:70", + "nodeType": "YulIdentifier", + "src": "35823:3:70" + }, + "nativeSrc": "35823:20:70", + "nodeType": "YulFunctionCall", + "src": "35823:20:70" + }, + { + "name": "value1", + "nativeSrc": "35845:6:70", + "nodeType": "YulIdentifier", + "src": "35845:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "35816:6:70", + "nodeType": "YulIdentifier", + "src": "35816:6:70" + }, + "nativeSrc": "35816:36:70", + "nodeType": "YulFunctionCall", + "src": "35816:36:70" + }, + "nativeSrc": "35816:36:70", + "nodeType": "YulExpressionStatement", + "src": "35816:36:70" + }, + { + "expression": { + "arguments": [ + { + "name": "value2", + "nativeSrc": "35880:6:70", + "nodeType": "YulIdentifier", + "src": "35880:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "35892:9:70", + "nodeType": "YulIdentifier", + "src": "35892:9:70" + }, + { + "kind": "number", + "nativeSrc": "35903:4:70", + "nodeType": "YulLiteral", + "src": "35903:4:70", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "35888:3:70", + "nodeType": "YulIdentifier", + "src": "35888:3:70" + }, + "nativeSrc": "35888:20:70", + "nodeType": "YulFunctionCall", + "src": "35888:20:70" + } + ], + "functionName": { + "name": "abi_encode_address", + "nativeSrc": "35861:18:70", + "nodeType": "YulIdentifier", + "src": "35861:18:70" + }, + "nativeSrc": "35861:48:70", + "nodeType": "YulFunctionCall", + "src": "35861:48:70" + }, + "nativeSrc": "35861:48:70", + "nodeType": "YulExpressionStatement", + "src": "35861:48:70" + } + ] + }, + "name": "abi_encode_tuple_t_struct$_SignedRAV_$2525_memory_ptr_t_uint256_t_address__to_t_struct$_SignedRAV_$2525_memory_ptr_t_uint256_t_address__fromStack_reversed", + "nativeSrc": "34538:1377:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "34702:9:70", + "nodeType": "YulTypedName", + "src": "34702:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "34713:6:70", + "nodeType": "YulTypedName", + "src": "34713:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "34721:6:70", + "nodeType": "YulTypedName", + "src": "34721:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "34729:6:70", + "nodeType": "YulTypedName", + "src": "34729:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "34740:4:70", + "nodeType": "YulTypedName", + "src": "34740:4:70", + "type": "" + } + ], + "src": "34538:1377:70" + }, + { + "body": { + "nativeSrc": "36094:158:70", + "nodeType": "YulBlock", + "src": "36094:158:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36111:9:70", + "nodeType": "YulIdentifier", + "src": "36111:9:70" + }, + { + "kind": "number", + "nativeSrc": "36122:2:70", + "nodeType": "YulLiteral", + "src": "36122:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "36104:6:70", + "nodeType": "YulIdentifier", + "src": "36104:6:70" + }, + "nativeSrc": "36104:21:70", + "nodeType": "YulFunctionCall", + "src": "36104:21:70" + }, + "nativeSrc": "36104:21:70", + "nodeType": "YulExpressionStatement", + "src": "36104:21:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36145:9:70", + "nodeType": "YulIdentifier", + "src": "36145:9:70" + }, + { + "kind": "number", + "nativeSrc": "36156:2:70", + "nodeType": "YulLiteral", + "src": "36156:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36141:3:70", + "nodeType": "YulIdentifier", + "src": "36141:3:70" + }, + "nativeSrc": "36141:18:70", + "nodeType": "YulFunctionCall", + "src": "36141:18:70" + }, + { + "kind": "number", + "nativeSrc": "36161:1:70", + "nodeType": "YulLiteral", + "src": "36161:1:70", + "type": "", + "value": "9" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "36134:6:70", + "nodeType": "YulIdentifier", + "src": "36134:6:70" + }, + "nativeSrc": "36134:29:70", + "nodeType": "YulFunctionCall", + "src": "36134:29:70" + }, + "nativeSrc": "36134:29:70", + "nodeType": "YulExpressionStatement", + "src": "36134:29:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36183:9:70", + "nodeType": "YulIdentifier", + "src": "36183:9:70" + }, + { + "kind": "number", + "nativeSrc": "36194:2:70", + "nodeType": "YulLiteral", + "src": "36194:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36179:3:70", + "nodeType": "YulIdentifier", + "src": "36179:3:70" + }, + "nativeSrc": "36179:18:70", + "nodeType": "YulFunctionCall", + "src": "36179:18:70" + }, + { + "hexValue": "217472616e73666572", + "kind": "string", + "nativeSrc": "36199:11:70", + "nodeType": "YulLiteral", + "src": "36199:11:70", + "type": "", + "value": "!transfer" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "36172:6:70", + "nodeType": "YulIdentifier", + "src": "36172:6:70" + }, + "nativeSrc": "36172:39:70", + "nodeType": "YulFunctionCall", + "src": "36172:39:70" + }, + "nativeSrc": "36172:39:70", + "nodeType": "YulExpressionStatement", + "src": "36172:39:70" + }, + { + "nativeSrc": "36220:26:70", + "nodeType": "YulAssignment", + "src": "36220:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36232:9:70", + "nodeType": "YulIdentifier", + "src": "36232:9:70" + }, + { + "kind": "number", + "nativeSrc": "36243:2:70", + "nodeType": "YulLiteral", + "src": "36243:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36228:3:70", + "nodeType": "YulIdentifier", + "src": "36228:3:70" + }, + "nativeSrc": "36228:18:70", + "nodeType": "YulFunctionCall", + "src": "36228:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "36220:4:70", + "nodeType": "YulIdentifier", + "src": "36220:4:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50__to_t_string_memory_ptr__fromStack_reversed", + "nativeSrc": "35920:332:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "36071:9:70", + "nodeType": "YulTypedName", + "src": "36071:9:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "36085:4:70", + "nodeType": "YulTypedName", + "src": "36085:4:70", + "type": "" + } + ], + "src": "35920:332:70" + }, + { + "body": { + "nativeSrc": "36429:236:70", + "nodeType": "YulBlock", + "src": "36429:236:70", + "statements": [ + { + "nativeSrc": "36439:26:70", + "nodeType": "YulAssignment", + "src": "36439:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36451:9:70", + "nodeType": "YulIdentifier", + "src": "36451:9:70" + }, + { + "kind": "number", + "nativeSrc": "36462:2:70", + "nodeType": "YulLiteral", + "src": "36462:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36447:3:70", + "nodeType": "YulIdentifier", + "src": "36447:3:70" + }, + "nativeSrc": "36447:18:70", + "nodeType": "YulFunctionCall", + "src": "36447:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "36439:4:70", + "nodeType": "YulIdentifier", + "src": "36439:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36481:9:70", + "nodeType": "YulIdentifier", + "src": "36481:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "36496:6:70", + "nodeType": "YulIdentifier", + "src": "36496:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "36512:3:70", + "nodeType": "YulLiteral", + "src": "36512:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "36517:1:70", + "nodeType": "YulLiteral", + "src": "36517:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "36508:3:70", + "nodeType": "YulIdentifier", + "src": "36508:3:70" + }, + "nativeSrc": "36508:11:70", + "nodeType": "YulFunctionCall", + "src": "36508:11:70" + }, + { + "kind": "number", + "nativeSrc": "36521:1:70", + "nodeType": "YulLiteral", + "src": "36521:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "36504:3:70", + "nodeType": "YulIdentifier", + "src": "36504:3:70" + }, + "nativeSrc": "36504:19:70", + "nodeType": "YulFunctionCall", + "src": "36504:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "36492:3:70", + "nodeType": "YulIdentifier", + "src": "36492:3:70" + }, + "nativeSrc": "36492:32:70", + "nodeType": "YulFunctionCall", + "src": "36492:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "36474:6:70", + "nodeType": "YulIdentifier", + "src": "36474:6:70" + }, + "nativeSrc": "36474:51:70", + "nodeType": "YulFunctionCall", + "src": "36474:51:70" + }, + "nativeSrc": "36474:51:70", + "nodeType": "YulExpressionStatement", + "src": "36474:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36545:9:70", + "nodeType": "YulIdentifier", + "src": "36545:9:70" + }, + { + "kind": "number", + "nativeSrc": "36556:2:70", + "nodeType": "YulLiteral", + "src": "36556:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36541:3:70", + "nodeType": "YulIdentifier", + "src": "36541:3:70" + }, + "nativeSrc": "36541:18:70", + "nodeType": "YulFunctionCall", + "src": "36541:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "36565:6:70", + "nodeType": "YulIdentifier", + "src": "36565:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "36581:3:70", + "nodeType": "YulLiteral", + "src": "36581:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "36586:1:70", + "nodeType": "YulLiteral", + "src": "36586:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "36577:3:70", + "nodeType": "YulIdentifier", + "src": "36577:3:70" + }, + "nativeSrc": "36577:11:70", + "nodeType": "YulFunctionCall", + "src": "36577:11:70" + }, + { + "kind": "number", + "nativeSrc": "36590:1:70", + "nodeType": "YulLiteral", + "src": "36590:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "36573:3:70", + "nodeType": "YulIdentifier", + "src": "36573:3:70" + }, + "nativeSrc": "36573:19:70", + "nodeType": "YulFunctionCall", + "src": "36573:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "36561:3:70", + "nodeType": "YulIdentifier", + "src": "36561:3:70" + }, + "nativeSrc": "36561:32:70", + "nodeType": "YulFunctionCall", + "src": "36561:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "36534:6:70", + "nodeType": "YulIdentifier", + "src": "36534:6:70" + }, + "nativeSrc": "36534:60:70", + "nodeType": "YulFunctionCall", + "src": "36534:60:70" + }, + "nativeSrc": "36534:60:70", + "nodeType": "YulExpressionStatement", + "src": "36534:60:70" + }, + { + "expression": { + "arguments": [ + { + "name": "value2", + "nativeSrc": "36632:6:70", + "nodeType": "YulIdentifier", + "src": "36632:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "36644:9:70", + "nodeType": "YulIdentifier", + "src": "36644:9:70" + }, + { + "kind": "number", + "nativeSrc": "36655:2:70", + "nodeType": "YulLiteral", + "src": "36655:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36640:3:70", + "nodeType": "YulIdentifier", + "src": "36640:3:70" + }, + "nativeSrc": "36640:18:70", + "nodeType": "YulFunctionCall", + "src": "36640:18:70" + } + ], + "functionName": { + "name": "abi_encode_enum_PaymentTypes", + "nativeSrc": "36603:28:70", + "nodeType": "YulIdentifier", + "src": "36603:28:70" + }, + "nativeSrc": "36603:56:70", + "nodeType": "YulFunctionCall", + "src": "36603:56:70" + }, + "nativeSrc": "36603:56:70", + "nodeType": "YulExpressionStatement", + "src": "36603:56:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_enum$_PaymentTypes_$2433__to_t_address_t_address_t_uint8__fromStack_reversed", + "nativeSrc": "36257:408:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "36382:9:70", + "nodeType": "YulTypedName", + "src": "36382:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "36393:6:70", + "nodeType": "YulTypedName", + "src": "36393:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "36401:6:70", + "nodeType": "YulTypedName", + "src": "36401:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "36409:6:70", + "nodeType": "YulTypedName", + "src": "36409:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "36420:4:70", + "nodeType": "YulTypedName", + "src": "36420:4:70", + "type": "" + } + ], + "src": "36257:408:70" + }, + { + "body": { + "nativeSrc": "36783:893:70", + "nodeType": "YulBlock", + "src": "36783:893:70", + "statements": [ + { + "nativeSrc": "36793:43:70", + "nodeType": "YulVariableDeclaration", + "src": "36793:43:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nativeSrc": "36811:7:70", + "nodeType": "YulIdentifier", + "src": "36811:7:70" + }, + { + "name": "headStart", + "nativeSrc": "36820:9:70", + "nodeType": "YulIdentifier", + "src": "36820:9:70" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "36807:3:70", + "nodeType": "YulIdentifier", + "src": "36807:3:70" + }, + "nativeSrc": "36807:23:70", + "nodeType": "YulFunctionCall", + "src": "36807:23:70" + }, + { + "kind": "number", + "nativeSrc": "36832:3:70", + "nodeType": "YulLiteral", + "src": "36832:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "slt", + "nativeSrc": "36803:3:70", + "nodeType": "YulIdentifier", + "src": "36803:3:70" + }, + "nativeSrc": "36803:33:70", + "nodeType": "YulFunctionCall", + "src": "36803:33:70" + }, + "variables": [ + { + "name": "_1", + "nativeSrc": "36797:2:70", + "nodeType": "YulTypedName", + "src": "36797:2:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "36851:16:70", + "nodeType": "YulBlock", + "src": "36851:16:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "36860:1:70", + "nodeType": "YulLiteral", + "src": "36860:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "36863:1:70", + "nodeType": "YulLiteral", + "src": "36863:1:70", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "36853:6:70", + "nodeType": "YulIdentifier", + "src": "36853:6:70" + }, + "nativeSrc": "36853:12:70", + "nodeType": "YulFunctionCall", + "src": "36853:12:70" + }, + "nativeSrc": "36853:12:70", + "nodeType": "YulExpressionStatement", + "src": "36853:12:70" + } + ] + }, + "condition": { + "name": "_1", + "nativeSrc": "36848:2:70", + "nodeType": "YulIdentifier", + "src": "36848:2:70" + }, + "nativeSrc": "36845:22:70", + "nodeType": "YulIf", + "src": "36845:22:70" + }, + { + "nativeSrc": "36876:7:70", + "nodeType": "YulAssignment", + "src": "36876:7:70", + "value": { + "kind": "number", + "nativeSrc": "36882:1:70", + "nodeType": "YulLiteral", + "src": "36882:1:70", + "type": "", + "value": "0" + }, + "variableNames": [ + { + "name": "_1", + "nativeSrc": "36876:2:70", + "nodeType": "YulIdentifier", + "src": "36876:2:70" + } + ] + }, + { + "nativeSrc": "36892:16:70", + "nodeType": "YulVariableDeclaration", + "src": "36892:16:70", + "value": { + "name": "_1", + "nativeSrc": "36906:2:70", + "nodeType": "YulIdentifier", + "src": "36906:2:70" + }, + "variables": [ + { + "name": "memPtr", + "nativeSrc": "36896:6:70", + "nodeType": "YulTypedName", + "src": "36896:6:70", + "type": "" + } + ] + }, + { + "nativeSrc": "36917:19:70", + "nodeType": "YulAssignment", + "src": "36917:19:70", + "value": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "36933:2:70", + "nodeType": "YulLiteral", + "src": "36933:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "36927:5:70", + "nodeType": "YulIdentifier", + "src": "36927:5:70" + }, + "nativeSrc": "36927:9:70", + "nodeType": "YulFunctionCall", + "src": "36927:9:70" + }, + "variableNames": [ + { + "name": "memPtr", + "nativeSrc": "36917:6:70", + "nodeType": "YulIdentifier", + "src": "36917:6:70" + } + ] + }, + { + "nativeSrc": "36945:34:70", + "nodeType": "YulVariableDeclaration", + "src": "36945:34:70", + "value": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "36967:6:70", + "nodeType": "YulIdentifier", + "src": "36967:6:70" + }, + { + "kind": "number", + "nativeSrc": "36975:3:70", + "nodeType": "YulLiteral", + "src": "36975:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "36963:3:70", + "nodeType": "YulIdentifier", + "src": "36963:3:70" + }, + "nativeSrc": "36963:16:70", + "nodeType": "YulFunctionCall", + "src": "36963:16:70" + }, + "variables": [ + { + "name": "newFreePtr", + "nativeSrc": "36949:10:70", + "nodeType": "YulTypedName", + "src": "36949:10:70", + "type": "" + } + ] + }, + { + "body": { + "nativeSrc": "37054:22:70", + "nodeType": "YulBlock", + "src": "37054:22:70", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nativeSrc": "37056:16:70", + "nodeType": "YulIdentifier", + "src": "37056:16:70" + }, + "nativeSrc": "37056:18:70", + "nodeType": "YulFunctionCall", + "src": "37056:18:70" + }, + "nativeSrc": "37056:18:70", + "nodeType": "YulExpressionStatement", + "src": "37056:18:70" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "36997:10:70", + "nodeType": "YulIdentifier", + "src": "36997:10:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "37017:2:70", + "nodeType": "YulLiteral", + "src": "37017:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "37021:1:70", + "nodeType": "YulLiteral", + "src": "37021:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "37013:3:70", + "nodeType": "YulIdentifier", + "src": "37013:3:70" + }, + "nativeSrc": "37013:10:70", + "nodeType": "YulFunctionCall", + "src": "37013:10:70" + }, + { + "kind": "number", + "nativeSrc": "37025:1:70", + "nodeType": "YulLiteral", + "src": "37025:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "37009:3:70", + "nodeType": "YulIdentifier", + "src": "37009:3:70" + }, + "nativeSrc": "37009:18:70", + "nodeType": "YulFunctionCall", + "src": "37009:18:70" + } + ], + "functionName": { + "name": "gt", + "nativeSrc": "36994:2:70", + "nodeType": "YulIdentifier", + "src": "36994:2:70" + }, + "nativeSrc": "36994:34:70", + "nodeType": "YulFunctionCall", + "src": "36994:34:70" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nativeSrc": "37033:10:70", + "nodeType": "YulIdentifier", + "src": "37033:10:70" + }, + { + "name": "memPtr", + "nativeSrc": "37045:6:70", + "nodeType": "YulIdentifier", + "src": "37045:6:70" + } + ], + "functionName": { + "name": "lt", + "nativeSrc": "37030:2:70", + "nodeType": "YulIdentifier", + "src": "37030:2:70" + }, + "nativeSrc": "37030:22:70", + "nodeType": "YulFunctionCall", + "src": "37030:22:70" + } + ], + "functionName": { + "name": "or", + "nativeSrc": "36991:2:70", + "nodeType": "YulIdentifier", + "src": "36991:2:70" + }, + "nativeSrc": "36991:62:70", + "nodeType": "YulFunctionCall", + "src": "36991:62:70" + }, + "nativeSrc": "36988:88:70", + "nodeType": "YulIf", + "src": "36988:88:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "37092:2:70", + "nodeType": "YulLiteral", + "src": "37092:2:70", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nativeSrc": "37096:10:70", + "nodeType": "YulIdentifier", + "src": "37096:10:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37085:6:70", + "nodeType": "YulIdentifier", + "src": "37085:6:70" + }, + "nativeSrc": "37085:22:70", + "nodeType": "YulFunctionCall", + "src": "37085:22:70" + }, + "nativeSrc": "37085:22:70", + "nodeType": "YulExpressionStatement", + "src": "37085:22:70" + }, + { + "nativeSrc": "37116:15:70", + "nodeType": "YulVariableDeclaration", + "src": "37116:15:70", + "value": { + "name": "_1", + "nativeSrc": "37129:2:70", + "nodeType": "YulIdentifier", + "src": "37129:2:70" + }, + "variables": [ + { + "name": "value", + "nativeSrc": "37120:5:70", + "nodeType": "YulTypedName", + "src": "37120:5:70", + "type": "" + } + ] + }, + { + "nativeSrc": "37140:25:70", + "nodeType": "YulAssignment", + "src": "37140:25:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37155:9:70", + "nodeType": "YulIdentifier", + "src": "37155:9:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "37149:5:70", + "nodeType": "YulIdentifier", + "src": "37149:5:70" + }, + "nativeSrc": "37149:16:70", + "nodeType": "YulFunctionCall", + "src": "37149:16:70" + }, + "variableNames": [ + { + "name": "value", + "nativeSrc": "37140:5:70", + "nodeType": "YulIdentifier", + "src": "37140:5:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "37181:6:70", + "nodeType": "YulIdentifier", + "src": "37181:6:70" + }, + { + "name": "value", + "nativeSrc": "37189:5:70", + "nodeType": "YulIdentifier", + "src": "37189:5:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37174:6:70", + "nodeType": "YulIdentifier", + "src": "37174:6:70" + }, + "nativeSrc": "37174:21:70", + "nodeType": "YulFunctionCall", + "src": "37174:21:70" + }, + "nativeSrc": "37174:21:70", + "nodeType": "YulExpressionStatement", + "src": "37174:21:70" + }, + { + "nativeSrc": "37204:17:70", + "nodeType": "YulVariableDeclaration", + "src": "37204:17:70", + "value": { + "name": "_1", + "nativeSrc": "37219:2:70", + "nodeType": "YulIdentifier", + "src": "37219:2:70" + }, + "variables": [ + { + "name": "value_1", + "nativeSrc": "37208:7:70", + "nodeType": "YulTypedName", + "src": "37208:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "37230:36:70", + "nodeType": "YulAssignment", + "src": "37230:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37251:9:70", + "nodeType": "YulIdentifier", + "src": "37251:9:70" + }, + { + "kind": "number", + "nativeSrc": "37262:2:70", + "nodeType": "YulLiteral", + "src": "37262:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37247:3:70", + "nodeType": "YulIdentifier", + "src": "37247:3:70" + }, + "nativeSrc": "37247:18:70", + "nodeType": "YulFunctionCall", + "src": "37247:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "37241:5:70", + "nodeType": "YulIdentifier", + "src": "37241:5:70" + }, + "nativeSrc": "37241:25:70", + "nodeType": "YulFunctionCall", + "src": "37241:25:70" + }, + "variableNames": [ + { + "name": "value_1", + "nativeSrc": "37230:7:70", + "nodeType": "YulIdentifier", + "src": "37230:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "37286:6:70", + "nodeType": "YulIdentifier", + "src": "37286:6:70" + }, + { + "kind": "number", + "nativeSrc": "37294:2:70", + "nodeType": "YulLiteral", + "src": "37294:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37282:3:70", + "nodeType": "YulIdentifier", + "src": "37282:3:70" + }, + "nativeSrc": "37282:15:70", + "nodeType": "YulFunctionCall", + "src": "37282:15:70" + }, + { + "name": "value_1", + "nativeSrc": "37299:7:70", + "nodeType": "YulIdentifier", + "src": "37299:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37275:6:70", + "nodeType": "YulIdentifier", + "src": "37275:6:70" + }, + "nativeSrc": "37275:32:70", + "nodeType": "YulFunctionCall", + "src": "37275:32:70" + }, + "nativeSrc": "37275:32:70", + "nodeType": "YulExpressionStatement", + "src": "37275:32:70" + }, + { + "nativeSrc": "37316:17:70", + "nodeType": "YulVariableDeclaration", + "src": "37316:17:70", + "value": { + "name": "_1", + "nativeSrc": "37331:2:70", + "nodeType": "YulIdentifier", + "src": "37331:2:70" + }, + "variables": [ + { + "name": "value_2", + "nativeSrc": "37320:7:70", + "nodeType": "YulTypedName", + "src": "37320:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "37342:36:70", + "nodeType": "YulAssignment", + "src": "37342:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37363:9:70", + "nodeType": "YulIdentifier", + "src": "37363:9:70" + }, + { + "kind": "number", + "nativeSrc": "37374:2:70", + "nodeType": "YulLiteral", + "src": "37374:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37359:3:70", + "nodeType": "YulIdentifier", + "src": "37359:3:70" + }, + "nativeSrc": "37359:18:70", + "nodeType": "YulFunctionCall", + "src": "37359:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "37353:5:70", + "nodeType": "YulIdentifier", + "src": "37353:5:70" + }, + "nativeSrc": "37353:25:70", + "nodeType": "YulFunctionCall", + "src": "37353:25:70" + }, + "variableNames": [ + { + "name": "value_2", + "nativeSrc": "37342:7:70", + "nodeType": "YulIdentifier", + "src": "37342:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "37398:6:70", + "nodeType": "YulIdentifier", + "src": "37398:6:70" + }, + { + "kind": "number", + "nativeSrc": "37406:2:70", + "nodeType": "YulLiteral", + "src": "37406:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37394:3:70", + "nodeType": "YulIdentifier", + "src": "37394:3:70" + }, + "nativeSrc": "37394:15:70", + "nodeType": "YulFunctionCall", + "src": "37394:15:70" + }, + { + "name": "value_2", + "nativeSrc": "37411:7:70", + "nodeType": "YulIdentifier", + "src": "37411:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37387:6:70", + "nodeType": "YulIdentifier", + "src": "37387:6:70" + }, + "nativeSrc": "37387:32:70", + "nodeType": "YulFunctionCall", + "src": "37387:32:70" + }, + "nativeSrc": "37387:32:70", + "nodeType": "YulExpressionStatement", + "src": "37387:32:70" + }, + { + "nativeSrc": "37428:17:70", + "nodeType": "YulVariableDeclaration", + "src": "37428:17:70", + "value": { + "name": "_1", + "nativeSrc": "37443:2:70", + "nodeType": "YulIdentifier", + "src": "37443:2:70" + }, + "variables": [ + { + "name": "value_3", + "nativeSrc": "37432:7:70", + "nodeType": "YulTypedName", + "src": "37432:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "37454:36:70", + "nodeType": "YulAssignment", + "src": "37454:36:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37475:9:70", + "nodeType": "YulIdentifier", + "src": "37475:9:70" + }, + { + "kind": "number", + "nativeSrc": "37486:2:70", + "nodeType": "YulLiteral", + "src": "37486:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37471:3:70", + "nodeType": "YulIdentifier", + "src": "37471:3:70" + }, + "nativeSrc": "37471:18:70", + "nodeType": "YulFunctionCall", + "src": "37471:18:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "37465:5:70", + "nodeType": "YulIdentifier", + "src": "37465:5:70" + }, + "nativeSrc": "37465:25:70", + "nodeType": "YulFunctionCall", + "src": "37465:25:70" + }, + "variableNames": [ + { + "name": "value_3", + "nativeSrc": "37454:7:70", + "nodeType": "YulIdentifier", + "src": "37454:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "37510:6:70", + "nodeType": "YulIdentifier", + "src": "37510:6:70" + }, + { + "kind": "number", + "nativeSrc": "37518:2:70", + "nodeType": "YulLiteral", + "src": "37518:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37506:3:70", + "nodeType": "YulIdentifier", + "src": "37506:3:70" + }, + "nativeSrc": "37506:15:70", + "nodeType": "YulFunctionCall", + "src": "37506:15:70" + }, + { + "name": "value_3", + "nativeSrc": "37523:7:70", + "nodeType": "YulIdentifier", + "src": "37523:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37499:6:70", + "nodeType": "YulIdentifier", + "src": "37499:6:70" + }, + "nativeSrc": "37499:32:70", + "nodeType": "YulFunctionCall", + "src": "37499:32:70" + }, + "nativeSrc": "37499:32:70", + "nodeType": "YulExpressionStatement", + "src": "37499:32:70" + }, + { + "nativeSrc": "37540:17:70", + "nodeType": "YulVariableDeclaration", + "src": "37540:17:70", + "value": { + "name": "_1", + "nativeSrc": "37555:2:70", + "nodeType": "YulIdentifier", + "src": "37555:2:70" + }, + "variables": [ + { + "name": "value_4", + "nativeSrc": "37544:7:70", + "nodeType": "YulTypedName", + "src": "37544:7:70", + "type": "" + } + ] + }, + { + "nativeSrc": "37566:37:70", + "nodeType": "YulAssignment", + "src": "37566:37:70", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37587:9:70", + "nodeType": "YulIdentifier", + "src": "37587:9:70" + }, + { + "kind": "number", + "nativeSrc": "37598:3:70", + "nodeType": "YulLiteral", + "src": "37598:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37583:3:70", + "nodeType": "YulIdentifier", + "src": "37583:3:70" + }, + "nativeSrc": "37583:19:70", + "nodeType": "YulFunctionCall", + "src": "37583:19:70" + } + ], + "functionName": { + "name": "mload", + "nativeSrc": "37577:5:70", + "nodeType": "YulIdentifier", + "src": "37577:5:70" + }, + "nativeSrc": "37577:26:70", + "nodeType": "YulFunctionCall", + "src": "37577:26:70" + }, + "variableNames": [ + { + "name": "value_4", + "nativeSrc": "37566:7:70", + "nodeType": "YulIdentifier", + "src": "37566:7:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nativeSrc": "37623:6:70", + "nodeType": "YulIdentifier", + "src": "37623:6:70" + }, + { + "kind": "number", + "nativeSrc": "37631:3:70", + "nodeType": "YulLiteral", + "src": "37631:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37619:3:70", + "nodeType": "YulIdentifier", + "src": "37619:3:70" + }, + "nativeSrc": "37619:16:70", + "nodeType": "YulFunctionCall", + "src": "37619:16:70" + }, + { + "name": "value_4", + "nativeSrc": "37637:7:70", + "nodeType": "YulIdentifier", + "src": "37637:7:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37612:6:70", + "nodeType": "YulIdentifier", + "src": "37612:6:70" + }, + "nativeSrc": "37612:33:70", + "nodeType": "YulFunctionCall", + "src": "37612:33:70" + }, + "nativeSrc": "37612:33:70", + "nodeType": "YulExpressionStatement", + "src": "37612:33:70" + }, + { + "nativeSrc": "37654:16:70", + "nodeType": "YulAssignment", + "src": "37654:16:70", + "value": { + "name": "memPtr", + "nativeSrc": "37664:6:70", + "nodeType": "YulIdentifier", + "src": "37664:6:70" + }, + "variableNames": [ + { + "name": "value0", + "nativeSrc": "37654:6:70", + "nodeType": "YulIdentifier", + "src": "37654:6:70" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_struct$_DelegationPool_$3992_memory_ptr_fromMemory", + "nativeSrc": "36670:1006:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "36749:9:70", + "nodeType": "YulTypedName", + "src": "36749:9:70", + "type": "" + }, + { + "name": "dataEnd", + "nativeSrc": "36760:7:70", + "nodeType": "YulTypedName", + "src": "36760:7:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nativeSrc": "36772:6:70", + "nodeType": "YulTypedName", + "src": "36772:6:70", + "type": "" + } + ], + "src": "36670:1006:70" + }, + { + "body": { + "nativeSrc": "37838:214:70", + "nodeType": "YulBlock", + "src": "37838:214:70", + "statements": [ + { + "nativeSrc": "37848:26:70", + "nodeType": "YulAssignment", + "src": "37848:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37860:9:70", + "nodeType": "YulIdentifier", + "src": "37860:9:70" + }, + { + "kind": "number", + "nativeSrc": "37871:2:70", + "nodeType": "YulLiteral", + "src": "37871:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37856:3:70", + "nodeType": "YulIdentifier", + "src": "37856:3:70" + }, + "nativeSrc": "37856:18:70", + "nodeType": "YulFunctionCall", + "src": "37856:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "37848:4:70", + "nodeType": "YulIdentifier", + "src": "37848:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37890:9:70", + "nodeType": "YulIdentifier", + "src": "37890:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "37905:6:70", + "nodeType": "YulIdentifier", + "src": "37905:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "37921:3:70", + "nodeType": "YulLiteral", + "src": "37921:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "37926:1:70", + "nodeType": "YulLiteral", + "src": "37926:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "37917:3:70", + "nodeType": "YulIdentifier", + "src": "37917:3:70" + }, + "nativeSrc": "37917:11:70", + "nodeType": "YulFunctionCall", + "src": "37917:11:70" + }, + { + "kind": "number", + "nativeSrc": "37930:1:70", + "nodeType": "YulLiteral", + "src": "37930:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "37913:3:70", + "nodeType": "YulIdentifier", + "src": "37913:3:70" + }, + "nativeSrc": "37913:19:70", + "nodeType": "YulFunctionCall", + "src": "37913:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "37901:3:70", + "nodeType": "YulIdentifier", + "src": "37901:3:70" + }, + "nativeSrc": "37901:32:70", + "nodeType": "YulFunctionCall", + "src": "37901:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37883:6:70", + "nodeType": "YulIdentifier", + "src": "37883:6:70" + }, + "nativeSrc": "37883:51:70", + "nodeType": "YulFunctionCall", + "src": "37883:51:70" + }, + "nativeSrc": "37883:51:70", + "nodeType": "YulExpressionStatement", + "src": "37883:51:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "37954:9:70", + "nodeType": "YulIdentifier", + "src": "37954:9:70" + }, + { + "kind": "number", + "nativeSrc": "37965:2:70", + "nodeType": "YulLiteral", + "src": "37965:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "37950:3:70", + "nodeType": "YulIdentifier", + "src": "37950:3:70" + }, + "nativeSrc": "37950:18:70", + "nodeType": "YulFunctionCall", + "src": "37950:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "37974:6:70", + "nodeType": "YulIdentifier", + "src": "37974:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "37990:3:70", + "nodeType": "YulLiteral", + "src": "37990:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "37995:1:70", + "nodeType": "YulLiteral", + "src": "37995:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "37986:3:70", + "nodeType": "YulIdentifier", + "src": "37986:3:70" + }, + "nativeSrc": "37986:11:70", + "nodeType": "YulFunctionCall", + "src": "37986:11:70" + }, + { + "kind": "number", + "nativeSrc": "37999:1:70", + "nodeType": "YulLiteral", + "src": "37999:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "37982:3:70", + "nodeType": "YulIdentifier", + "src": "37982:3:70" + }, + "nativeSrc": "37982:19:70", + "nodeType": "YulFunctionCall", + "src": "37982:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "37970:3:70", + "nodeType": "YulIdentifier", + "src": "37970:3:70" + }, + "nativeSrc": "37970:32:70", + "nodeType": "YulFunctionCall", + "src": "37970:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "37943:6:70", + "nodeType": "YulIdentifier", + "src": "37943:6:70" + }, + "nativeSrc": "37943:60:70", + "nodeType": "YulFunctionCall", + "src": "37943:60:70" + }, + "nativeSrc": "37943:60:70", + "nodeType": "YulExpressionStatement", + "src": "37943:60:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38023:9:70", + "nodeType": "YulIdentifier", + "src": "38023:9:70" + }, + { + "kind": "number", + "nativeSrc": "38034:2:70", + "nodeType": "YulLiteral", + "src": "38034:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38019:3:70", + "nodeType": "YulIdentifier", + "src": "38019:3:70" + }, + "nativeSrc": "38019:18:70", + "nodeType": "YulFunctionCall", + "src": "38019:18:70" + }, + { + "name": "value2", + "nativeSrc": "38039:6:70", + "nodeType": "YulIdentifier", + "src": "38039:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38012:6:70", + "nodeType": "YulIdentifier", + "src": "38012:6:70" + }, + "nativeSrc": "38012:34:70", + "nodeType": "YulFunctionCall", + "src": "38012:34:70" + }, + "nativeSrc": "38012:34:70", + "nodeType": "YulExpressionStatement", + "src": "38012:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed", + "nativeSrc": "37681:371:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "37791:9:70", + "nodeType": "YulTypedName", + "src": "37791:9:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "37802:6:70", + "nodeType": "YulTypedName", + "src": "37802:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "37810:6:70", + "nodeType": "YulTypedName", + "src": "37810:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "37818:6:70", + "nodeType": "YulTypedName", + "src": "37818:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "37829:4:70", + "nodeType": "YulTypedName", + "src": "37829:4:70", + "type": "" + } + ], + "src": "37681:371:70" + }, + { + "body": { + "nativeSrc": "38316:318:70", + "nodeType": "YulBlock", + "src": "38316:318:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38333:9:70", + "nodeType": "YulIdentifier", + "src": "38333:9:70" + }, + { + "name": "value0", + "nativeSrc": "38344:6:70", + "nodeType": "YulIdentifier", + "src": "38344:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38326:6:70", + "nodeType": "YulIdentifier", + "src": "38326:6:70" + }, + "nativeSrc": "38326:25:70", + "nodeType": "YulFunctionCall", + "src": "38326:25:70" + }, + "nativeSrc": "38326:25:70", + "nodeType": "YulExpressionStatement", + "src": "38326:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38371:9:70", + "nodeType": "YulIdentifier", + "src": "38371:9:70" + }, + { + "kind": "number", + "nativeSrc": "38382:2:70", + "nodeType": "YulLiteral", + "src": "38382:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38367:3:70", + "nodeType": "YulIdentifier", + "src": "38367:3:70" + }, + "nativeSrc": "38367:18:70", + "nodeType": "YulFunctionCall", + "src": "38367:18:70" + }, + { + "name": "value1", + "nativeSrc": "38387:6:70", + "nodeType": "YulIdentifier", + "src": "38387:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38360:6:70", + "nodeType": "YulIdentifier", + "src": "38360:6:70" + }, + "nativeSrc": "38360:34:70", + "nodeType": "YulFunctionCall", + "src": "38360:34:70" + }, + "nativeSrc": "38360:34:70", + "nodeType": "YulExpressionStatement", + "src": "38360:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38414:9:70", + "nodeType": "YulIdentifier", + "src": "38414:9:70" + }, + { + "kind": "number", + "nativeSrc": "38425:2:70", + "nodeType": "YulLiteral", + "src": "38425:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38410:3:70", + "nodeType": "YulIdentifier", + "src": "38410:3:70" + }, + "nativeSrc": "38410:18:70", + "nodeType": "YulFunctionCall", + "src": "38410:18:70" + }, + { + "name": "value2", + "nativeSrc": "38430:6:70", + "nodeType": "YulIdentifier", + "src": "38430:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38403:6:70", + "nodeType": "YulIdentifier", + "src": "38403:6:70" + }, + "nativeSrc": "38403:34:70", + "nodeType": "YulFunctionCall", + "src": "38403:34:70" + }, + "nativeSrc": "38403:34:70", + "nodeType": "YulExpressionStatement", + "src": "38403:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38457:9:70", + "nodeType": "YulIdentifier", + "src": "38457:9:70" + }, + { + "kind": "number", + "nativeSrc": "38468:2:70", + "nodeType": "YulLiteral", + "src": "38468:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38453:3:70", + "nodeType": "YulIdentifier", + "src": "38453:3:70" + }, + "nativeSrc": "38453:18:70", + "nodeType": "YulFunctionCall", + "src": "38453:18:70" + }, + { + "name": "value3", + "nativeSrc": "38473:6:70", + "nodeType": "YulIdentifier", + "src": "38473:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38446:6:70", + "nodeType": "YulIdentifier", + "src": "38446:6:70" + }, + "nativeSrc": "38446:34:70", + "nodeType": "YulFunctionCall", + "src": "38446:34:70" + }, + "nativeSrc": "38446:34:70", + "nodeType": "YulExpressionStatement", + "src": "38446:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38500:9:70", + "nodeType": "YulIdentifier", + "src": "38500:9:70" + }, + { + "kind": "number", + "nativeSrc": "38511:3:70", + "nodeType": "YulLiteral", + "src": "38511:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38496:3:70", + "nodeType": "YulIdentifier", + "src": "38496:3:70" + }, + "nativeSrc": "38496:19:70", + "nodeType": "YulFunctionCall", + "src": "38496:19:70" + }, + { + "kind": "number", + "nativeSrc": "38517:3:70", + "nodeType": "YulLiteral", + "src": "38517:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38489:6:70", + "nodeType": "YulIdentifier", + "src": "38489:6:70" + }, + "nativeSrc": "38489:32:70", + "nodeType": "YulFunctionCall", + "src": "38489:32:70" + }, + "nativeSrc": "38489:32:70", + "nodeType": "YulExpressionStatement", + "src": "38489:32:70" + }, + { + "nativeSrc": "38530:54:70", + "nodeType": "YulAssignment", + "src": "38530:54:70", + "value": { + "arguments": [ + { + "name": "value4", + "nativeSrc": "38556:6:70", + "nodeType": "YulIdentifier", + "src": "38556:6:70" + }, + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38568:9:70", + "nodeType": "YulIdentifier", + "src": "38568:9:70" + }, + { + "kind": "number", + "nativeSrc": "38579:3:70", + "nodeType": "YulLiteral", + "src": "38579:3:70", + "type": "", + "value": "192" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38564:3:70", + "nodeType": "YulIdentifier", + "src": "38564:3:70" + }, + "nativeSrc": "38564:19:70", + "nodeType": "YulFunctionCall", + "src": "38564:19:70" + } + ], + "functionName": { + "name": "abi_encode_string", + "nativeSrc": "38538:17:70", + "nodeType": "YulIdentifier", + "src": "38538:17:70" + }, + "nativeSrc": "38538:46:70", + "nodeType": "YulFunctionCall", + "src": "38538:46:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "38530:4:70", + "nodeType": "YulIdentifier", + "src": "38530:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "38604:9:70", + "nodeType": "YulIdentifier", + "src": "38604:9:70" + }, + { + "kind": "number", + "nativeSrc": "38615:3:70", + "nodeType": "YulLiteral", + "src": "38615:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38600:3:70", + "nodeType": "YulIdentifier", + "src": "38600:3:70" + }, + "nativeSrc": "38600:19:70", + "nodeType": "YulFunctionCall", + "src": "38600:19:70" + }, + { + "name": "value5", + "nativeSrc": "38621:6:70", + "nodeType": "YulIdentifier", + "src": "38621:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38593:6:70", + "nodeType": "YulIdentifier", + "src": "38593:6:70" + }, + "nativeSrc": "38593:35:70", + "nodeType": "YulFunctionCall", + "src": "38593:35:70" + }, + "nativeSrc": "38593:35:70", + "nodeType": "YulExpressionStatement", + "src": "38593:35:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256__to_t_uint256_t_uint256_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256__fromStack_reversed", + "nativeSrc": "38057:577:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "38245:9:70", + "nodeType": "YulTypedName", + "src": "38245:9:70", + "type": "" + }, + { + "name": "value5", + "nativeSrc": "38256:6:70", + "nodeType": "YulTypedName", + "src": "38256:6:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "38264:6:70", + "nodeType": "YulTypedName", + "src": "38264:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "38272:6:70", + "nodeType": "YulTypedName", + "src": "38272:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "38280:6:70", + "nodeType": "YulTypedName", + "src": "38280:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "38288:6:70", + "nodeType": "YulTypedName", + "src": "38288:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "38296:6:70", + "nodeType": "YulTypedName", + "src": "38296:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "38307:4:70", + "nodeType": "YulTypedName", + "src": "38307:4:70", + "type": "" + } + ], + "src": "38057:577:70" + }, + { + "body": { + "nativeSrc": "38814:215:70", + "nodeType": "YulBlock", + "src": "38814:215:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "38831:3:70", + "nodeType": "YulIdentifier", + "src": "38831:3:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "38844:2:70", + "nodeType": "YulLiteral", + "src": "38844:2:70", + "type": "", + "value": "96" + }, + { + "name": "value0", + "nativeSrc": "38848:6:70", + "nodeType": "YulIdentifier", + "src": "38848:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "38840:3:70", + "nodeType": "YulIdentifier", + "src": "38840:3:70" + }, + "nativeSrc": "38840:15:70", + "nodeType": "YulFunctionCall", + "src": "38840:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "38869:2:70", + "nodeType": "YulLiteral", + "src": "38869:2:70", + "type": "", + "value": "96" + }, + { + "kind": "number", + "nativeSrc": "38873:1:70", + "nodeType": "YulLiteral", + "src": "38873:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "38865:3:70", + "nodeType": "YulIdentifier", + "src": "38865:3:70" + }, + "nativeSrc": "38865:10:70", + "nodeType": "YulFunctionCall", + "src": "38865:10:70" + }, + { + "kind": "number", + "nativeSrc": "38877:1:70", + "nodeType": "YulLiteral", + "src": "38877:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "38861:3:70", + "nodeType": "YulIdentifier", + "src": "38861:3:70" + }, + "nativeSrc": "38861:18:70", + "nodeType": "YulFunctionCall", + "src": "38861:18:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "38857:3:70", + "nodeType": "YulIdentifier", + "src": "38857:3:70" + }, + "nativeSrc": "38857:23:70", + "nodeType": "YulFunctionCall", + "src": "38857:23:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "38836:3:70", + "nodeType": "YulIdentifier", + "src": "38836:3:70" + }, + "nativeSrc": "38836:45:70", + "nodeType": "YulFunctionCall", + "src": "38836:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38824:6:70", + "nodeType": "YulIdentifier", + "src": "38824:6:70" + }, + "nativeSrc": "38824:58:70", + "nodeType": "YulFunctionCall", + "src": "38824:58:70" + }, + "nativeSrc": "38824:58:70", + "nodeType": "YulExpressionStatement", + "src": "38824:58:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "38902:3:70", + "nodeType": "YulIdentifier", + "src": "38902:3:70" + }, + { + "kind": "number", + "nativeSrc": "38907:2:70", + "nodeType": "YulLiteral", + "src": "38907:2:70", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38898:3:70", + "nodeType": "YulIdentifier", + "src": "38898:3:70" + }, + "nativeSrc": "38898:12:70", + "nodeType": "YulFunctionCall", + "src": "38898:12:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "38920:2:70", + "nodeType": "YulLiteral", + "src": "38920:2:70", + "type": "", + "value": "96" + }, + { + "name": "value1", + "nativeSrc": "38924:6:70", + "nodeType": "YulIdentifier", + "src": "38924:6:70" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "38916:3:70", + "nodeType": "YulIdentifier", + "src": "38916:3:70" + }, + "nativeSrc": "38916:15:70", + "nodeType": "YulFunctionCall", + "src": "38916:15:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "38945:2:70", + "nodeType": "YulLiteral", + "src": "38945:2:70", + "type": "", + "value": "96" + }, + { + "kind": "number", + "nativeSrc": "38949:1:70", + "nodeType": "YulLiteral", + "src": "38949:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "38941:3:70", + "nodeType": "YulIdentifier", + "src": "38941:3:70" + }, + "nativeSrc": "38941:10:70", + "nodeType": "YulFunctionCall", + "src": "38941:10:70" + }, + { + "kind": "number", + "nativeSrc": "38953:1:70", + "nodeType": "YulLiteral", + "src": "38953:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "38937:3:70", + "nodeType": "YulIdentifier", + "src": "38937:3:70" + }, + "nativeSrc": "38937:18:70", + "nodeType": "YulFunctionCall", + "src": "38937:18:70" + } + ], + "functionName": { + "name": "not", + "nativeSrc": "38933:3:70", + "nodeType": "YulIdentifier", + "src": "38933:3:70" + }, + "nativeSrc": "38933:23:70", + "nodeType": "YulFunctionCall", + "src": "38933:23:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "38912:3:70", + "nodeType": "YulIdentifier", + "src": "38912:3:70" + }, + "nativeSrc": "38912:45:70", + "nodeType": "YulFunctionCall", + "src": "38912:45:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38891:6:70", + "nodeType": "YulIdentifier", + "src": "38891:6:70" + }, + "nativeSrc": "38891:67:70", + "nodeType": "YulFunctionCall", + "src": "38891:67:70" + }, + "nativeSrc": "38891:67:70", + "nodeType": "YulExpressionStatement", + "src": "38891:67:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nativeSrc": "38978:3:70", + "nodeType": "YulIdentifier", + "src": "38978:3:70" + }, + { + "kind": "number", + "nativeSrc": "38983:2:70", + "nodeType": "YulLiteral", + "src": "38983:2:70", + "type": "", + "value": "40" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "38974:3:70", + "nodeType": "YulIdentifier", + "src": "38974:3:70" + }, + "nativeSrc": "38974:12:70", + "nodeType": "YulFunctionCall", + "src": "38974:12:70" + }, + { + "name": "value2", + "nativeSrc": "38988:6:70", + "nodeType": "YulIdentifier", + "src": "38988:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "38967:6:70", + "nodeType": "YulIdentifier", + "src": "38967:6:70" + }, + "nativeSrc": "38967:28:70", + "nodeType": "YulFunctionCall", + "src": "38967:28:70" + }, + "nativeSrc": "38967:28:70", + "nodeType": "YulExpressionStatement", + "src": "38967:28:70" + }, + { + "nativeSrc": "39004:19:70", + "nodeType": "YulAssignment", + "src": "39004:19:70", + "value": { + "arguments": [ + { + "name": "pos", + "nativeSrc": "39015:3:70", + "nodeType": "YulIdentifier", + "src": "39015:3:70" + }, + { + "kind": "number", + "nativeSrc": "39020:2:70", + "nodeType": "YulLiteral", + "src": "39020:2:70", + "type": "", + "value": "72" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "39011:3:70", + "nodeType": "YulIdentifier", + "src": "39011:3:70" + }, + "nativeSrc": "39011:12:70", + "nodeType": "YulFunctionCall", + "src": "39011:12:70" + }, + "variableNames": [ + { + "name": "end", + "nativeSrc": "39004:3:70", + "nodeType": "YulIdentifier", + "src": "39004:3:70" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__nonPadded_inplace_fromStack_reversed", + "nativeSrc": "38639:390:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nativeSrc": "38774:3:70", + "nodeType": "YulTypedName", + "src": "38774:3:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "38779:6:70", + "nodeType": "YulTypedName", + "src": "38779:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "38787:6:70", + "nodeType": "YulTypedName", + "src": "38787:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "38795:6:70", + "nodeType": "YulTypedName", + "src": "38795:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nativeSrc": "38806:3:70", + "nodeType": "YulTypedName", + "src": "38806:3:70", + "type": "" + } + ], + "src": "38639:390:70" + }, + { + "body": { + "nativeSrc": "39080:171:70", + "nodeType": "YulBlock", + "src": "39080:171:70", + "statements": [ + { + "body": { + "nativeSrc": "39111:111:70", + "nodeType": "YulBlock", + "src": "39111:111:70", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "39132:1:70", + "nodeType": "YulLiteral", + "src": "39132:1:70", + "type": "", + "value": "0" + }, + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "39139:3:70", + "nodeType": "YulLiteral", + "src": "39139:3:70", + "type": "", + "value": "224" + }, + { + "kind": "number", + "nativeSrc": "39144:10:70", + "nodeType": "YulLiteral", + "src": "39144:10:70", + "type": "", + "value": "0x4e487b71" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "39135:3:70", + "nodeType": "YulIdentifier", + "src": "39135:3:70" + }, + "nativeSrc": "39135:20:70", + "nodeType": "YulFunctionCall", + "src": "39135:20:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "39125:6:70", + "nodeType": "YulIdentifier", + "src": "39125:6:70" + }, + "nativeSrc": "39125:31:70", + "nodeType": "YulFunctionCall", + "src": "39125:31:70" + }, + "nativeSrc": "39125:31:70", + "nodeType": "YulExpressionStatement", + "src": "39125:31:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "39176:1:70", + "nodeType": "YulLiteral", + "src": "39176:1:70", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nativeSrc": "39179:4:70", + "nodeType": "YulLiteral", + "src": "39179:4:70", + "type": "", + "value": "0x12" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "39169:6:70", + "nodeType": "YulIdentifier", + "src": "39169:6:70" + }, + "nativeSrc": "39169:15:70", + "nodeType": "YulFunctionCall", + "src": "39169:15:70" + }, + "nativeSrc": "39169:15:70", + "nodeType": "YulExpressionStatement", + "src": "39169:15:70" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nativeSrc": "39204:1:70", + "nodeType": "YulLiteral", + "src": "39204:1:70", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "39207:4:70", + "nodeType": "YulLiteral", + "src": "39207:4:70", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nativeSrc": "39197:6:70", + "nodeType": "YulIdentifier", + "src": "39197:6:70" + }, + "nativeSrc": "39197:15:70", + "nodeType": "YulFunctionCall", + "src": "39197:15:70" + }, + "nativeSrc": "39197:15:70", + "nodeType": "YulExpressionStatement", + "src": "39197:15:70" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "y", + "nativeSrc": "39100:1:70", + "nodeType": "YulIdentifier", + "src": "39100:1:70" + } + ], + "functionName": { + "name": "iszero", + "nativeSrc": "39093:6:70", + "nodeType": "YulIdentifier", + "src": "39093:6:70" + }, + "nativeSrc": "39093:9:70", + "nodeType": "YulFunctionCall", + "src": "39093:9:70" + }, + "nativeSrc": "39090:132:70", + "nodeType": "YulIf", + "src": "39090:132:70" + }, + { + "nativeSrc": "39231:14:70", + "nodeType": "YulAssignment", + "src": "39231:14:70", + "value": { + "arguments": [ + { + "name": "x", + "nativeSrc": "39240:1:70", + "nodeType": "YulIdentifier", + "src": "39240:1:70" + }, + { + "name": "y", + "nativeSrc": "39243:1:70", + "nodeType": "YulIdentifier", + "src": "39243:1:70" + } + ], + "functionName": { + "name": "div", + "nativeSrc": "39236:3:70", + "nodeType": "YulIdentifier", + "src": "39236:3:70" + }, + "nativeSrc": "39236:9:70", + "nodeType": "YulFunctionCall", + "src": "39236:9:70" + }, + "variableNames": [ + { + "name": "r", + "nativeSrc": "39231:1:70", + "nodeType": "YulIdentifier", + "src": "39231:1:70" + } + ] + } + ] + }, + "name": "checked_div_t_uint256", + "nativeSrc": "39034:217:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nativeSrc": "39065:1:70", + "nodeType": "YulTypedName", + "src": "39065:1:70", + "type": "" + }, + { + "name": "y", + "nativeSrc": "39068:1:70", + "nodeType": "YulTypedName", + "src": "39068:1:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "r", + "nativeSrc": "39074:1:70", + "nodeType": "YulTypedName", + "src": "39074:1:70", + "type": "" + } + ], + "src": "39034:217:70" + }, + { + "body": { + "nativeSrc": "39383:153:70", + "nodeType": "YulBlock", + "src": "39383:153:70", + "statements": [ + { + "nativeSrc": "39393:26:70", + "nodeType": "YulAssignment", + "src": "39393:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "39405:9:70", + "nodeType": "YulIdentifier", + "src": "39405:9:70" + }, + { + "kind": "number", + "nativeSrc": "39416:2:70", + "nodeType": "YulLiteral", + "src": "39416:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "39401:3:70", + "nodeType": "YulIdentifier", + "src": "39401:3:70" + }, + "nativeSrc": "39401:18:70", + "nodeType": "YulFunctionCall", + "src": "39401:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "39393:4:70", + "nodeType": "YulIdentifier", + "src": "39393:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "39435:9:70", + "nodeType": "YulIdentifier", + "src": "39435:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "39450:6:70", + "nodeType": "YulIdentifier", + "src": "39450:6:70" + }, + { + "kind": "number", + "nativeSrc": "39458:10:70", + "nodeType": "YulLiteral", + "src": "39458:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "39446:3:70", + "nodeType": "YulIdentifier", + "src": "39446:3:70" + }, + "nativeSrc": "39446:23:70", + "nodeType": "YulFunctionCall", + "src": "39446:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "39428:6:70", + "nodeType": "YulIdentifier", + "src": "39428:6:70" + }, + "nativeSrc": "39428:42:70", + "nodeType": "YulFunctionCall", + "src": "39428:42:70" + }, + "nativeSrc": "39428:42:70", + "nodeType": "YulExpressionStatement", + "src": "39428:42:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "39490:9:70", + "nodeType": "YulIdentifier", + "src": "39490:9:70" + }, + { + "kind": "number", + "nativeSrc": "39501:2:70", + "nodeType": "YulLiteral", + "src": "39501:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "39486:3:70", + "nodeType": "YulIdentifier", + "src": "39486:3:70" + }, + "nativeSrc": "39486:18:70", + "nodeType": "YulFunctionCall", + "src": "39486:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "39510:6:70", + "nodeType": "YulIdentifier", + "src": "39510:6:70" + }, + { + "kind": "number", + "nativeSrc": "39518:10:70", + "nodeType": "YulLiteral", + "src": "39518:10:70", + "type": "", + "value": "0xffffffff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "39506:3:70", + "nodeType": "YulIdentifier", + "src": "39506:3:70" + }, + "nativeSrc": "39506:23:70", + "nodeType": "YulFunctionCall", + "src": "39506:23:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "39479:6:70", + "nodeType": "YulIdentifier", + "src": "39479:6:70" + }, + "nativeSrc": "39479:51:70", + "nodeType": "YulFunctionCall", + "src": "39479:51:70" + }, + "nativeSrc": "39479:51:70", + "nodeType": "YulExpressionStatement", + "src": "39479:51:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint32_t_uint32__to_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "39256:280:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "39344:9:70", + "nodeType": "YulTypedName", + "src": "39344:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "39355:6:70", + "nodeType": "YulTypedName", + "src": "39355:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "39363:6:70", + "nodeType": "YulTypedName", + "src": "39363:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "39374:4:70", + "nodeType": "YulTypedName", + "src": "39374:4:70", + "type": "" + } + ], + "src": "39256:280:70" + }, + { + "body": { + "nativeSrc": "39668:169:70", + "nodeType": "YulBlock", + "src": "39668:169:70", + "statements": [ + { + "nativeSrc": "39678:26:70", + "nodeType": "YulAssignment", + "src": "39678:26:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "39690:9:70", + "nodeType": "YulIdentifier", + "src": "39690:9:70" + }, + { + "kind": "number", + "nativeSrc": "39701:2:70", + "nodeType": "YulLiteral", + "src": "39701:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "39686:3:70", + "nodeType": "YulIdentifier", + "src": "39686:3:70" + }, + "nativeSrc": "39686:18:70", + "nodeType": "YulFunctionCall", + "src": "39686:18:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "39678:4:70", + "nodeType": "YulIdentifier", + "src": "39678:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "39720:9:70", + "nodeType": "YulIdentifier", + "src": "39720:9:70" + }, + { + "arguments": [ + { + "name": "value0", + "nativeSrc": "39735:6:70", + "nodeType": "YulIdentifier", + "src": "39735:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "39751:2:70", + "nodeType": "YulLiteral", + "src": "39751:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "39755:1:70", + "nodeType": "YulLiteral", + "src": "39755:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "39747:3:70", + "nodeType": "YulIdentifier", + "src": "39747:3:70" + }, + "nativeSrc": "39747:10:70", + "nodeType": "YulFunctionCall", + "src": "39747:10:70" + }, + { + "kind": "number", + "nativeSrc": "39759:1:70", + "nodeType": "YulLiteral", + "src": "39759:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "39743:3:70", + "nodeType": "YulIdentifier", + "src": "39743:3:70" + }, + "nativeSrc": "39743:18:70", + "nodeType": "YulFunctionCall", + "src": "39743:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "39731:3:70", + "nodeType": "YulIdentifier", + "src": "39731:3:70" + }, + "nativeSrc": "39731:31:70", + "nodeType": "YulFunctionCall", + "src": "39731:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "39713:6:70", + "nodeType": "YulIdentifier", + "src": "39713:6:70" + }, + "nativeSrc": "39713:50:70", + "nodeType": "YulFunctionCall", + "src": "39713:50:70" + }, + "nativeSrc": "39713:50:70", + "nodeType": "YulExpressionStatement", + "src": "39713:50:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "39783:9:70", + "nodeType": "YulIdentifier", + "src": "39783:9:70" + }, + { + "kind": "number", + "nativeSrc": "39794:2:70", + "nodeType": "YulLiteral", + "src": "39794:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "39779:3:70", + "nodeType": "YulIdentifier", + "src": "39779:3:70" + }, + "nativeSrc": "39779:18:70", + "nodeType": "YulFunctionCall", + "src": "39779:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "39803:6:70", + "nodeType": "YulIdentifier", + "src": "39803:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "39819:2:70", + "nodeType": "YulLiteral", + "src": "39819:2:70", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "39823:1:70", + "nodeType": "YulLiteral", + "src": "39823:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "39815:3:70", + "nodeType": "YulIdentifier", + "src": "39815:3:70" + }, + "nativeSrc": "39815:10:70", + "nodeType": "YulFunctionCall", + "src": "39815:10:70" + }, + { + "kind": "number", + "nativeSrc": "39827:1:70", + "nodeType": "YulLiteral", + "src": "39827:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "39811:3:70", + "nodeType": "YulIdentifier", + "src": "39811:3:70" + }, + "nativeSrc": "39811:18:70", + "nodeType": "YulFunctionCall", + "src": "39811:18:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "39799:3:70", + "nodeType": "YulIdentifier", + "src": "39799:3:70" + }, + "nativeSrc": "39799:31:70", + "nodeType": "YulFunctionCall", + "src": "39799:31:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "39772:6:70", + "nodeType": "YulIdentifier", + "src": "39772:6:70" + }, + "nativeSrc": "39772:59:70", + "nodeType": "YulFunctionCall", + "src": "39772:59:70" + }, + "nativeSrc": "39772:59:70", + "nodeType": "YulExpressionStatement", + "src": "39772:59:70" + } + ] + }, + "name": "abi_encode_tuple_t_uint64_t_uint64__to_t_uint256_t_uint256__fromStack_reversed", + "nativeSrc": "39541:296:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "39629:9:70", + "nodeType": "YulTypedName", + "src": "39629:9:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "39640:6:70", + "nodeType": "YulTypedName", + "src": "39640:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "39648:6:70", + "nodeType": "YulTypedName", + "src": "39648:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "39659:4:70", + "nodeType": "YulTypedName", + "src": "39659:4:70", + "type": "" + } + ], + "src": "39541:296:70" + }, + { + "body": { + "nativeSrc": "40055:276:70", + "nodeType": "YulBlock", + "src": "40055:276:70", + "statements": [ + { + "nativeSrc": "40065:27:70", + "nodeType": "YulAssignment", + "src": "40065:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40077:9:70", + "nodeType": "YulIdentifier", + "src": "40077:9:70" + }, + { + "kind": "number", + "nativeSrc": "40088:3:70", + "nodeType": "YulLiteral", + "src": "40088:3:70", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40073:3:70", + "nodeType": "YulIdentifier", + "src": "40073:3:70" + }, + "nativeSrc": "40073:19:70", + "nodeType": "YulFunctionCall", + "src": "40073:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "40065:4:70", + "nodeType": "YulIdentifier", + "src": "40065:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40108:9:70", + "nodeType": "YulIdentifier", + "src": "40108:9:70" + }, + { + "name": "value0", + "nativeSrc": "40119:6:70", + "nodeType": "YulIdentifier", + "src": "40119:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40101:6:70", + "nodeType": "YulIdentifier", + "src": "40101:6:70" + }, + "nativeSrc": "40101:25:70", + "nodeType": "YulFunctionCall", + "src": "40101:25:70" + }, + "nativeSrc": "40101:25:70", + "nodeType": "YulExpressionStatement", + "src": "40101:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40146:9:70", + "nodeType": "YulIdentifier", + "src": "40146:9:70" + }, + { + "kind": "number", + "nativeSrc": "40157:2:70", + "nodeType": "YulLiteral", + "src": "40157:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40142:3:70", + "nodeType": "YulIdentifier", + "src": "40142:3:70" + }, + "nativeSrc": "40142:18:70", + "nodeType": "YulFunctionCall", + "src": "40142:18:70" + }, + { + "name": "value1", + "nativeSrc": "40162:6:70", + "nodeType": "YulIdentifier", + "src": "40162:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40135:6:70", + "nodeType": "YulIdentifier", + "src": "40135:6:70" + }, + "nativeSrc": "40135:34:70", + "nodeType": "YulFunctionCall", + "src": "40135:34:70" + }, + "nativeSrc": "40135:34:70", + "nodeType": "YulExpressionStatement", + "src": "40135:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40189:9:70", + "nodeType": "YulIdentifier", + "src": "40189:9:70" + }, + { + "kind": "number", + "nativeSrc": "40200:2:70", + "nodeType": "YulLiteral", + "src": "40200:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40185:3:70", + "nodeType": "YulIdentifier", + "src": "40185:3:70" + }, + "nativeSrc": "40185:18:70", + "nodeType": "YulFunctionCall", + "src": "40185:18:70" + }, + { + "name": "value2", + "nativeSrc": "40205:6:70", + "nodeType": "YulIdentifier", + "src": "40205:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40178:6:70", + "nodeType": "YulIdentifier", + "src": "40178:6:70" + }, + "nativeSrc": "40178:34:70", + "nodeType": "YulFunctionCall", + "src": "40178:34:70" + }, + "nativeSrc": "40178:34:70", + "nodeType": "YulExpressionStatement", + "src": "40178:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40232:9:70", + "nodeType": "YulIdentifier", + "src": "40232:9:70" + }, + { + "kind": "number", + "nativeSrc": "40243:2:70", + "nodeType": "YulLiteral", + "src": "40243:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40228:3:70", + "nodeType": "YulIdentifier", + "src": "40228:3:70" + }, + "nativeSrc": "40228:18:70", + "nodeType": "YulFunctionCall", + "src": "40228:18:70" + }, + { + "name": "value3", + "nativeSrc": "40248:6:70", + "nodeType": "YulIdentifier", + "src": "40248:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40221:6:70", + "nodeType": "YulIdentifier", + "src": "40221:6:70" + }, + "nativeSrc": "40221:34:70", + "nodeType": "YulFunctionCall", + "src": "40221:34:70" + }, + "nativeSrc": "40221:34:70", + "nodeType": "YulExpressionStatement", + "src": "40221:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40275:9:70", + "nodeType": "YulIdentifier", + "src": "40275:9:70" + }, + { + "kind": "number", + "nativeSrc": "40286:3:70", + "nodeType": "YulLiteral", + "src": "40286:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40271:3:70", + "nodeType": "YulIdentifier", + "src": "40271:3:70" + }, + "nativeSrc": "40271:19:70", + "nodeType": "YulFunctionCall", + "src": "40271:19:70" + }, + { + "arguments": [ + { + "name": "value4", + "nativeSrc": "40296:6:70", + "nodeType": "YulIdentifier", + "src": "40296:6:70" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nativeSrc": "40312:3:70", + "nodeType": "YulLiteral", + "src": "40312:3:70", + "type": "", + "value": "160" + }, + { + "kind": "number", + "nativeSrc": "40317:1:70", + "nodeType": "YulLiteral", + "src": "40317:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "shl", + "nativeSrc": "40308:3:70", + "nodeType": "YulIdentifier", + "src": "40308:3:70" + }, + "nativeSrc": "40308:11:70", + "nodeType": "YulFunctionCall", + "src": "40308:11:70" + }, + { + "kind": "number", + "nativeSrc": "40321:1:70", + "nodeType": "YulLiteral", + "src": "40321:1:70", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "sub", + "nativeSrc": "40304:3:70", + "nodeType": "YulIdentifier", + "src": "40304:3:70" + }, + "nativeSrc": "40304:19:70", + "nodeType": "YulFunctionCall", + "src": "40304:19:70" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "40292:3:70", + "nodeType": "YulIdentifier", + "src": "40292:3:70" + }, + "nativeSrc": "40292:32:70", + "nodeType": "YulFunctionCall", + "src": "40292:32:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40264:6:70", + "nodeType": "YulIdentifier", + "src": "40264:6:70" + }, + "nativeSrc": "40264:61:70", + "nodeType": "YulFunctionCall", + "src": "40264:61:70" + }, + "nativeSrc": "40264:61:70", + "nodeType": "YulExpressionStatement", + "src": "40264:61:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed", + "nativeSrc": "39842:489:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "39992:9:70", + "nodeType": "YulTypedName", + "src": "39992:9:70", + "type": "" + }, + { + "name": "value4", + "nativeSrc": "40003:6:70", + "nodeType": "YulTypedName", + "src": "40003:6:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "40011:6:70", + "nodeType": "YulTypedName", + "src": "40011:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "40019:6:70", + "nodeType": "YulTypedName", + "src": "40019:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "40027:6:70", + "nodeType": "YulTypedName", + "src": "40027:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "40035:6:70", + "nodeType": "YulTypedName", + "src": "40035:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "40046:4:70", + "nodeType": "YulTypedName", + "src": "40046:4:70", + "type": "" + } + ], + "src": "39842:489:70" + }, + { + "body": { + "nativeSrc": "40517:217:70", + "nodeType": "YulBlock", + "src": "40517:217:70", + "statements": [ + { + "nativeSrc": "40527:27:70", + "nodeType": "YulAssignment", + "src": "40527:27:70", + "value": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40539:9:70", + "nodeType": "YulIdentifier", + "src": "40539:9:70" + }, + { + "kind": "number", + "nativeSrc": "40550:3:70", + "nodeType": "YulLiteral", + "src": "40550:3:70", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40535:3:70", + "nodeType": "YulIdentifier", + "src": "40535:3:70" + }, + "nativeSrc": "40535:19:70", + "nodeType": "YulFunctionCall", + "src": "40535:19:70" + }, + "variableNames": [ + { + "name": "tail", + "nativeSrc": "40527:4:70", + "nodeType": "YulIdentifier", + "src": "40527:4:70" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40570:9:70", + "nodeType": "YulIdentifier", + "src": "40570:9:70" + }, + { + "name": "value0", + "nativeSrc": "40581:6:70", + "nodeType": "YulIdentifier", + "src": "40581:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40563:6:70", + "nodeType": "YulIdentifier", + "src": "40563:6:70" + }, + "nativeSrc": "40563:25:70", + "nodeType": "YulFunctionCall", + "src": "40563:25:70" + }, + "nativeSrc": "40563:25:70", + "nodeType": "YulExpressionStatement", + "src": "40563:25:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40608:9:70", + "nodeType": "YulIdentifier", + "src": "40608:9:70" + }, + { + "kind": "number", + "nativeSrc": "40619:2:70", + "nodeType": "YulLiteral", + "src": "40619:2:70", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40604:3:70", + "nodeType": "YulIdentifier", + "src": "40604:3:70" + }, + "nativeSrc": "40604:18:70", + "nodeType": "YulFunctionCall", + "src": "40604:18:70" + }, + { + "arguments": [ + { + "name": "value1", + "nativeSrc": "40628:6:70", + "nodeType": "YulIdentifier", + "src": "40628:6:70" + }, + { + "kind": "number", + "nativeSrc": "40636:4:70", + "nodeType": "YulLiteral", + "src": "40636:4:70", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nativeSrc": "40624:3:70", + "nodeType": "YulIdentifier", + "src": "40624:3:70" + }, + "nativeSrc": "40624:17:70", + "nodeType": "YulFunctionCall", + "src": "40624:17:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40597:6:70", + "nodeType": "YulIdentifier", + "src": "40597:6:70" + }, + "nativeSrc": "40597:45:70", + "nodeType": "YulFunctionCall", + "src": "40597:45:70" + }, + "nativeSrc": "40597:45:70", + "nodeType": "YulExpressionStatement", + "src": "40597:45:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40662:9:70", + "nodeType": "YulIdentifier", + "src": "40662:9:70" + }, + { + "kind": "number", + "nativeSrc": "40673:2:70", + "nodeType": "YulLiteral", + "src": "40673:2:70", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40658:3:70", + "nodeType": "YulIdentifier", + "src": "40658:3:70" + }, + "nativeSrc": "40658:18:70", + "nodeType": "YulFunctionCall", + "src": "40658:18:70" + }, + { + "name": "value2", + "nativeSrc": "40678:6:70", + "nodeType": "YulIdentifier", + "src": "40678:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40651:6:70", + "nodeType": "YulIdentifier", + "src": "40651:6:70" + }, + "nativeSrc": "40651:34:70", + "nodeType": "YulFunctionCall", + "src": "40651:34:70" + }, + "nativeSrc": "40651:34:70", + "nodeType": "YulExpressionStatement", + "src": "40651:34:70" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nativeSrc": "40705:9:70", + "nodeType": "YulIdentifier", + "src": "40705:9:70" + }, + { + "kind": "number", + "nativeSrc": "40716:2:70", + "nodeType": "YulLiteral", + "src": "40716:2:70", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nativeSrc": "40701:3:70", + "nodeType": "YulIdentifier", + "src": "40701:3:70" + }, + "nativeSrc": "40701:18:70", + "nodeType": "YulFunctionCall", + "src": "40701:18:70" + }, + { + "name": "value3", + "nativeSrc": "40721:6:70", + "nodeType": "YulIdentifier", + "src": "40721:6:70" + } + ], + "functionName": { + "name": "mstore", + "nativeSrc": "40694:6:70", + "nodeType": "YulIdentifier", + "src": "40694:6:70" + }, + "nativeSrc": "40694:34:70", + "nodeType": "YulFunctionCall", + "src": "40694:34:70" + }, + "nativeSrc": "40694:34:70", + "nodeType": "YulExpressionStatement", + "src": "40694:34:70" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed", + "nativeSrc": "40336:398:70", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nativeSrc": "40462:9:70", + "nodeType": "YulTypedName", + "src": "40462:9:70", + "type": "" + }, + { + "name": "value3", + "nativeSrc": "40473:6:70", + "nodeType": "YulTypedName", + "src": "40473:6:70", + "type": "" + }, + { + "name": "value2", + "nativeSrc": "40481:6:70", + "nodeType": "YulTypedName", + "src": "40481:6:70", + "type": "" + }, + { + "name": "value1", + "nativeSrc": "40489:6:70", + "nodeType": "YulTypedName", + "src": "40489:6:70", + "type": "" + }, + { + "name": "value0", + "nativeSrc": "40497:6:70", + "nodeType": "YulTypedName", + "src": "40497:6:70", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nativeSrc": "40508:4:70", + "nodeType": "YulTypedName", + "src": "40508:4:70", + "type": "" + } + ], + "src": "40336:398:70" + } + ] + }, + "contents": "{\n { }\n function validator_revert_address(value)\n {\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_address(value)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_address(value, pos)\n {\n mstore(pos, and(value, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_struct$_State_$15663_memory_ptr__to_t_struct$_State_$15663_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 288)\n mstore(headStart, and(mload(value0), sub(shl(160, 1), 1)))\n mstore(add(headStart, 0x20), mload(add(value0, 0x20)))\n mstore(add(headStart, 0x40), mload(add(value0, 0x40)))\n mstore(add(headStart, 0x60), mload(add(value0, 0x60)))\n mstore(add(headStart, 0x80), mload(add(value0, 0x80)))\n mstore(add(headStart, 0xa0), mload(add(value0, 0xa0)))\n mstore(add(headStart, 0xc0), mload(add(value0, 0xc0)))\n mstore(add(headStart, 0xe0), mload(add(value0, 0xe0)))\n mstore(add(headStart, 0x0100), mload(add(value0, 0x0100)))\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_uint256_t_uint256__to_t_bytes32_t_bytes32_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function validator_revert_uint32(value)\n {\n if iszero(eq(value, and(value, 0xffffffff))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_uint32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_uint32(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint32__to_t_uint32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, sub(shl(64, 1), 1)) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let offset := calldataload(add(headStart, 32))\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n let value1_1, value2_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value1 := value1_1\n value2 := value2_1\n }\n function validator_revert_bool(value)\n {\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_addresst_bool(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_bool(value_1)\n value1 := value_1\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n }\n function abi_encode_tuple_t_uint32_t_uint32__to_t_uint32_t_uint32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffff))\n }\n function copy_memory_to_memory_with_cleanup(src, dst, length)\n {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n mstore(add(dst, length), 0)\n }\n function abi_encode_string(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n copy_memory_to_memory_with_cleanup(add(value, 0x20), add(pos, 0x20), length)\n end := add(add(pos, and(add(length, 31), not(31))), 0x20)\n }\n function abi_encode_tuple_t_uint256_t_string_memory_ptr_t_string_memory_ptr__to_t_uint256_t_string_memory_ptr_t_string_memory_ptr__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 96)\n let tail_1 := abi_encode_string(value1, add(headStart, 96))\n mstore(add(headStart, 64), sub(tail_1, headStart))\n tail := abi_encode_string(value2, tail_1)\n }\n function abi_encode_tuple_t_bool_t_address_t_bytes32_t_uint256_t_uint256_t_uint256__to_t_bool_t_address_t_bytes32_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 192)\n mstore(headStart, iszero(iszero(value0)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n mstore(add(headStart, 160), value5)\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_struct$_State_$16305_memory_ptr__to_t_struct$_State_$16305_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(mload(value0), sub(shl(160, 1), 1)))\n mstore(add(headStart, 0x20), mload(add(value0, 0x20)))\n }\n function abi_encode_uint64(value, pos)\n {\n mstore(pos, and(value, sub(shl(64, 1), 1)))\n }\n function abi_encode_tuple_t_uint64_t_uint64__to_t_uint64_t_uint64__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(64, 1), 1)))\n }\n function abi_decode_tuple_t_addresst_addresst_bytes32(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := 0\n value_2 := calldataload(add(headStart, 64))\n value2 := value_2\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n let value_2 := 0\n value_2 := calldataload(add(headStart, 64))\n value2 := value_2\n }\n function abi_encode_tuple_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__to_t_bytes1_t_string_memory_ptr_t_string_memory_ptr_t_uint256_t_address_t_bytes32_t_array$_t_uint256_$dyn_memory_ptr__fromStack_reversed(headStart, value6, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, and(value0, shl(248, 255)))\n mstore(add(headStart, 32), 224)\n let tail_1 := abi_encode_string(value1, add(headStart, 224))\n mstore(add(headStart, 64), sub(tail_1, headStart))\n let tail_2 := abi_encode_string(value2, tail_1)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), and(value4, sub(shl(160, 1), 1)))\n mstore(add(headStart, 160), value5)\n mstore(add(headStart, 192), sub(tail_2, headStart))\n let pos := tail_2\n let length := mload(value6)\n mstore(tail_2, length)\n pos := add(tail_2, 32)\n let srcPtr := add(value6, 32)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, mload(srcPtr))\n pos := add(pos, 32)\n srcPtr := add(srcPtr, 32)\n }\n tail := pos\n }\n function abi_decode_tuple_t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if iszero(slt(add(_1, 0x1f), dataEnd)) { revert(0, 0) }\n let length := calldataload(_1)\n if gt(length, sub(shl(64, 1), 1)) { revert(0, 0) }\n if gt(add(add(_1, shl(5, length)), 32), dataEnd) { revert(0, 0) }\n value0 := add(_1, 32)\n value1 := length\n }\n function abi_encode_tuple_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr__to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let tail_1 := add(headStart, 32)\n mstore(headStart, 32)\n let pos := tail_1\n let length := mload(value0)\n mstore(tail_1, length)\n pos := add(headStart, 64)\n let tail_2 := add(add(headStart, shl(5, length)), 64)\n let srcPtr := add(value0, 32)\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, add(sub(tail_2, headStart), not(63)))\n tail_2 := abi_encode_string(mload(srcPtr), tail_2)\n srcPtr := add(srcPtr, 32)\n pos := add(pos, 32)\n }\n tail := tail_2\n }\n function abi_decode_tuple_t_addresst_enum$_PaymentTypes_$2433t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n if iszero(lt(value_1, 3)) { revert(0, 0) }\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_addresst_uint256t_uint32t_uint256(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_uint32(value_2)\n value2 := value_2\n let value_3 := 0\n value_3 := calldataload(add(headStart, 96))\n value3 := value_3\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := calldataload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_tuple_t_bytes32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_uint256_t_bytes32__to_t_uint256_t_uint256_t_uint256_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_t_address_t_address_t_address__to_t_address_t_address_t_address__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), and(value2, sub(shl(160, 1), 1)))\n }\n function abi_decode_tuple_t_bool_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_bool(value)\n value0 := value\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n }\n function panic_error_0x41()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function allocate_memory_4297() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 320)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory_4301() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 64)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function allocate_memory() -> memPtr\n {\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 0xe0)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n function abi_decode_string(offset, end) -> array\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n let length := calldataload(offset)\n let src := add(offset, 0x20)\n let array_1 := 0\n let size := 0\n if gt(length, sub(shl(64, 1), 1)) { panic_error_0x41() }\n let result := and(add(length, 31), not(31))\n size := add(result, 0x20)\n let memPtr := 0\n memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(result, 63), not(31)))\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n array_1 := memPtr\n mstore(memPtr, length)\n if gt(add(src, length), end) { revert(0, 0) }\n calldatacopy(add(memPtr, 0x20), src, length)\n mstore(add(add(memPtr, length), 0x20), 0)\n array := memPtr\n }\n function abi_decode_tuple_t_string_memory_ptrt_string_memory_ptrt_address_payable(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n value0 := abi_decode_string(add(headStart, offset), dataEnd)\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, sub(shl(64, 1), 1)) { revert(0, 0) }\n value1 := abi_decode_string(add(headStart, offset_1), dataEnd)\n let value := calldataload(add(headStart, 64))\n validator_revert_address(value)\n value2 := value\n }\n function extract_byte_array_length(data) -> length\n {\n length := shr(1, data)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function array_dataslot_string_storage(ptr) -> data\n {\n mstore(0, ptr)\n data := keccak256(0, 0x20)\n }\n function clean_up_bytearray_end_slots_string_storage(array, len, startIndex)\n {\n if gt(len, 31)\n {\n mstore(0, array)\n let data := keccak256(0, 0x20)\n let deleteStart := add(data, shr(5, add(startIndex, 31)))\n if lt(startIndex, 0x20) { deleteStart := data }\n let _1 := add(data, shr(5, add(len, 31)))\n let start := deleteStart\n for { } lt(start, _1) { start := add(start, 1) }\n { sstore(start, 0) }\n }\n }\n function extract_used_part_and_set_length_of_short_byte_array(data, len) -> used\n {\n used := or(and(data, not(shr(shl(3, len), not(0)))), shl(1, len))\n }\n function copy_byte_array_to_storage_from_t_string_memory_ptr_to_t_string_storage(slot, src)\n {\n let newLen := mload(src)\n if gt(newLen, sub(shl(64, 1), 1)) { panic_error_0x41() }\n clean_up_bytearray_end_slots_string_storage(slot, extract_byte_array_length(sload(slot)), newLen)\n let srcOffset := 0\n srcOffset := 0x20\n switch gt(newLen, 31)\n case 1 {\n let loopEnd := and(newLen, not(31))\n let dstPtr := array_dataslot_string_storage(slot)\n let i := 0\n for { } lt(i, loopEnd) { i := add(i, 0x20) }\n {\n sstore(dstPtr, mload(add(src, srcOffset)))\n dstPtr := add(dstPtr, 1)\n srcOffset := add(srcOffset, 0x20)\n }\n if lt(loopEnd, newLen)\n {\n let lastValue := mload(add(src, srcOffset))\n sstore(dstPtr, and(lastValue, not(shr(and(shl(3, newLen), 248), not(0)))))\n }\n sstore(slot, add(shl(1, newLen), 1))\n }\n default {\n let value := 0\n if newLen\n {\n value := mload(add(src, srcOffset))\n }\n sstore(slot, extract_used_part_and_set_length_of_short_byte_array(value, newLen))\n }\n }\n function abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), value1)\n calldatacopy(add(headStart, 64), value0, value1)\n mstore(add(add(headStart, value1), 64), 0)\n tail := add(add(headStart, and(add(value1, 31), not(31))), 64)\n }\n function abi_decode_tuple_t_address_payable(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n }\n function abi_encode_tuple_t_stringliteral_2e5045ff73280aa8e8acd8c82710f23812497f87f7f576e2220a2ddd0d45eade__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 21)\n mstore(add(headStart, 64), \"EIP712: Uninitialized\")\n tail := add(headStart, 96)\n }\n function panic_error_0x11()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n diff := sub(x, y)\n if gt(diff, x) { panic_error_0x11() }\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function panic_error_0x32()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), not(30)))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, sub(shl(64, 1), 1)) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function abi_encode_tuple_packed_t_bytes_calldata_ptr_t_bytes_memory_ptr__to_t_bytes_memory_ptr_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n calldatacopy(pos, value0, value1)\n let _1 := add(pos, value1)\n mstore(_1, 0)\n let length := mload(value2)\n copy_memory_to_memory_with_cleanup(add(value2, 0x20), _1, length)\n end := add(_1, length)\n }\n function panic_error_0x21()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n function abi_encode_enum_PaymentTypes(value, pos)\n {\n if iszero(lt(value, 3))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x21)\n revert(0, 0x24)\n }\n mstore(pos, value)\n }\n function abi_encode_tuple_t_enum$_PaymentTypes_$2433__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n abi_encode_enum_PaymentTypes(value0, headStart)\n }\n function abi_encode_tuple_t_rational_1_by_1__to_t_uint64__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n }\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n }\n function abi_encode_tuple_t_address_t_uint256_t_uint256_t_address__to_t_address_t_uint256_t_uint256_t_address__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), and(value3, sub(shl(160, 1), 1)))\n }\n function abi_decode_tuple_t_bytes32t_uint256t_address_payablet_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 128) { revert(0, 0) }\n let value := 0\n value := calldataload(headStart)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n let value_2 := calldataload(add(headStart, 64))\n validator_revert_address(value_2)\n value2 := value_2\n let offset := calldataload(add(headStart, 96))\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n value3 := abi_decode_string(add(headStart, offset), dataEnd)\n }\n function abi_decode_uint32_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_uint32(value)\n }\n function validator_revert_uint64(value)\n {\n if iszero(eq(value, and(value, sub(shl(64, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_uint64_fromMemory(offset) -> value\n {\n value := mload(offset)\n validator_revert_uint64(value)\n }\n function abi_decode_tuple_t_struct$_Provision_$3962_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 320)\n if _1 { revert(0, 0) }\n _1 := 0\n let value := allocate_memory_4297()\n let value_1 := _1\n value_1 := mload(headStart)\n mstore(value, value_1)\n let value_2 := _1\n value_2 := mload(add(headStart, 32))\n mstore(add(value, 32), value_2)\n let value_3 := _1\n value_3 := mload(add(headStart, 64))\n mstore(add(value, 64), value_3)\n mstore(add(value, 96), abi_decode_uint32_fromMemory(add(headStart, 96)))\n mstore(add(value, 128), abi_decode_uint64_fromMemory(add(headStart, 128)))\n mstore(add(value, 160), abi_decode_uint64_fromMemory(add(headStart, 160)))\n mstore(add(value, 192), abi_decode_uint32_fromMemory(add(headStart, 192)))\n mstore(add(value, 224), abi_decode_uint64_fromMemory(add(headStart, 224)))\n let value_4 := _1\n value_4 := mload(add(headStart, 256))\n mstore(add(value, 256), value_4)\n let value_5 := _1\n value_5 := mload(add(headStart, 288))\n mstore(add(value, 288), value_5)\n value0 := value\n }\n function abi_encode_tuple_t_address_t_bool__to_t_address_t_bool__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), iszero(iszero(value1)))\n }\n function abi_encode_tuple_t_rational_0_by_1_t_address__to_t_uint8_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xff))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n }\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := 0\n value := mload(headStart)\n value0 := value\n }\n function abi_decode_tuple_t_uint32_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_uint32(value)\n value0 := value\n }\n function abi_decode_tuple_t_uint64_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_uint64(value)\n value0 := value\n }\n function abi_encode_tuple_t_uint256_t_bool__to_t_uint256_t_bool__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), iszero(iszero(value1)))\n }\n function abi_encode_tuple_t_address_t_uint256__to_t_address_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), value1)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function abi_encode_tuple_packed_t_bytes_memory_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n let length := mload(value0)\n copy_memory_to_memory_with_cleanup(add(value0, 0x20), pos, length)\n end := add(pos, length)\n }\n function abi_decode_uint64(offset) -> value\n {\n value := calldataload(offset)\n validator_revert_uint64(value)\n }\n function abi_decode_uint128(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, sub(shl(128, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_struct$_SignedRAV_$2525_memory_ptrt_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n let _1 := add(headStart, offset)\n if slt(sub(dataEnd, _1), 64) { revert(0, 0) }\n let value := allocate_memory_4301()\n let offset_1 := calldataload(_1)\n if gt(offset_1, sub(shl(64, 1), 1)) { revert(0, 0) }\n let _2 := add(_1, offset_1)\n if slt(sub(dataEnd, _2), 0xe0) { revert(0, 0) }\n let value_1 := allocate_memory()\n let value_2 := 0\n value_2 := calldataload(_2)\n mstore(value_1, value_2)\n mstore(add(value_1, 32), abi_decode_address(add(_2, 32)))\n mstore(add(value_1, 64), abi_decode_address(add(_2, 64)))\n mstore(add(value_1, 96), abi_decode_address(add(_2, 96)))\n mstore(add(value_1, 128), abi_decode_uint64(add(_2, 128)))\n mstore(add(value_1, 160), abi_decode_uint128(add(_2, 160)))\n let offset_2 := calldataload(add(_2, 192))\n if gt(offset_2, sub(shl(64, 1), 1)) { revert(0, 0) }\n mstore(add(value_1, 192), abi_decode_string(add(_2, offset_2), dataEnd))\n mstore(value, value_1)\n let offset_3 := calldataload(add(_1, 32))\n if gt(offset_3, sub(shl(64, 1), 1)) { revert(0, 0) }\n mstore(add(value, 32), abi_decode_string(add(_1, offset_3), dataEnd))\n value0 := value\n let value_3 := 0\n value_3 := calldataload(add(headStart, 32))\n value1 := value_3\n }\n function abi_encode_tuple_t_enum$_PaymentTypes_$2433_t_bytes_memory_ptr_t_uint256__to_t_uint8_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n abi_encode_enum_PaymentTypes(value0, headStart)\n mstore(add(headStart, 32), 96)\n tail := abi_encode_string(value1, add(headStart, 96))\n mstore(add(headStart, 64), value2)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n product := mul(x, y)\n if iszero(or(iszero(x), eq(y, div(product, x)))) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes32_t_uint256__to_t_bytes32_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_bytes32_t_uint256_t_uint256__to_t_bytes32_t_uint256_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n }\n function abi_decode_tuple_t_address_payablet_bytes32t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_address(value)\n value0 := value\n let value_1 := 0\n value_1 := calldataload(add(headStart, 32))\n value1 := value_1\n let offset := calldataload(add(headStart, 64))\n if gt(offset, sub(shl(64, 1), 1)) { revert(0, 0) }\n value2 := abi_decode_string(add(headStart, offset), dataEnd)\n }\n function abi_encode_tuple_t_bytes32_t_address_t_address__to_t_bytes32_t_address_t_address__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), and(value2, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_bytes_memory_ptr_t_uint256_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 128)\n tail := abi_encode_string(value0, add(headStart, 128))\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_decode_tuple_t_uint256t_address_payable_fromMemory(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let value := 0\n value := mload(headStart)\n value0 := value\n let value_1 := mload(add(headStart, 32))\n validator_revert_address(value_1)\n value1 := value_1\n }\n function abi_encode_tuple_t_uint256_t_address__to_t_uint256_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n }\n function decrement_t_uint256(value) -> ret\n {\n if iszero(value) { panic_error_0x11() }\n ret := add(value, not(0))\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, not(0)) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function abi_encode_tuple_t_address_t_address_t_uint32__to_t_address_t_address_t_uint32__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), and(value2, 0xffffffff))\n }\n function abi_encode_uint128(value, pos)\n {\n mstore(pos, and(value, sub(shl(128, 1), 1)))\n }\n function abi_encode_tuple_t_struct$_SignedRAV_$2525_memory_ptr_t_uint256_t_address__to_t_struct$_SignedRAV_$2525_memory_ptr_t_uint256_t_address__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n let memberValue0 := mload(value0)\n mstore(add(headStart, 96), 0x40)\n mstore(add(headStart, 160), mload(memberValue0))\n mstore(add(headStart, 192), and(mload(add(memberValue0, 0x20)), sub(shl(160, 1), 1)))\n mstore(add(headStart, 0xe0), and(mload(add(memberValue0, 0x40)), sub(shl(160, 1), 1)))\n mstore(add(headStart, 256), and(mload(add(memberValue0, 96)), sub(shl(160, 1), 1)))\n let memberValue0_1 := mload(add(memberValue0, 0x80))\n abi_encode_uint64(memberValue0_1, add(headStart, 288))\n let memberValue0_2 := mload(add(memberValue0, 160))\n abi_encode_uint128(memberValue0_2, add(headStart, 320))\n let memberValue0_3 := mload(add(memberValue0, 192))\n mstore(add(headStart, 352), 0xe0)\n let end := abi_encode_string(memberValue0_3, add(headStart, 384))\n let memberValue0_4 := mload(add(value0, 0x20))\n mstore(add(headStart, 0x80), add(sub(end, headStart), not(95)))\n tail := abi_encode_string(memberValue0_4, end)\n mstore(add(headStart, 0x20), value1)\n abi_encode_address(value2, add(headStart, 0x40))\n }\n function abi_encode_tuple_t_stringliteral_aaf3daf27360df170a52f29a0edeebb3d20b8e3dc84a13c5eaf056803b549f50__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 9)\n mstore(add(headStart, 64), \"!transfer\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_address_t_address_t_enum$_PaymentTypes_$2433__to_t_address_t_address_t_uint8__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n abi_encode_enum_PaymentTypes(value2, add(headStart, 64))\n }\n function abi_decode_tuple_t_struct$_DelegationPool_$3992_memory_ptr_fromMemory(headStart, dataEnd) -> value0\n {\n let _1 := slt(sub(dataEnd, headStart), 160)\n if _1 { revert(0, 0) }\n _1 := 0\n let memPtr := _1\n memPtr := mload(64)\n let newFreePtr := add(memPtr, 160)\n if or(gt(newFreePtr, sub(shl(64, 1), 1)), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n let value := _1\n value := mload(headStart)\n mstore(memPtr, value)\n let value_1 := _1\n value_1 := mload(add(headStart, 32))\n mstore(add(memPtr, 32), value_1)\n let value_2 := _1\n value_2 := mload(add(headStart, 64))\n mstore(add(memPtr, 64), value_2)\n let value_3 := _1\n value_3 := mload(add(headStart, 96))\n mstore(add(memPtr, 96), value_3)\n let value_4 := _1\n value_4 := mload(add(headStart, 128))\n mstore(add(memPtr, 128), value_4)\n value0 := memPtr\n }\n function abi_encode_tuple_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(160, 1), 1)))\n mstore(add(headStart, 64), value2)\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256__to_t_uint256_t_uint256_t_uint256_t_bytes32_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value5, value4, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), 192)\n tail := abi_encode_string(value4, add(headStart, 192))\n mstore(add(headStart, 160), value5)\n }\n function abi_encode_tuple_packed_t_address_t_address_t_uint256__to_t_address_t_address_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n mstore(pos, and(shl(96, value0), not(sub(shl(96, 1), 1))))\n mstore(add(pos, 20), and(shl(96, value1), not(sub(shl(96, 1), 1))))\n mstore(add(pos, 40), value2)\n end := add(pos, 72)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y)\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n r := div(x, y)\n }\n function abi_encode_tuple_t_uint32_t_uint32__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, 0xffffffff))\n mstore(add(headStart, 32), and(value1, 0xffffffff))\n }\n function abi_encode_tuple_t_uint64_t_uint64__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, and(value0, sub(shl(64, 1), 1)))\n mstore(add(headStart, 32), and(value1, sub(shl(64, 1), 1)))\n }\n function abi_encode_tuple_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__to_t_bytes32_t_bytes32_t_bytes32_t_uint256_t_address__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), and(value4, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n}", + "id": 70, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": { + "4591": [ + { + "length": 32, + "start": 14948 + } + ], + "4595": [ + { + "length": 32, + "start": 7019 + } + ], + "4611": [ + { + "length": 32, + "start": 17788 + } + ], + "4615": [ + { + "length": 32, + "start": 14088 + } + ], + "17586": [ + { + "length": 32, + "start": 5691 + }, + { + "length": 32, + "start": 12257 + } + ], + "17590": [ + { + "length": 32, + "start": 13022 + } + ], + "17594": [ + { + "length": 32, + "start": 12002 + } + ] + }, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x23B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7E736D8 EQ PUSH2 0x240 JUMPI DUP1 PUSH4 0xE022923 EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x138DEA08 EQ PUSH2 0x308 JUMPI DUP1 PUSH4 0x13C474C9 EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0x1DD42F60 EQ PUSH2 0x375 JUMPI DUP1 PUSH4 0x1EBB7C30 EQ PUSH2 0x38A JUMPI DUP1 PUSH4 0x24B8FBF6 EQ PUSH2 0x3AF JUMPI DUP1 PUSH4 0x35577962 EQ PUSH2 0x3C2 JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x3D5 JUMPI DUP1 PUSH4 0x45F54485 EQ PUSH2 0x3DD JUMPI DUP1 PUSH4 0x482468B7 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0x4F793CDC EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x55C85269 EQ PUSH2 0x428 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x472 JUMPI DUP1 PUSH4 0x6234E216 EQ PUSH2 0x48A JUMPI DUP1 PUSH4 0x6CCEC5B8 EQ PUSH2 0x4AA JUMPI DUP1 PUSH4 0x6D9A3951 EQ PUSH2 0x4BD JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x538 JUMPI DUP1 PUSH4 0x71CE020A EQ PUSH2 0x540 JUMPI DUP1 PUSH4 0x7AA31BCE EQ PUSH2 0x556 JUMPI DUP1 PUSH4 0x7DFE6D28 EQ PUSH2 0x569 JUMPI DUP1 PUSH4 0x7E89BAC3 EQ PUSH2 0x57C JUMPI DUP1 PUSH4 0x8180083B EQ PUSH2 0x58F JUMPI DUP1 PUSH4 0x819BA366 EQ PUSH2 0x5A2 JUMPI DUP1 PUSH4 0x81E777A7 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x832BC923 EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x5DE JUMPI DUP1 PUSH4 0x84B0196E EQ PUSH2 0x5E6 JUMPI DUP1 PUSH4 0x85E82BAF EQ PUSH2 0x601 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x60A JUMPI DUP1 PUSH4 0x9384E078 EQ PUSH2 0x612 JUMPI DUP1 PUSH4 0xAC9650D8 EQ PUSH2 0x635 JUMPI DUP1 PUSH4 0xB15D2A2C EQ PUSH2 0x655 JUMPI DUP1 PUSH4 0xBA38F67D EQ PUSH2 0x668 JUMPI DUP1 PUSH4 0xC0F47497 EQ PUSH2 0x67B JUMPI DUP1 PUSH4 0xC84A5EF3 EQ PUSH2 0x683 JUMPI DUP1 PUSH4 0xCB8347FE EQ PUSH2 0x696 JUMPI DUP1 PUSH4 0xCBE5F3F2 EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0xCE0FC0CC EQ PUSH2 0x6C9 JUMPI DUP1 PUSH4 0xCE56C98B EQ PUSH2 0x6DC JUMPI DUP1 PUSH4 0xD07A7A84 EQ PUSH2 0x6EF JUMPI DUP1 PUSH4 0xDB9BEE46 EQ PUSH2 0x6F9 JUMPI DUP1 PUSH4 0xDEDF6726 EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xE2E1E8E9 EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0xE6F50054 EQ PUSH2 0x734 JUMPI DUP1 PUSH4 0xEBF6DDAF EQ PUSH2 0x747 JUMPI DUP1 PUSH4 0xEC9C218D EQ PUSH2 0x74F JUMPI DUP1 PUSH4 0xEFF0F592 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x797 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26A PUSH2 0x24E CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x109 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x293 PUSH2 0x28E CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x7AA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP2 SWAP1 PUSH1 0x0 PUSH2 0x120 DUP3 ADD SWAP1 POP PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP4 MLOAD AND DUP3 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x100 DUP4 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x312 PUSH2 0x108 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x355 PUSH2 0x32E CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x9C PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP2 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x383 CALLDATASIZE PUSH1 0x4 PUSH2 0x506E JUMP JUMPDEST PUSH2 0x837 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x3BD CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x3D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x512E JUMP JUMPDEST PUSH2 0xA7D JUMP JUMPDEST PUSH2 0x388 PUSH2 0xA93 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x3EB CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0xACF JUMP JUMPDEST PUSH2 0x3F8 PUSH2 0xAD9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP3 SWAP2 SWAP1 PUSH2 0x5180 JUMP JUMPDEST PUSH2 0x419 PUSH2 0x414 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0xAEC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x51E7 JUMP JUMPDEST PUSH2 0x43B PUSH2 0x436 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0xC20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP7 ISZERO ISZERO DUP8 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP4 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x47A PUSH2 0xCDC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x498 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0xD1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x4B8 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0xCF1 JUMP JUMPDEST PUSH2 0x514 PUSH2 0x4CB CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0xD0 DUP3 MSTORE DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD SWAP1 SWAP4 AND DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD MLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE ADD PUSH2 0x277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0xCFB JUMP JUMPDEST PUSH2 0x548 PUSH2 0xD0D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP3 SWAP2 SWAP1 PUSH2 0x521C JUMP JUMPDEST PUSH2 0x388 PUSH2 0x564 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0xD18 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x577 CALLDATASIZE PUSH1 0x4 PUSH2 0x5236 JUMP JUMPDEST PUSH2 0xD29 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x58A CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0xD41 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x59D CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0xDB6 JUMP JUMPDEST PUSH2 0x5AA PUSH2 0xF44 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x5236 JUMP JUMPDEST PUSH2 0xF54 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x5D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0x10C4 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x10D8 JUMP JUMPDEST PUSH2 0x5EE PUSH2 0x1112 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5285 JUMP JUMPDEST PUSH2 0x312 PUSH1 0xD2 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x26A PUSH2 0x11BB JUMP JUMPDEST PUSH2 0x47A PUSH2 0x620 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x648 PUSH2 0x643 CALLDATASIZE PUSH1 0x4 PUSH2 0x531D JUMP JUMPDEST PUSH2 0x11D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x277 SWAP2 SWAP1 PUSH2 0x5392 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x663 CALLDATASIZE PUSH1 0x4 PUSH2 0x53F7 JUMP JUMPDEST PUSH2 0x12BE JUMP JUMPDEST PUSH2 0x47A PUSH2 0x676 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x1492 JUMP JUMPDEST PUSH2 0x26A PUSH2 0x14B0 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x691 CALLDATASIZE PUSH1 0x4 PUSH2 0x545F JUMP JUMPDEST PUSH2 0x14BA JUMP JUMPDEST PUSH2 0x388 PUSH2 0x6A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x1638 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x6B7 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH1 0x9A PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x6D7 CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x1777 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x6EA CALLDATASIZE PUSH1 0x4 PUSH2 0x54A7 JUMP JUMPDEST PUSH2 0x1860 JUMP JUMPDEST PUSH2 0x312 PUSH2 0x107 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x26A PUSH2 0x1873 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x70F CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0x187D JUMP JUMPDEST PUSH2 0x312 PUSH2 0x722 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xD3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x742 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH2 0x1A0B JUMP JUMPDEST PUSH2 0x26A PUSH2 0x1A1C JUMP JUMPDEST PUSH2 0x388 PUSH2 0x75D CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x1A26 JUMP JUMPDEST PUSH2 0x355 PUSH2 0x770 CALLDATASIZE PUSH1 0x4 PUSH2 0x5167 JUMP JUMPDEST PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP5 JUMP JUMPDEST PUSH2 0x388 PUSH2 0x7A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x502B JUMP JUMPDEST PUSH2 0x1AA8 JUMP JUMPDEST PUSH2 0x7B2 PUSH2 0x4FAE JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH2 0x120 DUP2 ADD DUP5 MSTORE DUP2 SLOAD SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x2 DUP2 ADD SLOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH1 0x8 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x83F PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x1B15 JUMP JUMPDEST POP JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST DUP3 PUSH2 0x859 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x888 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C9 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x8F5 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP DUP4 PUSH1 0x0 PUSH2 0x903 DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x90E DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x919 DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH2 0x921 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x931 DUP8 DUP10 ADD DUP10 PUSH2 0x5646 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP4 MLOAD GT PUSH2 0x959 JUMPI PUSH1 0x40 MLOAD PUSH4 0x7838439 PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD GT PUSH2 0x97B JUMPI PUSH1 0x40 MLOAD PUSH4 0x1E63BD95 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO PUSH2 0x9B3 JUMPI PUSH1 0x40 MLOAD PUSH4 0xD06866D PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE TIMESTAMP DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP7 DUP2 MSTORE DUP3 DUP5 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 SWAP1 SWAP3 MSTORE SWAP3 SWAP1 KECCAK256 DUP2 MLOAD DUP2 SSTORE SWAP2 MLOAD SWAP1 SWAP2 SWAP1 PUSH1 0x1 DUP3 ADD SWAP1 PUSH2 0x9FE SWAP1 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH1 0x2 DUP3 ADD SWAP1 PUSH2 0xA13 SWAP1 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0xA2F JUMPI PUSH2 0xA2F DUP10 DUP3 PUSH2 0x1DDE JUMP JUMPDEST DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x159567BEA25499A91F60E1FBB349FF2A1F8C1B2883198F25C1E12C99EDDB44FA DUP10 DUP10 PUSH1 0x40 MLOAD PUSH2 0xA6A SWAP3 SWAP2 SWAP1 PUSH2 0x5800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xA85 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xA8F DUP3 DUP3 PUSH2 0x1E35 JUMP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xAC4 JUMPI PUSH1 0x40 MLOAD PUSH4 0x72E3EF97 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xACD PUSH2 0x1EEB JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x848 CALLER DUP3 PUSH2 0x1F37 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xAE4 PUSH2 0x1FDD JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD DUP1 SLOAD SWAP2 SWAP3 SWAP2 PUSH2 0xB0F SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xB3B SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xB88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB88 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH2 0xB9D SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0xBC9 SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xC16 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBEB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC16 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBF9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH2 0x120 DUP2 ADD DUP4 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH1 0x8 ADD SLOAD PUSH2 0x100 DUP4 ADD MSTORE SWAP1 DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH2 0xCB1 DUP2 PUSH2 0x2054 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0xC0 DUP6 ADD MLOAD PUSH1 0xE0 SWAP1 SWAP6 ADD MLOAD SWAP4 SWAP13 SWAP3 SWAP12 POP SWAP1 SWAP10 POP SWAP8 POP SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xCE7 PUSH2 0x2073 JUMP JUMPDEST SLOAD PUSH1 0xFF AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x848 CALLER DUP3 PUSH2 0x1DDE JUMP JUMPDEST PUSH2 0xD03 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xACD PUSH1 0x0 PUSH2 0x2097 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xAE4 PUSH2 0x20F3 JUMP JUMPDEST PUSH2 0xD20 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x216A JUMP JUMPDEST PUSH2 0xD31 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xD3C DUP4 DUP4 DUP4 PUSH2 0x219F JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD49 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0xD56 DUP2 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP2 SWAP1 PUSH2 0xD78 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1C9C717B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x108 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x6DEEF78FFE3DF79AE5CD8E40B842C36AC6077E13746B9B68A9F327537B01E4E9 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST DUP3 PUSH2 0xDBF PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xDEE SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xE0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE2F SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0xE52 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP1 DUP2 SWAP1 PUSH2 0xE90 JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xE99 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEA7 DUP5 DUP7 ADD DUP7 PUSH2 0x502B JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0xEBE PUSH1 0xCF DUP4 PUSH2 0x21F2 JUMP JUMPDEST MLOAD DUP8 SWAP2 DUP4 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEEC JUMPI PUSH1 0x40 MLOAD PUSH4 0xC0BBFF13 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH2 0xEF9 DUP2 PUSH1 0x0 PUSH2 0x2277 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x73330C218A680717E9EEE625C262DF66EDDFDF99ECB388D25F6B32D66B9A318A DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0xF34 SWAP3 SWAP2 SWAP1 PUSH2 0x5800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xAE4 PUSH1 0x0 SLOAD PUSH1 0x1 SLOAD SWAP1 SWAP2 JUMP JUMPDEST DUP3 PUSH2 0xF5D PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF8C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFA9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xFCD SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0xFF0 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP4 PUSH1 0x0 PUSH2 0xFFE DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x1009 DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x1014 DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP7 SWAP1 DUP2 SWAP1 PUSH2 0x1050 JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x1059 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x106E PUSH1 0xCF DUP9 PUSH2 0x21F2 JUMP JUMPDEST MLOAD DUP9 SWAP2 DUP9 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x109C JUMPI PUSH1 0x40 MLOAD PUSH4 0xC0BBFF13 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH2 0x10BB DUP7 DUP7 PUSH1 0x2 PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x23D9 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x10CC PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH1 0x0 NOT PUSH2 0x26D7 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1109 JUMPI PUSH1 0x40 MLOAD PUSH4 0x72E3EF97 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xACD PUSH2 0x2746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH2 0x1128 PUSH2 0x278D JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 POP ISZERO DUP1 ISZERO PUSH2 0x113C JUMPI POP PUSH1 0x1 DUP2 ADD SLOAD ISZERO JUMPDEST PUSH2 0x1180 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x1152540DCC4C8E88155B9A5B9A5D1A585B1A5E9959 PUSH1 0x5A SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH2 0x1188 PUSH2 0x27B1 JUMP JUMPDEST PUSH2 0x1190 PUSH2 0x2852 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0xF PUSH1 0xF8 SHL SWAP13 SWAP4 SWAP12 POP SWAP2 SWAP10 POP CHAINID SWAP9 POP ADDRESS SWAP8 POP SWAP6 POP SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x11C6 PUSH2 0x286F JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 SWAP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x1200 JUMPI PUSH2 0x1200 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1233 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x121E JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x12B5 JUMPI PUSH2 0x1290 ADDRESS DUP7 DUP7 DUP5 DUP2 DUP2 LT PUSH2 0x1257 JUMPI PUSH2 0x1257 PUSH2 0x5858 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1269 SWAP2 SWAP1 PUSH2 0x586E JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x127C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x58B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x2893 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x12A2 JUMPI PUSH2 0x12A2 PUSH2 0x5858 JUMP JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1239 JUMP JUMPDEST POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x12C9 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x12F8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1315 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1339 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x135C JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP6 PUSH1 0x0 PUSH2 0x136A DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x1375 DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x1380 DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP9 SWAP1 DUP2 SWAP1 PUSH2 0x13BC JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x13C5 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x13DA JUMPI PUSH2 0x13DA PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x13F1 JUMPI PUSH2 0x13EA DUP11 DUP10 DUP10 PUSH2 0x2909 JUMP JUMPDEST SWAP1 POP PUSH2 0x1430 JUMP JUMPDEST PUSH1 0x2 DUP10 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1405 JUMPI PUSH2 0x1405 PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x1415 JUMPI PUSH2 0x13EA DUP11 DUP10 DUP10 PUSH2 0x2E1D JUMP JUMPDEST DUP9 PUSH1 0x40 MLOAD PUSH4 0x47031CF PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5913 JUMP JUMPDEST DUP9 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x1442 JUMPI PUSH2 0x1442 PUSH2 0x58DB JUMP JUMPDEST DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x54FE682BFB66381A9382E13E4B95A3DD4F960EAFBAE063FDEA3539D144FF3FF5 DUP4 PUSH1 0x40 MLOAD PUSH2 0x147D SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B8 DUP3 PUSH1 0x2 PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x2EE0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14C4 PUSH2 0x2F04 JUMP JUMPDEST DUP1 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND ISZERO SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 DUP2 ISZERO DUP1 ISZERO PUSH2 0x14EB JUMPI POP DUP3 JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x1 EQ DUP1 ISZERO PUSH2 0x1507 JUMPI POP ADDRESS EXTCODESIZE ISZERO JUMPDEST SWAP1 POP DUP2 ISZERO DUP1 ISZERO PUSH2 0x1515 JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x1533 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB NOT AND PUSH1 0x1 OR DUP6 SSTORE DUP4 ISZERO PUSH2 0x155C JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL OR DUP6 SSTORE JUMPDEST PUSH2 0x1565 DUP10 PUSH2 0x2F2D JUMP JUMPDEST PUSH2 0x156D PUSH2 0x2F3E JUMP JUMPDEST PUSH2 0x1575 PUSH2 0x2F46 JUMP JUMPDEST PUSH2 0x157D PUSH2 0x2F5E JUMP JUMPDEST PUSH2 0x15C9 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xF DUP2 MSTORE PUSH1 0x20 ADD PUSH15 0x537562677261706853657276696365 PUSH1 0x88 SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x312E3 PUSH1 0xEC SHL DUP2 MSTORE POP PUSH2 0x2F6E JUMP JUMPDEST PUSH2 0x15D5 DUP9 PUSH1 0x0 NOT PUSH2 0x26D7 JUMP JUMPDEST PUSH2 0x15DE DUP8 PUSH2 0x1B15 JUMP JUMPDEST PUSH2 0x15E7 DUP7 PUSH2 0x2F88 JUMP JUMPDEST DUP4 ISZERO PUSH2 0x162D JUMPI DUP5 SLOAD PUSH1 0xFF PUSH1 0x40 SHL NOT AND DUP6 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 DUP2 MSTORE PUSH32 0xC7F505B2F371AE2175EE4913F4499E1F2633A7B5936321EED1CDAEB6115181D2 SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLER PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP3 EQ PUSH2 0x1685 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCDC0567F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP DUP1 PUSH2 0x1697 DUP4 DUP6 ADD DUP6 PUSH2 0x5921 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x16A3 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xE76FEDE6 DUP7 DUP5 DUP5 PUSH2 0x16BC PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP7 SWAP1 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x44 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1715 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1729 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2F2E74A11116E05B39159372CCEB6739257B08D72F7171D208FF27BB6466C58 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1768 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1780 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17AF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17CC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17F0 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x1813 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH2 0x181D PUSH2 0x1DB8 JUMP JUMPDEST PUSH2 0x1826 DUP5 PUSH2 0x3003 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP1 PUSH32 0xF53CF6521A1B5FC0C04BFFA70374A4DC2E3474F2B2AC1643C3BCC54E2DB4A939 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x186C DUP4 DUP4 PUSH2 0x3076 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x2FDF JUMP JUMPDEST DUP3 PUSH2 0x1886 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x7C145CC7 DUP3 ADDRESS CALLER PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18B5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54D5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18F6 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST DUP2 CALLER SWAP1 SWAP2 PUSH2 0x1919 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCC5D3C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP4 PUSH1 0x0 PUSH2 0x1927 DUP3 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0x1932 DUP2 PUSH2 0x1C90 JUMP JUMPDEST PUSH2 0x193D DUP2 PUSH1 0x0 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x106 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP7 SWAP1 DUP2 SWAP1 PUSH2 0x1979 JUMPI PUSH1 0x40 MLOAD PUSH4 0xEE271899 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x1982 PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x1993 DUP10 DUP12 ADD DUP12 PUSH2 0x5943 JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH2 0x19BB DUP12 DUP4 DUP7 DUP7 DUP6 PUSH1 0x2 PUSH1 0x18 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x30E5 JUMP JUMPDEST DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD3803EB82EF5B4CDFF8646734EBBAF5B37441E96314B27FFD3D0940F12A038E7 DUP12 DUP12 PUSH1 0x40 MLOAD PUSH2 0x19F6 SWAP3 SWAP2 SWAP1 PUSH2 0x5800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1A13 PUSH2 0x1AE3 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x2F88 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x32DC JUMP JUMPDEST PUSH2 0x1A2E PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A3B PUSH1 0xCF DUP4 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1A52 PUSH1 0xD2 SLOAD DUP3 PUSH2 0x3300 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x1A71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x3477B5 PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0x1A7B DUP2 PUSH2 0x333D JUMP JUMPDEST ISZERO DUP3 SWAP1 PUSH2 0x1A9C JUMPI PUSH1 0x40 MLOAD PUSH4 0x17C7B35D PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH2 0xA8F DUP3 PUSH1 0x1 PUSH2 0x2277 JUMP JUMPDEST PUSH2 0x1AB0 PUSH2 0x1AE3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1ADA JUMPI PUSH1 0x0 PUSH1 0x40 MLOAD PUSH4 0x1E4FBDF7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x2097 JUMP JUMPDEST CALLER PUSH2 0x1AEC PUSH2 0x11BB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xACD JUMPI CALLER PUSH1 0x40 MLOAD PUSH4 0x118CDAA7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL PUSH4 0xFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x472ABA493F9FD1D136EC54986F619F3AA5CAFF964F0E731A9909FB9A1270211F SWAP1 PUSH1 0x20 ADD PUSH2 0xDAB JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x140 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xC0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xE0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x100 DUP2 ADD DUP3 SWAP1 MSTORE PUSH2 0x120 DUP2 ADD DUP3 SWAP1 MSTORE SWAP1 PUSH2 0x1BE6 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x25D9897E DUP5 ADDRESS PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1C13 SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST PUSH2 0x140 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C55 SWAP2 SWAP1 PUSH2 0x59D0 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0xA0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x0 EQ ISZERO DUP4 SWAP1 PUSH2 0x1C89 JUMPI PUSH1 0x40 MLOAD PUSH4 0x7B3C09BF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD DUP2 MLOAD PUSH2 0x848 SWAP2 PUSH2 0x1CA4 SWAP2 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x6 DUP2 MSTORE PUSH1 0x20 ADD PUSH6 0x746F6B656E73 PUSH1 0xD0 SHL DUP2 MSTORE POP PUSH2 0x335C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1CD9 PUSH2 0x20F3 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 DUP4 PUSH2 0x1CEE JUMPI DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x1CF4 JUMP JUMPDEST DUP5 PUSH1 0xE0 ADD MLOAD JUMPDEST SWAP1 POP PUSH2 0x1D42 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH13 0x1D1A185DDA5B99D4195C9A5BD9 PUSH1 0x9A SHL DUP2 MSTORE POP PUSH2 0x335C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D4D PUSH2 0x1FDD JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 DUP7 PUSH2 0x1D62 JUMPI DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1D68 JUMP JUMPDEST DUP8 PUSH1 0xC0 ADD MLOAD JUMPDEST SWAP1 POP PUSH2 0x1DAE DUP2 PUSH4 0xFFFFFFFF AND DUP5 PUSH4 0xFFFFFFFF AND DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xE DUP2 MSTORE PUSH1 0x20 ADD PUSH14 0x1B585E15995C9A599A595C90DD5D PUSH1 0x92 SHL DUP2 MSTORE POP PUSH2 0x335C JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1DC0 PUSH2 0xCDC JUMP JUMPDEST ISZERO PUSH2 0xACD JUMPI PUSH1 0x40 MLOAD PUSH4 0xD93C0665 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH2 0x109 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP5 DUP7 AND SWAP5 DUP6 OR SWAP1 SSTORE MLOAD PUSH31 0x3215DC05A2FC4E6A1E2C2776311D207C730EE51085AAE221ACC5CBE6FB55C1 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO DUP2 ISZERO EQ PUSH2 0x1E8A JUMPI PUSH1 0x40 MLOAD PUSH4 0x5E67E54B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x8EC JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x67 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE SWAP2 MLOAD SWAP2 DUP3 MSTORE PUSH32 0xA95BAC2F3DF0D40E8278281C1D39D53C60E4F2BF3550CA5665738D0916E89789 SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH2 0x1EF3 PUSH2 0x3390 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1EFD PUSH2 0x2073 JUMP JUMPDEST DUP1 SLOAD PUSH1 0xFF NOT AND DUP2 SSTORE SWAP1 POP PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA CALLER JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xDAB SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD SWAP3 DUP4 ADD DUP5 SWAP1 MSTORE DUP3 DUP3 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP1 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP1 MSTORE DUP2 SWAP1 PUSH2 0x1F8B SWAP1 DUP5 SWAP1 PUSH2 0x33B5 SWAP1 PUSH2 0x33CA SWAP1 PUSH2 0x34C5 SWAP1 DUP10 PUSH2 0x34EA JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x13F3FA9F0E54AF1AF76D8B5D11C3973D7C2AED6312B61EFFF2F7B49D73AD67EB DUP4 DUP4 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x1FCF SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1768 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1FE8 PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xBB2A2B47 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2025 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2049 SWAP2 SWAP1 PUSH2 0x5A96 JUMP JUMPDEST SWAP3 PUSH3 0xF4240 SWAP3 POP SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2063 DUP3 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x12B8 JUMPI POP POP PUSH1 0x80 ADD MLOAD ISZERO SWAP1 JUMP JUMPDEST PUSH32 0xCD5ED15C6E187E77E9AEE88184C21F4F2182AB5827CB3B7E07FBEDCD63F03300 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20A1 PUSH2 0x286F JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP4 SWAP5 POP SWAP2 AND SWAP2 DUP3 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2100 PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5AEA0EC4 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x213D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2161 SWAP2 SWAP1 PUSH2 0x5AB3 JUMP JUMPDEST SWAP4 DUP5 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0xD2 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x21774046E2611DDB52C8C46E1AD97524EEB2E3FDA7DCD9428867868B4C4D06BA SWAP1 PUSH1 0x20 ADD PUSH2 0xDAB JUMP JUMPDEST PUSH2 0x21AC PUSH1 0xD0 DUP5 DUP5 DUP5 PUSH2 0x35A4 JUMP JUMPDEST DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD54C7ABC930F6D506DA2D08AA7AEAD4F2443E1DB6D5F560384A2F652FF893E19 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH2 0x21FA PUSH2 0x4FAE JUMP JUMPDEST PUSH2 0x2204 DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 SWAP1 SWAP2 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2284 PUSH1 0xCF DUP5 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x230F DUP4 PUSH2 0x2292 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22C3 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2306 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0xCF SWAP2 SWAP1 PUSH2 0x372A JUMP JUMPDEST PUSH2 0x231A PUSH1 0xCF DUP5 PUSH2 0x37DD JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x232D SWAP2 PUSH1 0xD1 SWAP2 PUSH2 0x3893 JUMP JUMPDEST DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2354 SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8F2F865E0FB62D722A51E4D9873199BF6BF52E7D8EE5A2EE2896C9EF719F545 DUP5 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x40 MLOAD PUSH2 0x23CC SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x23E6 PUSH1 0xCF DUP6 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x23F1 DUP2 PUSH2 0x2054 JUMP JUMPDEST DUP5 SWAP1 PUSH2 0x2411 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1EB5FF95 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP DUP1 PUSH1 0x40 ADD MLOAD DUP4 EQ ISZERO DUP5 DUP5 SWAP1 SWAP2 PUSH2 0x243D JUMPI PUSH1 0x40 MLOAD PUSH4 0xF32518CD PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP PUSH1 0x40 DUP2 ADD MLOAD DUP1 DUP5 GT ISZERO PUSH2 0x2473 JUMPI PUSH2 0x246E PUSH2 0x2457 PUSH2 0x1B69 JUMP JUMPDEST DUP4 MLOAD PUSH2 0x2463 DUP5 DUP9 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD1 SWAP3 SWAP2 SWAP1 DUP8 PUSH2 0x3911 JUMP JUMPDEST PUSH2 0x248C JUMP JUMPDEST DUP2 MLOAD PUSH2 0x248C SWAP1 PUSH2 0x2483 DUP7 DUP5 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD1 SWAP2 SWAP1 PUSH2 0x3893 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2496 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24C7 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x24E6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x250A SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2517 DUP5 PUSH2 0x333D JUMP JUMPDEST ISZERO PUSH2 0x2523 JUMPI PUSH1 0x0 PUSH2 0x2532 JUMP JUMPDEST PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2532 SWAP1 DUP4 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x2 DUP2 ADD DUP9 SWAP1 SSTORE PUSH1 0x6 ADD DUP4 SWAP1 SSTORE SWAP1 POP PUSH2 0x2561 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC8A5F81E DUP5 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x258E SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x25CF SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xCF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x7 ADD DUP1 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x25FA SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP3 DUP7 GT ISZERO PUSH2 0x2642 JUMPI PUSH2 0x2611 DUP4 DUP8 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP7 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x2637 SWAP2 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP PUSH2 0x2678 SWAP1 POP JUMP JUMPDEST PUSH2 0x264C DUP7 DUP5 PUSH2 0x5845 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP7 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x2672 SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6DB4A6F9BE2D5E72EB2A2AF2374AC487971BF342A261BA0BC1CF471BF2A2C31F DUP10 DUP8 PUSH1 0x40 MLOAD PUSH2 0x26C6 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST DUP2 DUP2 DUP1 DUP3 GT ISZERO PUSH2 0x26FC JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP POP PUSH1 0x0 DUP3 SWAP1 SSTORE PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x90699B8B4BF48918FEA1129C85F9BC7B51285DF7ECC982910813C7805F568849 SWAP1 PUSH2 0x273A SWAP1 DUP5 SWAP1 DUP5 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH2 0x274E PUSH2 0x1DB8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2758 PUSH2 0x2073 JUMP JUMPDEST DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR DUP2 SSTORE SWAP1 POP PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 PUSH2 0x1F2A CALLER SWAP1 JUMP JUMPDEST PUSH32 0xA16A46D94261C7517CC8FF89F61C0CE93598E3C849801011DEE649A6A557D100 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x27BD PUSH2 0x278D JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH2 0x27CE SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x27FA SWAP1 PUSH2 0x56C1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2847 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x281C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2847 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x282A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x285E PUSH2 0x278D JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x3 ADD DUP1 SLOAD PUSH2 0x27CE SWAP1 PUSH2 0x56C1 JUMP JUMPDEST PUSH32 0x9016D09D72D40FDAE2FD8CEAC6B6234C7706214FD39C1CD1E609A0528C199300 SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD PUSH2 0x28B0 SWAP2 SWAP1 PUSH2 0x5AFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x28EB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x28F0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x2900 DUP6 DUP4 DUP4 PUSH2 0x3A0F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH2 0x2919 DUP5 DUP7 ADD DUP7 PUSH2 0x5B3A JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 ADD MLOAD SWAP2 SWAP4 POP SWAP2 POP DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2953 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1A071D07 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP DUP2 MLOAD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 GT ISZERO PUSH2 0x2983 JUMPI PUSH1 0x40 MLOAD PUSH4 0xFA4AC7A7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST POP DUP2 MLOAD MLOAD PUSH1 0x0 PUSH2 0x2994 PUSH1 0xCF DUP4 PUSH2 0x21F2 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP DUP9 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND SWAP1 DUP4 AND EQ PUSH2 0x29C9 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4508FBF7 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0x29DB DUP10 PUSH1 0x0 PUSH2 0x1F37 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x29E8 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2A13 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2A54 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH2 0x2A5E PUSH2 0x32DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x692209CE PUSH1 0x0 PUSH2 0x2AFC DUP12 PUSH2 0x2A7A PUSH2 0x2EE0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x4C4EA0ED DUP11 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2AA7 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2AE8 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST PUSH2 0x2AF3 JUMPI PUSH1 0x0 PUSH2 0x3A86 JUMP JUMPDEST PUSH2 0x108 SLOAD PUSH2 0x3A86 JUMP JUMPDEST DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B1B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5C71 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B3A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2B5E SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP3 POP PUSH1 0x0 PUSH2 0x2B6A PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2B95 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2BB2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2BD6 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP DUP2 DUP2 DUP2 DUP2 LT ISZERO PUSH2 0x2BFD JUMPI PUSH1 0x40 MLOAD PUSH4 0x9DB8BC95 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP PUSH2 0x2C0A SWAP1 POP DUP3 DUP3 PUSH2 0x5845 JUMP JUMPDEST SWAP3 POP POP DUP3 ISZERO SWAP1 POP PUSH2 0x2DB4 JUMPI PUSH2 0x2CA9 DUP12 PUSH2 0x107 SLOAD DUP5 PUSH2 0x2C28 SWAP2 SWAP1 PUSH2 0x5CA1 JUMP JUMPDEST PUSH2 0x2C30 PUSH2 0x2FDF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5AEA0EC4 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C6D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2C91 SWAP2 SWAP1 PUSH2 0x5AB3 JUMP JUMPDEST PUSH2 0x2CA4 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP PUSH2 0x5AE9 JUMP JUMPDEST PUSH2 0x3ADA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2DB4 JUMPI PUSH2 0x2CB7 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1D1C2FEC DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2CE4 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2D03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2D27 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST POP PUSH2 0x2D4C PUSH2 0x2D33 PUSH2 0x2EE0 JUMP JUMPDEST DUP3 PUSH2 0x2D3C PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C4A JUMP JUMPDEST PUSH2 0x2D54 PUSH2 0x2EE0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x81573288 DUP5 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D81 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DAF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP7 MLOAD PUSH1 0x20 SWAP1 DUP2 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP7 DUP2 MSTORE SWAP3 DUP4 ADD DUP6 SWAP1 MSTORE DUP3 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND SWAP3 SWAP2 DUP2 AND SWAP2 SWAP1 DUP15 AND SWAP1 PUSH32 0x184C452047299395D4F7F147EB8E823458A450798539BE54AEED978F13D87BA2 SWAP1 PUSH1 0x60 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x2E2E DUP6 DUP8 ADD DUP8 PUSH2 0x5CB8 JUMP JUMPDEST SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x2E4A PUSH1 0xCF DUP6 PUSH2 0x21F2 JUMP JUMPDEST MLOAD DUP9 SWAP2 DUP6 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2E78 JUMPI PUSH1 0x40 MLOAD PUSH4 0xC0BBFF13 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x109 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x2EB6 SWAP3 DUP7 SWAP3 DUP7 SWAP3 DUP7 SWAP3 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP2 AND PUSH2 0x3CF9 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2ED8 PUSH2 0x2ECE PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0xD1 SWAP1 DUP6 DUP6 PUSH2 0x42D6 JUMP JUMPDEST ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH32 0xF0C57E16840DF040F15088DC2F81FE391C3923BEC73E23A9662EFC9C229C6A00 PUSH2 0x12B8 JUMP JUMPDEST PUSH2 0x2F35 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x848 DUP2 PUSH2 0x4395 JUMP JUMPDEST PUSH2 0xACD PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F4E PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F56 PUSH2 0x439D JUMP JUMPDEST PUSH2 0xACD PUSH2 0x2F3E JUMP JUMPDEST PUSH2 0x2F66 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F56 PUSH2 0x2F3E JUMP JUMPDEST PUSH2 0x2F76 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x2F80 DUP3 DUP3 PUSH2 0x43DF JUMP JUMPDEST PUSH2 0xA8F PUSH2 0x2F3E JUMP JUMPDEST DUP1 PUSH1 0x0 SUB PUSH2 0x2FA9 JUMPI PUSH1 0x40 MLOAD PUSH4 0xBC71A043 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x107 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 DUP2 MSTORE PUSH32 0x2AAAF20B08565EEBC0C962CD7C568E54C3C0C2B85A1F942B82CD1BD730FDCD23 SWAP1 PUSH1 0x20 ADD PUSH2 0xDAB JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x300E DUP2 PUSH1 0x1 PUSH2 0x43F1 JUMP JUMPDEST PUSH2 0x3016 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x3A78B732 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3041 SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x305B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x306F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x186C PUSH32 0x4BDEE85C4B4A268F4895D1096D553C3E57BB2433C380E7B7EC8CB56CC4F74673 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x30CA SWAP4 SWAP3 SWAP2 SWAP1 SWAP3 DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x4408 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x310C JUMPI PUSH1 0x40 MLOAD PUSH4 0x4FFDF5EF PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3117 DUP7 DUP7 DUP5 PUSH2 0x4435 JUMP JUMPDEST PUSH2 0x312B PUSH2 0x3122 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0xD0 SWAP1 DUP8 PUSH2 0x4484 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3135 PUSH2 0x457A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x76671808 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3172 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3196 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3226 DUP9 DUP9 DUP9 DUP9 PUSH2 0x31A9 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP13 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x31D6 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3219 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0xCF SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 DUP9 PUSH2 0x459E JUMP JUMPDEST SWAP1 POP PUSH2 0x323E PUSH2 0x3233 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0xD1 SWAP1 DUP11 DUP9 DUP8 PUSH2 0x3911 JUMP JUMPDEST DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x3265 SWAP2 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST PUSH1 0xD3 PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP6 DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE5E185FAB2B992C4727FF702A867D78B15FB176DBAA20C9C312A1C351D3F7F83 DUP5 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x40 MLOAD PUSH2 0x32CA SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3315 DUP5 PUSH1 0x60 ADD MLOAD DUP6 PUSH1 0xA0 ADD MLOAD PUSH2 0x4706 JUMP JUMPDEST PUSH2 0x331F SWAP1 TIMESTAMP PUSH2 0x5845 JUMP JUMPDEST SWAP1 POP PUSH2 0x332A DUP5 PUSH2 0x2054 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x3335 JUMPI POP DUP3 DUP2 GT JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x334C DUP3 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x12B8 JUMPI POP POP PUSH1 0x40 ADD MLOAD ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x3367 DUP5 DUP5 DUP5 PUSH2 0x4716 JUMP JUMPDEST DUP2 DUP6 DUP6 DUP6 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x1DAE JUMPI PUSH1 0x40 MLOAD PUSH4 0x871E13D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5D10 JUMP JUMPDEST PUSH2 0x3398 PUSH2 0xCDC JUMP JUMPDEST PUSH2 0xACD JUMPI PUSH1 0x40 MLOAD PUSH4 0x8DFC202B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH2 0x33D9 DUP6 PUSH2 0x472D JUMP JUMPDEST SWAP1 POP TIMESTAMP DUP2 PUSH1 0x40 ADD MLOAD GT ISZERO PUSH2 0x3401 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x1 SWAP2 POP PUSH2 0x34BE JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3418 SWAP2 SWAP1 PUSH2 0x5D3F JUMP JUMPDEST DUP5 MLOAD SWAP2 SWAP4 POP SWAP2 POP PUSH2 0x342D SWAP1 PUSH1 0x9A SWAP1 DUP4 SWAP1 PUSH2 0x3893 JUMP JUMPDEST DUP7 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4C06B68820628A39C787D2DB1FAA0EEACD7B9474847B198B1E871FE6E5B93F44 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x3471 SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP3 MLOAD PUSH2 0x3485 SWAP1 DUP4 PUSH2 0x5AE9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP6 POP PUSH1 0x0 DUP7 SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 DUP2 SSTORE PUSH1 0x1 DUP2 ADD DUP3 SWAP1 SSTORE PUSH1 0x2 DUP2 ADD DUP3 SWAP1 SSTORE PUSH1 0x3 ADD SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP8 PUSH1 0x3 ADD SLOAD DUP4 GT ISZERO PUSH2 0x3513 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4A411B9D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 ISZERO PUSH2 0x3521 JUMPI DUP4 PUSH2 0x3527 JUMP JUMPDEST DUP9 PUSH1 0x3 ADD SLOAD JUMPDEST DUP10 SLOAD SWAP1 SWAP5 POP JUMPDEST DUP1 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x353C JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0x3595 JUMPI PUSH1 0x0 DUP1 PUSH2 0x3552 DUP4 DUP10 DUP13 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0x3563 JUMPI POP POP PUSH2 0x3595 JUMP JUMPDEST SWAP7 POP DUP7 PUSH2 0x3571 DUP13 DUP13 DUP12 PUSH2 0x47BB JUMP JUMPDEST SWAP3 POP DUP7 PUSH2 0x357D DUP2 PUSH2 0x5D65 JUMP JUMPDEST SWAP8 POP POP DUP4 DUP1 PUSH2 0x358B SWAP1 PUSH2 0x5D7C JUMP JUMPDEST SWAP5 POP POP POP POP PUSH2 0x352D JUMP JUMPDEST POP SWAP9 SWAP4 SWAP8 POP SWAP3 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP7 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD SWAP1 SWAP4 AND DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x35E4 SWAP1 PUSH2 0x4842 JUMP JUMPDEST ISZERO DUP3 SWAP1 PUSH2 0x3605 JUMPI PUSH1 0x40 MLOAD PUSH4 0x2D7D25F1 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP4 DUP5 MSTORE SWAP4 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP6 SWAP1 SWAP4 MSTORE SWAP1 SWAP4 KECCAK256 SWAP1 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR DUP2 SSTORE SWAP1 MLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP5 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH2 0x120 DUP2 ADD DUP4 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP5 ADD MSTORE PUSH1 0x8 DUP2 ADD SLOAD PUSH2 0x100 DUP5 ADD MSTORE SWAP1 SWAP2 PUSH2 0x36DE SWAP1 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0x36FE JUMPI PUSH1 0x40 MLOAD PUSH4 0x42DAADAF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3736 DUP5 DUP5 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x37AD SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP5 SWAP2 PUSH2 0x37D3 JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP PUSH1 0x6 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37E9 DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x3860 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP4 SWAP2 PUSH2 0x3886 JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP TIMESTAMP PUSH1 0x4 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST DUP1 PUSH1 0x0 SUB PUSH2 0x38A0 JUMPI POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP1 DUP3 LT ISZERO PUSH2 0x38DD JUMPI PUSH1 0x40 MLOAD PUSH4 0x5F8EC709 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0x3907 SWAP1 DUP5 SWAP1 PUSH2 0x5845 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP JUMP JUMPDEST DUP2 ISZERO PUSH2 0x306F JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP7 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x393B SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x872D0489 DUP7 ADDRESS DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x396F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5D95 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x398C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x39B0 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP DUP1 DUP3 DUP2 DUP2 GT ISZERO PUSH2 0x39D7 JUMPI PUSH1 0x40 MLOAD PUSH4 0x5F8EC709 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP7 SWAP3 SWAP1 PUSH2 0x3A01 SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH2 0x3A24 JUMPI PUSH2 0x3A1F DUP3 PUSH2 0x4851 JUMP JUMPDEST PUSH2 0x186C JUMP JUMPDEST DUP2 MLOAD ISZERO DUP1 ISZERO PUSH2 0x3A3B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND EXTCODESIZE ISZERO JUMPDEST ISZERO PUSH2 0x3A5B JUMPI DUP4 PUSH1 0x40 MLOAD PUSH4 0x9996B315 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP DUP1 PUSH2 0x186C JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH2 0x109 PUSH1 0x20 SWAP1 DUP2 MSTORE SWAP1 DUP4 SWAP1 KECCAK256 SLOAD SWAP3 MLOAD PUSH1 0x60 SWAP4 PUSH2 0x3AC3 SWAP4 DUP8 SWAP4 DUP8 SWAP4 SWAP3 SWAP1 SWAP2 AND SWAP2 ADD PUSH2 0x5DBE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 PUSH1 0x0 SUB PUSH2 0x3AFB JUMPI PUSH1 0x40 MLOAD PUSH4 0x8F4C63D9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3B27 PUSH2 0x3B06 PUSH2 0x1B69 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x9A SWAP2 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x3911 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x2 DUP1 DUP3 ADD SLOAD DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT ADDRESS PUSH1 0x60 SWAP1 DUP2 SHL DUP3 AND DUP4 DUP10 ADD MSTORE DUP12 SWAP1 SHL AND PUSH1 0x34 DUP3 ADD MSTORE PUSH1 0x48 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP5 MLOAD DUP1 DUP3 SUB SWAP1 SWAP3 ADD DUP3 MSTORE PUSH1 0x68 DUP2 ADD DUP1 DUP7 MSTORE DUP3 MLOAD SWAP3 DUP8 ADD SWAP3 SWAP1 SWAP3 KECCAK256 PUSH1 0xE8 DUP3 ADD DUP7 MSTORE DUP10 DUP4 MSTORE TIMESTAMP PUSH1 0x88 DUP4 ADD SWAP1 DUP2 MSTORE PUSH1 0xA8 DUP4 ADD DUP11 DUP2 MSTORE PUSH1 0xC8 SWAP1 SWAP4 ADD DUP10 DUP2 MSTORE DUP3 DUP11 MSTORE PUSH1 0x9B SWAP1 SWAP9 MSTORE SWAP6 SWAP1 SWAP8 KECCAK256 SWAP2 MLOAD DUP3 SSTORE SWAP4 MLOAD PUSH1 0x1 DUP3 ADD SSTORE SWAP3 MLOAD SWAP1 DUP4 ADD SSTORE SWAP2 MLOAD PUSH1 0x3 SWAP2 DUP3 ADD SSTORE DUP2 ADD SLOAD SWAP1 SWAP2 SWAP1 ISZERO PUSH2 0x3BF5 JUMPI PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD DUP2 SWAP1 SSTORE JUMPDEST PUSH2 0x3BFF DUP3 DUP3 PUSH2 0x487A JUMP JUMPDEST DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x5D9E2C5278E41138269F5F980CFBEA016D8C59816754502ABC4D2F87AAEA987F DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0x3C3B SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD3C JUMPI PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x3C7E SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x5AD0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C9D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3CC1 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST PUSH2 0xD3C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x9 PUSH1 0x24 DUP3 ADD MSTORE PUSH9 0x10BA3930B739B332B9 PUSH1 0xB9 SHL PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3D07 PUSH1 0xCF DUP9 PUSH2 0x21F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x3D12 DUP2 PUSH2 0x2054 JUMP JUMPDEST DUP8 SWAP1 PUSH2 0x3D32 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1EB5FF95 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x3D4A PUSH1 0xD2 SLOAD DUP4 PUSH2 0x3300 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST ISZERO DUP1 ISZERO PUSH2 0x3D5D JUMPI POP PUSH2 0x3D5B DUP3 PUSH2 0x333D JUMP JUMPDEST ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x3D68 JUMPI POP DUP7 ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x3DE0 JUMPI POP DUP2 PUSH2 0x100 ADD MLOAD PUSH2 0x3D7D PUSH2 0x457A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x76671808 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DBA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DDE SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST GT JUMPDEST PUSH2 0x3DEB JUMPI PUSH1 0x0 PUSH2 0x3E61 JUMP JUMPDEST PUSH2 0x3DF3 PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xDB750926 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E1E SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E3D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3E61 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH2 0x3EA0 DUP9 PUSH2 0x3E6F PUSH2 0x3706 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEEAC3E0E DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22C3 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x3EAB PUSH1 0xCF DUP10 PUSH2 0x490D JUMP JUMPDEST PUSH2 0x3EB6 PUSH1 0xCF DUP10 PUSH2 0x49C3 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 ISZERO PUSH2 0x41EF JUMPI PUSH1 0x0 PUSH2 0x3EC9 PUSH2 0x1B69 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x40 MLOAD PUSH4 0x7573EF4F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7573EF4F SWAP2 PUSH2 0x3EFC SWAP2 ADDRESS SWAP1 PUSH1 0x2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5E87 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3F19 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3F3D SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3F49 PUSH2 0x1B69 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x40 MLOAD PUSH4 0x1584A179 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x561285E4 SWAP2 PUSH2 0x3F79 SWAP2 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x5515 JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3F96 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3FBA SWAP2 SWAP1 PUSH2 0x5EAC JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x20 ADD MLOAD GT PUSH2 0x3FCF JUMPI PUSH1 0x0 PUSH2 0x3FD9 JUMP JUMPDEST PUSH2 0x3FD9 DUP6 DUP4 PUSH2 0x4A7A JUMP JUMPDEST SWAP3 POP DUP3 ISZERO PUSH2 0x40CE JUMPI PUSH2 0x3FE9 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x95EA7B3 PUSH2 0x3FFF PUSH2 0x1B69 JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x401D SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x403C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4060 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST POP PUSH2 0x4069 PUSH2 0x1B69 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x40 MLOAD PUSH4 0xCA94B0E9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0xCA94B0E9 SWAP2 PUSH2 0x409B SWAP2 ADDRESS SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x5F1F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x40B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x40C9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x40D8 DUP4 DUP7 PUSH2 0x5845 JUMP JUMPDEST SWAP4 POP DUP4 ISZERO PUSH2 0x41EC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH2 0x41DF JUMPI PUSH2 0x40F6 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x95EA7B3 PUSH2 0x410C PUSH2 0x1B69 JUMP JUMPDEST DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x412A SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4149 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x416D SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST POP PUSH2 0x4176 PUSH2 0x1B69 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x40 MLOAD PUSH4 0x3A309049 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x74612092 SWAP2 PUSH2 0x41A8 SWAP2 ADDRESS SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x5F1F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x41C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x41D6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x41EC JUMP JUMPDEST PUSH2 0x41EC DUP9 DUP6 PUSH2 0x2D3C PUSH2 0x3A62 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND SWAP2 AND PUSH32 0x443F56BD2098D273B8C8120398789A41DA5925DB4BA2F656813FC5299AC57B1F DUP7 DUP7 DUP7 DUP16 DUP16 PUSH2 0x4231 PUSH2 0x457A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x76671808 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x426E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4292 SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x42A4 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5F43 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP4 MLOAD PUSH2 0x42B8 SWAP1 DUP9 PUSH2 0x2EC1 JUMP JUMPDEST ISZERO PUSH2 0x42C8 JUMPI PUSH2 0x42C8 DUP11 PUSH1 0x1 PUSH2 0x2277 JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x872D0489 DUP6 ADDRESS DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4309 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5D95 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4326 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x434A SWAP2 SWAP1 PUSH2 0x5A7D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP9 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD GT ISZERO SWAP2 POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x4378 PUSH2 0x4ADA JUMP JUMPDEST PUSH2 0xACD JUMPI PUSH1 0x40 MLOAD PUSH4 0x1AFCD79F PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1AB0 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x43A5 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0x43B2 PUSH1 0x0 PUSH1 0x0 NOT PUSH2 0x26D7 JUMP JUMPDEST PUSH2 0x43C0 PUSH1 0x0 PUSH3 0xF4240 PUSH2 0x4AF4 JUMP JUMPDEST PUSH2 0x43D2 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH2 0x4BC5 JUMP JUMPDEST PUSH2 0xACD PUSH4 0xFFFFFFFF PUSH2 0x1B15 JUMP JUMPDEST PUSH2 0x43E7 PUSH2 0x4370 JUMP JUMPDEST PUSH2 0xA8F DUP3 DUP3 PUSH2 0x4C52 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x43FC DUP4 PUSH2 0x1B8D JUMP JUMPDEST SWAP1 POP PUSH2 0xD3C DUP2 DUP4 PUSH2 0x1CCE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B8 PUSH2 0x4415 PUSH2 0x4C93 JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x444A PUSH2 0x4444 DUP6 DUP6 PUSH2 0x3076 JUMP JUMPDEST DUP4 PUSH2 0x4C9D JUMP JUMPDEST SWAP1 POP DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND EQ PUSH2 0x447C JUMPI PUSH1 0x40 MLOAD PUSH4 0x8C5B935D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5515 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD SWAP1 SWAP4 AND DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x44C4 SWAP1 PUSH2 0x4842 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x44E5 JUMPI PUSH1 0x40 MLOAD PUSH4 0x2D7D25F1 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH4 0x78EB06B3 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0xF1D60D66 SWAP1 PUSH2 0x4512 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x5048 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x452F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x4553 SWAP2 SWAP1 PUSH2 0x54F8 JUMP JUMPDEST ISZERO DUP2 SWAP1 PUSH2 0x4574 JUMPI PUSH1 0x40 MLOAD PUSH4 0x2D7D25F1 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x45A6 PUSH2 0x4FAE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP11 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH2 0x120 DUP2 ADD DUP5 MSTORE DUP2 SLOAD SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x1 DUP2 ADD SLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x2 DUP2 ADD SLOAD SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x4 DUP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0x5 DUP2 ADD SLOAD PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0x6 DUP2 ADD SLOAD PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0x7 DUP2 ADD SLOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH1 0x8 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x4632 SWAP1 PUSH1 0x60 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST ISZERO DUP7 SWAP1 PUSH2 0x4653 JUMPI PUSH1 0x40 MLOAD PUSH4 0xBC4DEF5 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 SWAP1 PUSH2 0x5048 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP7 DUP8 MSTORE DUP2 DUP4 ADD SWAP6 DUP7 MSTORE TIMESTAMP PUSH1 0x60 DUP4 ADD SWAP1 DUP2 MSTORE PUSH1 0x0 PUSH1 0x80 DUP5 ADD DUP2 DUP2 MSTORE PUSH1 0xA0 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0xC0 DUP7 ADD SWAP9 DUP10 MSTORE PUSH1 0xE0 DUP7 ADD DUP4 DUP2 MSTORE PUSH2 0x100 DUP8 ADD SWAP9 DUP10 MSTORE SWAP12 DUP14 AND DUP4 MSTORE SWAP13 SWAP1 SWAP4 MSTORE SWAP4 SWAP1 SWAP4 KECCAK256 DUP3 MLOAD DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP11 AND SWAP10 SWAP1 SWAP10 OR DUP10 SSTORE SWAP6 MLOAD PUSH1 0x1 DUP10 ADD SSTORE SWAP4 MLOAD PUSH1 0x2 DUP9 ADD SSTORE MLOAD PUSH1 0x3 DUP8 ADD SSTORE SWAP3 MLOAD PUSH1 0x4 DUP7 ADD SSTORE SWAP5 MLOAD PUSH1 0x5 DUP6 ADD SSTORE SWAP4 MLOAD PUSH1 0x6 DUP5 ADD SSTORE SWAP1 MLOAD PUSH1 0x7 DUP4 ADD SSTORE MLOAD PUSH1 0x8 SWAP1 SWAP2 ADD SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 XOR DUP3 DUP5 GT MUL DUP3 XOR PUSH2 0x186C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 LT ISZERO DUP1 ISZERO PUSH2 0x3335 JUMPI POP POP SWAP1 SWAP2 GT ISZERO SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x475B PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x9B PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x80 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP2 MSTORE PUSH1 0x1 DUP3 ADD SLOAD SWAP3 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x3 ADD SLOAD PUSH1 0x60 DUP4 ADD MSTORE DUP4 SWAP1 PUSH2 0x1C89 JUMPI PUSH1 0x40 MLOAD PUSH4 0x107349A9 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH1 0x3 ADD SLOAD GT PUSH2 0x47E1 JUMPI PUSH1 0x40 MLOAD PUSH4 0xDDAF8F21 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x47F4 DUP6 PUSH1 0x0 ADD SLOAD DUP6 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x4807 DUP6 PUSH1 0x0 ADD SLOAD DUP5 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x1 DUP6 PUSH1 0x3 ADD PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x481C SWAP2 SWAP1 PUSH2 0x5845 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP DUP1 DUP6 SSTORE PUSH1 0x3 DUP6 ADD SLOAD PUSH1 0x0 SUB PUSH2 0x4838 JUMPI PUSH1 0x0 PUSH1 0x1 DUP7 ADD SSTORE JUMPDEST POP POP SWAP2 SLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP1 MLOAD ISZERO PUSH2 0x4861 JUMPI DUP1 MLOAD DUP1 DUP3 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD6BDA275 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2710 DUP3 PUSH1 0x3 ADD SLOAD LT PUSH2 0x48A0 JUMPI PUSH1 0x40 MLOAD PUSH4 0x3A8C56B PUSH1 0xE6 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x48BE JUMPI PUSH1 0x40 MLOAD PUSH4 0x8F4A893D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP1 DUP4 ADD DUP3 SWAP1 SSTORE PUSH1 0x2 DUP4 ADD DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x48DA SWAP1 DUP5 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x0 SUB PUSH2 0x48EF JUMPI DUP1 DUP3 SSTORE JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x3 ADD PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0x4904 SWAP2 SWAP1 PUSH2 0x5AE9 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4919 DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x4990 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP4 SWAP2 PUSH2 0x49B6 JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP TIMESTAMP PUSH1 0x5 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x49CF DUP4 DUP4 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 DUP4 ADD SLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x2 DUP4 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x4 DUP3 ADD SLOAD PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x5 DUP3 ADD SLOAD PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0x6 DUP3 ADD SLOAD PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0x7 DUP3 ADD SLOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0x8 DUP3 ADD SLOAD PUSH2 0x100 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x4A46 SWAP1 PUSH2 0x2054 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SLOAD DUP4 SWAP2 PUSH2 0x4A6C JUMPI PUSH1 0x40 MLOAD PUSH4 0x61B66E0D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5AD0 JUMP JUMPDEST POP POP PUSH1 0x0 PUSH1 0x7 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4A89 DUP4 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP1 PUSH2 0x4A9C JUMPI POP PUSH2 0x4A9C DUP3 PUSH3 0xF4240 LT ISZERO SWAP1 JUMP JUMPDEST DUP4 DUP4 SWAP1 SWAP2 PUSH2 0x4ABF JUMPI PUSH1 0x40 MLOAD PUSH4 0x768BF0EB PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5277 JUMP JUMPDEST POP PUSH3 0xF4240 SWAP1 POP PUSH2 0x4AD0 DUP4 DUP6 PUSH2 0x5CA1 JUMP JUMPDEST PUSH2 0x186C SWAP2 SWAP1 PUSH2 0x5F81 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4AE4 PUSH2 0x2F04 JUMP JUMPDEST SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH1 0xFF AND SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 DUP2 PUSH4 0xFFFFFFFF DUP1 DUP3 AND SWAP1 DUP4 AND GT ISZERO PUSH2 0x4B22 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5180 JUMP JUMPDEST POP DUP3 SWAP1 POP DUP2 PUSH4 0xFFFFFFFF DUP2 AND PUSH3 0xF4240 LT ISZERO PUSH2 0x4B53 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x5180 JUMP JUMPDEST POP POP PUSH1 0x2 DUP1 SLOAD PUSH4 0xFFFFFFFF DUP4 DUP2 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH4 0xFFFFFFFF PUSH1 0xA0 SHL NOT SWAP2 DUP7 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x80 SHL PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2FE5A7039987697813605CC0B9D6DB7AAB575408E3FC59E8A457BEF8D7BC0A36 SWAP1 PUSH2 0x273A SWAP1 DUP5 SWAP1 DUP5 SWAP1 PUSH2 0x5180 JUMP JUMPDEST DUP2 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND SWAP1 DUP4 AND GT ISZERO PUSH2 0x4BF6 JUMPI PUSH1 0x40 MLOAD PUSH4 0xCCCCDAFB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EC SWAP3 SWAP2 SWAP1 PUSH2 0x521C JUMP JUMPDEST POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x40 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP1 DUP6 AND OR OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2867E04C500E438761486B78021D4F9EB97C77FF45D10C1183F5583BA4CBF7D1 SWAP1 PUSH2 0x273A SWAP1 DUP5 SWAP1 DUP5 SWAP1 PUSH2 0x521C JUMP JUMPDEST PUSH2 0x4C5A PUSH2 0x4370 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C64 PUSH2 0x278D JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP2 ADD PUSH2 0x4C74 DUP5 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP PUSH1 0x3 DUP2 ADD PUSH2 0x4C83 DUP4 DUP3 PUSH2 0x5742 JUMP JUMPDEST POP PUSH1 0x0 DUP1 DUP3 SSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84B PUSH2 0x4CC7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x4CAD DUP7 DUP7 PUSH2 0x4D3B JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x4CBD DUP3 DUP3 PUSH2 0x4D88 JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x4CF2 PUSH2 0x4E41 JUMP JUMPDEST PUSH2 0x4CFA PUSH2 0x4EA8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MSTORE CHAINID PUSH1 0x80 DUP3 ADD MSTORE ADDRESS PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 MLOAD PUSH1 0x41 SUB PUSH2 0x4D75 JUMPI PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x0 BYTE PUSH2 0x4D67 DUP9 DUP3 DUP6 DUP6 PUSH2 0x4EE9 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP POP POP POP PUSH2 0x4D81 JUMP JUMPDEST POP POP DUP2 MLOAD PUSH1 0x0 SWAP2 POP PUSH1 0x2 SWAP1 JUMPDEST SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4D9C JUMPI PUSH2 0x4D9C PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x4DA5 JUMPI POP POP JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4DB9 JUMPI PUSH2 0x4DB9 PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x4DD7 JUMPI PUSH1 0x40 MLOAD PUSH4 0xF645EEDF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4DEB JUMPI PUSH2 0x4DEB PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0x4E0C JUMPI PUSH1 0x40 MLOAD PUSH4 0xFCE698F7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x3 DUP3 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4E20 JUMPI PUSH2 0x4E20 PUSH2 0x58DB JUMP JUMPDEST SUB PUSH2 0xA8F JUMPI PUSH1 0x40 MLOAD PUSH4 0x35E2F383 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x8EC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x4E4C PUSH2 0x278D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x4E58 PUSH2 0x27B1 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x4E70 JUMPI DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD DUP1 ISZERO PUSH2 0x4E7F JUMPI SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xC5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470 SWAP4 POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x4EB3 PUSH2 0x278D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x4EBF PUSH2 0x2852 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x4ED7 JUMPI DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SLOAD DUP1 ISZERO PUSH2 0x4E7F JUMPI SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH16 0xA2A8918CA85BAFE22016D0B997E4DF60 PUSH1 0x1 PUSH1 0xFF SHL SUB DUP5 GT ISZERO PUSH2 0x4F1A JUMPI POP PUSH1 0x0 SWAP2 POP PUSH1 0x3 SWAP1 POP DUP3 PUSH2 0x4FA4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP1 DUP5 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP10 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4F6E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x4F9A JUMPI POP PUSH1 0x0 SWAP3 POP PUSH1 0x1 SWAP2 POP DUP3 SWAP1 POP PUSH2 0x4FA4 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 SWAP2 POP DUP2 SWAP1 POP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x120 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x5026 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x503D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x186C DUP2 PUSH2 0x5006 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5080 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x186C DUP2 PUSH2 0x505C JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x509D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x50B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x34BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x50E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x50EC DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5107 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5113 DUP7 DUP3 DUP8 ADD PUSH2 0x508B JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x514C DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x515C DUP2 PUSH2 0x5120 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x51B2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x519A JUMP JUMPDEST POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x51D3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5197 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x60 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x5200 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x51BB JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x5212 DUP2 DUP6 PUSH2 0x51BB JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x524B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x5256 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x5266 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF PUSH1 0xF8 SHL DUP9 AND DUP2 MSTORE PUSH1 0xE0 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x52A4 PUSH1 0xE0 DUP4 ADD DUP10 PUSH2 0x51BB JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x52B6 DUP2 DUP10 PUSH2 0x51BB JUMP JUMPDEST PUSH1 0x60 DUP5 ADD DUP9 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP5 ADD DUP7 SWAP1 MSTORE DUP4 DUP2 SUB PUSH1 0xC0 DUP6 ADD MSTORE DUP5 MLOAD DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP8 ADD SWAP4 POP SWAP1 SWAP2 ADD SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x530C JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x52EE JUMP JUMPDEST POP SWAP1 SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x5357 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x536D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP5 ADD ADD GT ISZERO PUSH2 0x5382 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP2 SWAP1 SWAP2 ADD SWAP6 SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP1 DUP5 MLOAD DUP1 DUP4 MSTORE PUSH1 0x40 DUP6 ADD SWAP2 POP PUSH1 0x40 DUP2 PUSH1 0x5 SHL DUP7 ADD ADD SWAP3 POP PUSH1 0x20 DUP7 ADD PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x53EB JUMPI PUSH1 0x3F NOT DUP8 DUP7 SUB ADD DUP5 MSTORE PUSH2 0x53D6 DUP6 DUP4 MLOAD PUSH2 0x51BB JUMP JUMPDEST SWAP5 POP PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x53BA JUMP JUMPDEST POP SWAP3 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x540D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5418 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x3 DUP2 LT PUSH2 0x542C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5453 DUP8 DUP3 DUP9 ADD PUSH2 0x508B JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5480 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x5497 DUP2 PUSH2 0x505C JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x54BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x54C5 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x515C DUP2 PUSH2 0x5006 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x550A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x186C DUP2 PUSH2 0x5120 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x140 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5568 JUMPI PUSH2 0x5568 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5568 JUMPI PUSH2 0x5568 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5568 JUMPI PUSH2 0x5568 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x55C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x20 DUP4 ADD PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP5 GT ISZERO PUSH2 0x55E3 JUMPI PUSH2 0x55E3 PUSH2 0x552F JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT PUSH1 0x1F DUP6 ADD DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD DUP2 DUP2 LT PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT OR ISZERO PUSH2 0x5611 JUMPI PUSH2 0x5611 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE SWAP1 POP DUP1 DUP3 DUP5 ADD DUP8 LT ISZERO PUSH2 0x5629 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP4 PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 PUSH1 0x20 DUP6 DUP4 ADD ADD MSTORE DUP1 SWAP5 POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x565B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x567D DUP7 DUP3 DUP8 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x56A5 DUP7 DUP3 DUP8 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x56B6 DUP2 PUSH2 0x5006 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 SHR SWAP1 DUP3 AND DUP1 PUSH2 0x56D5 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 SUB PUSH2 0x56F5 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1F DUP3 GT ISZERO PUSH2 0xD3C JUMPI DUP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP2 ADD PUSH1 0x20 DUP6 LT ISZERO PUSH2 0x5722 JUMPI POP DUP1 JUMPDEST PUSH1 0x1F DUP5 ADD PUSH1 0x5 SHR DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x306F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x572E JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x575B JUMPI PUSH2 0x575B PUSH2 0x552F JUMP JUMPDEST PUSH2 0x576F DUP2 PUSH2 0x5769 DUP5 SLOAD PUSH2 0x56C1 JUMP JUMPDEST DUP5 PUSH2 0x56FB JUMP JUMPDEST PUSH1 0x20 PUSH1 0x1F DUP3 GT PUSH1 0x1 DUP2 EQ PUSH2 0x57A3 JUMPI PUSH1 0x0 DUP4 ISZERO PUSH2 0x578B JUMPI POP DUP5 DUP3 ADD MLOAD JUMPDEST PUSH1 0x0 NOT PUSH1 0x3 DUP6 SWAP1 SHL SHR NOT AND PUSH1 0x1 DUP5 SWAP1 SHL OR DUP5 SSTORE PUSH2 0x306F JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 PUSH1 0x1F NOT DUP6 AND SWAP2 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x57D3 JUMPI DUP8 DUP6 ADD MLOAD DUP3 SSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x57B3 JUMP JUMPDEST POP DUP5 DUP3 LT ISZERO PUSH2 0x57F1 JUMPI DUP7 DUP5 ADD MLOAD PUSH1 0x0 NOT PUSH1 0x3 DUP8 SWAP1 SHL PUSH1 0xF8 AND SHR NOT AND DUP2 SSTORE JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 DUP2 SHL ADD SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE DUP2 PUSH1 0x20 DUP3 ADD MSTORE DUP2 DUP4 PUSH1 0x40 DUP4 ADD CALLDATACOPY PUSH1 0x0 DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH1 0x1F NOT AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x12B8 JUMPI PUSH2 0x12B8 PUSH2 0x582F JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5885 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x589F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x34BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP5 DUP3 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD PUSH1 0x0 DUP2 MSTORE DUP4 MLOAD PUSH2 0x58D1 DUP2 DUP4 PUSH1 0x20 DUP9 ADD PUSH2 0x5197 JUMP JUMPDEST ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 DUP2 LT PUSH2 0x590F JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x21 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x12B8 DUP3 DUP5 PUSH2 0x58F1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5934 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5959 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x5972 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x598D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5999 DUP8 DUP3 DUP9 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST DUP1 MLOAD PUSH2 0x5026 DUP2 PUSH2 0x505C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x848 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x5026 DUP2 PUSH2 0x59B0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x59E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 PUSH2 0x59EF PUSH2 0x5545 JUMP JUMPDEST DUP4 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x5A13 PUSH1 0x60 DUP6 ADD PUSH2 0x59A5 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x5A24 PUSH1 0x80 DUP6 ADD PUSH2 0x59C5 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x5A35 PUSH1 0xA0 DUP6 ADD PUSH2 0x59C5 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x5A46 PUSH1 0xC0 DUP6 ADD PUSH2 0x59A5 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x5A57 PUSH1 0xE0 DUP6 ADD PUSH2 0x59C5 JUMP JUMPDEST PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x120 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5A8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5AA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x186C DUP2 PUSH2 0x505C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5AC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x186C DUP2 PUSH2 0x59B0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x12B8 JUMPI PUSH2 0x12B8 PUSH2 0x582F JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x5B0E DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5197 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x5026 DUP2 PUSH2 0x59B0 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5026 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5B4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5B63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD PUSH1 0x40 DUP2 DUP7 SUB SLT ISZERO PUSH2 0x5B75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5B7D PUSH2 0x556E JUMP JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5B93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH1 0xE0 DUP2 DUP9 SUB SLT ISZERO PUSH2 0x5BA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BAD PUSH2 0x5590 JUMP JUMPDEST DUP2 CALLDATALOAD DUP2 MSTORE PUSH2 0x5BBD PUSH1 0x20 DUP4 ADD PUSH2 0x501B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x5BCE PUSH1 0x40 DUP4 ADD PUSH2 0x501B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x5BDF PUSH1 0x60 DUP4 ADD PUSH2 0x501B JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x5BF0 PUSH1 0x80 DUP4 ADD PUSH2 0x5B18 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x5C01 PUSH1 0xA0 DUP4 ADD PUSH2 0x5B23 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5C1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5C2B DUP10 DUP3 DUP6 ADD PUSH2 0x55B2 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP DUP3 MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5C4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5C59 DUP8 DUP3 DUP6 ADD PUSH2 0x55B2 JUMP JUMPDEST PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP8 SWAP6 SWAP1 SWAP2 ADD CALLDATALOAD SWAP6 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x5C7B DUP2 DUP6 PUSH2 0x58F1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x5C91 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x51BB JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x12B8 JUMPI PUSH2 0x12B8 PUSH2 0x582F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x5CCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x5CD8 DUP2 PUSH2 0x5006 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x5CFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5D06 DUP7 DUP3 DUP8 ADD PUSH2 0x55B2 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x80 DUP2 MSTORE PUSH1 0x0 PUSH2 0x5D23 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x51BB JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 SWAP1 SWAP6 MSTORE POP PUSH1 0x40 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5D52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x515C DUP2 PUSH2 0x5006 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x5D74 JUMPI PUSH2 0x5D74 PUSH2 0x582F JUMP JUMPDEST POP PUSH1 0x0 NOT ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x5D8E JUMPI PUSH2 0x5D8E PUSH2 0x582F JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP5 MLOAD PUSH1 0x40 DUP4 DUP4 ADD DUP2 SWAP1 MSTORE DUP2 MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0xC0 DUP7 ADD MSTORE SWAP1 DUP3 ADD MLOAD DUP2 AND PUSH1 0xE0 DUP6 ADD MSTORE SWAP2 DUP2 ADD MLOAD SWAP1 SWAP2 AND PUSH2 0x100 DUP4 ADD MSTORE PUSH1 0x80 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND PUSH2 0x120 DUP5 ADD MSTORE PUSH1 0x0 SWAP2 SWAP1 POP PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND PUSH2 0x140 DUP6 ADD MSTORE POP PUSH1 0xC0 ADD MLOAD PUSH1 0xE0 PUSH2 0x160 DUP5 ADD MSTORE PUSH2 0x5E4B PUSH2 0x180 DUP5 ADD DUP3 PUSH2 0x51BB JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x5F NOT DUP5 DUP4 SUB ADD PUSH1 0x80 DUP6 ADD MSTORE PUSH2 0x5E68 DUP3 DUP3 PUSH2 0x51BB JUMP JUMPDEST SWAP3 POP POP POP DUP4 PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x3335 PUSH1 0x40 DUP4 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD PUSH2 0x3335 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x58F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0x5EBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xA0 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5EE5 JUMPI PUSH2 0x5EE5 PUSH2 0x552F JUMP JUMPDEST PUSH1 0x40 SWAP1 DUP2 MSTORE DUP5 MLOAD DUP3 MSTORE PUSH1 0x20 DUP1 DUP7 ADD MLOAD SWAP1 DUP4 ADD MSTORE DUP5 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP6 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 SWAP4 DUP5 ADD MLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE DUP6 PUSH1 0x20 DUP3 ADD MSTORE DUP5 PUSH1 0x40 DUP3 ADD MSTORE DUP4 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0xC0 PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x5F6E PUSH1 0xC0 DUP4 ADD DUP6 PUSH2 0x51BB JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0xA0 DUP4 ADD MSTORE SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x5F9E JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP DIV SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB8 TSTORE 0xE9 SELFBALANCE LOG2 0xAD CALL MSTORE8 0xB4 0xD5 0xD6 PUSH4 0x60454C8D MOD 0x24 0xBC 0xA9 SWAP9 0xD3 0xFC DUP16 SLT 0xBD OR 0xE3 SAR PUSH21 0x127864736F6C634300081B00330000000000000000 ", + "sourceMap": "1972:23938:57:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;877:74:58;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;877:74:58;;;;;;;;;;:::i;:::-;;;;;;;;15734:152:57;;;;;;:::i;:::-;;:::i;:::-;;;;;;998:4:70;1040:3;1029:9;1025:19;1017:27;;1107:1;1103;1098:3;1094:11;1090:19;1081:6;1075:13;1071:39;1060:9;1053:58;1167:4;1159:6;1155:17;1149:24;1142:4;1131:9;1127:20;1120:54;1230:4;1222:6;1218:17;1212:24;1205:4;1194:9;1190:20;1183:54;1293:4;1285:6;1281:17;1275:24;1268:4;1257:9;1253:20;1246:54;1356:4;1348:6;1344:17;1338:24;1331:4;1320:9;1316:20;1309:54;1419:4;1411:6;1407:17;1401:24;1394:4;1383:9;1379:20;1372:54;1482:4;1474:6;1470:17;1464:24;1457:4;1446:9;1442:20;1435:54;1545:4;1537:6;1533:17;1527:24;1520:4;1509:9;1505:20;1498:54;1610:6;1602;1598:19;1592:26;1583:6;1572:9;1568:22;1561:58;858:767;;;;;792:30:58;;;;;;;;;1776:25:70;;;1764:2;1749:18;792:30:58;1630:177:70;874:75:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2043:25:70;;;2099:2;2084:18;;2077:34;;;;2127:18;;;2120:34;2185:2;2170:18;;2163:34;2030:3;2015:19;874:75:15;1812:391:70;14894:133:57;;;;;;:::i;:::-;;:::i;:::-;;2718:106:12;11107:16:21;;-1:-1:-1;;;11107:16:21;;;;2718:106:12;;2758:10:70;2746:23;;;2728:42;;2716:2;2701:18;2718:106:12;2584:192:70;4805:900:57;;;;;;:::i;:::-;;:::i;14272:149::-;;;;;;:::i;:::-;;:::i;1504:82:16:-;;;:::i;1176:138:14:-;;;;;;:::i;:::-;;:::i;2398:116:12:-;;;:::i;:::-;;;;;;;;:::i;528:76:58:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;15927:446:57:-;;;;;;:::i;:::-;;:::i;:::-;;;;6002:14:70;;5995:22;5977:41;;-1:-1:-1;;;;;6054:32:70;;;6049:2;6034:18;;6027:60;6103:18;;;6096:34;;;;6161:2;6146:18;;6139:34;6204:3;6189:19;;6182:35;6074:3;6233:19;;6226:35;5964:3;5949:19;15927:446:57;5696:571:70;2496:145:42;;;:::i;:::-;;;6437:14:70;;6430:22;6412:41;;6400:2;6385:18;2496:145:42;6272:187:70;846:76:66;;;;;;:::i;:::-;;;;;;;;;;;;;;14464:154:57;;;;;;:::i;:::-;;:::i;16634:170::-;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;16765:32:57;;;;;:18;:32;;;;;16758:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:170;;;;;6680:13:70;;-1:-1:-1;;;;;6676:39:70;6658:58;;6772:4;6760:17;;;6754:24;6732:20;;;6725:54;;;;6631:18;16634:170:57;6464:321:70;3155:101:38;;;:::i;2239:120:12:-;;;:::i;:::-;;;;;;;;:::i;15253:136:57:-;;;;;;:::i;:::-;;:::i;13983:246::-;;;;;;:::i;:::-;;:::i;15432:259::-;;;;;;:::i;:::-;;:::i;9484:503::-;;;;;;:::i;:::-;;:::i;2553:126:12:-;;;:::i;:::-;;;;;;;;:::i;13428:512:57:-;;;;;;:::i;:::-;;:::i;14661:190::-;;;;;;:::i;:::-;;:::i;1379:78:16:-;;;:::i;5172:903:43:-;;;:::i;:::-;;;;;;;;;;;;;:::i;1045:30:66:-;;;;;;2441:144:38;;;:::i;949:68:16:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1518:484:41;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11495:867:57:-;;;;;;:::i;:::-;;:::i;17557:147::-;;;;;;:::i;:::-;;:::i;17183:108::-;;;:::i;3503:558::-;;;;;;:::i;:::-;;:::i;12603:316::-;;;;;;:::i;:::-;;:::i;558:78:15:-;;;;;;:::i;:::-;;;;;;;;;;;;;;6325:275:57;;;;;;:::i;:::-;;:::i;17334:180::-;;;;;;:::i;:::-;;:::i;683:31:58:-;;;;;;16847:120:57;;;:::i;7797:616::-;;;;;;:::i;:::-;;:::i;16414:177::-;;;;;;:::i;:::-;16512:7;16538:46;;;:24;:46;;;;;;;16414:177;15070:140;;;;;;:::i;:::-;;:::i;17010:130::-;;;:::i;12962:423::-;;;;;;:::i;:::-;;:::i;727:75:15:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3405:215:38;;;;;;:::i;:::-;;:::i;15734:152:57:-;15811:23;;:::i;:::-;-1:-1:-1;;;;;;15853:26:57;;;;;;;:12;:26;;;;;;;;;15846:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15734:152::o;14894:133::-;2334:13:38;:11;:13::i;:::-;14984:36:57::1;15004:15;14984:19;:36::i;:::-;14894:133:::0;:::o;2796:21:12:-;2789:28;;2718:106;:::o;4805:900:57:-;4928:7;4707:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;4707:28:21;;4736:15;4761:4;4768:10;4707:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4823:15;4840:10;4686:175;;;;;;-1:-1:-1;;;4686:175:21;;;;;;;;;:::i;:::-;;;;;;;;;;;4956:7:57::1;5161:42:21;5206:30;5220:15;5206:13;:30::i;:::-;5161:75;;5246:32;5268:9;5246:21;:32::i;:::-;5288:43;5314:9;5325:5;5288:25;:43::i;:::-;1979:19:42::2;:17;:19::i;:::-;4990:17:57::3;::::0;;5064:77:::3;::::0;;::::3;5088:4:::0;5064:77:::3;:::i;:::-;4989:152;;;;;;5180:1;5166:3;5160:17;:21;5152:57;;;;-1:-1:-1::0;;;5152:57:57::3;;;;;;;;;;;;5251:1;5233:7;5227:21;:25;5219:65;;;;-1:-1:-1::0;;;5219:65:57::3;;;;;;;;;;;;-1:-1:-1::0;;;;;5302:17:57;::::3;;::::0;;;:8:::3;:17;::::0;;;;:30;:35;5294:87:::3;;;;-1:-1:-1::0;;;5294:87:57::3;;;;;;;;;;;;5444:70;::::0;;::::3;::::0;::::3;::::0;;5468:15:::3;5444:70:::0;;::::3;::::0;;::::3;::::0;;;;;;;;;-1:-1:-1;;;;;5424:17:57;::::3;-1:-1:-1::0;5424:17:57;;;:8:::3;:17:::0;;;;;;:90;;;;;;5444:70;;5424:17;:90:::3;::::0;::::3;::::0;::::3;::::0;;::::3;:::i;:::-;-1:-1:-1::0;5424:90:57::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;:::i;:::-;-1:-1:-1::0;;;;;;;;5528:34:57;::::3;::::0;5524:119:::3;;5578:54;5602:7;5611:20;5578:23;:54::i;:::-;5684:7;-1:-1:-1::0;;;;;5658:40:57::3;;5693:4;;5658:40;;;;;;;:::i;:::-;;;;;;;;4979:726;;;5151:198:21::1;4871:1;4805:900:57::0;;;;:::o;14272:149::-;2334:13:38;:11;:13::i;:::-;14373:41:57::1;14391:13;14406:7;14373:17;:41::i;:::-;14272:149:::0;;:::o;1504:82:16:-;1253:10;1238:26;;;;:14;:26;;;;;;;;1230:84;;;;-1:-1:-1;;;1230:84:16;;;;;;;;:::i;:::-;;1569:10:::1;:8;:10::i;:::-;1504:82::o:0;1176:138:14:-;1262:45;1276:10;1288:18;1262:13;:45::i;2398:116:12:-;2452:6;2460;2485:22;:20;:22::i;:::-;2478:29;;;;2398:116;;:::o;528:76:58:-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15927:446:57:-;-1:-1:-1;;;;;16114:26:57;;;16022:4;16114:26;;;:12;:26;;;;;;;;16083:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16022:4;;;;;;;;;;;16171:13;16083:57;16171:11;:13::i;:::-;16198:12;;16224:25;;;;16263:11;;;;16288:32;;;;16334:22;;;;;16150:216;;16198:12;;-1:-1:-1;16224:25:57;;-1:-1:-1;16263:11:57;-1:-1:-1;16288:32:57;;-1:-1:-1;16334:22:57;-1:-1:-1;15927:446:57;-1:-1:-1;;15927:446:57:o;2496:145:42:-;2543:4;2559:25;2587:21;:19;:21::i;:::-;2625:9;;;;2496:145;-1:-1:-1;;2496:145:42:o;14464:154:57:-;14554:57;14578:10;14590:20;14554:23;:57::i;3155:101:38:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;2239:120:12:-:0;2295:6;2303;2328:24;:22;:24::i;15253:136:57:-;2334:13:38;:11;:13::i;:::-;15345:37:57::1;15365:16;15345:19;:37::i;13983:246::-:0;2334:13:38;:11;:13::i;:::-;14153:69:57::1;14178:7;14187:12;14201:20;14153:24;:69::i;:::-;13983:246:::0;;;:::o;15432:259::-;2334:13:38;:11;:13::i;:::-;15523:31:57::1;15542:11;452:9:35::0;-1:-1:-1;2073:16:35;;1992:104;15523:31:57::1;15590:11;15515:88;;;;;-1:-1:-1::0;;;15515:88:57::1;;;;;;1776:25:70::0;;1764:2;1749:18;;1630:177;15515:88:57::1;-1:-1:-1::0;15613:15:57::1;:29:::0;;;15657:27:::1;::::0;1776:25:70;;;15657:27:57::1;::::0;1764:2:70;1749:18;15657:27:57::1;;;;;;;;15432:259:::0;:::o;9484:503::-;9610:7;4707:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;4707:28:21;;4736:15;4761:4;4768:10;4707:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4823:15;4840:10;4686:175;;;;;;-1:-1:-1;;;4686:175:21;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;2617:17:57;::::1;;::::0;;;:8:::1;:17;::::0;;;;:30;9641:7;;;;2609:90:::1;;;;-1:-1:-1::0;;;2609:90:57::1;;;;;;;;:::i;:::-;;1979:19:42::2;:17;:19::i;:::-;9674:20:57::3;9697:27;::::0;;::::3;9708:4:::0;9697:27:::3;:::i;:::-;9674:50:::0;-1:-1:-1;;;;;;9755:49:57;::::3;:30;:12;9674:50:::0;9755:16:::3;:30::i;:::-;:38:::0;9857:7;;9866:12;;-1:-1:-1;;;;;9755:49:57::3;;9734:155;;;;-1:-1:-1::0;;;9734:155:57::3;;;;;;;;;:::i;:::-;;;9899:37;9916:12;9930:5;9899:16;:37::i;:::-;9966:7;-1:-1:-1::0;;;;;9951:29:57::3;;9975:4;;9951:29;;;;;;;:::i;:::-;;;;;;;;9664:323;4871:1:21::1;9484:503:57::0;;;;:::o;2553:126:12:-;2611:7;2620;2646:26;11409:7:21;11445:23;11470;;11445;;11342:159;13428:512:57;13591:7;4707:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;4707:28:21;;4736:15;4761:4;4768:10;4707:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4823:15;4840:10;4686:175;;;;;;-1:-1:-1;;;4686:175:21;;;;;;;;;:::i;:::-;;;13627:7:57::1;5161:42:21;5206:30;5220:15;5206:13;:30::i;:::-;5161:75;;5246:32;5268:9;5246:21;:32::i;:::-;5288:43;5314:9;5325:5;5288:25;:43::i;:::-;-1:-1:-1::0;;;;;2617:17:57;::::2;;::::0;;;:8:::2;:17;::::0;;;;:30;13666:7;;;;2609:90:::2;;;;-1:-1:-1::0;;;2609:90:57::2;;;;;;;;:::i;:::-;;1979:19:42::3;:17;:19::i;:::-;-1:-1:-1::0;;;;;13732:49:57;::::4;:30;:12;13749::::0;13732:16:::4;:30::i;:::-;:38:::0;13834:7;;13843:12;;-1:-1:-1;;;;;13732:49:57::4;;13711:155;;;;-1:-1:-1::0;;;13711:155:57::4;;;;;;;;;:::i;:::-;;;13876:57;13894:12;13908:6;13916:16;;;;;;;;;;;13876:17;:57::i;:::-;5341:1:21::2;5151:198:::1;4871:1;13428:512:57::0;;;;:::o;14661:190::-;2334:13:38;:11;:13::i;:::-;14766:78:57::1;14791:22;-1:-1:-1::0;;14766:24:57::1;:78::i;1379::16:-:0;1253:10;1238:26;;;;:14;:26;;;;;;;;1230:84;;;;-1:-1:-1;;;1230:84:16;;;;;;;;:::i;:::-;;1442:8:::1;:6;:8::i;5172:903:43:-:0;5270:13;5297:18;5329:21;5364:15;5393:25;5432:12;5458:27;5510:23;5536:19;:17;:19::i;:::-;5776:13;;5510:45;;-1:-1:-1;5776:18:43;:43;;;;-1:-1:-1;5798:16:43;;;;:21;5776:43;5768:77;;;;-1:-1:-1;;;5768:77:43;;20478:2:70;5768:77:43;;;20460:21:70;20517:2;20497:18;;;20490:30;-1:-1:-1;;;20536:18:70;;;20529:51;20597:18;;5768:77:43;20276:345:70;5768:77:43;5907:13;:11;:13::i;:::-;5934:16;:14;:16::i;:::-;6042;;;6026:1;6042:16;;;;;;;;;-1:-1:-1;;;5856:212:43;;;-1:-1:-1;5856:212:43;;-1:-1:-1;5964:13:43;;-1:-1:-1;5999:4:43;;-1:-1:-1;6026:1:43;-1:-1:-1;6042:16:43;-1:-1:-1;5856:212:43;-1:-1:-1;;5172:903:43:o;2441:144:38:-;2487:7;2506:24;2533:20;:18;:20::i;:::-;2570:8;-1:-1:-1;;;;;2570:8:38;;2441:144;-1:-1:-1;;2441:144:38:o;1518:484:41:-;1684:12;;;1620:20;1684:12;;;;;;;;1586:22;;1795:4;-1:-1:-1;;;;;1783:24:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1773:34;;1822:9;1817:155;1837:15;;;1817:155;;;1886:75;1923:4;1943;;1948:1;1943:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1952;1930:30;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1886:28;:75::i;:::-;1873:7;1881:1;1873:10;;;;;;;;:::i;:::-;;;;;;;;;;:88;1854:3;;1817:155;;;;1981:14;1518:484;;;;;:::o;11495:867:57:-;11813:7;11690;4707:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;4707:28:21;;4736:15;4761:4;4768:10;4707:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4823:15;4840:10;4686:175;;;;;;-1:-1:-1;;;4686:175:21;;;;;;;;;:::i;:::-;;;11726:7:57::1;5161:42:21;5206:30;5220:15;5206:13;:30::i;:::-;5161:75;;5246:32;5268:9;5246:21;:32::i;:::-;5288:43;5314:9;5325:5;5288:25;:43::i;:::-;-1:-1:-1::0;;;;;2617:17:57;::::2;;::::0;;;:8:::2;:17;::::0;;;;:30;11765:7;;;;2609:90:::2;;;;-1:-1:-1::0;;;2609:90:57::2;;;;;;;;:::i;:::-;;1979:19:42::3;:17;:19::i;:::-;11836:24:57::4;::::0;11879:11:::4;:51;;;;;;;;:::i;:::-;::::0;11875:369:::4;;11965:32;11983:7;11992:4;;11965:17;:32::i;:::-;11946:51;;11875:369;;;12033:43;12018:11;:58;;;;;;;;:::i;:::-;::::0;12014:230:::4;;12111:38;12135:7;12144:4;;12111:23;:38::i;12014:230::-;12221:11;12187:46;;-1:-1:-1::0;;;12187:46:57::4;;;;;;;;:::i;12014:230::-;12292:11;12259:63;;;;;;;;:::i;:::-;12283:7;-1:-1:-1::0;;;;;12259:63:57::4;;12305:16;12259:63;;;;1776:25:70::0;;1764:2;1749:18;;1630:177;12259:63:57::4;;;;;;;;12339:16:::0;11495:867;-1:-1:-1;;;;;;;;;11495:867:57:o;17557:147::-;17631:4;17654:43;17671:7;17680:16;;;;;;;;;;;17654;:43::i;17183:108::-;17238:7;17272:11;:9;:11::i;3503:558::-;4158:30:39;4191:26;:24;:26::i;:::-;4302:15;;4158:59;;-1:-1:-1;4302:15:39;-1:-1:-1;;;4302:15:39;;;4301:16;;-1:-1:-1;;;;;4348:14:39;4279:19;4724:16;;:34;;;;;4744:14;4724:34;4704:54;;4768:17;4788:11;-1:-1:-1;;;;;4788:16:39;4803:1;4788:16;:50;;;;-1:-1:-1;4816:4:39;4808:25;:30;4788:50;4768:70;;4854:12;4853:13;:30;;;;;4871:12;4870:13;4853:30;4849:91;;;4906:23;;-1:-1:-1;;;4906:23:39;;;;;;;;;;;4849:91;4949:18;;-1:-1:-1;;;;;;4949:18:39;4966:1;4949:18;;;4977:67;;;;5011:22;;-1:-1:-1;;;;5011:22:39;-1:-1:-1;;;5011:22:39;;;4977:67;3697:21:57::1;3712:5;3697:14;:21::i;:::-;3728:18;:16;:18::i;:::-;3756:20;:18;:20::i;:::-;3786:28;:26;:28::i;:::-;3824:50;;;;;;;;;;;;;;-1:-1:-1::0;;;3824:50:57::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;3824:50:57::1;;::::0;:24:::1;:50::i;:::-;3885:67;3910:22;-1:-1:-1::0;;3885:24:57::1;:67::i;:::-;3962:43;3982:22;3962:19;:43::i;:::-;4015:39;4036:17;4015:20;:39::i;:::-;5068:14:39::0;5064:101;;;5098:23;;-1:-1:-1;;;;5098:23:39;;;5140:14;;-1:-1:-1;23079:50:70;;5140:14:39;;23067:2:70;23052:18;5140:14:39;;;;;;;5064:101;4092:1079;;;;;3503:558:57;;;;:::o;12603:316::-;2311:10:69;2333:15;-1:-1:-1;;;;;2311:38:69;;;;2290:147;;;;-1:-1:-1;;;2290:147:69;;;;;;;;;:::i;:::-;-1:-1:-1;12704:14:57::1;::::0;-1:-1:-1;12704:14:57;12738:36:::1;::::0;;::::1;12749:4:::0;12738:36:::1;:::i;:::-;12703:71;;;;12784:15;:13;:15::i;:::-;-1:-1:-1::0;;;;;12784:21:57::1;;12806:7;12815:6;12823;12839:17;:15;:17::i;:::-;12784:74;::::0;::::1;::::0;;;-1:-1:-1;;;;;;12784:74:57;;;-1:-1:-1;;;;;23740:32:70;;;12784:74:57::1;::::0;::::1;23722:51:70::0;23789:18;;;23782:34;;;;23832:18;;;23825:34;;;;23895:32;;;23875:18;;;23868:60;23694:19;;12784:74:57::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12896:7;-1:-1:-1::0;;;;;12873:39:57::1;;12905:6;12873:39;;;;1776:25:70::0;;1764:2;1749:18;;1630:177;12873:39:57::1;;;;;;;;12693:226;;12603:316:::0;;;:::o;6325:275::-;6467:7;4707:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;4707:28:21;;4736:15;4761:4;4768:10;4707:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4823:15;4840:10;4686:175;;;;;;-1:-1:-1;;;4686:175:21;;;;;;;;;:::i;:::-;;;1979:19:42::1;:17;:19::i;:::-;6500:35:57::2;6527:7;6500:26;:35::i;:::-;6550:43;::::0;-1:-1:-1;;;;;6550:43:57;::::2;::::0;::::2;::::0;;;::::2;6325:275:::0;;;;:::o;17334:180::-;17436:7;17462:45;17485:7;17494:12;17462:22;:45::i;:::-;17455:52;17334:180;-1:-1:-1;;;17334:180:57:o;16847:120::-;16908:7;16942:17;:15;:17::i;7797:616::-;7948:7;4707:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;4707:28:21;;4736:15;4761:4;4768:10;4707:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4823:15;4840:10;4686:175;;;;;;-1:-1:-1;;;4686:175:21;;;;;;;;;:::i;:::-;;;7984:7:57::1;5161:42:21;5206:30;5220:15;5206:13;:30::i;:::-;5161:75;;5246:32;5268:9;5246:21;:32::i;:::-;5288:43;5314:9;5325:5;5288:25;:43::i;:::-;-1:-1:-1::0;;;;;2617:17:57;::::2;;::::0;;;:8:::2;:17;::::0;;;;:30;8023:7;;;;2609:90:::2;;;;-1:-1:-1::0;;;2609:90:57::2;;;;;;;;:::i;:::-;;1979:19:42::3;:17;:19::i;:::-;8069:28:57::4;::::0;;;8169:86:::4;::::0;;::::4;8193:4:::0;8169:86:::4;:::i;:::-;8068:187;;;;;;;;8265:97;8275:7;8284:12;8298:20;8320:6;8328:15;8345:16;;;;;;;;;;;8265:9;:97::i;:::-;8392:7;-1:-1:-1::0;;;;;8377:29:57::4;;8401:4;;8377:29;;;;;;;:::i;:::-;;;;;;;;8058:355;;;;5341:1:21::2;5151:198:::1;4871:1;7797:616:57::0;;;;:::o;15070:140::-;2334:13:38;:11;:13::i;:::-;15164:39:57::1;15185:17;15164:20;:39::i;17010:130::-:0;17076:7;17110:22;:20;:22::i;12962:423::-;1979:19:42;:17;:19::i;:::-;13056:34:57::1;13093:30;:12;13110::::0;13093:16:::1;:30::i;:::-;13056:67;;13141:35;13160:15;;13141:10;:18;;:35;;;;:::i;:::-;13220:12;13133:101;;;;;-1:-1:-1::0;;;13133:101:57::1;;;;;;;;:::i;:::-;;13253:25;:10;:23;:25::i;:::-;13252:26;13318:12;13244:88;;;;;-1:-1:-1::0;;;13244:88:57::1;;;;;;;;:::i;:::-;;13342:36;13359:12;13373:4;13342:16;:36::i;3405:215:38:-:0;2334:13;:11;:13::i;:::-;-1:-1:-1;;;;;3489:22:38;::::1;3485:91;;3562:1;3534:31;;-1:-1:-1::0;;;3534:31:38::1;;;;;;;;:::i;3485:91::-;3585:28;3604:8;3585:18;:28::i;2658:162::-:0;966:10:40;2717:7:38;:5;:7::i;:::-;-1:-1:-1;;;;;2717:23:38;;2713:101;;966:10:40;2763:40:38;;-1:-1:-1;;;2763:40:38;;;;;;;;:::i;6712:136:21:-;6775:16;:25;;-1:-1:-1;;;;6775:25:21;-1:-1:-1;;;6775:25:21;;;;;;;;;;;;;6815:26;;2728:42:70;;;6815:26:21;;2716:2:70;2701:18;6815:26:21;2584:192:70;6033:102:37;6115:13;;6033:102::o;12461:351:21:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12622:15:21;:13;:15::i;:::-;-1:-1:-1;;;;;12622:28:21;;12651:16;12677:4;12622:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12577:106;;12701:9;:19;;;-1:-1:-1;;;;;12701:24:21;12724:1;12701:24;;12761:16;12693:86;;;;;-1:-1:-1;;;12693:86:21;;;;;;;;:::i;:::-;-1:-1:-1;12796:9:21;12461:351;-1:-1:-1;;12461:351:21:o;9052:297::-;9212:24;;;;9192:17;;9160:182;;9192:44;;;:::i;:::-;9250:23;;9287;;9160:182;;;;;;;;;;;;;-1:-1:-1;;;9160:182:21;;;:18;:182::i;10151:755::-;10306:23;10331;10358:24;:22;:24::i;:::-;10305:77;;;;10392:27;10422:13;:74;;10472:10;:24;;;10422:74;;;10438:10;:31;;;10422:74;10392:104;;10506:93;10525:20;-1:-1:-1;;;;;10506:93:21;10547:16;-1:-1:-1;;;;;10506:93:21;10565:16;-1:-1:-1;;;;;10506:93:21;;;;;;;;;;;;;;-1:-1:-1;;;10506:93:21;;;:18;:93::i;:::-;10611:21;10634;10659:22;:20;:22::i;:::-;10610:71;;;;10691:28;10722:13;:76;;10773:10;:25;;;10722:76;;;10738:10;:32;;;10722:76;10691:107;;10808:91;10827:21;10808:91;;10850:14;10808:91;;10866:14;10808:91;;;;;;;;;;;;;;;-1:-1:-1;;;10808:91:21;;;:18;:91::i;:::-;10295:611;;;;;;10151:755;;:::o;2709:128:42:-;2774:8;:6;:8::i;:::-;2770:61;;;2805:15;;-1:-1:-1;;;2805:15:42;;;;;;;;;;;24755:228:57;-1:-1:-1;;;;;24855:29:57;;;;;;;:19;:29;;;;;;:52;;-1:-1:-1;;;;;;24855:52:57;;;;;;;;;24922:54;;;24855:29;24922:54;24755:228;;:::o;2294:354:16:-;-1:-1:-1;;;;;2400:30:16;;;;;;:14;:30;;;;;;2415:14;;2435:8;;2400:30;;:43;;2434:9;;2400:43;2379:154;;;;-1:-1:-1;;;2379:154:16;;-1:-1:-1;;;;;26492:32:70;;;2379:154:16;;;26474:51:70;26568:14;26561:22;26541:18;;;26534:50;26447:18;;2379:154:16;26306:284:70;2379:154:16;-1:-1:-1;;;;;;;2543:30:16;;;;;;:14;:30;;;;;;;;;:41;;-1:-1:-1;;2543:41:16;;;;;;;;;;2599:42;;6412:41:70;;;2599:42:16;;6385:18:70;2599:42:16;;;;;;;2294:354;;:::o;3478:178:42:-;2226:16;:14;:16::i;:::-;3536:25:::1;3564:21;:19;:21::i;:::-;3595:17:::0;;-1:-1:-1;;3595:17:42::1;::::0;;;-1:-1:-1;3627:22:42::1;966:10:40::0;3636:12:42::1;3627:22;;;;;;:::i;3459:526:14:-:0;-1:-1:-1;;;;;3593:29:14;;3556:34;3593:29;;;:11;:29;;;;;;;;3806:31;;;;;26775:36:70;;;26827:18;;;26820:60;;;;3806:31:14;;;;;;;;;26748:18:70;;;;3806:31:14;;3556:34;;3678:202;;3593:29;;3711:18;;3743;;3775:17;;3851:19;3678;:202::i;:::-;3632:248;;;;3916:16;-1:-1:-1;;;;;3896:82:14;;3934:14;3961:4;3950:27;;;;;;;;;;;;:::i;:::-;3896:82;;;;;;;:::i;18638:173:57:-;18702:6;18710;18736:17;:15;:17::i;:::-;-1:-1:-1;;;;;18736:39:57;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18728:76;452:9:35;;-1:-1:-1;18638:173:57;-1:-1:-1;18638:173:57:o;7267:123:61:-;7325:4;7348:13;:4;7092:14;;;:19;;;7011:107;7348:13;:35;;;;-1:-1:-1;;7365:13:61;;;:18;;7267:123::o;1147:162:42:-;1270:23;;1147:162::o;3774:248:38:-;3847:24;3874:20;:18;:20::i;:::-;3923:8;;-1:-1:-1;;;;;3941:19:38;;;-1:-1:-1;;;;;;3941:19:38;;;;;;3975:40;;3847:47;;-1:-1:-1;3923:8:38;;;;;3975:40;;3904:16;;3975:40;3837:185;;3774:248;:::o;18172:205:57:-;18238:6;18246;18264:20;18287:17;:15;:17::i;:::-;-1:-1:-1;;;;;18287:34:57;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18264:59;;;-1:-1:-1;18172:205:57;-1:-1:-1;;18172:205:57:o;19915:166:65:-;19989:15;:34;;;20038:36;;1776:25:70;;;20038:36:65;;1764:2:70;1749:18;20038:36:65;1630:177:70;7528:293:65;7653:74;:18;7680:8;7690:13;7705:21;7653:26;:74::i;:::-;7792:21;7777:13;-1:-1:-1;;;;;7742:72:65;7767:8;-1:-1:-1;;;;;7742:72:65;;;;;;;;;;;7528:293;;;:::o;6206:160:61:-;6304:12;;:::i;:::-;6335:24;6340:4;6346:12;6335:4;:24::i;:::-;6328:31;;;;;;;;;;-1:-1:-1;;;;;6328:31:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6206:160;-1:-1:-1;;;6206:160:61:o;18661:997:65:-;18748:34;18785:31;:12;18802:13;18785:16;:31::i;:::-;18748:68;;18919:161;18961:13;18988:22;:20;:22::i;:::-;-1:-1:-1;;;;;18988:49:65;;19038:10;:31;;;18988:82;;;;;;;;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;18988:82:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18919:12;;:161;:28;:161::i;:::-;19091:33;:12;19110:13;19091:18;:33::i;:::-;19169:18;;19189:17;;;;19134:73;;:26;;:34;:73::i;:::-;19431:10;:17;;;19359:24;:57;19384:10;:31;;;19359:57;;;;;;;;;;;;:89;;;;:::i;:::-;19287:24;:57;19312:10;:31;;;19287:57;;;;;;;;;;;:161;;;;19553:10;:31;;;19526:13;-1:-1:-1;;;;;19464:187:65;19494:10;:18;;;-1:-1:-1;;;;;19464:187:65;;19598:10;:17;;;19629:12;19464:187;;;;;;27802:25:70;;;27870:14;27863:22;27858:2;27843:18;;27836:50;27790:2;27775:18;;27634:258;19464:187:65;;;;;;;;18738:920;18661:997;;:::o;16041:1968::-;16152:34;16189:31;:12;16206:13;16189:16;:31::i;:::-;16152:68;;16238:19;:10;:17;:19::i;:::-;16293:13;16230:78;;;;;-1:-1:-1;;;16230:78:65;;;;;;;;:::i;:::-;;16337:10;:17;;;16326:7;:28;;16392:13;16407:7;16318:98;;;;;;-1:-1:-1;;;16318:98:65;;;;;;;;;:::i;:::-;-1:-1:-1;;16483:17:65;;;;16514:19;;;16510:263;;;16549:107;16581:15;:13;:15::i;:::-;16598:18;;16618:19;16628:9;16618:7;:19;:::i;:::-;16549:26;;:107;;16639:16;16549:31;:107::i;:::-;16510:263;;;16722:18;;16687:75;;16742:19;16754:7;16742:9;:19;:::i;:::-;16687:26;;:75;:34;:75::i;:::-;16878:35;16916:22;:20;:22::i;:::-;-1:-1:-1;;;;;16916:49:65;;16979:10;:31;;;16916:104;;;;;;;;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;16916:104:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16878:142;;17030:42;17076:25;:10;:23;:25::i;:::-;17075:26;:125;;17199:1;17075:125;;;17146:38;;;;17116:68;;:27;:68;:::i;:::-;-1:-1:-1;;;;;17244:27:65;;;;;;:12;:27;;;;;:34;;;:44;;;17298:55;;:85;;;17030:170;-1:-1:-1;17442:22:65;:20;:22::i;:::-;-1:-1:-1;;;;;17442:34:65;;17490:9;17513:34;17442:115;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17393:27:65;;;;;;:12;:27;;;;;:45;;:164;;:45;;:27;:164;;;;;:::i;:::-;;;;-1:-1:-1;;17641:19:65;;;17637:245;;;17738:19;17748:9;17738:7;:19;:::i;:::-;17676:24;:57;17701:10;:31;;;17676:57;;;;;;;;;;;;:82;;;;;;;:::i;:::-;;;;-1:-1:-1;17637:245:65;;-1:-1:-1;17637:245:65;;17851:19;17863:7;17851:9;:19;:::i;:::-;17789:24;:57;17814:10;:31;;;17789:57;;;;;;;;;;;;:82;;;;;;;:::i;:::-;;;;-1:-1:-1;;17637:245:65;17950:10;:31;;;17935:13;-1:-1:-1;;;;;17897:105:65;17915:10;:18;;;-1:-1:-1;;;;;17897:105:65;;17983:7;17992:9;17897:105;;;;;;;:::i;:::-;;;;;;;;16142:1867;;;;16041:1968;;;:::o;7068:281:21:-;7157:4;7165;7157:12;;;;7149:63;;;;-1:-1:-1;;;7149:63:21;;;;;;;;;:::i;:::-;-1:-1:-1;;7222:23:21;:30;;;7262:23;:30;;;7307:35;;;;;;7248:4;;7288;;7307:35;:::i;:::-;;;;;;;;7068:281;;:::o;3170:176:42:-;1979:19;:17;:19::i;:::-;3229:25:::1;3257:21;:19;:21::i;:::-;3288:16:::0;;-1:-1:-1;;3288:16:42::1;3300:4;3288:16;::::0;;3229:49;-1:-1:-1;3319:20:42::1;3326:12;966:10:40::0;;887:96;2720:156:43;2839:21;;2720:156::o;6299:155::-;6353:13;6378:23;6404:19;:17;:19::i;:::-;6378:45;;6440:1;:7;;6433:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6299:155;:::o;6681:161::-;6738:13;6763:23;6789:19;:17;:19::i;:::-;6763:45;;6825:1;:10;;6818:17;;;;;:::i;1192:159:38:-;1313:22;;1192:159::o;3916:253:46:-;3999:12;4024;4038:23;4065:6;-1:-1:-1;;;;;4065:19:46;4085:4;4065:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4023:67;;;;4107:55;4134:6;4142:7;4151:10;4107:26;:55::i;:::-;4100:62;3916:253;-1:-1:-1;;;;;3916:253:46:o;20474:3066:57:-;20556:7;;;20652:93;;;;20676:4;20652:93;:::i;:::-;20776:13;;:29;;;20575:170;;-1:-1:-1;20575:170:57;-1:-1:-1;20809:7:57;-1:-1:-1;;;;;20776:40:57;;;;;;;20755:155;;;;-1:-1:-1;;;20755:155:57;;;;;;;;;:::i;:::-;-1:-1:-1;;21122:13:57;;:26;-1:-1:-1;;;;;21114:56:57;;;21093:163;;;;-1:-1:-1;;;21093:163:57;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;21093:163:57;-1:-1:-1;21313:13:57;;:26;21266:20;21389:30;:12;21313:26;21389:16;:30::i;:::-;21523:18;;21352:67;;-1:-1:-1;21545:7:57;;-1:-1:-1;;;;;21523:29:57;;;;;;;21515:94;;;;-1:-1:-1;;;21515:94:57;;;;;;;;;:::i;:::-;-1:-1:-1;;21650:31:57;;;;21732:25;21746:7;21619:28;21732:13;:25::i;:::-;21863:23;21896:22;21942:21;21966:13;:11;:13::i;:::-;-1:-1:-1;;;;;21966:23:57;;21998:4;21966:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21942:62;;22037:22;:20;:22::i;:::-;-1:-1:-1;;;;;22037:30:57;;22085:36;22139:99;22161:9;22172:11;:9;:11::i;:::-;-1:-1:-1;;;;;22172:21:57;;22194:20;22172:43;;;;;;;;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;22172:43:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;22236:1;22139:21;:99::i;22172:65::-;22218:15;;22139:21;:99::i;:::-;22256:15;22037:248;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22019:266;;22300:20;22323:13;:11;:13::i;:::-;-1:-1:-1;;;;;22323:23:57;;22355:4;22323:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22300:61;-1:-1:-1;22399:13:57;22300:61;22383:29;;;;22375:106;;;;-1:-1:-1;;;22375:106:57;;;;;;;;;:::i;:::-;-1:-1:-1;22512:28:57;;-1:-1:-1;22527:13:57;22512:12;:28;:::i;:::-;22495:45;-1:-1:-1;;22565:19:57;;;-1:-1:-1;22561:726:57;;22656:173;22684:7;22727:16;;22709:15;:34;;;;:::i;:::-;22779:17;:15;:17::i;:::-;-1:-1:-1;;;;;22779:34:57;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22761:54;;-1:-1:-1;;;;;22761:54:57;:15;:54;:::i;:::-;22656:10;:173::i;:::-;22848:18;;22844:433;;22977:22;:20;:22::i;:::-;-1:-1:-1;;;;;22977:45:57;;23023:20;22977:67;;;;;;;;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;22977:67:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23125:62;23158:11;:9;:11::i;:::-;23172:14;23125:13;:11;:13::i;:::-;-1:-1:-1;;;;;23125:24:57;;:62;:24;:62::i;:::-;23205:11;:9;:11::i;:::-;-1:-1:-1;;;;;23205:19:57;;23225:20;23247:14;23205:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22844:433;23355:13;;:19;;;;;23302:199;;;31576:25:70;;;31617:18;;;31610:34;;;31660:18;;31653:34;;;-1:-1:-1;;;;;23302:199:57;;;;;;;;;;;;;;31564:2:70;31549:18;23302:199:57;;;;;;;-1:-1:-1;23518:15:57;20474:3066;-1:-1:-1;;;;;;;;;20474:3066:57:o;23977:498::-;24065:7;;;;24150:43;;;;24161:4;24150:43;:::i;:::-;24084:109;;-1:-1:-1;24084:109:57;-1:-1:-1;24084:109:57;-1:-1:-1;;;;;;24224:49:57;;:30;:12;24084:109;24224:16;:30::i;:::-;:38;24326:7;;24335:12;;-1:-1:-1;;;;;24224:49:57;;24203:155;;;;-1:-1:-1;;;24203:155:57;;;;;;;;;:::i;:::-;-1:-1:-1;;24421:16:57;;-1:-1:-1;;;;;24439:28:57;;;;;;;:19;:28;;;;;;24375:93;;24387:12;;24401:4;;24407:12;;-1:-1:-1;;;24421:16:57;;;;;24439:28;24375:11;:93::i;:::-;24368:100;23977:498;-1:-1:-1;;;;;;;23977:498:57:o;20829:200:65:-;20921:4;20945:77;20978:15;:13;:15::i;:::-;20945:26;;20995:8;21005:16;20945:32;:77::i;:::-;20944:78;;20829:200;-1:-1:-1;;;20829:200:65:o;4102:87:69:-;4174:8;;4102:87::o;9071:205:39:-;9129:30;;3147:66;9186:27;8819:122;1847:127:38;6929:20:39;:18;:20::i;:::-;1929:38:38::1;1954:12;1929:24;:38::i;1218:61:41:-:0;6929:20:39;:18;:20::i;2912:148:12:-;6929:20:39;:18;:20::i;:::-;2978:35:12::1;:33;:35::i;:::-;3023:30;:28;:30::i;1669:156:16:-:0;6929:20:39;:18;:20::i;:::-;1743:27:16::1;:25;:27::i;6685:198:65:-:0;6929:20:39;:18;:20::i;:::-;6800:30:65::1;6814:5;6821:8;6800:13;:30::i;:::-;6840:36;:34;:36::i;25105:258:57:-:0;25188:17;25209:1;25188:22;25180:77;;;;-1:-1:-1;;;25180:77:57;;;;;;;;;;;;25267:16;:36;;;25318:38;;1776:25:70;;;25318:38:57;;1764:2:70;1749:18;25318:38:57;1630:177:70;3624:106:69;3708:15;;3624:106::o;6369:206:21:-;6450:49;6476:16;6494:4;6450:25;:49::i;:::-;6509:15;:13;:15::i;:::-;-1:-1:-1;;;;;6509:41:21;;6551:16;6509:59;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6369:206;:::o;20313:230:65:-;20409:7;20435:101;2088:68;20510:8;20520:13;20462:72;;;;;;;;;32489:25:70;;;-1:-1:-1;;;;;32550:32:70;;;32545:2;32530:18;;32523:60;32619:32;32614:2;32599:18;;32592:60;32477:2;32462:18;;32287:371;20462:72:65;;;;;;;;;;;;;20452:83;;;;;;20435:16;:101::i;8531:1573::-;-1:-1:-1;;;;;8776:27:65;;8768:80;;;;-1:-1:-1;;;8768:80:65;;;;;;;;;;;;8859:65;8882:8;8892:13;8907:16;8859:22;:65::i;:::-;9077;9111:15;:13;:15::i;:::-;9077:18;;9128:13;9077:33;:65::i;:::-;9153:20;9176;:18;:20::i;:::-;-1:-1:-1;;;;;9176:33:65;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9153:58;;9221:34;9258:246;9291:8;9313:13;9340:21;9375:7;9396:22;:20;:22::i;:::-;-1:-1:-1;;;;;9396:49:65;;9446:21;9396:72;;;;;;;;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;9396:72:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9258:12;;:246;;;;9482:12;9258:19;:246::i;:::-;9221:283;;9657:85;9689:15;:13;:15::i;:::-;9657:26;;9706:8;9716:7;9725:16;9657:31;:85::i;:::-;9966:10;:17;;;9894:24;:57;9919:10;:31;;;9894:57;;;;;;;;;;;;:89;;;;:::i;:::-;9822:24;:57;9847:10;:31;;;9822:57;;;;;;;;;;;:161;;;;10042:21;10027:13;-1:-1:-1;;;;;9999:98:65;10017:8;-1:-1:-1;;;;;9999:98:65;;10065:10;:17;;;10084:12;9999:98;;;;;;;:::i;:::-;;;;;;;;8758:1346;;8531:1573;;;;;;:::o;3868:122:69:-;3962:21;;3868:122::o;6597:267:61:-;6680:4;6696:24;6741:49;6750:4;:14;;;6766:4;:23;;;6741:8;:49::i;:::-;6723:67;;:15;:67;:::i;:::-;6696:94;;6807:13;:4;:11;:13::i;:::-;:50;;;;;6843:14;6824:16;:33;6807:50;6800:57;6597:267;-1:-1:-1;;;;6597:267:61:o;7551:127::-;7615:4;7638:13;:4;7092:14;;;:19;;;7011:107;7638:13;:33;;;;-1:-1:-1;;7655:11:61;;;:16;;7551:127::o;13114:234:21:-;13246:28;:6;13263:4;13269;13246:16;:28::i;:::-;13305:14;13321:6;13329:4;13335;13238:103;;;;;;;;-1:-1:-1;;;13238:103:21;;;;;;;;;;;:::i;2909:126:42:-;2972:8;:6;:8::i;:::-;2967:62;;3003:15;;-1:-1:-1;;;3003:15:42;;;;;;;;;;;6153:127:14;6221:7;6247:16;;;:6;:16;;;;;:26;;;;6153:127::o;4461:726::-;4543:4;4549:12;4573:23;4599:24;4614:8;4599:14;:24::i;:::-;4573:50;;4681:15;4660:5;:18;;;:36;4656:103;;;-1:-1:-1;;1301:9:33;;;;;;;;;-1:-1:-1;1301:9:33;;4720:4:14;;-1:-1:-1;4712:36:14;;4656:103;4788:21;4811:23;4849:4;4838:36;;;;;;;;;;;;:::i;:::-;4950:12;;4787:87;;-1:-1:-1;4787:87:14;-1:-1:-1;4904:59:14;;:20;;4787:87;;4904:28;:59::i;:::-;5014:8;4997:15;-1:-1:-1;;;;;4978:79:14;;5024:5;:12;;;5038:5;:18;;;4978:79;;;;;;;:::i;:::-;;;;;;;;5120:12;;5104:28;;:13;:28;:::i;:::-;5093:57;;;;;;33652:25:70;;;;-1:-1:-1;;;;;33713:32:70;;33693:18;;;33686:60;33625:18;;5093:57:14;;;;;;;;;;;;5086:64;;5168:5;5175:4;5160:20;;;;;;;4461:726;;;;;;:::o;5397:93::-;5467:16;;;;:6;:16;;;;;5460:23;;;;;;;;;;;;;;;;;;5397:93::o;4803:945:33:-;5119:7;5128:12;5174:4;:10;;;5160;:24;;5152:64;;;;-1:-1:-1;;;5152:64:33;;;;;;;;;;;;5227:17;5272:15;;5271:43;;5304:10;5271:43;;;5291:4;:10;;;5271:43;5342:9;;5258:56;;-1:-1:-1;5362:335:33;5369:20;;;;;:38;;;5406:1;5393:10;:14;5369:38;5362:335;;;5424:16;5442:17;5463:35;5475:6;5483:14;5463:11;:35;;:::i;:::-;5423:75;;;;5517:11;5513:22;;;5530:5;;;;5513:22;5567:4;-1:-1:-1;5567:4:33;5594:40;:4;5610:11;5623:10;5594:15;:40::i;:::-;5585:49;-1:-1:-1;5649:12:33;;;;:::i;:::-;;;;5675:11;;;;;:::i;:::-;;;;5409:288;;5362:335;;;-1:-1:-1;5715:9:33;5726:14;;-1:-1:-1;4803:945:33;;-1:-1:-1;;;;;;4803:945:33:o;1904:375:63:-;-1:-1:-1;;;;;2096:18:63;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;:25;:27::i;:::-;2095:28;2155:12;2087:82;;;;;-1:-1:-1;;;2087:82:63;;;;;;;;:::i;:::-;-1:-1:-1;2201:71:63;;;;;;;;-1:-1:-1;;;;;2201:71:63;;;;;;;;;;;;2180:18;;;-1:-1:-1;2180:18:63;;;;;;;;;;:92;;;;-1:-1:-1;;;;;;2180:92:63;;;;;;;;;;;-1:-1:-1;2180:92:63;;;;1904:375::o;7930:278:61:-;-1:-1:-1;;;;;8080:18:61;;;8028:13;8080:18;;;;;;;;;;;8116:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8028:13;;8116:19;;7092:14;;;:19;;;7011:107;8116:19;8160:12;8108:66;;;;;-1:-1:-1;;;8108:66:61;;;;;;;;:::i;:::-;-1:-1:-1;8191:10:61;7930:278;-1:-1:-1;;;7930:278:61:o;7144:117:37:-;7233:21;;7144:117::o;4561:400:61:-;4734:24;4761;4766:4;4772:12;4761:4;:24::i;:::-;4803:17;;;;;;;;;;-1:-1:-1;;;;;4803:17:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4734:51;;-1:-1:-1;4803:19:61;;:17;:19::i;:::-;4855;;;;4841:12;;4795:81;;;;-1:-1:-1;;;4795:81:61;;;;;;;;;:::i;:::-;-1:-1:-1;;4886:38:61;;:68;-1:-1:-1;;4561:400:61:o;5737:292::-;5833:24;5860;5865:4;5871:12;5860:4;:24::i;:::-;5902:17;;;;;;;;;;-1:-1:-1;;;;;5902:17:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5833:51;;-1:-1:-1;5902:19:61;;:17;:19::i;:::-;5954;;;;5940:12;;5894:81;;;;-1:-1:-1;;;5894:81:61;;;;;;;;;:::i;:::-;-1:-1:-1;;6007:15:61;5985:19;;;;:37;-1:-1:-1;;5737:292:61:o;2591:307:20:-;2714:6;2724:1;2714:11;2710:24;;2591:307;;;:::o;2710:24::-;-1:-1:-1;;;;;2751:21:20;;;;;;;;;;;;;;2776:6;2751:31;;;;2743:107;;;;-1:-1:-1;;;2743:107:20;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;2860:21:20;;;;;;;;;;;;;:31;;2885:6;;2860:21;:31;;2885:6;;2860:31;:::i;:::-;;;;-1:-1:-1;;;;;2591:307:20:o;1637:590::-;1853:24;;1870:7;1853:24;-1:-1:-1;;;;;1912:21:20;;1887:22;1912:21;;;;;;;;;;;:30;;1936:6;;1912:30;:::i;:::-;1887:55;;1952:23;1978:12;-1:-1:-1;;;;;1978:31:20;;2010:15;2035:4;2042:15;1978:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1952:106;-1:-1:-1;1952:106:20;2076:14;:33;;;;2068:111;;;;-1:-1:-1;;;2068:111:20;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;2189:21:20;;;;;;;;;;;;;:31;;2214:6;;2189:21;:31;;2214:6;;2189:31;:::i;:::-;;;;-1:-1:-1;;;;1637:590:20;;;;;:::o;4437:582:46:-;4581:12;4610:7;4605:408;;4633:19;4641:10;4633:7;:19::i;:::-;4605:408;;;4857:17;;:22;:49;;;;-1:-1:-1;;;;;;4883:18:46;;;:23;4857:49;4853:119;;;4950:6;4933:24;;-1:-1:-1;;;4933:24:46;;;;;;;;:::i;4853:119::-;-1:-1:-1;4992:10:46;4985:17;;5825:94:37;5901:11;;5825:94::o;25639:269:57:-;25870:13;;:29;;;;;-1:-1:-1;;;;;25850:50:57;;;;;;;:19;:50;;;;;;;;;25815:86;;25784:12;;25815:86;;25826:9;;25837:11;;25850:50;;;;;25815:86;;:::i;:::-;;;;;;;;;;;;;25808:93;;25639:269;;;;:::o;1865:860:14:-;1981:7;1992:1;1981:12;1973:50;;;;-1:-1:-1;;;1973:50:14;;;;;;;;;;;;2033:87;2059:15;:13;:15::i;:::-;2103:16;;2033:20;;:87;2076:16;;2094:7;;2103:16;-1:-1:-1;;;2103:16:14;;;;;;2033:25;:87;:::i;:::-;-1:-1:-1;;;;;2168:29:14;;2131:34;2168:29;;;:11;:29;;;;;;;;2300:16;;;;;6618:57;;-1:-1:-1;;;;;;6643:4:14;38869:2:70;38840:15;;;38836:45;;6618:57:14;;;38824:58:70;38916:15;;;38912:45;38898:12;;;38891:67;38974:12;;;;38967:28;;;;6618:57:14;;;;;;;;;;39011:12:70;;;6618:57:14;;;6608:68;;;;;;;;;2345:170;;;;;;;;2410:15;2345:170;;;;;;;;;;;;;;;;;;;2327:15;;;:6;:15;;;;;;;:188;;;;;;;;;;;;;;;;;;;;;;;2529:16;;;2168:29;;6608:68;2529:21;2525:70;;2559:15;;;;2552:23;;;;:6;:23;;;;;:33;;:43;;;2525:70;2605:27;:10;2624:7;2605:18;:27::i;:::-;2683:7;2665:16;-1:-1:-1;;;;;2648:70:14;;2692:7;2701:16;2648:70;;;;;;;:::i;:::-;;;;;;;;1963:762;;1865:860;;;:::o;1050:198:11:-;1148:11;;1144:98;;1183:34;;-1:-1:-1;;;1183:34:11;;-1:-1:-1;;;;;1183:20:11;;;;;:34;;1204:3;;1209:7;;1183:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1175:56;;;;-1:-1:-1;;;1175:56:11;;36122:2:70;1175:56:11;;;36104:21:70;36161:1;36141:18;;;36134:29;-1:-1:-1;;;36179:18:70;;;36172:39;36228:18;;1175:56:11;35920:332:70;11846:3420:65;12050:7;;12106:31;:12;12123:13;12106:16;:31::i;:::-;12069:68;;12155:19;:10;:17;:19::i;:::-;12210:13;12147:78;;;;;-1:-1:-1;;;12147:78:65;;;;;;;;:::i;:::-;;12295:21;12321:35;12340:15;;12321:10;:18;;:35;;;;:::i;:::-;12320:36;:78;;;;;12373:25;:10;:23;:25::i;:::-;12372:26;12320:78;:112;;;;-1:-1:-1;12414:18:65;;;12320:112;12319:181;;;;;12475:10;:25;;;12437:20;:18;:20::i;:::-;-1:-1:-1;;;;;12437:33:65;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;12319:181;:261;;12579:1;12319:261;;;12515:22;:20;:22::i;:::-;-1:-1:-1;;;;;12515:34:65;;12550:13;12515:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12295:285;;12700:161;12742:13;12769:22;:20;:22::i;:::-;-1:-1:-1;;;;;12769:49:65;;12819:10;:31;;;12769:82;;;;;;;;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;12700:161:65;12871:38;:12;12895:13;12871:23;:38::i;:::-;12982:47;:12;13015:13;12982:32;:47::i;:::-;13040:28;;13131:18;;13127:1531;;13213:20;13236:15;:13;:15::i;:::-;13289:18;;13236:177;;-1:-1:-1;;;13236:177:65;;-1:-1:-1;;;;;13236:35:65;;;;;;;:177;;13333:4;;13356:43;;13236:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13213:200;;13427:57;13487:15;:13;:15::i;:::-;13538:18;;13487:114;;-1:-1:-1;;;13487:114:65;;-1:-1:-1;;;;;13487:33:65;;;;;;;:114;;13582:4;;13487:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13427:174;;13768:1;13744:14;:21;;;:25;:66;;13809:1;13744:66;;;13772:34;:13;13793:12;13772:20;:34::i;:::-;13718:92;-1:-1:-1;13828:27:65;;13824:251;;13875:13;:11;:13::i;:::-;-1:-1:-1;;;;;13875:21:65;;13905:15;:13;:15::i;:::-;13923:23;13875:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13965:15;:13;:15::i;:::-;14001:18;;13965:95;;-1:-1:-1;;;13965:95:65;;-1:-1:-1;;;;;13965:35:65;;;;;;;:95;;14029:4;;14036:23;;13965:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13824:251;14157:39;14173:23;14157:13;:39;:::i;:::-;14134:62;-1:-1:-1;14214:24:65;;14210:438;;-1:-1:-1;;;;;14262:34:65;;14258:376;;14320:13;:11;:13::i;:::-;-1:-1:-1;;;;;14320:21:65;;14350:15;:13;:15::i;:::-;14368:20;14320:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14411:15;:13;:15::i;:::-;14444:18;;14411:89;;-1:-1:-1;;;14411:89:65;;-1:-1:-1;;;;;14411:32:65;;;;;;;:89;;14472:4;;14479:20;;14411:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14258:376;;;14547:68;14572:20;14594;14547:13;:11;:13::i;:68::-;13151:1507;;13127:1531;14770:31;;;;14711:18;;-1:-1:-1;;;;;14673:329:65;;;;;;14815:13;14842:20;14876:23;14913:4;14931:12;14957:20;:18;:20::i;:::-;-1:-1:-1;;;;;14957:33:65;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14673:329;;;;;;;;;;;:::i;:::-;;;;;;;;15128:18;;15111:54;;15148:16;15111;:54::i;:::-;15107:122;;;15181:37;15198:13;15213:4;15181:16;:37::i;:::-;-1:-1:-1;15246:13:65;;11846:3420;-1:-1:-1;;;;;;;;11846:3420:65:o;3357:383:20:-;3554:4;3570:23;3596:12;-1:-1:-1;;;;;3596:31:20;;3628:15;3653:4;3660:15;3596:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3693:21:20;;;;;;;;;;;;;;:40;;;-1:-1:-1;;3357:383:20;;;;;;:::o;7082:141:39:-;7149:17;:15;:17::i;:::-;7144:73;;7189:17;;-1:-1:-1;;;7189:17:39;;;;;;;;;;;1980:235:38;6929:20:39;:18;:20::i;5676:397:21:-;6929:20:39;:18;:20::i;:::-;5757:84:21::1;2047:17;-1:-1:-1::0;;5757:24:21::1;:84::i;:::-;5851:72;1523:16;452:9:35;5851:20:21;:72::i;:::-;5933:78;1784:16;-1:-1:-1::0;;;;;5933:22:21::1;:78::i;:::-;6021:45;2304:16;6021:19;:45::i;3446:147:43:-:0;6929:20:39;:18;:20::i;:::-;3548:38:43::1;3572:4;3578:7;3548:23;:38::i;9617:257:21:-:0;9730:42;9775:31;9789:16;9775:13;:31::i;:::-;9730:76;;9816:51;9842:9;9853:13;9816:25;:51::i;4946:176:43:-;5023:7;5049:66;5082:20;:18;:20::i;:::-;5104:10;4049:4:51;4043:11;-1:-1:-1;;;4067:23:51;;4119:4;4110:14;;4103:39;;;;4171:4;4162:14;;4155:34;4227:4;4212:20;;;3874:374;21414:317:65;21531:14;21548:70;21562:47;21585:8;21595:13;21562:22;:47::i;:::-;21611:6;21548:13;:70::i;:::-;21531:87;-1:-1:-1;21531:87:65;21646:13;-1:-1:-1;;;;;21636:23:65;;;;;;;21628:96;;;;-1:-1:-1;;;21628:96:65;;;;;;;;;:::i;:::-;;;21521:210;21414:317;;;:::o;3104:363:63:-;-1:-1:-1;;;;;3283:18:63;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;:25;:27::i;:::-;3282:28;3342:12;3274:82;;;;;-1:-1:-1;;;3274:82:63;;;;;;;;:::i;:::-;-1:-1:-1;3375:39:63;;-1:-1:-1;;;3375:39:63;;-1:-1:-1;;;;;3375:25:63;;;;;:39;;3401:12;;3375:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3374:40;3446:12;3366:94;;;;;-1:-1:-1;;;3366:94:63;;;;;;;;:::i;:::-;;3104:363;;;:::o;6911:111:37:-;6996:19;;6911:111::o;2747:875:61:-;3029:12;;:::i;:::-;-1:-1:-1;;;;;3062:18:61;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;7092:14;;;:19;;;7011:107;3062:27;3061:28;3115:12;3053:76;;;;;-1:-1:-1;;;3053:76:61;;;;;;;;:::i;:::-;-1:-1:-1;;3166:379:61;;;;;;;;-1:-1:-1;;;;;3166:379:61;;;;;;;;;;;;;;;;;;3311:15;3166:379;;;;;;-1:-1:-1;3166:379:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3556:18;;;;;;;;;;;;;:31;;;;-1:-1:-1;;;;;;3556:31:61;;;;;;;;;;;-1:-1:-1;3556:31:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3166:379;2747:875::o;5435:111:52:-;5493:7;5312:5;;;5527;;;5311:36;5306:42;;5519:20;5071:294;624:141:36;707:4;739:3;730:5;:12;;:28;;;;-1:-1:-1;;746:12:36;;;;;723:35;-1:-1:-1;624:141:36:o;5649:243:14:-;5713:17;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5713:17:14;5742:23;5768:16;;;:6;:16;;;;;;;;;5742:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5775:8;;5794:69;;;;-1:-1:-1;;;5794:69:14;;;;;;1776:25:70;;1764:2;1749:18;;1630:177;3288:459:33;3459:7;3499:1;3486:4;:10;;;:14;3478:46;;;;-1:-1:-1;;;3478:46:33;;;;;;;;;;;;3534:16;3553:22;3565:4;:9;;;3553:11;:22;;:::i;:::-;3534:41;;3585:21;3596:4;:9;;;3585:10;:21;;:::i;:::-;3630:1;3616:4;:10;;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;3641:20:33;;;3675:10;;;;3641:9;3675:15;3671:43;;3712:1;3692:9;;;:22;3671:43;-1:-1:-1;;3731:9:33;;;3288:459;-1:-1:-1;;3288:459:33:o;3626:114:63:-;3707:12;-1:-1:-1;;;;;3707:26:63;;;;3626:114::o;5559:487:46:-;5690:17;;:21;5686:354;;5887:10;5881:17;5943:15;5930:10;5926:2;5922:19;5915:44;5686:354;6010:19;;-1:-1:-1;;;6010:19:46;;;;;;;;;;;2446:319:33;1415:6;2521:4;:10;;;:22;2513:64;;;;-1:-1:-1;;;2513:64:33;;;;;;;;;;;;2595:2;2587:52;;;;-1:-1:-1;;;2587:52:33;;;;;;;;;;;;2649:9;;;;:14;;;2673:10;;;:15;;:10;;:15;;2649:9;;2673:15;:::i;:::-;;;;-1:-1:-1;;2702:10:33;;;;2716:1;2702:15;2698:35;;2719:14;;;2698:35;2757:1;2743:4;:10;;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;2446:319:33:o;3903:307:61:-;4004:24;4031;4036:4;4042:12;4031:4;:24::i;:::-;4073:17;;;;;;;;;;-1:-1:-1;;;;;4073:17:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4004:51;;-1:-1:-1;4073:19:61;;:17;:19::i;:::-;4125;;;;4111:12;;4065:81;;;;-1:-1:-1;;;4065:81:61;;;;;;;;;:::i;:::-;-1:-1:-1;;4188:15:61;4156:29;;;;:47;-1:-1:-1;;3903:307:61:o;5224:301::-;5334:24;5361;5366:4;5372:12;5361:4;:24::i;:::-;5403:17;;;;;;;;;;-1:-1:-1;;;;;5403:17:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5334:51;;-1:-1:-1;5403:19:61;;:17;:19::i;:::-;5455;;;;5441:12;;5395:81;;;;-1:-1:-1;;;5395:81:61;;;;;;;;;:::i;:::-;-1:-1:-1;;5517:1:61;5486:28;;;;:32;-1:-1:-1;;5224:301:61:o;1099:188:35:-;1160:7;1187:13;1198:1;452:9;-1:-1:-1;2073:16:35;;1992:104;1187:13;:30;;;;1204:13;1215:1;452:9;-1:-1:-1;2073:16:35;;1992:104;1204:13;1240:1;1243;1179:67;;;;;;-1:-1:-1;;;1179:67:35;;;;;;;;;:::i;:::-;-1:-1:-1;452:9:35;;-1:-1:-1;1264:5:35;1268:1;1264;:5;:::i;:::-;1263:17;;;;:::i;8485:120:39:-;8535:4;8558:26;:24;:26::i;:::-;:40;-1:-1:-1;;;8558:40:39;;;;;;-1:-1:-1;8485:120:39:o;7565:348:21:-;7648:4;7656;7648:12;;;;;;;;;7640:63;;;;-1:-1:-1;;;7640:63:21;;;;;;;;;:::i;:::-;-1:-1:-1;7776:4:21;;-1:-1:-1;7721:24:21;;;;452:9:35;-1:-1:-1;2073:16:35;7713:75:21;;;;-1:-1:-1;;;7713:75:21;;;;;;;;;:::i;:::-;-1:-1:-1;;7798:19:21;:26;;;7834;;;-1:-1:-1;;;7834:26:21;-1:-1:-1;;;;7798:26:21;;;-1:-1:-1;;;7798:26:21;7834;;;;-1:-1:-1;;;;;;;;7834:26:21;;;;;;;;;;7875:31;;;;;;7820:4;;7856;;7875:31;:::i;8127:271::-;8212:4;8220;-1:-1:-1;;;;;8212:12:21;;;;;;;;8204:63;;;;-1:-1:-1;;;8204:63:21;;;;;;;;;:::i;:::-;-1:-1:-1;;8277:21:21;:28;;-1:-1:-1;;;;;8315:28:21;;;-1:-1:-1;;;8315:28:21;-1:-1:-1;;;;;;8315:28:21;;;8277;;;8315;;;;8358:33;;;;;;8301:4;;8339;;8358:33;:::i;3599:330:43:-;6929:20:39;:18;:20::i;:::-;3711:23:43::1;3737:19;:17;:19::i;:::-;3711:45:::0;-1:-1:-1;3766:7:43::1;::::0;::::1;:14;3776:4:::0;3766:7;:14:::1;:::i;:::-;-1:-1:-1::0;3790:10:43::1;::::0;::::1;:20;3803:7:::0;3790:10;:20:::1;:::i;:::-;-1:-1:-1::0;3891:1:43::1;3875:17:::0;;;3902:16:::1;::::0;;::::1;:20:::0;-1:-1:-1;;3599:330:43:o;4015:109::-;4068:7;4094:23;:21;:23::i;3714:255:50:-;3792:7;3812:17;3831:18;3851:16;3871:27;3882:4;3888:9;3871:10;:27::i;:::-;3811:87;;;;;;3908:28;3920:5;3927:8;3908:11;:28::i;:::-;-1:-1:-1;3953:9:50;;3714:255;-1:-1:-1;;;;3714:255:50:o;4130:191:43:-;4185:7;2073:95;4243:17;:15;:17::i;:::-;4262:20;:18;:20::i;:::-;4221:92;;;;;;40101:25:70;;;;40142:18;;40135:34;;;;40185:18;;;40178:34;4284:13:43;40228:18:70;;;40221:34;4307:4:43;40271:19:70;;;40264:61;40073:19;;4221:92:43;;;;;;;;;;;;4211:103;;;;;;4204:110;;4130:191;:::o;2129:778:50:-;2232:17;2251:16;2269:14;2299:9;:16;2319:2;2299:22;2295:606;;2604:4;2589:20;;2583:27;2653:4;2638:20;;2632:27;2710:4;2695:20;;2689:27;2337:9;2681:36;2751:25;2762:4;2681:36;2583:27;2632;2751:10;:25::i;:::-;2744:32;;;;;;;;;;;2295:606;-1:-1:-1;;2872:16:50;;2823:1;;-1:-1:-1;2827:35:50;;2295:606;2129:778;;;;;:::o;7280:532::-;7375:20;7366:5;:29;;;;;;;;:::i;:::-;;7362:444;;7280:532;;:::o;7362:444::-;7471:29;7462:5;:38;;;;;;;;:::i;:::-;;7458:348;;7523:23;;-1:-1:-1;;;7523:23:50;;;;;;;;;;;7458:348;7576:35;7567:5;:44;;;;;;;;:::i;:::-;;7563:243;;7634:46;;-1:-1:-1;;;7634:46:50;;;;;1776:25:70;;;1749:18;;7634:46:50;1630:177:70;7563:243:50;7710:30;7701:5;:39;;;;;;;;:::i;:::-;;7697:109;;7763:32;;-1:-1:-1;;;7763:32:50;;;;;1776:25:70;;;1749:18;;7763:32:50;1630:177:70;7057:687:43;7107:7;7126:23;7152:19;:17;:19::i;:::-;7126:45;;7181:18;7202:13;:11;:13::i;:::-;7229:18;;7181:34;;-1:-1:-1;7229:22:43;7225:513;;7274:22;;;;;;;;7057:687;-1:-1:-1;;7057:687:43:o;7225:513::-;7571:13;;7602:15;;7598:130;;7644:10;7057:687;-1:-1:-1;;;7057:687:43:o;7598:130::-;7700:13;7693:20;;;;;7057:687;:::o;7965:723::-;8018:7;8037:23;8063:19;:17;:19::i;:::-;8037:45;;8092:21;8116:16;:14;:16::i;:::-;8146:21;;8092:40;;-1:-1:-1;8146:25:43;8142:540;;8194:25;;;;;;;;7965:723;-1:-1:-1;;7965:723:43:o;8142:540::-;8506:16;;;;8540:18;;8536:136;;8585:13;7965:723;-1:-1:-1;;;7965:723:43:o;5203:1551:50:-;5329:17;;;-1:-1:-1;;;;;6270:79:50;;6266:164;;;-1:-1:-1;6381:1:50;;-1:-1:-1;6385:30:50;;-1:-1:-1;6417:1:50;6365:54;;6266:164;6541:24;;;6524:14;6541:24;;;;;;;;;40563:25:70;;;40636:4;40624:17;;40604:18;;;40597:45;;;;40658:18;;;40651:34;;;40701:18;;;40694:34;;;6541:24:50;;40535:19:70;;6541:24:50;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6541:24:50;;-1:-1:-1;;6541:24:50;;;-1:-1:-1;;;;;;;6579:20:50;;6575:113;;-1:-1:-1;6631:1:50;;-1:-1:-1;6635:29:50;;-1:-1:-1;6631:1:50;;-1:-1:-1;6615:62:50;;6575:113;6706:6;-1:-1:-1;6714:20:50;;-1:-1:-1;6714:20:50;;-1:-1:-1;5203:1551:50;;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:70:-;-1:-1:-1;;;;;89:31:70;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;650:203::-;-1:-1:-1;;;;;814:32:70;;;;796:51;;784:2;769:18;;650:203::o;2208:121::-;2293:10;2286:5;2282:22;2275:5;2272:33;2262:61;;2319:1;2316;2309:12;2334:245;2392:6;2445:2;2433:9;2424:7;2420:23;2416:32;2413:52;;;2461:1;2458;2451:12;2413:52;2500:9;2487:23;2519:30;2543:5;2519:30;:::i;2781:347::-;2832:8;2842:6;2896:3;2889:4;2881:6;2877:17;2873:27;2863:55;;2914:1;2911;2904:12;2863:55;-1:-1:-1;2937:20:70;;-1:-1:-1;;;;;2969:30:70;;2966:50;;;3012:1;3009;3002:12;2966:50;3049:4;3041:6;3037:17;3025:29;;3101:3;3094:4;3085:6;3077;3073:19;3069:30;3066:39;3063:59;;;3118:1;3115;3108:12;3133:544;3212:6;3220;3228;3281:2;3269:9;3260:7;3256:23;3252:32;3249:52;;;3297:1;3294;3287:12;3249:52;3336:9;3323:23;3355:31;3380:5;3355:31;:::i;:::-;3405:5;-1:-1:-1;3461:2:70;3446:18;;3433:32;-1:-1:-1;;;;;3477:30:70;;3474:50;;;3520:1;3517;3510:12;3474:50;3559:58;3609:7;3600:6;3589:9;3585:22;3559:58;:::i;:::-;3133:544;;3636:8;;-1:-1:-1;3533:84:70;;-1:-1:-1;;;;3133:544:70:o;3682:118::-;3768:5;3761:13;3754:21;3747:5;3744:32;3734:60;;3790:1;3787;3780:12;3805:382;3870:6;3878;3931:2;3919:9;3910:7;3906:23;3902:32;3899:52;;;3947:1;3944;3937:12;3899:52;3986:9;3973:23;4005:31;4030:5;4005:31;:::i;:::-;4055:5;-1:-1:-1;4112:2:70;4097:18;;4084:32;4125:30;4084:32;4125:30;:::i;:::-;4174:7;4164:17;;;3805:382;;;;;:::o;4192:226::-;4251:6;4304:2;4292:9;4283:7;4279:23;4275:32;4272:52;;;4320:1;4317;4310:12;4272:52;-1:-1:-1;4365:23:70;;4192:226;-1:-1:-1;4192:226:70:o;4423:278::-;4623:10;4611:23;;;4593:42;;4671:23;;4666:2;4651:18;;4644:51;4581:2;4566:18;;4423:278::o;4706:250::-;4791:1;4801:113;4815:6;4812:1;4809:13;4801:113;;;4891:11;;;4885:18;4872:11;;;4865:39;4837:2;4830:10;4801:113;;;-1:-1:-1;;4948:1:70;4930:16;;4923:27;4706:250::o;4961:271::-;5003:3;5041:5;5035:12;5068:6;5063:3;5056:19;5084:76;5153:6;5146:4;5141:3;5137:14;5130:4;5123:5;5119:16;5084:76;:::i;:::-;5214:2;5193:15;-1:-1:-1;;5189:29:70;5180:39;;;;5221:4;5176:50;;4961:271;-1:-1:-1;;4961:271:70:o;5237:454::-;5462:6;5451:9;5444:25;5505:2;5500;5489:9;5485:18;5478:30;5425:4;5531:45;5572:2;5561:9;5557:18;5549:6;5531:45;:::i;:::-;5624:9;5616:6;5612:22;5607:2;5596:9;5592:18;5585:50;5652:33;5678:6;5670;5652:33;:::i;:::-;5644:41;5237:454;-1:-1:-1;;;;;;5237:454:70:o;6897:294::-;-1:-1:-1;;;;;7085:31:70;;;7067:50;;7153:31;;7148:2;7133:18;;7126:59;7055:2;7040:18;;6897:294::o;7196:508::-;7273:6;7281;7289;7342:2;7330:9;7321:7;7317:23;7313:32;7310:52;;;7358:1;7355;7348:12;7310:52;7397:9;7384:23;7416:31;7441:5;7416:31;:::i;:::-;7466:5;-1:-1:-1;7523:2:70;7508:18;;7495:32;7536:33;7495:32;7536:33;:::i;:::-;7196:508;;7588:7;;-1:-1:-1;;;7668:2:70;7653:18;;;;7640:32;;7196:508::o;7709:248::-;7883:25;;;7939:2;7924:18;;7917:34;7871:2;7856:18;;7709:248::o;8475:1238::-;8881:3;8876;8872:13;8864:6;8860:26;8849:9;8842:45;8923:3;8918:2;8907:9;8903:18;8896:31;8823:4;8950:46;8991:3;8980:9;8976:19;8968:6;8950:46;:::i;:::-;9044:9;9036:6;9032:22;9027:2;9016:9;9012:18;9005:50;9078:33;9104:6;9096;9078:33;:::i;:::-;9142:2;9127:18;;9120:34;;;-1:-1:-1;;;;;9191:32:70;;9185:3;9170:19;;9163:61;9211:3;9240:19;;9233:35;;;9305:22;;;9299:3;9284:19;;9277:51;9377:13;;9399:22;;;9449:2;9475:15;;;;-1:-1:-1;9437:15:70;;;;-1:-1:-1;9518:169:70;9532:6;9529:1;9526:13;9518:169;;;9593:13;;9581:26;;9636:2;9662:15;;;;9627:12;;;;9554:1;9547:9;9518:169;;;-1:-1:-1;9704:3:70;;8475:1238;-1:-1:-1;;;;;;;;;;;8475:1238:70:o;9718:621::-;9815:6;9823;9876:2;9864:9;9855:7;9851:23;9847:32;9844:52;;;9892:1;9889;9882:12;9844:52;9919:23;;-1:-1:-1;;;;;9954:30:70;;9951:50;;;9997:1;9994;9987:12;9951:50;10020:22;;10073:4;10065:13;;10061:27;-1:-1:-1;10051:55:70;;10102:1;10099;10092:12;10051:55;10129:16;;-1:-1:-1;;;;;10157:30:70;;10154:50;;;10200:1;10197;10190:12;10154:50;10253:7;10248:2;10238:6;10235:1;10231:14;10227:2;10223:23;10219:32;10216:45;10213:65;;;10274:1;10271;10264:12;10213:65;10305:2;10297:11;;;;;10327:6;;-1:-1:-1;9718:621:70;-1:-1:-1;;;9718:621:70:o;10344:780::-;10504:4;10552:2;10541:9;10537:18;10582:2;10571:9;10564:21;10605:6;10640;10634:13;10671:6;10663;10656:22;10709:2;10698:9;10694:18;10687:25;;10771:2;10761:6;10758:1;10754:14;10743:9;10739:30;10735:39;10721:53;;10809:2;10801:6;10797:15;10830:1;10840:255;10854:6;10851:1;10848:13;10840:255;;;10947:2;10943:7;10931:9;10923:6;10919:22;10915:36;10910:3;10903:49;10975:40;11008:6;10999;10993:13;10975:40;:::i;:::-;10965:50;-1:-1:-1;11050:2:70;11073:12;;;;11038:15;;;;;10876:1;10869:9;10840:255;;;-1:-1:-1;11112:6:70;;10344:780;-1:-1:-1;;;;;;10344:780:70:o;11129:711::-;11234:6;11242;11250;11258;11311:2;11299:9;11290:7;11286:23;11282:32;11279:52;;;11327:1;11324;11317:12;11279:52;11366:9;11353:23;11385:31;11410:5;11385:31;:::i;:::-;11435:5;-1:-1:-1;11492:2:70;11477:18;;11464:32;11527:1;11515:14;;11505:42;;11543:1;11540;11533:12;11505:42;11566:7;-1:-1:-1;11624:2:70;11609:18;;11596:32;-1:-1:-1;;;;;11640:30:70;;11637:50;;;11683:1;11680;11673:12;11637:50;11722:58;11772:7;11763:6;11752:9;11748:22;11722:58;:::i;:::-;11129:711;;;;-1:-1:-1;11799:8:70;-1:-1:-1;;;;11129:711:70:o;11845:627::-;11930:6;11938;11946;11954;12007:3;11995:9;11986:7;11982:23;11978:33;11975:53;;;12024:1;12021;12014:12;11975:53;12063:9;12050:23;12082:31;12107:5;12082:31;:::i;:::-;12132:5;-1:-1:-1;12210:2:70;12195:18;;12182:32;;-1:-1:-1;12292:2:70;12277:18;;12264:32;12305;12264;12305;:::i;:::-;11845:627;;;;-1:-1:-1;12356:7:70;;12436:2;12421:18;12408:32;;-1:-1:-1;;11845:627:70:o;12477:388::-;12545:6;12553;12606:2;12594:9;12585:7;12581:23;12577:32;12574:52;;;12622:1;12619;12612:12;12574:52;12661:9;12648:23;12680:31;12705:5;12680:31;:::i;:::-;12730:5;-1:-1:-1;12787:2:70;12772:18;;12759:32;12800:33;12759:32;12800:33;:::i;13679:397::-;-1:-1:-1;;;;;13899:32:70;;;13881:51;;13968:32;;;13963:2;13948:18;;13941:60;14037:32;;;14032:2;14017:18;;14010:60;13869:2;13854:18;;13679:397::o;14081:245::-;14148:6;14201:2;14189:9;14180:7;14176:23;14172:32;14169:52;;;14217:1;14214;14207:12;14169:52;14249:9;14243:16;14268:28;14290:5;14268:28;:::i;14331:300::-;-1:-1:-1;;;;;14523:32:70;;;14505:51;;14592:32;;14587:2;14572:18;;14565:60;14493:2;14478:18;;14331:300::o;14636:127::-;14697:10;14692:3;14688:20;14685:1;14678:31;14728:4;14725:1;14718:15;14752:4;14749:1;14742:15;14768:252;14840:2;14834:9;14882:3;14870:16;;-1:-1:-1;;;;;14901:34:70;;14937:22;;;14898:62;14895:88;;;14963:18;;:::i;:::-;14999:2;14992:22;14768:252;:::o;15025:251::-;15097:2;15091:9;;;15127:15;;-1:-1:-1;;;;;15157:34:70;;15193:22;;;15154:62;15151:88;;;15219:18;;:::i;15281:248::-;15348:2;15342:9;15390:4;15378:17;;-1:-1:-1;;;;;15410:34:70;;15446:22;;;15407:62;15404:88;;;15472:18;;:::i;15534:889::-;15577:5;15630:3;15623:4;15615:6;15611:17;15607:27;15597:55;;15648:1;15645;15638:12;15597:55;15675:20;;15727:4;15715:17;;15756:1;;-1:-1:-1;;;;;15791:30:70;;15788:56;;;15824:18;;:::i;:::-;-1:-1:-1;15979:2:70;15973:9;-1:-1:-1;;15892:2:70;15871:15;;15867:29;;16037:2;16025:15;16021:29;16009:42;;16102:22;;;-1:-1:-1;;;;;16066:34:70;;16063:62;16060:88;;;16128:18;;:::i;:::-;16164:2;16157:22;16214;;;16199:6;-1:-1:-1;16199:6:70;16251:16;;;16248:25;-1:-1:-1;16245:45:70;;;16286:1;16283;16276:12;16245:45;16336:6;16331:3;16324:4;16316:6;16312:17;16299:44;16391:1;16384:4;16375:6;16367;16363:19;16359:30;16352:41;16411:6;16402:15;;;;;;15534:889;;;;:::o;16428:681::-;16533:6;16541;16549;16602:2;16590:9;16581:7;16577:23;16573:32;16570:52;;;16618:1;16615;16608:12;16570:52;16645:23;;-1:-1:-1;;;;;16680:30:70;;16677:50;;;16723:1;16720;16713:12;16677:50;16746;16788:7;16779:6;16768:9;16764:22;16746:50;:::i;:::-;16736:60;-1:-1:-1;;16849:2:70;16834:18;;16821:32;-1:-1:-1;;;;;16865:32:70;;16862:52;;;16910:1;16907;16900:12;16862:52;16933;16977:7;16966:8;16955:9;16951:24;16933:52;:::i;:::-;16923:62;;;17035:2;17024:9;17020:18;17007:32;17048:31;17073:5;17048:31;:::i;:::-;17098:5;17088:15;;;16428:681;;;;;:::o;17114:380::-;17193:1;17189:12;;;;17236;;;17257:61;;17311:4;17303:6;17299:17;17289:27;;17257:61;17364:2;17356:6;17353:14;17333:18;17330:38;17327:161;;17410:10;17405:3;17401:20;17398:1;17391:31;17445:4;17442:1;17435:15;17473:4;17470:1;17463:15;17327:161;;17114:380;;;:::o;17625:518::-;17727:2;17722:3;17719:11;17716:421;;;17763:5;17760:1;17753:16;17807:4;17804:1;17794:18;17877:2;17865:10;17861:19;17858:1;17854:27;17848:4;17844:38;17913:4;17901:10;17898:20;17895:47;;;-1:-1:-1;17936:4:70;17895:47;17991:2;17986:3;17982:12;17979:1;17975:20;17969:4;17965:31;17955:41;;18046:81;18064:2;18057:5;18054:13;18046:81;;;18123:1;18109:16;;18090:1;18079:13;18046:81;;18319:1299;18439:10;;-1:-1:-1;;;;;18461:30:70;;18458:56;;;18494:18;;:::i;:::-;18523:97;18613:6;18573:38;18605:4;18599:11;18573:38;:::i;:::-;18567:4;18523:97;:::i;:::-;18669:4;18700:2;18689:14;;18717:1;18712:649;;;;19405:1;19422:6;19419:89;;;-1:-1:-1;19474:19:70;;;19468:26;19419:89;-1:-1:-1;;18276:1:70;18272:11;;;18268:24;18264:29;18254:40;18300:1;18296:11;;;18251:57;19521:81;;18682:930;;18712:649;17572:1;17565:14;;;17609:4;17596:18;;-1:-1:-1;;18748:20:70;;;18866:222;18880:7;18877:1;18874:14;18866:222;;;18962:19;;;18956:26;18941:42;;19069:4;19054:20;;;;19022:1;19010:14;;;;18896:12;18866:222;;;18870:3;19116:6;19107:7;19104:19;19101:201;;;19177:19;;;19171:26;-1:-1:-1;;19260:1:70;19256:14;;;19272:3;19252:24;19248:37;19244:42;19229:58;19214:74;;19101:201;-1:-1:-1;;;;19348:1:70;19332:14;;;19328:22;19315:36;;-1:-1:-1;18319:1299:70:o;19623:388::-;19780:2;19769:9;19762:21;19819:6;19814:2;19803:9;19799:18;19792:34;19876:6;19868;19863:2;19852:9;19848:18;19835:48;19932:1;19903:22;;;19927:2;19899:31;;;19892:42;;;;19995:2;19974:15;;;-1:-1:-1;;19970:29:70;19955:45;19951:54;;19623:388;-1:-1:-1;19623:388:70:o;20626:127::-;20687:10;20682:3;20678:20;20675:1;20668:31;20718:4;20715:1;20708:15;20742:4;20739:1;20732:15;20758:128;20825:9;;;20846:11;;;20843:37;;;20860:18;;:::i;21227:127::-;21288:10;21283:3;21279:20;21276:1;21269:31;21319:4;21316:1;21309:15;21343:4;21340:1;21333:15;21359:521;21436:4;21442:6;21502:11;21489:25;21596:2;21592:7;21581:8;21565:14;21561:29;21557:43;21537:18;21533:68;21523:96;;21615:1;21612;21605:12;21523:96;21642:33;;21694:20;;;-1:-1:-1;;;;;;21726:30:70;;21723:50;;;21769:1;21766;21759:12;21723:50;21802:4;21790:17;;-1:-1:-1;21833:14:70;21829:27;;;21819:38;;21816:58;;;21870:1;21867;21860:12;21885:440;22114:6;22106;22101:3;22088:33;22070:3;22149:6;22144:3;22140:16;22176:1;22172:2;22165:13;22207:6;22201:13;22223:65;22281:6;22277:2;22270:4;22262:6;22258:17;22223:65;:::i;:::-;22304:15;;21885:440;-1:-1:-1;;;;;21885:440:70:o;22330:127::-;22391:10;22386:3;22382:20;22379:1;22372:31;22422:4;22419:1;22412:15;22446:4;22443:1;22436:15;22462:240;22546:1;22539:5;22536:12;22526:143;;22591:10;22586:3;22582:20;22579:1;22572:31;22626:4;22623:1;22616:15;22654:4;22651:1;22644:15;22526:143;22678:18;;22462:240::o;22707:214::-;22856:2;22841:18;;22868:47;22845:9;22897:6;22868:47;:::i;23140:346::-;23208:6;23216;23269:2;23257:9;23248:7;23244:23;23240:32;23237:52;;;23285:1;23282;23275:12;23237:52;-1:-1:-1;;23330:23:70;;;23450:2;23435:18;;;23422:32;;-1:-1:-1;23140:346:70:o;23939:705::-;24042:6;24050;24058;24066;24119:3;24107:9;24098:7;24094:23;24090:33;24087:53;;;24136:1;24133;24126:12;24087:53;24181:23;;;-1:-1:-1;24301:2:70;24286:18;;24273:32;;-1:-1:-1;24383:2:70;24368:18;;24355:32;24396:33;24355:32;24396:33;:::i;:::-;24448:7;-1:-1:-1;24506:2:70;24491:18;;24478:32;-1:-1:-1;;;;;24522:30:70;;24519:50;;;24565:1;24562;24555:12;24519:50;24588;24630:7;24621:6;24610:9;24606:22;24588:50;:::i;:::-;24578:60;;;23939:705;;;;;;;:::o;24649:136::-;24727:13;;24749:30;24727:13;24749:30;:::i;24790:129::-;-1:-1:-1;;;;;24864:30:70;;24854:41;;24844:69;;24909:1;24906;24899:12;24924:136;25002:13;;25024:30;25002:13;25024:30;:::i;25065:1236::-;25162:6;25222:3;25210:9;25201:7;25197:23;25193:33;25238:2;25235:22;;;25253:1;25250;25243:12;25235:22;-1:-1:-1;25272:1:70;25295:22;;:::i;:::-;25363:16;;25388:22;;25477:2;25462:18;;;25456:25;25497:14;;;25490:31;25588:2;25573:18;;;25567:25;25608:14;;;25601:31;25664:48;25708:2;25693:18;;25664:48;:::i;:::-;25659:2;25652:5;25648:14;25641:72;25746:49;25790:3;25779:9;25775:19;25746:49;:::i;:::-;25740:3;25733:5;25729:15;25722:74;25829:49;25873:3;25862:9;25858:19;25829:49;:::i;:::-;25823:3;25816:5;25812:15;25805:74;25912:49;25956:3;25945:9;25941:19;25912:49;:::i;:::-;25906:3;25899:5;25895:15;25888:74;25995:49;26039:3;26028:9;26024:19;25995:49;:::i;:::-;25989:3;25978:15;;25971:74;26112:3;26097:19;;;26091:26;26133:15;;;26126:32;26225:3;26210:19;;;26204:26;26246:15;;;26239:32;;;;-1:-1:-1;25982:5:70;;25065:1236;-1:-1:-1;;25065:1236:70:o;26891:230::-;26961:6;27014:2;27002:9;26993:7;26989:23;26985:32;26982:52;;;27030:1;27027;27020:12;26982:52;-1:-1:-1;27075:16:70;;26891:230;-1:-1:-1;26891:230:70:o;27126:249::-;27195:6;27248:2;27236:9;27227:7;27223:23;27219:32;27216:52;;;27264:1;27261;27254:12;27216:52;27296:9;27290:16;27315:30;27339:5;27315:30;:::i;27380:249::-;27449:6;27502:2;27490:9;27481:7;27477:23;27473:32;27470:52;;;27518:1;27515;27508:12;27470:52;27550:9;27544:16;27569:30;27593:5;27569:30;:::i;27897:274::-;-1:-1:-1;;;;;28089:32:70;;;;28071:51;;28153:2;28138:18;;28131:34;28059:2;28044:18;;27897:274::o;28176:125::-;28241:9;;;28262:10;;;28259:36;;;28275:18;;:::i;28306:287::-;28435:3;28473:6;28467:13;28489:66;28548:6;28543:3;28536:4;28528:6;28524:17;28489:66;:::i;:::-;28571:16;;;;;28306:287;-1:-1:-1;;28306:287:70:o;28598:132::-;28665:20;;28694:30;28665:20;28694:30;:::i;28735:173::-;28803:20;;-1:-1:-1;;;;;28852:31:70;;28842:42;;28832:70;;28898:1;28895;28888:12;28913:1628;29008:6;29016;29069:2;29057:9;29048:7;29044:23;29040:32;29037:52;;;29085:1;29082;29075:12;29037:52;29112:23;;-1:-1:-1;;;;;29147:30:70;;29144:50;;;29190:1;29187;29180:12;29144:50;29213:22;;29269:2;29251:16;;;29247:25;29244:45;;;29285:1;29282;29275:12;29244:45;29311:22;;:::i;:::-;29358:16;;-1:-1:-1;;;;;29386:32:70;;29383:52;;;29431:1;29428;29421:12;29383:52;29454:17;;29505:4;29487:16;;;29483:27;29480:47;;;29523:1;29520;29513:12;29480:47;29551:17;;:::i;:::-;29613:16;;29638:24;;29696:31;29723:2;29715:11;;29696:31;:::i;:::-;29691:2;29682:7;29678:16;29671:57;29762:31;29789:2;29785;29781:11;29762:31;:::i;:::-;29757:2;29748:7;29744:16;29737:57;29828:31;29855:2;29851;29847:11;29828:31;:::i;:::-;29823:2;29814:7;29810:16;29803:57;29895:31;29921:3;29917:2;29913:12;29895:31;:::i;:::-;29889:3;29880:7;29876:17;29869:58;29962:32;29989:3;29985:2;29981:12;29962:32;:::i;:::-;29956:3;29943:17;;29936:59;30041:3;30033:12;;30020:26;-1:-1:-1;;;;;30058:32:70;;30055:52;;;30103:1;30100;30093:12;30055:52;30142:45;30179:7;30168:8;30164:2;30160:17;30142:45;:::i;:::-;30136:3;30123:17;;30116:72;-1:-1:-1;30197:22:70;;-1:-1:-1;30265:2:70;30257:11;;30244:25;-1:-1:-1;;;;;30281:32:70;;30278:52;;;30326:1;30323;30316:12;30278:52;30362:45;30399:7;30388:8;30384:2;30380:17;30362:45;:::i;:::-;30357:2;30346:14;;;30339:69;;;;30350:5;;30490:18;;;;30477:32;;-1:-1:-1;;;;;28913:1628:70:o;30546:397::-;30746:47;30783:9;30775:6;30746:47;:::i;:::-;30829:2;30824;30813:9;30809:18;30802:30;30727:4;30849:45;30890:2;30879:9;30875:18;30867:6;30849:45;:::i;:::-;30841:53;;30930:6;30925:2;30914:9;30910:18;30903:34;30546:397;;;;;;:::o;30948:168::-;31021:9;;;31052;;31069:15;;;31063:22;;31049:37;31039:71;;31090:18;;:::i;31698:584::-;31792:6;31800;31808;31861:2;31849:9;31840:7;31836:23;31832:32;31829:52;;;31877:1;31874;31867:12;31829:52;31916:9;31903:23;31935:31;31960:5;31935:31;:::i;:::-;31985:5;-1:-1:-1;32063:2:70;32048:18;;32035:32;;-1:-1:-1;32144:2:70;32129:18;;32116:32;-1:-1:-1;;;;;32160:30:70;;32157:50;;;32203:1;32200;32193:12;32157:50;32226;32268:7;32259:6;32248:9;32244:22;32226:50;:::i;:::-;32216:60;;;31698:584;;;;;:::o;32663:433::-;32894:3;32883:9;32876:22;32857:4;32915:46;32956:3;32945:9;32941:19;32933:6;32915:46;:::i;:::-;32992:2;32977:18;;32970:34;;;;-1:-1:-1;33035:2:70;33020:18;;33013:34;;;;33078:2;33063:18;;;33056:34;32907:54;32663:433;-1:-1:-1;32663:433:70:o;33101:372::-;33188:6;33196;33249:2;33237:9;33228:7;33224:23;33220:32;33217:52;;;33265:1;33262;33255:12;33217:52;33310:16;;33395:2;33380:18;;33374:25;33310:16;;-1:-1:-1;33408:33:70;33374:25;33408:33;:::i;33757:136::-;33796:3;33824:5;33814:39;;33833:18;;:::i;:::-;-1:-1:-1;;;33869:18:70;;33757:136::o;33898:135::-;33937:3;33958:17;;;33955:43;;33978:18;;:::i;:::-;-1:-1:-1;34025:1:70;34014:13;;33898:135::o;34038:386::-;-1:-1:-1;;;;;34256:32:70;;;34238:51;;34325:32;;;;34320:2;34305:18;;34298:60;34406:10;34394:23;;;34389:2;34374:18;;34367:51;34226:2;34211:18;;34038:386::o;34538:1377::-;34777:2;34759:21;;;34809:13;;34858:4;34838:18;;;34831:32;;;34900:19;;34894:3;34879:19;;34872:48;34985:4;34967:23;;34961:30;-1:-1:-1;;;;;34957:56:70;;;34951:3;34936:19;;34929:85;35062:23;;;35056:30;35052:56;;35045:4;35030:20;;35023:86;35156:21;;;35150:28;35146:54;;;35140:3;35125:19;;35118:83;35256:4;35238:23;;35232:30;-1:-1:-1;;;;;6855:30:70;;35320:3;35305:19;;6843:43;-1:-1:-1;;34809:13:70;-1:-1:-1;35380:3:70;35362:22;;35356:29;-1:-1:-1;;;;;34495:31:70;;35444:3;35429:19;;34483:44;-1:-1:-1;35504:3:70;35486:22;35480:29;35546:4;35540:3;35525:19;;35518:33;35571:54;35620:3;35605:19;;35480:29;35571:54;:::i;:::-;35560:65;;35674:4;35666:6;35662:17;35656:24;35747:2;35743:7;35731:9;35726:3;35722:19;35718:33;35711:4;35700:9;35696:20;35689:63;35769:38;35803:3;35787:14;35769:38;:::i;:::-;35761:46;;;;35845:6;35838:4;35827:9;35823:20;35816:36;35861:48;35903:4;35892:9;35888:20;35880:6;-1:-1:-1;;;;;607:31:70;595:44;;541:104;36257:408;-1:-1:-1;;;;;36492:32:70;;;36474:51;;36561:32;;36556:2;36541:18;;36534:60;36462:2;36447:18;;36603:56;36655:2;36640:18;;36632:6;36603:56;:::i;36670:1006::-;36772:6;36832:3;36820:9;36811:7;36807:23;36803:33;36848:2;36845:22;;;36863:1;36860;36853:12;36845:22;-1:-1:-1;36933:2:70;36927:9;36882:1;;36975:3;36963:16;;-1:-1:-1;;;;;36994:34:70;;37030:22;;;36991:62;36988:88;;;37056:18;;:::i;:::-;37092:2;37085:22;;;37149:16;;37174:21;;37262:2;37247:18;;;37241:25;37282:15;;;37275:32;37359:18;;;37353:25;37394:15;;;37387:32;37486:2;37471:18;;;37465:25;37506:15;;;37499:32;37598:3;37583:19;;;37577:26;37619:16;;;37612:33;;;;-1:-1:-1;37181:6:70;;36670:1006;-1:-1:-1;;36670:1006:70:o;37681:371::-;-1:-1:-1;;;;;37901:32:70;;;37883:51;;37970:32;;;;37965:2;37950:18;;37943:60;38034:2;38019:18;;38012:34;;;;37871:2;37856:18;;37681:371::o;38057:577::-;38344:6;38333:9;38326:25;38387:6;38382:2;38371:9;38367:18;38360:34;38430:6;38425:2;38414:9;38410:18;38403:34;38473:6;38468:2;38457:9;38453:18;38446:34;38517:3;38511;38500:9;38496:19;38489:32;38307:4;38538:46;38579:3;38568:9;38564:19;38556:6;38538:46;:::i;:::-;38530:54;;38621:6;38615:3;38604:9;38600:19;38593:35;38057:577;;;;;;;;;:::o;39034:217::-;39074:1;39100;39090:132;;39144:10;39139:3;39135:20;39132:1;39125:31;39179:4;39176:1;39169:15;39207:4;39204:1;39197:15;39090:132;-1:-1:-1;39236:9:70;;39034:217::o" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "allocationProvisionTracker(address)": "6234e216", + "claims(bytes32)": "eff0f592", + "claimsLists(address)": "13c474c9", + "closeStaleAllocation(address)": "ec9c218d", + "collect(address,uint8,bytes)": "b15d2a2c", + "curationFeesCut()": "138dea08", + "eip712Domain()": "84b0196e", + "encodeAllocationProof(address,address)": "ce56c98b", + "feesProvisionTracker(address)": "cbe5f3f2", + "getAllocation(address)": "0e022923", + "getAllocationData(address)": "55c85269", + "getCuration()": "c0f47497", + "getDelegationRatio()": "1ebb7c30", + "getDisputeManager()": "db9bee46", + "getGraphTallyCollector()": "ebf6ddaf", + "getLegacyAllocation(address)": "6d9a3951", + "getProvisionTokensRange()": "819ba366", + "getSubgraphAllocatedTokens(bytes32)": "e2e1e8e9", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "indexers(address)": "4f793cdc", + "initialize(address,uint256,uint32,uint256)": "c84a5ef3", + "isOverAllocated(address)": "ba38f67d", + "maxPOIStaleness()": "85e82baf", + "migrateLegacyAllocation(address,address,bytes32)": "7dfe6d28", + "multicall(bytes[])": "ac9650d8", + "owner()": "8da5cb5b", + "pause()": "8456cb59", + "pauseGuardians(address)": "9384e078", + "paused()": "5c975abb", + "paymentsDestination(address)": "07e736d8", + "register(address,bytes)": "24b8fbf6", + "releaseStake(uint256)": "45f54485", + "renounceOwnership()": "715018a6", + "resizeAllocation(address,address,uint256)": "81e777a7", + "setCurationCut(uint256)": "7e89bac3", + "setDelegationRatio(uint32)": "1dd42f60", + "setMaxPOIStaleness(uint256)": "7aa31bce", + "setMinimumProvisionTokens(uint256)": "832bc923", + "setPauseGuardian(address,bool)": "35577962", + "setPaymentsDestination(address)": "6ccec5b8", + "setStakeToFeesRatio(uint256)": "e6f50054", + "slash(address,bytes)": "cb8347fe", + "stakeToFeesRatio()": "d07a7a84", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b", + "transferOwnership(address)": "f2fde38b", + "unpause()": "3f4ba83a" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputeManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"graphTallyCollector\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"curation\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"closedAt\",\"type\":\"uint256\"}],\"name\":\"AllocationClosed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationManagerAllocationClosed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"AllocationManagerAllocationSameSize\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationManagerInvalidAllocationProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllocationManagerInvalidZeroAllocationId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"DataServiceFeesClaimNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataServiceFeesZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"DataServicePausableNotPauseGuardian\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"DataServicePausablePauseGuardianNoChange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputeManager\",\"type\":\"address\"}],\"name\":\"DirectoryNotDisputeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"LegacyAllocationAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListEmptyList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListInvalidIterations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListInvalidZeroId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedListMaxElementsExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"PPMMathInvalidMulPPM\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionManagerInvalidValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"ProvisionManagerNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionManagerProvisionNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensAvailable\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensRequired\",\"type\":\"uint256\"}],\"name\":\"ProvisionTrackerInsufficientTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"SubgraphServiceAllocationIsAltruistic\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"SubgraphServiceAllocationNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"SubgraphServiceCannotForceCloseAllocation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceEmptyGeohash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceEmptyUrl\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balanceBefore\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balanceAfter\",\"type\":\"uint256\"}],\"name\":\"SubgraphServiceInconsistentCollection\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceIndexerAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providedIndexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"expectedIndexer\",\"type\":\"address\"}],\"name\":\"SubgraphServiceIndexerMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"SubgraphServiceIndexerNotRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"}],\"name\":\"SubgraphServiceInvalidCollectionId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"curationCut\",\"type\":\"uint256\"}],\"name\":\"SubgraphServiceInvalidCurationCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"}],\"name\":\"SubgraphServiceInvalidPaymentType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ravIndexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationIndexer\",\"type\":\"address\"}],\"name\":\"SubgraphServiceInvalidRAV\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceInvalidZeroStakeToFeesRatio\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"forceClosed\",\"type\":\"bool\"}],\"name\":\"AllocationClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"currentEpoch\",\"type\":\"uint256\"}],\"name\":\"AllocationCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldTokens\",\"type\":\"uint256\"}],\"name\":\"AllocationResized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"curationCut\",\"type\":\"uint256\"}],\"name\":\"CurationCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"ratio\",\"type\":\"uint32\"}],\"name\":\"DelegationRatioSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensIndexerRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensDelegationRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"poiMetadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"currentEpoch\",\"type\":\"uint256\"}],\"name\":\"IndexingRewardsCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"LegacyAllocationMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxPOIStaleness\",\"type\":\"uint256\"}],\"name\":\"MaxPOIStalenessSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"PauseGuardianSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymentsDestination\",\"type\":\"address\"}],\"name\":\"PaymentsDestinationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"ProvisionTokensRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensCollected\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensCurators\",\"type\":\"uint256\"}],\"name\":\"QueryFeesCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockTimestamp\",\"type\":\"uint256\"}],\"name\":\"StakeClaimLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"}],\"name\":\"StakeClaimReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimsCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensReleased\",\"type\":\"uint256\"}],\"name\":\"StakeClaimsReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"}],\"name\":\"StakeToFeesRatioSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subgraphService\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"disputeManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTallyCollector\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"curation\",\"type\":\"address\"}],\"name\":\"SubgraphServiceDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"ThawingPeriodRangeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"min\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"VerifierCutRangeSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"allocationProvisionTracker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"nextClaim\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"claimsLists\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"head\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"tail\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"closeStaleAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"curationFeesCut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"encodeAllocationProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"feesProvisionTracker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getAllocation\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"closedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastPOIPresentedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPending\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAtEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct Allocation.State\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getAllocationData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCuration\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDisputeManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGraphTallyCollector\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getLegacyAllocation\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"internalType\":\"struct LegacyAllocation.State\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"getSubgraphAllocatedTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"indexers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"registeredAt\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"geoHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumProvisionTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maximumDelegationRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"stakeToFeesRatio_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"isOverAllocated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxPOIStaleness\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentID\",\"type\":\"bytes32\"}],\"name\":\"migrateLegacyAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pauseGuardian\",\"type\":\"address\"}],\"name\":\"pauseGuardians\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"paymentsDestination\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numClaimsToRelease\",\"type\":\"uint256\"}],\"name\":\"releaseStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"resizeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"curationCut\",\"type\":\"uint256\"}],\"name\":\"setCurationCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"delegationRatio\",\"type\":\"uint32\"}],\"name\":\"setDelegationRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxPOIStaleness_\",\"type\":\"uint256\"}],\"name\":\"setMaxPOIStaleness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minimumProvisionTokens\",\"type\":\"uint256\"}],\"name\":\"setMinimumProvisionTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pauseGuardian\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setPauseGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"paymentsDestination_\",\"type\":\"address\"}],\"name\":\"setPaymentsDestination\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeToFeesRatio_\",\"type\":\"uint256\"}],\"name\":\"setStakeToFeesRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeToFeesRatio\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"AllocationAlreadyExists(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"AllocationClosed(address,uint256)\":[{\"params\":{\"allocationId\":\"The allocation id\",\"closedAt\":\"The timestamp when the allocation was closed\"}}],\"AllocationDoesNotExist(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"AllocationManagerAllocationClosed(address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\"}}],\"AllocationManagerAllocationSameSize(address,uint256)\":[{\"params\":{\"allocationId\":\"The id of the allocation\",\"tokens\":\"The amount of tokens\"}}],\"AllocationManagerInvalidAllocationProof(address,address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\",\"signer\":\"The address that signed the proof\"}}],\"DataServiceFeesClaimNotFound(bytes32)\":[{\"params\":{\"claimId\":\"The id of the stake claim\"}}],\"DataServicePausableNotPauseGuardian(address)\":[{\"params\":{\"account\":\"The address of the pause guardian\"}}],\"DataServicePausablePauseGuardianNoChange(address,bool)\":[{\"params\":{\"account\":\"The address of the pause guardian\",\"allowed\":\"The allowed status of the pause guardian\"}}],\"DirectoryNotDisputeManager(address,address)\":[{\"params\":{\"caller\":\"The caller address\",\"disputeManager\":\"The Dispute Manager address\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"LegacyAllocationAlreadyExists(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"PPMMathInvalidMulPPM(uint256,uint256)\":[{\"params\":{\"a\":\"The first value in the multiplication.\",\"b\":\"The second value in the multiplication.\"}}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"params\":{\"max\":\"The maximum value.\",\"min\":\"The minimum value.\"}}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"params\":{\"max\":\"The maximum allowed value.\",\"message\":\"The error message.\",\"min\":\"The minimum allowed value.\",\"value\":\"The value that is out of range.\"}}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"params\":{\"caller\":\"The address of the caller.\",\"serviceProvider\":\"The address of the serviceProvider.\"}}],\"ProvisionManagerProvisionNotFound(address)\":[{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}}],\"ProvisionTrackerInsufficientTokens(uint256,uint256)\":[{\"params\":{\"tokensAvailable\":\"The amount of tokens available\",\"tokensRequired\":\"The amount of tokens required\"}}],\"SubgraphServiceAllocationIsAltruistic(address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\"}}],\"SubgraphServiceAllocationNotAuthorized(address,address)\":[{\"params\":{\"allocationId\":\"The id of the allocation.\",\"indexer\":\"The address of the expected indexer.\"}}],\"SubgraphServiceCannotForceCloseAllocation(address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\"}}],\"SubgraphServiceInconsistentCollection(uint256,uint256)\":[{\"params\":{\"balanceAfter\":\"The contract GRT balance after the collection\",\"balanceBefore\":\"The contract GRT balance before the collection\"}}],\"SubgraphServiceIndexerMismatch(address,address)\":[{\"params\":{\"expectedIndexer\":\"The address of the expected indexer.\",\"providedIndexer\":\"The address of the provided indexer.\"}}],\"SubgraphServiceIndexerNotRegistered(address)\":[{\"params\":{\"indexer\":\"The address of the indexer that is not registered\"}}],\"SubgraphServiceInvalidCollectionId(bytes32)\":[{\"params\":{\"collectionId\":\"The collectionId\"}}],\"SubgraphServiceInvalidCurationCut(uint256)\":[{\"params\":{\"curationCut\":\"The curation cut value\"}}],\"SubgraphServiceInvalidPaymentType(uint8)\":[{\"params\":{\"paymentType\":\"The payment type that is not supported\"}}],\"SubgraphServiceInvalidRAV(address,address)\":[{\"params\":{\"allocationIndexer\":\"The address of the allocation indexer\",\"ravIndexer\":\"The address of the RAV indexer\"}}]},\"events\":{\"AllocationClosed(address,address,bytes32,uint256,bool)\":{\"details\":\"Emitted when an indexer closes an allocation\",\"params\":{\"allocationId\":\"The id of the allocation\",\"forceClosed\":\"Whether the allocation was force closed\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokens\":\"The amount of tokens allocated\"}},\"AllocationCreated(address,address,bytes32,uint256,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"currentEpoch\":\"The current epoch\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokens\":\"The amount of tokens allocated\"}},\"AllocationResized(address,address,bytes32,uint256,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"newTokens\":\"The new amount of tokens allocated\",\"oldTokens\":\"The old amount of tokens allocated\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\"}},\"CurationCutSet(uint256)\":{\"params\":{\"curationCut\":\"The curation cut\"}},\"DelegationRatioSet(uint32)\":{\"params\":{\"ratio\":\"The delegation ratio\"}},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"IndexingRewardsCollected(address,address,bytes32,uint256,uint256,uint256,bytes32,bytes,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"currentEpoch\":\"The current epoch\",\"indexer\":\"The address of the indexer\",\"poi\":\"The POI presented\",\"poiMetadata\":\"The metadata associated with the POI\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokensDelegationRewards\":\"The amount of tokens collected for delegators\",\"tokensIndexerRewards\":\"The amount of tokens collected for the indexer\",\"tokensRewards\":\"The amount of tokens collected\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LegacyAllocationMigrated(address,address,bytes32)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\"}},\"MaxPOIStalenessSet(uint256)\":{\"params\":{\"maxPOIStaleness\":\"The max POI staleness in seconds\"}},\"PauseGuardianSet(address,bool)\":{\"params\":{\"account\":\"The address of the pause guardian\",\"allowed\":\"The allowed status of the pause guardian\"}},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"PaymentsDestinationSet(address,address)\":{\"params\":{\"indexer\":\"The address of the indexer\",\"paymentsDestination\":\"The address where payments should be sent\"}},\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"params\":{\"max\":\"The maximum allowed value for the provision tokens.\",\"min\":\"The minimum allowed value for the provision tokens.\"}},\"QueryFeesCollected(address,address,address,bytes32,uint256,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"payer\":\"The address paying for the query fees\",\"serviceProvider\":\"The address of the service provider\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokensCollected\":\"The amount of tokens collected\",\"tokensCurators\":\"The amount of tokens curators receive\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens to lock in the claim\",\"unlockTimestamp\":\"The timestamp when the tokens can be released\"}},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"releasableAt\":\"The timestamp when the tokens were released\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens released\"}},\"StakeClaimsReleased(address,uint256,uint256)\":{\"params\":{\"claimsCount\":\"The number of stake claims being released\",\"serviceProvider\":\"The address of the service provider\",\"tokensReleased\":\"The total amount of tokens being released\"}},\"StakeToFeesRatioSet(uint256)\":{\"params\":{\"ratio\":\"The stake to fees ratio\"}},\"SubgraphServiceDirectoryInitialized(address,address,address,address)\":{\"params\":{\"curation\":\"The Curation contract address\",\"disputeManager\":\"The Dispute Manager contract address\",\"graphTallyCollector\":\"The Graph Tally Collector contract address\",\"subgraphService\":\"The Subgraph Service contract address\"}},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"params\":{\"max\":\"The maximum allowed value for the thawing period.\",\"min\":\"The minimum allowed value for the thawing period.\"}},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"params\":{\"max\":\"The maximum allowed value for the max verifier cut.\",\"min\":\"The minimum allowed value for the max verifier cut.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"closeStaleAllocation(address)\":{\"details\":\"This function can be permissionlessly called when the allocation is stale. This ensures that rewards for other allocations are not diluted by an inactive allocation. Requirements: - Allocation must exist and be open - Allocation must be stale - Allocation cannot be altruistic Emits a {AllocationClosed} event.\",\"params\":{\"allocationId\":\"The id of the allocation\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"constructor\":{\"details\":\"DataService and Directory constructors set a bunch of immutable variables\",\"params\":{\"curation\":\"The address of the Curation contract\",\"disputeManager\":\"The address of the DisputeManager contract\",\"graphController\":\"The address of the Graph Controller contract\",\"graphTallyCollector\":\"The address of the GraphTallyCollector contract\"}},\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"},\"encodeAllocationProof(address,address)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\"},\"returns\":{\"_0\":\"The encoded allocation proof\"}},\"getAllocation(address)\":{\"params\":{\"allocationId\":\"The id of the allocation\"},\"returns\":{\"_0\":\"The allocation details\"}},\"getAllocationData(address)\":{\"details\":\"Get allocation data to calculate rewards issuance \",\"params\":{\"allocationId\":\"The allocation Id\"},\"returns\":{\"_0\":\"Whether the allocation is active or not\",\"_1\":\"The indexer address\",\"_2\":\"Subgraph deployment id for the allocation\",\"_3\":\"Amount of allocated tokens\",\"_4\":\"Rewards snapshot\",\"_5\":\"Snapshot of accumulated rewards from previous allocation resizing, pending to be claimed\"}},\"getCuration()\":{\"returns\":{\"_0\":\"The address of the curation contract\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getDisputeManager()\":{\"returns\":{\"_0\":\"The address of the dispute manager\"}},\"getGraphTallyCollector()\":{\"returns\":{\"_0\":\"The address of the graph tally collector\"}},\"getLegacyAllocation(address)\":{\"params\":{\"allocationId\":\"The id of the allocation\"},\"returns\":{\"_0\":\"The legacy allocation details\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getSubgraphAllocatedTokens(bytes32)\":{\"params\":{\"_subgraphDeploymentId\":\"Deployment Id for the subgraph\"},\"returns\":{\"_0\":\"Total tokens allocated to subgraph\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"initialize(address,uint256,uint32,uint256)\":{\"details\":\"The thawingPeriod and verifierCut ranges are not set here because they are variables on the DisputeManager. We use the {ProvisionManager} overrideable getters to get the ranges.\",\"params\":{\"maximumDelegationRatio\":\"The maximum delegation ratio allowed for an allocation\",\"minimumProvisionTokens\":\"The minimum amount of provisioned tokens required to create an allocation\",\"owner\":\"The owner of the contract\",\"stakeToFeesRatio\":\"The ratio of stake to fees to lock when collecting query fees\"}},\"isOverAllocated(address)\":{\"params\":{\"allocationId\":\"The id of the allocation\"},\"returns\":{\"_0\":\"True if the indexer is over-allocated, false otherwise\"}},\"migrateLegacyAllocation(address,address,bytes32)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pause()\":{\"details\":\"Note that only functions using the modifiers `whenNotPaused` and `whenPaused` will be affected by the pause. Requirements: - The contract must not be already paused\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"releaseStake(uint256)\":{\"details\":\"This function is only meant to be called if the service provider has enough stake claims that releasing them all at once would exceed the block gas limit.This function can be overriden and/or disabled.Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\",\"params\":{\"numClaimsToRelease\":\"Amount of stake claims to process. If 0, all stake claims are processed.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"resizeAllocation(address,address,uint256)\":{\"details\":\"Requirements: - The indexer must be registered - The provision must be valid according to the subgraph service rules - `tokens` must be different from the current allocation size - The indexer must have enough available tokens to allocate if they are upsizing the allocation Emits a {AllocationResized} event. See {AllocationManager-_resizeAllocation} for more details.\",\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"tokens\":\"The new amount of tokens in the allocation\"}},\"setCurationCut(uint256)\":{\"details\":\"Emits a {CuratorCutSet} event\",\"params\":{\"curationCut\":\"The curation cut for the payment type\"}},\"setDelegationRatio(uint32)\":{\"params\":{\"delegationRatio\":\"The delegation ratio\"}},\"setMaxPOIStaleness(uint256)\":{\"params\":{\"maxPOIStaleness\":\"The max POI staleness in seconds\"}},\"setMinimumProvisionTokens(uint256)\":{\"params\":{\"minimumProvisionTokens\":\"The minimum amount of provisioned tokens required to create an allocation\"}},\"setPauseGuardian(address,bool)\":{\"params\":{\"allowed\":\"True if the pause guardian is allowed to pause the contract, false otherwise\",\"pauseGuardian\":\"The address of the pause guardian\"}},\"setPaymentsDestination(address)\":{\"details\":\"Emits a {PaymentsDestinationSet} event\",\"params\":{\"paymentsDestination\":\"The address where payments should be sent\"}},\"setStakeToFeesRatio(uint256)\":{\"params\":{\"stakeToFeesRatio\":\"The stake to fees ratio\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unpause()\":{\"details\":\"Note that only functions using the modifiers `whenNotPaused` and `whenPaused` will be affected by the pause. Requirements: - The contract must be paused\"}},\"title\":\"SubgraphService contract\",\"version\":1},\"userdoc\":{\"errors\":{\"AllocationAlreadyExists(address)\":[{\"notice\":\"Thrown when attempting to create an allocation with an existing id\"}],\"AllocationClosed(address,uint256)\":[{\"notice\":\"Thrown when trying to perform an operation on a closed allocation\"}],\"AllocationDoesNotExist(address)\":[{\"notice\":\"Thrown when trying to perform an operation on a non-existent allocation\"}],\"AllocationManagerAllocationClosed(address)\":[{\"notice\":\"Thrown when attempting to collect indexing rewards on a closed allocationl\"}],\"AllocationManagerAllocationSameSize(address,uint256)\":[{\"notice\":\"Thrown when attempting to resize an allocation with the same size\"}],\"AllocationManagerInvalidAllocationProof(address,address)\":[{\"notice\":\"Thrown when an allocation proof is invalid Both `signer` and `allocationId` should match for a valid proof.\"}],\"AllocationManagerInvalidZeroAllocationId()\":[{\"notice\":\"Thrown when attempting to create an allocation with a zero allocation id\"}],\"DataServiceFeesClaimNotFound(bytes32)\":[{\"notice\":\"Thrown when attempting to get a stake claim that does not exist.\"}],\"DataServiceFeesZeroTokens()\":[{\"notice\":\"Emitted when trying to lock zero tokens in a stake claim\"}],\"DataServicePausableNotPauseGuardian(address)\":[{\"notice\":\"Emitted when a the caller is not a pause guardian\"}],\"DataServicePausablePauseGuardianNoChange(address,bool)\":[{\"notice\":\"Emitted when a pause guardian is set to the same allowed status\"}],\"DirectoryNotDisputeManager(address,address)\":[{\"notice\":\"Thrown when the caller is not the Dispute Manager\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}],\"LegacyAllocationAlreadyExists(address)\":[{\"notice\":\"Thrown when attempting to migrate an allocation with an existing id\"}],\"LinkedListEmptyList()\":[{\"notice\":\"Thrown when trying to remove an item from an empty list\"}],\"LinkedListInvalidIterations()\":[{\"notice\":\"Thrown when trying to traverse a list with more iterations than elements\"}],\"LinkedListInvalidZeroId()\":[{\"notice\":\"Thrown when trying to add an item with id equal to bytes32(0)\"}],\"LinkedListMaxElementsExceeded()\":[{\"notice\":\"Thrown when trying to add an item to a list that has reached the maximum number of elements\"}],\"PPMMathInvalidMulPPM(uint256,uint256)\":[{\"notice\":\"Thrown when no value in a multiplication is in PPM.\"}],\"ProvisionManagerInvalidRange(uint256,uint256)\":[{\"notice\":\"Thrown when attempting to set a range where min is greater than max.\"}],\"ProvisionManagerInvalidValue(bytes,uint256,uint256,uint256)\":[{\"notice\":\"Thrown when a provision parameter is out of range.\"}],\"ProvisionManagerNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the caller is not authorized to manage the provision of a service provider.\"}],\"ProvisionManagerProvisionNotFound(address)\":[{\"notice\":\"Thrown when a provision is not found.\"}],\"ProvisionTrackerInsufficientTokens(uint256,uint256)\":[{\"notice\":\"Thrown when trying to lock more tokens than available\"}],\"SubgraphServiceAllocationIsAltruistic(address)\":[{\"notice\":\"Thrown when trying to force close an altruistic allocation\"}],\"SubgraphServiceAllocationNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the indexer in the allocation state does not match the expected indexer.\"}],\"SubgraphServiceCannotForceCloseAllocation(address)\":[{\"notice\":\"Thrown when trying to force close an allocation that is not stale and the indexer is not over-allocated\"}],\"SubgraphServiceEmptyGeohash()\":[{\"notice\":\"Thrown when an indexer tries to register with an empty geohash\"}],\"SubgraphServiceEmptyUrl()\":[{\"notice\":\"Thrown when an indexer tries to register with an empty URL\"}],\"SubgraphServiceInconsistentCollection(uint256,uint256)\":[{\"notice\":\"Thrown when the contract GRT balance is inconsistent after collecting from Graph Payments\"}],\"SubgraphServiceIndexerAlreadyRegistered()\":[{\"notice\":\"Thrown when an indexer tries to register but they are already registered\"}],\"SubgraphServiceIndexerMismatch(address,address)\":[{\"notice\":\"@notice Thrown when the service provider in the RAV does not match the expected indexer.\"}],\"SubgraphServiceIndexerNotRegistered(address)\":[{\"notice\":\"Thrown when an indexer tries to perform an operation but they are not registered\"}],\"SubgraphServiceInvalidCollectionId(bytes32)\":[{\"notice\":\"Thrown when collectionId is not a valid address\"}],\"SubgraphServiceInvalidCurationCut(uint256)\":[{\"notice\":\"Thrown when trying to set a curation cut that is not a valid PPM value\"}],\"SubgraphServiceInvalidPaymentType(uint8)\":[{\"notice\":\"Thrown when an indexer tries to collect fees for an unsupported payment type\"}],\"SubgraphServiceInvalidRAV(address,address)\":[{\"notice\":\"Thrown when collecting a RAV where the RAV indexer is not the same as the allocation indexer\"}],\"SubgraphServiceInvalidZeroStakeToFeesRatio()\":[{\"notice\":\"Thrown when trying to set stake to fees ratio to zero\"}]},\"events\":{\"AllocationCreated(address,address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when an indexer creates an allocation\"},\"AllocationResized(address,address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when an indexer resizes an allocation\"},\"CurationCutSet(uint256)\":{\"notice\":\"Emitted when curator cuts are set\"},\"DelegationRatioSet(uint32)\":{\"notice\":\"Emitted when the delegation ratio is set.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"IndexingRewardsCollected(address,address,bytes32,uint256,uint256,uint256,bytes32,bytes,uint256)\":{\"notice\":\"Emitted when an indexer collects indexing rewards for an allocation\"},\"LegacyAllocationMigrated(address,address,bytes32)\":{\"notice\":\"Emitted when a legacy allocation is migrated into the subgraph service\"},\"MaxPOIStalenessSet(uint256)\":{\"notice\":\"Emitted when the maximum POI staleness is updated\"},\"PauseGuardianSet(address,bool)\":{\"notice\":\"Emitted when a pause guardian is set.\"},\"PaymentsDestinationSet(address,address)\":{\"notice\":\"Emitted when an indexer sets a new payments destination\"},\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"ProvisionTokensRangeSet(uint256,uint256)\":{\"notice\":\"Emitted when the provision tokens range is set.\"},\"QueryFeesCollected(address,address,address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a subgraph service collects query fees from Graph Payments\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is created and stake is locked.\"},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is released and stake is unlocked.\"},\"StakeClaimsReleased(address,uint256,uint256)\":{\"notice\":\"Emitted when a series of stake claims are released.\"},\"StakeToFeesRatioSet(uint256)\":{\"notice\":\"Emitted when the stake to fees ratio is set.\"},\"SubgraphServiceDirectoryInitialized(address,address,address,address)\":{\"notice\":\"Emitted when the Directory is initialized\"},\"ThawingPeriodRangeSet(uint64,uint64)\":{\"notice\":\"Emitted when the thawing period range is set.\"},\"VerifierCutRangeSet(uint32,uint32)\":{\"notice\":\"Emitted when the verifier cut range is set.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"allocationProvisionTracker(address)\":{\"notice\":\"Tracks allocated tokens per indexer\"},\"claims(bytes32)\":{\"notice\":\"List of all locked stake claims to be released to service providers\"},\"claimsLists(address)\":{\"notice\":\"Service providers registered in the data service\"},\"closeStaleAllocation(address)\":{\"notice\":\"Force close a stale allocation\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"constructor\":{\"notice\":\"Constructor for the SubgraphService contract\"},\"curationFeesCut()\":{\"notice\":\"The cut curators take from query fee payments. In PPM.\"},\"encodeAllocationProof(address,address)\":{\"notice\":\"Encodes the allocation proof for EIP712 signing\"},\"feesProvisionTracker(address)\":{\"notice\":\"The amount of tokens locked in stake claims for each service provider\"},\"getAllocation(address)\":{\"notice\":\"Gets the details of an allocation For legacy allocations use {getLegacyAllocation}\"},\"getCuration()\":{\"notice\":\"Gets the address of the curation contract\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getDisputeManager()\":{\"notice\":\"Gets the address of the dispute manager\"},\"getGraphTallyCollector()\":{\"notice\":\"Gets the address of the graph tally collector\"},\"getLegacyAllocation(address)\":{\"notice\":\"Gets the details of a legacy allocation For non-legacy allocations use {getAllocation}\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getSubgraphAllocatedTokens(bytes32)\":{\"notice\":\"Return the total amount of tokens allocated to subgraph.\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"indexers(address)\":{\"notice\":\"Service providers registered in the data service\"},\"initialize(address,uint256,uint32,uint256)\":{\"notice\":\"Initialize the contract\"},\"isOverAllocated(address)\":{\"notice\":\"Checks if an indexer is over-allocated\"},\"maxPOIStaleness()\":{\"notice\":\"Maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards\"},\"migrateLegacyAllocation(address,address,bytes32)\":{\"notice\":\"Imports a legacy allocation id into the subgraph service This is a governor only action that is required to prevent indexers from re-using allocation ids from the legacy staking contract.\"},\"pause()\":{\"notice\":\"Pauses the data service.\"},\"pauseGuardians(address)\":{\"notice\":\"List of pause guardians and their allowed status\"},\"paymentsDestination(address)\":{\"notice\":\"Destination of indexer payments\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"releaseStake(uint256)\":{\"notice\":\"Releases expired stake claims for the caller.\"},\"resizeAllocation(address,address,uint256)\":{\"notice\":\"Change the amount of tokens in an allocation\"},\"setCurationCut(uint256)\":{\"notice\":\"Sets the curators payment cut for query fees\"},\"setDelegationRatio(uint32)\":{\"notice\":\"Sets the delegation ratio\"},\"setMaxPOIStaleness(uint256)\":{\"notice\":\"Sets the max POI staleness See {AllocationManagerV1Storage-maxPOIStaleness} for more details.\"},\"setMinimumProvisionTokens(uint256)\":{\"notice\":\"Sets the minimum amount of provisioned tokens required to create an allocation\"},\"setPauseGuardian(address,bool)\":{\"notice\":\"Sets a pause guardian\"},\"setPaymentsDestination(address)\":{\"notice\":\"Sets the payments destination for an indexer to receive payments\"},\"setStakeToFeesRatio(uint256)\":{\"notice\":\"Sets the stake to fees ratio\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"stakeToFeesRatio()\":{\"notice\":\"Multiplier for how many tokens back collected query fees\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"},\"unpause()\":{\"notice\":\"Unpauses the data service.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/SubgraphService.sol\":\"SubgraphService\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\":{\"keccak256\":\"0x7bd336193785ed6f09a3bd847f9208f64aa9b87ad67c40838d00fec41bb153d5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d96d83cdb9bbb567e4eafac8bdef3ff6bdaf426338baf76bae277c11afb33cee\",\"dweb:/ipfs/QmNjr4PiJ76Wc5mFqa9H88BjsEMrUfy1jiftNHYTgd6Mp5\"]},\"@graphprotocol/horizon/contracts/data-service/DataService.sol\":{\"keccak256\":\"0xa57fda8ea4c94a2cda061a6c8f29ae215241b0af03a43df3bc622051d8b2493c\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://7fc433ef0eb71c264224e9058de7e9aea3b2dbfab68dbdf0df8a13de82e90ef6\",\"dweb:/ipfs/QmVrp6kv8Ef1AP38C4soa1cnnRqqmKFnHer2VrXms52Asy\"]},\"@graphprotocol/horizon/contracts/data-service/DataServiceStorage.sol\":{\"keccak256\":\"0x615aac9d5c9cd04216fa9ee21c770f3877a2971a1c023052143c95c08b87610f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd4eb031e9ab86e3a17df29fcb297621e88850c3c5db123925d24b77c802b037\",\"dweb:/ipfs/QmSCNfQqMzui9gaN3Rf8nTNJBPWSFNqFgexbK2k6GBN381\"]},\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFees.sol\":{\"keccak256\":\"0xa9e95b7ca9af3987697c06b252fdb12e1d01e5c62c123c17f39f03d96d38876f\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://d86b520570fb3dd76b60fc64eabe6a7104b41a96a9c92e9031c91a799287d749\",\"dweb:/ipfs/QmZGaiEZVfycnQu4EkPWGM7Jg3jo4jdEuLeuZxAMPMg5s6\"]},\"@graphprotocol/horizon/contracts/data-service/extensions/DataServiceFeesStorage.sol\":{\"keccak256\":\"0x9068f639ea7aad02d842eb0054cadc3a5f05044d8d0176dc4c9ff60693775bc0\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://9e22fd5157ea02064104b02952c327ab58b0a5c70c7356d94017f3e03da298d4\",\"dweb:/ipfs/QmdTZAFaZWSpVUvWTnUgednbRNLMbFvUMKZ5FHkjhRk4Qf\"]},\"@graphprotocol/horizon/contracts/data-service/extensions/DataServicePausableUpgradeable.sol\":{\"keccak256\":\"0x57790344249a2d9fac827173389665a678619103d3baba0df0f9ec72f514cba7\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://964b818fdefcaf55cfd1c8f7066c44032e8dc82f1569f35d875e86c147b94e23\",\"dweb:/ipfs/QmcsjNPCFbYPdLiTjmykgVSLXbZxA2pJ1N7JXaWtxJzZet\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServicePausable.sol\":{\"keccak256\":\"0x6e65df59821dce2e4c9c221e1381eac69534464b8c69c83c2f18bff188e120f5\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bd7f1d4d7b1d9de204580678f24fbe453235bbc1fbb15f65f022619a419b11a8\",\"dweb:/ipfs/QmP7JnK6Buor5bvRFcb427ACJKTwX6mnJb31TJzKL4EnSD\"]},\"@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol\":{\"keccak256\":\"0xc0f433a20f91fb2c2c588d5accfd311535314d71f7adc4e2b84fa4193ed1a739\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a920d9446c3e76783921d2f2d980a058f41700de1d59470c9b3892a49ebcaf48\",\"dweb:/ipfs/QmcwmqNkxS1BpJQ7kgf4V9F98w2MKcVvg2N7P3i8KtDSF4\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol\":{\"keccak256\":\"0x63e7f1df10586beb7f8683065719fbff045437508539a9358c25a13fcf989f91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b32f9a7be91ae6d9c9a6edbe2404efbcf9fa99c1d503f4a688054be468494a8e\",\"dweb:/ipfs/QmQ5AQXsBPxtJSW24LqRZAaYYaz1518FpUCHfDEdsMfF8F\"]},\"@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManagerStorage.sol\":{\"keccak256\":\"0xe44f72a63c472a6de42e08a2d732044fe1ac9245c4203d4e1eb941b1a2fa2159\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://412708a4f94b5757e46676c5702e47d37fdbdacbe53f70e2ee93d37c5938e028\",\"dweb:/ipfs/Qmdw4uagDdKeCzyS319BKyPzfnWCvM3KCtNYosFBd3xGco\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol\":{\"keccak256\":\"0x762c26300d098fb1bdc5e6b52e0ffd0b497634e9bcfc9a9cd409df65d8d54590\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f5c68742e96c1483449c882b082631a9bfafebb27152b87427e1234d34e604f3\",\"dweb:/ipfs/QmYqtSeQpCbKEaKKDXwmeK5DrYFiwSHYVzM3dzanh7MQ3D\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol\":{\"keccak256\":\"0x0871e02129e1fabdb39024f9ac3368b4c747e6b374fdf4fc200d3c225ed82860\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a5fdf2dbedc15f739e6010a3ce3478ea7ad23bd643a8af3f39ccf631c06ebd52\",\"dweb:/ipfs/QmNusbPTqzzUwGomXBzsWHwbZMJ2HuTkxvgviLJZ6hr9i4\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/libraries/UintRange.sol\":{\"keccak256\":\"0x70d69069b2c122becd29ec4ea9a79f2e26cf7cbe7b1918ffced691ee00cdbd82\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://6bddc7d257c3df1fd4940dd3c554e5a1efbc1b23d50f7878415389b75380628c\",\"dweb:/ipfs/QmTQBCsL4pHoXMixVvDwGMdmJnGfEeeDZfHdJkcpKamu58\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol\":{\"keccak256\":\"0xe5775eb1fb17165cd191e8f8b2232dbea8765e7e610eaa3d6e52feead793ec5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://352614aea75c3d913cbcabb528be3d6c3335c3c77da41d59486a3193069dd095\",\"dweb:/ipfs/QmR3Nabxfme6tHrAMJCyK4MWZtpund2c4R7aFKmea3sGZM\"]},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"keccak256\":\"0xa6bf6b7efe0e6625a9dcd30c5ddf52c4c24fe8372f37c7de9dbf5034746768d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c353ee3705bbf6fadb84c0fb10ef1b736e8ca3ca1867814349d1487ed207beb\",\"dweb:/ipfs/QmcugaPssrzGGE8q4YZKm2ZhnD3kCijjcgdWWg76nWt3FY\"]},\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\":{\"keccak256\":\"0xd45a5b1d0e451376b08e1bc7e332426c24382053300acf0ac667be1b8abb6cc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://824eb0b8c71db8b95b707218d8540c2046a2fefc642e74b343ae90e5c72e2b52\",\"dweb:/ipfs/QmdQTZTomqxRrySDNdv1FEyh3ZWibxwC9FRdcV3DCuASpx\"]},\"@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xaaa1d17c1129b127a4a401db2fbd72960e2671474be3d08cae71ccdc42f7624c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cb2f27cd3952aa667e198fba0d9b7bcec52fbb12c16f013c25fe6fb52b29cc0e\",\"dweb:/ipfs/QmeuohBFoeyDPZA9JNCTEDz3VBfBD4EABWuWXVhHAuEpKR\"]},\"@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x81c274a60a7ae232ae3dc9ff3a4011b4849a853c13b0832cd3351bb1bb2f0dae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da0c20dc74358a2a76330818f3bac9d1e2ce3371aec847b9cbf5d147fbae4f6\",\"dweb:/ipfs/QmeczhmnFv1hbXKGLwbYXY6Rrytc9a5A2YaRi5QMMgjPnb\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"contracts/SubgraphService.sol\":{\"keccak256\":\"0x8b0db301d539c6186ba5024c6658386c3b7ce81022f4a5b6a34dfd04021b3e2d\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://e892e736172dbfe02d3413b70c979d103d133f416b5a9ffa5c6e1a409639c0ec\",\"dweb:/ipfs/QmUfEU6JV5b1fncAzSqv76VhBTTY46pwoF4NhtGeteAgDf\"]},\"contracts/SubgraphServiceStorage.sol\":{\"keccak256\":\"0xe7b9b6fb8f101f99dff6cb27d55089a60e158629e8b67366a009b2a22d0565e8\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a686dcf3fdce62bff8f41e7e018b54ecc5b3451f4b761b63c0c0f2165a5416c8\",\"dweb:/ipfs/QmNjngfvNkxtP2NeF8ZwAmFWnw4Wz9pwvwFu9DvtF1c6Sw\"]},\"contracts/interfaces/IDisputeManager.sol\":{\"keccak256\":\"0x9db8ffdf7fe30954824ed706a1a5e7c2d6323b745bddba16b7166a639344f9f7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e5d810bf6188c38a028dab511c5653fde7b7feca0a173f03974402a83cb234f9\",\"dweb:/ipfs/QmYGtytqHeDFK91FmSNL5iavD8sHUFcA47WBU9BuHG3i75\"]},\"contracts/interfaces/ISubgraphService.sol\":{\"keccak256\":\"0x7516f80b0a8b2e3edeedf06c9b917f2a24e557f8c00632e6150fbb41ef8da3ce\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ad4f813111541f5ef9ea6236f42822a3a66364d24189e4568450b20e09972a5e\",\"dweb:/ipfs/QmVYQA9rT7T8YnQgAB6fokNYDJeDrgQqrjfJ8sGjySNFBo\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]},\"contracts/utilities/AllocationManager.sol\":{\"keccak256\":\"0xe48e4486cb11da8e2f24afe998ae1f8ab7e2eed0edeff2ff8eb47e120ed32c91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://0f7336a767d5b959f8cbeb9453834d887c28c9e9e4217d3bacf7faf01aaff33f\",\"dweb:/ipfs/QmQ6twAz4MfREzPbDttCMJqCuo2YNr8ks6R8ZzrJBR3daV\"]},\"contracts/utilities/AllocationManagerStorage.sol\":{\"keccak256\":\"0x45317fa3daef1ebca670b1d3ba19579d7a46b8b19daff7e534a89a122b0fe178\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ecca9d9581e489225014f8879df4bdd69945f2f686fddeff41e31377670f6866\",\"dweb:/ipfs/QmURUHNSv8i9dtkmdaAJxXqDXfg6hbJXLwUqhHronA8Fwr\"]},\"contracts/utilities/Directory.sol\":{\"keccak256\":\"0x8f8b8d8dd7cd1acee659a21c81782fd9955f364c5b37669c11c135c66371bd3a\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://c50bdf51e6d19d6413920c200b5ddbf07eaa3860b35822633cecf636fd96d29d\",\"dweb:/ipfs/QmTQfCXiKzqpZVJDd3NeLtQvwBTVDXfznVJjEASh4aso4k\"]}},\"version\":1}" + } + }, + "contracts/SubgraphServiceStorage.sol": { + "SubgraphServiceV1Storage": { + "abi": [ + { + "inputs": [], + "name": "curationFeesCut", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "indexers", + "outputs": [ + { + "internalType": "uint256", + "name": "registeredAt", + "type": "uint256" + }, + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "string", + "name": "geoHash", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "paymentsDestination", + "outputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeToFeesRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "curationFeesCut()": "138dea08", + "indexers(address)": "4f793cdc", + "paymentsDestination(address)": "07e736d8", + "stakeToFeesRatio()": "d07a7a84" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"curationFeesCut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"indexers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"registeredAt\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"geoHash\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"paymentsDestination\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeToFeesRatio\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SubgraphServiceStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"curationFeesCut()\":{\"notice\":\"The cut curators take from query fee payments. In PPM.\"},\"indexers(address)\":{\"notice\":\"Service providers registered in the data service\"},\"paymentsDestination(address)\":{\"notice\":\"Destination of indexer payments\"},\"stakeToFeesRatio()\":{\"notice\":\"Multiplier for how many tokens back collected query fees\"}},\"notice\":\"This contract holds all the storage variables for the Subgraph Service contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/SubgraphServiceStorage.sol\":\"SubgraphServiceV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/SubgraphServiceStorage.sol\":{\"keccak256\":\"0xe7b9b6fb8f101f99dff6cb27d55089a60e158629e8b67366a009b2a22d0565e8\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a686dcf3fdce62bff8f41e7e018b54ecc5b3451f4b761b63c0c0f2165a5416c8\",\"dweb:/ipfs/QmNjngfvNkxtP2NeF8ZwAmFWnw4Wz9pwvwFu9DvtF1c6Sw\"]},\"contracts/interfaces/ISubgraphService.sol\":{\"keccak256\":\"0x7516f80b0a8b2e3edeedf06c9b917f2a24e557f8c00632e6150fbb41ef8da3ce\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ad4f813111541f5ef9ea6236f42822a3a66364d24189e4568450b20e09972a5e\",\"dweb:/ipfs/QmVYQA9rT7T8YnQgAB6fokNYDJeDrgQqrjfJ8sGjySNFBo\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]}},\"version\":1}" + } + }, + "contracts/interfaces/IDisputeManager.sol": { + "IDisputeManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeAlreadyCreated", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerDisputeNotInConflict", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IDisputeManager.DisputeStatus", + "name": "status", + "type": "uint8" + } + ], + "name": "DisputeManagerDisputeNotPending", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodNotFinished", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerDisputePeriodZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "DisputeManagerIndexerNotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerInvalidDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidDisputeDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "cut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidFishermanReward", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "DisputeManagerInvalidMaxSlashingCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTokensSlash", + "type": "uint256" + } + ], + "name": "DisputeManagerInvalidTokensSlash", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "relatedDisputeId", + "type": "bytes32" + } + ], + "name": "DisputeManagerMustAcceptRelatedDispute", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "requestCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "requestCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID2", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonConflictingAttestations", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "subgraphDeploymentId1", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId2", + "type": "bytes32" + } + ], + "name": "DisputeManagerNonMatchingSubgraphDeployment", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotArbitrator", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerNotFisherman", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerSubgraphServiceNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "DisputeManagerZeroTokens", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "ArbitratorSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "DisputeDepositSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeDrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId1", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId2", + "type": "bytes32" + } + ], + "name": "DisputeLinked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "DisputePeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "DisputeRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "fishermanRewardCut", + "type": "uint32" + } + ], + "name": "FishermanRewardCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "IndexingDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "LegacyDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint32", + "name": "maxSlashingCut", + "type": "uint32" + } + ], + "name": "MaxSlashingCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "attestation", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeSnapshot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cancellableAt", + "type": "uint256" + } + ], + "name": "QueryDisputeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "subgraphService", + "type": "address" + } + ], + "name": "SubgraphServiceSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + } + ], + "name": "acceptDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "acceptDisputeInConflict", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "tokensSlashRelated", + "type": "uint256" + } + ], + "name": "acceptDisputeConflict", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation2", + "type": "tuple" + } + ], + "name": "areConflictingAttestations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "cancelDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "address", + "name": "fisherman", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokensSlash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + } + ], + "name": "createAndAcceptLegacyDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + } + ], + "name": "createIndexingDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData", + "type": "bytes" + } + ], + "name": "createQueryDispute", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "attestationData1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "attestationData2", + "type": "bytes" + } + ], + "name": "createQueryDisputeConflict", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "drawDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct Attestation.Receipt", + "name": "receipt", + "type": "tuple" + } + ], + "name": "encodeReceipt", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "requestCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "responseCID", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + } + ], + "internalType": "struct Attestation.State", + "name": "attestation", + "type": "tuple" + } + ], + "name": "getAttestationIndexer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputePeriod", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFishermanRewardCut", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "getStakeSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "arbitrator", + "type": "address" + }, + { + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "isDisputeCreated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "disputeId", + "type": "bytes32" + } + ], + "name": "rejectDispute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "arbitrator", + "type": "address" + } + ], + "name": "setArbitrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeDeposit", + "type": "uint256" + } + ], + "name": "setDisputeDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "disputePeriod", + "type": "uint64" + } + ], + "name": "setDisputePeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "fishermanRewardCut_", + "type": "uint32" + } + ], + "name": "setFishermanRewardCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "maxSlashingCut_", + "type": "uint32" + } + ], + "name": "setMaxSlashingCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "subgraphService", + "type": "address" + } + ], + "name": "setSubgraphService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptDispute(bytes32,uint256)": "050b17ad", + "acceptDisputeConflict(bytes32,uint256,bool,uint256)": "b0e2f7e9", + "areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))": "d36fc9d4", + "cancelDispute(bytes32)": "1792f194", + "createAndAcceptLegacyDispute(address,address,uint256,uint256)": "8d4e9008", + "createIndexingDispute(address,bytes32)": "4bc5839a", + "createQueryDispute(bytes)": "c50a77b1", + "createQueryDisputeConflict(bytes,bytes)": "c894222e", + "drawDispute(bytes32)": "9334ea52", + "encodeReceipt((bytes32,bytes32,bytes32))": "6369df6b", + "getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))": "c9747f51", + "getDisputePeriod()": "5aea0ec4", + "getFishermanRewardCut()": "bb2a2b47", + "getStakeSnapshot(address)": "c133b429", + "initialize(address,address,uint64,uint256,uint32,uint32)": "0bc7344b", + "isDisputeCreated(bytes32)": "be41f384", + "rejectDispute(bytes32)": "36167e03", + "setArbitrator(address)": "b0eefabe", + "setDisputeDeposit(uint256)": "16972978", + "setDisputePeriod(uint64)": "d76f62d1", + "setFishermanRewardCut(uint32)": "76c993ae", + "setMaxSlashingCut(uint32)": "9f81a7cf", + "setSubgraphService(address)": "93a90a1e" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerDisputeAlreadyCreated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerDisputeInConflict\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerDisputeNotInConflict\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum IDisputeManager.DisputeStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"DisputeManagerDisputeNotPending\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerDisputePeriodNotFinished\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerDisputePeriodZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"DisputeManagerIndexerNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerInvalidDispute\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"}],\"name\":\"DisputeManagerInvalidDisputeDeposit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"cut\",\"type\":\"uint32\"}],\"name\":\"DisputeManagerInvalidFishermanReward\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"maxSlashingCut\",\"type\":\"uint32\"}],\"name\":\"DisputeManagerInvalidMaxSlashingCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTokensSlash\",\"type\":\"uint256\"}],\"name\":\"DisputeManagerInvalidTokensSlash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"relatedDisputeId\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerMustAcceptRelatedDispute\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"requestCID2\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID2\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId2\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerNonConflictingAttestations\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId2\",\"type\":\"bytes32\"}],\"name\":\"DisputeManagerNonMatchingSubgraphDeployment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerNotArbitrator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerNotFisherman\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerSubgraphServiceNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputeManagerZeroTokens\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"arbitrator\",\"type\":\"address\"}],\"name\":\"ArbitratorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"}],\"name\":\"DisputeDepositSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeDrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId1\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId2\",\"type\":\"bytes32\"}],\"name\":\"DisputeLinked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"disputePeriod\",\"type\":\"uint64\"}],\"name\":\"DisputePeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"DisputeRejected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fishermanRewardCut\",\"type\":\"uint32\"}],\"name\":\"FishermanRewardCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeSnapshot\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cancellableAt\",\"type\":\"uint256\"}],\"name\":\"IndexingDisputeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensRewards\",\"type\":\"uint256\"}],\"name\":\"LegacyDisputeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxSlashingCut\",\"type\":\"uint32\"}],\"name\":\"MaxSlashingCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"attestation\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeSnapshot\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cancellableAt\",\"type\":\"uint256\"}],\"name\":\"QueryDisputeCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"subgraphService\",\"type\":\"address\"}],\"name\":\"SubgraphServiceSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"}],\"name\":\"acceptDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"acceptDisputeInConflict\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlashRelated\",\"type\":\"uint256\"}],\"name\":\"acceptDisputeConflict\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct Attestation.State\",\"name\":\"attestation1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct Attestation.State\",\"name\":\"attestation2\",\"type\":\"tuple\"}],\"name\":\"areConflictingAttestations\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"cancelDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fisherman\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokensSlash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensRewards\",\"type\":\"uint256\"}],\"name\":\"createAndAcceptLegacyDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"}],\"name\":\"createIndexingDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"attestationData\",\"type\":\"bytes\"}],\"name\":\"createQueryDispute\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"attestationData1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"attestationData2\",\"type\":\"bytes\"}],\"name\":\"createQueryDisputeConflict\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"drawDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"internalType\":\"struct Attestation.Receipt\",\"name\":\"receipt\",\"type\":\"tuple\"}],\"name\":\"encodeReceipt\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"requestCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"responseCID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"internalType\":\"struct Attestation.State\",\"name\":\"attestation\",\"type\":\"tuple\"}],\"name\":\"getAttestationIndexer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDisputePeriod\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFishermanRewardCut\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"getStakeSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"arbitrator\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"disputePeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"fishermanRewardCut_\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxSlashingCut_\",\"type\":\"uint32\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"isDisputeCreated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"disputeId\",\"type\":\"bytes32\"}],\"name\":\"rejectDispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"arbitrator\",\"type\":\"address\"}],\"name\":\"setArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"disputeDeposit\",\"type\":\"uint256\"}],\"name\":\"setDisputeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"disputePeriod\",\"type\":\"uint64\"}],\"name\":\"setDisputePeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"fishermanRewardCut_\",\"type\":\"uint32\"}],\"name\":\"setFishermanRewardCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"maxSlashingCut_\",\"type\":\"uint32\"}],\"name\":\"setMaxSlashingCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"subgraphService\",\"type\":\"address\"}],\"name\":\"setSubgraphService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"DisputeManagerDisputeAlreadyCreated(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerDisputeInConflict(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerDisputeNotInConflict(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerDisputeNotPending(uint8)\":[{\"params\":{\"status\":\"The status of the dispute\"}}],\"DisputeManagerIndexerNotFound(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"DisputeManagerInvalidDispute(bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\"}}],\"DisputeManagerInvalidDisputeDeposit(uint256)\":[{\"params\":{\"disputeDeposit\":\"The dispute deposit\"}}],\"DisputeManagerInvalidFishermanReward(uint32)\":[{\"params\":{\"cut\":\"The fisherman reward cut\"}}],\"DisputeManagerInvalidMaxSlashingCut(uint32)\":[{\"params\":{\"maxSlashingCut\":\"The max slashing cut\"}}],\"DisputeManagerInvalidTokensSlash(uint256,uint256)\":[{\"params\":{\"maxTokensSlash\":\"The max tokens slash\",\"tokensSlash\":\"The tokens slash\"}}],\"DisputeManagerMustAcceptRelatedDispute(bytes32,bytes32)\":[{\"params\":{\"disputeId\":\"The dispute id\",\"relatedDisputeId\":\"The related dispute id\"}}],\"DisputeManagerNonConflictingAttestations(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)\":[{\"params\":{\"requestCID1\":\"The request CID of the first attestation\",\"requestCID2\":\"The request CID of the second attestation\",\"responseCID1\":\"The response CID of the first attestation\",\"responseCID2\":\"The response CID of the second attestation\",\"subgraphDeploymentId1\":\"The subgraph deployment id of the first attestation\",\"subgraphDeploymentId2\":\"The subgraph deployment id of the second attestation\"}}],\"DisputeManagerNonMatchingSubgraphDeployment(bytes32,bytes32)\":[{\"params\":{\"subgraphDeploymentId1\":\"The subgraph deployment id of the first attestation\",\"subgraphDeploymentId2\":\"The subgraph deployment id of the second attestation\"}}]},\"events\":{\"ArbitratorSet(address)\":{\"params\":{\"arbitrator\":\"The address of the arbitrator.\"}},\"DisputeAccepted(bytes32,address,address,uint256)\":{\"details\":\"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.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens transferred to the fisherman, the deposit plus reward\"}},\"DisputeCancelled(bytes32,address,address,uint256)\":{\"details\":\"Emitted when a dispute is cancelled by the fisherman. The event emits the amount `tokens` returned to the fisherman.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens returned to the fisherman - the deposit\"}},\"DisputeDepositSet(uint256)\":{\"params\":{\"disputeDeposit\":\"The dispute deposit required to create a dispute.\"}},\"DisputeDrawn(bytes32,address,address,uint256)\":{\"details\":\"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.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens returned to the fisherman - the deposit\"}},\"DisputeLinked(bytes32,bytes32)\":{\"details\":\"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.\",\"params\":{\"disputeId1\":\"The first dispute id\",\"disputeId2\":\"The second dispute id\"}},\"DisputePeriodSet(uint64)\":{\"params\":{\"disputePeriod\":\"The dispute period in seconds.\"}},\"DisputeRejected(bytes32,address,address,uint256)\":{\"details\":\"Emitted when arbitrator rejects a `disputeId` for `indexer` created by `fisherman`. The event emits the amount `tokens` burned from the fisherman deposit.\",\"params\":{\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"tokens\":\"The amount of tokens burned from the fisherman deposit\"}},\"FishermanRewardCutSet(uint32)\":{\"params\":{\"fishermanRewardCut\":\"The fisherman reward cut.\"}},\"IndexingDisputeCreated(bytes32,address,address,uint256,address,bytes32,uint256,uint256)\":{\"details\":\"Emitted when an indexing dispute is created for `allocationId` and `indexer` by `fisherman`. The event emits the amount of `tokens` deposited by the fisherman.\",\"params\":{\"allocationId\":\"The allocation id\",\"cancellableAt\":\"The timestamp when the dispute can be cancelled\",\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"poi\":\"The POI\",\"stakeSnapshot\":\"The stake snapshot of the indexer at the time of the dispute\",\"tokens\":\"The amount of tokens deposited by the fisherman\"}},\"LegacyDisputeCreated(bytes32,address,address,address,uint256,uint256)\":{\"details\":\"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.\",\"params\":{\"allocationId\":\"The allocation id\",\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address to be credited with the rewards\",\"indexer\":\"The indexer address\",\"tokensRewards\":\"The amount of tokens to reward the fisherman\",\"tokensSlash\":\"The amount of tokens to slash\"}},\"MaxSlashingCutSet(uint32)\":{\"params\":{\"maxSlashingCut\":\"The maximum slashing cut that can be set.\"}},\"QueryDisputeCreated(bytes32,address,address,uint256,bytes32,bytes,uint256,uint256)\":{\"details\":\"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.\",\"params\":{\"attestation\":\"The attestation\",\"cancellableAt\":\"The timestamp when the dispute can be cancelled\",\"disputeId\":\"The dispute id\",\"fisherman\":\"The fisherman address\",\"indexer\":\"The indexer address\",\"stakeSnapshot\":\"The stake snapshot of the indexer at the time of the dispute\",\"subgraphDeploymentId\":\"The subgraph deployment id\",\"tokens\":\"The amount of tokens deposited by the fisherman\"}},\"SubgraphServiceSet(address)\":{\"params\":{\"subgraphService\":\"The address of the subgraph service.\"}}},\"kind\":\"dev\",\"methods\":{\"acceptDispute(bytes32,uint256)\":{\"details\":\"Accept a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be accepted\",\"tokensSlash\":\"Amount of tokens to slash from the indexer\"}},\"acceptDisputeConflict(bytes32,uint256,bool,uint256)\":{\"params\":{\"acceptDisputeInConflict\":\"Accept the conflicting dispute. Otherwise it will be drawn automatically\",\"disputeId\":\"Id of the dispute to be accepted\",\"tokensSlash\":\"Amount of tokens to slash from the indexer for the first dispute\",\"tokensSlashRelated\":\"Amount of tokens to slash from the indexer for the related dispute in case acceptDisputeInConflict is true, otherwise it will be ignored\"}},\"areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"params\":{\"attestation1\":\"The first attestation\",\"attestation2\":\"The second attestation\"},\"returns\":{\"_0\":\"Whether the attestations are conflicting\"}},\"cancelDispute(bytes32)\":{\"details\":\"Cancel a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be cancelled\"}},\"createAndAcceptLegacyDispute(address,address,uint256,uint256)\":{\"params\":{\"allocationId\":\"The allocation to dispute\",\"fisherman\":\"The fisherman address to be credited with the rewards\",\"tokensRewards\":\"The amount of tokens to reward the fisherman\",\"tokensSlash\":\"The amount of tokens to slash\"},\"returns\":{\"_0\":\"The dispute id\"}},\"createIndexingDispute(address,bytes32)\":{\"params\":{\"allocationId\":\"The allocation to dispute\",\"poi\":\"The Proof of Indexing (POI) being disputed\"},\"returns\":{\"_0\":\"The dispute id\"}},\"createQueryDispute(bytes)\":{\"params\":{\"attestationData\":\"Attestation bytes submitted by the fisherman\"},\"returns\":{\"_0\":\"The dispute id\"}},\"createQueryDisputeConflict(bytes,bytes)\":{\"params\":{\"attestationData1\":\"First attestation data submitted\",\"attestationData2\":\"Second attestation data submitted\"},\"returns\":{\"_0\":\"The first dispute id\",\"_1\":\"The second dispute id\"}},\"drawDispute(bytes32)\":{\"details\":\"Ignore a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be disregarded\"}},\"encodeReceipt((bytes32,bytes32,bytes32))\":{\"details\":\"Return the message hash used to sign the receipt\",\"params\":{\"receipt\":\"Receipt returned by indexer and submitted by fisherman\"},\"returns\":{\"_0\":\"Message hash used to sign the receipt\"}},\"getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"params\":{\"attestation\":\"Attestation\"},\"returns\":{\"_0\":\"indexer address\"}},\"getDisputePeriod()\":{\"returns\":{\"_0\":\"Dispute period in seconds\"}},\"getFishermanRewardCut()\":{\"returns\":{\"_0\":\"Fisherman reward cut in percentage (ppm)\"}},\"getStakeSnapshot(address)\":{\"params\":{\"indexer\":\"The indexer address\"},\"returns\":{\"_0\":\"The stake snapshot\"}},\"initialize(address,address,uint64,uint256,uint32,uint32)\":{\"params\":{\"arbitrator\":\"Arbitrator role\",\"disputeDeposit\":\"Deposit required to create a Dispute\",\"disputePeriod\":\"Dispute period in seconds\",\"fishermanRewardCut_\":\"Percent of slashed funds for fisherman (ppm)\",\"maxSlashingCut_\":\"Maximum percentage of indexer stake that can be slashed (ppm)\",\"owner\":\"The owner of the contract\"}},\"isDisputeCreated(bytes32)\":{\"details\":\"Return if dispute with Id `disputeId` exists\",\"params\":{\"disputeId\":\"True if dispute already exists\"},\"returns\":{\"_0\":\"True if dispute already exists\"}},\"rejectDispute(bytes32)\":{\"details\":\"Reject a dispute with Id `disputeId`\",\"params\":{\"disputeId\":\"Id of the dispute to be rejected\"}},\"setArbitrator(address)\":{\"details\":\"Update the arbitrator to `_arbitrator`\",\"params\":{\"arbitrator\":\"The address of the arbitration contract or party\"}},\"setDisputeDeposit(uint256)\":{\"details\":\"Update the dispute deposit to `_disputeDeposit` Graph Tokens\",\"params\":{\"disputeDeposit\":\"The dispute deposit in Graph Tokens\"}},\"setDisputePeriod(uint64)\":{\"details\":\"Update the dispute period to `_disputePeriod` in seconds\",\"params\":{\"disputePeriod\":\"Dispute period in seconds\"}},\"setFishermanRewardCut(uint32)\":{\"details\":\"Update the reward percentage to `_percentage`\",\"params\":{\"fishermanRewardCut_\":\"Reward as a percentage of indexer stake\"}},\"setMaxSlashingCut(uint32)\":{\"params\":{\"maxSlashingCut_\":\"Max percentage slashing for disputes\"}},\"setSubgraphService(address)\":{\"details\":\"Update the subgraph service to `_subgraphService`\",\"params\":{\"subgraphService\":\"The address of the subgraph service contract\"}}},\"title\":\"IDisputeManager\",\"version\":1},\"userdoc\":{\"errors\":{\"DisputeManagerDisputeAlreadyCreated(bytes32)\":[{\"notice\":\"Thrown when the dispute is already created\"}],\"DisputeManagerDisputeInConflict(bytes32)\":[{\"notice\":\"Thrown when the dispute is in conflict\"}],\"DisputeManagerDisputeNotInConflict(bytes32)\":[{\"notice\":\"Thrown when the dispute is not in conflict\"}],\"DisputeManagerDisputeNotPending(uint8)\":[{\"notice\":\"Thrown when the dispute is not pending\"}],\"DisputeManagerDisputePeriodNotFinished()\":[{\"notice\":\"Thrown when the dispute period is not finished\"}],\"DisputeManagerDisputePeriodZero()\":[{\"notice\":\"Thrown when the dispute period is zero\"}],\"DisputeManagerIndexerNotFound(address)\":[{\"notice\":\"Thrown when the indexer is not found\"}],\"DisputeManagerInvalidDispute(bytes32)\":[{\"notice\":\"Thrown when the dispute id is invalid\"}],\"DisputeManagerInvalidDisputeDeposit(uint256)\":[{\"notice\":\"Thrown when the dispute deposit is invalid - less than the minimum dispute deposit\"}],\"DisputeManagerInvalidFishermanReward(uint32)\":[{\"notice\":\"Thrown when the fisherman reward cut is invalid\"}],\"DisputeManagerInvalidMaxSlashingCut(uint32)\":[{\"notice\":\"Thrown when the max slashing cut is invalid\"}],\"DisputeManagerInvalidTokensSlash(uint256,uint256)\":[{\"notice\":\"Thrown when the tokens slash is invalid\"}],\"DisputeManagerInvalidZeroAddress()\":[{\"notice\":\"Thrown when the address is the zero address\"}],\"DisputeManagerMustAcceptRelatedDispute(bytes32,bytes32)\":[{\"notice\":\"Thrown when the dispute must be accepted\"}],\"DisputeManagerNonConflictingAttestations(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)\":[{\"notice\":\"Thrown when the attestations are not conflicting\"}],\"DisputeManagerNonMatchingSubgraphDeployment(bytes32,bytes32)\":[{\"notice\":\"Thrown when the subgraph deployment is not matching\"}],\"DisputeManagerNotArbitrator()\":[{\"notice\":\"Thrown when the caller is not the arbitrator\"}],\"DisputeManagerNotFisherman()\":[{\"notice\":\"Thrown when the caller is not the fisherman\"}],\"DisputeManagerSubgraphServiceNotSet()\":[{\"notice\":\"Thrown when attempting to get the subgraph service before it is set\"}],\"DisputeManagerZeroTokens()\":[{\"notice\":\"Thrown when the indexer being disputed has no provisioned tokens\"}]},\"events\":{\"ArbitratorSet(address)\":{\"notice\":\"Emitted when arbitrator is set.\"},\"DisputeDepositSet(uint256)\":{\"notice\":\"Emitted when dispute deposit is set.\"},\"DisputePeriodSet(uint64)\":{\"notice\":\"Emitted when dispute period is set.\"},\"FishermanRewardCutSet(uint32)\":{\"notice\":\"Emitted when fisherman reward cut is set.\"},\"MaxSlashingCutSet(uint32)\":{\"notice\":\"Emitted when max slashing cut is set.\"},\"SubgraphServiceSet(address)\":{\"notice\":\"Emitted when subgraph service is set.\"}},\"kind\":\"user\",\"methods\":{\"acceptDispute(bytes32,uint256)\":{\"notice\":\"The arbitrator accepts a dispute as being valid. 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. This function will also revert if the dispute is in conflict, to accept a conflicting dispute use acceptDisputeConflict.\"},\"acceptDisputeConflict(bytes32,uint256,bool,uint256)\":{\"notice\":\"The arbitrator accepts a conflicting dispute as being valid. 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.\"},\"areConflictingAttestations((bytes32,bytes32,bytes32,bytes32,bytes32,uint8),(bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"notice\":\"Checks if two attestations are conflicting\"},\"cancelDispute(bytes32)\":{\"notice\":\"Once the dispute period ends, if the dispute status remains Pending, the fisherman can cancel the dispute and get back their initial deposit. Note that cancelling a conflicting query dispute will also cancel the related dispute.\"},\"createAndAcceptLegacyDispute(address,address,uint256,uint256)\":{\"notice\":\"Creates and auto-accepts a legacy dispute. This disputes can be created to settle outstanding slashing amounts with an indexer that has been \\\"legacy slashed\\\" during or shortly after the transition period. See {HorizonStakingExtension.legacySlash} for more details. Note that this type of dispute: - can only be created by the arbitrator - does not require a bond - is automatically accepted when created Additionally, note that this type of disputes allow the arbitrator to directly set the slash and rewards amounts, bypassing the usual mechanisms that impose restrictions on those. This is done to give arbitrators maximum flexibility to ensure outstanding slashing amounts are settled fairly. This function needs to be removed after the transition period. Requirements: - Indexer must have been legacy slashed during or shortly after the transition period - Indexer must have provisioned funds to the Subgraph Service\"},\"createIndexingDispute(address,bytes32)\":{\"notice\":\"Create an indexing dispute for the arbitrator to resolve. The disputes are created in reference to an allocationId and specifically a POI for that allocation. This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens. Requirements: - fisherman must have previously approved this contract to pull `disputeDeposit` amount of tokens from their balance.\"},\"createQueryDispute(bytes)\":{\"notice\":\"Create a query dispute for the arbitrator to resolve. This function is called by a fisherman and it will pull `disputeDeposit` GRT tokens. * Requirements: - fisherman must have previously approved this contract to pull `disputeDeposit` amount of tokens from their balance.\"},\"createQueryDisputeConflict(bytes,bytes)\":{\"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. Two linked disputes will be created and if the arbitrator resolve one, the other one will be automatically resolved. Note that: - it's not possible to reject a conflicting query dispute as by definition at least one of the attestations is incorrect. - if both attestations are proven to be incorrect, the arbitrator can slash the indexer twice. Requirements: - fisherman must have previously approved this contract to pull `disputeDeposit` amount of tokens from their balance.\"},\"drawDispute(bytes32)\":{\"notice\":\"The arbitrator draws dispute. Note that drawing a conflicting query dispute should not be possible however it is allowed to give arbitrators greater flexibility when resolving disputes.\"},\"encodeReceipt((bytes32,bytes32,bytes32))\":{\"notice\":\"Get the message hash that a indexer used to sign the receipt. Encodes a receipt using a domain separator, as described on https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification.\"},\"getAttestationIndexer((bytes32,bytes32,bytes32,bytes32,bytes32,uint8))\":{\"notice\":\"Returns the indexer that signed an attestation.\"},\"getDisputePeriod()\":{\"notice\":\"Get the dispute period.\"},\"getFishermanRewardCut()\":{\"notice\":\"Get the fisherman reward cut.\"},\"getStakeSnapshot(address)\":{\"notice\":\"Get the stake snapshot for an indexer.\"},\"initialize(address,address,uint64,uint256,uint32,uint32)\":{\"notice\":\"Initialize this contract.\"},\"isDisputeCreated(bytes32)\":{\"notice\":\"Return whether a dispute exists or not.\"},\"rejectDispute(bytes32)\":{\"notice\":\"The arbitrator rejects a dispute as being invalid. Note that conflicting query disputes cannot be rejected.\"},\"setArbitrator(address)\":{\"notice\":\"Set the arbitrator address.\"},\"setDisputeDeposit(uint256)\":{\"notice\":\"Set the dispute deposit required to create a dispute.\"},\"setDisputePeriod(uint64)\":{\"notice\":\"Set the dispute period.\"},\"setFishermanRewardCut(uint32)\":{\"notice\":\"Set the percent reward that the fisherman gets when slashing occurs.\"},\"setMaxSlashingCut(uint32)\":{\"notice\":\"Set the maximum percentage that can be used for slashing indexers.\"},\"setSubgraphService(address)\":{\"notice\":\"Set the subgraph service address.\"}},\"notice\":\"Interface for the {Dispute Manager} contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IDisputeManager.sol\":\"IDisputeManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"contracts/interfaces/IDisputeManager.sol\":{\"keccak256\":\"0x9db8ffdf7fe30954824ed706a1a5e7c2d6323b745bddba16b7166a639344f9f7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e5d810bf6188c38a028dab511c5653fde7b7feca0a173f03974402a83cb234f9\",\"dweb:/ipfs/QmYGtytqHeDFK91FmSNL5iavD8sHUFcA47WBU9BuHG3i75\"]},\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]}},\"version\":1}" + } + }, + "contracts/interfaces/ISubgraphService.sol": { + "ISubgraphService": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + } + ], + "name": "DataServiceFeesClaimNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "DataServiceFeesZeroTokens", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationIsAltruistic", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceAllocationNotAuthorized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "SubgraphServiceCannotForceCloseAllocation", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyGeohash", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceEmptyUrl", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "balanceBefore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceAfter", + "type": "uint256" + } + ], + "name": "SubgraphServiceInconsistentCollection", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceIndexerAlreadyRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "providedIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "expectedIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerMismatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "SubgraphServiceIndexerNotRegistered", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "collectionId", + "type": "bytes32" + } + ], + "name": "SubgraphServiceInvalidCollectionId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "SubgraphServiceInvalidCurationCut", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "paymentType", + "type": "uint8" + } + ], + "name": "SubgraphServiceInvalidPaymentType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "ravIndexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationIndexer", + "type": "address" + } + ], + "name": "SubgraphServiceInvalidRAV", + "type": "error" + }, + { + "inputs": [], + "name": "SubgraphServiceInvalidZeroStakeToFeesRatio", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "CurationCutSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "paymentsDestination", + "type": "address" + } + ], + "name": "PaymentsDestinationSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + } + ], + "name": "ProvisionPendingParametersAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCollected", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensCurators", + "type": "uint256" + } + ], + "name": "QueryFeesCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServicePaymentCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceProviderRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "ServiceProviderSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ServiceStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "unlockTimestamp", + "type": "uint256" + } + ], + "name": "StakeClaimLocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "claimId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "releasableAt", + "type": "uint256" + } + ], + "name": "StakeClaimReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimsCount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensReleased", + "type": "uint256" + } + ], + "name": "StakeClaimsReleased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ratio", + "type": "uint256" + } + ], + "name": "StakeToFeesRatioSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "acceptProvisionPendingParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "closeStaleAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "enum IGraphPayments.PaymentTypes", + "name": "feeType", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "encodeAllocationProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastPOIPresentedAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPerAllocatedToken", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accRewardsPending", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "createdAtEpoch", + "type": "uint256" + } + ], + "internalType": "struct Allocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCuration", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationRatio", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDisputeManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGraphTallyCollector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "getLegacyAllocation", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "internalType": "struct LegacyAllocation.State", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProvisionTokensRange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThawingPeriodRange", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVerifierCutRange", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "maximumDelegationRatio", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "stakeToFeesRatio", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "isOverAllocated", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "migrateLegacyAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "numClaimsToRelease", + "type": "uint256" + } + ], + "name": "releaseStake", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "resizeAllocation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "curationCut", + "type": "uint256" + } + ], + "name": "setCurationCut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "delegationRatio", + "type": "uint32" + } + ], + "name": "setDelegationRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxPOIStaleness", + "type": "uint256" + } + ], + "name": "setMaxPOIStaleness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minimumProvisionTokens", + "type": "uint256" + } + ], + "name": "setMinimumProvisionTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pauseGuardian", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setPauseGuardian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "paymentsDestination", + "type": "address" + } + ], + "name": "setPaymentsDestination", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeToFeesRatio", + "type": "uint256" + } + ], + "name": "setStakeToFeesRatio", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "startService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "serviceProvider", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "stopService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptProvisionPendingParameters(address,bytes)": "ce0fc0cc", + "closeStaleAllocation(address)": "ec9c218d", + "collect(address,uint8,bytes)": "b15d2a2c", + "encodeAllocationProof(address,address)": "ce56c98b", + "getAllocation(address)": "0e022923", + "getCuration()": "c0f47497", + "getDelegationRatio()": "1ebb7c30", + "getDisputeManager()": "db9bee46", + "getGraphTallyCollector()": "ebf6ddaf", + "getLegacyAllocation(address)": "6d9a3951", + "getProvisionTokensRange()": "819ba366", + "getThawingPeriodRange()": "71ce020a", + "getVerifierCutRange()": "482468b7", + "initialize(address,uint256,uint32,uint256)": "c84a5ef3", + "isOverAllocated(address)": "ba38f67d", + "migrateLegacyAllocation(address,address,bytes32)": "7dfe6d28", + "register(address,bytes)": "24b8fbf6", + "releaseStake(uint256)": "45f54485", + "resizeAllocation(address,address,uint256)": "81e777a7", + "setCurationCut(uint256)": "7e89bac3", + "setDelegationRatio(uint32)": "1dd42f60", + "setMaxPOIStaleness(uint256)": "7aa31bce", + "setMinimumProvisionTokens(uint256)": "832bc923", + "setPauseGuardian(address,bool)": "35577962", + "setPaymentsDestination(address)": "6ccec5b8", + "setStakeToFeesRatio(uint256)": "e6f50054", + "slash(address,bytes)": "cb8347fe", + "startService(address,bytes)": "dedf6726", + "stopService(address,bytes)": "8180083b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"}],\"name\":\"DataServiceFeesClaimNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataServiceFeesZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"SubgraphServiceAllocationIsAltruistic\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"SubgraphServiceAllocationNotAuthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"SubgraphServiceCannotForceCloseAllocation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceEmptyGeohash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceEmptyUrl\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balanceBefore\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balanceAfter\",\"type\":\"uint256\"}],\"name\":\"SubgraphServiceInconsistentCollection\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceIndexerAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providedIndexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"expectedIndexer\",\"type\":\"address\"}],\"name\":\"SubgraphServiceIndexerMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"SubgraphServiceIndexerNotRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"collectionId\",\"type\":\"bytes32\"}],\"name\":\"SubgraphServiceInvalidCollectionId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"curationCut\",\"type\":\"uint256\"}],\"name\":\"SubgraphServiceInvalidCurationCut\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"paymentType\",\"type\":\"uint8\"}],\"name\":\"SubgraphServiceInvalidPaymentType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ravIndexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationIndexer\",\"type\":\"address\"}],\"name\":\"SubgraphServiceInvalidRAV\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubgraphServiceInvalidZeroStakeToFeesRatio\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"curationCut\",\"type\":\"uint256\"}],\"name\":\"CurationCutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"paymentsDestination\",\"type\":\"address\"}],\"name\":\"PaymentsDestinationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"}],\"name\":\"ProvisionPendingParametersAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensCollected\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensCurators\",\"type\":\"uint256\"}],\"name\":\"QueryFeesCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServicePaymentCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceProviderRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"ServiceProviderSlashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ServiceStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockTimestamp\",\"type\":\"uint256\"}],\"name\":\"StakeClaimLocked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"claimId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"releasableAt\",\"type\":\"uint256\"}],\"name\":\"StakeClaimReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimsCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensReleased\",\"type\":\"uint256\"}],\"name\":\"StakeClaimsReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"}],\"name\":\"StakeToFeesRatioSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"acceptProvisionPendingParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"closeStaleAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"enum IGraphPayments.PaymentTypes\",\"name\":\"feeType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"encodeAllocationProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getAllocation\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"closedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastPOIPresentedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPerAllocatedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accRewardsPending\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAtEpoch\",\"type\":\"uint256\"}],\"internalType\":\"struct Allocation.State\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCuration\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDelegationRatio\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDisputeManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGraphTallyCollector\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"getLegacyAllocation\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"internalType\":\"struct LegacyAllocation.State\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProvisionTokensRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThawingPeriodRange\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVerifierCutRange\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumProvisionTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"maximumDelegationRatio\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"stakeToFeesRatio\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"isOverAllocated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"migrateLegacyAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numClaimsToRelease\",\"type\":\"uint256\"}],\"name\":\"releaseStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"resizeAllocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"curationCut\",\"type\":\"uint256\"}],\"name\":\"setCurationCut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"delegationRatio\",\"type\":\"uint32\"}],\"name\":\"setDelegationRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxPOIStaleness\",\"type\":\"uint256\"}],\"name\":\"setMaxPOIStaleness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minimumProvisionTokens\",\"type\":\"uint256\"}],\"name\":\"setMinimumProvisionTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pauseGuardian\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setPauseGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"paymentsDestination\",\"type\":\"address\"}],\"name\":\"setPaymentsDestination\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeToFeesRatio\",\"type\":\"uint256\"}],\"name\":\"setStakeToFeesRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"startService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceProvider\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"stopService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"details\":\"This interface extends {IDataServiceFees} and {IDataService}.\",\"errors\":{\"DataServiceFeesClaimNotFound(bytes32)\":[{\"params\":{\"claimId\":\"The id of the stake claim\"}}],\"SubgraphServiceAllocationIsAltruistic(address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\"}}],\"SubgraphServiceAllocationNotAuthorized(address,address)\":[{\"params\":{\"allocationId\":\"The id of the allocation.\",\"indexer\":\"The address of the expected indexer.\"}}],\"SubgraphServiceCannotForceCloseAllocation(address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\"}}],\"SubgraphServiceInconsistentCollection(uint256,uint256)\":[{\"params\":{\"balanceAfter\":\"The contract GRT balance after the collection\",\"balanceBefore\":\"The contract GRT balance before the collection\"}}],\"SubgraphServiceIndexerMismatch(address,address)\":[{\"params\":{\"expectedIndexer\":\"The address of the expected indexer.\",\"providedIndexer\":\"The address of the provided indexer.\"}}],\"SubgraphServiceIndexerNotRegistered(address)\":[{\"params\":{\"indexer\":\"The address of the indexer that is not registered\"}}],\"SubgraphServiceInvalidCollectionId(bytes32)\":[{\"params\":{\"collectionId\":\"The collectionId\"}}],\"SubgraphServiceInvalidCurationCut(uint256)\":[{\"params\":{\"curationCut\":\"The curation cut value\"}}],\"SubgraphServiceInvalidPaymentType(uint8)\":[{\"params\":{\"paymentType\":\"The payment type that is not supported\"}}],\"SubgraphServiceInvalidRAV(address,address)\":[{\"params\":{\"allocationIndexer\":\"The address of the allocation indexer\",\"ravIndexer\":\"The address of the RAV indexer\"}}]},\"events\":{\"CurationCutSet(uint256)\":{\"params\":{\"curationCut\":\"The curation cut\"}},\"PaymentsDestinationSet(address,address)\":{\"params\":{\"indexer\":\"The address of the indexer\",\"paymentsDestination\":\"The address where payments should be sent\"}},\"ProvisionPendingParametersAccepted(address)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\"}},\"QueryFeesCollected(address,address,address,bytes32,uint256,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"payer\":\"The address paying for the query fees\",\"serviceProvider\":\"The address of the service provider\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokensCollected\":\"The amount of tokens collected\",\"tokensCurators\":\"The amount of tokens curators receive\"}},\"ServicePaymentCollected(address,uint8,uint256)\":{\"params\":{\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens collected.\"}},\"ServiceProviderRegistered(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceProviderSlashed(address,uint256)\":{\"params\":{\"serviceProvider\":\"The address of the service provider.\",\"tokens\":\"The amount of tokens slashed.\"}},\"ServiceStarted(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"ServiceStopped(address,bytes)\":{\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens to lock in the claim\",\"unlockTimestamp\":\"The timestamp when the tokens can be released\"}},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"params\":{\"claimId\":\"The id of the stake claim\",\"releasableAt\":\"The timestamp when the tokens were released\",\"serviceProvider\":\"The address of the service provider\",\"tokens\":\"The amount of tokens released\"}},\"StakeClaimsReleased(address,uint256,uint256)\":{\"params\":{\"claimsCount\":\"The number of stake claims being released\",\"serviceProvider\":\"The address of the service provider\",\"tokensReleased\":\"The total amount of tokens being released\"}},\"StakeToFeesRatioSet(uint256)\":{\"params\":{\"ratio\":\"The stake to fees ratio\"}}},\"kind\":\"dev\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"details\":\"Provides a way for the data service to validate and accept provision parameter changes. Call {_acceptProvision}. Emits a {ProvisionPendingParametersAccepted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"closeStaleAllocation(address)\":{\"details\":\"This function can be permissionlessly called when the allocation is stale. This ensures that rewards for other allocations are not diluted by an inactive allocation. Requirements: - Allocation must exist and be open - Allocation must be stale - Allocation cannot be altruistic Emits a {AllocationClosed} event.\",\"params\":{\"allocationId\":\"The id of the allocation\"}},\"collect(address,uint8,bytes)\":{\"details\":\"The implementation of this function is expected to interact with {GraphPayments} to collect payment from the service payer, which is done via {IGraphPayments-collect}. Emits a {ServicePaymentCollected} event. NOTE: Data services that are vetted by the Graph Council might qualify for a portion of protocol issuance to cover for these payments. In this case, the funds are taken by interacting with the rewards manager contract instead of the {GraphPayments} contract.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"feeType\":\"The type of fee to collect as defined in {GraphPayments}.\",\"serviceProvider\":\"The address of the service provider.\"},\"returns\":{\"_0\":\"The amount of tokens collected.\"}},\"encodeAllocationProof(address,address)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\"},\"returns\":{\"_0\":\"The encoded allocation proof\"}},\"getAllocation(address)\":{\"params\":{\"allocationId\":\"The id of the allocation\"},\"returns\":{\"_0\":\"The allocation details\"}},\"getCuration()\":{\"returns\":{\"_0\":\"The address of the curation contract\"}},\"getDelegationRatio()\":{\"returns\":{\"_0\":\"The delegation ratio\"}},\"getDisputeManager()\":{\"returns\":{\"_0\":\"The address of the dispute manager\"}},\"getGraphTallyCollector()\":{\"returns\":{\"_0\":\"The address of the graph tally collector\"}},\"getLegacyAllocation(address)\":{\"params\":{\"allocationId\":\"The id of the allocation\"},\"returns\":{\"_0\":\"The legacy allocation details\"}},\"getProvisionTokensRange()\":{\"returns\":{\"_0\":\"Minimum provision tokens allowed\",\"_1\":\"Maximum provision tokens allowed\"}},\"getThawingPeriodRange()\":{\"returns\":{\"_0\":\"Minimum thawing period allowed\",\"_1\":\"Maximum thawing period allowed\"}},\"getVerifierCutRange()\":{\"returns\":{\"_0\":\"Minimum verifier cut allowed\",\"_1\":\"Maximum verifier cut allowed\"}},\"initialize(address,uint256,uint32,uint256)\":{\"details\":\"The thawingPeriod and verifierCut ranges are not set here because they are variables on the DisputeManager. We use the {ProvisionManager} overrideable getters to get the ranges.\",\"params\":{\"maximumDelegationRatio\":\"The maximum delegation ratio allowed for an allocation\",\"minimumProvisionTokens\":\"The minimum amount of provisioned tokens required to create an allocation\",\"owner\":\"The owner of the contract\",\"stakeToFeesRatio\":\"The ratio of stake to fees to lock when collecting query fees\"}},\"isOverAllocated(address)\":{\"params\":{\"allocationId\":\"The id of the allocation\"},\"returns\":{\"_0\":\"True if the indexer is over-allocated, false otherwise\"}},\"migrateLegacyAllocation(address,address,bytes32)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\"}},\"register(address,bytes)\":{\"details\":\"Before registering, the service provider must have created a provision in the Graph Horizon staking contract with parameters that are compatible with the data service. Verifies provision parameters and rejects registration in the event they are not valid. Emits a {ServiceProviderRegistered} event. NOTE: Failing to accept the provision will result in the service provider operating on an unverified provision. Depending on of the data service this can be a security risk as the protocol won't be able to guarantee economic security for the consumer.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"releaseStake(uint256)\":{\"details\":\"This function is only meant to be called if the service provider has enough stake claims that releasing them all at once would exceed the block gas limit.This function can be overriden and/or disabled.Emits a {StakeClaimsReleased} event, and a {StakeClaimReleased} event for each claim released.\",\"params\":{\"numClaimsToRelease\":\"Amount of stake claims to process. If 0, all stake claims are processed.\"}},\"resizeAllocation(address,address,uint256)\":{\"details\":\"Requirements: - The indexer must be registered - The provision must be valid according to the subgraph service rules - `tokens` must be different from the current allocation size - The indexer must have enough available tokens to allocate if they are upsizing the allocation Emits a {AllocationResized} event. See {AllocationManager-_resizeAllocation} for more details.\",\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"tokens\":\"The new amount of tokens in the allocation\"}},\"setCurationCut(uint256)\":{\"details\":\"Emits a {CuratorCutSet} event\",\"params\":{\"curationCut\":\"The curation cut for the payment type\"}},\"setDelegationRatio(uint32)\":{\"params\":{\"delegationRatio\":\"The delegation ratio\"}},\"setMaxPOIStaleness(uint256)\":{\"params\":{\"maxPOIStaleness\":\"The max POI staleness in seconds\"}},\"setMinimumProvisionTokens(uint256)\":{\"params\":{\"minimumProvisionTokens\":\"The minimum amount of provisioned tokens required to create an allocation\"}},\"setPauseGuardian(address,bool)\":{\"params\":{\"allowed\":\"True if the pause guardian is allowed to pause the contract, false otherwise\",\"pauseGuardian\":\"The address of the pause guardian\"}},\"setPaymentsDestination(address)\":{\"details\":\"Emits a {PaymentsDestinationSet} event\",\"params\":{\"paymentsDestination\":\"The address where payments should be sent\"}},\"setStakeToFeesRatio(uint256)\":{\"params\":{\"stakeToFeesRatio\":\"The stake to fees ratio\"}},\"slash(address,bytes)\":{\"details\":\"To slash the service provider's provision the function should call {Staking-slash}. Emits a {ServiceProviderSlashed} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"startService(address,bytes)\":{\"details\":\"Emits a {ServiceStarted} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}},\"stopService(address,bytes)\":{\"details\":\"Emits a {ServiceStopped} event.\",\"params\":{\"data\":\"Custom data, usage defined by the data service.\",\"serviceProvider\":\"The address of the service provider.\"}}},\"title\":\"Interface for the {SubgraphService} contract\",\"version\":1},\"userdoc\":{\"errors\":{\"DataServiceFeesClaimNotFound(bytes32)\":[{\"notice\":\"Thrown when attempting to get a stake claim that does not exist.\"}],\"DataServiceFeesZeroTokens()\":[{\"notice\":\"Emitted when trying to lock zero tokens in a stake claim\"}],\"SubgraphServiceAllocationIsAltruistic(address)\":[{\"notice\":\"Thrown when trying to force close an altruistic allocation\"}],\"SubgraphServiceAllocationNotAuthorized(address,address)\":[{\"notice\":\"Thrown when the indexer in the allocation state does not match the expected indexer.\"}],\"SubgraphServiceCannotForceCloseAllocation(address)\":[{\"notice\":\"Thrown when trying to force close an allocation that is not stale and the indexer is not over-allocated\"}],\"SubgraphServiceEmptyGeohash()\":[{\"notice\":\"Thrown when an indexer tries to register with an empty geohash\"}],\"SubgraphServiceEmptyUrl()\":[{\"notice\":\"Thrown when an indexer tries to register with an empty URL\"}],\"SubgraphServiceInconsistentCollection(uint256,uint256)\":[{\"notice\":\"Thrown when the contract GRT balance is inconsistent after collecting from Graph Payments\"}],\"SubgraphServiceIndexerAlreadyRegistered()\":[{\"notice\":\"Thrown when an indexer tries to register but they are already registered\"}],\"SubgraphServiceIndexerMismatch(address,address)\":[{\"notice\":\"@notice Thrown when the service provider in the RAV does not match the expected indexer.\"}],\"SubgraphServiceIndexerNotRegistered(address)\":[{\"notice\":\"Thrown when an indexer tries to perform an operation but they are not registered\"}],\"SubgraphServiceInvalidCollectionId(bytes32)\":[{\"notice\":\"Thrown when collectionId is not a valid address\"}],\"SubgraphServiceInvalidCurationCut(uint256)\":[{\"notice\":\"Thrown when trying to set a curation cut that is not a valid PPM value\"}],\"SubgraphServiceInvalidPaymentType(uint8)\":[{\"notice\":\"Thrown when an indexer tries to collect fees for an unsupported payment type\"}],\"SubgraphServiceInvalidRAV(address,address)\":[{\"notice\":\"Thrown when collecting a RAV where the RAV indexer is not the same as the allocation indexer\"}],\"SubgraphServiceInvalidZeroStakeToFeesRatio()\":[{\"notice\":\"Thrown when trying to set stake to fees ratio to zero\"}]},\"events\":{\"CurationCutSet(uint256)\":{\"notice\":\"Emitted when curator cuts are set\"},\"PaymentsDestinationSet(address,address)\":{\"notice\":\"Emitted when an indexer sets a new payments destination\"},\"ProvisionPendingParametersAccepted(address)\":{\"notice\":\"Emitted when a service provider accepts a provision in {Graph Horizon staking contract}.\"},\"QueryFeesCollected(address,address,address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a subgraph service collects query fees from Graph Payments\"},\"ServicePaymentCollected(address,uint8,uint256)\":{\"notice\":\"Emitted when a service provider collects payment.\"},\"ServiceProviderRegistered(address,bytes)\":{\"notice\":\"Emitted when a service provider is registered with the data service.\"},\"ServiceProviderSlashed(address,uint256)\":{\"notice\":\"Emitted when a service provider is slashed.\"},\"ServiceStarted(address,bytes)\":{\"notice\":\"Emitted when a service provider starts providing the service.\"},\"ServiceStopped(address,bytes)\":{\"notice\":\"Emitted when a service provider stops providing the service.\"},\"StakeClaimLocked(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is created and stake is locked.\"},\"StakeClaimReleased(address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when a stake claim is released and stake is unlocked.\"},\"StakeClaimsReleased(address,uint256,uint256)\":{\"notice\":\"Emitted when a series of stake claims are released.\"},\"StakeToFeesRatioSet(uint256)\":{\"notice\":\"Emitted when the stake to fees ratio is set.\"}},\"kind\":\"user\",\"methods\":{\"acceptProvisionPendingParameters(address,bytes)\":{\"notice\":\"Accepts pending parameters in the provision of a service provider in the {Graph Horizon staking contract}.\"},\"closeStaleAllocation(address)\":{\"notice\":\"Force close a stale allocation\"},\"collect(address,uint8,bytes)\":{\"notice\":\"Collects payment earnt by the service provider.\"},\"encodeAllocationProof(address,address)\":{\"notice\":\"Encodes the allocation proof for EIP712 signing\"},\"getAllocation(address)\":{\"notice\":\"Gets the details of an allocation For legacy allocations use {getLegacyAllocation}\"},\"getCuration()\":{\"notice\":\"Gets the address of the curation contract\"},\"getDelegationRatio()\":{\"notice\":\"External getter for the delegation ratio\"},\"getDisputeManager()\":{\"notice\":\"Gets the address of the dispute manager\"},\"getGraphTallyCollector()\":{\"notice\":\"Gets the address of the graph tally collector\"},\"getLegacyAllocation(address)\":{\"notice\":\"Gets the details of a legacy allocation For non-legacy allocations use {getAllocation}\"},\"getProvisionTokensRange()\":{\"notice\":\"External getter for the provision tokens range\"},\"getThawingPeriodRange()\":{\"notice\":\"External getter for the thawing period range\"},\"getVerifierCutRange()\":{\"notice\":\"External getter for the verifier cut range\"},\"initialize(address,uint256,uint32,uint256)\":{\"notice\":\"Initialize the contract\"},\"isOverAllocated(address)\":{\"notice\":\"Checks if an indexer is over-allocated\"},\"migrateLegacyAllocation(address,address,bytes32)\":{\"notice\":\"Imports a legacy allocation id into the subgraph service This is a governor only action that is required to prevent indexers from re-using allocation ids from the legacy staking contract.\"},\"register(address,bytes)\":{\"notice\":\"Registers a service provider with the data service. The service provider can now start providing the service.\"},\"releaseStake(uint256)\":{\"notice\":\"Releases expired stake claims for the caller.\"},\"resizeAllocation(address,address,uint256)\":{\"notice\":\"Change the amount of tokens in an allocation\"},\"setCurationCut(uint256)\":{\"notice\":\"Sets the curators payment cut for query fees\"},\"setDelegationRatio(uint32)\":{\"notice\":\"Sets the delegation ratio\"},\"setMaxPOIStaleness(uint256)\":{\"notice\":\"Sets the max POI staleness See {AllocationManagerV1Storage-maxPOIStaleness} for more details.\"},\"setMinimumProvisionTokens(uint256)\":{\"notice\":\"Sets the minimum amount of provisioned tokens required to create an allocation\"},\"setPauseGuardian(address,bool)\":{\"notice\":\"Sets a pause guardian\"},\"setPaymentsDestination(address)\":{\"notice\":\"Sets the payments destination for an indexer to receive payments\"},\"setStakeToFeesRatio(uint256)\":{\"notice\":\"Sets the stake to fees ratio\"},\"slash(address,bytes)\":{\"notice\":\"Slash a service provider for misbehaviour.\"},\"startService(address,bytes)\":{\"notice\":\"Service provider starts providing the service.\"},\"stopService(address,bytes)\":{\"notice\":\"Service provider stops providing the service.\"}},\"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 Service framework to allow indexers to register as subgraph service providers, create allocations to signal their commitment to index a subgraph, and collect fees for indexing and querying services.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/ISubgraphService.sol\":\"ISubgraphService\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/interfaces/ISubgraphService.sol\":{\"keccak256\":\"0x7516f80b0a8b2e3edeedf06c9b917f2a24e557f8c00632e6150fbb41ef8da3ce\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ad4f813111541f5ef9ea6236f42822a3a66364d24189e4568450b20e09972a5e\",\"dweb:/ipfs/QmVYQA9rT7T8YnQgAB6fokNYDJeDrgQqrjfJ8sGjySNFBo\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]}},\"version\":1}" + } + }, + "contracts/libraries/Allocation.sol": { + "Allocation": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "closedAt", + "type": "uint256" + } + ], + "name": "AllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationDoesNotExist", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bf7be374d96e4dfebf669b5e5761d8c0ce765860edf79096b2e17cccafbc1df664736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF PUSH28 0xE374D96E4DFEBF669B5E5761D8C0CE765860EDF79096B2E17CCCAFBC SAR 0xF6 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "360:7850:61:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;360:7850:61;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bf7be374d96e4dfebf669b5e5761d8c0ce765860edf79096b2e17cccafbc1df664736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBF PUSH28 0xE374D96E4DFEBF669B5E5761D8C0CE765860EDF79096B2E17CCCAFBC SAR 0xF6 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "360:7850:61:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"closedAt\",\"type\":\"uint256\"}],\"name\":\"AllocationClosed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationDoesNotExist\",\"type\":\"error\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"AllocationAlreadyExists(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"AllocationClosed(address,uint256)\":[{\"params\":{\"allocationId\":\"The allocation id\",\"closedAt\":\"The timestamp when the allocation was closed\"}}],\"AllocationDoesNotExist(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"Allocation library\",\"version\":1},\"userdoc\":{\"errors\":{\"AllocationAlreadyExists(address)\":[{\"notice\":\"Thrown when attempting to create an allocation with an existing id\"}],\"AllocationClosed(address,uint256)\":[{\"notice\":\"Thrown when trying to perform an operation on a closed allocation\"}],\"AllocationDoesNotExist(address)\":[{\"notice\":\"Thrown when trying to perform an operation on a non-existent allocation\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"A library to handle Allocations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/Allocation.sol\":\"Allocation\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]}},\"version\":1}" + } + }, + "contracts/libraries/Attestation.sol": { + "Attestation": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expectedLength", + "type": "uint256" + } + ], + "name": "AttestationInvalidBytesLength", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e1f75b59a03e53b2d3d0f698d9538dc889ffa06993a219fcb5e82cbe0789c59d64736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 0xF7 JUMPDEST MSIZE LOG0 RETURNDATACOPY MSTORE8 0xB2 0xD3 0xD0 0xF6 SWAP9 0xD9 MSTORE8 DUP14 0xC8 DUP10 SELFDESTRUCT LOG0 PUSH10 0x93A219FCB5E82CBE0789 0xC5 SWAP14 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "292:5790:62:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;292:5790:62;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e1f75b59a03e53b2d3d0f698d9538dc889ffa06993a219fcb5e82cbe0789c59d64736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 0xF7 JUMPDEST MSIZE LOG0 RETURNDATACOPY MSTORE8 0xB2 0xD3 0xD0 0xF6 SWAP9 0xD9 MSTORE8 DUP14 0xC8 DUP10 SELFDESTRUCT LOG0 PUSH10 0x93A219FCB5E82CBE0789 0xC5 SWAP14 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "292:5790:62:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"}],\"name\":\"AttestationInvalidBytesLength\",\"type\":\"error\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"AttestationInvalidBytesLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the attestation data\",\"length\":\"The length of the attestation data\"}}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"Attestation library\",\"version\":1},\"userdoc\":{\"errors\":{\"AttestationInvalidBytesLength(uint256,uint256)\":[{\"notice\":\"The error thrown when the attestation data length is invalid\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"A library to handle Attestation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/Attestation.sol\":\"Attestation\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]}},\"version\":1}" + } + }, + "contracts/libraries/LegacyAllocation.sol": { + "LegacyAllocation": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "LegacyAllocationAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "LegacyAllocationDoesNotExist", + "type": "error" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122071104b32b9956ccf0efa57d5b6b7c7963e628cf468ea4f5532c7e2755bca113864736f6c634300081b0033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0x104B32B9956CCF0EFA57D5B6B7C7963E628C DELEGATECALL PUSH9 0xEA4F5532C7E2755BCA GT CODESIZE PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "404:3827:63:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;404:3827:63;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122071104b32b9956ccf0efa57d5b6b7c7963e628cf468ea4f5532c7e2755bca113864736f6c634300081b0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0x104B32B9956CCF0EFA57D5B6B7C7963E628C DELEGATECALL PUSH9 0xEA4F5532C7E2755BCA GT CODESIZE PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "404:3827:63:-:0;;;;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"LegacyAllocationAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"LegacyAllocationDoesNotExist\",\"type\":\"error\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"LegacyAllocationAlreadyExists(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}],\"LegacyAllocationDoesNotExist(address)\":[{\"params\":{\"allocationId\":\"The allocation id\"}}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"LegacyAllocation library\",\"version\":1},\"userdoc\":{\"errors\":{\"LegacyAllocationAlreadyExists(address)\":[{\"notice\":\"Thrown when attempting to migrate an allocation with an existing id\"}],\"LegacyAllocationDoesNotExist(address)\":[{\"notice\":\"Thrown when trying to get a non-existent allocation\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"A library to handle legacy Allocations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/LegacyAllocation.sol\":\"LegacyAllocation\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]}},\"version\":1}" + } + }, + "contracts/utilities/AllocationManager.sol": { + "AllocationManager": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerAllocationClosed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "name": "AllocationManagerAllocationSameSize", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "address", + "name": "allocationId", + "type": "address" + } + ], + "name": "AllocationManagerInvalidAllocationProof", + "type": "error" + }, + { + "inputs": [], + "name": "AllocationManagerInvalidZeroAllocationId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "contractName", + "type": "bytes" + } + ], + "name": "GraphDirectoryInvalidZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "forceClosed", + "type": "bool" + } + ], + "name": "AllocationClosed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "AllocationCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newTokens", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldTokens", + "type": "uint256" + } + ], + "name": "AllocationResized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "graphToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphStaking", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphPayments", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEscrow", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "graphController", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphEpochManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphRewardsManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTokenGateway", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphProxyAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphCuration", + "type": "address" + } + ], + "name": "GraphDirectoryInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensIndexerRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokensDelegationRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "poi", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "poiMetadata", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentEpoch", + "type": "uint256" + } + ], + "name": "IndexingRewardsCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "indexer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "allocationId", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "subgraphDeploymentId", + "type": "bytes32" + } + ], + "name": "LegacyAllocationMigrated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxPOIStaleness", + "type": "uint256" + } + ], + "name": "MaxPOIStalenessSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "allocationProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxPOIStaleness", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "allocationProvisionTracker(address)": "6234e216", + "eip712Domain()": "84b0196e", + "maxPOIStaleness()": "85e82baf" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationManagerAllocationClosed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"AllocationManagerAllocationSameSize\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"}],\"name\":\"AllocationManagerInvalidAllocationProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllocationManagerInvalidZeroAllocationId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"contractName\",\"type\":\"bytes\"}],\"name\":\"GraphDirectoryInvalidZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"forceClosed\",\"type\":\"bool\"}],\"name\":\"AllocationClosed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"currentEpoch\",\"type\":\"uint256\"}],\"name\":\"AllocationCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTokens\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldTokens\",\"type\":\"uint256\"}],\"name\":\"AllocationResized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphStaking\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphPayments\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEscrow\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"graphController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphEpochManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphRewardsManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTokenGateway\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphProxyAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphCuration\",\"type\":\"address\"}],\"name\":\"GraphDirectoryInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensIndexerRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokensDelegationRewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"poi\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"poiMetadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"currentEpoch\",\"type\":\"uint256\"}],\"name\":\"IndexingRewardsCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allocationId\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subgraphDeploymentId\",\"type\":\"bytes32\"}],\"name\":\"LegacyAllocationMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxPOIStaleness\",\"type\":\"uint256\"}],\"name\":\"MaxPOIStalenessSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"allocationProvisionTracker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxPOIStaleness\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"AllocationManagerAllocationClosed(address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\"}}],\"AllocationManagerAllocationSameSize(address,uint256)\":[{\"params\":{\"allocationId\":\"The id of the allocation\",\"tokens\":\"The amount of tokens\"}}],\"AllocationManagerInvalidAllocationProof(address,address)\":[{\"params\":{\"allocationId\":\"The id of the allocation\",\"signer\":\"The address that signed the proof\"}}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"params\":{\"contractName\":\"The name of the contract that was not found, or the controller\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"AllocationClosed(address,address,bytes32,uint256,bool)\":{\"details\":\"Emitted when an indexer closes an allocation\",\"params\":{\"allocationId\":\"The id of the allocation\",\"forceClosed\":\"Whether the allocation was force closed\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokens\":\"The amount of tokens allocated\"}},\"AllocationCreated(address,address,bytes32,uint256,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"currentEpoch\":\"The current epoch\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokens\":\"The amount of tokens allocated\"}},\"AllocationResized(address,address,bytes32,uint256,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"newTokens\":\"The new amount of tokens allocated\",\"oldTokens\":\"The old amount of tokens allocated\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\"}},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"params\":{\"graphController\":\"The Graph Controller contract address\",\"graphCuration\":\"The Curation contract address\",\"graphEpochManager\":\"The Epoch Manager contract address\",\"graphEscrow\":\"The Payments Escrow contract address\",\"graphPayments\":\"The Graph Payments contract address\",\"graphProxyAdmin\":\"The Graph Proxy Admin contract address\",\"graphRewardsManager\":\"The Rewards Manager contract address\",\"graphStaking\":\"The Horizon Staking contract address\",\"graphToken\":\"The Graph Token contract address\",\"graphTokenGateway\":\"The Token Gateway contract address\"}},\"IndexingRewardsCollected(address,address,bytes32,uint256,uint256,uint256,bytes32,bytes,uint256)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"currentEpoch\":\"The current epoch\",\"indexer\":\"The address of the indexer\",\"poi\":\"The POI presented\",\"poiMetadata\":\"The metadata associated with the POI\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\",\"tokensDelegationRewards\":\"The amount of tokens collected for delegators\",\"tokensIndexerRewards\":\"The amount of tokens collected for the indexer\",\"tokensRewards\":\"The amount of tokens collected\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LegacyAllocationMigrated(address,address,bytes32)\":{\"params\":{\"allocationId\":\"The id of the allocation\",\"indexer\":\"The address of the indexer\",\"subgraphDeploymentId\":\"The id of the subgraph deployment\"}},\"MaxPOIStalenessSet(uint256)\":{\"params\":{\"maxPOIStaleness\":\"The max POI staleness in seconds\"}}},\"kind\":\"dev\",\"methods\":{\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"}},\"stateVariables\":{\"EIP712_ALLOCATION_ID_PROOF_TYPEHASH\":{\"details\":\"EIP712 typehash for allocation id proof\"}},\"title\":\"AllocationManager contract\",\"version\":1},\"userdoc\":{\"errors\":{\"AllocationManagerAllocationClosed(address)\":[{\"notice\":\"Thrown when attempting to collect indexing rewards on a closed allocationl\"}],\"AllocationManagerAllocationSameSize(address,uint256)\":[{\"notice\":\"Thrown when attempting to resize an allocation with the same size\"}],\"AllocationManagerInvalidAllocationProof(address,address)\":[{\"notice\":\"Thrown when an allocation proof is invalid Both `signer` and `allocationId` should match for a valid proof.\"}],\"AllocationManagerInvalidZeroAllocationId()\":[{\"notice\":\"Thrown when attempting to create an allocation with a zero allocation id\"}],\"GraphDirectoryInvalidZeroAddress(bytes)\":[{\"notice\":\"Thrown when either the controller is the zero address or a contract address is not found on the controller\"}]},\"events\":{\"AllocationCreated(address,address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when an indexer creates an allocation\"},\"AllocationResized(address,address,bytes32,uint256,uint256)\":{\"notice\":\"Emitted when an indexer resizes an allocation\"},\"GraphDirectoryInitialized(address,address,address,address,address,address,address,address,address,address)\":{\"notice\":\"Emitted when the GraphDirectory is initialized\"},\"IndexingRewardsCollected(address,address,bytes32,uint256,uint256,uint256,bytes32,bytes,uint256)\":{\"notice\":\"Emitted when an indexer collects indexing rewards for an allocation\"},\"LegacyAllocationMigrated(address,address,bytes32)\":{\"notice\":\"Emitted when a legacy allocation is migrated into the subgraph service\"},\"MaxPOIStalenessSet(uint256)\":{\"notice\":\"Emitted when the maximum POI staleness is updated\"}},\"kind\":\"user\",\"methods\":{\"allocationProvisionTracker(address)\":{\"notice\":\"Tracks allocated tokens per indexer\"},\"maxPOIStaleness()\":{\"notice\":\"Maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards\"}},\"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).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utilities/AllocationManager.sol\":\"AllocationManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/arbitrum/ITokenGateway.sol\":{\"keccak256\":\"0x3cbcc6e4629543a99acacc7ee4ffa6c063b9fb17d3597ccd2f9481008e3633bd\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d6bb0bb830b67d579e57a261e5f5d9e90b32dc006b02badbecf1f6c82c0a5100\",\"dweb:/ipfs/Qmd38iNXZpinwbNRJPEAA8r9bmmtRwjTSK1SkmH47ge4kJ\"]},\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/epochs/IEpochManager.sol\":{\"keccak256\":\"0x0f4b3a3569c023d2610d0d8b37b3ecb0b67f848d77aa063bb311756670017e85\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://df7c43568e554b301134aa2c58e4889ad0d3dcfec40e834b63621a43f39da154\",\"dweb:/ipfs/QmZeSV9AM6FKCkH9QYyF7i5nVggseEJXbvWbtrgUeXqQpo\"]},\"@graphprotocol/contracts/contracts/governance/IController.sol\":{\"keccak256\":\"0xe37df86cdea385d708ba00862cd9e04940e4f2aa50354fb3a9d2d4f505d5509a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f6c9fd2b7a8c5a6b89ef12c7423144df04a5f251d5480be1b73c74a785ff12a\",\"dweb:/ipfs/QmYpiCQoxbDEYQ2FNA39Z4FGfoxfQ8jvH1Z3ccrqguQFMP\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsManager.sol\":{\"keccak256\":\"0xee4b213950c2e46481658b9b04f2d5dae0a96c4cce0ee346188b1f1272718d54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b26dd767bd6887666a18beef79c322d27a693a3a4f7a61dc6bded7f35796acf5\",\"dweb:/ipfs/QmXDeqmRSeAWUWQTknNLUPBDBnDr8ySYW4h6CBPRGMJoPp\"]},\"@graphprotocol/contracts/contracts/token/IGraphToken.sol\":{\"keccak256\":\"0x2ffad6798d641c8d1288730be725c43041c803caceaf6d9985122d000ad5761c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5f782a5670037fc9223dc20fd4f99c0277a9bec7d08f7800b0a0733e819a07cb\",\"dweb:/ipfs/QmP3K2QnmukScCh1nzgphYdg7AiAuTaT914jq4txLYNpra\"]},\"@graphprotocol/contracts/contracts/utils/TokenUtils.sol\":{\"keccak256\":\"0x7bd336193785ed6f09a3bd847f9208f64aa9b87ad67c40838d00fec41bb153d5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d96d83cdb9bbb567e4eafac8bdef3ff6bdaf426338baf76bae277c11afb33cee\",\"dweb:/ipfs/QmNjr4PiJ76Wc5mFqa9H88BjsEMrUfy1jiftNHYTgd6Mp5\"]},\"@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol\":{\"keccak256\":\"0xc0f433a20f91fb2c2c588d5accfd311535314d71f7adc4e2b84fa4193ed1a739\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a920d9446c3e76783921d2f2d980a058f41700de1d59470c9b3892a49ebcaf48\",\"dweb:/ipfs/QmcwmqNkxS1BpJQ7kgf4V9F98w2MKcVvg2N7P3i8KtDSF4\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphProxyAdmin.sol\":{\"keccak256\":\"0x4410253d7de56d2cdff50ee141c52fd77fd23f3984440211c3cc90ad560f4f9d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://da4425a908816c40ffc3c833504843c3732bcb47e745dc544f650e5bc2c23f25\",\"dweb:/ipfs/QmZYDS4cSKBqRXEU3qyjE6sxGModSeNgzQmdZmZCGHuaKt\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsEscrow.sol\":{\"keccak256\":\"0x99e2a676b539e7b6c223a551f8cb9770c07435a25c8b22f0044a8ce4949edadc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f702a3cea214d8328d89a0ef16495c709e30fe13eb86fc29940159c9cb8c7bd5\",\"dweb:/ipfs/QmS25Zgcw85kDZcicApLzRmDcoYNQafpFdMyBEWX8eLWSX\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@graphprotocol/horizon/contracts/libraries/PPMMath.sol\":{\"keccak256\":\"0xe7fcfd44d2919944b79a11a39da7d4539d49c4bcf510071a59f6b41c37ee8ef2\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://a21b1ff7ca81fa07f153b60aeca136bd1ee57d9d01a2c76635e4a5602e8959fc\",\"dweb:/ipfs/QmQ5C7mUjt4sv1NBt1FH5XVHN3aBsHnvDsdJKWywhLjso8\"]},\"@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol\":{\"keccak256\":\"0x1d09be2f7454873ab80f86ed5d590b9e796fe5146977c4c4a5b1f7ead17eb522\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1c7539d26f069c2acabd404601e7811f8878f66976e8b5d4f5438195de793c2\",\"dweb:/ipfs/QmUAybvtDZ275kAnU6r81aQy1FCp7zLscSV87oe9nbwjyU\"]},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\":{\"keccak256\":\"0xd45a5b1d0e451376b08e1bc7e332426c24382053300acf0ac667be1b8abb6cc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://824eb0b8c71db8b95b707218d8540c2046a2fefc642e74b343ae90e5c72e2b52\",\"dweb:/ipfs/QmdQTZTomqxRrySDNdv1FEyh3ZWibxwC9FRdcV3DCuASpx\"]},\"@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a\",\"dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x81c274a60a7ae232ae3dc9ff3a4011b4849a853c13b0832cd3351bb1bb2f0dae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da0c20dc74358a2a76330818f3bac9d1e2ce3371aec847b9cbf5d147fbae4f6\",\"dweb:/ipfs/QmeczhmnFv1hbXKGLwbYXY6Rrytc9a5A2YaRi5QMMgjPnb\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x26670fef37d4adf55570ba78815eec5f31cb017e708f61886add4fc4da665631\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b16d45febff462bafd8a5669f904796a835baf607df58a8461916d3bf4f08c59\",\"dweb:/ipfs/QmU2eJFpjmT4vxeJWJyLeQb8Xht1kdB8Y6MKLDPFA9WPux\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]},\"contracts/utilities/AllocationManager.sol\":{\"keccak256\":\"0xe48e4486cb11da8e2f24afe998ae1f8ab7e2eed0edeff2ff8eb47e120ed32c91\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://0f7336a767d5b959f8cbeb9453834d887c28c9e9e4217d3bacf7faf01aaff33f\",\"dweb:/ipfs/QmQ6twAz4MfREzPbDttCMJqCuo2YNr8ks6R8ZzrJBR3daV\"]},\"contracts/utilities/AllocationManagerStorage.sol\":{\"keccak256\":\"0x45317fa3daef1ebca670b1d3ba19579d7a46b8b19daff7e534a89a122b0fe178\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ecca9d9581e489225014f8879df4bdd69945f2f686fddeff41e31377670f6866\",\"dweb:/ipfs/QmURUHNSv8i9dtkmdaAJxXqDXfg6hbJXLwUqhHronA8Fwr\"]}},\"version\":1}" + } + }, + "contracts/utilities/AllocationManagerStorage.sol": { + "AllocationManagerV1Storage": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "indexer", + "type": "address" + } + ], + "name": "allocationProvisionTracker", + "outputs": [ + { + "internalType": "uint256", + "name": "tokens", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxPOIStaleness", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "allocationProvisionTracker(address)": "6234e216", + "maxPOIStaleness()": "85e82baf" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"indexer\",\"type\":\"address\"}],\"name\":\"allocationProvisionTracker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxPOIStaleness\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"__gap\":{\"details\":\"Gap to allow adding variables in future upgrades\"},\"_subgraphAllocatedTokens\":{\"details\":\"Used to calculate indexing rewards\"}},\"title\":\"AllocationManagerStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allocationProvisionTracker(address)\":{\"notice\":\"Tracks allocated tokens per indexer\"},\"maxPOIStaleness()\":{\"notice\":\"Maximum amount of time, in seconds, allowed between presenting POIs to qualify for indexing rewards\"}},\"notice\":\"This contract holds all the storage variables for the Allocation Manager contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utilities/AllocationManagerStorage.sol\":\"AllocationManagerV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]},\"contracts/utilities/AllocationManagerStorage.sol\":{\"keccak256\":\"0x45317fa3daef1ebca670b1d3ba19579d7a46b8b19daff7e534a89a122b0fe178\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ecca9d9581e489225014f8879df4bdd69945f2f686fddeff41e31377670f6866\",\"dweb:/ipfs/QmURUHNSv8i9dtkmdaAJxXqDXfg6hbJXLwUqhHronA8Fwr\"]}},\"version\":1}" + } + }, + "contracts/utilities/AttestationManager.sol": { + "AttestationManager": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{},\"title\":\"AttestationManager contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A helper contract implementing attestation verification. Uses a custom implementation of EIP712 for backwards compatibility with attestations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utilities/AttestationManager.sol\":\"AttestationManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]},\"contracts/utilities/AttestationManager.sol\":{\"keccak256\":\"0x44218c9dd0d618b0e383cad19efd5846ec85d1a11270aa7c04b75e2fa7ddc3a4\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ee8ca0b9b9746636ff1ad549081fbc176d959544bc7798d0bfb10e3ec61af8b7\",\"dweb:/ipfs/QmcE9RJqj32uoTsWLV2ffwuEPWnBh7Vn8ZpzorXBjgosGd\"]},\"contracts/utilities/AttestationManagerStorage.sol\":{\"keccak256\":\"0x3ae176c9166fac5bfb08e875ad132fe9d1559ce67df28b906683d4f168e1afdc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2b40d4be47cc74387e3c390e081bdadc84f84062e9708a7a84d73f02e0a3853a\",\"dweb:/ipfs/QmQL8DUzrtgQABb1CvcuSeuapXntXEh5aKi4ZjE3MssBgZ\"]}},\"version\":1}" + } + }, + "contracts/utilities/AttestationManagerStorage.sol": { + "AttestationManagerV1Storage": { + "abi": [], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"__gap\":{\"details\":\"Gap to allow adding variables in future upgrades\"},\"_domainSeparator\":{\"details\":\"EIP712 domain separator\"}},\"title\":\"AttestationManagerStorage\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"This contract holds all the storage variables for the Attestation Manager contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utilities/AttestationManagerStorage.sol\":\"AttestationManagerV1Storage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"contracts/utilities/AttestationManagerStorage.sol\":{\"keccak256\":\"0x3ae176c9166fac5bfb08e875ad132fe9d1559ce67df28b906683d4f168e1afdc\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2b40d4be47cc74387e3c390e081bdadc84f84062e9708a7a84d73f02e0a3853a\",\"dweb:/ipfs/QmQL8DUzrtgQABb1CvcuSeuapXntXEh5aKi4ZjE3MssBgZ\"]}},\"version\":1}" + } + }, + "contracts/utilities/Directory.sol": { + "Directory": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "disputeManager", + "type": "address" + } + ], + "name": "DirectoryNotDisputeManager", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "subgraphService", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "disputeManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "graphTallyCollector", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "curation", + "type": "address" + } + ], + "name": "SubgraphServiceDirectoryInitialized", + "type": "event" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"disputeManager\",\"type\":\"address\"}],\"name\":\"DirectoryNotDisputeManager\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"subgraphService\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"disputeManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"graphTallyCollector\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"curation\",\"type\":\"address\"}],\"name\":\"SubgraphServiceDirectoryInitialized\",\"type\":\"event\"}],\"devdoc\":{\"custom:security-contact\":\"Please email security+contracts@thegraph.com if you find any bugs. We may have an active bug bounty program.\",\"errors\":{\"DirectoryNotDisputeManager(address,address)\":[{\"params\":{\"caller\":\"The caller address\",\"disputeManager\":\"The Dispute Manager address\"}}]},\"events\":{\"SubgraphServiceDirectoryInitialized(address,address,address,address)\":{\"params\":{\"curation\":\"The Curation contract address\",\"disputeManager\":\"The Dispute Manager contract address\",\"graphTallyCollector\":\"The Graph Tally Collector contract address\",\"subgraphService\":\"The Subgraph Service contract address\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"curation\":\"The Curation contract address\",\"disputeManager\":\"The Dispute Manager contract address\",\"graphTallyCollector\":\"The Graph Tally Collector contract address\",\"subgraphService\":\"The Subgraph Service contract address\"}}},\"stateVariables\":{\"CURATION\":{\"details\":\"Required for curation fees distribution\"},\"GRAPH_TALLY_COLLECTOR\":{\"details\":\"Required to collect payments via Graph Horizon payments protocol\"}},\"title\":\"Directory contract\",\"version\":1},\"userdoc\":{\"errors\":{\"DirectoryNotDisputeManager(address,address)\":[{\"notice\":\"Thrown when the caller is not the Dispute Manager\"}]},\"events\":{\"SubgraphServiceDirectoryInitialized(address,address,address,address)\":{\"notice\":\"Emitted when the Directory is initialized\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Constructor for the Directory contract\"}},\"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.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utilities/Directory.sol\":\"Directory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@graphprotocol/contracts/contracts/curation/ICuration.sol\":{\"keccak256\":\"0x17e4db429003cab08cd2859db94b95e0cee1f9478c1881903a4104def8fdc048\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://52ed58228a0e92aeb3493473a6e02f92d26a4e4eb0c46d38dd446e3bfcb6691e\",\"dweb:/ipfs/QmZzWxHAztdz2Q7cobqVEf4ExGpNuqWJFYgs2oHCgApjW6\"]},\"@graphprotocol/contracts/contracts/rewards/IRewardsIssuer.sol\":{\"keccak256\":\"0xe049090c38a64d80b284ba2a7b440bcedba9804d96f2bb8da525e69ac452e03a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b7d1186bd0698bed02d3504ac80c20e605087fba036d5ff392b39a9a3c818e5\",\"dweb:/ipfs/QmRgAfY1dD5rc7fLuuGVyu2mh9Z8qz1AVvuXAcRGnB3dSv\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataService.sol\":{\"keccak256\":\"0x2208814f64eeca9409eafc1a1fa425c67ff38cffdffc3af0bafbe1c1b338ed32\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://925b32efbd9fe85a98f8f1f51e865e0b7b65d933196cf6c098bd670da7138e0c\",\"dweb:/ipfs/Qmdrp7BGJ4fEKzDgZpVY1FULXKsHAdGXkx4nqRrWvMaumr\"]},\"@graphprotocol/horizon/contracts/data-service/interfaces/IDataServiceFees.sol\":{\"keccak256\":\"0x1b82ae2785502fe62d3ca6f55a3ed836b8b038a3b929cced92e1c6b4733f4074\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5556b2ce53b604427a995fb50f7169acb3fe30f60ef19c7cb5c22bd5ec53177c\",\"dweb:/ipfs/QmXx7dmTeAYAMPbbrGrcsKT31dqEqbcFgXWaPS6LQrANru\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphPayments.sol\":{\"keccak256\":\"0xa22dcc47676073113e4ebe30045065662cee5531f9c5f75776c00e70a1929c81\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://8908f30b3c7536798b14dc62fb5ccffc05570d568dbd1bade7c79c1fd2a4b5fe\",\"dweb:/ipfs/QmexZgb5mhDmXVZnYX1Z37cwM7EG2prYyBEVjUSVdKshVr\"]},\"@graphprotocol/horizon/contracts/interfaces/IGraphTallyCollector.sol\":{\"keccak256\":\"0x762c26300d098fb1bdc5e6b52e0ffd0b497634e9bcfc9a9cd409df65d8d54590\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://f5c68742e96c1483449c882b082631a9bfafebb27152b87427e1234d34e604f3\",\"dweb:/ipfs/QmYqtSeQpCbKEaKKDXwmeK5DrYFiwSHYVzM3dzanh7MQ3D\"]},\"@graphprotocol/horizon/contracts/interfaces/IHorizonStaking.sol\":{\"keccak256\":\"0x4b146f30ee66c4224cb5a82bafc8299f8596d8fe302e793757520f67bba8a166\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://30666c737d72a850223c1966d3b5d02b84f3f808f3c8dae8d0748731646b60c5\",\"dweb:/ipfs/QmQschyZQtU8tTnQ9hNiG5nobuXBx6KeiKdfxvZ4zvQ7ty\"]},\"@graphprotocol/horizon/contracts/interfaces/IPaymentsCollector.sol\":{\"keccak256\":\"0x0871e02129e1fabdb39024f9ac3368b4c747e6b374fdf4fc200d3c225ed82860\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a5fdf2dbedc15f739e6010a3ce3478ea7ad23bd643a8af3f39ccf631c06ebd52\",\"dweb:/ipfs/QmNusbPTqzzUwGomXBzsWHwbZMJ2HuTkxvgviLJZ6hr9i4\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingBase.sol\":{\"keccak256\":\"0x9bdab6cb595eabd7d321d7beae03ad3607995c14ef40f0c2f349fb72084766c5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6cac2ca3580bd770b98b07b11ebb007e8a922a90cde920e6ec472df7e66fb512\",\"dweb:/ipfs/QmRw1rjT8D8gNp2GRTuwDETwHNHMpHKoHZq4pYBAn9i65F\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingExtension.sol\":{\"keccak256\":\"0x7923f39746198b5672f0e4d65b7bf14903ae5f7775d74b210effb957eea36c71\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c29531aff69c71e649fb347d7117ea8c42fc8de09860a1c389ed9b8f097a34e0\",\"dweb:/ipfs/QmS89fww584HiyE1BdPe8Xaqbf5v7FEvL38GTxeHEAsLFm\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingMain.sol\":{\"keccak256\":\"0xd04bb1f6a427e858e8a625b4b9835c69c8891a324d22beba20293ab2a77e5de7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://05c9e425eee0b6c109a8dad2edcf9e1c845c64fccf321edf804921394ee048be\",\"dweb:/ipfs/QmbwLWNof534oG5ohzNAWrjdQ5kqJs7M5d5kCRd68XUogB\"]},\"@graphprotocol/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol\":{\"keccak256\":\"0xaaeb9770f8aaae6b395e87bb1876a10fe7c14384d16d97dd33a671c3ea53aa7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8f5c019fdb2df73bafe464fb6e9da792f7833a0c1858734bcd6a6b8d6ae924c7\",\"dweb:/ipfs/QmcubeYTHCYBqQsRncBFpPFtk7JzRz4nFh27LUW1m4hx2K\"]},\"@graphprotocol/horizon/contracts/libraries/LinkedList.sol\":{\"keccak256\":\"0x99058b4da0428b8d9c22d3d112acbaa59900f1fd0a434038b1a4fccfe3c678d6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://568e03231c6081eacbcb6585a05c0b1bb976b640b611f7bf6155f9b58d887239\",\"dweb:/ipfs/QmdPZQWhkhjf5TUwz487Dwm4ycjX323iNdwb1sQnAiA1Qu\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"contracts/interfaces/IDisputeManager.sol\":{\"keccak256\":\"0x9db8ffdf7fe30954824ed706a1a5e7c2d6323b745bddba16b7166a639344f9f7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e5d810bf6188c38a028dab511c5653fde7b7feca0a173f03974402a83cb234f9\",\"dweb:/ipfs/QmYGtytqHeDFK91FmSNL5iavD8sHUFcA47WBU9BuHG3i75\"]},\"contracts/interfaces/ISubgraphService.sol\":{\"keccak256\":\"0x7516f80b0a8b2e3edeedf06c9b917f2a24e557f8c00632e6150fbb41ef8da3ce\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://ad4f813111541f5ef9ea6236f42822a3a66364d24189e4568450b20e09972a5e\",\"dweb:/ipfs/QmVYQA9rT7T8YnQgAB6fokNYDJeDrgQqrjfJ8sGjySNFBo\"]},\"contracts/libraries/Allocation.sol\":{\"keccak256\":\"0xeabed16693ebd22165d4421bb62b91de64553f94d86d6fd03e3d25a62d651000\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://5beecbf35f8dc63fc9fcd5fe844ff29cb4874c1ac73a96ec7170729efd096b74\",\"dweb:/ipfs/QmPFQyxQYuwae8ARxuLxingd8fQ7GBw1cfTQuUvfo6CWhM\"]},\"contracts/libraries/Attestation.sol\":{\"keccak256\":\"0x0976f586d532d479823ac9e049371742a7a876f0faf3ed722b3b7f78a4586f33\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://34baba14bd7d3dcb1e1111ee09f3c809d6876732bbc889c1486cc329465e711e\",\"dweb:/ipfs/QmPRgYduW85aCjVk4ih35jB2FhoLjBvgmjZtMGeqXaLhTW\"]},\"contracts/libraries/LegacyAllocation.sol\":{\"keccak256\":\"0x32fd54a2823bf3fa4090bf94968b4d8a5988fee8f75d1b805591a744f5766c60\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://2571faaa157c207853cd52e730aaab019384d84618b6dce976b9d794a9634a54\",\"dweb:/ipfs/QmSinKJ1WguxvZte5C3eVfGBo8gsvzTbPQh7uVREWT49uL\"]},\"contracts/utilities/Directory.sol\":{\"keccak256\":\"0x8f8b8d8dd7cd1acee659a21c81782fd9955f364c5b37669c11c135c66371bd3a\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://c50bdf51e6d19d6413920c200b5ddbf07eaa3860b35822633cecf636fd96d29d\",\"dweb:/ipfs/QmTQfCXiKzqpZVJDd3NeLtQvwBTVDXfznVJjEASh4aso4k\"]}},\"version\":1}" + } + } + } + } +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/deployed_addresses.json b/packages/subgraph-service/ignition/deployments/chain-421614/deployed_addresses.json new file mode 100644 index 000000000..e8c9f57aa --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/deployed_addresses.json @@ -0,0 +1,56 @@ +{ + "SubgraphServiceProxies#OZProxyDummy_DisputeManager": "0x6b4F986A7a7E97E233Cb30172aAc5d1f68C1869a", + "SubgraphServiceProxies#OZProxyDummy_SubgraphService": "0x3E0C10883B120D3Cd2Ae5d78265204eDb68c434f", + "SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0", + "SubgraphServiceProxies#DisputeManager_ProxyWithABI": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "SubgraphServiceProxies#SubgraphService_ProxyWithABI": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0", + "SubgraphServiceProxies#ProxyAdmin_DisputeManager": "0x9a8C3B6D649108bd11670de0B9b981ae3C167707", + "SubgraphServiceProxies#ProxyAdmin_SubgraphService": "0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6", + "Controller#Controller": "0x0750EdA3185C758247E97819074bCD217a815FaE", + "EpochManager#EpochManager": "0x450906A976dc21450A7CcD1989D26E137E605B91", + "GraphProxyAdmin#GraphProxyAdmin": "0x1CEBe1C314Cc454baf4bd553409d957C833623c0", + "HorizonProxies#OZProxyDummy_GraphPayments": "0x8A44C49eD477e7130249d4B8d5248d08B469Bf0d", + "HorizonProxies#OZProxyDummy_PaymentsEscrow": "0xBaBe8F24fFB27fb01C5b66999Db6929E5d500C70", + "HorizonStaking#ExponentialRebates": "0xF2DB533658a1728f3ce04A49Df4b545f4A53b620", + "L2Curation#GraphCurationToken": "0xb85d6e91EeAdDc35927AF34e5E28428282e4bcF2", + "L2Curation#L2Curation": "0x9CCD9B656f8A558879974ef2505496eEd7Ef7210", + "L2GraphToken#L2GraphToken": "0x71927f8Ff0ce294882e2A161A54F62f3b0f3c726", + "L2GraphTokenGateway#L2GraphTokenGateway": "0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4", + "RewardsManager#RewardsManager": "0x05Ca4d407ec53Ac17ce6Bb414f42663f415Dc5C3", + "HorizonProxies#TransparentUpgradeableProxy_GraphPayments": "0xAFd60629034fBdC3ef58518B817bBDB4EC861c93", + "HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow": "0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85", + "HorizonProxies#GraphPayments_ProxyWithABI": "0xAFd60629034fBdC3ef58518B817bBDB4EC861c93", + "HorizonProxies#PaymentsEscrow_ProxyWithABI": "0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85", + "EpochManager#GraphProxy": "0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2", + "HorizonProxies#GraphProxy": "0xF5D432192dAF7e8B045349693577ccF0B5165A12", + "L2Curation#GraphProxy": "0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4", + "L2GraphToken#GraphProxy": "0xBBcb9a575176039C06F94d4d8337818318A26828", + "L2GraphTokenGateway#GraphProxy": "0x7284213d1cDa80C892a4388f38dA431F06343144", + "RewardsManager#GraphProxy": "0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f", + "EpochManager#EpochManager_ProxyWithABI": "0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2", + "HorizonProxies#ProxyAdmin_GraphPayments": "0xAcA3dd622e863E425Cdb15E8734a5CB318448db7", + "HorizonProxies#ProxyAdmin_PaymentsEscrow": "0xbB643167f03EfF532c537e3d72E56b9992CaD985", + "L2Curation#L2Curation_ProxyWithABI": "0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4", + "L2GraphToken#L2GraphToken_ProxyWithABI": "0xBBcb9a575176039C06F94d4d8337818318A26828", + "L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI": "0x7284213d1cDa80C892a4388f38dA431F06343144", + "RewardsManager#RewardsManager_ProxyWithABI": "0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f", + "GraphPayments#GraphPayments": "0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866", + "GraphTallyCollector#GraphTallyCollector": "0xB63bC33D13F73eFD14d32D2b9FC0B6116B6611CE", + "HorizonStaking#HorizonStakingExtension": "0x37F125cF456CD8d24277033A3b583491E9003689", + "PaymentsEscrow#PaymentsEscrow": "0xeED33B904efF05BbdcC9008F5174088DF77dD183", + "HorizonStaking#HorizonStaking": "0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244", + "GraphPayments#GraphPayments_ProxyWithABI": "0xAFd60629034fBdC3ef58518B817bBDB4EC861c93", + "PaymentsEscrow#PaymentsEscrow_ProxyWithABI": "0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85", + "HorizonStaking#HorizonStaking_ProxyWithABI": "0xF5D432192dAF7e8B045349693577ccF0B5165A12", + "DisputeManager#DisputeManagerProxy": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "DisputeManager#ProxyAdmin": "0x9a8C3B6D649108bd11670de0B9b981ae3C167707", + "L2Curation#L2CurationAddressBook": "0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4", + "L2Curation#L2CurationImplementationAddressBook": "0x9CCD9B656f8A558879974ef2505496eEd7Ef7210", + "SubgraphService#ProxyAdmin": "0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6", + "SubgraphService#SubgraphServiceProxy": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0", + "DisputeManager#DisputeManager": "0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8", + "SubgraphService#SubgraphService": "0x30b34eAaF354cAdd64836Bc0846F4414254271ea", + "DisputeManager#DisputeManager_ProxyWithABI": "0x1A7Fb71014d4395903eC56662f32dD02344D361C", + "SubgraphService#SubgraphService_ProxyWithABI": "0x00fe8F95407AB61863d27c07F584A0930ee5F3b0" +} diff --git a/packages/subgraph-service/ignition/deployments/chain-421614/journal.jsonl b/packages/subgraph-service/ignition/deployments/chain-421614/journal.jsonl new file mode 100644 index 000000000..d6f3d98ea --- /dev/null +++ b/packages/subgraph-service/ignition/deployments/chain-421614/journal.jsonl @@ -0,0 +1,513 @@ + +{"chainId":421614,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","constructorArgs":[],"contractName":"Dummy","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","networkInteraction":{"data":"0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","networkInteractionId":1,"nonce":1582,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","networkInteractionId":1,"nonce":1582,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x4a914684ac2dae92b72d40b48120d482cd26967c0e3c4a042e3d593e2adcccc8"},"type":"TRANSACTION_SEND"} +{"artifactId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","constructorArgs":[],"contractName":"Dummy","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","networkInteraction":{"data":"0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","networkInteractionId":1,"nonce":1583,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","networkInteractionId":1,"nonce":1583,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xb1224fe72f112a7c484049e570aa9b924d289c4898da9ce21e25cdd51551175e"},"type":"TRANSACTION_SEND"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","hash":"0x4a914684ac2dae92b72d40b48120d482cd26967c0e3c4a042e3d593e2adcccc8","networkInteractionId":1,"receipt":{"blockHash":"0x97f4dcd56e8c444a56a123f11486e8b48e361620c6628b80c83ea5d721e469c2","blockNumber":152512294,"contractAddress":"0x6b4F986A7a7E97E233Cb30172aAc5d1f68C1869a","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_DisputeManager","result":{"address":"0x6b4F986A7a7E97E233Cb30172aAc5d1f68C1869a","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","hash":"0xb1224fe72f112a7c484049e570aa9b924d289c4898da9ce21e25cdd51551175e","networkInteractionId":1,"receipt":{"blockHash":"0xc1bc099664d1d40c84e2535598a0a178d1f3f4e996d2b1c7b66c82d6eb5ea541","blockNumber":152512306,"contractAddress":"0x3E0C10883B120D3Cd2Ae5d78265204eDb68c434f","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphServiceProxies#OZProxyDummy_SubgraphService","result":{"address":"0x3E0C10883B120D3Cd2Ae5d78265204eDb68c434f","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","constructorArgs":["0x6b4F986A7a7E97E233Cb30172aAc5d1f68C1869a","0xade6b8eb69a49b56929c1d4f4b428d791861db6f","0x"],"contractName":"TransparentUpgradeableProxy","dependencies":["SubgraphServiceProxies#OZProxyDummy_DisputeManager"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","networkInteraction":{"data":"0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000006b4f986a7a7e97e233cb30172aac5d1f68c1869a000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","networkInteractionId":1,"nonce":1584,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","networkInteractionId":1,"nonce":1584,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x28d358116c2778e03dca58dd69a8369e1308788ae7fd6822cb32108505814f0a"},"type":"TRANSACTION_SEND"} +{"artifactId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","constructorArgs":["0x3E0C10883B120D3Cd2Ae5d78265204eDb68c434f","0xade6b8eb69a49b56929c1d4f4b428d791861db6f","0x"],"contractName":"TransparentUpgradeableProxy","dependencies":["SubgraphServiceProxies#OZProxyDummy_SubgraphService"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","networkInteraction":{"data":"0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000003e0c10883b120d3cd2ae5d78265204edb68c434f000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","networkInteractionId":1,"nonce":1585,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","networkInteractionId":1,"nonce":1585,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xbcdc17c76bb47fa76b91a8be12fe55694918ddeb0c25d48dbf9e843c0e687939"},"type":"TRANSACTION_SEND"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","hash":"0x28d358116c2778e03dca58dd69a8369e1308788ae7fd6822cb32108505814f0a","networkInteractionId":1,"receipt":{"blockHash":"0xd334b83726dd4651794fd9580f0a42a0f11f59c4b452d24c01264a5ff4f407d2","blockNumber":152512329,"contractAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","logs":[{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000006b4f986a7a7e97e233cb30172aac5d1f68c1869a"]},{"address":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a8c3b6d649108bd11670de0b9b981ae3c167707","logIndex":2,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","result":{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","hash":"0xbcdc17c76bb47fa76b91a8be12fe55694918ddeb0c25d48dbf9e843c0e687939","networkInteractionId":1,"receipt":{"blockHash":"0x0ac8db5789fd95ef34d31a53ff9ed732628f3f25908473e804f58b56d09a22d8","blockNumber":152512341,"contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000003e0c10883b120d3cd2ae5d78265204edb68c434f"]},{"address":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d23a972f47b7d45e729ab9b8399d628c87b6c0d6","logIndex":2,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","result":{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"SubgraphServiceProxies#DisputeManager_ProxyWithABI","contractAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","contractName":"DisputeManager_ProxyWithABI","dependencies":["SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager"],"futureId":"SubgraphServiceProxies#DisputeManager_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphServiceProxies#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","contractName":"SubgraphService_ProxyWithABI","dependencies":["SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService"],"futureId":"SubgraphServiceProxies#SubgraphService_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager","dependencies":["SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager"],"emitterAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","eventIndex":0,"eventName":"AdminChanged","futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager_AdminChanged","nameOrIndex":"newAdmin","result":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x28d358116c2778e03dca58dd69a8369e1308788ae7fd6822cb32108505814f0a","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService","dependencies":["SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService"],"emitterAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","eventIndex":0,"eventName":"AdminChanged","futureId":"SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService_AdminChanged","nameOrIndex":"newAdmin","result":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xbcdc17c76bb47fa76b91a8be12fe55694918ddeb0c25d48dbf9e843c0e687939","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphServiceProxies#ProxyAdmin_DisputeManager","contractAddress":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","contractName":"ProxyAdmin","dependencies":["SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager_AdminChanged"],"futureId":"SubgraphServiceProxies#ProxyAdmin_DisputeManager","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphServiceProxies#ProxyAdmin_SubgraphService","contractAddress":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","contractName":"ProxyAdmin","dependencies":["SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService_AdminChanged"],"futureId":"SubgraphServiceProxies#ProxyAdmin_SubgraphService","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"Controller#Controller","constructorArgs":[],"contractName":"Controller","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"Controller#Controller","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"Controller#Controller","networkInteraction":{"data":"0x608060405234801561001057600080fd5b506100243361003360201b6109b21760201c565b61002e6001610055565b6100e7565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600160159054906101000a900460ff1615158115151415610075576100e4565b6001805460ff60a81b1916600160a81b8315158102919091179182905560ff910416156100a157426003555b60015460408051600160a81b90920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a15b50565b610ba0806100f66000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a2578063e0e9929211610071578063e0e9929214610215578063e3056a3414610241578063eb5dd94f14610249578063f2fde38b14610275578063f7641a5e1461029b5761010b565b80635c975abb146101e057806379ba5097146101e85780639181df9c146101f057806391b4ded91461020d5761010b565b80632e292fc7116100de5780632e292fc71461017757806348bde20c146101935780634fc07d75146101b957806356371bd8146101c15761010b565b80630c340a2414610110578063147ddef51461013457806316c38b3c1461014e57806324a3d6221461016f575b600080fd5b6101186102b8565b604080516001600160a01b039092168252519081900360200190f35b61013c6102c7565b60408051918252519081900360200190f35b61016d6004803603602081101561016457600080fd5b503515156102cd565b005b610118610337565b61017f610346565b604080519115158252519081900360200190f35b61016d600480360360208110156101a957600080fd5b50356001600160a01b0316610356565b610118610412565b61016d600480360360208110156101d757600080fd5b50351515610421565b61017f610488565b61016d610498565b61016d6004803603602081101561020657600080fd5b50356105a6565b61013c610651565b61016d6004803603604081101561022b57600080fd5b50803590602001356001600160a01b0316610657565b61011861076e565b61016d6004803603604081101561025f57600080fd5b50803590602001356001600160a01b031661077d565b61016d6004803603602081101561028b57600080fd5b50356001600160a01b0316610899565b610118600480360360208110156102b157600080fd5b5035610997565b6000546001600160a01b031681565b60025481565b6000546001600160a01b03163314806102f057506004546001600160a01b031633145b61032b5760405162461bcd60e51b8152600401808060200182810382526022815260200180610b496022913960400191505060405180910390fd5b610334816109d4565b50565b6004546001600160a01b031681565b600154600160a01b900460ff1690565b6000546001600160a01b031633146103ae576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610409576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61033481610a65565b6000546001600160a01b031690565b6000546001600160a01b031633148061044457506004546001600160a01b031633145b61047f5760405162461bcd60e51b8152600401808060200182810382526022815260200180610b496022913960400191505060405180910390fd5b61033481610ab7565b600154600160a81b900460ff1690565b6001546001600160a01b031680158015906104bb5750336001600160a01b038216145b61050c576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b031633146105fe576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b600081815260056020908152604080832080546001600160a01b031916905580519283525183927f937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd92908290030190a250565b60035481565b6000546001600160a01b031633146106af576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661070a576040805162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742061646472657373206d7573742062652073657400000000604482015290519081900360640190fd5b60008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927f937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd92908290030190a25050565b6001546001600160a01b031681565b6000546001600160a01b031633146107d5576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610829576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b6000828152600560205260408082205481516392eefe9b60e01b81526001600160a01b038581166004830152925192909116926392eefe9b9260248084019382900301818387803b15801561087d57600080fd5b505af1158015610891573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146108f1576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610943576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000908152600560205260409020546001600160a01b031690565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600160159054906101000a900460ff16151581151514156109f457610334565b6001805460ff60a81b1916600160a81b8315158102919091179182905560ff91041615610a2057426003555b60015460408051600160a81b90920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b600160149054906101000a900460ff1615158115151415610ad757610334565b6001805460ff60a01b1916600160a01b8315158102919091179182905560ff91041615610b0357426002555b60015460408051600160a01b90920460ff1615158252517f511b770d1b1dc5cbd412a5017f55cbb2295b826385e5f46c1de2b6ebeb44ae02916020908290030190a15056fe4f6e6c7920476f7665726e6f72206f7220477561726469616e2063616e2063616c6ca26469706673582212207cecec10a8617577e80b5c52f6cd82da5e5974468c039848ed5e90b25c8267c764736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"Controller#Controller","networkInteractionId":1,"nonce":1586,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"Controller#Controller","networkInteractionId":1,"nonce":1586,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x38745c8ad22d3cd61a943a23dcc475e54d0c8b751122259723fd2c6966632add"},"type":"TRANSACTION_SEND"} +{"artifactId":"EpochManager#EpochManager","constructorArgs":[],"contractName":"EpochManager","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"EpochManager#EpochManager","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"EpochManager#EpochManager","networkInteraction":{"data":"0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e05161010051610120516101405161103461016460003980610aac525080610a83525080610a5a525080610a31525080610a085250806109df5250806109b652506110346000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063a2594d82116100ad578063cd6dc68711610071578063cd6dc687146102c4578063d0cfa46e146102f0578063d6866ea5146102f8578063f77c479114610300578063faa1a23c146103245761012c565b8063a2594d821461027e578063ab93122c146102a4578063b4146a0b146102ac578063c46e58eb146102b4578063cc65149b146102bc5761012c565b806376671808116100f457806376671808146101ab57806385df51fd146101b35780638ae63d6d146101d057806392eefe9b146101d85780639ce7abe5146101fe5761012c565b806319c3b82d146101315780631b28126d1461014b5780631ce05d381461016857806354eea7961461018457806357d775f8146101a3575b600080fd5b61013961032c565b60408051918252519081900360200190f35b6101396004803603602081101561016157600080fd5b5035610353565b61017061037f565b604080519115158252519081900360200190f35b6101a16004803603602081101561019a57600080fd5b5035610392565b005b61013961047f565b610139610485565b610139600480360360208110156101c957600080fd5b503561049b565b61013961053b565b6101a1600480360360208110156101ee57600080fd5b50356001600160a01b031661053f565b6101a16004803603604081101561021457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b509092509050610553565b6101a16004803603602081101561029457600080fd5b50356001600160a01b03166106a9565b6101396107c4565b6101396107e6565b6101a16107ec565b610139610888565b6101a1600480360360408110156102da57600080fd5b506001600160a01b03813516906020013561088e565b610139610999565b6101a16109b1565b610308610ad2565b604080516001600160a01b039092168252519081900360200190f35b610139610ae1565b600061034e600c54610348600f5461034261053b565b90610ae7565b90610b49565b905090565b60008061035e610485565b905080831061036e576000610378565b6103788184610ae7565b9392505050565b6000610389610485565b600d5414905090565b61039a610bb0565b600081116103ea576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b600c5481141561042b5760405162461bcd60e51b8152600401808060200182810382526029815260200180610f666029913960400191505060405180910390fd5b610433610485565b600e5561043e6107c4565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a250565b600c5481565b600061034e61049261032c565b600e5490610c84565b6000806104a661053b565b90508083106104e65760405162461bcd60e51b8152600401808060200182810382526023815260200180610fdc6023913960400191505060405180910390fd5b6101008110806104fa575061010081038310155b6105355760405162461bcd60e51b815260040180806020018281038252602c815260200180610fb0602c913960400191505060405180910390fd5b50504090565b4390565b610547610cde565b61055081610d3d565b50565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561058f57600080fd5b505af11580156105a3573d6000803e3d6000fd5b505050506040513d60208110156105b957600080fd5b50516001600160a01b03163314610617576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106e557600080fd5b505af11580156106f9573d6000803e3d6000fd5b505050506040513d602081101561070f57600080fd5b50516001600160a01b0316331461076d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050505050565b600061034e6107dd600c546107d761032c565b90610de5565b600f5490610c84565b600e5481565b6107f461037f565b15610846576040805162461bcd60e51b815260206004820152601960248201527f43757272656e742065706f636820616c72656164792072756e00000000000000604482015290519081900360640190fd5b61084e610485565b600d8190556040805133815290517f666a37ccc682d20f8c51c5f6fd835cbadbcaaf09921e076282446e42d7264e3e9181900360200190a2565b600f5481565b610896610e3e565b6001600160a01b0316336001600160a01b0316146108f1576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b60008111610941576040805162461bcd60e51b8152602060048201526018602482015277045706f6368206c656e6774682063616e6e6f7420626520360441b604482015290519081900360640190fd5b61094a82610547565b6001600e5561095761053b565b600f55600c819055600e546040805183815290517f25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce24419181900360200190a25050565b60006109a36107c4565b6109ab61053b565b03905090565b6109da7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a037f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a2c7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a557f0000000000000000000000000000000000000000000000000000000000000000610e63565b610a7e7f0000000000000000000000000000000000000000000000000000000000000000610e63565b610aa77f0000000000000000000000000000000000000000000000000000000000000000610e63565b610ad07f0000000000000000000000000000000000000000000000000000000000000000610e63565b565b6000546001600160a01b031681565b600d5481565b600082821115610b3e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000808211610b9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610ba857fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d6020811015610c2657600080fd5b50516001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b600082820183811015610378576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000546001600160a01b03163314610ad0576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116610d91576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600082610df457506000610b43565b82820282848281610e0157fe5b04146103785760405162461bcd60e51b8152600401808060200182810382526021815260200180610f8f6021913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50516000838152600160205260409020549091506001600160a01b03808316911614610f615760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25b505056fe45706f6368206c656e677468206d75737420626520646966666572656e7420746f2063757272656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616e206f6e6c792072657472696576652068617368657320666f72206c6173742032353620626c6f636b7343616e206f6e6c79207265747269657665207061737420626c6f636b20686173686573a264697066735822122045232c339fada874ae01964572e7664b10cfd18abe5a79dda984153cc999839564736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"EpochManager#EpochManager","networkInteractionId":1,"nonce":1587,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"EpochManager#EpochManager","networkInteractionId":1,"nonce":1587,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x859e4f54c6a35fd4ab34cdc50a1bc74fc3e6c51fa1e23dd27c5faffb29768ed0"},"type":"TRANSACTION_SEND"} +{"artifactId":"GraphProxyAdmin#GraphProxyAdmin","constructorArgs":[],"contractName":"GraphProxyAdmin","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"GraphProxyAdmin#GraphProxyAdmin","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin","networkInteraction":{"data":"0x608060405234801561001057600080fd5b506100243361002960201b610a0c1760201c565b61004b565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b610a648061005a6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80637eff275e116100715780637eff275e146101b157806399a88ec4146101df578063e3056a341461020d578063eb451a0214610215578063f2fde38b14610243578063f3b7dead14610269576100a9565b806307ebde0e146100ae5780630c340a2414610139578063204e1c7a1461015d5780635bf410eb1461018357806379ba5097146101a9575b600080fd5b610137600480360360608110156100c457600080fd5b6001600160a01b0382358116926020810135909116918101906060810160408201356401000000008111156100f857600080fd5b82018360208201111561010a57600080fd5b8035906020019184600183028401116401000000008311171561012c57600080fd5b50909250905061028f565b005b610141610388565b604080516001600160a01b039092168252519081900360200190f35b6101416004803603602081101561017357600080fd5b50356001600160a01b0316610397565b6101416004803603602081101561019957600080fd5b50356001600160a01b031661046a565b610137610525565b610137600480360360408110156101c757600080fd5b506001600160a01b0381358116916020013516610633565b610137600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106f6565b61014161079d565b6101376004803603604081101561022b57600080fd5b506001600160a01b03813581169160200135166107ac565b6101376004803603602081101561025957600080fd5b50356001600160a01b0316610853565b6101416004803603602081101561027f57600080fd5b50356001600160a01b0316610951565b6000546001600160a01b031633146102e7576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b836001600160a01b0316639ce7abe58484846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050945050505050600060405180830381600087803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031681565b6000806000836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146103f6576040519150601f19603f3d011682016040523d82523d6000602084013e6103fb565b606091505b50915091508161044b576040805162461bcd60e51b8152602060048201526016602482015275141c9bde1e481a5b5c1b0818d85b1b0819985a5b195960521b604482015290519081900360640190fd5b80806020019051602081101561046057600080fd5b5051949350505050565b6000806000836001600160a01b0316604051808063396f7b2360e01b8152506004019050600060405180830381855afa9150503d80600081146104c9576040519150601f19603f3d011682016040523d82523d6000602084013e6104ce565b606091505b50915091508161044b576040805162461bcd60e51b815260206004820152601d60248201527f50726f78792070656e64696e67496d706c2063616c6c206661696c6564000000604482015290519081900360640190fd5b6001546001600160a01b031680158015906105485750336001600160a01b038216145b610599576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000546001600160a01b0316331461068b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b031663704b6c02826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b505af11580156106ee573d6000803e3d6000fd5b505050505050565b6000546001600160a01b0316331461074e576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b6001546001600160a01b031681565b6000546001600160a01b03163314610804576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b816001600160a01b031663a2594d82826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156106da57600080fd5b6000546001600160a01b031633146108ab576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b0381166108fd576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000806000836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146109b0576040519150601f19603f3d011682016040523d82523d6000602084013e6109b5565b606091505b50915091508161044b576040805162461bcd60e51b815260206004820152601760248201527f50726f78792061646d696e2063616c6c206661696c6564000000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b039290921691909117905556fea26469706673582212208b271ee4c7625d89f662c15e90f70e142245bf56f0595043fe9af742b09d958c64736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin","networkInteractionId":1,"nonce":1588,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin","networkInteractionId":1,"nonce":1588,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xd76e5fc20076c7d417d14c71770190aabda128d246a16dfcc29f77fb7f270365"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonProxies#OZProxyDummy_GraphPayments","constructorArgs":[],"contractName":"Dummy","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonProxies#OZProxyDummy_GraphPayments","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#OZProxyDummy_GraphPayments","networkInteraction":{"data":"0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#OZProxyDummy_GraphPayments","networkInteractionId":1,"nonce":1589,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#OZProxyDummy_GraphPayments","networkInteractionId":1,"nonce":1589,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x9983dbeee2627390f14712118876eae5f0cef7a85aa0486c834aa1c51be61e9d"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","constructorArgs":[],"contractName":"Dummy","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","networkInteraction":{"data":"0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122081eeeeb2e55704976a5bd19451809712b1b76b2d5b7a994dc02b32128a829da764736f6c634300081b0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","networkInteractionId":1,"nonce":1590,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","networkInteractionId":1,"nonce":1590,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x8e31fc40c140b6f04f8bde3abd3c53acd237a7e5654c53970b92f35080dd91cf"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonStaking#ExponentialRebates","constructorArgs":[],"contractName":"ExponentialRebates","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonStaking#ExponentialRebates","futureType":"LIBRARY_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonStaking#ExponentialRebates","networkInteraction":{"data":"0x610c2d610039600b82828239805160001a607314602c57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c806349484d811461003a575b600080fd5b61004d610048366004610a66565b61005f565b60405190815260200160405180910390f35b6000806100728660030b8660030b61011c565b9050806000036100855787915050610112565b87600003610097576000915050610112565b60006100a98560030b8560030b61011c565b905060006100b8828a8c61013c565b9050600f6100c582610153565b13156100d657899350505050610112565b60006100ff6001607f1b6100fa866100f56100f087610ae2565b610169565b610882565b61089d565b905061010b818c6108d4565b9450505050505b9695505050505050565b600061013561012f846001607f1b610920565b83610988565b9392505050565b600061014b61012f8585610920565b949350505050565b60006101636001607f1b83610b14565b92915050565b60006101796101ff607c1b610ae2565b82121561018857506000919050565b8160000361019b57506001607f1b919050565b60008213156101c55760405162461bcd60e51b81526004016101bc90610b42565b60405180910390fd5b6000806101d66001607c1b85610b69565b91508190506001607f1b6101ea8280610b7d565b6101f49190610b14565b9050610208816710e1b3be415a0000610b7d565b6102129084610bad565b92506001607f1b6102238383610b7d565b61022d9190610b14565b9050610241816705a0913f6b1e0000610b7d565b61024b9084610bad565b92506001607f1b61025c8383610b7d565b6102669190610b14565b905061027a81670168244fdac78000610b7d565b6102849084610bad565b92506001607f1b6102958383610b7d565b61029f9190610b14565b90506102b281664807432bc18000610b7d565b6102bc9084610bad565b92506001607f1b6102cd8383610b7d565b6102d79190610b14565b90506102ea81660c0135dca04000610b7d565b6102f49084610bad565b92506001607f1b6103058383610b7d565b61030f9190610b14565b9050610322816601b707b1cdc000610b7d565b61032c9084610bad565b92506001607f1b61033d8383610b7d565b6103479190610b14565b9050610359816536e0f639b800610b7d565b6103639084610bad565b92506001607f1b6103748383610b7d565b61037e9190610b14565b905061039081650618fee9f800610b7d565b61039a9084610bad565b92506001607f1b6103ab8383610b7d565b6103b59190610b14565b90506103c681649c197dcc00610b7d565b6103d09084610bad565b92506001607f1b6103e18383610b7d565b6103eb9190610b14565b90506103fc81640e30dce400610b7d565b6104069084610bad565b92506001607f1b6104178383610b7d565b6104219190610b14565b90506104328164012ebd1300610b7d565b61043c9084610bad565b92506001607f1b61044d8383610b7d565b6104579190610b14565b9050610467816317499f00610b7d565b6104719084610bad565b92506001607f1b6104828383610b7d565b61048c9190610b14565b905061049c816301a9d480610b7d565b6104a69084610bad565b92506001607f1b6104b78383610b7d565b6104c19190610b14565b90506104d081621c6380610b7d565b6104da9084610bad565b92506001607f1b6104eb8383610b7d565b6104f59190610b14565b9050610504816201c638610b7d565b61050e9084610bad565b92506001607f1b61051f8383610b7d565b6105299190610b14565b905061053781611ab8610b7d565b6105419084610bad565b92506001607f1b6105528383610b7d565b61055c9190610b14565b905061056a8161017c610b7d565b6105749084610bad565b92506001607f1b6105858383610b7d565b61058f9190610b14565b905061059c816014610b7d565b6105a69084610bad565b92506001607f1b6105b78383610b7d565b6105c19190610b14565b90506105ce816001610b7d565b6105d89084610bad565b92506001607f1b826105f26721c3677c82b4000086610b14565b6105fc9190610bad565b6106069190610bad565b925061061184610ae2565b9350600160841b841615610657577243cbaf42a000812488fc5c220ad7b97bf6e99e61064a6cf1aaddd7742e56d32fb9f9974485610b7d565b6106549190610b14565b92505b600160831b84161561069c577105d27a9f51c31b7c2f8038212a057477999161068f6e0afe10820813d65dfe6a33c07f738f85610b7d565b6106999190610b14565b92505b600160821b8416156106e157701b4c902e273a58678d6d3bfdb93db96d026106d46f02582ab704279e8efd15e0265855c47a85610b7d565b6106de9190610b14565b92505b600160811b841615610726577003b1cc971a9bb5b9867477440d6d1577506107196f1152aaa3bf81cb9fdb76eae12d02957185610b7d565b6107239190610b14565b92505b600160801b84161561076b5770015bf0a8b1457695355fb8ac404e7a79e361075e6f2f16ac6c59de6f8d5d6f63c1482a7c8685610b7d565b6107689190610b14565b92505b6001607f1b8416156107af576fd3094c70f034de4b96ff7d5b6f99fcd86107a26f4da2cbf1be5827f9eb3ad1aa9866ebb385610b7d565b6107ac9190610b14565b92505b6001607e1b8416156107f3576fa45af1e1f40c333b3de1db4dd55f29a76107e66f63afbe7ab2082ba1a0ae5e4eb1b479dc85610b7d565b6107f09190610b14565b92505b6001607d1b841615610837576f910b022db7ae67ce76b441c27035c6a161082a6f70f5a893b608861e1f58934f97aea57d85610b7d565b6108349190610b14565b92505b6001607c1b84161561087b576f88415abbe9a76bead8d00cf112e4d4a861086e6f783eafef1c0a8f3978c7f81824d62ebf85610b7d565b6108789190610b14565b92505b5050919050565b60006001607f1b6108938484610920565b6101359190610b14565b6000600160ff1b82036108c25760405162461bcd60e51b81526004016101bc90610b42565b610135836108cf84610ae2565b6109f2565b6000808212156108f65760405162461bcd60e51b81526004016101bc90610b42565b60006109028484610920565b905060008113610916576000915050610163565b607f1c9392505050565b600082158061092d575081155b1561093a57506000610163565b508181028183828161094e5761094e610afe565b0514158061096b57508282828161096757610967610afe565b0514155b156101635760405162461bcd60e51b81526004016101bc90610bd5565b6000816000036109aa5760405162461bcd60e51b81526004016101bc90610bd5565b600160ff1b831480156109be575081600019145b156109db5760405162461bcd60e51b81526004016101bc90610bd5565b8183816109ea576109ea610afe565b059392505050565b818101600083128015610a055750600082125b8015610a1057508281135b8061096b5750600083138015610a265750600082135b801561096b5750828112156101635760405162461bcd60e51b81526004016101bc90610bd5565b803563ffffffff81168114610a6157600080fd5b919050565b60008060008060008060c08789031215610a7f57600080fd5b8635955060208701359450610a9660408801610a4d565b9350610aa460608801610a4d565b9250610ab260808801610a4d565b9150610ac060a08801610a4d565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b8201610af757610af7610acc565b5060000390565b634e487b7160e01b600052601260045260246000fd5b600082610b2357610b23610afe565b600160ff1b821460001984141615610b3d57610b3d610acc565b500590565b6020808252600d908201526c6f75742d6f662d626f756e647360981b604082015260600190565b600082610b7857610b78610afe565b500790565b80820260008212600160ff1b84141615610b9957610b99610acc565b818105831482151761016357610163610acc565b8082018281126000831280158216821582161715610bcd57610bcd610acc565b505092915050565b6020808252600890820152676f766572666c6f7760c01b60408201526060019056fea26469706673582212201ef3beb7da88d73c1ec2e008b9308e699e4621df52e1b4b35ff71522e3621d6464736f6c634300081b0033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonStaking#ExponentialRebates","networkInteractionId":1,"nonce":1591,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonStaking#ExponentialRebates","networkInteractionId":1,"nonce":1591,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa1983cc6775d37b981f072909799a74c3ec9b62ab36904736b703f798399cd86"},"type":"TRANSACTION_SEND"} +{"artifactId":"L2Curation#GraphCurationToken","constructorArgs":[],"contractName":"GraphCurationToken","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2Curation#GraphCurationToken","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2Curation#GraphCurationToken","networkInteraction":{"data":"0x608060405234801561001057600080fd5b506114ec806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806379ba5097116100a2578063a9059cbb11610071578063a9059cbb14610352578063c4d66de81461037e578063dd62ed3e146103a4578063e3056a34146103d2578063f2fde38b146103da57610116565b806379ba5097146102ea57806379cc6790146102f257806395d89b411461031e578063a457c2d71461032657610116565b806323b872dd116100e957806323b872dd14610216578063313ce5671461024c578063395093511461026a57806340c10f191461029657806370a08231146102c457610116565b806306fdde031461011b578063095ea7b3146101985780630c340a24146101d857806318160ddd146101fc575b600080fd5b610123610400565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015d578181015183820152602001610145565b50505050905090810190601f16801561018a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c4600480360360408110156101ae57600080fd5b506001600160a01b038135169060200135610496565b604080519115158252519081900360200190f35b6101e06104b3565b604080516001600160a01b039092168252519081900360200190f35b6102046104c2565b60408051918252519081900360200190f35b6101c46004803603606081101561022c57600080fd5b506001600160a01b038135811691602081013590911690604001356104c8565b61025461054f565b6040805160ff9092168252519081900360200190f35b6101c46004803603604081101561028057600080fd5b506001600160a01b038135169060200135610558565b6102c2600480360360408110156102ac57600080fd5b506001600160a01b0381351690602001356105a6565b005b610204600480360360208110156102da57600080fd5b50356001600160a01b031661060c565b6102c2610627565b6102c26004803603604081101561030857600080fd5b506001600160a01b038135169060200135610737565b610123610799565b6101c46004803603604081101561033c57600080fd5b506001600160a01b0381351690602001356107fa565b6101c46004803603604081101561036857600080fd5b506001600160a01b038135169060200135610862565b6102c26004803603602081101561039457600080fd5b50356001600160a01b0316610876565b610204600480360360408110156103ba57600080fd5b506001600160a01b0381358116916020013516610972565b6101e061099d565b6102c2600480360360208110156103f057600080fd5b50356001600160a01b03166109ac565b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561048c5780601f106104615761010080835404028352916020019161048c565b820191906000526020600020905b81548152906001019060200180831161046f57829003601f168201915b5050505050905090565b60006104aa6104a3610aaa565b8484610aae565b50600192915050565b6065546001600160a01b031681565b60355490565b60006104d5848484610b9a565b610545846104e1610aaa565b61054085604051806060016040528060288152602001611400602891396001600160a01b038a1660009081526034602052604081209061051f610aaa565b6001600160a01b031681526020810191909152604001600020549190610cf7565b610aae565b5060019392505050565b60385460ff1690565b60006104aa610565610aaa565b846105408560346000610576610aaa565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610d8e565b6065546001600160a01b031633146105fe576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106088282610def565b5050565b6001600160a01b031660009081526033602052604090205490565b6066546001600160a01b0316801580159061064a5750336001600160a01b038216145b61069b576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b606580546001600160a01b038381166001600160a01b0319808416919091179384905560668054909116905560405191811692169082907f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f90600090a36066546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6065546001600160a01b0316331461078f576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106088282610ee1565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561048c5780601f106104615761010080835404028352916020019161048c565b60006104aa610807610aaa565b84610540856040518060600160405280602581526020016114926025913960346000610831610aaa565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610cf7565b60006104aa61086f610aaa565b8484610b9a565b600054610100900460ff168061088f575061088f610fdd565b8061089d575060005460ff16155b6108d85760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff16158015610903576000805460ff1961ff0019909116610100171660011790555b61090c82610fee565b61095d604051806040016040528060148152602001734772617068204375726174696f6e20536861726560601b8152506040518060400160405280600381526020016247435360e81b815250611010565b8015610608576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6066546001600160a01b031681565b6065546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610a56576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b606680546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b038316610af35760405162461bcd60e51b815260040180806020018281038252602481526020018061146e6024913960400191505060405180910390fd5b6001600160a01b038216610b385760405162461bcd60e51b815260040180806020018281038252602281526020018061138a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610bdf5760405162461bcd60e51b81526004018080602001828103825260258152602001806114496025913960400191505060405180910390fd5b6001600160a01b038216610c245760405162461bcd60e51b81526004018080602001828103825260238152602001806113456023913960400191505060405180910390fd5b610c2f8383836110c1565b610c6c816040518060600160405280602681526020016113ac602691396001600160a01b0386166000908152603360205260409020549190610cf7565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610c9b9082610d8e565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610d865760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d4b578181015183820152602001610d33565b50505050905090810190601f168015610d785780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610de8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610e4a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610e56600083836110c1565b603554610e639082610d8e565b6035556001600160a01b038216600090815260336020526040902054610e899082610d8e565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610f265760405162461bcd60e51b81526004018080602001828103825260218152602001806114286021913960400191505060405180910390fd5b610f32826000836110c1565b610f6f81604051806060016040528060228152602001611368602291396001600160a01b0385166000908152603360205260409020549190610cf7565b6001600160a01b038316600090815260336020526040902055603554610f9590826110c6565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000610fe830611123565b15905090565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806110295750611029610fdd565b80611037575060005460ff16155b6110725760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff1615801561109d576000805460ff1961ff0019909116610100171660011790555b6110a5611129565b6110af83836111cb565b80156110c1576000805461ff00191690555b505050565b60008282111561111d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff16806111425750611142610fdd565b80611150575060005460ff16155b61118b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff161580156111b6576000805460ff1961ff0019909116610100171660011790555b80156111c8576000805461ff00191690555b50565b600054610100900460ff16806111e457506111e4610fdd565b806111f2575060005460ff16155b61122d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806113d2602e913960400191505060405180910390fd5b600054610100900460ff16158015611258576000805460ff1961ff0019909116610100171660011790555b825161126b9060369060208601906112a3565b50815161127f9060379060208501906112a3565b506038805460ff1916601217905580156110c1576000805461ff0019169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826112d9576000855561131f565b82601f106112f257805160ff191683800117855561131f565b8280016001018555821561131f579182015b8281111561131f578251825591602001919060010190611304565b5061132b92915061132f565b5090565b5b8082111561132b576000815560010161133056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200b687fddcd01dbad6e1d5fbd49cb041f69ed61684a12a4c26c6e37e0f5ad7c2a64736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2Curation#GraphCurationToken","networkInteractionId":1,"nonce":1592,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2Curation#GraphCurationToken","networkInteractionId":1,"nonce":1592,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x68f850e03de53f05ada2c9dda84d68477c01208665a4f6128a709f7234db967e"},"type":"TRANSACTION_SEND"} +{"artifactId":"L2Curation#L2Curation","constructorArgs":[],"contractName":"L2Curation","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2Curation#L2Curation","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2Curation#L2Curation","networkInteraction":{"data":"0x6101806040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea361014052613d0960e61b6101605234801561011a57600080fd5b5060805160a05160c05160e0516101005161012051610140516101605160e01c6128cc61018f60003980610c2f52508061141b52806119025250806113f25250806113c9528061180c5250806113a05280611dbf5250806113775280611ff252508061134e52508061132552506128cc6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806399439fee11610104578063cd0ad4a2116100a2578063eff1d50e11610071578063eff1d50e146103f2578063f049b900146103fa578063f115c4271461040d578063f77c479114610415576101da565b8063cd0ad4a2146103af578063cd18119e146103c2578063d6866ea5146103d5578063eba0c8a1146103dd576101da565b80639f94c667116100de5780639f94c6671461035f578063a2594d8214610372578063a25e62c714610385578063b5217bb41461038d576101da565b806399439fee146103265780639b4d9f33146103395780639ce7abe51461034c576101da565b80634c4ea0ed1161017c5780637a2a45b81161014b5780637a2a45b8146102da57806381573288146102ed57806392eefe9b1461030057806393a90a1e14610313576101da565b80634c4ea0ed1461027f5780634c8c7a441461029f5780636536fe32146102b457806369db11a1146102c7576101da565b806326058249116101b857806326058249146102235780633718896d14610238578063375a54ab1461024b57806346e855da1461026c576101da565b80630faaf87f146101df578063185360f91461020857806324bdeec714610210575b600080fd5b6101f26101ed366004612175565b61041d565b6040516101ff91906122ab565b60405180910390f35b6101f26104da565b6101f261021e366004612196565b6104e0565b61022b610662565b6040516101ff9190612273565b6101f2610246366004612175565b610677565b61025e610259366004612196565b6108b6565b6040516101ff9291906127b8565b6101f261027a36600461215d565b610af7565b61029261028d36600461215d565b610b0c565b6040516101ff91906122a0565b6102b26102ad3660046120e4565b610b20565b005b6102b26102c236600461215d565b610cb0565b6101f26102d5366004612175565b610cc4565b6101f26102e8366004612175565b610d78565b6102b26102fb366004612175565b610d8b565b6102b261030e3660046120c8565b610e5e565b6102b26103213660046120c8565b610e6f565b6101f261033436600461215d565b610ecb565b6102b26103473660046120c8565b610f72565b6102b261035a3660046121c1565b610f83565b6101f261036d366004612132565b6110d9565b6102b26103803660046120c8565b61118d565b61022b6112a8565b6103a061039b36600461215d565b6112be565b6040516101ff939291906127dc565b6102b26103bd366004612259565b6112ef565b6102b26103d0366004612259565b61130f565b6102b2611320565b6103e5611441565b6040516101ff9190612801565b61022b611454565b61025e610408366004612175565b611463565b6103e56114c0565b61022b6114cc565b6000828152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b0316908201528161046d85610ecb565b82519091506104975760405162461bcd60e51b815260040161048e906125e8565b60405180910390fd5b838110156104b75760405162461bcd60e51b815260040161048e906124f3565b81516104cf9082906104c990876114db565b90611534565b925050505b92915050565b600d5481565b60006104ea61159b565b33836105085760405162461bcd60e51b815260040161048e906122b4565b8361051382876110d9565b10156105315760405162461bcd60e51b815260040161048e906124af565b600061053d868661041d565b90508381101561055f5760405162461bcd60e51b815260040161048e906123ff565b61056886611709565b6000868152600f60205260409020805461058290836117a8565b8155600181015460405163079cc67960e41b8152600160201b9091046001600160a01b0316906379cc6790906105be9086908a90600401612287565b600060405180830381600087803b1580156105d857600080fd5b505af11580156105ec573d6000803e3d6000fd5b505050506105f987610ecb565b61060257600081555b61061461060d611805565b8484611835565b86836001600160a01b03167fe14cd5e80f6821ded0538e85a537487acf10bb5e97a12176df56a099e90bfb3484896040516106509291906127b8565b60405180910390a35095945050505050565b6010546201000090046001600160a01b031681565b600061068161159b565b6106896118fb565b6001600160a01b0316336001600160a01b0316146106b95760405162461bcd60e51b815260040161048e90612781565b816106d65760405162461bcd60e51b815260040161048e906126c0565b60006106e28484611926565b6000858152600f6020526040902090915033906106fe86610b0c565b6107ca576001810154600160201b90046001600160a01b03166107ca57600c5460009061073a90600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610769903090600401612273565b600060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6107d386611709565b60006107dd611805565b90506107ea818488611a76565b81546107f69087611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f19906108329086908890600401612287565b600060405180830381600087803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505086836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf888760006040516108a3939291906127c6565b60405180910390a3509195945050505050565b6000806108c161159b565b836108de5760405162461bcd60e51b815260040161048e906126c0565b6000806108eb8787611463565b915091508482101561090f5760405162461bcd60e51b815260040161048e906123ff565b6000878152600f60205260409020339061092889610b0c565b6109f4576001810154600160201b90046001600160a01b03166109f457600c5460009061096490600160401b90046001600160a01b03166119d9565b60405163189acdbd60e31b81529091506001600160a01b0382169063c4d66de890610993903090600401612273565b600060405180830381600087803b1580156109ad57600080fd5b505af11580156109c1573d6000803e3d6000fd5b5050506001830180546001600160a01b03909316600160201b02640100000000600160c01b031990931692909217909155505b6109fd89611709565b6000610a07611805565b9050610a1481848b611a76565b610a1e8185611b2f565b610a33610a2b8a866117a8565b835490611ad5565b825560018201546040516340c10f1960e01b8152600160201b9091046001600160a01b0316906340c10f1990610a6f9086908990600401612287565b600060405180830381600087803b158015610a8957600080fd5b505af1158015610a9d573d6000803e3d6000fd5b5050505089836001600160a01b03167fb7bf5f4e5b23ef992df9875ecea572620d18dab0c1a5486a9b695d20d9ec50cf8b8888604051610adf939291906127c6565b60405180910390a35092989197509095505050505050565b6000818152600f60205260409020545b919050565b6000908152600f6020526040902054151590565b610b28611b7b565b6001600160a01b0316336001600160a01b031614610b83576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b601054610100900460ff1680610b9c5750610b9c611ba0565b80610baa575060105460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180612848602e913960400191505060405180910390fd5b601054610100900460ff16158015610c10576010805460ff1961ff0019909116610100171660011790555b610c1985610e66565b600c805467ffffffff000000001916600160201b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff160217905560405160008051602061282883398151915290610c74906123d2565b60405180910390a1610c8583611bb1565b610c8e82611c16565b610c9784611c54565b8015610ca9576010805461ff00191690555b5050505050565b610cb8611ce4565b610cc181611c16565b50565b600081610ce35760405162461bcd60e51b815260040161048e90612322565b6000610cef8484611926565b6000858152600f6020908152604080832081516060810183528154815260019091015463ffffffff811693820193909352600160201b9092046001600160a01b031690820152919250610d4b83610d4588610ecb565b90611ad5565b8251909150600090610d5d9087611ad5565b9050610d6d826104c983876114db565b979650505050505050565b6000610d848383611926565b9392505050565b6010546201000090046001600160a01b0316331480610dc25750610dad611db8565b6001600160a01b0316336001600160a01b0316145b610dde5760405162461bcd60e51b815260040161048e9061255c565b610de782610b0c565b610e035760405162461bcd60e51b815260040161048e9061245c565b6000828152600f602052604090208054610e1d9083611ad5565b815560405183907ff17fdee613a92b35db6b7598eb43750b24d4072eb304e6eca80121e40402e34b90610e519085906122ab565b60405180910390a2505050565b610e66611de3565b610cc181611e42565b610e77611ce4565b6010805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015610f6957806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f649190612241565b610d84565b60009392505050565b610f7a611ce4565b610cc181611c54565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fbf57600080fd5b505af1158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50516001600160a01b03163314611047576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b1580156110bb57600080fd5b505af11580156110cf573d6000803e3d6000fd5b5050505050505050565b6000818152600f6020526040812060010154600160201b90046001600160a01b03168015611182576040516370a0823160e01b81526001600160a01b038216906370a082319061112d908790600401612273565b60206040518083038186803b15801561114557600080fd5b505afa158015611159573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117d9190612241565b611185565b60005b949350505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111c957600080fd5b505af11580156111dd573d6000803e3d6000fd5b505050506040513d60208110156111f357600080fd5b50516001600160a01b03163314611251576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b505050505050565b600c54600160401b90046001600160a01b031681565b600f602052600090815260409020805460019091015463ffffffff811690600160201b90046001600160a01b031683565b6112f7611ce4565b60405162461bcd60e51b815260040161048e906123a3565b611317611ce4565b610cc181611bb1565b6113497f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113727f0000000000000000000000000000000000000000000000000000000000000000611eea565b61139b7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113c47f0000000000000000000000000000000000000000000000000000000000000000611eea565b6113ed7f0000000000000000000000000000000000000000000000000000000000000000611eea565b6114167f0000000000000000000000000000000000000000000000000000000000000000611eea565b61143f7f0000000000000000000000000000000000000000000000000000000000000000611eea565b565b600c54600160201b900463ffffffff1681565b600e546001600160a01b031681565b600c546000908190819061149790620f4240906104c990879061149190849063ffffffff908116906117a816565b906114db565b905060006114a585836117a8565b905060006114b38784611926565b9791965090945050505050565b600c5463ffffffff1681565b6000546001600160a01b031681565b6000826114ea575060006104d4565b828202828482816114f757fe5b0414610d845760405162461bcd60e51b81526004018080602001828103825260218152602001806128766021913960400191505060405180910390fd5b600080821161158a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161159357fe5b049392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b50511561164e576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60008054906101000a90046001600160a01b03166001600160a01b0316632e292fc76040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d60208110156116c457600080fd5b50511561143f576040805162461bcd60e51b815260206004820152600e60248201526d14185c9d1a585b0b5c185d5cd95960921b604482015290519081900360640190fd5b6000611713611feb565b90506001600160a01b038116156117a4576040516307470bfb60e21b81526001600160a01b03821690631d1c2fec906117509085906004016122ab565b602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190612241565b505b5050565b6000828211156117ff576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b905090565b80156117a257826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561189257600080fd5b505af11580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b50516117a2576040805162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000828152600f602090815260408083208151606081018352815480825260019092015463ffffffff811694820194909452600160201b9093046001600160a01b0316918301919091526119c657600d548310156119965760405162461bcd60e51b815260040161048e90612359565b600d546119be906119b6906104c96119ae87836117a8565b6001906114db565b600190611ad5565b9150506104d4565b8051611185906104c98561149188610ecb565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116610b07576040805162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015290519081900360640190fd5b80156117a257604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490529151918516916323b872dd916064808201926020929091908290030181600087803b15801561189257600080fd5b600082820183811015610d84576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b80156117a457816001600160a01b03166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561128c57600080fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611bab306120ae565b15905090565b620f424063ffffffff82161115611bda5760405162461bcd60e51b815260040161048e906126f7565b600c805463ffffffff191663ffffffff831617905560405160008051602061282883398151915290611c0b906125b9565b60405180910390a150565b80611c335760405162461bcd60e51b815260040161048e90612645565b600d81905560405160008051602061282883398151915290611c0b9061242c565b6001600160a01b038116611c7a5760405162461bcd60e51b815260040161048e906122eb565b611c83816120ae565b611c9f5760405162461bcd60e51b815260040161048e90612689565b600c805468010000000000000000600160e01b031916600160401b6001600160a01b0384160217905560405160008051602061282883398151915290611c0b90612754565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3057600080fd5b505afa158015611d44573d6000803e3d6000fd5b505050506040513d6020811015611d5a57600080fd5b50516001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b60006118307f0000000000000000000000000000000000000000000000000000000000000000612012565b6000546001600160a01b0316331461143f576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611e96576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b158015611f3757600080fd5b505afa158015611f4b573d6000803e3d6000fd5b505050506040513d6020811015611f6157600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146117a45760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b60006118307f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806104d45760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d60208110156120a557600080fd5b50519392505050565b3b151590565b803563ffffffff81168114610b0757600080fd5b6000602082840312156120d9578081fd5b8135610d8481612812565b600080600080608085870312156120f9578283fd5b843561210481612812565b9350602085013561211481612812565b9250612122604086016120b4565b9396929550929360600135925050565b60008060408385031215612144578182fd5b823561214f81612812565b946020939093013593505050565b60006020828403121561216e578081fd5b5035919050565b60008060408385031215612187578182fd5b50508035926020909101359150565b6000806000606084860312156121aa578283fd5b505081359360208301359350604090920135919050565b6000806000604084860312156121d5578283fd5b83356121e081612812565b9250602084013567ffffffffffffffff808211156121fc578384fd5b818601915086601f83011261220f578384fd5b81358181111561221d578485fd5b87602082850101111561222e578485fd5b6020830194508093505050509250925092565b600060208284031215612252578081fd5b5051919050565b60006020828403121561226a578081fd5b610d84826120b4565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526017908201527f43616e6e6f74206275726e207a65726f207369676e616c000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d6173746572206d757374206265206e6f6e2d656d7074790000604082015260600190565b6020808252601d908201527f43616e27742063616c63756c6174652077697468203020746f6b656e73000000604082015260600190565b6020808252602a908201527f4375726174696f6e206465706f7369742069732062656c6f77206d696e696d756040820152691b481c995c5d5a5c995960b21b606082015260800190565b6020808252601590820152742737ba1034b6b83632b6b2b73a32b21034b710261960591b604082015260600190565b60208082526013908201527264656661756c7452657365727665526174696f60681b604082015260600190565b60208082526013908201527229b634b83830b3b290383937ba32b1ba34b7b760691b604082015260600190565b6020808252601690820152751b5a5b9a5b5d5b50dd5c985d1a5bdb91195c1bdcda5d60521b604082015260600190565b60208082526033908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527274656420746f20636f6c6c656374206665657360681b606082015260800190565b60208082526024908201527f43616e6e6f74206275726e206d6f7265207369676e616c207468616e20796f756040820152631037bbb760e11b606082015260800190565b60208082526043908201527f5369676e616c206d7573742062652061626f7665206f7220657175616c20746f60408201527f207369676e616c2069737375656420696e20746865206375726174696f6e20706060820152621bdbdb60ea1b608082015260a00190565b60208082526037908201527f43616c6c6572206d75737420626520746865207375626772617068207365727660408201527f696365206f72207374616b696e6720636f6e7472616374000000000000000000606082015260800190565b6020808252601590820152746375726174696f6e54617850657263656e7461676560581b604082015260600190565b6020808252603b908201527f5375626772617068206465706c6f796d656e74206d757374206265206375726160408201527f74656420746f20706572666f726d2063616c63756c6174696f6e730000000000606082015260800190565b60208082526024908201527f4d696e696d756d206375726174696f6e206465706f7369742063616e6e6f74206040820152630626520360e41b606082015260800190565b6020808252601f908201527f546f6b656e206d6173746572206d757374206265206120636f6e747261637400604082015260600190565b6020808252601a908201527f43616e6e6f74206465706f736974207a65726f20746f6b656e73000000000000604082015260600190565b60208082526039908201527f4375726174696f6e207461782070657263656e74616765206d7573742062652060408201527f62656c6f77206f7220657175616c20746f204d41585f50504d00000000000000606082015260800190565b60208082526013908201527231bab930ba34b7b72a37b5b2b726b0b9ba32b960691b604082015260600190565b6020808252601a908201527f4f6e6c792074686520474e532063616e2063616c6c2074686973000000000000604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b92835263ffffffff9190911660208301526001600160a01b0316604082015260600190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610cc157600080fdfe96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220182d4780700d3d385918c6f4a2bbe50d522f035098d04683e959156c3033203064736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2Curation#L2Curation","networkInteractionId":1,"nonce":1593,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2Curation#L2Curation","networkInteractionId":1,"nonce":1593,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xfd0caf2dcfb174f3acde1c794d754bb83104bf1b77c83a218a67b1cfcfdd4843"},"type":"TRANSACTION_SEND"} +{"artifactId":"L2GraphToken#L2GraphToken","constructorArgs":[],"contractName":"L2GraphToken","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2GraphToken#L2GraphToken","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#L2GraphToken","networkInteraction":{"data":"0x6101206040527fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac564726080527fefcec85968da792893fa503eb21730083fc6c50ed5461e56163b28335b2a5f9660a0527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60c0527fe33842a7acd1d5a1d28f25a931703e5605152dc48d64dc4716efdae1f565959160e0527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610100523480156100c657600080fd5b5060805160a05160c05160e0516101005161261e61010660003980611547525080611eae525080611e5e525080611e3d525080611e1c525061261e6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638c2a993e1161011a578063a9059cbb116100ad578063ca52d7d71161007c578063ca52d7d71461067a578063d505accf146106a0578063dd62ed3e146106f1578063e3056a341461071f578063f2fde38b14610727576101fb565b8063a9059cbb146105fa578063aa271e1a14610626578063c2eeeebd1461064c578063c4d66de814610654576101fb565b806398650275116100e957806398650275146105205780639ce7abe514610528578063a2594d82146105a8578063a457c2d7146105ce576101fb565b80638c2a993e146104a057806390646b4a146104cc57806395d89b41146104f2578063983b2d56146104fa576101fb565b8063395093511161019257806374f4f5471161016157806374f4f5471461041a57806379ba50971461044657806379cc67901461044e5780637ecebe001461047a576101fb565b8063395093511461037f57806340c10f19146103ab57806342966c68146103d757806370a08231146103f4576101fb565b806318160ddd116101ce57806318160ddd146102e957806323b872dd146103035780633092afd514610339578063313ce56714610361576101fb565b806306fdde0314610200578063095ea7b31461027d5780630c340a24146102bd578063116191b6146102e1575b600080fd5b61020861074d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024257818101518382015260200161022a565b50505050905090810190601f16801561026f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a96004803603604081101561029357600080fd5b506001600160a01b0381351690602001356107e3565b604080519115158252519081900360200190f35b6102c5610800565b604080516001600160a01b039092168252519081900360200190f35b6102c561080f565b6102f161081e565b60408051918252519081900360200190f35b6102a96004803603606081101561031957600080fd5b506001600160a01b03813581169160208101359091169060400135610824565b61035f6004803603602081101561034f57600080fd5b50356001600160a01b03166108ab565b005b610369610958565b6040805160ff9092168252519081900360200190f35b6102a96004803603604081101561039557600080fd5b506001600160a01b038135169060200135610961565b61035f600480360360408110156103c157600080fd5b506001600160a01b0381351690602001356109af565b61035f600480360360208110156103ed57600080fd5b5035610a0e565b6102f16004803603602081101561040a57600080fd5b50356001600160a01b0316610a1f565b61035f6004803603604081101561043057600080fd5b506001600160a01b038135169060200135610a3a565b61035f610ad4565b61035f6004803603604081101561046457600080fd5b506001600160a01b038135169060200135610be2565b6102f16004803603602081101561049057600080fd5b50356001600160a01b0316610c3c565b61035f600480360360408110156104b657600080fd5b506001600160a01b038135169060200135610c4e565b61035f600480360360208110156104e257600080fd5b50356001600160a01b0316610ce8565b610208610de1565b61035f6004803603602081101561051057600080fd5b50356001600160a01b0316610e42565b61035f610eef565b61035f6004803603604081101561053e57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561056957600080fd5b82018360208201111561057b57600080fd5b8035906020019184600183028401116401000000008311171561059d57600080fd5b509092509050610f43565b61035f600480360360208110156105be57600080fd5b50356001600160a01b0316611099565b6102a9600480360360408110156105e457600080fd5b506001600160a01b0381351690602001356111b4565b6102a96004803603604081101561061057600080fd5b506001600160a01b03813516906020013561121c565b6102a96004803603602081101561063c57600080fd5b50356001600160a01b0316611230565b6102c561124e565b61035f6004803603602081101561066a57600080fd5b50356001600160a01b031661125d565b61035f6004803603602081101561069057600080fd5b50356001600160a01b03166113d3565b61035f600480360360e08110156106b657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356114cf565b6102f16004803603604081101561070757600080fd5b506001600160a01b0381358116916020013516611680565b6102c56116ab565b61035f6004803603602081101561073d57600080fd5b50356001600160a01b03166116ba565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b820191906000526020600020905b8154815290600101906020018083116107bc57829003601f168201915b5050505050905090565b60006107f76107f06117b8565b84846117bc565b50600192915050565b6000546001600160a01b031681565b60ca546001600160a01b031681565b60365490565b60006108318484846118a8565b6108a18461083d6117b8565b61089c8560405180606001604052806028815260200161250e602891396001600160a01b038a1660009081526035602052604081209061087b6117b8565b6001600160a01b031681526020810191909152604001600020549190611a05565b6117bc565b5060019392505050565b6000546001600160a01b03163314610903576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b61090c81611230565b61094c576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b61095581611a9c565b50565b60395460ff1690565b60006107f761096e6117b8565b8461089c856035600061097f6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611ae5565b6109b833611230565b610a00576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b610a0a8282611b46565b5050565b610955610a196117b8565b82611c38565b6001600160a01b031660009081526034602052604090205490565b60ca546001600160a01b03163314610a87576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610a918282610be2565b6040805182815290516001600160a01b038416917fe87aeeb22c5753db7f543198a4c3089d2233040ea9d1cab0eaa3b96d94d4fc6e919081900360200190a25050565b6001546001600160a01b03168015801590610af75750336001600160a01b038216145b610b48576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b600080546001600160a01b038381166001600160a01b031980841691909117808555600180549092169091556040519282169391169183917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f91a36001546040516001600160a01b03918216918416907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610c198260405180606001604052806024815260200161253660249139610c1286610c0d6117b8565b611680565b9190611a05565b9050610c2d83610c276117b8565b836117bc565b610c378383611c38565b505050565b609a6020526000908152604090205481565b60ca546001600160a01b03163314610c9b576040805162461bcd60e51b815260206004820152600b60248201526a4e4f545f4741544557415960a81b604482015290519081900360640190fd5b610ca58282611b46565b6040805182815290516001600160a01b038416917fae4b6e741e38054ad6705655cc56c91c184f6768f76b41e10803e2766d89e19f919081900360200190a25050565b6000546001600160a01b03163314610d40576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d8d576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4741544557415960881b604482015290519081900360640190fd5b60ca80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5317fa585931182194fed99f2ea5f2efd38af9cff9724273704c8501c521e34b9181900360200190a150565b60388054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107d95780601f106107ae576101008083540402835291602001916107d9565b6000546001600160a01b03163314610e9a576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610ee6576040805162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa6a4a72a22a960911b604482015290519081900360640190fd5b61095581611d34565b610ef833611230565b610f38576040805162461bcd60e51b815260206004820152600c60248201526b2727aa2fa0afa6a4a72a22a960a11b604482015290519081900360640190fd5b610f4133611a9c565b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b505050506040513d6020811015610fa957600080fd5b50516001600160a01b03163314611007576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b15801561107b57600080fd5b505af115801561108f573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156110d557600080fd5b505af11580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b50516001600160a01b0316331461115d576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561119857600080fd5b505af11580156111ac573d6000803e3d6000fd5b505050505050565b60006107f76111c16117b8565b8461089c856040518060600160405280602581526020016125c460259139603560006111eb6117b8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611a05565b60006107f76112296117b8565b84846118a8565b6001600160a01b031660009081526099602052604090205460ff1690565b60cb546001600160a01b031681565b611265611d80565b6001600160a01b0316336001600160a01b0316146112c0576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b600154600160a81b900460ff16806112db57506112db611da5565b806112f05750600154600160a01b900460ff16155b61132b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015611362576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b6001600160a01b0382166113b1576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b6113bc826000611db6565b8015610a0a576001805460ff60a81b191690555050565b6000546001600160a01b0316331461142b576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b03811661147b576040805162461bcd60e51b8152602060048201526012602482015271494e56414c49445f4c315f4144445245535360701b604482015290519081900360640190fd5b60cb80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f603c0b2e4494ac82839a70be8b6c660d7d042ccfe71c3ce0e5157f59090e74459181900360200190a150565b8315806114dc5750834211155b611523576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b6098546001600160a01b038089166000818152609a602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948c166060850152608084018b905260a084019490945260c08084018a90528451808503909101815260e08401855280519082012061190160f01b61010085015261010284019590955261012280840195909552835180840390950185526101429092019092528251920191909120906115ed82868686611ef3565b9050806001600160a01b0316896001600160a01b03161461164b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b6001600160a01b0389166000908152609a60205260409020805460010190556116758989896117bc565b505050505050505050565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314611712576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116611764576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b3390565b6001600160a01b0383166118015760405162461bcd60e51b81526004018080602001828103825260248152602001806125a06024913960400191505060405180910390fd5b6001600160a01b0382166118465760405162461bcd60e51b81526004018080602001828103825260228152602001806124546022913960400191505060405180910390fd5b6001600160a01b03808416600081815260356020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166118ed5760405162461bcd60e51b815260040180806020018281038252602581526020018061257b6025913960400191505060405180910390fd5b6001600160a01b0382166119325760405162461bcd60e51b815260040180806020018281038252602381526020018061240f6023913960400191505060405180910390fd5b61193d838383610c37565b61197a81604051806060016040528060268152602001612476602691396001600160a01b0386166000908152603460205260409020549190611a05565b6001600160a01b0380851660009081526034602052604080822093909355908416815220546119a99082611ae5565b6001600160a01b0380841660008181526034602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611a945760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a59578181015183820152602001611a41565b50505050905090810190601f168015611a865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260996020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b600082820183811015611b3f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611ba1576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611bad60008383610c37565b603654611bba9082611ae5565b6036556001600160a01b038216600090815260346020526040902054611be09082611ae5565b6001600160a01b03831660008181526034602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611c7d5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b611c8982600083610c37565b611cc681604051806060016040528060228152602001612432602291396001600160a01b0385166000908152603460205260409020549190611a05565b6001600160a01b038316600090815260346020526040902055603654611cec9082612071565b6036556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260996020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611db0306120ce565b15905090565b611dfe6040518060400160405280600b81526020016a23b930b834102a37b5b2b760a91b8152506040518060400160405280600381526020016211d49560ea1b8152506120d4565b611e07826121a0565b611e118282611b46565b611e1a82611d34565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e856121c2565b6040805160208082019690965280820194909452606084019290925260808301523060a08301527f000000000000000000000000000000000000000000000000000000000000000060c0808401919091528151808403909101815260e0909201905280519101206098555050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611f545760405162461bcd60e51b815260040180806020018281038252602281526020018061249c6022913960400191505060405180910390fd5b8360ff16601b1480611f6957508360ff16601c145b611fa45760405162461bcd60e51b81526004018080602001828103825260228152602001806124ec6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612000573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612068576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6000828211156120c8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600154600160a81b900460ff16806120ef57506120ef611da5565b806121045750600154600160a01b900460ff16155b61213f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612176576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b61217e6121c6565b612188838361227e565b8015610c37576001805460ff60a81b19169055505050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b4690565b600154600160a81b900460ff16806121e157506121e1611da5565b806121f65750600154600160a01b900460ff16155b6122315760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612268576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b8015610955576001805460ff60a81b1916905550565b600154600160a81b900460ff16806122995750612299611da5565b806122ae5750600154600160a01b900460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e8152602001806124be602e913960400191505060405180910390fd5b600154600160a81b900460ff16158015612320576001805460ff60a01b1960ff60a81b19909116600160a81b1716600160a01b1790555b825161233390603790602086019061236d565b50815161234790603890602085019061236d565b506039805460ff191660121790558015610c37576001805460ff60a81b19169055505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826123a357600085556123e9565b82601f106123bc57805160ff19168380011785556123e9565b828001600101855582156123e9579182015b828111156123e95782518255916020019190600101906123ce565b506123f59291506123f9565b5090565b5b808211156123f557600081556001016123fa56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ff9ed43c1b257716d58111b6358b62039b7d7359bc9f0f142332535a4370cafe64736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#L2GraphToken","networkInteractionId":1,"nonce":1594,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#L2GraphToken","networkInteractionId":1,"nonce":1594,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x6730a19b4ae0823f98e12f2af100906334a11b2fdd6b1494c9f7ad68d8f0053b"},"type":"TRANSACTION_SEND"} +{"artifactId":"L2GraphTokenGateway#L2GraphTokenGateway","constructorArgs":[],"contractName":"L2GraphTokenGateway","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2GraphTokenGateway#L2GraphTokenGateway","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway","networkInteraction":{"data":"0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e05161010051610120516101405161222b6101696000398061112f5250806111065250806110dd528061150a5250806110b452508061108b525080611062525080611039525061222b6000f3fe6080604052600436106101405760003560e01c806392eefe9b116100b6578063c4d66de81161006f578063c4d66de814610355578063d2ce7d6514610375578063d685c0b214610388578063d6866ea5146103a8578063f14a4bd5146103bd578063f77c4791146103d257610140565b806392eefe9b146102a05780639ce7abe5146102c0578063a0c76a96146102e0578063a2594d8214610300578063a7e28d4814610320578063c4c0087c1461034057610140565b806348bde20c1161010857806348bde20c146101e75780634adc698a146102075780635c975abb1461021c57806369bc8cd41461023e5780637b3a3c8b1461025e57806391b4ded91461028b57610140565b80630252fec114610145578063147ddef51461016757806316c38b3c1461019257806324a3d622146101b25780632e567b36146101d4575b600080fd5b34801561015157600080fd5b50610165610160366004611b43565b6103e7565b005b34801561017357600080fd5b5061017c610474565b60405161018991906121a9565b60405180910390f35b34801561019e57600080fd5b506101656101ad366004611da9565b61047a565b3480156101be57600080fd5b506101c7610572565b6040516101899190611e67565b6101656101e2366004611bb4565b610581565b3480156101f357600080fd5b50610165610202366004611b43565b6107b9565b34801561021357600080fd5b506101c7610825565b34801561022857600080fd5b50610231610834565b6040516101899190611f43565b34801561024a57600080fd5b50610165610259366004611b43565b610842565b34801561026a57600080fd5b5061027e610279366004611cb4565b6108bb565b6040516101899190611f4e565b34801561029757600080fd5b5061017c6108d7565b3480156102ac57600080fd5b506101656102bb366004611b43565b6108dd565b3480156102cc57600080fd5b506101656102db366004611dc9565b6108ee565b3480156102ec57600080fd5b5061027e6102fb366004611c37565b610a44565b34801561030c57600080fd5b5061016561031b366004611b43565b610ac4565b34801561032c57600080fd5b506101c761033b366004611b43565b610bdf565b34801561034c57600080fd5b506101c7610c0f565b34801561036157600080fd5b50610165610370366004611b43565b610c1e565b61027e610383366004611d25565b610d44565b34801561039457600080fd5b506101656103a3366004611b43565b610fbb565b3480156103b457600080fd5b50610165611034565b3480156103c957600080fd5b506101c7611155565b3480156103de57600080fd5b506101c7611164565b6103ef611173565b6001600160a01b03811661041e5760405162461bcd60e51b815260040161041590612034565b60405180910390fd5b607780546001600160a01b0319166001600160a01b0383161790556040517f43a303848c82a28f94def3043839eaebd654c19fdada874a74fb94d8bf7d343890610469908390611e67565b60405180910390a150565b60015481565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d60208110156104e657600080fd5b50516001600160a01b031633148061050857506003546001600160a01b031633145b610559576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920476f7665726e6f72206f7220477561726469616e00000000000000604482015290519081900360640190fd5b806105665761056661123d565b61056f816112b5565b50565b6003546001600160a01b031681565b600260435414156105d9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026043556105e6611340565b6076546105fb906001600160a01b0316611391565b6001600160a01b0316336001600160a01b03161461062b5760405162461bcd60e51b815260040161041590612172565b6075546001600160a01b038781169116146106585760405162461bcd60e51b81526004016104159061214b565b34156106765760405162461bcd60e51b815260040161041590611fdd565b60755461068b906001600160a01b0316610bdf565b6001600160a01b0316638c2a993e85856040518363ffffffff1660e01b81526004016106b8929190611ee2565b600060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505082159150610757905057604051635260769b60e11b81526001600160a01b0385169063a4c0ed3690610724908890879087908790600401611efb565b600060405180830381600087803b15801561073e57600080fd5b505af1158015610752573d6000803e3d6000fd5b505050505b836001600160a01b0316856001600160a01b0316876001600160a01b03167fc7f2e9c55c40a50fbc217dfc70cd39a222940dfa62145aa0ca49eb9535d4fcb2866040516107a491906121a9565b60405180910390a45050600160435550505050565b6107c1611173565b6001600160a01b03811661081c576040805162461bcd60e51b815260206004820152601960248201527f5061757365477561726469616e206d7573742062652073657400000000000000604482015290519081900360640190fd5b61056f816113aa565b6077546001600160a01b031681565b600054610100900460ff1690565b61084a611173565b6001600160a01b0381166108705760405162461bcd60e51b81526004016104159061200c565b607580546001600160a01b0319166001600160a01b0383161790556040517f0b7cf729ac6c387cab57a28d257c6ecac863c24b086353121057083c7bfc79f990610469908390611e67565b60606108cd8686866000808888610d44565b9695505050505050565b60025481565b6108e56113fc565b61056f8161145b565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561092a57600080fd5b505af115801561093e573d6000803e3d6000fd5b505050506040513d602081101561095457600080fd5b50516001600160a01b031633146109b2576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b5050505050505050565b6060632e567b3660e01b86868686600087604051602001610a66929190611f61565b60408051601f1981840301815290829052610a879594939291602401611e7b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905095945050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d6020811015610b2a57600080fd5b50516001600160a01b03163314610b88576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610bc357600080fd5b505af1158015610bd7573d6000803e3d6000fd5b505050505050565b6075546000906001600160a01b03838116911614610bff57506000610c0a565b610c07611503565b90505b919050565b6076546001600160a01b031681565b610c26611533565b6001600160a01b0316336001600160a01b031614610c81576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b604254610100900460ff1680610c9a5750610c9a611558565b80610ca8575060425460ff16155b610ce35760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015610d0e576042805460ff1961ff0019909116610100171660011790555b610d17826108e5565b6000805461ff001916610100179055610d2e611569565b8015610d40576042805461ff00191690555b5050565b606060026043541415610d9e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002604355610dab611340565b6075546001600160a01b03898116911614610dd85760405162461bcd60e51b81526004016104159061214b565b85610df55760405162461bcd60e51b815260040161041590611fb0565b3415610e135760405162461bcd60e51b815260040161041590611fdd565b6001600160a01b038716610e395760405162461bcd60e51b81526004016104159061205f565b610e41611a76565b610e4b8484611612565b602083018190526001600160a01b0390911682525115610e7d5760405162461bcd60e51b8152600401610415906120bc565b607554610e92906001600160a01b0316610bdf565b81516040516374f4f54760e01b81526001600160a01b0392909216916374f4f54791610ec2918b90600401611ee2565b600060405180830381600087803b158015610edc57600080fd5b505af1158015610ef0573d6000803e3d6000fd5b505050506000610f3060008360000151607660009054906101000a90046001600160a01b0316610f2b8e87600001518f8f8a60200151610a44565b61168f565b905080896001600160a01b031683600001516001600160a01b03167f3073a74ecb728d10be779fe19a74a1428e20468f5b4d167bf9c73d9067847d738d60008d604051610f7f93929190611ec1565b60405180910390a480604051602001610f9891906121a9565b604051602081830303815290604052925050506001604355979650505050505050565b610fc3611173565b6001600160a01b038116610fe95760405162461bcd60e51b81526004016104159061208c565b607680546001600160a01b0319166001600160a01b0383161790556040517f60d5265d09ed32300af9a69188333d24b405b6f4196f623f3e2b78321181a61590610469908390611e67565b61105d7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110867f000000000000000000000000000000000000000000000000000000000000000061182f565b6110af7f000000000000000000000000000000000000000000000000000000000000000061182f565b6110d87f000000000000000000000000000000000000000000000000000000000000000061182f565b6111017f000000000000000000000000000000000000000000000000000000000000000061182f565b61112a7f000000000000000000000000000000000000000000000000000000000000000061182f565b6111537f000000000000000000000000000000000000000000000000000000000000000061182f565b565b6075546001600160a01b031681565b6004546001600160a01b031681565b6004805460408051634fc07d7560e01b815290516001600160a01b0390921692634fc07d75928282019260209290829003018186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d60208110156111df57600080fd5b50516001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b6077546001600160a01b03166112655760405162461bcd60e51b815260040161041590611f85565b6076546001600160a01b031661128d5760405162461bcd60e51b8152600401610415906120f3565b6075546001600160a01b03166111535760405162461bcd60e51b815260040161041590612123565b600060019054906101000a900460ff16151581151514156112d55761056f565b6000805461ff0019166101008315158102919091179182905560ff910416156112fd57426002555b6000546040805161010090920460ff1615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5916020908290030190a150565b600054610100900460ff1615611153576040805162461bcd60e51b81526020600482015260116024820152705061757365642028636f6e74726163742960781b604482015290519081900360640190fd5b7311110000000000000000000000000000000011110190565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e90600090a35050565b6004546001600160a01b03163314611153576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b0381166114af576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b600061152e7f0000000000000000000000000000000000000000000000000000000000000000611930565b905090565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000611563306119ca565b15905090565b604254610100900460ff16806115825750611582611558565b80611590575060425460ff16155b6115cb5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff161580156115f6576042805460ff1961ff0019909116610100171660011790555b6115fe6119d0565b801561056f576042805461ff001916905550565b607754600090606090829082906001600160a01b03163314156116455761163b85870187611b66565b9092509050611682565b33915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b90925090505b9250929050565b60008060646001600160a01b031663928c169a8786866040518463ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117005781810151838201526020016116e8565b50505050905090810190601f16801561172d5780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050506040513d602081101561177757600080fd5b5051604080516020808252865182820152865193945084936001600160a01b03808a1694908b16937f2b986d32a0536b7e19baa48ab949fec7b903b7fad7730820b20632d100cc3a68938a93919283929083019185019080838360005b838110156117ec5781810151838201526020016117d4565b50505050905090810190601f1680156118195780820380516001836020036101000a031916815260200191505b509250505060405180910390a495945050505050565b6004805460408051637bb20d2f60e11b8152928301849052516000926001600160a01b039092169163f7641a5e916024808301926020929190829003018186803b15801561187c57600080fd5b505afa158015611890573d6000803e3d6000fd5b505050506040513d60208110156118a657600080fd5b50516000838152600560205260409020549091506001600160a01b03808316911614610d405760008281526005602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000818152600560205260408120546001600160a01b031680610c07576004805460408051637bb20d2f60e11b8152928301869052516001600160a01b039091169163f7641a5e916024808301926020929190829003018186803b15801561199757600080fd5b505afa1580156119ab573d6000803e3d6000fd5b505050506040513d60208110156119c157600080fd5b50519392505050565b3b151590565b604254610100900460ff16806119e957506119e9611558565b806119f7575060425460ff16155b611a325760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604254610100900460ff16158015611a5d576042805460ff1961ff0019909116610100171660011790555b6001604355801561056f576042805461ff001916905550565b60408051808201909152600081526060602082015290565b60008083601f840112611a9f578182fd5b50813567ffffffffffffffff811115611ab6578182fd5b60208301915083602082850101111561168857600080fd5b600082601f830112611ade578081fd5b813567ffffffffffffffff80821115611af357fe5b604051601f8301601f191681016020018281118282101715611b1157fe5b604052828152848301602001861015611b28578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215611b54578081fd5b8135611b5f816121b2565b9392505050565b60008060408385031215611b78578081fd5b8235611b83816121b2565b9150602083013567ffffffffffffffff811115611b9e578182fd5b611baa85828601611ace565b9150509250929050565b60008060008060008060a08789031215611bcc578182fd5b8635611bd7816121b2565b95506020870135611be7816121b2565b94506040870135611bf7816121b2565b935060608701359250608087013567ffffffffffffffff811115611c19578283fd5b611c2589828a01611a8e565b979a9699509497509295939492505050565b600080600080600060a08688031215611c4e578081fd5b8535611c59816121b2565b94506020860135611c69816121b2565b93506040860135611c79816121b2565b925060608601359150608086013567ffffffffffffffff811115611c9b578182fd5b611ca788828901611ace565b9150509295509295909350565b600080600080600060808688031215611ccb578081fd5b8535611cd6816121b2565b94506020860135611ce6816121b2565b935060408601359250606086013567ffffffffffffffff811115611d08578182fd5b611d1488828901611a8e565b969995985093965092949392505050565b600080600080600080600060c0888a031215611d3f578081fd5b8735611d4a816121b2565b96506020880135611d5a816121b2565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115611d8a578182fd5b611d968a828b01611a8e565b989b979a50959850939692959293505050565b600060208284031215611dba578081fd5b81358015158114611b5f578182fd5b600080600060408486031215611ddd578283fd5b8335611de8816121b2565b9250602084013567ffffffffffffffff811115611e03578283fd5b611e0f86828701611a8e565b9497909650939450505050565b60008151808452815b81811015611e4157602081850181015186830182015201611e25565b81811115611e525782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a060808201819052600090611eb690830184611e1c565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0385168152602081018490526060604082018190528101829052600082846080840137818301608090810191909152601f909201601f191601019392505050565b901515815260200190565b600060208252611b5f6020830184611e1c565b600060ff8416825260406020830152611f7d6040830184611e1c565b949350505050565b602080825260119082015270130c97d493d555115497d393d517d4d155607a1b604082015260600190565b6020808252601390820152721253959053125117d6915493d7d05353d55395606a1b604082015260600190565b602080825260159082015274494e56414c49445f4e4f4e5a45524f5f56414c554560581b604082015260600190565b6020808252600e908201526d1253959053125117d30c57d1d49560921b604082015260600190565b60208082526011908201527024a72b20a624a22fa6192fa927aaaa22a960791b604082015260600190565b60208082526013908201527224a72b20a624a22fa222a9aa24a720aa24a7a760691b604082015260600190565b6020808252601690820152751253959053125117d30c57d0d3d5539511549410549560521b604082015260600190565b6020808252601a908201527f43414c4c5f484f4f4b5f444154415f4e4f545f414c4c4f574544000000000000604082015260600190565b602080825260169082015275130c57d0d3d5539511549410549517d393d517d4d15560521b604082015260600190565b6020808252600e908201526d130c57d1d49517d393d517d4d15560921b604082015260600190565b6020808252600d908201526c1513d2d15397d393d517d1d495609a1b604082015260600190565b60208082526018908201527f4f4e4c595f434f554e544552504152545f474154455741590000000000000000604082015260600190565b90815260200190565b6001600160a01b038116811461056f57600080fdfe496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564a264697066735822122065fad7a9fc021b14dda68574a33568d80fcb7311e53fb115c48b61e211858c8364736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway","networkInteractionId":1,"nonce":1595,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway","networkInteractionId":1,"nonce":1595,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa89cbe9c8ef67afcf2f99d782b4ebd4644f8c98569332051804b66ec6587df1a"},"type":"TRANSACTION_SEND"} +{"artifactId":"RewardsManager#RewardsManager","constructorArgs":[],"contractName":"RewardsManager","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"RewardsManager#RewardsManager","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RewardsManager#RewardsManager","networkInteraction":{"data":"0x6101606040527fe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f6080527fc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f6706360a0527f966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c5318076160c0527f1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d16703460e0527f45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247610100527fd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0610120527f39605a6c26a173774ca666c67ef70cf491880e5d3d6d0ca66ec0a31034f15ea36101405234801561011057600080fd5b5060805160a05160c05160e051610100516101205161014051611ca761017360003980610e60525080610e37525080610e0e52806117d9525080610de5528061155c525080610dbc525080610d93525080610d6a52806113a05250611ca76000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806393a90a1e11610104578063c8a5f81e116100a2578063e284f84811610071578063e284f848146103ad578063e820e284146103b5578063eeac3e0e146103d5578063f77c4791146103e8576101da565b8063c8a5f81e14610377578063d6866ea51461038a578063db75092614610392578063e242cf1e146103a5576101da565b8063a8cc0ee2116100de578063a8cc0ee21461034c578063b951acd714610354578063c4d66de81461035c578063c7d1117d1461036f576101da565b806393a90a1e146103135780639ce7abe514610326578063a2594d8214610339576101da565b80634986594f1161017c578063702a280e1161014b578063702a280e146102c4578063779bcb9b146102e55780639006ce8b146102f857806392eefe9b14610300576101da565b80634986594f146102735780634bbfc1c5146102965780635c6cbd59146102a95780636c080f18146102bc576101da565b80631324a506116101b85780631324a5061461022557806316a84ab2146102385780631d1c2fec14610258578063260582491461026b576101da565b806305bb8c6b146101df5780630903c094146101fd5780631156bdc114610212575b600080fd5b6101e76103f0565b6040516101f49190611a57565b60405180910390f35b61021061020b366004611895565b6103ff565b005b610210610220366004611962565b61045b565b61021061023336600461197a565b61046f565b61024b610246366004611962565b6104b0565b6040516101f49190611a8f565b61024b610266366004611962565b6104c2565b6101e76104fb565b610286610281366004611962565b61050a565b6040516101f49493929190611c12565b6102106102a4366004611962565b610531565b61024b6102b7366004611962565b61062d565b61024b61071e565b6102d76102d2366004611962565b610724565b6040516101f4929190611c04565b61024b6102f33660046118cd565b610898565b61024b6109be565b61021061030e366004611895565b6109c4565b610210610321366004611895565b6109d5565b61021061033436600461199e565b610a2f565b610210610347366004611895565b610b85565b61024b610ca0565b61024b610cbc565b61021061036a366004611895565b610cc2565b61024b610d2e565b61024b610385366004611a36565b610d46565b610210610d65565b61024b6103a0366004611895565b610e86565b61024b6110bc565b61024b6110c2565b6103c86103c3366004611962565b6111d1565b6040516101f49190611a84565b61024b6103e3366004611962565b6111e5565b6101e7611217565b600f546001600160a01b031681565b610407611226565b600f80546001600160a01b0319166001600160a01b0383161790556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611a98565b60405180910390a150565b610463611226565b61046c816112fa565b50565b600f546001600160a01b031633146104a25760405162461bcd60e51b815260040161049990611acf565b60405180910390fd5b6104ac8282611336565b5050565b60116020526000908152604090205481565b60006104cc610d2e565b5060008281526010602052604090206104e48361062d565b808255600d5460029092019190915590505b919050565b6015546001600160a01b031681565b60106020526000908152604090208054600182015460028301546003909301549192909184565b600f546001600160a01b03163314806105de575060008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c991906118b1565b6001600160a01b0316336001600160a01b0316145b6105fa5760405162461bcd60e51b815260040161049990611bdc565b60128190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b1e565b600081815260106020526040812081610644611399565b6001600160a01b03166346e855da856040518263ffffffff1660e01b815260040161066f9190611a8f565b60206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190611a1e565b905060006012548210156106d4576000610706565b610706670de0b6b3a7640000610700846106fa87600201546106f4610ca0565b906113c4565b90611421565b9061147a565b835490915061071590826114e1565b95945050505050565b60145481565b600081815260106020526040812081908161073e8561062d565b9050600061075082846001015461153b565b90506000806040518060400160405280610768611555565b6001600160a01b03908116825260155416602090910152905060005b600281101561084757600082826002811061079b57fe5b60200201516001600160a01b03161461083f578181600281106107ba57fe5b60200201516001600160a01b031663e2e1e8e98a6040518263ffffffff1660e01b81526004016107ea9190611a8f565b60206040518083038186803b15801561080257600080fd5b505afa158015610816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083a9190611a1e565b830192505b600101610784565b508161085e57600084965096505050505050610893565b60006108768361070086670de0b6b3a7640000611421565b600387015490915061088890826114e1565b975093955050505050505b915091565b60006108a2611555565b6001600160a01b0316836001600160a01b031614806108ce57506015546001600160a01b038481169116145b6108ea5760405162461bcd60e51b815260040161049990611b77565b6000806000806000876001600160a01b03166355c85269886040518263ffffffff1660e01b815260040161091e9190611a57565b60c06040518083038186803b15801561093657600080fd5b505afa15801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611905565b95509550955095505094508461098c576000955050505050506109b8565b600061099785610724565b5090506109af6109a8858584611580565b83906114e1565b96505050505050505b92915050565b600e5481565b6109cc6115a5565b61046c81611604565b6109dd611226565b601580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f97befc0afcf2bace352f077aea9873c9552fc2e5ab26874f356006fdf9da4ede90600090a35050565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b505050506040513d6020811015610a9557600080fd5b50516001600160a01b03163314610af3576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b60405163623faf6160e01b8152602060048201908152602482018490526001600160a01b0386169163623faf619186918691908190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610b6757600080fd5b505af1158015610b7b573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bc157600080fd5b505af1158015610bd5573d6000803e3d6000fd5b505050506040513d6020811015610beb57600080fd5b50516001600160a01b03163314610c49576040805162461bcd60e51b815260206004820152601e60248201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604482015290519081900360640190fd5b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050505050565b6000610cb6610cad6110c2565b600d54906114e1565b90505b90565b60125481565b610cca6116ac565b6001600160a01b0316336001600160a01b031614610d25576040805162461bcd60e51b815260206004820152601360248201527227b7363c9034b6b83632b6b2b73a30ba34b7b760691b604482015290519081900360640190fd5b61046c816109cc565b6000610d38610ca0565b600d81905543600e55905090565b6000610d5e670de0b6b3a76400006107008486611421565b9392505050565b610d8e7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610db77f00000000000000000000000000000000000000000000000000000000000000006116d1565b610de07f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e097f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e327f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e5b7f00000000000000000000000000000000000000000000000000000000000000006116d1565b610e847f00000000000000000000000000000000000000000000000000000000000000006116d1565b565b600033610e91611555565b6001600160a01b0316816001600160a01b03161480610ebd57506015546001600160a01b038281169116145b610ed95760405162461bcd60e51b815260040161049990611ba5565b600080600080600080866001600160a01b03166355c852698a6040518263ffffffff1660e01b8152600401610f0e9190611a57565b60c06040518083038186803b158015610f2657600080fd5b505afa158015610f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5e9190611905565b9550955095509550955095506000610f75856111e5565b9050610f80856111d1565b15610fd657896001600160a01b0316866001600160a01b03167f9b1323a10f3955b1c9c054ffbda78edfdf49998aaf37f61d9f84776b59ac804360405160405180910390a36000985050505050505050506104f6565b6000871561106357610ff3610fec868685611580565b84906114e1565b90508015611063576110036117d2565b6001600160a01b03166340c10f198a836040518363ffffffff1660e01b8152600401611030929190611a6b565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050505b8a6001600160a01b0316876001600160a01b03167fa111914d7f2ea8beca61d12f1a1f38c5533de5f1823c3936422df4404ac2ec68836040516110a69190611a8f565b60405180910390a39a9950505050505050505050565b600d5481565b6000806110da600e54436113c490919063ffffffff16565b9050806110eb576000915050610cb9565b6014546110fc576000915050610cb9565b60006111066117d2565b90506000816001600160a01b03166370a08231611121611399565b6040518263ffffffff1660e01b815260040161113d9190611a57565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190611a1e565b9050806111a05760009350505050610cb9565b6014546000906111b09085611421565b90506111c88261070083670de0b6b3a7640000611421565b94505050505090565b600090815260116020526040902054151590565b600081815260106020526040812081806111fe85610724565b6003850182905560019094019390935550909392505050565b6000546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316634fc07d756040518163ffffffff1660e01b815260040160206040518083038186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b50516001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601860248201527f4f6e6c7920436f6e74726f6c6c657220676f7665726e6f720000000000000000604482015290519081900360640190fd5b611302610d2e565b5060148190556040517f96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c9061045090611b4d565b600081611344576000611346565b435b600084815260116020526040908190208290555190915083907fe016102b339c3889f4967b491f3381f2c352c8fe3d4f880007807d45b124065a9061138c908490611a8f565b60405180910390a2505050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008282111561141b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611430575060006109b8565b8282028284828161143d57fe5b0414610d5e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611c516021913960400191505060405180910390fd5b60008082116114d0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d957fe5b049392505050565b600082820183811015610d5e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081831161154b576000610d5e565b610d5e83836113c4565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000006117f9565b60008061158d83856113c4565b9050610715670de0b6b3a76400006107008388611421565b6000546001600160a01b03163314610e84576040805162461bcd60e51b815260206004820152601960248201527f43616c6c6572206d75737420626520436f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b6001600160a01b038116611658576040805162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c881b5d5cdd081899481cd95d60521b604482015290519081900360640190fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f709181900360200190a150565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000805460408051637bb20d2f60e11b81526004810185905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d602081101561174857600080fd5b50516000838152600160205260409020549091506001600160a01b038083169116146104ac5760008281526001602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251908152915184927fd0e7a942b1fc38c411c4f53d153ba14fd24542a6a35ebacd9b6afca1a154e20692908290030190a25050565b6000610cb67f00000000000000000000000000000000000000000000000000000000000000005b6000818152600160205260408120546001600160a01b0316806109b85760005460408051637bb20d2f60e11b81526004810186905290516001600160a01b039092169163f7641a5e91602480820192602092909190829003018186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50519392505050565b6000602082840312156118a6578081fd5b8135610d5e81611c2d565b6000602082840312156118c2578081fd5b8151610d5e81611c2d565b600080604083850312156118df578081fd5b82356118ea81611c2d565b915060208301356118fa81611c2d565b809150509250929050565b60008060008060008060c0878903121561191d578182fd5b865161192881611c42565b602088015190965061193981611c2d565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b600060208284031215611973578081fd5b5035919050565b6000806040838503121561198c578182fd5b8235915060208301356118fa81611c42565b6000806000604084860312156119b2578283fd5b83356119bd81611c2d565b9250602084013567ffffffffffffffff808211156119d9578384fd5b818601915086601f8301126119ec578384fd5b8135818111156119fa578485fd5b876020828501011115611a0b578485fd5b6020830194508093505050509250925092565b600060208284031215611a2f578081fd5b5051919050565b60008060408385031215611a48578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6020808252601a908201527f7375626772617068417661696c6162696c6974794f7261636c65000000000000604082015260600190565b6020808252602f908201527f43616c6c6572206d75737420626520746865207375626772617068206176616960408201526e6c6162696c697479206f7261636c6560881b606082015260800190565b6020808252601590820152741b5a5b9a5b5d5b54dd5899dc985c1a14da59db985b605a1b604082015260600190565b60208082526010908201526f69737375616e6365506572426c6f636b60801b604082015260600190565b6020808252601490820152732737ba1030903932bbb0b932399034b9b9bab2b960611b604082015260600190565b6020808252601f908201527f43616c6c6572206d757374206265206120726577617264732069737375657200604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6001600160a01b038116811461046c57600080fd5b801515811461046c57600080fdfe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220b536df78ac5675cc1b134b52c2a049a6938eb11d81ca397ce9b07214c71d8af264736f6c63430007060033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RewardsManager#RewardsManager","networkInteractionId":1,"nonce":1596,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RewardsManager#RewardsManager","networkInteractionId":1,"nonce":1596,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x95e8cf51aec76b9a1fd51587f573824526b89309d153e475e14f6d368af0bceb"},"type":"TRANSACTION_SEND"} +{"futureId":"Controller#Controller","hash":"0x38745c8ad22d3cd61a943a23dcc475e54d0c8b751122259723fd2c6966632add","networkInteractionId":1,"receipt":{"blockHash":"0x2ce959aa2db22ac6d786a560143b59b68bcd40830dff3ec57102141c52d985d4","blockNumber":152512382,"contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":3,"topics":["0x8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"Controller#Controller","result":{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"EpochManager#EpochManager","hash":"0x859e4f54c6a35fd4ab34cdc50a1bc74fc3e6c51fa1e23dd27c5faffb29768ed0","networkInteractionId":1,"receipt":{"blockHash":"0xb263d18d04d02399b1d354d3fafaa51ae3b83bc972f08bff4d88c2865996a4db","blockNumber":152512394,"contractAddress":"0x450906A976dc21450A7CcD1989D26E137E605B91","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"EpochManager#EpochManager","result":{"address":"0x450906A976dc21450A7CcD1989D26E137E605B91","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin","hash":"0xd76e5fc20076c7d417d14c71770190aabda128d246a16dfcc29f77fb7f270365","networkInteractionId":1,"receipt":{"blockHash":"0xd1de76490ec9034658085496fe8bd413fd4aa1c8f8a9feb622c1ceda0409a192","blockNumber":152512405,"contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin","result":{"address":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#OZProxyDummy_GraphPayments","hash":"0x9983dbeee2627390f14712118876eae5f0cef7a85aa0486c834aa1c51be61e9d","networkInteractionId":1,"receipt":{"blockHash":"0xc3f67663761469c57b16b4c6dc05f26a2a9c4620b6087207910a34515a8a932a","blockNumber":152512417,"contractAddress":"0x8A44C49eD477e7130249d4B8d5248d08B469Bf0d","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#OZProxyDummy_GraphPayments","result":{"address":"0x8A44C49eD477e7130249d4B8d5248d08B469Bf0d","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","hash":"0x8e31fc40c140b6f04f8bde3abd3c53acd237a7e5654c53970b92f35080dd91cf","networkInteractionId":1,"receipt":{"blockHash":"0x5cf2307fc9c5f8e302aafd81e97edaa47d9d858f71b213430bc5bde655474f60","blockNumber":152512428,"contractAddress":"0xBaBe8F24fFB27fb01C5b66999Db6929E5d500C70","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#OZProxyDummy_PaymentsEscrow","result":{"address":"0xBaBe8F24fFB27fb01C5b66999Db6929E5d500C70","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonStaking#ExponentialRebates","hash":"0xa1983cc6775d37b981f072909799a74c3ec9b62ab36904736b703f798399cd86","networkInteractionId":1,"receipt":{"blockHash":"0x3f3c03d9e439ae0202ab1cb7918cbc4d68385f97e9ff5f019ba18825278e9c3c","blockNumber":152512440,"contractAddress":"0xF2DB533658a1728f3ce04A49Df4b545f4A53b620","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonStaking#ExponentialRebates","result":{"address":"0xF2DB533658a1728f3ce04A49Df4b545f4A53b620","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2Curation#GraphCurationToken","hash":"0x68f850e03de53f05ada2c9dda84d68477c01208665a4f6128a709f7234db967e","networkInteractionId":1,"receipt":{"blockHash":"0x0bfd0605c4599b2521cdbaf5660b350f795eca816825a5f2ab605c0d161fe824","blockNumber":152512453,"contractAddress":"0xb85d6e91EeAdDc35927AF34e5E28428282e4bcF2","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2Curation#GraphCurationToken","result":{"address":"0xb85d6e91EeAdDc35927AF34e5E28428282e4bcF2","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2Curation#L2Curation","hash":"0xfd0caf2dcfb174f3acde1c794d754bb83104bf1b77c83a218a67b1cfcfdd4843","networkInteractionId":1,"receipt":{"blockHash":"0x3339a2f960f327759725e7d2f663d30aee90f640c36e89d38c4ef6517b384e54","blockNumber":152512467,"contractAddress":"0x9CCD9B656f8A558879974ef2505496eEd7Ef7210","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2Curation#L2Curation","result":{"address":"0x9CCD9B656f8A558879974ef2505496eEd7Ef7210","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#L2GraphToken","hash":"0x6730a19b4ae0823f98e12f2af100906334a11b2fdd6b1494c9f7ad68d8f0053b","networkInteractionId":1,"receipt":{"blockHash":"0x861402612f36718cb21edc0147c54643011e157dcfa4f33638c79261081fa22a","blockNumber":152512480,"contractAddress":"0x71927f8Ff0ce294882e2A161A54F62f3b0f3c726","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#L2GraphToken","result":{"address":"0x71927f8Ff0ce294882e2A161A54F62f3b0f3c726","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway","hash":"0xa89cbe9c8ef67afcf2f99d782b4ebd4644f8c98569332051804b66ec6587df1a","networkInteractionId":1,"receipt":{"blockHash":"0xa872700710f71849da9bdf9a2355bfa124fc46203bcc3313b09c5b880a842829","blockNumber":152512493,"contractAddress":"0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway","result":{"address":"0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"RewardsManager#RewardsManager","hash":"0x95e8cf51aec76b9a1fd51587f573824526b89309d153e475e14f6d368af0bceb","networkInteractionId":1,"receipt":{"blockHash":"0x9ebc83aeb193601733890302b58cdcead45968a2f97216b6c7f07c5fc30b7970","blockNumber":152512506,"contractAddress":"0x05Ca4d407ec53Ac17ce6Bb414f42663f415Dc5C3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RewardsManager#RewardsManager","result":{"address":"0x05Ca4d407ec53Ac17ce6Bb414f42663f415Dc5C3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":["0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setPauseGuardian","futureId":"Controller#Controller.setPauseGuardian","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"Controller#Controller.setPauseGuardian","networkInteraction":{"data":"0x48bde20c000000000000000000000000e11ba2b4d45eaed5996cd0823791e0c93114882d","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"Controller#Controller.setPauseGuardian","networkInteractionId":1,"nonce":1597,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"Controller#Controller.setPauseGuardian","networkInteractionId":1,"nonce":1597,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa0f981c56c58202d66ee938772201794bc9cead7302705b8b64fb2b3153ed92c"},"type":"TRANSACTION_SEND"} +{"args":[false],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setPaused","futureId":"Controller#Controller.setPaused","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"Controller#Controller.setPaused","networkInteraction":{"data":"0x16c38b3c0000000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"Controller#Controller.setPaused","networkInteractionId":1,"nonce":1598,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"Controller#Controller.setPaused","networkInteractionId":1,"nonce":1598,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x482d45da2008336e8f038ca3ec57367f318c169dd254bf5c54bc7134e417d718"},"type":"TRANSACTION_SEND"} +{"args":["0xad834c286a9b590f8264c8d9574fafcbbbe90b3b"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"Controller#Controller.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"Controller#Controller.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"Controller#Controller.transferOwnership","networkInteractionId":1,"nonce":1599,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"Controller#Controller.transferOwnership","networkInteractionId":1,"nonce":1599,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xee3d1c7f7fc367161dcb08e7afa2f8f0f533e19cef58d76775a5bd41cfbc8d2f"},"type":"TRANSACTION_SEND"} +{"args":["0xad834c286a9b590f8264c8d9574fafcbbbe90b3b"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"GraphProxyAdmin#GraphProxyAdmin.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin.transferOwnership","networkInteractionId":1,"nonce":1600,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin.transferOwnership","networkInteractionId":1,"nonce":1600,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xbb631fdffdc4dffde9350410329d3d575649ced974c5af87732384102f33a502"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","constructorArgs":["0x8A44C49eD477e7130249d4B8d5248d08B469Bf0d","0xade6b8eb69a49b56929c1d4f4b428d791861db6f","0x"],"contractName":"TransparentUpgradeableProxy","dependencies":["HorizonProxies#OZProxyDummy_GraphPayments"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","networkInteraction":{"data":"0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008a44c49ed477e7130249d4b8d5248d08b469bf0d000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","networkInteractionId":1,"nonce":1601,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","networkInteractionId":1,"nonce":1601,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x9ce59770403f06943081072734b4edb820bc9f669e6ed25fafb503f50581005a"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","constructorArgs":["0xBaBe8F24fFB27fb01C5b66999Db6929E5d500C70","0xade6b8eb69a49b56929c1d4f4b428d791861db6f","0x"],"contractName":"TransparentUpgradeableProxy","dependencies":["HorizonProxies#OZProxyDummy_PaymentsEscrow"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","networkInteraction":{"data":"0x60a0604052604051610eae380380610eae8339810160408190526100229161039d565b828161002e828261008f565b50508160405161003d9061033a565b6001600160a01b039091168152602001604051809103906000f080158015610069573d6000803e3d6000fd5b506001600160a01b031660805261008761008260805190565b6100ee565b50505061048f565b6100988261015c565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100e2576100dd82826101db565b505050565b6100ea610252565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61012e600080516020610e8e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015981610273565b50565b806001600160a01b03163b60000361019757604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101f89190610473565b600060405180830381855af49150503d8060008114610233576040519150601f19603f3d011682016040523d82523d6000602084013e610238565b606091505b5090925090506102498583836102b2565b95945050505050565b34156102715760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029d57604051633173bdd160e11b81526000600482015260240161018e565b80600080516020610e8e8339815191526101ba565b6060826102c7576102c282610311565b61030a565b81511580156102de57506001600160a01b0384163b155b1561030757604051639996b31560e01b81526001600160a01b038516600482015260240161018e565b50805b9392505050565b8051156103215780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6105538061093b83390190565b80516001600160a01b038116811461035e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561039457818101518382015260200161037c565b50506000910152565b6000806000606084860312156103b257600080fd5b6103bb84610347565b92506103c960208501610347565b60408501519092506001600160401b038111156103e557600080fd5b8401601f810186136103f657600080fd5b80516001600160401b0381111561040f5761040f610363565b604051601f8201601f19908116603f011681016001600160401b038111828210171561043d5761043d610363565b60405281815282820160200188101561045557600080fd5b610466826020830160208601610379565b8093505050509250925092565b60008251610485818460208701610379565b9190910192915050565b6080516104926104a96000396000601001526104926000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610304565b8101906100a09190610344565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f0565b505050565b6100ae610266565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101af5780604051634c9c8ce360e01b81526004016101a69190610419565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161020d919061042d565b600060405180830381855af49150503d8060008114610248576040519150601f19603f3d011682016040523d82523d6000602084013e61024d565b606091505b509150915061025d858383610285565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029a57610295826102db565b6102d4565b81511580156102b157506001600160a01b0384163b155b156102d15783604051639996b31560e01b81526004016101a69190610419565b50805b9392505050565b8051156102eb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000808585111561031457600080fd5b8386111561032157600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035757600080fd5b82356001600160a01b038116811461036e57600080fd5b915060208301356001600160401b0381111561038957600080fd5b8301601f8101851361039a57600080fd5b80356001600160401b038111156103b3576103b361032e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156103e1576103e161032e565b6040528181528282016020018710156103f957600080fd5b816020840160208301376000602083830101528093505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561044e5760208186018101518583015201610434565b50600092019182525091905056fea2646970667358221220079092acd5c0b5783781c6719b8677b2804315edab5ec07af0a0f7a7a9b7803c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161055338038061055383398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610456806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610091578063ad3cb1cc146100a4578063f2fde38b146100e2575b600080fd5b34801561005b57600080fd5b50610064610102565b005b34801561007257600080fd5b5061007b610116565b604051610088919061025d565b60405180910390f35b61006461009f36600461029c565b610125565b3480156100b057600080fd5b506100d5604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008891906103bd565b3480156100ee57600080fd5b506100646100fd3660046103d7565b610194565b61010a6101db565b610114600061020d565b565b6000546001600160a01b031690565b61012d6101db565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015d90869086906004016103f4565b6000604051808303818588803b15801561017657600080fd5b505af115801561018a573d6000803e3d6000fd5b5050505050505050565b61019c6101db565b6001600160a01b0381166101cf576000604051631e4fbdf760e01b81526004016101c6919061025d565b60405180910390fd5b6101d88161020d565b50565b336101e4610116565b6001600160a01b031614610114573360405163118cdaa760e01b81526004016101c6919061025d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101d857600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156102b157600080fd5b83356102bc81610271565b925060208401356102cc81610271565b915060408401356001600160401b038111156102e757600080fd5b8401601f810186136102f857600080fd5b80356001600160401b0381111561031157610311610286565b604051601f8201601f19908116603f011681016001600160401b038111828210171561033f5761033f610286565b60405281815282820160200188101561035757600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000815180845260005b8181101561039d57602081850181015186830182015201610381565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103d06020830184610377565b9392505050565b6000602082840312156103e957600080fd5b81356103d081610271565b6001600160a01b038316815260406020820181905260009061041890830184610377565b94935050505056fea2646970667358221220e77af71a19651e50da550702ce9a5b1b89dda100ca5f41a9c778b943df55af8064736f6c634300081b0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000babe8f24ffb27fb01c5b66999db6929e5d500c70000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","networkInteractionId":1,"nonce":1602,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","networkInteractionId":1,"nonce":1602,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x65688faa5ebf1a43b5e2cee223942fb644975d2293a75645e354610e5e0b805c"},"type":"TRANSACTION_SEND"} +{"args":["0xade6b8eb69a49b56929c1d4f4b428d791861db6f"],"artifactId":"L2GraphToken#L2GraphToken","dependencies":["L2GraphToken#L2GraphToken"],"functionName":"initialize","futureId":"L2GraphToken#encodeFunctionCall(L2GraphToken#L2GraphToken.initialize)","result":"0xc4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"futureId":"Controller#Controller.setPauseGuardian","hash":"0xa0f981c56c58202d66ee938772201794bc9cead7302705b8b64fb2b3153ed92c","networkInteractionId":1,"receipt":{"blockHash":"0x95fb26676c55f51542aec84c7b1618603c42688d87d9637762133469cbeb585b","blockNumber":152512550,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x","logIndex":1,"topics":["0x0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e11ba2b4d45eaed5996cd0823791e0c93114882d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"Controller#Controller.setPauseGuardian","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"Controller#Controller.setPaused","hash":"0x482d45da2008336e8f038ca3ec57367f318c169dd254bf5c54bc7134e417d718","networkInteractionId":1,"receipt":{"blockHash":"0x1e1531745b8690e56f7a8bc344e3e48cdd216cb9c502415207195813cb0fec50","blockNumber":152512561,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x0000000000000000000000000000000000000000000000000000000000000000","logIndex":0,"topics":["0x8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec5"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"Controller#Controller.setPaused","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"Controller#Controller.transferOwnership","hash":"0xee3d1c7f7fc367161dcb08e7afa2f8f0f533e19cef58d76775a5bd41cfbc8d2f","networkInteractionId":1,"receipt":{"blockHash":"0xc9cd96f208faaa08277ac3eae62bd854e78c6d1b7b69bbd6c7d5d03a22bfdade","blockNumber":152512573,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x","logIndex":0,"topics":["0x76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"Controller#Controller.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin.transferOwnership","hash":"0xbb631fdffdc4dffde9350410329d3d575649ced974c5af87732384102f33a502","networkInteractionId":1,"receipt":{"blockHash":"0x640776de7ea3e4103d7aa10ef710bfeba8a4ceebbb856e903592710e3721a9ed","blockNumber":152512584,"logs":[{"address":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","data":"0x","logIndex":1,"topics":["0x76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphProxyAdmin#GraphProxyAdmin.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","hash":"0x9ce59770403f06943081072734b4edb820bc9f669e6ed25fafb503f50581005a","networkInteractionId":1,"receipt":{"blockHash":"0xe9feee7816b51afc5bfad81886badefde61e329e936e94eaac21dc26c3986b89","blockNumber":152512596,"contractAddress":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","logs":[{"address":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008a44c49ed477e7130249d4b8d5248d08b469bf0d"]},{"address":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aca3dd622e863e425cdb15e8734a5cb318448db7","logIndex":2,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","result":{"address":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","hash":"0x65688faa5ebf1a43b5e2cee223942fb644975d2293a75645e354610e5e0b805c","networkInteractionId":1,"receipt":{"blockHash":"0xdf79392f74fe07517e2289ad17067475bb723b52b58bc278290a29de32092954","blockNumber":152512603,"contractAddress":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","logs":[{"address":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x000000000000000000000000babe8f24ffb27fb01c5b66999db6929e5d500c70"]},{"address":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb643167f03eff532c537e3d72e56b9992cad985","logIndex":2,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","result":{"address":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"EpochManager#GraphProxy","constructorArgs":["0x450906A976dc21450A7CcD1989D26E137E605B91","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"contractName":"GraphProxy","dependencies":["EpochManager#EpochManager","GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"EpochManager#GraphProxy","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"EpochManager#GraphProxy","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c000000000000000000000000450906a976dc21450a7ccd1989d26e137e605b910000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"EpochManager#GraphProxy","networkInteractionId":1,"nonce":1603,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"EpochManager#GraphProxy","networkInteractionId":1,"nonce":1603,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x70673b1942420700c6029089aa17d2010a7f6925a8faffa8a2c56a19af19129f"},"type":"TRANSACTION_SEND"} +{"args":["0x0750EdA3185C758247E97819074bCD217a815FaE",60],"artifactId":"EpochManager#EpochManager","dependencies":["EpochManager#EpochManager","Controller#Controller"],"functionName":"initialize","futureId":"EpochManager#encodeFunctionCall(EpochManager#EpochManager.initialize)","result":"0xcd6dc6870000000000000000000000000750eda3185c758247e97819074bcd217a815fae000000000000000000000000000000000000000000000000000000000000003c","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"args":["0xed734418922426bf2cc8783754bd80fc4d441a4dbe994549aee8a2f03136fcdb","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"GraphHorizon_Periphery#setContractProxy_GraphProxyAdmin","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphProxyAdmin","networkInteraction":{"data":"0xe0e99292ed734418922426bf2cc8783754bd80fc4d441a4dbe994549aee8a2f03136fcdb0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphProxyAdmin","networkInteractionId":1,"nonce":1604,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphProxyAdmin","networkInteractionId":1,"nonce":1604,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x17fc13472b9e6884333a28ba14936405b039e0e172885c8c60504af946a4e50b"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonProxies#GraphPayments_ProxyWithABI","contractAddress":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","contractName":"GraphPayments_ProxyWithABI","dependencies":["HorizonProxies#TransparentUpgradeableProxy_GraphPayments"],"futureId":"HorizonProxies#GraphPayments_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"HorizonProxies#GraphProxy","constructorArgs":["0x0000000000000000000000000000000000000000","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"contractName":"GraphProxy","dependencies":["GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonProxies#GraphProxy","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#GraphProxy","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#GraphProxy","networkInteractionId":1,"nonce":1605,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#GraphProxy","networkInteractionId":1,"nonce":1605,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x12046ff040bcb03bb9d7764120995666dcfc62ebb1c93f9c25305fb90c4126c4"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonProxies#PaymentsEscrow_ProxyWithABI","contractAddress":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","contractName":"PaymentsEscrow_ProxyWithABI","dependencies":["HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow"],"futureId":"HorizonProxies#PaymentsEscrow_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments","dependencies":["HorizonProxies#TransparentUpgradeableProxy_GraphPayments"],"emitterAddress":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","eventIndex":0,"eventName":"AdminChanged","futureId":"HorizonProxies#TransparentUpgradeableProxy_GraphPayments_AdminChanged","nameOrIndex":"newAdmin","result":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x9ce59770403f06943081072734b4edb820bc9f669e6ed25fafb503f50581005a","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow","dependencies":["HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow"],"emitterAddress":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","eventIndex":0,"eventName":"AdminChanged","futureId":"HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow_AdminChanged","nameOrIndex":"newAdmin","result":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x65688faa5ebf1a43b5e2cee223942fb644975d2293a75645e354610e5e0b805c","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"L2Curation#GraphProxy","constructorArgs":["0x9CCD9B656f8A558879974ef2505496eEd7Ef7210","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"contractName":"GraphProxy","dependencies":["L2Curation#L2Curation","GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2Curation#GraphProxy","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2Curation#GraphProxy","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c0000000000000000000000009ccd9b656f8a558879974ef2505496eed7ef72100000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2Curation#GraphProxy","networkInteractionId":1,"nonce":1606,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2Curation#GraphProxy","networkInteractionId":1,"nonce":1606,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x5c128bbee1cb7cf9f52ef8e56417dd4f49b4b92622f49c1e34a6a5b490d261f0"},"type":"TRANSACTION_SEND"} +{"args":["0x0750EdA3185C758247E97819074bCD217a815FaE","0xb85d6e91EeAdDc35927AF34e5E28428282e4bcF2",10000,1],"artifactId":"L2Curation#L2Curation","dependencies":["L2Curation#L2Curation","Controller#Controller","L2Curation#GraphCurationToken"],"functionName":"initialize","futureId":"L2Curation#encodeFunctionCall(L2Curation#L2Curation.initialize)","result":"0x4c8c7a440000000000000000000000000750eda3185c758247e97819074bcd217a815fae000000000000000000000000b85d6e91eeaddc35927af34e5e28428282e4bcf200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"L2GraphToken#GraphProxy","constructorArgs":["0x71927f8Ff0ce294882e2A161A54F62f3b0f3c726","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"contractName":"GraphProxy","dependencies":["L2GraphToken#L2GraphToken","GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2GraphToken#GraphProxy","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#GraphProxy","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c00000000000000000000000071927f8ff0ce294882e2a161a54f62f3b0f3c7260000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#GraphProxy","networkInteractionId":1,"nonce":1607,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#GraphProxy","networkInteractionId":1,"nonce":1607,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x0885250dc8c71655552807f0e94dd25995ab2aa5ee93f6a576c3cd27e72e11d1"},"type":"TRANSACTION_SEND"} +{"artifactId":"L2GraphTokenGateway#GraphProxy","constructorArgs":["0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"contractName":"GraphProxy","dependencies":["L2GraphTokenGateway#L2GraphTokenGateway","GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"L2GraphTokenGateway#GraphProxy","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphTokenGateway#GraphProxy","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c0000000000000000000000004dea2d1be05909b71f539fd32601f7bd736c28d40000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphTokenGateway#GraphProxy","networkInteractionId":1,"nonce":1608,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphTokenGateway#GraphProxy","networkInteractionId":1,"nonce":1608,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xbb9f3c0e4f560b942e332a9bc29e76c1847232ba2854fd31834b94ffb797adc4"},"type":"TRANSACTION_SEND"} +{"args":["0x0750EdA3185C758247E97819074bCD217a815FaE"],"artifactId":"L2GraphTokenGateway#L2GraphTokenGateway","dependencies":["L2GraphTokenGateway#L2GraphTokenGateway","Controller#Controller"],"functionName":"initialize","futureId":"L2GraphTokenGateway#encodeFunctionCall(L2GraphTokenGateway#L2GraphTokenGateway.initialize)","result":"0xc4d66de80000000000000000000000000750eda3185c758247e97819074bcd217a815fae","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"RewardsManager#GraphProxy","constructorArgs":["0x05Ca4d407ec53Ac17ce6Bb414f42663f415Dc5C3","0x1CEBe1C314Cc454baf4bd553409d957C833623c0"],"contractName":"GraphProxy","dependencies":["RewardsManager#RewardsManager","GraphProxyAdmin#GraphProxyAdmin"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"RewardsManager#GraphProxy","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RewardsManager#GraphProxy","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50604051610a12380380610a128339818101604052604081101561003357600080fd5b50805160209091015161004581610055565b61004e826100b3565b5050610137565b600061005f610111565b6000805160206109d2833981519152838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006100bd610124565b6000805160206109f2833981519152838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b6000805160206109d28339815191525490565b6000805160206109f28339815191525490565b61088c806101466000396000f3fe6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b14610104578063623faf6114610119578063704b6c0214610196578063f851a440146101c957610083565b80633659cfe61461008b578063396f7b23146100be57806359fc20bb146100ef57610083565b36610083576100816101de565b005b6100816101de565b34801561009757600080fd5b50610081600480360360208110156100ae57600080fd5b50356001600160a01b031661029e565b3480156100ca57600080fd5b506100d36102d8565b604080516001600160a01b039092168252519081900360200190f35b3480156100fb57600080fd5b50610081610338565b34801561011057600080fd5b506100d3610393565b34801561012557600080fd5b506100816004803603602081101561013c57600080fd5b81019060208101813564010000000081111561015757600080fd5b82018360208201111561016957600080fd5b8035906020019184600183028401116401000000008311171561018b57600080fd5b5090925090506103e1565b3480156101a257600080fd5b50610081600480360360208110156101b957600080fd5b50356001600160a01b03166104f1565b3480156101d557600080fd5b506100d3610576565b6101e66105c0565b6001600160a01b0316336001600160a01b0316141561024c576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742066616c6c6261636b20746f2070726f78792074617267657400604482015290519081900360640190fd5b6040516001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541636600083376000803684845af490503d806000843e81801561029a578184f35b8184fd5b6102a66105c0565b6001600160a01b0316336001600160a01b031614156102cd576102c8816105e5565b6102d5565b6102d56101de565b50565b60006102e26105c0565b6001600160a01b0316336001600160a01b031614806103195750610304610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610655565b9050610335565b6103356101de565b90565b6103406105c0565b6001600160a01b0316336001600160a01b031614806103775750610362610655565b6001600160a01b0316336001600160a01b0316145b156103895761038461067a565b610391565b6103916101de565b565b600061039d6105c0565b6001600160a01b0316336001600160a01b031614806103d457506103bf610655565b6001600160a01b0316336001600160a01b0316145b1561032d57610326610751565b6103e96105c0565b6001600160a01b0316336001600160a01b03161480610420575061040b610655565b6001600160a01b0316336001600160a01b0316145b156104e55761042d61067a565b6000610437610751565b6001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d8060008114610491576040519150601f19603f3d011682016040523d82523d6000602084013e610496565b606091505b50509050806104df576040805162461bcd60e51b815260206004820152601060248201526f125b5c1b0818d85b1b0819985a5b195960821b604482015290519081900360640190fd5b506104ed565b6104ed6101de565b5050565b6104f96105c0565b6001600160a01b0316336001600160a01b031614156102cd576001600160a01b03811661056d576040805162461bcd60e51b815260206004820152601e60248201527f41646d696e2063616e7420626520746865207a65726f20616464726573730000604482015290519081900360640190fd5b6102c881610776565b60006105806105c0565b6001600160a01b0316336001600160a01b031614806105b757506105a2610655565b6001600160a01b0316336001600160a01b0316145b1561032d576103265b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60006105ef610655565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c838155604051919250906001600160a01b0380851691908416907f980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a190600090a3505050565b7f9e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c5490565b6000610684610655565b90506001600160a01b0381166106e1576040805162461bcd60e51b815260206004820152601b60248201527f496d706c2063616e6e6f74206265207a65726f20616464726573730000000000604482015290519081900360640190fd5b336001600160a01b0382161461073e576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c792070656e64696e6720696d706c656d656e746174696f6e0000000000604482015290519081900360640190fd5b610747816107e6565b6102d560006105e5565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b60006107806105c0565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103838155604051919250906001600160a01b0380851691908416907f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b90600090a3505050565b60006107f0610751565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc838155604051919250906001600160a01b0380851691908416907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a350505056fea264697066735822122041ce882775d17ef838c17f08249aa48a5f3ea1c65b581e69896452640b274de264736f6c63430007060033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61039e5eddc59e0b171f57125ab86bee043d9128098c3a6b9adb4f2e86333c2f6f8c00000000000000000000000005ca4d407ec53ac17ce6bb414f42663f415dc5c30000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RewardsManager#GraphProxy","networkInteractionId":1,"nonce":1609,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RewardsManager#GraphProxy","networkInteractionId":1,"nonce":1609,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x13e7b34e0caacb89e827bb29d875e724cb0101bcba19917093c4482cf04301ea"},"type":"TRANSACTION_SEND"} +{"args":["0x0750EdA3185C758247E97819074bCD217a815FaE"],"artifactId":"RewardsManager#RewardsManager","dependencies":["RewardsManager#RewardsManager","Controller#Controller"],"functionName":"initialize","futureId":"RewardsManager#encodeFunctionCall(RewardsManager#RewardsManager.initialize)","result":"0xc4d66de80000000000000000000000000750eda3185c758247e97819074bcd217a815fae","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"futureId":"EpochManager#GraphProxy","hash":"0x70673b1942420700c6029089aa17d2010a7f6925a8faffa8a2c56a19af19129f","networkInteractionId":1,"receipt":{"blockHash":"0x7e4a36277c0a5b61eef4d7f83af4db3f1728a644212b7f1549c893bd6fa54257","blockNumber":152512628,"contractAddress":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","logs":[{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","data":"0x","logIndex":0,"topics":["0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0"]},{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000450906a976dc21450a7ccd1989d26e137e605b91"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"EpochManager#GraphProxy","result":{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphProxyAdmin","hash":"0x17fc13472b9e6884333a28ba14936405b039e0e172885c8c60504af946a4e50b","networkInteractionId":1,"receipt":{"blockHash":"0xee458f5c77fc2e6a1449b1d913975f5575e7406972bc7df06e535630329550b6","blockNumber":152512640,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0xed734418922426bf2cc8783754bd80fc4d441a4dbe994549aee8a2f03136fcdb"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphProxyAdmin","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#GraphProxy","hash":"0x12046ff040bcb03bb9d7764120995666dcfc62ebb1c93f9c25305fb90c4126c4","networkInteractionId":1,"receipt":{"blockHash":"0x867e89efbefeab2af219ee8ede1266ab529ed953f62a7ac5571120ea6b93da48","blockNumber":152512652,"contractAddress":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","logs":[{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","data":"0x","logIndex":0,"topics":["0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0"]},{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#GraphProxy","result":{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2Curation#GraphProxy","hash":"0x5c128bbee1cb7cf9f52ef8e56417dd4f49b4b92622f49c1e34a6a5b490d261f0","networkInteractionId":1,"receipt":{"blockHash":"0x27ac46c5bc665253767219597e73a5972bc0c0edcdd34d5addbccd329911b452","blockNumber":152512664,"contractAddress":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","logs":[{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x","logIndex":0,"topics":["0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000009ccd9b656f8a558879974ef2505496eed7ef7210"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2Curation#GraphProxy","result":{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#GraphProxy","hash":"0x0885250dc8c71655552807f0e94dd25995ab2aa5ee93f6a576c3cd27e72e11d1","networkInteractionId":1,"receipt":{"blockHash":"0xef1e1f7d4ea7a92bbbe58f2ce36203a01b520234767dd6b151c34006ce310a5c","blockNumber":152512675,"contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":0,"topics":["0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0"]},{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000071927f8ff0ce294882e2a161a54f62f3b0f3c726"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#GraphProxy","result":{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphTokenGateway#GraphProxy","hash":"0xbb9f3c0e4f560b942e332a9bc29e76c1847232ba2854fd31834b94ffb797adc4","networkInteractionId":1,"receipt":{"blockHash":"0x8ee6c1f288acd3825dd522507d0117b79f388b6d14f2bcef0f743e46b6f98cfd","blockNumber":152512688,"contractAddress":"0x7284213d1cDa80C892a4388f38dA431F06343144","logs":[{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","data":"0x","logIndex":0,"topics":["0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0"]},{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000004dea2d1be05909b71f539fd32601f7bd736c28d4"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphTokenGateway#GraphProxy","result":{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"RewardsManager#GraphProxy","hash":"0x13e7b34e0caacb89e827bb29d875e724cb0101bcba19917093c4482cf04301ea","networkInteractionId":1,"receipt":{"blockHash":"0xbfa99db971cab1d5e5a0d1bced6e796148e016697f2f0b6cdcb68362d5d40b19","blockNumber":152512700,"contractAddress":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","logs":[{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x","logIndex":0,"topics":["0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0"]},{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000005ca4d407ec53ac17ce6bb414f42663f415dc5c3"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RewardsManager#GraphProxy","result":{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"EpochManager#EpochManager_ProxyWithABI","contractAddress":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","contractName":"EpochManager_ProxyWithABI","dependencies":["EpochManager#GraphProxy"],"futureId":"EpochManager#EpochManager_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"HorizonProxies#ProxyAdmin_GraphPayments","contractAddress":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","contractName":"ProxyAdmin","dependencies":["HorizonProxies#TransparentUpgradeableProxy_GraphPayments_AdminChanged"],"futureId":"HorizonProxies#ProxyAdmin_GraphPayments","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"HorizonProxies#ProxyAdmin_PaymentsEscrow","contractAddress":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","contractName":"ProxyAdmin","dependencies":["HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow_AdminChanged"],"futureId":"HorizonProxies#ProxyAdmin_PaymentsEscrow","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"args":["0x88cae14a9889b95b4cfd9472fc7dcbca2da791846a1e314bac9c1f8a234cbf9f","0xAFd60629034fBdC3ef58518B817bBDB4EC861c93"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","HorizonProxies#GraphPayments_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"HorizonProxies#setContractProxy_GraphPayments","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#setContractProxy_GraphPayments","networkInteraction":{"data":"0xe0e9929288cae14a9889b95b4cfd9472fc7dcbca2da791846a1e314bac9c1f8a234cbf9f000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c93","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#setContractProxy_GraphPayments","networkInteractionId":1,"nonce":1610,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#setContractProxy_GraphPayments","networkInteractionId":1,"nonce":1610,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x25f48d2fe4d06a15878189becf6a23b2b102c984162b277dce40769d5d41d718"},"type":"TRANSACTION_SEND"} +{"args":["0x1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034","0xF5D432192dAF7e8B045349693577ccF0B5165A12"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","HorizonProxies#GraphProxy"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"HorizonProxies#setContractProxy_HorizonStaking","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#setContractProxy_HorizonStaking","networkInteraction":{"data":"0xe0e992921df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#setContractProxy_HorizonStaking","networkInteractionId":1,"nonce":1611,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#setContractProxy_HorizonStaking","networkInteractionId":1,"nonce":1611,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xf25b004bb1859edb4b8779387abf23d9e06c32d7431c18fcb56c334a38917ed5"},"type":"TRANSACTION_SEND"} +{"args":["0x628f67391f8b955553cabfadbf5f1b6a31d2a2d0fea175f5594af9d40b0bedc9","0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","HorizonProxies#PaymentsEscrow_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"HorizonProxies#setContractProxy_PaymentsEscrow","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonProxies#setContractProxy_PaymentsEscrow","networkInteraction":{"data":"0xe0e99292628f67391f8b955553cabfadbf5f1b6a31d2a2d0fea175f5594af9d40b0bedc900000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonProxies#setContractProxy_PaymentsEscrow","networkInteractionId":1,"nonce":1612,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonProxies#setContractProxy_PaymentsEscrow","networkInteractionId":1,"nonce":1612,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa097925819a0b2bc01f7bf4475ffb5f7eb80ff681aecbe64dd5500e4e9ef582f"},"type":"TRANSACTION_SEND"} +{"artifactId":"L2Curation#L2Curation_ProxyWithABI","contractAddress":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","contractName":"L2Curation_ProxyWithABI","dependencies":["L2Curation#GraphProxy"],"futureId":"L2Curation#L2Curation_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","contractName":"L2GraphToken_ProxyWithABI","dependencies":["L2GraphToken#GraphProxy"],"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI","contractAddress":"0x7284213d1cDa80C892a4388f38dA431F06343144","contractName":"L2GraphTokenGateway_ProxyWithABI","dependencies":["L2GraphTokenGateway#GraphProxy"],"futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"RewardsManager#RewardsManager_ProxyWithABI","contractAddress":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","contractName":"RewardsManager_ProxyWithABI","dependencies":["RewardsManager#GraphProxy"],"futureId":"RewardsManager#RewardsManager_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"futureId":"HorizonProxies#setContractProxy_GraphPayments","hash":"0x25f48d2fe4d06a15878189becf6a23b2b102c984162b277dce40769d5d41d718","networkInteractionId":1,"receipt":{"blockHash":"0xfdbf86aca83fe33e3e03aaf51d80b09bdd6622da5d10749da766ee25625d6ea3","blockNumber":152512736,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c93","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0x88cae14a9889b95b4cfd9472fc7dcbca2da791846a1e314bac9c1f8a234cbf9f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#setContractProxy_GraphPayments","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#setContractProxy_HorizonStaking","hash":"0xf25b004bb1859edb4b8779387abf23d9e06c32d7431c18fcb56c334a38917ed5","networkInteractionId":1,"receipt":{"blockHash":"0x5f5506fb47a81d0ee98092f5f27d08579f35f3af69b47e0952cc38a3df819ddb","blockNumber":152512748,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0x1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#setContractProxy_HorizonStaking","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonProxies#setContractProxy_PaymentsEscrow","hash":"0xa097925819a0b2bc01f7bf4475ffb5f7eb80ff681aecbe64dd5500e4e9ef582f","networkInteractionId":1,"receipt":{"blockHash":"0x99aef79c47f60d97ca4655d41bd026db401c743376a677f22fe9193da6e5b9f2","blockNumber":152512759,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x00000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0x628f67391f8b955553cabfadbf5f1b6a31d2a2d0fea175f5594af9d40b0bedc9"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonProxies#setContractProxy_PaymentsEscrow","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":["0x450906A976dc21450A7CcD1989D26E137E605B91","0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","0xcd6dc6870000000000000000000000000750eda3185c758247e97819074bcd217a815fae000000000000000000000000000000000000000000000000000000000000003c"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","EpochManager#EpochManager","EpochManager#EpochManager_ProxyWithABI","EpochManager#encodeFunctionCall(EpochManager#EpochManager.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"acceptProxyAndCall","futureId":"EpochManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"EpochManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteraction":{"data":"0x07ebde0e000000000000000000000000450906a976dc21450a7ccd1989d26e137e605b91000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044cd6dc6870000000000000000000000000750eda3185c758247e97819074bcd217a815fae000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"EpochManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1613,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"EpochManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1613,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xdd58762ff54633fe86f5210e47a5cc15701159f3202a40a3ba834536b4b3b4b5"},"type":"TRANSACTION_SEND"} +{"args":["0x9CCD9B656f8A558879974ef2505496eEd7Ef7210","0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","0x4c8c7a440000000000000000000000000750eda3185c758247e97819074bcd217a815fae000000000000000000000000b85d6e91eeaddc35927af34e5e28428282e4bcf200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","L2Curation#L2Curation","L2Curation#L2Curation_ProxyWithABI","L2Curation#encodeFunctionCall(L2Curation#L2Curation.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"acceptProxyAndCall","futureId":"L2Curation#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2Curation#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteraction":{"data":"0x07ebde0e0000000000000000000000009ccd9b656f8a558879974ef2505496eed7ef7210000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000844c8c7a440000000000000000000000000750eda3185c758247e97819074bcd217a815fae000000000000000000000000b85d6e91eeaddc35927af34e5e28428282e4bcf20000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2Curation#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1614,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2Curation#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1614,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x975d40cc8ca44f658c2821c7ff94d37d52e882de6b758dbb001c2fe1519fe52d"},"type":"TRANSACTION_SEND"} +{"args":["0x00fe8F95407AB61863d27c07F584A0930ee5F3b0"],"artifactId":"L2Curation#L2Curation_ProxyWithABI","contractAddress":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","dependencies":["L2Curation#L2Curation_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setSubgraphService","futureId":"L2Curation#L2Curation_ProxyWithABI.setSubgraphService","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2Curation#L2Curation_ProxyWithABI.setSubgraphService","networkInteraction":{"data":"0x93a90a1e00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0","id":1,"to":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2Curation#L2Curation_ProxyWithABI.setSubgraphService","networkInteractionId":1,"nonce":1615,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2Curation#L2Curation_ProxyWithABI.setSubgraphService","networkInteractionId":1,"nonce":1615,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x548f87f1f68b83a44cf7c444d85cbc75d47e44f243571b030729c3adb38abd10"},"type":"TRANSACTION_SEND"} +{"args":["0x71927f8Ff0ce294882e2A161A54F62f3b0f3c726","0xBBcb9a575176039C06F94d4d8337818318A26828","0xc4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","L2GraphToken#L2GraphToken","L2GraphToken#L2GraphToken_ProxyWithABI","L2GraphToken#encodeFunctionCall(L2GraphToken#L2GraphToken.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"acceptProxyAndCall","futureId":"L2GraphToken#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteraction":{"data":"0x07ebde0e00000000000000000000000071927f8ff0ce294882e2a161a54f62f3b0f3c726000000000000000000000000bbcb9a575176039c06f94d4d8337818318a2682800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000000000000000","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1616,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1616,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x902db41fc904c0f0f9eb9e36352f8ea85c4e2ddb65e7405338e64070c3493688"},"type":"TRANSACTION_SEND"} +{"args":["0xade6b8eb69a49b56929c1d4f4b428d791861db6f","10000000000000000000000000000"],"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","dependencies":["L2GraphToken#L2GraphToken_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"mint","futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.mint","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.mint","networkInteraction":{"data":"0x40c10f19000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f0000000000000000000000000000000000000000204fce5e3e25026110000000","id":1,"to":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.mint","networkInteractionId":1,"nonce":1617,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.mint","networkInteractionId":1,"nonce":1617,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x3c633de8f787b1719a228c23fdb3b831d962d490976a4f0b723720b8803e289f"},"type":"TRANSACTION_SEND"} +{"args":[],"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","dependencies":["L2GraphToken#L2GraphToken_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"renounceMinter","futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","networkInteraction":{"data":"0x98650275","id":1,"to":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","networkInteractionId":1,"nonce":1618,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","networkInteractionId":1,"nonce":1618,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xc18bd9f8b47eb70b0c33a9d94b52b1bfc1cc9da4d3d6a091cb338f7f316da0e3"},"type":"TRANSACTION_SEND"} +{"args":["0x4dEA2d1Be05909B71F539FD32601F7bd736c28D4","0x7284213d1cDa80C892a4388f38dA431F06343144","0xc4d66de80000000000000000000000000750eda3185c758247e97819074bcd217a815fae"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","L2GraphTokenGateway#L2GraphTokenGateway","L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI","L2GraphTokenGateway#encodeFunctionCall(L2GraphTokenGateway#L2GraphTokenGateway.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"acceptProxyAndCall","futureId":"L2GraphTokenGateway#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphTokenGateway#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteraction":{"data":"0x07ebde0e0000000000000000000000004dea2d1be05909b71f539fd32601f7bd736c28d40000000000000000000000007284213d1cda80c892a4388f38da431f0634314400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000750eda3185c758247e97819074bcd217a815fae00000000000000000000000000000000000000000000000000000000","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphTokenGateway#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1619,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphTokenGateway#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1619,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x77b214ca044f9be44682eeddfcceabe534bc358d9e844ad66e1501558ec7721c"},"type":"TRANSACTION_SEND"} +{"args":["0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d"],"artifactId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI","contractAddress":"0x7284213d1cDa80C892a4388f38dA431F06343144","dependencies":["L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setPauseGuardian","futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.setPauseGuardian","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.setPauseGuardian","networkInteraction":{"data":"0x48bde20c000000000000000000000000e11ba2b4d45eaed5996cd0823791e0c93114882d","id":1,"to":"0x7284213d1cDa80C892a4388f38dA431F06343144","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.setPauseGuardian","networkInteractionId":1,"nonce":1620,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.setPauseGuardian","networkInteractionId":1,"nonce":1620,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x279ae0ee68fd04dca18f4b103f48bac3298efb89f133da5ee5e3abd2a4d3146e"},"type":"TRANSACTION_SEND"} +{"args":["0x05Ca4d407ec53Ac17ce6Bb414f42663f415Dc5C3","0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","0xc4d66de80000000000000000000000000750eda3185c758247e97819074bcd217a815fae"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","RewardsManager#RewardsManager","RewardsManager#RewardsManager_ProxyWithABI","RewardsManager#encodeFunctionCall(RewardsManager#RewardsManager.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"acceptProxyAndCall","futureId":"RewardsManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RewardsManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteraction":{"data":"0x07ebde0e00000000000000000000000005ca4d407ec53ac17ce6bb414f42663f415dc5c30000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000750eda3185c758247e97819074bcd217a815fae00000000000000000000000000000000000000000000000000000000","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RewardsManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1621,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RewardsManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","networkInteractionId":1,"nonce":1621,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x379b4eeb90b8c19389f2500b96afc20cc69075879a9bbf7f072c6e3dbdc3cd3d"},"type":"TRANSACTION_SEND"} +{"args":["114155251141552511415"],"artifactId":"RewardsManager#RewardsManager_ProxyWithABI","contractAddress":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","dependencies":["RewardsManager#RewardsManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setIssuancePerBlock","futureId":"RewardsManager#RewardsManager_ProxyWithABI.setIssuancePerBlock","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setIssuancePerBlock","networkInteraction":{"data":"0x1156bdc10000000000000000000000000000000000000000000000063038ec17c1be19b7","id":1,"to":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setIssuancePerBlock","networkInteractionId":1,"nonce":1622,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setIssuancePerBlock","networkInteractionId":1,"nonce":1622,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa861fd40ed78bb34d955b6dbf0d94f765c62c7cd0337fb6a9c307f472df296e5"},"type":"TRANSACTION_SEND"} +{"args":["0xd03ea8624C8C5987235048901fB614fDcA89b117"],"artifactId":"RewardsManager#RewardsManager_ProxyWithABI","contractAddress":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","dependencies":["RewardsManager#RewardsManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setSubgraphAvailabilityOracle","futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphAvailabilityOracle","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphAvailabilityOracle","networkInteraction":{"data":"0x0903c094000000000000000000000000d03ea8624c8c5987235048901fb614fdca89b117","id":1,"to":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphAvailabilityOracle","networkInteractionId":1,"nonce":1623,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphAvailabilityOracle","networkInteractionId":1,"nonce":1623,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x7d2ae808e2e2f733315f6663b7fd6871976151a929c590ceda72bf8729d58fa6"},"type":"TRANSACTION_SEND"} +{"args":["0x00fe8F95407AB61863d27c07F584A0930ee5F3b0"],"artifactId":"RewardsManager#RewardsManager_ProxyWithABI","contractAddress":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","dependencies":["RewardsManager#RewardsManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setSubgraphService","futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphService","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphService","networkInteraction":{"data":"0x93a90a1e00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0","id":1,"to":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphService","networkInteractionId":1,"nonce":1624,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphService","networkInteractionId":1,"nonce":1624,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x73e4b291e4205e0f1919f33f38afcddbc46bda0729fc78948220a98d1fe40a3d"},"type":"TRANSACTION_SEND"} +{"futureId":"EpochManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","hash":"0xdd58762ff54633fe86f5210e47a5cc15701159f3202a40a3ba834536b4b3b4b5","networkInteractionId":1,"receipt":{"blockHash":"0xd7d621b43c81dd507d75cdcd95ebd60780cd8d4f8207d16366ecbbd0042d23fc","blockNumber":152512784,"logs":[{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","data":"0x","logIndex":0,"topics":["0xaa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000450906a976dc21450a7ccd1989d26e137e605b91"]},{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x000000000000000000000000450906a976dc21450a7ccd1989d26e137e605b91","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","data":"0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae","logIndex":2,"topics":["0x4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f70"]},{"address":"0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2","data":"0x000000000000000000000000000000000000000000000000000000000000003c","logIndex":3,"topics":["0x25ddd6f00038d5eac0051df83c6084f140a01586f092e2728d1ed781c9ce2441","0x0000000000000000000000000000000000000000000000000000000000000001"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"EpochManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2Curation#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","hash":"0x975d40cc8ca44f658c2821c7ff94d37d52e882de6b758dbb001c2fe1519fe52d","networkInteractionId":1,"receipt":{"blockHash":"0xcda6eca2b9e900a75db4b68b985b093b505234acd100a6a8a4e48a2b51571c78","blockNumber":152512796,"logs":[{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x","logIndex":0,"topics":["0xaa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000009ccd9b656f8a558879974ef2505496eed7ef7210"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000009ccd9b656f8a558879974ef2505496eed7ef7210","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae","logIndex":2,"topics":["0x4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f70"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001364656661756c7452657365727665526174696f00000000000000000000000000","logIndex":3,"topics":["0x96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000156375726174696f6e54617850657263656e746167650000000000000000000000","logIndex":4,"topics":["0x96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000166d696e696d756d4375726174696f6e4465706f73697400000000000000000000","logIndex":5,"topics":["0x96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c"]},{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000136375726174696f6e546f6b656e4d617374657200000000000000000000000000","logIndex":6,"topics":["0x96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2Curation#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2Curation#L2Curation_ProxyWithABI.setSubgraphService","hash":"0x548f87f1f68b83a44cf7c444d85cbc75d47e44f243571b030729c3adb38abd10","networkInteractionId":1,"receipt":{"blockHash":"0xe42326a81201499c7888c38cf1eb816e7c0be8ab7f7de1bc1d062145100f82fb","blockNumber":152512808,"logs":[{"address":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","data":"0x","logIndex":0,"topics":["0x81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c7","0x00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2Curation#L2Curation_ProxyWithABI.setSubgraphService","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","hash":"0x902db41fc904c0f0f9eb9e36352f8ea85c4e2ddb65e7405338e64070c3493688","networkInteractionId":1,"receipt":{"blockHash":"0x1459912e63cef3db779d451b4818fc24fbd8727943bc9ae94950afc027345fc0","blockNumber":152512823,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":0,"topics":["0xaa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000071927f8ff0ce294882e2a161a54f62f3b0f3c726"]},{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x00000000000000000000000071927f8ff0ce294882e2a161a54f62f3b0f3c726","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x0000000000000000000000000000000000000000000000000000000000000000","logIndex":2,"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":3,"topics":["0x6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f6","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.mint","hash":"0x3c633de8f787b1719a228c23fdb3b831d962d490976a4f0b723720b8803e289f","networkInteractionId":1,"receipt":{"blockHash":"0xf339d4e764a193b69123096f1f2e3205d278225f18e88b7499e9fe656006ea26","blockNumber":152512834,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x0000000000000000000000000000000000000000204fce5e3e25026110000000","logIndex":0,"topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.mint","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","hash":"0xc18bd9f8b47eb70b0c33a9d94b52b1bfc1cc9da4d3d6a091cb338f7f316da0e3","networkInteractionId":1,"receipt":{"blockHash":"0x6e64dd677d1d1abe493ef0bd67630772b160318df8649ce18dc5ca7f4ba869a9","blockNumber":152512845,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":3,"topics":["0xe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb66692","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphTokenGateway#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","hash":"0x77b214ca044f9be44682eeddfcceabe534bc358d9e844ad66e1501558ec7721c","networkInteractionId":1,"receipt":{"blockHash":"0x7192dec2029a3e6681419f3058d3e49cb42646f81987986783f68109de5938ba","blockNumber":152512856,"logs":[{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","data":"0x","logIndex":0,"topics":["0xaa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000004dea2d1be05909b71f539fd32601f7bd736c28d4"]},{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000004dea2d1be05909b71f539fd32601f7bd736c28d4","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","data":"0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae","logIndex":2,"topics":["0x4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f70"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphTokenGateway#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.setPauseGuardian","hash":"0x279ae0ee68fd04dca18f4b103f48bac3298efb89f133da5ee5e3abd2a4d3146e","networkInteractionId":1,"receipt":{"blockHash":"0x9bc544feb180827e82dd9be55d05d9dd0dc3187be996089ee44d34572b8608b7","blockNumber":152512866,"logs":[{"address":"0x7284213d1cDa80C892a4388f38dA431F06343144","data":"0x","logIndex":2,"topics":["0x0613b6ee6a04f0d09f390e4d9318894b9f6ac7fd83897cd8d18896ba579c401e","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e11ba2b4d45eaed5996cd0823791e0c93114882d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI.setPauseGuardian","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"RewardsManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","hash":"0x379b4eeb90b8c19389f2500b96afc20cc69075879a9bbf7f072c6e3dbdc3cd3d","networkInteractionId":1,"receipt":{"blockHash":"0x73297d07c33ef096410dc362cc7ba59e2d6130642c66ddd7bcc1b61751786785","blockNumber":152512878,"logs":[{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x","logIndex":0,"topics":["0xaa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000005ca4d407ec53ac17ce6bb414f42663f415dc5c3"]},{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x00000000000000000000000005ca4d407ec53ac17ce6bb414f42663f415dc5c3","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae","logIndex":2,"topics":["0x4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f70"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RewardsManager#GraphProxyAdmin~GraphProxyAdmin.acceptProxyAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setIssuancePerBlock","hash":"0xa861fd40ed78bb34d955b6dbf0d94f765c62c7cd0337fb6a9c307f472df296e5","networkInteractionId":1,"receipt":{"blockHash":"0xa7f6f97630c1cc670ed892e835646cb0087431cfd670bfad40515c98d8a903cc","blockNumber":152512890,"logs":[{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001069737375616e6365506572426c6f636b00000000000000000000000000000000","logIndex":0,"topics":["0x96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setIssuancePerBlock","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphAvailabilityOracle","hash":"0x7d2ae808e2e2f733315f6663b7fd6871976151a929c590ceda72bf8729d58fa6","networkInteractionId":1,"receipt":{"blockHash":"0xb7ac1df06a063c3ea5cfc4d110c1e1901744e1dad9c3c3ee8f239bd2b609916d","blockNumber":152512901,"logs":[{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a7375626772617068417661696c6162696c6974794f7261636c65000000000000","logIndex":0,"topics":["0x96d5a4b4edf1cefd0900c166d64447f8da1d01d1861a6a60894b5b82a2c15c3c"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphAvailabilityOracle","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphService","hash":"0x73e4b291e4205e0f1919f33f38afcddbc46bda0729fc78948220a98d1fe40a3d","networkInteractionId":1,"receipt":{"blockHash":"0x04457f9baf9992df6be674a1708b6e739ab252003e8f71f661511d3842d82c65","blockNumber":152512912,"logs":[{"address":"0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f","data":"0x","logIndex":1,"topics":["0x97befc0afcf2bace352f077aea9873c9552fc2e5ab26874f356006fdf9da4ede","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"RewardsManager#RewardsManager_ProxyWithABI.setSubgraphService","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":["0xc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f67063","0xAA1DeBfb7A7c0Ba85cef858B6E70cFad943Fd4A2"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","EpochManager#EpochManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"GraphHorizon_Periphery#setContractProxy_EpochManager","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Periphery#setContractProxy_EpochManager","networkInteraction":{"data":"0xe0e99292c713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f67063000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a2","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_EpochManager","networkInteractionId":1,"nonce":1625,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_EpochManager","networkInteractionId":1,"nonce":1625,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xcceaf7a13959231dd82800493ff9e55448d5dcfc80a6910b157ec6ef3bd74252"},"type":"TRANSACTION_SEND"} +{"args":["0xd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0","0x7284213d1cDa80C892a4388f38dA431F06343144"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"GraphHorizon_Periphery#setContractProxy_GraphTokenGateway","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphTokenGateway","networkInteraction":{"data":"0xe0e99292d362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf00000000000000000000000007284213d1cda80c892a4388f38da431f06343144","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphTokenGateway","networkInteractionId":1,"nonce":1626,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphTokenGateway","networkInteractionId":1,"nonce":1626,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xe2278b46402583ab47879f8e6ce4792d1870875f1e7e1763bb6daa084686d5b6"},"type":"TRANSACTION_SEND"} +{"args":["0xe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f","0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","L2Curation#L2Curation_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"GraphHorizon_Periphery#setContractProxy_L2Curation","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Periphery#setContractProxy_L2Curation","networkInteraction":{"data":"0xe0e99292e6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_L2Curation","networkInteractionId":1,"nonce":1627,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_L2Curation","networkInteractionId":1,"nonce":1627,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x7c2633e202405c8ead9767e864d0a3c1ad681f2f31bcb742baddc8fd07c63576"},"type":"TRANSACTION_SEND"} +{"args":["0x966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c53180761","0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","RewardsManager#RewardsManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"GraphHorizon_Periphery#setContractProxy_RewardsManager","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Periphery#setContractProxy_RewardsManager","networkInteraction":{"data":"0xe0e99292966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c531807610000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_RewardsManager","networkInteractionId":1,"nonce":1628,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_RewardsManager","networkInteractionId":1,"nonce":1628,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x594c062c3709f602c12b0675783415c1fa1329a2f6a9465b0a3959f320556e4a"},"type":"TRANSACTION_SEND"} +{"args":["0x7284213d1cDa80C892a4388f38dA431F06343144"],"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","dependencies":["L2GraphToken#L2GraphToken_ProxyWithABI","L2GraphTokenGateway#L2GraphTokenGateway_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"addMinter","futureId":"L2GraphToken#addMinterGateway","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#addMinterGateway","networkInteraction":{"data":"0x983b2d560000000000000000000000007284213d1cda80c892a4388f38da431f06343144","id":1,"to":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#addMinterGateway","networkInteractionId":1,"nonce":1629,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#addMinterGateway","networkInteractionId":1,"nonce":1629,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x3c3a015c769fc058b03e59e926cb8277bde3e20cecc17750e784cdcdfdaeee34"},"type":"TRANSACTION_SEND"} +{"args":["0x1AB05a65fa6D5F6a90A23693D5d40A4D927a815f"],"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","dependencies":["L2GraphToken#L2GraphToken_ProxyWithABI","RewardsManager#RewardsManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"addMinter","futureId":"L2GraphToken#addMinterRewardsManager","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#addMinterRewardsManager","networkInteraction":{"data":"0x983b2d560000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f","id":1,"to":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#addMinterRewardsManager","networkInteractionId":1,"nonce":1630,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#addMinterRewardsManager","networkInteractionId":1,"nonce":1630,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x411b24d17504062d4467f4ae9668f2dfd779d15e74c8db0c19ce7818ca3c0a57"},"type":"TRANSACTION_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_EpochManager","hash":"0xcceaf7a13959231dd82800493ff9e55448d5dcfc80a6910b157ec6ef3bd74252","networkInteractionId":1,"receipt":{"blockHash":"0x90c2d165807a178540aad5ba743d420014779a3fa5e310db871fb1e7db759f13","blockNumber":152512959,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a2","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0xc713c3df6d14cdf946460395d09af88993ee2b948b1a808161494e32c5f67063"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_EpochManager","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphTokenGateway","hash":"0xe2278b46402583ab47879f8e6ce4792d1870875f1e7e1763bb6daa084686d5b6","networkInteractionId":1,"receipt":{"blockHash":"0x7a5e50263d3b2f3ca0d031ecccb762e14ef7aca0c3e9967d8ec824c41594cff1","blockNumber":152512972,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x0000000000000000000000007284213d1cda80c892a4388f38da431f06343144","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0xd362cac9cb75c10d67bcc0b7eeb0b1ef48bb5420b556c092d4fd7f758816fcf0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphTokenGateway","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_L2Curation","hash":"0x7c2633e202405c8ead9767e864d0a3c1ad681f2f31bcb742baddc8fd07c63576","networkInteractionId":1,"receipt":{"blockHash":"0x88eca31bf2f7abda8d7e2e4b697885d2758deee895f6ca80b4a77d6d91d15320","blockNumber":152512983,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0xe6876326c1291dfcbbd3864a6816d698cd591defc7aa2153d7f9c4c04016c89f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_L2Curation","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_RewardsManager","hash":"0x594c062c3709f602c12b0675783415c1fa1329a2f6a9465b0a3959f320556e4a","networkInteractionId":1,"receipt":{"blockHash":"0x1791408fc0bfb9e8ee6fd5acd8fe50524348be504e606122e356610f25a7b95c","blockNumber":152512994,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x0000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0x966f1e8d8d8014e05f6ec4a57138da9be1f7c5a7f802928a18072f7c53180761"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_RewardsManager","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#addMinterGateway","hash":"0x3c3a015c769fc058b03e59e926cb8277bde3e20cecc17750e784cdcdfdaeee34","networkInteractionId":1,"receipt":{"blockHash":"0x9703201f7fcc397f97e2be4c2f154319b2054c49221e9517c0c6dc1d243229d1","blockNumber":152513005,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":0,"topics":["0x6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f6","0x0000000000000000000000007284213d1cda80c892a4388f38da431f06343144"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#addMinterGateway","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"L2GraphToken#addMinterRewardsManager","hash":"0x411b24d17504062d4467f4ae9668f2dfd779d15e74c8db0c19ce7818ca3c0a57","networkInteractionId":1,"receipt":{"blockHash":"0x03819e257131ef6d3bfca369b9d2905c5663d063486ce54fde12afd28e943807","blockNumber":152513016,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":4,"topics":["0x6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f6","0x0000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#addMinterRewardsManager","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":["0xad834c286a9b590f8264c8d9574fafcbbbe90b3b"],"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","dependencies":["L2GraphToken#L2GraphToken_ProxyWithABI","L2GraphToken#L2GraphToken_ProxyWithABI.mint","L2GraphToken#L2GraphToken_ProxyWithABI.renounceMinter","L2GraphToken#addMinterRewardsManager","L2GraphToken#addMinterGateway"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","id":1,"to":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership","networkInteractionId":1,"nonce":1631,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership","networkInteractionId":1,"nonce":1631,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xd486ca6c48e7390de0c0ab47f4c0dbcc1913258b3e35707a1c92952a870f7d2c"},"type":"TRANSACTION_SEND"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership","hash":"0xd486ca6c48e7390de0c0ab47f4c0dbcc1913258b3e35707a1c92952a870f7d2c","networkInteractionId":1,"receipt":{"blockHash":"0xcd6257c94b366b8d66ed63ce066215e73946366388689eecb53b7f3d0339c2ac","blockNumber":152513049,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":0,"topics":["0x76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":[],"artifactId":"L2GraphToken#L2GraphToken_ProxyWithABI","contractAddress":"0xBBcb9a575176039C06F94d4d8337818318A26828","dependencies":["L2GraphToken#L2GraphToken_ProxyWithABI","L2GraphToken#L2GraphToken_ProxyWithABI.transferOwnership"],"from":"0xad834c286a9b590f8264c8d9574fafcbbbe90b3b","functionName":"acceptOwnership","futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.acceptOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.acceptOwnership","networkInteraction":{"data":"0x79ba5097","id":1,"to":"0xBBcb9a575176039C06F94d4d8337818318A26828","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.acceptOwnership","networkInteractionId":1,"nonce":15,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.acceptOwnership","networkInteractionId":1,"nonce":15,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x36aef871e6580d62bc8004c43b97fb5ce6a38c42289c90804727369e1743aaaa"},"type":"TRANSACTION_SEND"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.acceptOwnership","hash":"0x36aef871e6580d62bc8004c43b97fb5ce6a38c42289c90804727369e1743aaaa","networkInteractionId":1,"receipt":{"blockHash":"0xbff0647b4e6cce2ce39a5970aa86cd36b72bb99997db208f80363ee13ba8b06c","blockNumber":152513069,"logs":[{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":3,"topics":["0x0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]},{"address":"0xBBcb9a575176039C06F94d4d8337818318A26828","data":"0x","logIndex":4,"topics":["0x76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","0x0000000000000000000000000000000000000000000000000000000000000000"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"L2GraphToken#L2GraphToken_ProxyWithABI.acceptOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":["0x45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247","0xBBcb9a575176039C06F94d4d8337818318A26828"],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","L2GraphToken#L2GraphToken_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setContractProxy","futureId":"GraphHorizon_Periphery#setContractProxy_GraphToken","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphToken","networkInteraction":{"data":"0xe0e9929245fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphToken","networkInteractionId":1,"nonce":1632,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphToken","networkInteractionId":1,"nonce":1632,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x44bbdc20ffb8be014f38b5ee30273e609e1a7ae991253bc16ccf7d43447a5363"},"type":"TRANSACTION_SEND"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphToken","hash":"0x44bbdc20ffb8be014f38b5ee30273e609e1a7ae991253bc16ccf7d43447a5363","networkInteractionId":1,"receipt":{"blockHash":"0x952e76d13857ba426cc7d9a9877a2a35900339743e55fe8f14dad9c3c9651ff3","blockNumber":152513090,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","logIndex":0,"topics":["0x937cf566d78d4769ff0211a7d87a6bea51e1fc026fd4d3d8cd589f0e99b983bd","0x45fc200c7e4544e457d3c5709bfe0d520442c30bbcbdaede89e8d4a4bbc19247"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Periphery#setContractProxy_GraphToken","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"artifactId":"GraphPayments#GraphPayments","constructorArgs":["0x0750EdA3185C758247E97819074bCD217a815FaE",10000],"contractName":"GraphPayments","dependencies":["Controller#Controller","GraphHorizon_Periphery","HorizonProxies"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"GraphPayments#GraphPayments","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphPayments#GraphPayments","networkInteraction":{"data":"0x6101e060405234801561001157600080fd5b50604051611552380380611552833981016040819052610030916104ee565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610372565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610372565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610372565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610372565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610372565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610372565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610372565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610372565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610372565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a45061033a81620f4240101590565b819061035c576040516339b762e560e21b815260040161007191815260200190565b506101c081905261036b610420565b505061058a565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ad91815260200190565b602060405180830381865afa1580156103ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ee919061051a565b9050826001600160a01b0382166104195760405163218f5add60e11b8152600401610071919061053c565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104705760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104cf5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104e957600080fd5b919050565b6000806040838503121561050157600080fd5b61050a836104d2565b9150602083015190509250929050565b60006020828403121561052c57600080fd5b610535826104d2565b9392505050565b602081526000825180602084015260005b8181101561056a576020818601810151604086840101520161054d565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051610f546105fe600039600081816056015261021f0152600050506000505060005050600050506000505060005050600050506000505060006108b20152600061077f0152610f546000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631d526e50146100515780638129fc1c1461008b57806381cd11a014610095578063ac9650d8146100a8575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6100936100c8565b005b6100936100a3366004610b2a565b6101c0565b6100bb6100b6366004610b96565b610662565b6040516100829190610c2f565b60006100d261074a565b805490915060ff600160401b82041615906001600160401b03166000811580156100f95750825b90506000826001600160401b031660011480156101155750303b155b905081158015610123575080155b156101415760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561016b57845460ff60401b1916600160401b1785555b610173610773565b83156101b957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6101cd82620f4240101590565b82906101f8576040516339b762e560e21b81526004016101ef91815260200190565b60405180910390fd5b50610216338561020661077d565b6001600160a01b031691906107a1565b836000610243827f0000000000000000000000000000000000000000000000000000000000000000610857565b905061024f8183610cc5565b9150600061025d8386610857565b90506102698184610cc5565b92506000806102766108b0565b604051631584a17960e21b81526001600160a01b038c811660048301528a81166024830152919091169063561285e49060440160a060405180830381865afa1580156102c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ea9190610cee565b602081015190915015610388576103796103026108b0565b6001600160a01b0316637573ef4f8c8b8f6040518463ffffffff1660e01b815260040161033193929190610d83565b602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610dc7565b8690610857565b91506103858286610cc5565b94505b6103a38461039461077d565b6001600160a01b0316906108d4565b6103c088846103b061077d565b6001600160a01b03169190610939565b81156104b0576103ce61077d565b6001600160a01b031663095ea7b36103e46108b0565b846040518363ffffffff1660e01b8152600401610402929190610de0565b6020604051808303816000875af1158015610421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104459190610df9565b5061044e6108b0565b6001600160a01b031663ca94b0e98b8a856040518463ffffffff1660e01b815260040161047d93929190610e1b565b600060405180830381600087803b15801561049757600080fd5b505af11580156104ab573d6000803e3d6000fd5b505050505b84156105bd576001600160a01b0386166105b0576104cc61077d565b6001600160a01b031663095ea7b36104e26108b0565b876040518363ffffffff1660e01b8152600401610500929190610de0565b6020604051808303816000875af115801561051f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105439190610df9565b5061054c6108b0565b6001600160a01b031663a2a317228b876040518363ffffffff1660e01b8152600401610579929190610de0565b600060405180830381600087803b15801561059357600080fd5b505af11580156105a7573d6000803e3d6000fd5b505050506105bd565b6105bd86866103b061077d565b6001600160a01b038816338c60028111156105da576105da610d6d565b7fb1ac8b16683562f4b1b5ecbe3321151b400058de5cdd25ac44d5bfacb106765f8d8d8989898d8f60405161064d97969594939291906001600160a01b039788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b60405180910390a45050505050505050505050565b604080516000815260208101909152606090826001600160401b0381111561068c5761068c610cd8565b6040519080825280602002602001820160405280156106bf57816020015b60608152602001906001900390816106aa5790505b50915060005b838110156107415761071c308686848181106106e3576106e3610e3f565b90506020028101906106f59190610e55565b8560405160200161070893929190610ea2565b60405160208183030381529060405261096d565b83828151811061072e5761072e610e3f565b60209081029190910101526001016106c5565b50505b92915050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610744565b61077b6109e3565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610852576040516323b872dd60e01b81526001600160a01b038416906323b872dd906107d790859030908690600401610e1b565b6020604051808303816000875af11580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190610df9565b6108525760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016101ef565b505050565b600061086682620f4240101590565b829061088857604051633dc311df60e01b81526004016101ef91815260200190565b5061089f8361089a84620f4240610cc5565b610a08565b6108a99084610cc5565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b801561093557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561091c57600080fd5b505af1158015610930573d6000803e3d6000fd5b505050505b5050565b80156108525760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906107d79085908590600401610de0565b6060600080846001600160a01b03168460405161098a9190610ec9565b600060405180830381855af49150503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50915091506109da858383610a6f565b95945050505050565b6109eb610acb565b61077b57604051631afcd79f60e31b815260040160405180910390fd5b6000610a1783620f4240101590565b80610a2a5750610a2a82620f4240101590565b83839091610a545760405163768bf0eb60e11b8152600481019290925260248201526044016101ef565b50620f42409050610a658385610ee5565b6108a99190610efc565b606082610a8457610a7f82610ae5565b6108a9565b8151158015610a9b57506001600160a01b0384163b155b15610ac457604051639996b31560e01b81526001600160a01b03851660048201526024016101ef565b5092915050565b6000610ad561074a565b54600160401b900460ff16919050565b805115610af55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114610b2557600080fd5b919050565b60008060008060008060c08789031215610b4357600080fd5b863560038110610b5257600080fd5b9550610b6060208801610b0e565b945060408701359350610b7560608801610b0e565b925060808701359150610b8a60a08801610b0e565b90509295509295509295565b60008060208385031215610ba957600080fd5b82356001600160401b03811115610bbf57600080fd5b8301601f81018513610bd057600080fd5b80356001600160401b03811115610be657600080fd5b8560208260051b8401011115610bfb57600080fd5b6020919091019590945092505050565b60005b83811015610c26578181015183820152602001610c0e565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610ca357603f1987860301845281518051808752610c80816020890160208501610c0b565b601f01601f19169590950160209081019550938401939190910190600101610c57565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561074457610744610caf565b634e487b7160e01b600052604160045260246000fd5b600060a0828403128015610d0157600080fd5b6000905060405160a081018181106001600160401b0382111715610d3357634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038481168252831660208201526060810160038310610db957634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b600060208284031215610dd957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610e0b57600080fd5b815180151581146108a957600080fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112610e6c57600080fd5b8301803591506001600160401b03821115610e8657600080fd5b602001915036819003821315610e9b57600080fd5b9250929050565b828482376000838201600081528351610ebf818360208801610c0b565b0195945050505050565b60008251610edb818460208701610c0b565b9190910192915050565b808202811582820484141761074457610744610caf565b600082610f1957634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c7f05052208f6f4047e1223bab7d7f3c4001cbe9b001fbbc3b1069b01cc7eced64736f6c634300081b00330000000000000000000000000750eda3185c758247e97819074bcd217a815fae0000000000000000000000000000000000000000000000000000000000002710","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphPayments#GraphPayments","networkInteractionId":1,"nonce":1633,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphPayments#GraphPayments","networkInteractionId":1,"nonce":1633,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xc54d915f9d9de3516d7f8da7284b32a11ea95d988a1d316f57ac8cad01fc99d1"},"type":"TRANSACTION_SEND"} +{"artifactId":"GraphTallyCollector#GraphTallyCollector","constructorArgs":["GraphTallyCollector","1","0x0750EdA3185C758247E97819074bCD217a815FaE",10000],"contractName":"GraphTallyCollector","dependencies":["Controller#Controller","GraphHorizon_Periphery","HorizonProxies"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"GraphTallyCollector#GraphTallyCollector","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphTallyCollector#GraphTallyCollector","networkInteraction":{"data":"0x6102c060405234801561001157600080fd5b506040516122bf3803806122bf833981016040819052610030916105e0565b8082858561003f8260006103e2565b6101205261004e8160016103e2565b61014052815160208084019190912060e052815190820120610100524660a0526100db60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b03811661012d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101e05260408051808201909152600a81526923b930b8342a37b5b2b760b11b602082015261016590610415565b6001600160a01b0316610160526040805180820190915260078152665374616b696e6760c81b602082015261019990610415565b6001600160a01b03166101805260408051808201909152600d81526c47726170685061796d656e747360981b60208201526101d390610415565b6001600160a01b03166101a05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261020e90610415565b6001600160a01b03166101c05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261024790610415565b6001600160a01b03166102005260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b602082015261028290610415565b6001600160a01b0316610220526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102c090610415565b6001600160a01b03166102405260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102fc90610415565b6001600160a01b03166102605260408051808201909152600881526721bab930ba34b7b760c11b602082015261033190610415565b6001600160a01b039081166102808190526101e05161018051610160516101a0516101c0516102005161022051610240516102605160408051968c168752948b166020870152928a1685850152908916606085015288166080840152871660a083015260c0820195909552935192851694918216939116917fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a439181900360e00190a4506102a0525061082d92505050565b60006020835110156103fe576103f7836104c3565b905061040f565b8161040984826106ea565b5060ff90505b92915050565b6000806101e0516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161045091815260200190565b602060405180830381865afa15801561046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049191906107a8565b9050826001600160a01b0382166104bc5760405163218f5add60e11b815260040161012491906107f6565b5092915050565b600080829050601f815111156104ee578260405163305a27a960e01b815260040161012491906107f6565b80516104f982610809565b179392505050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561053257818101518382015260200161051a565b50506000910152565b600082601f83011261054c57600080fd5b81516001600160401b0381111561056557610565610501565b604051601f8201601f19908116603f011681016001600160401b038111828210171561059357610593610501565b6040528181528382016020018510156105ab57600080fd5b6105bc826020830160208701610517565b949350505050565b80516001600160a01b03811681146105db57600080fd5b919050565b600080600080608085870312156105f657600080fd5b84516001600160401b0381111561060c57600080fd5b6106188782880161053b565b602087015190955090506001600160401b0381111561063657600080fd5b6106428782880161053b565b935050610651604086016105c4565b6060959095015193969295505050565b600181811c9082168061067557607f821691505b60208210810361069557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156106e557806000526020600020601f840160051c810160208510156106c25750805b601f840160051c820191505b818110156106e257600081556001016106ce565b50505b505050565b81516001600160401b0381111561070357610703610501565b610717816107118454610661565b8461069b565b6020601f82116001811461074b57600083156107335750848201515b600019600385901b1c1916600184901b1784556106e2565b600084815260208120601f198516915b8281101561077b578785015182556020948501946001909201910161075b565b50848210156107995786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082840312156107ba57600080fd5b6107c3826105c4565b9392505050565b600081518084526107e2816020860160208601610517565b601f01601f19169290920160200192915050565b6020815260006107c360208301846107ca565b805160208083015191908110156106955760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516119d06108ef60003960008181610247015261036501526000505060005050600050506000505060005050600050506000610a19015260005050600061083e0152600050506000610bb401526000610b8201526000610f2b01526000610f0301526000610e5e01526000610e8801526000610eb201526119d06000f3fe608060405234801561001057600080fd5b50600436106100ba5760003560e01c8063015cdd80146100bf5780631354f019146100d4578063181250ff146100e757806326969c4c1461013457806339aa7416146101475780633a13e1af1461015a57806363648817146101be57806365e4ad9e146101de578063692209ce146102015780637f07d2831461021457806384b0196e146102275780639b95288114610242578063bea5d2ab14610269578063fee9f01f14610295575b600080fd5b6100d26100cd3660046111d7565b6102a8565b005b6100d26100e23660046111d7565b610355565b6101216100f53660046111f4565b600360209081526000948552604080862082529385528385208152918452828420909152825290205481565b6040519081526020015b60405180910390f35b610121610142366004611247565b6103ea565b6100d26101553660046111d7565b610403565b6101976101683660046111d7565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169160ff1683565b604080516001600160a01b039094168452602084019290925215159082015260600161012b565b6101d16101cc366004611281565b6104cd565b60405161012b91906112bb565b6101f16101ec3660046112cf565b6104e0565b604051901515815260200161012b565b61012161020f36600461135f565b6104f3565b6101216102223660046113b8565b61050a565b61022f610521565b60405161012b9796959493929190611450565b6101217f000000000000000000000000000000000000000000000000000000000000000081565b6101216102773660046111d7565b6001600160a01b031660009081526002602052604090206001015490565b6100d26102a33660046114e8565b610567565b806102b33382610633565b6001600160a01b03821660009081526002602052604090206001015482906102f85760405163cd3cd55d60e01b81526004016102ef91906112bb565b60405180910390fd5b506001600160a01b038216600081815260026020908152604080832060010180549390555182815291929133917f3b4432b11b66b46d9a7b190aa989c0ae85a5395b543540220596dd94dd405ceb910160405180910390a3505050565b806103603382610633565b61038a7f000000000000000000000000000000000000000000000000000000000000000042611559565b6001600160a01b0383166000818152600260205260409081902060010183905551909133917fd939049941f6a15381248e4ac0010f15efdf0f3221923711244c200b5ff2cddf916103de9190815260200190565b60405180910390a35050565b60006103fd6103f88361170b565b610666565b92915050565b8061040e3382610633565b6001600160a01b038216600090815260026020526040902060010154828161044a5760405163cd3cd55d60e01b81526004016102ef91906112bb565b504281818111156104775760405163bd76307f60e01b8152600481019290925260248201526044016102ef565b50506001600160a01b0383166000818152600260208190526040808320909101805460ff191660011790555133917f2fc91dbd92d741cae16e0315578d7f6cf77043b771692c4bd993658ecfe8942291a3505050565b60006103fd6104db836117a8565b610738565b60006104ec8383610758565b9392505050565b6000610501858585856107bb565b95945050505050565b600061051984848460006107bb565b949350505050565b600060608060008060006060610535610b7b565b61053d610bad565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6001600160a01b0384811660009081526002602081905260409091208054910154911690859060ff1682156105cb57604051630c83a00f60e01b81526001600160a01b039384166004820152929091166024830152151560448201526064016102ef565b5050506105da82828587610bda565b6001600160a01b03841660008181526002602052604080822080546001600160a01b03191633908117909155905190917f6edcdd4150e63c6c36d965976c1c37375609c8b040c50d39e7156437b80e282891a350505050565b61063d8282610758565b8282909161066057604051631e58ab1f60e01b81526004016102ef9291906117b4565b50505050565b60006103fd7f2f8962be843489018f0fe44aa06adfead655e3c10d7347a020040f9524f392d3836000015184602001518560400151866060015187608001518860a001518960c001518051906020012060405160200161071d98979695949392919097885260208801969096526001600160a01b0394851660408801529284166060870152921660808501526001600160401b039190911660a08401526001600160801b031660c083015260e08201526101000190565b60405160208183030381529060405280519060200120610d17565b6000806107488360000151610666565b90506104ec818460200151610d44565b60006001600160a01b0383161580159061078e57506001600160a01b038281166000908152600260205260409020548116908416145b80156104ec5750506001600160a01b03166000908152600260208190526040909120015460ff1615919050565b60008080806107cc868801886117ce565b825160600151929550909350915033906001600160a01b038116821461080757604051632b65e49760e11b81526004016102ef9291906117b4565b505061081283610d6e565b8251805160608201516040928301519251630119cbed60e31b8152919290916000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308ce5f689061087590859087906004016117b4565b602060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190611828565b875160600151909150816108de5760405163037a2d1f60e61b81526004016102ef91906112bb565b5050855160a001516001600160a01b0380841660009081526003602090815260408083208884528252808320868516845282528083208b5183015190941683529290529081205490916001600160801b031690818180821161095c57604051637007d4a160e01b8152600481019290925260248201526044016102ef565b50508a600003610977576109708183611841565b92506109bd565b6109818183611841565b8b11158b61098f8385611841565b90916109b75760405163c5602bb160e01b8152600481019290925260248201526044016102ef565b50508a92505b50508015610aac576001600160a01b0380841660009081526003602090815260408083208884528252808320868516845282528083208b5183015190941683529290529081208054839290610a13908490611559565b909155507f000000000000000000000000000000000000000000000000000000000000000090506001600160a01b0316631230fa3e8d8960000151602001518585888c8c6040518863ffffffff1660e01b8152600401610a79979695949392919061188c565b600060405180830381600087803b158015610a9357600080fd5b505af1158015610aa7573d6000803e3d6000fd5b505050505b826001600160a01b03168760000151602001516001600160a01b0316857f481a17595c709e8f745444fb9ffc8f0b5e98458de94463971947f548e12bbdb48f8686604051610afc939291906118d8565b60405180910390a48651602080820151608083015160a084015160c090940151928b01516040516001600160a01b03808a16969416948a947f3943fc3b19ec289c87b57de7a8bf1448d81ced03d1806144ecaca4ba9e97605694610b64948b94919391611900565b60405180910390a49b9a5050505050505050505050565b6060610ba87f00000000000000000000000000000000000000000000000000000000000000006000610da6565b905090565b6060610ba87f00000000000000000000000000000000000000000000000000000000000000006001610da6565b8142808211610c055760405163d7705a0160e01b8152600481019290925260248201526044016102ef565b505060408051466020808301919091526001600160601b031930606090811b8216848601527330baba3437b934bd32a9b4b3b732b9283937b7b360611b60548501526068840187905233901b1660888301528251808303607c018152609c90920190925280519101207b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81209050826001600160a01b0316610ce88288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d4492505050565b6001600160a01b031614610d0f57604051631c07ed3360e31b815260040160405180910390fd5b505050505050565b60006103fd610d24610e51565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610d548686610f7c565b925092509250610d648282610fc9565b5090949350505050565b805160200151610d8690610d8183610738565b610758565b610da35760405163aa415c3360e01b815260040160405180910390fd5b50565b606060ff8314610dc057610db983611086565b90506103fd565b818054610dcc90611960565b80601f0160208091040260200160405190810160405280929190818152602001828054610df890611960565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505090506103fd565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610eaa57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ed457507f000000000000000000000000000000000000000000000000000000000000000090565b610ba8604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60008060008351604103610fb65760208401516040850151606086015160001a610fa8888285856110c5565b955095509550505050610fc2565b50508151600091506002905b9250925092565b6000826003811115610fdd57610fdd611854565b03610fe6575050565b6001826003811115610ffa57610ffa611854565b036110185760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561102c5761102c611854565b0361104d5760405163fce698f760e01b8152600481018290526024016102ef565b600382600381111561106157611061611854565b03611082576040516335e2f38360e21b8152600481018290526024016102ef565b5050565b606060006110938361118a565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411156110f65750600091506003905082611180565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561114a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661117657506000925060019150829050611180565b9250600091508190505b9450945094915050565b600060ff8216601f8111156103fd57604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0381168114610da357600080fd5b80356111d2816111b2565b919050565b6000602082840312156111e957600080fd5b81356104ec816111b2565b6000806000806080858703121561120a57600080fd5b8435611215816111b2565b935060208501359250604085013561122c816111b2565b9150606085013561123c816111b2565b939692955090935050565b60006020828403121561125957600080fd5b81356001600160401b0381111561126f57600080fd5b820160e081850312156104ec57600080fd5b60006020828403121561129357600080fd5b81356001600160401b038111156112a957600080fd5b8201604081850312156104ec57600080fd5b6001600160a01b0391909116815260200190565b600080604083850312156112e257600080fd5b82356112ed816111b2565b915060208301356112fd816111b2565b809150509250929050565b8035600381106111d257600080fd5b60008083601f84011261132957600080fd5b5081356001600160401b0381111561134057600080fd5b60208301915083602082850101111561135857600080fd5b9250929050565b6000806000806060858703121561137557600080fd5b61137e85611308565b935060208501356001600160401b0381111561139957600080fd5b6113a587828801611317565b9598909750949560400135949350505050565b6000806000604084860312156113cd57600080fd5b6113d684611308565b925060208401356001600160401b038111156113f157600080fd5b6113fd86828701611317565b9497909650939450505050565b6000815180845260005b8181101561143057602081850181015186830182015201611414565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e06020820152600061146f60e083018961140a565b8281036040840152611481818961140a565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b818110156114d75783518352602093840193909201916001016114b9565b50909b9a5050505050505050505050565b600080600080606085870312156114fe57600080fd5b8435611509816111b2565b93506020850135925060408501356001600160401b0381111561152b57600080fd5b61153787828801611317565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103fd576103fd611543565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156115a4576115a461156c565b60405290565b80356001600160401b03811681146111d257600080fd5b80356001600160801b03811681146111d257600080fd5b600082601f8301126115e957600080fd5b81356001600160401b038111156116025761160261156c565b604051601f8201601f19908116603f011681016001600160401b03811182821017156116305761163061156c565b60405281815283820160200185101561164857600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0828403121561167757600080fd5b61167f611582565b823581529050611691602083016111c7565b60208201526116a2604083016111c7565b60408201526116b3606083016111c7565b60608201526116c4608083016115aa565b60808201526116d560a083016115c1565b60a082015260c08201356001600160401b038111156116f357600080fd5b6116ff848285016115d8565b60c08301525092915050565b60006103fd3683611665565b60006040828403121561172957600080fd5b604080519081016001600160401b038111828210171561174b5761174b61156c565b60405290508082356001600160401b0381111561176757600080fd5b61177385828601611665565b82525060208301356001600160401b0381111561178f57600080fd5b61179b858286016115d8565b6020830152505092915050565b60006103fd3683611717565b6001600160a01b0392831681529116602082015260400190565b6000806000606084860312156117e357600080fd5b83356001600160401b038111156117f957600080fd5b61180586828701611717565b93505060208401359150604084013561181d816111b2565b809150509250925092565b60006020828403121561183a57600080fd5b5051919050565b818103818111156103fd576103fd611543565b634e487b7160e01b600052602160045260246000fd5b6003811061188857634e487b7160e01b600052602160045260246000fd5b9052565b60e0810161189a828a61186a565b6001600160a01b03978816602083015295871660408201526060810194909452918516608084015260a083015290921660c090920191909152919050565b606081016118e6828661186a565b6001600160a01b0393909316602082015260400152919050565b6001600160a01b03861681526001600160401b03851660208201526001600160801b038416604082015260a0606082018190526000906119429083018561140a565b8281036080840152611954818561140a565b98975050505050505050565b600181811c9082168061197457607f821691505b60208210810361199457634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212202168ccf8bac6984eef611a01a2e1c7b84ddb64fd4b819201ae6206ab6038e15764736f6c634300081b0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000750eda3185c758247e97819074bcd217a815fae00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000013477261706854616c6c79436f6c6c6563746f720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphTallyCollector#GraphTallyCollector","networkInteractionId":1,"nonce":1634,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphTallyCollector#GraphTallyCollector","networkInteractionId":1,"nonce":1634,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xa8d55ccd6bc05af4e50ce1c6cf5ecd5c5a4cfc076b22aca3e7eb2b4c2f5ea8aa"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonStaking#HorizonStakingExtension","constructorArgs":["0x0750EdA3185C758247E97819074bCD217a815FaE","0x00fe8F95407AB61863d27c07F584A0930ee5F3b0"],"contractName":"HorizonStakingExtension","dependencies":["Controller#Controller","GraphHorizon_Periphery","HorizonProxies","HorizonStaking#ExponentialRebates"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonStaking#HorizonStakingExtension","futureType":"CONTRACT_DEPLOYMENT","libraries":{"ExponentialRebates":"0xF2DB533658a1728f3ce04A49Df4b545f4A53b620"},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonStaking#HorizonStakingExtension","networkInteraction":{"data":"0x6101e060405234801561001157600080fd5b506040516133a83803806133a883398101604081905261003091610411565b818181806001600160a01b03811661007d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b590610347565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e890610347565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261012190610347565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015b90610347565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019390610347565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101ce90610347565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020c90610347565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024890610347565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027d90610347565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103279790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b03166101c052506104b4915050565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161038291815260200190565b602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c39190610444565b9050826001600160a01b0382166103ee5760405163218f5add60e11b81526004016100749190610466565b5092915050565b80516001600160a01b038116811461040c57600080fd5b919050565b6000806040838503121561042457600080fd5b61042d836103f5565b915061043b602084016103f5565b90509250929050565b60006020828403121561045657600080fd5b61045f826103f5565b9392505050565b602081526000825180602084015260005b818110156104945760208186018101516040868401015201610477565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051612e76610532600039600081816104ec0152611e5901526000611f6c0152600050506000505060006124d70152600061222e01526000611966015260005050600050506000505060006119a10152612e766000f3fe608060405234801561001057600080fd5b50600436106101805760003560e01c806308ce5f68146101855780630e022923146101ab5780631787e69f1461023357806325d9897e1461025c5780632f7cc5011461038457806339514ad2146103975780634488a382146103bc57806344c32a61146103d157806355c85269146103e4578063561285e41461042e5780637573ef4f146104835780637a76646014610233578063872d0489146104965780638cc01c86146104a95780638d3c100a146104d75780639363c522146104ea57806398c657dc146105185780639ce7abe514610538578063a2594d821461054b578063a784d4981461055e578063ac9650d814610571578063ae4fe67a14610591578063b6363cf2146105cd578063c0641994146105e0578063ccebcabb146105ee578063d48de84514610610578063e2e1e8e91461065f578063e56f8a1d1461067f578063e73e14bf146106c5578063f1d60d66146106f0578063fb744cc014610703578063fc54fb2714610716575b600080fd5b610198610193366004612721565b610721565b6040519081526020015b60405180910390f35b6101be6101b936600461275a565b610736565b6040516101a2919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b61019861024136600461275a565b6001600160a01b03166000908152600e602052604090205490565b61037761026a366004612721565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516101a29190612777565b61019861039236600461284b565b610816565b601a546001600160401b03165b6040516001600160401b0390911681526020016101a2565b6103cf6103ca3660046128a5565b610918565b005b6103cf6103df3660046128e4565b610d04565b6103f76103f236600461275a565b610d99565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c0016101a2565b61044161043c366004612721565b610e6f565b6040516101a29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b610198610491366004612910565b610ec1565b6101986104a436600461295f565b610f25565b6104bc6104b736600461275a565b610f7a565b604080518251815260209283015192810192909252016101a2565b6103cf6104e53660046129a8565b610fb6565b7f00000000000000000000000000000000000000000000000000000000000000006040516101a291906129cd565b61052b61052636600461275a565b611405565b6040516101a291906129f7565b6103cf610546366004612a1f565b611410565b6103cf61055936600461275a565b61150b565b61019861056c36600461275a565b6115f7565b61058461057f366004612aa4565b611602565b6040516101a29190612b3d565b6105bd61059f36600461275a565b6001600160a01b031660009081526022602052604090205460ff1690565b60405190151581526020016101a2565b6105bd6105db366004612721565b6116e9565b600d5463ffffffff166103a4565b6106016105fc366004612bbd565b611718565b604051905181526020016101a2565b61062361061e366004612bfd565b61176a565b6040516101a29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61019861066d366004612c19565b60009081526010602052604090205490565b61069261068d36600461284b565b6117d7565b6040516101a291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6105bd6106d336600461275a565b6001600160a01b03166000908152600e6020526040902054151590565b6105bd6106fe36600461275a565b61183f565b610198610711366004612721565b611864565b60205460ff166105bd565b600061072d8383611870565b90505b92915050565b61079160405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506001600160a01b039081166000908152600f6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b600080610825868686866118a8565b9050806003015460000361083d576000915050610910565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b80156109075760006108838c83611914565b905084600501548160030154036108fc576001810154426001600160401b03909116116108f6576000838583600001546108bd9190612c48565b6108c79190612c5f565b90506108d38186612c81565b82549095506108e29085612c81565b93506108ee8188612c94565b9650506108fc565b50610907565b600201549050610871565b50929450505050505b949350505050565b3360009081526012602052604090205460ff166109675760405162461bcd60e51b815260206004820152600860248201526710b9b630b9b432b960c11b60448201526064015b60405180910390fd5b61096f611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612ca7565b156109ee57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0384166000908152600e6020526040902083610a3d5760405162461bcd60e51b815260206004820152600760248201526621746f6b656e7360c81b604482015260640161095e565b82841015610a7d5760405162461bcd60e51b815260206004820152600d60248201526c0e4caeec2e4c8e67ce6d8c2e6d609b1b604482015260640161095e565b8054610ab45760405162461bcd60e51b8152602060048201526006602482015265217374616b6560d01b604482015260640161095e565b8054841115610af35760405162461bcd60e51b815260206004820152600b60248201526a736c6173683e7374616b6560a81b604482015260640161095e565b6001600160a01b038216610b385760405162461bcd60e51b815260206004820152600c60248201526b2162656e656669636961727960a01b604482015260640161095e565b600081600201548260010154610b4e9190612c94565b9050600082600001548211610b6f578254610b6a908390612c81565b610b72565b60005b90508086118015610b87575060008360020154115b15610bd5576000610b988288612c81565b90506000610baa828660020154611988565b9050808560020154610bbc9190612c81565b60028601819055600003610bd257600060038601555b50505b60048301548354600091610be891612c81565b905080600003610c4157876001600160a01b03167ff2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f360008088604051610c3093929190612cc9565b60405180910390a250505050610cfe565b80871115610c645786610c548288612c48565b610c5e9190612c5f565b95508096505b8354610c71908890612c81565b8455610c97610c808789612c81565b610c8861199f565b6001600160a01b0316906119c3565b610cb48587610ca461199f565b6001600160a01b03169190611a0b565b876001600160a01b03167ff2717be2f27d9d2d7d265e42dc556e40d2d9aeaba02f49c5286030f30c0571f3888888604051610cf193929190612cc9565b60405180910390a2505050505b50505050565b610d0c611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6d9190612ca7565b15610d8b57604051632b37d9d160e21b815260040160405180910390fd5b610d958282611ac2565b5050565b6001600160a01b038082166000908152600f6020908152604080832081516101208101835281549095168552600180820154938601939093526002810154918501919091526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e0850152600801546101008401529091829182918291829182918290610e318a611dfc565b6002811115610e4257610e426129e1565b83516020850151604086015160e090960151939092149c909b509099509297509550600094509092505050565b610e776126c3565b610e7f6126c3565b6000610e8b8585611e55565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b6001600160a01b038084166000908152601c60209081526040808320938616835292905290812081836002811115610efb57610efb6129e1565b6002811115610f0c57610f0c6129e1565b81526020019081526020016000205490505b9392505050565b600080610f328585611870565b90506000610f408686611ed9565b90506000610f5463ffffffff861684612c48565b90506000610f628383611988565b9050610f6e8185612c94565b98975050505050505050565b610f826126f2565b610f8a6126f2565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b610fbe611964565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f9190612ca7565b1561103d57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b03811661107c5760405162461bcd60e51b815260206004820152600660248201526521616c6c6f6360d01b604482015260640161095e565b600061108782611dfc565b9050600081600281111561109d5761109d6129e1565b036110d55760405162461bcd60e51b81526020600482015260086024820152670858dbdb1b1958dd60c21b604482015260640161095e565b826000036110e257505050565b6001600160a01b0382166000908152600f60205260408120600181015490918590808080611123338661111361199f565b6001600160a01b03169190611efc565b600d5461113e908690600160401b900463ffffffff16611f3d565b935061114a8486612c81565b600d5490955061116a9087908790600160201b900463ffffffff16611f58565b92506111768386612c81565b94508487600501546111889190612c94565b6005880155600287015460009015806111ae5750601954600160a01b900463ffffffff16155b6112795760058801546002890154600d546019546040516349484d8160e01b81526004810194909452602484019290925263ffffffff600160a01b80830482166044860152600160c01b928390048216606486015283048116608485015291041660a482015273F2DB533658a1728f3ce04A49Df4b545f4A53b620906349484d819060c401602060405180830381865af4158015611250573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112749190612ce8565b61127c565b60005b905061128c81896008015461212e565b92506112988387611988565b92506112a7610c808488612c81565b821561130f578288600801546112bd9190612c94565b600889015587546112d7906001600160a01b031684612148565b91506112e38284612c81565b88546001600160a01b0390811660008181526017602052604090205492955061130f92869216156121da565b5086546001600160a01b03808b16918891167ff5ded07502b6feba4c13b19a0c6646efd4b4119f439bcbd49076e4f0ed1eec4b3361134b61222c565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190612ce8565b604080516001600160a01b039093168352602083019190915281018f9052606081018990526080810188905260a081018a905260c0810187905260e081018690526101000160405180910390a450505050505050505050565b600061073082611dfc565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190612d01565b6001600160a01b0316336001600160a01b0316146114a55760405162461bcd60e51b815260040161095e90612d1e565b60405163623faf6160e01b81526001600160a01b0385169063623faf61906114d39086908690600401612d55565b600060405180830381600087803b1580156114ed57600080fd5b505af1158015611501573d6000803e3d6000fd5b5050505050505050565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af115801561154c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115709190612d01565b6001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161095e90612d1e565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b505050505050565b600061073082612250565b604080516000815260208101909152606090826001600160401b0381111561162c5761162c612d84565b60405190808252806020026020018201604052801561165f57816020015b606081526020019060019003908161164a5790505b50915060005b838110156116e1576116bc3086868481811061168357611683612d9a565b90506020028101906116959190612db0565b856040516020016116a893929190612dfd565b6040516020818303038152906040526122c1565b8382815181106116ce576116ce612d9a565b6020908102919091010152600101611665565b505092915050565b6001600160a01b0380821660009081526015602090815260408083209386168352929052205460ff1692915050565b60408051602081019091526000815260408051602081019091526000815260006117428686611e55565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b6040805160808101825260008082526020820181905291810182905260608101919091526117988383611914565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b604080516080810182526000808252602082018190529181018290526060810191909152611807858585856118a8565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b60008061184b83611dfc565b600281111561185c5761185c6129e1565b141592915050565b600061072d8383611ed9565b6001600160a01b038281166000908152601b6020908152604080832093851683529290529081206001810154905461072d9190612c81565b6000601e60008660018111156118c0576118c06129e1565b60018111156118d1576118d16129e1565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d600084600181111561192c5761192c6129e1565b600181111561193d5761193d6129e1565b81526020019081526020016000206000838152602001908152602001600020905092915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081831115611998578161072d565b5090919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610d9557604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b1580156115db57600080fd5b8015611abd5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044015b6020604051808303816000875af1158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a859190612ca7565b611abd5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b604482015260640161095e565b505050565b6000611acd83611dfc565b90506001816002811115611ae357611ae36129e1565b14611b1a5760405162461bcd60e51b81526020600482015260076024820152662161637469766560c81b604482015260640161095e565b6001600160a01b038084166000908152600f6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260080154610100820152611ba361222c565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190612ce8565b608082018190526060820151600091611c1c9161212e565b9050600082600001516001600160a01b0316336001600160a01b03161480611c4d5750611c4d3384600001516116e9565b600d54909150600160801b900463ffffffff1682111580611c7057506040830151155b15611caa5780611caa5760405162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015260640161095e565b604083015115611d6857808015611cc057508415155b15611cd857611cd3868460000151612337565b611ce5565b611ce5836020015161240b565b60408084015184516001600160a01b03166000908152600e6020529190912060010154611d129190612c81565b83516001600160a01b03166000908152600e602090815260408083206001019390935582860151818701518352601090915291902054611d529190612c81565b6020808501516000908152601090915260409020555b608080840180516001600160a01b03808a166000818152600f6020908152604091829020600401949094558389015189519551828b01518351918252958101959095523391850191909152606084018b9052861595840195909552939216907ff6725dd105a6fc88bb79a6e4627f128577186c567a17c94818d201c2a4ce14039060a00160405180910390a4505050505050565b6001600160a01b038082166000908152600f6020526040812080549192909116611e295750600092915050565b600381015415801590611e3e57506004810154155b15611e4c5750600192915050565b50600292915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611eae57506001600160a01b0382166000908152601460205260409020610730565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610730565b600080611ee68484611e55565b9050806005015481600201546109109190612c81565b8015611abd576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401611a42565b600080611f4a8484612483565b905061072d81610c8861199f565b600082600003611f6a57506000610f1e565b7f000000000000000000000000000000000000000000000000000000000000000060008315801590611fa457506001600160a01b03821615155b90508080156120175750604051634c4ea0ed60e01b8152600481018790526001600160a01b03831690634c4ea0ed90602401602060405180830381865afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612ca7565b156121225760006120288686612483565b90508015612118576120386124d5565b6001600160a01b0316631d1c2fec886040518263ffffffff1660e01b815260040161206591815260200190565b6020604051808303816000875af1158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612ce8565b506120b68382610ca461199f565b60405163102ae65160e31b815260048101889052602481018290526001600160a01b03841690638157328890604401600060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050505b9250610f1e915050565b50600095945050505050565b600081831161213e57600061072d565b61072d8284612c81565b6001600160a01b038216600090815260146020526040812060028101548291901580159061218757508054600160401b900463ffffffff16620f424010155b156121d25780546000906121ad9063ffffffff600160401b90910481169087906124f916565b90506121b98186612c81565b92508282600201546121cb9190612c94565b6002830155505b509392505050565b826000036121e757505050565b80156121f757611abd8284612560565b6001600160a01b0380831660009081526017602052604090205416610cfe81156122215781612223565b835b85610ca461199f565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261228391612c94565b61228d9190612c94565b6001600160a01b0384166000908152600e60205260409020549091508181116122b7576000610910565b6109108282612c81565b6060600080846001600160a01b0316846040516122de9190612e24565b600060405180830381855af49150503d8060008114612319576040519150601f19603f3d011682016040523d82523d6000602084013e61231e565b606091505b509150915061232e8583836125df565b95945050505050565b60006123416124d5565b6001600160a01b031663db750926846040518263ffffffff1660e01b815260040161236c91906129cd565b6020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190612ce8565b9050806000036123be57505050565b60006123ca8383612632565b905060006123d88284612c81565b6001600160a01b03808616600090815260176020526040902054919250612404918391879116156121da565b5050505050565b6124136124d5565b6001600160a01b031663eeac3e0e826040518263ffffffff1660e01b815260040161244091815260200190565b6020604051808303816000875af115801561245f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612ce8565b600061249282620f4240101590565b82906124b457604051633dc311df60e01b815260040161095e91815260200190565b506124cb836124c684620f4240612c81565b6124f9565b61072d9084612c81565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061250883620f4240101590565b8061251b575061251b82620f4240101590565b838390916125455760405163768bf0eb60e11b81526004810192909252602482015260440161095e565b50620f424090506125568385612c48565b61072d9190612c5f565b6001600160a01b0382166000908152600e6020526040902054612584908290612c94565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906125d39084815260200190565b60405180910390a25050565b6060826125f4576125ef82612697565b610f1e565b815115801561260b57506001600160a01b0384163b155b1561262b5783604051639996b31560e01b815260040161095e91906129cd565b5080610f1e565b6001600160a01b038216600090815260146020526040812060028101548291901580159061267157508054600160201b900463ffffffff16620f424010155b156121d25780546000906121ad9063ffffffff600160201b90910481169087906124f916565b8051156126a75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6001600160a01b03811681146126c057600080fd5b6000806040838503121561273457600080fd5b823561273f8161270c565b9150602083013561274f8161270c565b809150509250929050565b60006020828403121561276c57600080fd5b813561072d8161270c565b60006101408201905082518252602083015160208301526040830151604083015260608301516127af606084018263ffffffff169052565b5060808301516127ca60808401826001600160401b03169052565b5060a08301516127e560a08401826001600160401b03169052565b5060c08301516127fd60c084018263ffffffff169052565b5060e083015161281860e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b80356002811061284657600080fd5b919050565b6000806000806080858703121561286157600080fd5b61286a85612837565b9350602085013561287a8161270c565b9250604085013561288a8161270c565b9150606085013561289a8161270c565b939692955090935050565b600080600080608085870312156128bb57600080fd5b84356128c68161270c565b93506020850135925060408501359150606085013561289a8161270c565b600080604083850312156128f757600080fd5b82356129028161270c565b946020939093013593505050565b60008060006060848603121561292557600080fd5b83356129308161270c565b925060208401356129408161270c565b915060408401356003811061295457600080fd5b809150509250925092565b60008060006060848603121561297457600080fd5b833561297f8161270c565b9250602084013561298f8161270c565b9150604084013563ffffffff8116811461295457600080fd5b600080604083850312156129bb57600080fd5b82359150602083013561274f8161270c565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612a1957634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060408486031215612a3457600080fd5b8335612a3f8161270c565b925060208401356001600160401b03811115612a5a57600080fd5b8401601f81018613612a6b57600080fd5b80356001600160401b03811115612a8157600080fd5b866020828401011115612a9357600080fd5b939660209190910195509293505050565b60008060208385031215612ab757600080fd5b82356001600160401b03811115612acd57600080fd5b8301601f81018513612ade57600080fd5b80356001600160401b03811115612af457600080fd5b8560208260051b8401011115612b0957600080fd5b6020919091019590945092505050565b60005b83811015612b34578181015183820152602001612b1c565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015612bb157603f1987860301845281518051808752612b8e816020890160208501612b19565b601f01601f19169590950160209081019550938401939190910190600101612b65565b50929695505050505050565b600080600060608486031215612bd257600080fd5b8335612bdd8161270c565b92506020840135612bed8161270c565b915060408401356129548161270c565b60008060408385031215612c1057600080fd5b61290283612837565b600060208284031215612c2b57600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761073057610730612c32565b600082612c7c57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561073057610730612c32565b8082018082111561073057610730612c32565b600060208284031215612cb957600080fd5b8151801515811461072d57600080fd5b92835260208301919091526001600160a01b0316604082015260600190565b600060208284031215612cfa57600080fd5b5051919050565b600060208284031215612d1357600080fd5b815161072d8161270c565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612dc757600080fd5b8301803591506001600160401b03821115612de157600080fd5b602001915036819003821315612df657600080fd5b9250929050565b828482376000838201600081528351612e1a818360208801612b19565b0195945050505050565b60008251612e36818460208701612b19565b919091019291505056fea2646970667358221220eee2ca3f28b971ad70ed8bb53d0d0f8eb32b9f33a12776bc83fb4b7d1b75ddfd64736f6c634300081b00330000000000000000000000000750eda3185c758247e97819074bcd217a815fae00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonStaking#HorizonStakingExtension","networkInteractionId":1,"nonce":1635,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonStaking#HorizonStakingExtension","networkInteractionId":1,"nonce":1635,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x213c2c4d2cce26f8854a9809172af0563c5a8aed80010a9e6ad43ce731e3a9fd"},"type":"TRANSACTION_SEND"} +{"artifactId":"PaymentsEscrow#PaymentsEscrow","constructorArgs":["0x0750EdA3185C758247E97819074bCD217a815FaE",10000],"contractName":"PaymentsEscrow","dependencies":["Controller#Controller","GraphHorizon_Periphery","HorizonProxies"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"PaymentsEscrow#PaymentsEscrow","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"PaymentsEscrow#PaymentsEscrow","networkInteraction":{"data":"0x6101e060405234801561001157600080fd5b50604051611bb6380380611bb6833981016040819052610030916104ef565b816001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b290610373565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e590610373565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e90610373565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015890610373565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019090610373565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb90610373565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020990610373565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024590610373565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a90610373565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450806276a7008082111561035c57604051635c0f65a160e01b815260048101929092526024820152604401610071565b50506101c081905261036c610421565b505061058b565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b81526004016103ae91815260200190565b602060405180830381865afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef919061051b565b9050826001600160a01b03821661041a5760405163218f5add60e11b8152600401610071919061053d565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146104ea57600080fd5b919050565b6000806040838503121561050257600080fd5b61050b836104d3565b9150602083015190509250929050565b60006020828403121561052d57600080fd5b610536826104d3565b9392505050565b602081526000825180602084015260005b8181101561056b576020818601810151604086840101520161054e565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516115b3610603600039600081816101350152610b4e015260005050600050506000505060005050600050506000610d910152600050506000610dd90152600050506000610db501526115b36000f3fe608060405234801561001057600080fd5b50600436106100a45760003560e01c80631230fa3e146100a957806372eb521e146100be5780637a8df28b146100d15780637b8ae6cf146101305780638129fc1c146101655780638340f5491461016d578063ac9650d814610180578063b1d07de4146101a0578063b2168b6b146101b3578063d6bd603c146101bd578063f93f1cd0146101d0578063f940e385146101e3575b600080fd5b6100bc6100b736600461111c565b6101f6565b005b6100bc6100cc36600461119a565b61058c565b6101106100df3660046111e5565b6000602081815293815260408082208552928152828120909352825290208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610127565b6100bc610625565b6100bc61017b366004611228565b61071d565b61019361018e366004611265565b6107b5565b60405161012791906112fe565b6100bc6101ae36600461137e565b61089d565b6101576276a70081565b6101576101cb3660046111e5565b6109e0565b6100bc6101de366004611228565b610a3e565b6100bc6101f136600461137e565b610bd1565b6101fe610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561023b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025f91906113b1565b1561027d57604051639e68cf0b60e01b815260040160405180910390fd5b6001600160a01b038087166000908152602081815260408083203384528252808320938916835292905220805485808210156102da57604051633db4e69160e01b8152600481019290925260248201526044015b60405180910390fd5b5050848160000160008282546102f091906113e9565b9091555060009050610300610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161032b91906113fc565b602060405180830381865afa158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611410565b9050610376610db3565b6001600160a01b031663095ea7b361038c610dd7565b886040518363ffffffff1660e01b81526004016103aa929190611429565b6020604051808303816000875af11580156103c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ed91906113b1565b506103f6610dd7565b6001600160a01b03166381cd11a08a89898989896040518763ffffffff1660e01b815260040161042b96959493929190611458565b600060405180830381600087803b15801561044557600080fd5b505af1158015610459573d6000803e3d6000fd5b505050506000610467610db3565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161049291906113fc565b602060405180830381865afa1580156104af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d39190611410565b90506104df81886114ae565b821482828990919261051557604051631f82726b60e21b81526004810193909352602483019190915260448201526064016102d1565b50339150506001600160a01b038a168b600281111561053657610536611442565b604080516001600160a01b038d81168252602082018d905289168183015290517f399b99b484be516eace7ececa486139581a25b0d2d12dac8bfa0948d07a8c9139181900360600190a450505050505050505050565b610594610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f591906113b1565b1561061357604051639e68cf0b60e01b815260040160405180910390fd5b61061f84848484610dfb565b50505050565b600061062f610eac565b805490915060ff600160401b82041615906001600160401b03166000811580156106565750825b90506000826001600160401b031660011480156106725750303b155b905081158015610680575080155b1561069e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106c857845460ff60401b1916600160401b1785555b6106d0610ed5565b831561071657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b610725610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906113b1565b156107a457604051639e68cf0b60e01b815260040160405180910390fd5b6107b033848484610dfb565b505050565b604080516000815260208101909152606090826001600160401b038111156107df576107df6114c1565b60405190808252806020026020018201604052801561081257816020015b60608152602001906001900390816107fd5790505b50915060005b838110156108945761086f30868684818110610836576108366114d7565b905060200281019061084891906114ed565b8560405160200161085b9392919061153a565b604051602081830303815290604052610edf565b838281518110610881576108816114d7565b6020908102919091010152600101610818565b50505b92915050565b6108a5610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090691906113b1565b1561092457604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b03868116855290835281842090851684529091528120600181015490910361097657604051638cbd172f60e01b815260040160405180910390fd5b60018101805460028301805460009384905592905560408051828152602081018490529192916001600160a01b03868116929088169133917f6c4ed34e7347a8682024ee40d393e45f4075c46c593aaaed3cc3e49dd6933535910160405180910390a45050505050565b6001600160a01b038084166000908152602081815260408083208685168452825280832093851683529290529081206001810154815411610a22576000610a33565b60018101548154610a3391906113e9565b9150505b9392505050565b610a46610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa791906113b1565b15610ac557604051639e68cf0b60e01b815260040160405180910390fd5b60008111610ae657604051633aff1f3760e21b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b0387811685529083528184209086168452909152902080548280821015610b4057604051633db4e69160e01b8152600481019290925260248201526044016102d1565b505060018101829055610b737f0000000000000000000000000000000000000000000000000000000000000000426114ae565b600282018190556040516001600160a01b03808616929087169133917fba109e8a47e57c895aa1802554cd51025499c2b07c3c9b467c70413a4434ffbc91610bc391888252602082015260400190565b60405180910390a450505050565b610bd9610d8f565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3a91906113b1565b15610c5857604051639e68cf0b60e01b815260040160405180910390fd5b336000908152602081815260408083206001600160a01b038681168552908352818420908516845290915281206002810154909103610caa57604051638cbd172f60e01b815260040160405180910390fd5b60028101544290818110610cda57604051633c50db7960e11b8152600481019290925260248201526044016102d1565b505060008160000154826001015411610cf7578160010154610cfa565b81545b905080826000016000828254610d1091906113e9565b90915550506000600183018190556002830155610d403382610d30610db3565b6001600160a01b03169190610f55565b826001600160a01b0316846001600160a01b0316336001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f784604051610bc391815260200190565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038085166000908152602081815260408083208785168452825280832093861683529290529081208054839290610e3a9084906114ae565b90915550610e5d90503382610e4d610db3565b6001600160a01b03169190611004565b816001600160a01b0316836001600160a01b0316856001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a9684604051610bc391815260200190565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610897565b610edd611045565b565b6060600080846001600160a01b031684604051610efc9190611561565b600060405180830381855af49150503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5091509150610f4c85838361106a565b95945050505050565b80156107b05760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610f899085908590600401611429565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc91906113b1565b6107b05760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016102d1565b80156107b0576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd90606401610f89565b61104d6110bd565b610edd57604051631afcd79f60e31b815260040160405180910390fd5b60608261107f5761107a826110d7565b610a37565b815115801561109657506001600160a01b0384163b155b156110b65783604051639996b31560e01b81526004016102d191906113fc565b5080610a37565b60006110c7610eac565b54600160401b900460ff16919050565b8051156110e75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461111757600080fd5b919050565b600080600080600080600060e0888a03121561113757600080fd5b87356003811061114657600080fd5b965061115460208901611100565b955061116260408901611100565b94506060880135935061117760808901611100565b925060a0880135915061118c60c08901611100565b905092959891949750929550565b600080600080608085870312156111b057600080fd5b6111b985611100565b93506111c760208601611100565b92506111d560408601611100565b9396929550929360600135925050565b6000806000606084860312156111fa57600080fd5b61120384611100565b925061121160208501611100565b915061121f60408501611100565b90509250925092565b60008060006060848603121561123d57600080fd5b61124684611100565b925061125460208501611100565b929592945050506040919091013590565b6000806020838503121561127857600080fd5b82356001600160401b0381111561128e57600080fd5b8301601f8101851361129f57600080fd5b80356001600160401b038111156112b557600080fd5b8560208260051b84010111156112ca57600080fd5b6020919091019590945092505050565b60005b838110156112f55781810151838201526020016112dd565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561137257603f198786030184528151805180875261134f8160208901602085016112da565b601f01601f19169590950160209081019550938401939190910190600101611326565b50929695505050505050565b6000806040838503121561139157600080fd5b61139a83611100565b91506113a860208401611100565b90509250929050565b6000602082840312156113c357600080fd5b81518015158114610a3757600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610897576108976113d3565b6001600160a01b0391909116815260200190565b60006020828403121561142257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052602160045260246000fd5b60c081016003881061147a57634e487b7160e01b600052602160045260246000fd5b9681526001600160a01b03958616602082015260408101949094529184166060840152608083015290911660a09091015290565b80820180821115610897576108976113d3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261150457600080fd5b8301803591506001600160401b0382111561151e57600080fd5b60200191503681900382131561153357600080fd5b9250929050565b8284823760008382016000815283516115578183602088016112da565b0195945050505050565b600082516115738184602087016112da565b919091019291505056fea26469706673582212208ab10e801fa2cc0d10964181f12d884e2488e415d888ab908ab3d257d0bef82f64736f6c634300081b00330000000000000000000000000750eda3185c758247e97819074bcd217a815fae0000000000000000000000000000000000000000000000000000000000002710","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"PaymentsEscrow#PaymentsEscrow","networkInteractionId":1,"nonce":1636,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"PaymentsEscrow#PaymentsEscrow","networkInteractionId":1,"nonce":1636,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x9f4dbfbc9f11f599b263432a593e0b3481c1d19c9770ad873646f382ab6211b5"},"type":"TRANSACTION_SEND"} +{"futureId":"GraphPayments#GraphPayments","hash":"0xc54d915f9d9de3516d7f8da7284b32a11ea95d988a1d316f57ac8cad01fc99d1","networkInteractionId":1,"receipt":{"blockHash":"0xc67d1dae236ca96b7fdbecb80999775084cf055942f92d0331c41acb16986bf4","blockNumber":152513111,"contractAddress":"0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866","logs":[{"address":"0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]},{"address":"0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":1,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphPayments#GraphPayments","result":{"address":"0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphTallyCollector#GraphTallyCollector","hash":"0xa8d55ccd6bc05af4e50ce1c6cf5ecd5c5a4cfc076b22aca3e7eb2b4c2f5ea8aa","networkInteractionId":1,"receipt":{"blockHash":"0x4b9f570ba9ce50d91b932d1dce3ad0b963c991bdc294875911e8a4ebc22cf59a","blockNumber":152513124,"contractAddress":"0xB63bC33D13F73eFD14d32D2b9FC0B6116B6611CE","logs":[{"address":"0xB63bC33D13F73eFD14d32D2b9FC0B6116B6611CE","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphTallyCollector#GraphTallyCollector","result":{"address":"0xB63bC33D13F73eFD14d32D2b9FC0B6116B6611CE","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonStaking#HorizonStakingExtension","hash":"0x213c2c4d2cce26f8854a9809172af0563c5a8aed80010a9e6ad43ce731e3a9fd","networkInteractionId":1,"receipt":{"blockHash":"0x073946eaafa3672c85dadb4fc254fb1b9a5e552fce5563417b2d2436fc590b7c","blockNumber":152513137,"contractAddress":"0x37F125cF456CD8d24277033A3b583491E9003689","logs":[{"address":"0x37F125cF456CD8d24277033A3b583491E9003689","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":1,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonStaking#HorizonStakingExtension","result":{"address":"0x37F125cF456CD8d24277033A3b583491E9003689","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"PaymentsEscrow#PaymentsEscrow","hash":"0x9f4dbfbc9f11f599b263432a593e0b3481c1d19c9770ad873646f382ab6211b5","networkInteractionId":1,"receipt":{"blockHash":"0xd8c258686edecc8506e66a437ed8ace4ccbeb6554a557bee328ac012180aa96b","blockNumber":152513149,"contractAddress":"0xeED33B904efF05BbdcC9008F5174088DF77dD183","logs":[{"address":"0xeED33B904efF05BbdcC9008F5174088DF77dD183","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]},{"address":"0xeED33B904efF05BbdcC9008F5174088DF77dD183","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":1,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"PaymentsEscrow#PaymentsEscrow","result":{"address":"0xeED33B904efF05BbdcC9008F5174088DF77dD183","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":[],"artifactId":"GraphPayments#GraphPayments","dependencies":["GraphPayments#GraphPayments"],"functionName":"initialize","futureId":"GraphPayments#encodeFunctionCall(GraphPayments#GraphPayments.initialize)","result":"0x8129fc1c","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"HorizonStaking#HorizonStaking","constructorArgs":["0x0750EdA3185C758247E97819074bCD217a815FaE","0x37F125cF456CD8d24277033A3b583491E9003689","0x00fe8F95407AB61863d27c07F584A0930ee5F3b0"],"contractName":"HorizonStaking","dependencies":["Controller#Controller","HorizonStaking#HorizonStakingExtension"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"HorizonStaking#HorizonStaking","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonStaking#HorizonStaking","networkInteraction":{"data":"0x61020060405234801561001157600080fd5b506040516162a33803806162a38339810160408190526100309161041b565b828181806001600160a01b03811661007d5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b590610351565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e890610351565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261012190610351565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015b90610351565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b602082015261019390610351565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101ce90610351565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020c90610351565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024890610351565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027d90610351565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103279790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b039081166101c052929092166101e052506104ce915050565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161038c91815260200190565b602060405180830381865afa1580156103a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cd919061045e565b9050826001600160a01b0382166103f85760405163218f5add60e11b81526004016100749190610480565b5092915050565b80516001600160a01b038116811461041657600080fd5b919050565b60008060006060848603121561043057600080fd5b610439846103ff565b9250610447602085016103ff565b9150610455604085016103ff565b90509250925092565b60006020828403121561047057600080fd5b610479826103ff565b9392505050565b602081526000825180602084015260005b818110156104ae5760208186018101516040868401015201610491565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051615d2861057b6000396000818161025b0152818161055e01526128a3015260008181610a450152818161140a015281816130de015281816131a001528181614130015261447401526000505060005050600050506000505060006114e901526000613097015260005050600050506000505060006135670152615d286000f3fe608060405234801561001057600080fd5b50600436106102565760003560e01c8063872d048911610142578063872d0489146106225780638cc01c86146106355780639ce7abe514610663578063a02b942614610676578063a2594d8214610689578063a2a317221461069c578063a694fc3a146106af578063a784d498146106c2578063ac9650d8146106d5578063ad4d35b5146106f5578063ae4fe67a14610708578063ba7fb0b414610734578063bc735d9014610747578063ca94b0e91461075a578063ccebcabb1461076d578063d48de8451461078f578063e473522a146107de578063e56f8a1d146107e6578063e76fede61461082c578063ef58bd671461083f578063f64b359814610847578063f93f1cd01461085a578063fb744cc01461086d578063fc54fb2714610880578063fecc9cc11461088b57610256565b8063010167e51461029f578063026e402b146102b257806308ce5f68146102c557806321195373146102eb578063259bc435146102fe57806325d9897e146103115780632e17de78146104395780632f7cc5011461044c57806339514ad21461045f5780633993d8491461047a5780633a78b7321461048d5780633ccfd60b146104a057806342c51693146104a85780634ca7ac22146104bb5780634d99dd16146104ce57806351a60b02146104e1578063561285e4146104f45780636230001a1461054957806366ee1b281461055c578063746120921461058a5780637573ef4f1461059d5780637a766460146105b05780637c145cc7146105d957806381e21b56146105fc57806382d66cb81461060f575b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e818015610299578184f35b8184fd5b005b61029d6102ad3660046151dc565b61089e565b61029d6102c036600461523e565b61097a565b6102d86102d336600461526a565b610a70565b6040519081526020015b60405180910390f35b61029d6102f93660046152a3565b610a85565b61029d61030c3660046152e4565b610b55565b61042c61031f36600461526a565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506001600160a01b039182166000908152601b6020908152604080832093909416825291825282902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff8082166060840152600160201b82046001600160401b039081166080850152600160601b8304811660a0850152600160a01b830490911660c0840152600160c01b9091041660e0820152600482015461010082015260059091015461012082015290565b6040516102e291906152ff565b61029d6104473660046153bf565b610c43565b6102d861045a3660046153e5565b610cd6565b601a546040516001600160401b0390911681526020016102e2565b61029d6104883660046152a3565b610dd8565b61029d61049b366004615441565b610e74565b61029d611040565b61029d6104b636600461546d565b6110d2565b61029d6104c93660046154ca565b611283565b61029d6104dc36600461523e565b61137d565b6102d86104ef36600461526a565b61142f565b61050761050236600461526a565b611629565b6040516102e29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b61029d6105573660046154f8565b61167b565b7f00000000000000000000000000000000000000000000000000000000000000006040516102e2919061553e565b61029d6105983660046152a3565b611742565b6102d86105ab366004615552565b61182e565b6102d86105be366004615441565b6001600160a01b03166000908152600e602052604090205490565b6105ec6105e7366004615599565b611892565b60405190151581526020016102e2565b61029d61060a3660046155e4565b61189f565b61029d61061d3660046151dc565b611b18565b6102d861063036600461563c565b611c1e565b610648610643366004615441565b611c73565b604080518251815260209283015192810192909252016102e2565b61029d61067136600461567a565b611caf565b6102d86106843660046152a3565b611daa565b61029d610697366004615441565b611e3e565b61029d6106aa36600461523e565b611f22565b61029d6106bd3660046153bf565b611fb3565b6102d86106d0366004615441565b612044565b6106e86106e33660046156ff565b61204f565b6040516102e29190615798565b61029d610703366004615818565b612136565b6105ec610716366004615441565b6001600160a01b031660009081526022602052604090205460ff1690565b61029d610742366004615858565b612204565b61029d610755366004615818565b612311565b61029d6107683660046152a3565b6123a3565b61078061077b366004615599565b6125dd565b604051905181526020016102e2565b6107a261079d366004615899565b61262f565b6040516102e29190815181526020808301516001600160401b031690820152604080830151908201526060918201519181019190915260800190565b61029d61269c565b6107f96107f43660046153e5565b61276e565b6040516102e291908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b61029d61083a3660046158b7565b6127d6565b61029d612d38565b61029d6108553660046158f6565b612e0a565b6102d86108683660046152a3565b612eed565b6102d861087b36600461526a565b612fc1565b60205460ff166105ec565b61029d6108993660046152a3565b612fcd565b6108a6613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109079190615964565b1561092557604051632b37d9d160e21b815260040160405180910390fd5b84846109328282336130b9565b82823390919261096157604051630c76b97b60e41b815260040161095893929190615981565b60405180910390fd5b505050610971878688878761317d565b50505050505050565b610982613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190615964565b15610a0157604051632b37d9d160e21b815260040160405180910390fd5b80600003610a2257604051630a2a4e5b60e11b815260040160405180910390fd5b610a3f3382610a2f613565565b6001600160a01b03169190613589565b610a6c827f0000000000000000000000000000000000000000000000000000000000000000836000613641565b5050565b6000610a7c8383613846565b90505b92915050565b8282610a928282336130b9565b828233909192610ab857604051630c76b97b60e41b815260040161095893929190615981565b505050610ac3613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190615964565b15610b4257604051632b37d9d160e21b815260040160405180910390fd5b610b4d85858561387e565b505050505050565b610b5d613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbe91906159a4565b6001600160a01b0316336001600160a01b031614610bef57604051635d9044cd60e01b815260040160405180910390fd5b601a80546001600160401b0319166001600160401b0383169081179091556040519081527fe8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f9060200160405180910390a150565b610c4b613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cac9190615964565b15610cca57604051632b37d9d160e21b815260040160405180910390fd5b610cd3816139af565b50565b600080610ce586868686613b5c565b90508060030154600003610cfd576000915050610dd0565b6001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154600282015484545b8015610dc7576000610d438c83613bc8565b90508460050154816003015403610dbc576001810154426001600160401b0390911611610db657600083858360000154610d7d91906159d7565b610d8791906159ee565b9050610d938186615a10565b8254909550610da29085615a10565b9350610dae8188615a23565b965050610dbc565b50610dc7565b600201549050610d31565b50929450505050505b949350505050565b610de0613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190615964565b15610e5f57604051632b37d9d160e21b815260040160405180910390fd5b610e6f8383600080600086613c18565b505050565b610e7c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd9190615964565b15610efb57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b0381166000908152601b60209081526040808320338085529252909120600381015483908390600160601b90046001600160401b0316610f57576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff9081169116141580610f9a57506003810154600160c01b81046001600160401b03908116600160201b9092041614155b15610e6f57600381018054600160201b6001600160401b03600160c01b63ffffffff19841663ffffffff600160a01b8604811691821792909204831684026001600160601b03199095161793909317938490556040516001600160a01b0380881695908916947fa4c005afae9298a5ca51e7710c334ac406fb3d914588ade970850f917cedb1c694611033949183169392041690615a50565b60405180910390a3505050565b611048613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190615964565b156110c757604051632b37d9d160e21b815260040160405180910390fd5b6110d033613d9e565b565b6110da613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190615964565b1561115957604051632b37d9d160e21b815260040160405180910390fd5b83836111668282336130b9565b82823390919261118c57604051630c76b97b60e41b815260040161095893929190615981565b50505061119c83620f4240101590565b83906111be57604051631504950160e21b815260040161095891815260200190565b506001600160a01b038087166000908152601c60209081526040808320938916835292905290812084918660028111156111fa576111fa615a6f565b600281111561120b5761120b615a6f565b815260208101919091526040016000205583600281111561122e5761122e615a6f565b856001600160a01b0316876001600160a01b03167f3474eba30406cacbfbc5a596a7e471662bbcccf206f8d244dbb6f4cc578c52208660405161127391815260200190565b60405180910390a4505050505050565b61128b613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906159a4565b6001600160a01b0316336001600160a01b03161461131d57604051635d9044cd60e01b815260040160405180910390fd5b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f4542960abc7f2d26dab244fc440acf511e3dd0f5cefad571ca802283b4751bbb91015b60405180910390a25050565b611385613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e69190615964565b1561140457604051632b37d9d160e21b815260040160405180910390fd5b610e6f827f000000000000000000000000000000000000000000000000000000000000000083613e79565b6000611439613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190615964565b156114b857604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260146020908152604080832033808552600482019093529083209192909190807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190615a85565b905060008360020154118015611583575082600201548110155b1561159057826001015491505b600082116115b05760405162cf4d4760e51b815260040160405180910390fd5b60006001840181905560028401556040518281526001600160a01b0386811691908a16907f1b2e7737e043c5cf1b587ceb4daeb7ae00148b9bda8f79f1093eead08f1419529060200160405180910390a361161e858361160e613565565b6001600160a01b031691906140f1565b509695505050505050565b61163161514b565b61163961514b565b6000611645858561412c565b60028101548352600381015460208401526005810154604084015260068101546060840152600701546080830152509392505050565b611683613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e49190615964565b1561170257604051632b37d9d160e21b815260040160405180910390fd5b8160000361172357604051630a2a4e5b60e11b815260040160405180910390fd5b6117303383610a2f613565565b61173c84848484613641565b50505050565b61174a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190615964565b156117c957604051632b37d9d160e21b815260040160405180910390fd5b82826117d68282336130b9565b806117e95750336001600160a01b038216145b82823390919261180f57604051630c76b97b60e41b815260040161095893929190615981565b50505061181c85846141b0565b6118278585856141e8565b5050505050565b6001600160a01b038084166000908152601c6020908152604080832093861683529290529081208183600281111561186857611868615a6f565b600281111561187957611879615a6f565b81526020019081526020016000205490505b9392505050565b6000610dd08484846130b9565b6118a7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119089190615964565b1561192657604051632b37d9d160e21b815260040160405180910390fd5b83836119338282336130b9565b82823390919261195957604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038681166000908152601b60209081526040808320938916835292905220600381015487908790600160601b90046001600160401b03166119b9576040516330acea0d60e11b8152600401610958929190615a36565b50506003810154600160a01b810463ffffffff908116908716141590600160c01b90046001600160401b03908116908616141581806119f55750805b15611b0d578115611a56578663ffffffff8116620f42401015611a34576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b5060038301805463ffffffff60a01b1916600160a01b63ffffffff8a16021790555b8015611ab657601a5486906001600160401b03908116908216811015611a915760405163ee5602e160e01b8152600401610958929190615a9e565b50506003830180546001600160c01b0316600160c01b6001600160401b038916021790555b428360040181905550876001600160a01b0316896001600160a01b03167fe89cbb9d63ba60af555547b12dde6817283e88cbdd45feb2059f2ba71ea346ba8989604051611b04929190615a50565b60405180910390a35b505050505050505050565b611b20613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190615964565b15611b9f57604051632b37d9d160e21b815260040160405180910390fd5b8484611bac8282336130b9565b828233909192611bd257604051630c76b97b60e41b815260040161095893929190615981565b5050506001600160a01b038616600090815260226020526040902054869060ff16611c1057604051622920f760e21b8152600401610958919061553e565b50610971878688878761317d565b600080611c2b8585613846565b90506000611c398686614328565b90506000611c4d63ffffffff8616846159d7565b90506000611c5b838361434b565b9050611c678185615a23565b98975050505050505050565b611c7b61517a565b611c8361517a565b6001600160a01b039092166000908152600e602090815260409091208054845260040154908301525090565b82806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906159a4565b6001600160a01b0316336001600160a01b031614611d445760405162461bcd60e51b815260040161095890615ab8565b60405163623faf6160e01b81526001600160a01b0385169063623faf6190611d729086908690600401615aef565b600060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b5050505050505050565b6000611db4613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190615964565b15611e3357604051632b37d9d160e21b815260040160405180910390fd5b610dd0848484613e79565b80806001600160a01b031663f851a4406040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea391906159a4565b6001600160a01b0316336001600160a01b031614611ed35760405162461bcd60e51b815260040161095890615ab8565b816001600160a01b03166359fc20bb6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611f0e57600080fd5b505af1158015610b4d573d6000803e3d6000fd5b611f2a613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b9190615964565b15611fa957604051632b37d9d160e21b815260040160405180910390fd5b610a6c82826141b0565b611fbb613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201c9190615964565b1561203a57604051632b37d9d160e21b815260040160405180910390fd5b610cd333826141b0565b6000610a7f82614362565b604080516000815260208101909152606090826001600160401b0381111561207957612079615b1e565b6040519080825280602002602001820160405280156120ac57816020015b60608152602001906001900390816120975790505b50915060005b8381101561212e57612109308686848181106120d0576120d0615b34565b90506020028101906120e29190615b4a565b856040516020016120f593929190615b90565b6040516020818303038152906040526143d3565b83828151811061211b5761211b615b34565b60209081029190910101526001016120b2565b505092915050565b61213e613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219f9190615964565b156121bd57604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038316600090815260226020526040902054839060ff166121f857604051622920f760e21b8152600401610958919061553e565b50610e6f838383614449565b61220c613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d9190615964565b1561228b57604051632b37d9d160e21b815260040160405180910390fd5b83836122988282336130b9565b8282339091926122be57604051630c76b97b60e41b815260040161095893929190615981565b50505085846122ce8282336130b9565b8282339091926122f457604051630c76b97b60e41b815260040161095893929190615981565b505050600061230489898861387e565b9050611b0d8988836141e8565b612319613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190615964565b1561239857604051632b37d9d160e21b815260040160405180910390fd5b610e6f838383614449565b6123ab613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240c9190615964565b1561242a57604051632b37d9d160e21b815260040160405180910390fd5b8060000361244b57604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038084166000908152601b6020908152604080832093861683529281529082902082516101408101845281548152600182015492810192909252600281015492820192909252600382015463ffffffff80821660608401526001600160401b03600160201b830481166080850152600160601b8304811660a08501819052600160a01b840490921660c0850152600160c01b90920490911660e08301526004830154610100830152600590920154610120820152908490849061252a576040516330acea0d60e11b8152600401610958929190615a36565b50506000612538858561412c565b90506000816003015411858590916125655760405163b6a70b3b60e01b8152600401610958929190615a36565b50508281600201546125779190615a23565b60028201556125893384610a2f613565565b836001600160a01b0316856001600160a01b03167f673007a04e501145e79f59aea5e0413b6e88344fdaf10326254530d6a1511530856040516125ce91815260200190565b60405180910390a35050505050565b6040805160208101909152600081526040805160208101909152600081526000612607868661412c565b6001600160a01b03851660009081526004909101602052604090205482525090509392505050565b60408051608081018252600080825260208201819052918101829052606081019190915261265d8383613bc8565b604080516080810182528254815260018301546001600160401b0316602082015260028301549181019190915260039091015460608201529392505050565b6126a4613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270591906159a4565b6001600160a01b0316336001600160a01b03161461273657604051635d9044cd60e01b815260040160405180910390fd5b600d805463ffffffff191690556040517f93be484d290d119d9cf99cce69d173c732f9403333ad84f69c807b590203d10990600090a1565b60408051608081018252600080825260208201819052918101829052606081019190915261279e85858585613b5c565b604080516080810182528254815260018301546020820152600283015491810191909152600390910154606082015295945050505050565b6127de613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190615964565b1561285d57604051632b37d9d160e21b815260040160405180910390fd5b3360009081526012602052604090205460ff1615612966576040516001600160a01b038581166024830152604482018590526064820184905282811660848301526000917f00000000000000000000000000000000000000000000000000000000000000009091169060a40160408051601f198184030181529181526020820180516001600160e01b031663224451c160e11b179052516128fe9190615bb7565b600060405180830381855af49150503d8060008114612939576040519150601f19603f3d011682016040523d82523d6000602084013e61293e565b606091505b50509050806129605760405163ef370f5160e01b815260040160405180910390fd5b5061173c565b6001600160a01b0384166000908152601b6020908152604080832033808552925282209091612995878461412c565b90506000816002015483600001546129ad9190615a23565b9050806000036129d057604051630a8a55c960e31b815260040160405180910390fd5b60006129dc888361434b565b905060006129ee85600001548361434b565b90508015612be8576003850154600090612a1390839063ffffffff9081169061457916565b9050888181811015612a3a57604051632f514d5760e21b8152600401610958929190615bd3565b50508815612aa757612a4f888a61160e613565565b876001600160a01b0316876001600160a01b03168c6001600160a01b03167f95ff4196cd75fa49180ba673948ea43935f59e7c4ba101fa09b9fe0ec266d5828c604051612a9e91815260200190565b60405180910390a45b612acb612ab48a84615a10565b612abc613565565b6001600160a01b0316906145d9565b8554612ad78382615a10565b8760010154612ae691906159d7565b612af091906159ee565b60018701558554612b02908390615a10565b8655600286015415801590612b1957506001860154155b15612b3d5760006002870181905560058701805491612b3783615be1565b91905055505b6001600160a01b038b166000908152600e6020526040902060040154612b64908390615a10565b6001600160a01b038c166000908152600e60205260409020600481019190915554612b90908390615a10565b6001600160a01b038c81166000818152600e60209081526040918290209490945551858152918a169290917fe7b110f13cde981d5079ab7faa4249c5f331f5c292dbc6031969d2ce694188a3910160405180910390a3505b612bf28183615a10565b91508115612d2c5760205460ff1615612cde57612c1182612abc613565565b6002840154612c208382615a10565b8560050154612c2f91906159d7565b612c3991906159ee565b60058501556002840154612c4e908390615a10565b6002850155600684015415801590612c6857506005840154155b15612c8c5760006006850181905560078501805491612c8683615be1565b91905055505b856001600160a01b03168a6001600160a01b03167fc5d16dbb577cf07678b577232717c9a606197a014f61847e623d47fc6bf6b77184604051612cd191815260200190565b60405180910390a3612d2c565b856001600160a01b03168a6001600160a01b03167fdce44f0aeed2089c75db59f5a517b9a19a734bf0213412fa129f0d0434126b2484604051612d2391815260200190565b60405180910390a35b50505050505050505050565b612d40613095565b6001600160a01b0316634fc07d756040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da191906159a4565b6001600160a01b0316336001600160a01b031614612dd257604051635d9044cd60e01b815260040160405180910390fd5b6020805460ff191660011790556040517f2192802a8934dbf383338406b279ec7f3eccee31e58d6c0444d6dd6bfff24b3590600090a1565b612e12613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e739190615964565b15612e9157604051632b37d9d160e21b815260040160405180910390fd5b6001600160a01b038416612eb8576040516322347d6760e21b815260040160405180910390fd5b6001600160a01b038316612edf5760405163a962605960e01b815260040160405180910390fd5b610b4d868686868686613c18565b6000612ef7613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f589190615964565b15612f7657604051632b37d9d160e21b815260040160405180910390fd5b8383612f838282336130b9565b828233909192612fa957604051630c76b97b60e41b815260040161095893929190615981565b505050612fb7868686614621565b9695505050505050565b6000610a7c8383614328565b612fd5613095565b6001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130369190615964565b1561305457604051632b37d9d160e21b815260040160405180910390fd5b82826130618282336130b9565b82823390919261308757604051630c76b97b60e41b815260040161095893929190615981565b5050506118278585856141e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000836001600160a01b0316826001600160a01b0316036130dc5750600161188b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361314457506001600160a01b0380841660009081526015602090815260408083209385168352929052205460ff1661188b565b506001600160a01b038084166000908152601f60209081526040808320868516845282528083209385168352929052205460ff1661188b565b6000841161319e57604051630a2a4e5b60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614806131e45750600d5463ffffffff16155b83906132045760405163353666ff60e01b8152600401610958919061553e565b508163ffffffff8116620f42401015613239576040516329bff5f560e01b815263ffffffff9091166004820152602401610958565b50601a5481906001600160401b0390811690821681101561326f5760405163ee5602e160e01b8152600401610958929190615a9e565b50506001600160a01b038581166000908152601b6020908152604080832093871683529290522060030154600160601b90046001600160401b0316156132c857604051632b542c0d60e11b815260040160405180910390fd5b60006132d386614362565b90508481808211156132fa5760405163ccaf28a960e01b8152600401610958929190615bd3565b505060405180610140016040528086815260200160008152602001600081526020018463ffffffff168152602001836001600160401b03168152602001426001600160401b031681526020018463ffffffff168152602001836001600160401b03168152602001600081526020016000815250601b6000886001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548163ffffffff021916908363ffffffff16021790555060808201518160030160046101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600301600c6101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160030160146101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160030160186101000a8154816001600160401b0302191690836001600160401b03160217905550610100820151816004015561012082015181600501559050506000600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002090508581600401546134fa9190615a23565b60048201556040805187815263ffffffff861660208201526001600160401b0385168183015290516001600160a01b0387811692908a16917f88b4c2d08cea0f01a24841ff5d14814ddb5b14ac44b05e0835fcc0dcd8c7bc259181900360600190a350505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8015610e6f576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af11580156135e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136099190615964565b610e6f5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610958565b81670de0b6b3a76400008082101561366e5760405163b86d885760e01b8152600401610958929190615bd3565b50506001600160a01b038481166000908152601b602090815260408083209387168352929052206003015484908490600160601b90046001600160401b03166136cc576040516330acea0d60e11b8152600401610958929190615a36565b505060006136da858561412c565b336000908152600482016020526040902060028201549192509015158061370357506003820154155b8686909161372657604051631984edef60e31b8152600401610958929190615a36565b50506000826002015460001480613744575082600501548360020154145b905060008161377f57836005015484600201546137619190615a10565b600385015461377090886159d7565b61377a91906159ee565b613781565b855b905080158015906137925750848110155b818690916137b557604051635d88e8d160e01b8152600401610958929190615bd3565b50508584600201546137c79190615a23565b600285015560038401546137dc908290615a23565b600385015582546137ee908290615a23565b835560405133906001600160a01b0389811691908b16907f237818af8bb47710142edd8fc301fbc507064fb357cf122fb161ca447e3cb13e90613834908b908790615bd3565b60405180910390a45050505050505050565b6001600160a01b038281166000908152601b60209081526040808320938516835292905290812060018101549054610a7c9190615a10565b6001600160a01b038381166000818152601b60209081526040808320948716808452948252808320600281015460018201548351610100810185528681529485018790529284019690965260608301949094526080820181905260a0820185905260c08201869052600584015460e08301529193849290916138ff816147b3565b875492965094509250613913908590615a10565b855560028501839055600185018290556001600160a01b0389166000908152600e60205260408120600401805486929061394e908490615a10565b92505081905550876001600160a01b0316896001600160a01b03167f9008d731ddfbec70bc364780efd63057c6877bee8027c4708a104b365395885d8660405161399a91815260200190565b60405180910390a35091979650505050505050565b3360008290036139d257604051630a2a4e5b60e11b815260040160405180910390fd5b60006139dd82614362565b9050828180821115613a045760405163ccaf28a960e01b8152600401610958929190615bd3565b50506001600160a01b0382166000908152600e602052604081208054600d549192909163ffffffff1690819003613a9657613a3f8683615a10565b8355613a4e858761160e613565565b846001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8387604051613a8991815260200190565b60405180910390a2610b4d565b600283015415801590613aad575082600301544310155b15613abb57613abb85613d9e565b600283015415613ae557613ae2613ad68460030154436148ad565b846002015483896148c7565b90505b858360020154613af59190615a23565b6002840155613b048143615a23565b6003840181905560028401546040516001600160a01b038816927f91642f23a1196e1424949fafa2a428c3b5d1f699763942ff08a6fbe9d4d7e98092613b4c92909190615bd3565b60405180910390a2505050505050565b6000601e6000866001811115613b7457613b74615a6f565b6001811115613b8557613b85615a6f565b8152602080820192909252604090810160009081206001600160a01b03978816825283528181209587168152948252808520939095168452919091525020919050565b6000601d6000846001811115613be057613be0615a6f565b6001811115613bf157613bf1615a6f565b81526020019081526020016000206000838152602001908152602001600020905092915050565b6000613c24878761412c565b905080600201546000141580613c3c57506003810154155b87879091613c5f57604051631984edef60e31b8152600401610958929190615a36565b5050600681015460058201546040805161010081018252600181526001600160a01b03808c1660208301528a16918101919091523360608201526080810182905260a0810183905260c08101859052600784015460e08201526000929190613cc6816147b3565b600288015492965094509250613cdd908590615a10565b600286015560068501839055600585018290558315613d91576001600160a01b03891615801590613d1657506001600160a01b03881615155b15613d2c57613d278989868a613641565b613d91565b613d39338561160e613565565b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f305f519d8909c676ffd870495d4563032eb0b506891a6dd9827490256cc9914e87604051613d8891815260200190565b60405180910390a45b5050505050505050505050565b6001600160a01b0381166000908152600e6020526040812060028101549091819003613ddd57604051630a2a4e5b60e11b815260040160405180910390fd5b600382015443811115613e0657604051631d222f1b60e31b815260040161095891815260200190565b5060006002830181905560038301558154613e22908290615a10565b8255613e31838261160e613565565b826001600160a01b03167f32eed9ebc5696170068a371fdbea4c076da1bc21b305e78ca0a5e65ee913be8382604051613e6c91815260200190565b60405180910390a2505050565b6000808211613e9b57604051637318ad9960e01b815260040160405180910390fd5b6000613ea7858561412c565b33600090815260048201602052604090208054919250908480821015613ee25760405163ab99793560e01b8152600401610958929190615bd3565b5050600282015486908690613f0c57604051631984edef60e31b8152600401610958929190615a36565b50506000826003015483600501548460020154613f299190615a10565b613f3390876159d7565b613f3d91906159ee565b905060008360050154600014613f705760058401546006850154613f6190846159d7565b613f6b91906159ee565b613f72565b815b6001600160a01b038981166000908152601b60209081526040808320938c1683529290529081206003015491925090613fbb90600160201b90046001600160401b031642615a23565b9050828560050154613fcd9190615a23565b60058601556006850154613fe2908390615a23565b60068601556003850154613ff7908890615a10565b60038601558354614009908890615a10565b8085551561407557600085600301548660050154876002015461402c9190615a10565b865461403891906159d7565b61404291906159ee565b905080670de0b6b3a7640000808210156140715760405163587ab9ab60e11b8152600401610958929190615bd3565b5050505b600061408b60018b8b3387878c6007015461491b565b9050336001600160a01b0316896001600160a01b03168b6001600160a01b03167f0525d6ad1aa78abc571b5c1984b5e1ea4f1412368c1cc348ca408dbb1085c9a1878c6040516140dc929190615bd3565b60405180910390a49998505050505050505050565b8015610e6f5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016135c6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361418557506001600160a01b0382166000908152601460205260409020610a7f565b506001600160a01b038083166000908152602160209081526040808320938516835292905220610a7f565b806000036141d157604051630a2a4e5b60e11b815260040160405180910390fd5b6141de3382610a2f613565565b610a6c8282614ac1565b8060000361420957604051630a2a4e5b60e11b815260040160405180910390fd5b6001600160a01b038381166000908152601b60209081526040808320938616835292905220600381015484908490600160601b90046001600160401b0316614266576040516330acea0d60e11b8152600401610958929190615a36565b5050600061427385614362565b905082818082111561429a5760405163ccaf28a960e01b8152600401610958929190615bd3565b505081546142a9908490615a23565b82556001600160a01b0385166000908152600e60205260409020600401546142d2908490615a23565b6001600160a01b038681166000818152600e602090815260409182902060040194909455518681529187169290917feaf6ea3a42ed2fd1b6d575f818cbda593af9524aa94bd30e65302ac4dc23474591016125ce565b600080614335848461412c565b905080600501548160020154610dd09190615a10565b60008183111561435b5781610a7c565b5090919050565b6001600160a01b0381166000908152600e6020526040812060028101546001820154600490920154839261439591615a23565b61439f9190615a23565b6001600160a01b0384166000908152600e60205260409020549091508181116143c9576000610dd0565b610dd08282615a10565b6060600080846001600160a01b0316846040516143f09190615bb7565b600060405180830381855af49150503d806000811461442b576040519150601f19603f3d011682016040523d82523d6000602084013e614430565b606091505b5091509150614440858383614b34565b95945050505050565b336001600160a01b0383160361447257604051630123065360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036144df573360009081526015602090815260408083206001600160a01b03861684529091529020805460ff191682151517905561451b565b336000908152601f602090815260408083206001600160a01b03878116855290835281842090861684529091529020805460ff19168215151790555b816001600160a01b0316836001600160a01b0316336001600160a01b03167faa5a59b38e8f68292982382bf635c2f263ca37137bbc52956acd808fd7bf976f8460405161456c911515815260200190565b60405180910390a4505050565b600061458883620f4240101590565b8061459b575061459b82620f4240101590565b838390916145be5760405163768bf0eb60e11b8152600401610958929190615bd3565b50620f424090506145cf83856159d7565b610a7c91906159ee565b8015610a6c57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b158015611f0e57600080fd5b60008160000361464457604051630a2a4e5b60e11b815260040160405180910390fd5b60006146508585613846565b90508083808210156146775760405163587ab9ab60e11b8152600401610958929190615bd3565b50506001600160a01b038086166000908152601b6020908152604080832093881683529290529081206001810154909190156146ec578160010154600183600101548785600201546146c991906159d7565b6146d39190615a23565b6146dd9190615a10565b6146e791906159ee565b6146ee565b845b600383015490915060009061471390600160201b90046001600160401b031642615a23565b90508183600201546147259190615a23565b6002840155600183015461473a908790615a23565b8360010181905550600061475860008a8a8c87878a6005015461491b565b9050876001600160a01b0316896001600160a01b03167f3b81913739097ced1e7fa748c6058d34e2c00b961fb501094543b397b198fdaa8960405161479f91815260200190565b60405180910390a398975050505050505050565b6000806000806147d58560000151866020015187604001518860600151613b5c565b905060008160030154116147fc576040516307e332c560e31b815260040160405180910390fd5b60006148088683614b87565b905085604001516001600160a01b031686602001516001600160a01b03168760000151600181111561483c5761483c615a6f565b6060808a01518551602080880151604080516001600160a01b039095168552918401929092528201527f86c2f162872d7c46d7ee0caad366da6dc430889b9d8f27e4bed3785548f9954b910160405180910390a4602081015160408201516060909201519097919650945092505050565b60008183116148bd576000610a7c565b610a7c8284615a10565b60006148d38285615a23565b60016148df8487615a23565b6148e99190615a10565b6148f384866159d7565b6148fd87896159d7565b6149079190615a23565b6149119190615a23565b61444091906159ee565b60008360000361493e57604051637318ad9960e01b815260040160405180910390fd5b600061494c89898989613b5c565b90506103e88160030154106149745760405163332b852b60e11b815260040160405180910390fd5b60028101546040516001600160601b031960608b811b821660208401528a811b8216603484015289901b166048820152605c810191909152600090607c0160405160208183030381529060405280519060200120905060006149d68b83613bc8565b8781556001810180546001600160401b0319166001600160401b03891617905560006002820155600380820187905584015490915015614a245781614a1f8c8560010154613bc8565b600201555b614a2e8383614c82565b886001600160a01b03168a6001600160a01b03168c6001811115614a5457614a54615a6f565b604080516001600160a01b038d168152602081018c90526001600160401b038b168183015260608101879052608081018a905290517f036538df4a591a5cc74b68cfc7f8c61e8173dbc81627e1d62600b61e820461789181900360a00190a4509998505050505050505050565b6001600160a01b0382166000908152600e6020526040902054614ae5908290615a23565b6001600160a01b0383166000818152600e6020526040908190209290925590517f48c384dd8bdf1e06d8afecd810c4acfc3d553ac5d879dec5a69875dbbd90e14b906113719084815260200190565b606082614b4957614b4482614d15565b61188b565b8151158015614b6057506001600160a01b0384163b155b15614b805783604051639996b31560e01b8152600401610958919061553e565b508061188b565b614bb26040518060800160405280600081526020016000815260200160008152602001600081525090565b615194614bc28460000151614d3e565b9050615194614bd48560000151614da3565b905060008560000151600087608001518860a001518960e00151604051602001614c02959493929190615bfa565b6040516020818303038152906040529050600080614c3785614dea86868c60c001518c614f5a9095949392919063ffffffff16565b91509150600080600083806020019051810190614c549190615c3d565b60408051608081018252998a5260208a019390935291880152606087015250939a9950505050505050505050565b612710826003015410614ca8576040516303a8c56b60e61b815260040160405180910390fd5b80614cc657604051638f4a893d60e01b815260040160405180910390fd5b6001808301829055600283018054600090614ce2908490615a23565b90915550506003820154600003614cf7578082555b6001826003016000828254614d0c9190615a23565b90915550505050565b805115614d255780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6151946000826001811115614d5557614d55615a6f565b03614d635750615014919050565b6001826001811115614d7757614d77615a6f565b03614d855750615056919050565b604051636bd1fba760e11b815260040160405180910390fd5b919050565b6151946000826001811115614dba57614dba615a6f565b03614dc85750615062919050565b6001826001811115614ddc57614ddc615a6f565b03614d8557506150b9919050565b60006060600080600080600087806020019051810190614e0a9190615c7c565b945094509450945094506000614e20868b613bc8565b6001810154909150426001600160401b039091161115614e5b5760016040518060200160405280600081525097509750505050505050614f53565b600381015460009083148015614eae5782548590614e7a9088906159d7565b614e8491906159ee565b9150614e908287615a10565b8354909650614e9f9086615a10565b9450614eab8288615a23565b96505b8b886001811115614ec157614ec1615a6f565b845460018601546040805187815260208101939093526001600160401b03909116828201528415156060830152517f469e89d0a4e0e5deb2eb1ade5b3fa67fdfbeb4787c3a7c1e8e89aaf28562cab29181900360800190a38787878787604051602001614f32959493929190615bfa565b6040516020818303038152906040529a5060008b9950995050505050505050505b9250929050565b600060608760030154831115614f8357604051634a411b9d60e11b815260040160405180910390fd5b60008315614f915783614f97565b88600301545b89549094505b8015801590614fac5750600085115b1561500557600080614fc283898c63ffffffff16565b915091508115614fd3575050615005565b965086614fe18c8c8b6150c4565b925086614fed81615cc5565b9750508380614ffb90615be1565b9450505050614f9d565b50989397509295505050505050565b6000601d81805b600181111561502c5761502c615a6f565b81526020019081526020016000206000838152602001908152602001600020600201549050919050565b6000601d81600161501b565b601d6000805b600181111561507957615079615a6f565b8152602080820192909252604090810160009081209381529290915281208181556001810180546001600160401b03191690556002810182905560030155565b601d60006001615068565b6000808460030154116150ea5760405163ddaf8f2160e01b815260040160405180910390fd5b60006150fd85600001548563ffffffff16565b905061511085600001548463ffffffff16565b60018560030160008282546151259190615a10565b9091555050808555600385015460000361514157600060018601555b5050915492915050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b6110d0615cdc565b6001600160a01b0381168114610cd357600080fd5b803563ffffffff81168114614d9e57600080fd5b80356001600160401b0381168114614d9e57600080fd5b600080600080600060a086880312156151f457600080fd5b85356151ff8161519c565b9450602086013561520f8161519c565b935060408601359250615224606087016151b1565b9150615232608087016151c5565b90509295509295909350565b6000806040838503121561525157600080fd5b823561525c8161519c565b946020939093013593505050565b6000806040838503121561527d57600080fd5b82356152888161519c565b915060208301356152988161519c565b809150509250929050565b6000806000606084860312156152b857600080fd5b83356152c38161519c565b925060208401356152d38161519c565b929592945050506040919091013590565b6000602082840312156152f657600080fd5b610a7c826151c5565b6000610140820190508251825260208301516020830152604083015160408301526060830151615337606084018263ffffffff169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538560c084018263ffffffff169052565b5060e08301516153a060e08401826001600160401b03169052565b5061010083015161010083015261012083015161012083015292915050565b6000602082840312156153d157600080fd5b5035919050565b60028110610cd357600080fd5b600080600080608085870312156153fb57600080fd5b8435615406816153d8565b935060208501356154168161519c565b925060408501356154268161519c565b915060608501356154368161519c565b939692955090935050565b60006020828403121561545357600080fd5b813561188b8161519c565b803560038110614d9e57600080fd5b6000806000806080858703121561548357600080fd5b843561548e8161519c565b9350602085013561549e8161519c565b92506154ac6040860161545e565b9396929550929360600135925050565b8015158114610cd357600080fd5b600080604083850312156154dd57600080fd5b82356154e88161519c565b91506020830135615298816154bc565b6000806000806080858703121561550e57600080fd5b84356155198161519c565b935060208501356155298161519c565b93969395505050506040820135916060013590565b6001600160a01b0391909116815260200190565b60008060006060848603121561556757600080fd5b83356155728161519c565b925060208401356155828161519c565b91506155906040850161545e565b90509250925092565b6000806000606084860312156155ae57600080fd5b83356155b98161519c565b925060208401356155c98161519c565b915060408401356155d98161519c565b809150509250925092565b600080600080608085870312156155fa57600080fd5b84356156058161519c565b935060208501356156158161519c565b9250615623604086016151b1565b9150615631606086016151c5565b905092959194509250565b60008060006060848603121561565157600080fd5b833561565c8161519c565b9250602084013561566c8161519c565b9150615590604085016151b1565b60008060006040848603121561568f57600080fd5b833561569a8161519c565b925060208401356001600160401b038111156156b557600080fd5b8401601f810186136156c657600080fd5b80356001600160401b038111156156dc57600080fd5b8660208284010111156156ee57600080fd5b939660209190910195509293505050565b6000806020838503121561571257600080fd5b82356001600160401b0381111561572857600080fd5b8301601f8101851361573957600080fd5b80356001600160401b0381111561574f57600080fd5b8560208260051b840101111561576457600080fd5b6020919091019590945092505050565b60005b8381101561578f578181015183820152602001615777565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561580c57603f19878603018452815180518087526157e9816020890160208501615774565b601f01601f191695909501602090810195509384019391909101906001016157c0565b50929695505050505050565b60008060006060848603121561582d57600080fd5b83356158388161519c565b925060208401356158488161519c565b915060408401356155d9816154bc565b6000806000806080858703121561586e57600080fd5b84356158798161519c565b935060208501356158898161519c565b925060408501356154ac8161519c565b600080604083850312156158ac57600080fd5b823561525c816153d8565b600080600080608085870312156158cd57600080fd5b84356158d88161519c565b9350602085013592506040850135915060608501356154368161519c565b60008060008060008060c0878903121561590f57600080fd5b863561591a8161519c565b9550602087013561592a8161519c565b9450604087013561593a8161519c565b9350606087013561594a8161519c565b9598949750929560808101359460a0909101359350915050565b60006020828403121561597657600080fd5b815161188b816154bc565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6000602082840312156159b657600080fd5b815161188b8161519c565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a7f57610a7f6159c1565b600082615a0b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610a7f57610a7f6159c1565b80820180821115610a7f57610a7f6159c1565b6001600160a01b0392831681529116602082015260400190565b63ffffffff9290921682526001600160401b0316602082015260400190565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615a9757600080fd5b5051919050565b6001600160401b0392831681529116602082015260400190565b6020808252601e908201527f43616c6c6572206d757374206265207468652070726f78792061646d696e0000604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112615b6157600080fd5b8301803591506001600160401b03821115615b7b57600080fd5b602001915036819003821315614f5357600080fd5b828482376000838201600081528351615bad818360208801615774565b0195945050505050565b60008251615bc9818460208701615774565b9190910192915050565b918252602082015260400190565b600060018201615bf357615bf36159c1565b5060010190565b60a0810160028710615c1c57634e487b7160e01b600052602160045260246000fd5b95815260208101949094526040840192909252606083015260809091015290565b60008060008060808587031215615c5357600080fd5b8451615c5e816153d8565b60208601516040870151606090970151919890975090945092505050565b600080600080600060a08688031215615c9457600080fd5b8551615c9f816153d8565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600081615cd457615cd46159c1565b506000190190565b634e487b7160e01b600052605160045260246000fdfea2646970667358221220f5046670ab269f9c179f41df4a02cd9c6b2ca3d5d507e2b9fcf15f800f351d8b64736f6c634300081b00330000000000000000000000000750eda3185c758247e97819074bcd217a815fae00000000000000000000000037f125cf456cd8d24277033a3b583491e900368900000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonStaking#HorizonStaking","networkInteractionId":1,"nonce":1637,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonStaking#HorizonStaking","networkInteractionId":1,"nonce":1637,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x2a5ffad459b93c91f5c424cfbeffebaacb562267c9ab73071d75dc33af9f9438"},"type":"TRANSACTION_SEND"} +{"args":[],"artifactId":"PaymentsEscrow#PaymentsEscrow","dependencies":["PaymentsEscrow#PaymentsEscrow"],"functionName":"initialize","futureId":"PaymentsEscrow#encodeFunctionCall(PaymentsEscrow#PaymentsEscrow.initialize)","result":"0x8129fc1c","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"futureId":"HorizonStaking#HorizonStaking","hash":"0x2a5ffad459b93c91f5c424cfbeffebaacb562267c9ab73071d75dc33af9f9438","networkInteractionId":1,"receipt":{"blockHash":"0x0adf90fe6c00cde565ac95a23687261ccdb8b317ba79cb614e03a4d9dace35ae","blockNumber":152513180,"contractAddress":"0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244","logs":[{"address":"0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonStaking#HorizonStaking","result":{"address":"0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":["0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","0x4756cdF556A78BD28399E833Bc5bBFc7a5bca866","0x8129fc1c"],"artifactId":"HorizonProxies#ProxyAdmin_GraphPayments","contractAddress":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","dependencies":["HorizonProxies#ProxyAdmin_GraphPayments","HorizonProxies#GraphPayments_ProxyWithABI","GraphPayments#GraphPayments","GraphPayments#encodeFunctionCall(GraphPayments#GraphPayments.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"upgradeAndCall","futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","networkInteraction":{"data":"0x9623609d000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c930000000000000000000000004756cdf556a78bd28399e833bc5bbfc7a5bca866000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c00000000000000000000000000000000000000000000000000000000","id":1,"to":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","networkInteractionId":1,"nonce":1638,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","networkInteractionId":1,"nonce":1638,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xb6458ef6f53df617eb6e698b0127d8a04e227ac5af0ea7b896af4ba5b6e5d5ae"},"type":"TRANSACTION_SEND"} +{"args":["0xF5D432192dAF7e8B045349693577ccF0B5165A12","0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","HorizonProxies#GraphProxy","HorizonStaking#HorizonStaking"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"upgrade","futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade","networkInteraction":{"data":"0x99a88ec4000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12000000000000000000000000a9b5cd0e94ebdf5a6dbb16a01635d432ab707244","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade","networkInteractionId":1,"nonce":1639,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade","networkInteractionId":1,"nonce":1639,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x4030ee34b16e126a67328280bfdb6bdabbf829de8fbe790b282a6bd332429cbf"},"type":"TRANSACTION_SEND"} +{"args":["0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","0xeED33B904efF05BbdcC9008F5174088DF77dD183","0x8129fc1c"],"artifactId":"HorizonProxies#ProxyAdmin_PaymentsEscrow","contractAddress":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","dependencies":["HorizonProxies#ProxyAdmin_PaymentsEscrow","HorizonProxies#PaymentsEscrow_ProxyWithABI","PaymentsEscrow#PaymentsEscrow","PaymentsEscrow#encodeFunctionCall(PaymentsEscrow#PaymentsEscrow.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"upgradeAndCall","futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","networkInteraction":{"data":"0x9623609d00000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000eed33b904eff05bbdcc9008f5174088df77dd183000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c00000000000000000000000000000000000000000000000000000000","id":1,"to":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","networkInteractionId":1,"nonce":1640,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","networkInteractionId":1,"nonce":1640,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x83d3b50e1f7def264180b768dfd5ae7f7dea0d6a6249ea87bc10064980a5f36b"},"type":"TRANSACTION_SEND"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","hash":"0xb6458ef6f53df617eb6e698b0127d8a04e227ac5af0ea7b896af4ba5b6e5d5ae","networkInteractionId":1,"receipt":{"blockHash":"0x4a9bb6a8f5323f117a03aca0654a6b582f8b4788ca70aeecbf348d911646a319","blockNumber":152513202,"logs":[{"address":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000004756cdf556a78bd28399e833bc5bbfc7a5bca866"]},{"address":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":1,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade","hash":"0x4030ee34b16e126a67328280bfdb6bdabbf829de8fbe790b282a6bd332429cbf","networkInteractionId":1,"receipt":{"blockHash":"0x7fa141baa0db73416d8107f6492e6270402318676c4d343e426e3f07a292ae88","blockNumber":152513213,"logs":[{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","data":"0x","logIndex":0,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000a9b5cd0e94ebdf5a6dbb16a01635d432ab707244"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","hash":"0x83d3b50e1f7def264180b768dfd5ae7f7dea0d6a6249ea87bc10064980a5f36b","networkInteractionId":1,"receipt":{"blockHash":"0x476810258dad7fbed9ce5be1da825d24292de55e2a892f7f4f986d3b51084261","blockNumber":152513224,"logs":[{"address":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","data":"0x","logIndex":2,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x000000000000000000000000eed33b904eff05bbdcc9008f5174088df77dd183"]},{"address":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":3,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"artifactId":"GraphPayments#GraphPayments_ProxyWithABI","contractAddress":"0xAFd60629034fBdC3ef58518B817bBDB4EC861c93","contractName":"GraphPayments_ProxyWithABI","dependencies":["GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.upgradeAndCall","HorizonProxies#GraphPayments_ProxyWithABI"],"futureId":"GraphPayments#GraphPayments_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"args":["0xa9B5CD0E94eBDf5A6dBB16A01635D432AB707244","0xF5D432192dAF7e8B045349693577ccF0B5165A12"],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","HorizonStaking#HorizonStaking","HorizonProxies#GraphProxy","HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.upgrade"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"acceptProxy","futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","networkInteraction":{"data":"0xeb451a02000000000000000000000000a9b5cd0e94ebdf5a6dbb16a01635d432ab707244000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","networkInteractionId":1,"nonce":1641,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","networkInteractionId":1,"nonce":1641,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x9072e5d7559c313a1003b7c64a954c6f15cd7f6a0e8582b92ee990ffd81fd2f2"},"type":"TRANSACTION_SEND"} +{"artifactId":"PaymentsEscrow#PaymentsEscrow_ProxyWithABI","contractAddress":"0x70d5AFAAaEF8f2F095E83D6E6151146c18A5Bb85","contractName":"PaymentsEscrow_ProxyWithABI","dependencies":["PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.upgradeAndCall","HorizonProxies#PaymentsEscrow_ProxyWithABI"],"futureId":"PaymentsEscrow#PaymentsEscrow_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","hash":"0x9072e5d7559c313a1003b7c64a954c6f15cd7f6a0e8582b92ee990ffd81fd2f2","networkInteractionId":1,"receipt":{"blockHash":"0x0ad4df5f1d21c5ec99d4ce36d43af6d41a5f46d135d31067c06d91fb0973d129","blockNumber":152513248,"logs":[{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","data":"0x","logIndex":0,"topics":["0xaa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000a9b5cd0e94ebdf5a6dbb16a01635d432ab707244"]},{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","data":"0x","logIndex":1,"topics":["0x980c0d30fe97457c47903527d88b7009a1643be6de24d2af664214919f0540a1","0x000000000000000000000000a9b5cd0e94ebdf5a6dbb16a01635d432ab707244","0x0000000000000000000000000000000000000000000000000000000000000000"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":["0xad834c286a9b590f8264c8d9574fafcbbbe90b3b"],"artifactId":"HorizonProxies#ProxyAdmin_GraphPayments","contractAddress":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","dependencies":["HorizonProxies#ProxyAdmin_GraphPayments","GraphPayments#GraphPayments_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","id":1,"to":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.transferOwnership","networkInteractionId":1,"nonce":1642,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.transferOwnership","networkInteractionId":1,"nonce":1642,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x951c9730f5cc5288d4011f3475b4215c1c670d9bc488b76755abd0216ab0e587"},"type":"TRANSACTION_SEND"} +{"artifactId":"HorizonStaking#HorizonStaking_ProxyWithABI","contractAddress":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","contractName":"HorizonStaking_ProxyWithABI","dependencies":["HorizonStaking#GraphProxyAdmin~GraphProxyAdmin.acceptProxy","HorizonProxies#GraphProxy"],"futureId":"HorizonStaking#HorizonStaking_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"args":["0xad834c286a9b590f8264c8d9574fafcbbbe90b3b"],"artifactId":"HorizonProxies#ProxyAdmin_PaymentsEscrow","contractAddress":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","dependencies":["HorizonProxies#ProxyAdmin_PaymentsEscrow","PaymentsEscrow#PaymentsEscrow_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","id":1,"to":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.transferOwnership","networkInteractionId":1,"nonce":1643,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.transferOwnership","networkInteractionId":1,"nonce":1643,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x8e755afef744094c0a740a5442d8fea9faa6d19351abacf8996405e96301d15b"},"type":"TRANSACTION_SEND"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.transferOwnership","hash":"0x951c9730f5cc5288d4011f3475b4215c1c670d9bc488b76755abd0216ab0e587","networkInteractionId":1,"receipt":{"blockHash":"0x357ebed91b7e2ab80c74d45f806812e24329206b047389ff2bd62b8a82f8f68e","blockNumber":152513268,"logs":[{"address":"0xAcA3dd622e863E425Cdb15E8734a5CB318448db7","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphPayments#HorizonProxies~ProxyAdmin_GraphPayments.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.transferOwnership","hash":"0x8e755afef744094c0a740a5442d8fea9faa6d19351abacf8996405e96301d15b","networkInteractionId":1,"receipt":{"blockHash":"0xfb6f319118f21b5991a4ec05bee9011339ec9a80eb27afccfb221dd2b01bfdff","blockNumber":152513279,"logs":[{"address":"0xbB643167f03EfF532c537e3d72E56b9992CaD985","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"PaymentsEscrow#HorizonProxies~ProxyAdmin_PaymentsEscrow.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":[2419200],"artifactId":"HorizonStaking#HorizonStaking_ProxyWithABI","contractAddress":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","dependencies":["HorizonStaking#HorizonStaking_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setMaxThawingPeriod","futureId":"HorizonStaking#HorizonStaking_ProxyWithABI.setMaxThawingPeriod","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"HorizonStaking#HorizonStaking_ProxyWithABI.setMaxThawingPeriod","networkInteraction":{"data":"0x259bc435000000000000000000000000000000000000000000000000000000000024ea00","id":1,"to":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"HorizonStaking#HorizonStaking_ProxyWithABI.setMaxThawingPeriod","networkInteractionId":1,"nonce":1644,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"HorizonStaking#HorizonStaking_ProxyWithABI.setMaxThawingPeriod","networkInteractionId":1,"nonce":1644,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x96825e69f8876b2c724d53846534f6af23b2c24de6ef0f547ac8ea0c7b4b2870"},"type":"TRANSACTION_SEND"} +{"futureId":"HorizonStaking#HorizonStaking_ProxyWithABI.setMaxThawingPeriod","hash":"0x96825e69f8876b2c724d53846534f6af23b2c24de6ef0f547ac8ea0c7b4b2870","networkInteractionId":1,"receipt":{"blockHash":"0xc522a6fdc4095efab4a2657834ff66219b13846a6ef17f6de4d1becde597fa78","blockNumber":152513301,"logs":[{"address":"0xF5D432192dAF7e8B045349693577ccF0B5165A12","data":"0x000000000000000000000000000000000000000000000000000000000024ea00","logIndex":3,"topics":["0xe8526be46fa99b6313d439293c9be3491ffb067741bc8fce9d30c270cbb8459f"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"HorizonStaking#HorizonStaking_ProxyWithABI.setMaxThawingPeriod","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":[],"artifactId":"Controller#Controller","contractAddress":"0x0750EdA3185C758247E97819074bCD217a815FaE","dependencies":["Controller#Controller","GraphHorizon_Periphery","GraphHorizon_Core","HorizonStaking#HorizonStaking_ProxyWithABI"],"from":"0xad834c286a9b590f8264c8d9574fafcbbbe90b3b","functionName":"acceptOwnership","futureId":"GraphHorizon_Deploy#Controller~Controller.acceptOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Deploy#Controller~Controller.acceptOwnership","networkInteraction":{"data":"0x79ba5097","id":1,"to":"0x0750EdA3185C758247E97819074bCD217a815FaE","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Deploy#Controller~Controller.acceptOwnership","networkInteractionId":1,"nonce":16,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Deploy#Controller~Controller.acceptOwnership","networkInteractionId":1,"nonce":16,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x2b9a28aeba3c4895daab3167d685c6d91bc7d7cb568b0a66e8dcde28c63f56d5"},"type":"TRANSACTION_SEND"} +{"args":[],"artifactId":"GraphProxyAdmin#GraphProxyAdmin","contractAddress":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","dependencies":["GraphProxyAdmin#GraphProxyAdmin","GraphHorizon_Periphery","GraphHorizon_Core","HorizonStaking#HorizonStaking_ProxyWithABI"],"from":"0xad834c286a9b590f8264c8d9574fafcbbbe90b3b","functionName":"acceptOwnership","futureId":"GraphHorizon_Deploy#GraphProxyAdmin~GraphProxyAdmin.acceptOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"GraphHorizon_Deploy#GraphProxyAdmin~GraphProxyAdmin.acceptOwnership","networkInteraction":{"data":"0x79ba5097","id":1,"to":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"GraphHorizon_Deploy#GraphProxyAdmin~GraphProxyAdmin.acceptOwnership","networkInteractionId":1,"nonce":17,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"GraphHorizon_Deploy#GraphProxyAdmin~GraphProxyAdmin.acceptOwnership","networkInteractionId":1,"nonce":17,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x61e583fc208cf5ba2a8bed0f7d880dc2b2bed92efacea3f982ba79dc400de8c3"},"type":"TRANSACTION_SEND"} +{"futureId":"GraphHorizon_Deploy#Controller~Controller.acceptOwnership","hash":"0x2b9a28aeba3c4895daab3167d685c6d91bc7d7cb568b0a66e8dcde28c63f56d5","networkInteractionId":1,"receipt":{"blockHash":"0x1d17c2ed5ddb1216939b2fe29f4ef2d220e064e579dfd6e788a8f8871e9414b4","blockNumber":152513320,"logs":[{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x","logIndex":0,"topics":["0x0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]},{"address":"0x0750EdA3185C758247E97819074bCD217a815FaE","data":"0x","logIndex":1,"topics":["0x76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","0x0000000000000000000000000000000000000000000000000000000000000000"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Deploy#Controller~Controller.acceptOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"GraphHorizon_Deploy#GraphProxyAdmin~GraphProxyAdmin.acceptOwnership","hash":"0x61e583fc208cf5ba2a8bed0f7d880dc2b2bed92efacea3f982ba79dc400de8c3","networkInteractionId":1,"receipt":{"blockHash":"0x203b25b47f27eda7aade88bef7d27b9bb9ea2d92ead03d12bacb3d1677844599","blockNumber":152513331,"logs":[{"address":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","data":"0x","logIndex":0,"topics":["0x0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b"]},{"address":"0x1CEBe1C314Cc454baf4bd553409d957C833623c0","data":"0x","logIndex":1,"topics":["0x76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d","0x000000000000000000000000ad834c286a9b590f8264c8d9574fafcbbbe90b3b","0x0000000000000000000000000000000000000000000000000000000000000000"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"GraphHorizon_Deploy#GraphProxyAdmin~GraphProxyAdmin.acceptOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"artifactId":"DisputeManager#DisputeManager","constructorArgs":["0x0750EdA3185C758247E97819074bCD217a815FaE"],"contractName":"DisputeManager","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"DisputeManager#DisputeManager","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"DisputeManager#DisputeManager","networkInteraction":{"data":"0x6101c060405234801561001157600080fd5b50604051613b6e380380613b6e8339810160408190526100309161049b565b806001600160a01b03811661007a5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b29061033b565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100e59061033b565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b602082015261011e9061033b565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b60208201526101589061033b565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b60208201526101909061033b565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101cb9061033b565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b60208201526102099061033b565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b60208201526102459061033b565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027a9061033b565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103249790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a4506103356103e9565b50610519565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161037691815260200190565b602060405180830381865afa158015610393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b7919061049b565b9050826001600160a01b0382166103e25760405163218f5add60e11b815260040161007191906104cb565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104395760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146104985780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156104ad57600080fd5b81516001600160a01b03811681146104c457600080fd5b9392505050565b602081526000825180602084015260005b818110156104f957602081860181015160408684010152016104dc565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516135f261057c60003960005050600050506000505060005050600050506000505060005050600050506000611f23015260006119cc01526135f26000f3fe608060405234801561001057600080fd5b50600436106101a15760003560e01c8063050b17ad146101a65780630533e1ba146101bb5780630bc7344b146101e857806311be1997146101fb578063169729781461027857806317337b461461028b5780631792f1941461029557806326058249146102a857806329e03ff1146102c857806336167e03146102df5780634bc5839a146102f25780635aea0ec4146103055780635bf31d4d146103265780636369df6b146103405780636cc6cde114610353578063715018a61461036657806376c993ae1461036e5780638d4e9008146103815780638da5cb5b14610394578063902a49381461039c5780639334ea52146103ac57806393a90a1e146103bf5780639f81a7cf146103d2578063b0e2f7e9146103e5578063b0eefabe146103f8578063bb2a2b471461040b578063be41f38414610419578063c133b4291461043c578063c50a77b11461044f578063c894222e14610462578063c9747f5114610483578063cc2d55cd14610496578063d36fc9d4146104a5578063d76f62d1146104b8578063f2fde38b146104cb575b600080fd5b6101b96101b4366004612c8a565b6104de565b005b6036546101d290600160201b900463ffffffff1681565b6040516101df9190612cac565b60405180910390f35b6101b96101f6366004612cf9565b6105fc565b610263610209366004612d72565b603760205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b039687169796909516959394929360ff80841694610100909404169289565b6040516101df99989796959493929190612db5565b6101b9610286366004612d72565b610734565b6101d26207a12081565b6101b96102a3366004612d72565b610748565b6033546102bb906001600160a01b031681565b6040516101df9190612e20565b6102d160355481565b6040519081526020016101df565b6101b96102ed366004612d72565b6108a8565b6102d1610300366004612e34565b6109ae565b603454600160a01b90046001600160401b03165b6040516101df9190612e60565b60345461031990600160a01b90046001600160401b031681565b6102d161034e366004612e74565b6109e6565b6034546102bb906001600160a01b031681565b6101b96109ff565b6101b961037c366004612e8f565b610a13565b6102d161038f366004612eac565b610a24565b6102bb610dc5565b6036546101d29063ffffffff1681565b6101b96103ba366004612d72565b610de0565b6101b96103cd366004612ef2565b610edf565b6101b96103e0366004612e8f565b610ef0565b6101b96103f3366004612f1d565b610f01565b6101b9610406366004612ef2565b611062565b60365463ffffffff166101d2565b61042c610427366004612d72565b611073565b60405190151581526020016101df565b6102d161044a366004612ef2565b6110a9565b6102d161045d366004612fa4565b611141565b610475610470366004612fe5565b6111d4565b6040516101df929190613054565b6102bb6104913660046130fa565b6113e2565b6102d1670de0b6b3a764000081565b61042c6104b336600461317c565b6114cd565b6101b96104c63660046131b2565b6114f5565b6101b96104d9366004612ef2565b611506565b6034546001600160a01b031633146105095760405163a8baf3bb60e01b815260040160405180910390fd5b8161051381611073565b819061053e576040516314a03bbd60e21b815260040161053591815260200190565b60405180910390fd5b506004600082815260376020526040902060040154610100900460ff16600581111561056c5761056c612d8b565b600083815260376020526040902060040154610100900460ff1691146105a65760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600301548390156105dc576040516364d0c32b60e01b815260040161053591815260200190565b5060008381526037602052604090206105f6848285611541565b50505050565b60006106066115f2565b805490915060ff600160401b82041615906001600160401b031660008115801561062d5750825b90506000826001600160401b031660011480156106495750303b155b905081158015610657575080155b156106755760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561069e57845460ff60401b1916600160401b1785555b6106a78b61161b565b6106af61162c565b6106b88a61163c565b6106c1896116ad565b6106ca88611736565b6106d387611799565b6106dc8661180b565b831561072757845460ff60401b191685556040517fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29061071e90600190612e60565b60405180910390a15b5050505050505050505050565b61073c611892565b61074581611736565b50565b8061075281611073565b8190610774576040516314a03bbd60e21b815260040161053591815260200190565b506000818152603760205260409020600101546001600160a01b031633146107af5760405163082c005560e41b815260040160405180910390fd5b816107b981611073565b81906107db576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561080957610809612d8b565b600083815260376020526040902060040154610100900460ff1691146108435760405163146e540f60e21b815260040161053591906131cf565b506000838152603760205260409020600681015442101561087757604051631d7753d560e11b815260040160405180910390fd5b61088184826118c4565b6003810154156105f657600381015460008181526037602052604090206105f691906118c4565b6034546001600160a01b031633146108d35760405163a8baf3bb60e01b815260040160405180910390fd5b806108dd81611073565b81906108ff576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff16600581111561092d5761092d612d8b565b600083815260376020526040902060040154610100900460ff1691146109675760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020600381015483901561099e576040516364d0c32b60e01b815260040161053591815260200190565b506109a9838261194b565b505050565b60006109cf336035546109bf6119ca565b6001600160a01b031691906119ee565b6109dd336035548585611aa6565b90505b92915050565b60006109e06109fa368490038401846131dd565b611e28565b610a07611892565b610a116000611ec5565b565b610a1b611892565b61074581611799565b6034546000906001600160a01b03163314610a525760405163a8baf3bb60e01b815260040160405180910390fd5b6040516001600160601b0319606087901b166020820152656c656761637960d01b6034820152600090603a016040516020818303038152906040528051906020012090506000610aa0611f21565b6001600160a01b0316630e022923886040518263ffffffff1660e01b8152600401610acb9190612e20565b61012060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906132d9565b519050866001600160a01b038216610b39576040516334789d8b60e21b81526004016105359190612e20565b5060408051610120810182526001600160a01b038381168252881660208201526000918101829052606081019190915260036080820152600160a08201524260c0820181905260345460e0830191610ba191600160a01b90046001600160401b03169061330c565b81526000602091820181905284815260378252604090819020835181546001600160a01b039182166001600160a01b0319918216178355938501516001808401805492909316919095161790559083015160028201556060830151600380830191909155608084015160048301805493949193909260ff1990911691908490811115610c2f57610c2f612d8b565b021790555060a082015160048201805461ff001916610100836005811115610c5957610c59612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101556000610c89611f45565b9050806001600160a01b031663cb8347fe838888604051602001610cae929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610cda929190613365565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b50505050610d298786610d196119ca565b6001600160a01b03169190611f81565b604080516001600160a01b038a81168252602082018990529181018790528189169184169085907f587a1fc7e80e653a2ab7f63f98c080f5818b8cedcfd1374590c8c786290ed0319060600160405180910390a4866001600160a01b0316826001600160a01b03168460008051602061359d83398151915288604051610db191815260200190565b60405180910390a450909695505050505050565b600080610dd0611fbc565b546001600160a01b031692915050565b6034546001600160a01b03163314610e0b5760405163a8baf3bb60e01b815260040160405180910390fd5b80610e1581611073565b8190610e37576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610e6557610e65612d8b565b600083815260376020526040902060040154610100900460ff169114610e9f5760405163146e540f60e21b815260040161053591906131cf565b506000828152603760205260409020610eb88382611fe0565b6003810154156109a957600381015460008181526037602052604090206109a99190611fe0565b610ee7611892565b6107458161205f565b610ef8611892565b6107458161180b565b6034546001600160a01b03163314610f2c5760405163a8baf3bb60e01b815260040160405180910390fd5b83610f3681611073565b8190610f58576040516314a03bbd60e21b815260040161053591815260200190565b506004600082815260376020526040902060040154610100900460ff166005811115610f8657610f86612d8b565b600083815260376020526040902060040154610100900460ff169114610fc05760405163146e540f60e21b815260040161053591906131cf565b5060008581526037602052604090206003015415158590610ffa57604051600162d62c0760e01b0319815260040161053591815260200190565b506000858152603760205260409020611014868287611541565b831561103d5760038101546000818152603760205260409020611038919085611541565b61105a565b6003810154600081815260376020526040902061105a9190611fe0565b505050505050565b61106a611892565b6107458161163c565b600080600083815260376020526040902060040154610100900460ff1660058111156110a1576110a1612d8b565b141592915050565b6000806110b4611f21565b6001600160a01b03166325d9897e846110cb611f45565b6040518363ffffffff1660e01b81526004016110e8929190613389565b61014060405180830381865afa158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a91906133b9565b905061113a8382600001516120d0565b9392505050565b6000611152336035546109bf6119ca565b6109dd3360355461119886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b6000806000339050600061121d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b9050600061126087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061216592505050565b905061126c82826125a4565b825160208085015160408087015186519387015191870151949592949093926112cb57604051636aba529760e11b81526004810196909652602486019490945260448501929092526064840152608483015260a482015260c401610535565b5050505050506112e0336035546109bf6119ca565b60006113328460026035546112f59190613466565b858d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b905060006113868560026035546113499190613466565b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122a592505050565b60008381526037602052604080822060039081018490558383528183200185905551919250829184917ffec135a4cf8e5c6e13dea23be058bf03a8bf8f1f6fb0a021b0a5aeddfba8140791a3909a909950975050505050505050565b6000806113ee836125d5565b905060006113fa611f45565b6001600160a01b0316630e022923836040518263ffffffff1660e01b81526004016114259190612e20565b61012060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146791906132d9565b805190915082906001600160a01b0316611495576040516334789d8b60e21b81526004016105359190612e20565b5060408401516020820151908181146114c357604051630a24cfe560e21b8152600401610535929190613054565b5050519392505050565b60006109dd6114e1368590038501856130fa565b6114f0368590038501856130fa565b6125a4565b6114fd611892565b610745816116ad565b61150e611892565b6001600160a01b038116611538576000604051631e4fbdf760e01b81526004016105359190612e20565b61074581611ec5565b81546007830154600091611562916001600160a01b0390911690849061265e565b60048401805461ff001916610100179055600184015460028501549192506115a2916001600160a01b039091169061159a908461330c565b610d196119ca565b6001830154835460028501546001600160a01b039283169290911690869060008051602061359d833981519152906115db90869061330c565b60405190815260200160405180910390a450505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109e0565b61162361280f565b61074581612834565b61163461280f565b610a1161283c565b6001600160a01b0381166116635760405163616bc44160e11b815260040160405180910390fd5b603480546001600160a01b0319166001600160a01b0383169081179091556040517f51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e90600090a250565b806001600160401b03166000036116d75760405163c4411f1160e01b815260040160405180910390fd5b60348054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517f310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e69061172b908390612e60565b60405180910390a150565b80670de0b6b3a76400008110156117635760405163033f4e0560e01b815260040161053591815260200190565b5060358190556040518181527f97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f89060200161172b565b806207a12063ffffffff821611156117c55760405163432e664360e11b81526004016105359190612cac565b506036805463ffffffff191663ffffffff83161790556040517fc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab9061172b908390612cac565b8063ffffffff8116620f4240101561183757604051634e9374fb60e11b81526004016105359190612cac565b506036805463ffffffff60201b1916600160201b63ffffffff848116820292909217928390556040517f7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d6805029361172b9392900490911690612cac565b3361189b610dc5565b6001600160a01b031614610a11573360405163118cdaa760e01b81526004016105359190612e20565b60048101805461ff001916610500179055600181015460028201546118f5916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f223103f8eb52e5f43a75655152acd882a605d70df57a5c0fefd30f516b1756d2906020015b60405180910390a45050565b60048101805461ff001916610200179055600281015461197c9061196d6119ca565b6001600160a01b03169061290e565b6001810154815460028301546040519081526001600160a01b03928316929091169084907f2226ebd23625a7938fb786df2248bd171d2e6ad70cb2b654ea1be830ca17224d9060200161193f565b7f000000000000000000000000000000000000000000000000000000000000000090565b80156109a9576040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6e9190613488565b6109a95760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b6044820152606401610535565b6040516001600160601b0319606084901b166020820152603481018290526000908190605401604051602081830303815290604052805190602001209050611aed81611073565b158190611b105760405163124a23f160e11b815260040161053591815260200190565b506000611b1b611f45565b90506000816001600160a01b0316630e022923876040518263ffffffff1660e01b8152600401611b4b9190612e20565b61012060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d91906132d9565b8051909150866001600160a01b038216611bbb576040516334789d8b60e21b81526004016105359190612e20565b506000611bc6611f21565b6001600160a01b03166325d9897e83866040518363ffffffff1660e01b8152600401611bf3929190613389565b61014060405180830381865afa158015611c11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3591906133b9565b8051909150600003611c5a5760405163307efdb760e11b815260040160405180910390fd5b6000611c6a8383600001516120d0565b603454909150600090611c8d90600160a01b90046001600160401b03164261330c565b604080516101208101825287516001600160a01b0390811682528f1660208201529081018d905260006060820152909150608081016001815260200160048152426020808301919091526040808301859052606092830186905260008b815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff19909216918490811115611d6457611d64612d8b565b021790555060a082015160048201805461ff001916610100836005811115611d8e57611d8e612d8b565b021790555060c0820151600582015560e08201516006820155610100909101516007909101558451604080518d81526001600160a01b038d811660208301529181018c90526060810185905260808101849052818f16929091169089907f8a1eccecce948a912e2e195de5960359755aeac90ad88a3fde55a77e1a73796b9060a00160405180910390a450949a9950505050505050505050565b600054815160208084015160409485015185517f32dd026408194a0d7e54cc66a2ab6c856efc55cfcd4dd258fde5b1a55222baa6818501528087019490945260608401919091526080808401919091528451808403909101815260a08301855280519082012061190160f01b60c084015260c283019390935260e28083019390935283518083039093018352610102909101909252805191012090565b6000611ecf611fbc565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6033546000906001600160a01b0316611f715760405163bd088b4f60e01b815260040160405180910390fd5b506033546001600160a01b031690565b80156109a95760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611a2b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b60048101805461ff00191661030017905560018101546002820154612011916001600160a01b031690610d196119ca565b6001810154815460028301546040519081526001600160a01b03928316929091169084907ff0912efb86ea1d65a17d64d48393cdb1ca0ea5220dd2bbe438621199d30955b79060200161193f565b6001600160a01b0381166120865760405163616bc44160e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0383169081179091556040517f81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c790600090a250565b6000806120db611f21565b6001600160a01b031663561285e4856120f2611f45565b6040518363ffffffff1660e01b815260040161210f929190613389565b60a060405180830381865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215091906134a5565b51905061215d818461330c565b949350505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915260016121a460208061330c565b6121ae919061330c565b6121b990606061330c565b82519081149060016121cc60208061330c565b6121d6919061330c565b6121e190606061330c565b909161220257604051633fdf342360e01b8152600401610535929190613054565b505060008060008480602001905181019061221d9190613524565b925092509250600061223086606061296e565b90506000612249876122446020606061330c565b61296e565b9050600061226d88602061225e81606061330c565b612268919061330c565b6129b9565b6040805160c081018252978852602088019690965294860193909352606085019190915260808401525060ff1660a082015292915050565b6000806122b1846113e2565b905060006122bd611f21565b6001600160a01b03166325d9897e836122d4611f45565b6040518363ffffffff1660e01b81526004016122f1929190613389565b61014060405180830381865afa15801561230f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233391906133b9565b80519091506000036123585760405163307efdb760e11b815260040160405180910390fd5b84516020808701516040808901518151938401949094528201526060808201929092526001600160601b031984831b811660808301529189901b909116609482015260009060a8016040516020818303038152906040528051906020012090506123c181611073565b1581906123e45760405163124a23f160e11b815260040161053591815260200190565b5060006123f58484600001516120d0565b60345490915060009061241890600160a01b90046001600160401b03164261330c565b60408051610120810182526001600160a01b0380891682528d1660208201529081018b9052600060608201529091506080810160028152602001600481524260208083019190915260408083018590526060928301869052600087815260378352819020845181546001600160a01b039182166001600160a01b0319918216178355938601516001808401805492909316919095161790559084015160028201559183015160038084019190915560808401516004840180549193909260ff199092169184908111156124ed576124ed612d8b565b021790555060a082015160048201805461ff00191661010083600581111561251757612517612d8b565b021790555060c0820151816005015560e082015181600601556101008201518160070155905050896001600160a01b0316856001600160a01b0316847ffb70faf7306b83c2cec6d8c1627baad892cb79968a02cc0353174499ecfd8b358c8c604001518c878960405161258e959493929190613552565b60405180910390a4509098975050505050505050565b805182516000911480156125bf575081604001518360400151145b80156109dd575050602090810151910151141590565b60408051606081018252825181526020808401519082015282820151918101919091526000908161260582611e28565b905061215d81856060015186608001518760a0015160405160200161264a93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052612a04565b600080612669611f45565b90506000612675611f21565b6001600160a01b03166325d9897e87846040518363ffffffff1660e01b81526004016126a2929190613389565b61014060405180830381865afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e491906133b9565b60365490915060009061270990869063ffffffff600160201b909104811690612a2e16565b9050851580159061271a5750808611155b8682909161273d5760405163cc6b7c4160e01b8152600401610535929190613054565b5050600061274f878460000151612a8e565b60608401516036549192506000916127709163ffffffff9081169116612a8e565b9050600061277e8284612a2e565b9050856001600160a01b031663cb8347fe8b8b846040516020016127a3929190613054565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016127cf929190613365565b600060405180830381600087803b1580156127e957600080fd5b505af11580156127fd573d6000803e3d6000fd5b50929c9b505050505050505050505050565b612817612aa5565b610a1157604051631afcd79f60e31b815260040160405180910390fd5b61150e61280f565b61284461280f565b604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647260208201527f171a7fa058648750a8c5aae430f30db8d0100efc3a5e1b2e8054b1c1ce28b6b4918101919091527f044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d60608201524660808201523060a08201527fa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c260c082015260e00160408051601f198184030181529190528051602090910120600055565b801561296a57604051630852cd8d60e31b8152600481018290526001600160a01b038316906342966c6890602401600060405180830381600087803b15801561295657600080fd5b505af115801561105a573d6000803e3d6000fd5b5050565b600061297b60208361330c565b8351908110159061298d60208561330c565b90916129ae57604051633fdf342360e01b8152600401610535929190613054565b505050016020015190565b60006129c660018361330c565b835190811015906129d860018561330c565b90916129f957604051633fdf342360e01b8152600401610535929190613054565b505050016001015190565b600080600080612a148686612abf565b925092509250612a248282612b0c565b5090949350505050565b6000612a3d83620f4240101590565b80612a505750612a5082620f4240101590565b83839091612a735760405163768bf0eb60e11b8152600401610535929190613054565b50620f42409050612a848385613585565b6109dd9190613466565b600081831115612a9e57816109dd565b5090919050565b6000612aaf6115f2565b54600160401b900460ff16919050565b60008060008351604103612af95760208401516040850151606086015160001a612aeb88828585612bc5565b955095509550505050612b05565b50508151600091506002905b9250925092565b6000826003811115612b2057612b20612d8b565b03612b29575050565b6001826003811115612b3d57612b3d612d8b565b03612b5b5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115612b6f57612b6f612d8b565b03612b905760405163fce698f760e01b815260048101829052602401610535565b6003826003811115612ba457612ba4612d8b565b0361296a576040516335e2f38360e21b815260048101829052602401610535565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115612bf65750600091506003905082612c80565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612c4a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c7657506000925060019150829050612c80565b9250600091508190505b9450945094915050565b60008060408385031215612c9d57600080fd5b50508035926020909101359150565b63ffffffff91909116815260200190565b6001600160a01b038116811461074557600080fd5b6001600160401b038116811461074557600080fd5b63ffffffff8116811461074557600080fd5b60008060008060008060c08789031215612d1257600080fd5b8635612d1d81612cbd565b95506020870135612d2d81612cbd565b94506040870135612d3d81612cd2565b9350606087013592506080870135612d5481612ce7565b915060a0870135612d6481612ce7565b809150509295509295509295565b600060208284031215612d8457600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b60068110612db157612db1612d8b565b9052565b6001600160a01b038a81168252891660208201526040810188905260608101879052610120810160048710612dec57612dec612d8b565b866080830152612dff60a0830187612da1565b8460c08301528360e0830152826101008301529a9950505050505050505050565b6001600160a01b0391909116815260200190565b60008060408385031215612e4757600080fd5b8235612e5281612cbd565b946020939093013593505050565b6001600160401b0391909116815260200190565b60006060828403128015612e8757600080fd5b509092915050565b600060208284031215612ea157600080fd5b813561113a81612ce7565b60008060008060808587031215612ec257600080fd5b8435612ecd81612cbd565b93506020850135612edd81612cbd565b93969395505050506040820135916060013590565b600060208284031215612f0457600080fd5b813561113a81612cbd565b801515811461074557600080fd5b60008060008060808587031215612f3357600080fd5b84359350602085013592506040850135612f4c81612f0f565b9396929550929360600135925050565b60008083601f840112612f6e57600080fd5b5081356001600160401b03811115612f8557600080fd5b602083019150836020828501011115612f9d57600080fd5b9250929050565b60008060208385031215612fb757600080fd5b82356001600160401b03811115612fcd57600080fd5b612fd985828601612f5c565b90969095509350505050565b60008060008060408587031215612ffb57600080fd5b84356001600160401b0381111561301157600080fd5b61301d87828801612f5c565b90955093505060208501356001600160401b0381111561303c57600080fd5b61304887828801612f5c565b95989497509550505050565b918252602082015260400190565b60405160c081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405290565b60405161012081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561309257634e487b7160e01b600052604160045260246000fd5b600060c082840312801561310d57600080fd5b506000613118613062565b833581526020808501359082015260408085013590820152606080850135908201526080808501359082015260a084013560ff81168114613157578283fd5b60a0820152949350505050565b600060c0828403121561317657600080fd5b50919050565b600080610180838503121561319057600080fd5b61319a8484613164565b91506131a98460c08501613164565b90509250929050565b6000602082840312156131c457600080fd5b813561113a81612cd2565b602081016109e08284612da1565b600060608284031280156131f057600080fd5b50604051600090606081016001600160401b038111828210171561322257634e487b7160e01b83526041600452602483fd5b604090815284358252602080860135908301529384013593810193909352509092915050565b805161325381612cbd565b919050565b6000610120828403121561326b57600080fd5b613273613098565b905061327e82613248565b81526020828101519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e080830151908201526101009182015191810191909152919050565b600061012082840312156132ec57600080fd5b6109dd8383613258565b634e487b7160e01b600052601160045260246000fd5b808201808211156109e0576109e06132f6565b6000815180845260005b8181101561334557602081850181015186830182015201613329565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061215d9083018461331f565b6001600160a01b0392831681529116602082015260400190565b805161325381612ce7565b805161325381612cd2565b60006101408284031280156133cd57600080fd5b5060006133d86130c9565b8351815260208085015190820152604080850151908201526133fc606085016133a3565b606082015261340d608085016133ae565b608082015261341e60a085016133ae565b60a082015261342f60c085016133a3565b60c082015261344060e085016133ae565b60e082015261010084810151908201526101209384015193810193909352509092915050565b60008261348357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561349a57600080fd5b815161113a81612f0f565b600060a08284031280156134b857600080fd5b5060405160009060a081016001600160401b03811182821017156134ea57634e487b7160e01b83526041600452602483fd5b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b60008060006060848603121561353957600080fd5b5050815160208301516040909301519094929350919050565b85815284602082015260a06040820152600061357160a083018661331f565b606083019490945250608001529392505050565b80820281158282048414176109e0576109e06132f656fe6d800aaaf64b9a1f321dcd63da04369d33d8a0d49ad0fbba085aab4a98bf31c4a2646970667358221220d50b3dec1e5d2d1d140733dca7d5163900c1fc882947b3208864910c6f452d0e64736f6c634300081b00330000000000000000000000000750eda3185c758247e97819074bcd217a815fae","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"DisputeManager#DisputeManager","networkInteractionId":1,"nonce":1645,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"DisputeManager#DisputeManager","networkInteractionId":1,"nonce":1645,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x525564dabe54e35e863db1333ed6de28d8c426663bf174e23acb630760bd8274"},"type":"TRANSACTION_SEND"} +{"artifactId":"DisputeManager#DisputeManagerProxy","contractAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","contractName":"DisputeManagerProxy","dependencies":[],"futureId":"DisputeManager#DisputeManagerProxy","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"DisputeManager#ProxyAdmin","contractAddress":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","contractName":"ProxyAdmin","dependencies":[],"futureId":"DisputeManager#ProxyAdmin","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"L2Curation#L2CurationAddressBook","contractAddress":"0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4","contractName":"L2CurationAddressBook","dependencies":[],"futureId":"L2Curation#L2CurationAddressBook","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"L2Curation#L2CurationImplementationAddressBook","contractAddress":"0x9CCD9B656f8A558879974ef2505496eEd7Ef7210","contractName":"L2CurationImplementationAddressBook","dependencies":[],"futureId":"L2Curation#L2CurationImplementationAddressBook","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphService#ProxyAdmin","contractAddress":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","contractName":"ProxyAdmin","dependencies":[],"futureId":"SubgraphService#ProxyAdmin","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphService#SubgraphService","constructorArgs":["0x0750EdA3185C758247E97819074bCD217a815FaE","0x1A7Fb71014d4395903eC56662f32dD02344D361C","0xB63bC33D13F73eFD14d32D2b9FC0B6116B6611CE","0xe135BFD9E51BbAfCeBb0141af85F0bc6DA1b3BA4"],"contractName":"SubgraphService","dependencies":[],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","futureId":"SubgraphService#SubgraphService","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#SubgraphService","networkInteraction":{"data":"0x61024060405234801561001157600080fd5b5060405161667738038061667783398101604081905261003091610541565b3083838387806001600160a01b03811661007f5760405163218f5add60e11b815260206004820152600a60248201526921b7b73a3937b63632b960b11b60448201526064015b60405180910390fd5b6001600160a01b0381166101005260408051808201909152600a81526923b930b8342a37b5b2b760b11b60208201526100b7906103c5565b6001600160a01b03166080526040805180820190915260078152665374616b696e6760c81b60208201526100ea906103c5565b6001600160a01b031660a05260408051808201909152600d81526c47726170685061796d656e747360981b6020820152610123906103c5565b6001600160a01b031660c05260408051808201909152600e81526d5061796d656e7473457363726f7760901b602082015261015d906103c5565b6001600160a01b031660e05260408051808201909152600c81526b22b837b1b426b0b730b3b2b960a11b6020820152610195906103c5565b6001600160a01b03166101205260408051808201909152600e81526d2932bbb0b93239a6b0b730b3b2b960911b60208201526101d0906103c5565b6001600160a01b0316610140526040805180820190915260118152704772617068546f6b656e4761746577617960781b602082015261020e906103c5565b6001600160a01b03166101605260408051808201909152600f81526e23b930b834283937bc3ca0b236b4b760891b602082015261024a906103c5565b6001600160a01b03166101805260408051808201909152600881526721bab930ba34b7b760c11b602082015261027f906103c5565b6001600160a01b039081166101a08190526101005160a05160805160c05160e05161012051610140516101605161018051604051988b169a9788169996909716977fef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43976103299790916001600160a01b03978816815295871660208701529386166040860152918516606085015284166080840152831660a083015290911660c082015260e00190565b60405180910390a450506001600160a01b038481166101c08190528482166101e08190528483166102008190529284166102208190526040805193845260208401929092529082019290925260608101919091527f4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda79060800160405180910390a1505050506103bc61047360201b60201c565b50505050610605565b600080610100516001600160a01b031663f7641a5e84805190602001206040518263ffffffff1660e01b815260040161040091815260200190565b602060405180830381865afa15801561041d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104419190610595565b9050826001600160a01b03821661046c5760405163218f5add60e11b815260040161007691906105b7565b5092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156104c35760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146105225780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b038116811461053c57600080fd5b919050565b6000806000806080858703121561055757600080fd5b61056085610525565b935061056e60208601610525565b925061057c60408601610525565b915061058a60608601610525565b905092959194509250565b6000602082840312156105a757600080fd5b6105b082610525565b9392505050565b602081526000825180602084015260005b818110156105e557602081860181015160408684010152016105c8565b506000604082850101526040601f19601f83011684010191505092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516102005161022051615fd961069e6000396000612ee2015260006132de01526000818161163b0152612fe101526000505060005050600050506000505060006137080152600061457c01526000505060005050600050506000611b6b01526000613a640152615fd96000f3fe608060405234801561001057600080fd5b506004361061023b5760003560e01c806307e736d8146102405780630e02292314610280578063138dea081461030857806313c474c9146103205780631dd42f60146103755780631ebb7c301461038a57806324b8fbf6146103af57806335577962146103c25780633f4ba83a146103d557806345f54485146103dd578063482468b7146103f05780634f793cdc1461040657806355c85269146104285780635c975abb146104725780636234e2161461048a5780636ccec5b8146104aa5780636d9a3951146104bd578063715018a61461053857806371ce020a146105405780637aa31bce146105565780637dfe6d28146105695780637e89bac31461057c5780638180083b1461058f578063819ba366146105a257806381e777a7146105b8578063832bc923146105cb5780638456cb59146105de57806384b0196e146105e657806385e82baf146106015780638da5cb5b1461060a5780639384e07814610612578063ac9650d814610635578063b15d2a2c14610655578063ba38f67d14610668578063c0f474971461067b578063c84a5ef314610683578063cb8347fe14610696578063cbe5f3f2146106a9578063ce0fc0cc146106c9578063ce56c98b146106dc578063d07a7a84146106ef578063db9bee46146106f9578063dedf672614610701578063e2e1e8e914610714578063e6f5005414610734578063ebf6ddaf14610747578063ec9c218d1461074f578063eff0f59214610762578063f2fde38b14610797575b600080fd5b61026a61024e36600461502b565b610109602052600090815260409020546001600160a01b031681565b6040516102779190615048565b60405180910390f35b61029361028e36600461502b565b6107aa565b604051610277919060006101208201905060018060a01b0383511682526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b6103126101085481565b604051908152602001610277565b61035561032e36600461502b565b609c6020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610277565b61038861038336600461506e565b610837565b005b600254600160c01b900463ffffffff1660405163ffffffff9091168152602001610277565b6103886103bd3660046150cc565b610850565b6103886103d036600461512e565b610a7d565b610388610a93565b6103886103eb366004615167565b610acf565b6103f8610ad9565b604051610277929190615180565b61041961041436600461502b565b610aec565b604051610277939291906151e7565b61043b61043636600461502b565b610c20565b6040805196151587526001600160a01b039095166020870152938501929092526060840152608083015260a082015260c001610277565b61047a610cdc565b6040519015158152602001610277565b61031261049836600461502b565b60d16020526000908152604090205481565b6103886104b836600461502b565b610cf1565b6105146104cb36600461502b565b604080518082018252600080825260209182018190526001600160a01b03938416815260d082528290208251808401909352805490931682526001909201549181019190915290565b6040805182516001600160a01b031681526020928301519281019290925201610277565b610388610cfb565b610548610d0d565b60405161027792919061521c565b610388610564366004615167565b610d18565b610388610577366004615236565b610d29565b61038861058a366004615167565b610d41565b61038861059d3660046150cc565b610db6565b6105aa610f44565b604051610277929190615277565b6103886105c6366004615236565b610f54565b6103886105d9366004615167565b6110c4565b6103886110d8565b6105ee611112565b6040516102779796959493929190615285565b61031260d25481565b61026a6111bb565b61047a61062036600461502b565b60676020526000908152604090205460ff1681565b61064861064336600461531d565b6111d6565b6040516102779190615392565b6103126106633660046153f7565b6112be565b61047a61067636600461502b565b611492565b61026a6114b0565b61038861069136600461545f565b6114ba565b6103886106a43660046150cc565b611638565b6103126106b736600461502b565b609a6020526000908152604090205481565b6103886106d73660046150cc565b611777565b6103126106ea3660046154a7565b611860565b6103126101075481565b61026a611873565b61038861070f3660046150cc565b61187d565b610312610722366004615167565b600090815260d3602052604090205490565b610388610742366004615167565b611a0b565b61026a611a1c565b61038861075d36600461502b565b611a26565b610355610770366004615167565b609b6020526000908152604090208054600182015460028301546003909301549192909184565b6103886107a536600461502b565b611aa8565b6107b2614fae565b506001600160a01b03908116600090815260cf6020908152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015461010082015290565b61083f611ae3565b61084881611b15565b50565b905090565b82610859611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610888939291906154d5565b602060405180830381865afa1580156108a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c991906154f8565b813390916108f55760405163cc5d3c8b60e01b81526004016108ec929190615515565b60405180910390fd5b505083600061090382611b8d565b905061090e81611c90565b610919816000611cce565b610921611db8565b6000808061093187890189615646565b925092509250600083511161095957604051630783843960e51b815260040160405180910390fd5b600082511161097b57604051631e63bd9560e21b815260040160405180910390fd5b6001600160a01b03891660009081526101066020526040902054156109b357604051630d06866d60e21b815260040160405180910390fd5b6040805160608101825242815260208082018681528284018690526001600160a01b038d16600090815261010690925292902081518155915190919060018201906109fe9082615742565b5060408201516002820190610a139082615742565b5050506001600160a01b03811615610a2f57610a2f8982611dde565b886001600160a01b03167f159567bea25499a91f60e1fbb349ff2a1f8c1b2883198f25c1e12c99eddb44fa8989604051610a6a929190615800565b60405180910390a2505050505050505050565b610a85611ae3565b610a8f8282611e35565b5050565b3360008181526067602052604090205460ff16610ac4576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd611eeb565b565b6108483382611f37565b600080610ae4611fdd565b915091509091565b6101066020526000908152604090208054600182018054919291610b0f906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3b906156c1565b8015610b885780601f10610b5d57610100808354040283529160200191610b88565b820191906000526020600020905b815481529060010190602001808311610b6b57829003601f168201915b505050505090806002018054610b9d906156c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906156c1565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905083565b6001600160a01b03808216600090815260cf60209081526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301529081908190819081908190610cb181612054565b81516020830151604084015160c085015160e090950151939c929b5090995097509195509350915050565b600080610ce7612073565b5460ff1692915050565b6108483382611dde565b610d03611ae3565b610acd6000612097565b600080610ae46120f3565b610d20611ae3565b6108488161216a565b610d31611ae3565b610d3c83838361219f565b505050565b610d49611ae3565b610d5681620f4240101590565b8190610d7857604051631c9c717b60e01b81526004016108ec91815260200190565b506101088190556040518181527f6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9906020015b60405180910390a150565b82610dbf611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610dee939291906154d5565b602060405180830381865afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f91906154f8565b81339091610e525760405163cc5d3c8b60e01b81526004016108ec929190615515565b50506001600160a01b0384166000908152610106602052604090205484908190610e905760405163ee27189960e01b81526004016108ec9190615048565b50610e99611db8565b6000610ea78486018661502b565b90506001600160a01b038616610ebe60cf836121f2565b51879183916001600160a01b031614610eec5760405163c0bbff1360e01b81526004016108ec929190615515565b5050610ef9816000612277565b856001600160a01b03167f73330c218a680717e9eee625c262df66eddfdf99ecb388d25f6b32d66b9a318a8686604051610f34929190615800565b60405180910390a2505050505050565b600080610ae46000546001549091565b82610f5d611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b8152600401610f8c939291906154d5565b602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906154f8565b81339091610ff05760405163cc5d3c8b60e01b81526004016108ec929190615515565b5050836000610ffe82611b8d565b905061100981611c90565b611014816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906110505760405163ee27189960e01b81526004016108ec9190615048565b50611059611db8565b6001600160a01b03871661106e60cf886121f2565b51889188916001600160a01b03161461109c5760405163c0bbff1360e01b81526004016108ec929190615515565b50506110bb8686600260189054906101000a900463ffffffff166123d9565b50505050505050565b6110cc611ae3565b610848816000196126d7565b3360008181526067602052604090205460ff16611109576040516372e3ef9760e01b81526004016108ec9190615048565b50610acd612746565b600060608060008060006060600061112861278d565b805490915015801561113c57506001810154155b6111805760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016108ec565b6111886127b1565b611190612852565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000806111c661286f565b546001600160a01b031692915050565b604080516000815260208101909152606090826001600160401b038111156112005761120061552f565b60405190808252806020026020018201604052801561123357816020015b606081526020019060019003908161121e5790505b50915060005b838110156112b5576112903086868481811061125757611257615858565b9050602002810190611269919061586e565b8560405160200161127c939291906158b4565b604051602081830303815290604052612893565b8382815181106112a2576112a2615858565b6020908102919091010152600101611239565b50505b92915050565b6000846112c9611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016112f8939291906154d5565b602060405180830381865afa158015611315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133991906154f8565b8133909161135c5760405163cc5d3c8b60e01b81526004016108ec929190615515565b505085600061136a82611b8d565b905061137581611c90565b611380816000611cce565b6001600160a01b03881660009081526101066020526040902054889081906113bc5760405163ee27189960e01b81526004016108ec9190615048565b506113c5611db8565b6000808960028111156113da576113da6158db565b036113f1576113ea8a8989612909565b9050611430565b6002896002811115611405576114056158db565b03611415576113ea8a8989612e1d565b8860405163047031cf60e41b81526004016108ec9190615913565b886002811115611442576114426158db565b8a6001600160a01b03167f54fe682bfb66381a9382e13e4b95a3dd4f960eafbae063fdea3539d144ff3ff58360405161147d91815260200190565b60405180910390a39998505050505050505050565b60006112b882600260189054906101000a900463ffffffff16612ec1565b600061084b612ee0565b60006114c4612f04565b805490915060ff600160401b82041615906001600160401b03166000811580156114eb5750825b90506000826001600160401b031660011480156115075750303b155b905081158015611515575080155b156115335760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561155c57845460ff60401b1916600160401b1785555b61156589612f2d565b61156d612f3e565b611575612f46565b61157d612f5e565b6115c96040518060400160405280600f81526020016e53756267726170685365727669636560881b815250604051806040016040528060038152602001620312e360ec1b815250612f6e565b6115d5886000196126d7565b6115de87611b15565b6115e786612f88565b831561162d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811682146116855760405163cdc0567f60e01b81526004016108ec929190615515565b50600090508061169783850185615921565b915091506116a3611b69565b6001600160a01b031663e76fede68684846116bc612fdf565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b50505050846001600160a01b03167f02f2e74a11116e05b39159372cceb6739257b08d72f7171d208ff27bb6466c588360405161176891815260200190565b60405180910390a25050505050565b82611780611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016117af939291906154d5565b602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f091906154f8565b813390916118135760405163cc5d3c8b60e01b81526004016108ec929190615515565b505061181d611db8565b61182684613003565b6040516001600160a01b038516907ff53cf6521a1b5fc0c04bffa70374a4dc2e3474f2b2ac1643c3bcc54e2db4a93990600090a250505050565b600061186c8383613076565b9392505050565b600061084b612fdf565b82611886611b69565b6001600160a01b0316637c145cc78230336040518463ffffffff1660e01b81526004016118b5939291906154d5565b602060405180830381865afa1580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f691906154f8565b813390916119195760405163cc5d3c8b60e01b81526004016108ec929190615515565b505083600061192782611b8d565b905061193281611c90565b61193d816000611cce565b6001600160a01b03861660009081526101066020526040902054869081906119795760405163ee27189960e01b81526004016108ec9190615048565b50611982611db8565b6000808080611993898b018b615943565b93509350935093506119bb8b83868685600260189054906101000a900463ffffffff166130e5565b8a6001600160a01b03167fd3803eb82ef5b4cdff8646734ebbaf5b37441e96314b27ffd3d0940f12a038e78b8b6040516119f6929190615800565b60405180910390a25050505050505050505050565b611a13611ae3565b61084881612f88565b600061084b6132dc565b611a2e611db8565b6000611a3b60cf836121f2565b9050611a5260d2548261330090919063ffffffff16565b8290611a7157604051623477b560e51b81526004016108ec9190615048565b50611a7b8161333d565b158290611a9c576040516317c7b35d60e31b81526004016108ec9190615048565b50610a8f826001612277565b611ab0611ae3565b6001600160a01b038116611ada576000604051631e4fbdf760e01b81526004016108ec9190615048565b61084881612097565b33611aec6111bb565b6001600160a01b031614610acd573360405163118cdaa760e01b81526004016108ec9190615048565b6002805463ffffffff60c01b1916600160c01b63ffffffff8416908102919091179091556040519081527f472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f90602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905290611be6611b69565b6001600160a01b03166325d9897e84306040518363ffffffff1660e01b8152600401611c13929190615515565b61014060405180830381865afa158015611c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5591906159d0565b90508060a001516001600160401b0316600014158390611c8957604051637b3c09bf60e01b81526004016108ec9190615048565b5092915050565b6020810151815161084891611ca491615845565b60005460015460405180604001604052806006815260200165746f6b656e7360d01b81525061335c565b600080611cd96120f3565b91509150600083611cee578460800151611cf4565b8460e001515b9050611d42816001600160401b0316846001600160401b0316846001600160401b03166040518060400160405280600d81526020016c1d1a185dda5b99d4195c9a5bd9609a1b81525061335c565b600080611d4d611fdd565b91509150600086611d62578760600151611d68565b8760c001515b9050611dae8163ffffffff168463ffffffff168463ffffffff166040518060400160405280600e81526020016d1b585e15995c9a599a595c90dd5d60921b81525061335c565b5050505050505050565b611dc0610cdc565b15610acd5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038281166000818152610109602052604080822080546001600160a01b0319169486169485179055517e3215dc05a2fc4e6a1e2c2776311d207c730ee51085aae221acc5cbe6fb55c19190a35050565b6001600160a01b0382166000908152606760205260409020548290829060ff161515811514611e8a57604051635e67e54b60e01b81526001600160a01b039092166004830152151560248201526044016108ec565b50506001600160a01b038216600081815260676020908152604091829020805460ff191685151590811790915591519182527fa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789910160405180910390a25050565b611ef3613390565b6000611efd612073565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051610dab9190615048565b6001600160a01b0382166000818152609c60209081526040808320815192830184905282820194909452805180830382018152606090920190528190611f8b9084906133b5906133ca906134c590896134ea565b91509150846001600160a01b03167f13f3fa9f0e54af1af76d8b5d11c3973d7c2aed6312b61efff2f7b49d73ad67eb8383806020019051810190611fcf9190615a7d565b604051611768929190615277565b600080611fe8612fdf565b6001600160a01b031663bb2a2b476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120499190615a96565b92620f424092509050565b60006120638260600151151590565b80156112b8575050608001511590565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b60006120a161286f565b80546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000806000612100612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561213d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121619190615ab3565b93849350915050565b60d28190556040518181527f21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba90602001610dab565b6121ac60d08484846135a4565b80826001600160a01b0316846001600160a01b03167fd54c7abc930f6d506da2d08aa7aead4f2443e1db6d5f560384a2f652ff893e1960405160405180910390a4505050565b6121fa614fae565b6122048383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008909101546101008201529392505050565b600061228460cf846121f2565b905061230f83612292613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016122c391815260200190565b6020604051808303816000875af11580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615a7d565b60cf919061372a565b61231a60cf846137dd565b8051604082015161232d9160d191613893565b806040015160d3600083602001518152602001908152602001600020546123549190615845565b60d3600083602001518152602001908152602001600020819055508060200151836001600160a01b031682600001516001600160a01b03167f08f2f865e0fb62d722a51e4d9873199bf6bf52e7d8ee5a2ee2896c9ef719f5458460400151866040516123cc9291909182521515602082015260400190565b60405180910390a4505050565b60006123e660cf856121f2565b90506123f181612054565b849061241157604051631eb5ff9560e01b81526004016108ec9190615048565b5080604001518314158484909161243d5760405163f32518cd60e01b81526004016108ec929190615ad0565b50506040810151808411156124735761246e612457611b69565b83516124638488615845565b60d192919087613911565b61248c565b815161248c906124838684615845565b60d19190613893565b6000612496613706565b6001600160a01b031663eeac3e0e84602001516040518263ffffffff1660e01b81526004016124c791815260200190565b6020604051808303816000875af11580156124e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250a9190615a7d565b905060006125178461333d565b15612523576000612532565b60c08401516125329083615845565b6001600160a01b038816600090815260cf60205260409020600281018890556006018390559050612561613706565b6001600160a01b031663c8a5f81e84836040518363ffffffff1660e01b815260040161258e929190615277565b602060405180830381865afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf9190615a7d565b6001600160a01b038816600090815260cf6020526040812060070180549091906125fa908490615ae9565b909155505082861115612642576126118387615845565b60d360008660200151815260200190815260200160002060008282546126379190615ae9565b909155506126789050565b61264c8684615845565b60d360008660200151815260200190815260200160002060008282546126729190615845565b90915550505b8360200151876001600160a01b031685600001516001600160a01b03167f6db4a6f9be2d5e72eb2a2af2374ac487971bf342a261ba0bc1cf471bf2a2c31f89876040516126c6929190615277565b60405180910390a450505050505050565b8181808211156126fc5760405163ccccdafb60e01b81526004016108ec929190615277565b5050600082905560018190556040517f90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f5688499061273a9084908490615277565b60405180910390a15050565b61274e611db8565b6000612758612073565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f2a3390565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10090565b606060006127bd61278d565b90508060020180546127ce906156c1565b80601f01602080910402602001604051908101604052809291908181526020018280546127fa906156c1565b80156128475780601f1061281c57610100808354040283529160200191612847565b820191906000526020600020905b81548152906001019060200180831161282a57829003601f168201915b505050505091505090565b6060600061285e61278d565b90508060030180546127ce906156c1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930090565b6060600080846001600160a01b0316846040516128b09190615afc565b600060405180830381855af49150503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128f0565b606091505b5091509150612900858383613a0f565b95945050505050565b6000808061291984860186615b3a565b8151604001519193509150866001600160a01b038281169082161461295357604051631a071d0760e01b81526004016108ec929190615515565b50508151516001600160a01b038111156129835760405163fa4ac7a760e01b81526004016108ec91815260200190565b50815151600061299460cf836121f2565b805190915088906001600160a01b03818116908316146129c957604051634508fbf760e11b81526004016108ec929190615515565b505060208101516129db896000611f37565b60008060006129e8613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612a139190615048565b602060405180830381865afa158015612a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a549190615a7d565b9050612a5e6132dc565b6001600160a01b031663692209ce6000612afc8b612a7a612ee0565b6001600160a01b0316634c4ea0ed8a6040518263ffffffff1660e01b8152600401612aa791815260200190565b602060405180830381865afa158015612ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae891906154f8565b612af3576000613a86565b61010854613a86565b8a6040518463ffffffff1660e01b8152600401612b1b93929190615c71565b6020604051808303816000875af1158015612b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615a7d565b92506000612b6a613a62565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612b959190615048565b602060405180830381865afa158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd69190615a7d565b9050818181811015612bfd57604051639db8bc9560e01b81526004016108ec929190615277565b50612c0a90508282615845565b92505082159050612db457612ca98b6101075484612c289190615ca1565b612c30612fdf565b6001600160a01b0316635aea0ec46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c919190615ab3565b612ca4906001600160401b031642615ae9565b613ada565b8015612db457612cb7613706565b6001600160a01b0316631d1c2fec846040518263ffffffff1660e01b8152600401612ce491815260200190565b6020604051808303816000875af1158015612d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d279190615a7d565b50612d4c612d33612ee0565b82612d3c613a62565b6001600160a01b03169190613c4a565b612d54612ee0565b6001600160a01b0316638157328884836040518363ffffffff1660e01b8152600401612d81929190615277565b600060405180830381600087803b158015612d9b57600080fd5b505af1158015612daf573d6000803e3d6000fd5b505050505b86516020908101516040805186815292830185905282018390526001600160a01b038088169291811691908e16907f184c452047299395d4f7f147eb8e823458a450798539be54aeed978f13d87ba29060600160405180910390a4509998505050505050505050565b6000808080612e2e85870187615cb8565b919450925090506001600160a01b038716612e4a60cf856121f2565b51889185916001600160a01b031614612e785760405163c0bbff1360e01b81526004016108ec929190615515565b50506002546001600160a01b0388811660009081526101096020526040902054612eb692869286928692600160c01b900463ffffffff169116613cf9565b979650505050505050565b6000612ed8612ece611b69565b60d19085856142d6565b159392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006112b8565b612f35614370565b61084881614395565b610acd614370565b612f4e614370565b612f5661439d565b610acd612f3e565b612f66614370565b612f56612f3e565b612f76614370565b612f8082826143df565b610a8f612f3e565b80600003612fa95760405163bc71a04360e01b815260040160405180910390fd5b6101078190556040518181527f2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd2390602001610dab565b7f000000000000000000000000000000000000000000000000000000000000000090565b61300e8160016143f1565b613016611b69565b6001600160a01b0316633a78b732826040518263ffffffff1660e01b81526004016130419190615048565b600060405180830381600087803b15801561305b57600080fd5b505af115801561306f573d6000803e3d6000fd5b5050505050565b600061186c7f4bdee85c4b4a268f4895d1096d553c3e57bb2433c380e7b7ec8cb56cc4f7467384846040516020016130ca939291909283526001600160a01b03918216602084015216604082015260600190565b60405160208183030381529060405280519060200120614408565b6001600160a01b03851661310c57604051634ffdf5ef60e11b815260040160405180910390fd5b613117868684614435565b61312b613122611b69565b60d09087614484565b600061313561457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131969190615a7d565b90506000613226888888886131a9613706565b6001600160a01b031663eeac3e0e8c6040518263ffffffff1660e01b81526004016131d691815260200190565b6020604051808303816000875af11580156131f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132199190615a7d565b60cf94939291908861459e565b905061323e613233611b69565b60d1908a8887613911565b806040015160d3600083602001518152602001908152602001600020546132659190615ae9565b60d36000836020015181526020019081526020016000208190555085876001600160a01b0316896001600160a01b03167fe5e185fab2b992c4727ff702a867d78b15fb176dbaa20c9c312a1c351d3f7f838460400151866040516132ca929190615277565b60405180910390a45050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008061331584606001518560a00151614706565b61331f9042615845565b905061332a84612054565b801561333557508281115b949350505050565b600061334c8260600151151590565b80156112b8575050604001511590565b613367848484614716565b8185858590919293611dae57604051630871e13d60e01b81526004016108ec9493929190615d10565b613398610cdc565b610acd57604051638dfc202b60e01b815260040160405180910390fd5b6000908152609b602052604090206003015490565b6000606060006133d98561472d565b90504281604001511115613401575050604080516020810190915260008152600191506134be565b600080858060200190518101906134189190615d3f565b8451919350915061342d90609a908390613893565b86816001600160a01b03167f4c06b68820628a39c787d2db1faa0eeacd7b9474847b198b1e871fe6e5b93f4485600001518660400151604051613471929190615277565b60405180910390a382516134859083615ae9565b6040805160208101929092526001600160a01b038316908201526060016040516020818303038152906040529550600086945094505050505b9250929050565b6000908152609b60205260408120818155600181018290556002810182905560030155565b60006060876003015483111561351357604051634a411b9d60e11b815260040160405180910390fd5b600083156135215783613527565b88600301545b89549094505b801580159061353c5750600085115b156135955760008061355283898c63ffffffff16565b915091508115613563575050613595565b9650866135718c8c8b6147bb565b92508661357d81615d65565b975050838061358b90615d7c565b945050505061352d565b50989397509295505050505050565b6001600160a01b0380831660009081526020868152604091829020825180840190935280549093168252600190920154918101919091526135e490614842565b15829061360557604051632d7d25f160e21b81526004016108ec9190615048565b506040805180820182526001600160a01b0394851681526020808201938452938516600090815295909352909320905181546001600160a01b03191692169190911781559051600190910155565b6001600160a01b03808216600090815260208481526040808320815161012081018352815490951685526001810154928501929092526002820154908401526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e0840152600881015461010084015290916136de9060600151151590565b83906136fe576040516342daadaf60e01b81526004016108ec9190615048565b509392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006137368484613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201529091506137ad90612054565b600482015484916137d3576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050600601555050565b60006137e98383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061386090612054565b60048201548391613886576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426004909101555050565b806000036138a057505050565b6001600160a01b03821660009081526020849052604090205481808210156138dd57604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03821660009081526020849052604081208054839290613907908490615845565b9091555050505050565b811561306f576001600160a01b03831660009081526020869052604081205461393b908490615ae9565b90506000856001600160a01b031663872d04898630866040518463ffffffff1660e01b815260040161396f93929190615d95565b602060405180830381865afa15801561398c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b09190615a7d565b90508082818111156139d757604051635f8ec70960e01b81526004016108ec929190615277565b50506001600160a01b03851660009081526020889052604081208054869290613a01908490615ae9565b909155505050505050505050565b606082613a2457613a1f82614851565b61186c565b8151158015613a3b57506001600160a01b0384163b155b15613a5b5783604051639996b31560e01b81526004016108ec9190615048565b508061186c565b7f000000000000000000000000000000000000000000000000000000000000000090565b81516040908101516001600160a01b039081166000908152610109602090815290839020549251606093613ac39387938793929091169101615dbe565b604051602081830303815290604052905092915050565b81600003613afb57604051638f4c63d960e01b815260040160405180910390fd5b613b27613b06611b69565b600254609a91908690869063ffffffff600160c01b90910481169061391116565b6001600160a01b0383166000908152609c6020908152604080832060028082015483516001600160601b031930606090811b8216838901528b901b166034820152604880820192909252845180820390920182526068810180865282519287019290922060e882018652898352426088830190815260a883018a815260c8909301898152828a52609b909852959097209151825593516001820155925190830155915160039182015581015490919015613bf55760018201546000908152609b602052604090206003018190555b613bff828261487a565b80856001600160a01b03167f5d9e2c5278e41138269f5f980cfbea016d8c59816754502abc4d2f87aaea987f8686604051613c3b929190615277565b60405180910390a35050505050565b8015610d3c5760405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90613c7e9085908590600401615ad0565b6020604051808303816000875af1158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc191906154f8565b610d3c5760405162461bcd60e51b815260206004820152600960248201526810ba3930b739b332b960b91b60448201526064016108ec565b600080613d0760cf886121f2565b9050613d1281612054565b8790613d3257604051631eb5ff9560e01b81526004016108ec9190615048565b506000613d4a60d2548361330090919063ffffffff16565b158015613d5d5750613d5b8261333d565b155b8015613d6857508615155b8015613de05750816101000151613d7d61457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dde9190615a7d565b115b613deb576000613e61565b613df3613706565b6001600160a01b031663db750926896040518263ffffffff1660e01b8152600401613e1e9190615048565b6020604051808303816000875af1158015613e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e619190615a7d565b9050613ea088613e6f613706565b6001600160a01b031663eeac3e0e85602001516040518263ffffffff1660e01b81526004016122c391815260200190565b613eab60cf8961490d565b613eb660cf896149c3565b60008082156141ef576000613ec9611b69565b8551604051637573ef4f60e01b81526001600160a01b039290921691637573ef4f91613efc913090600290600401615e87565b602060405180830381865afa158015613f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3d9190615a7d565b90506000613f49611b69565b8651604051631584a17960e21b81526001600160a01b03929092169163561285e491613f79913090600401615515565b60a060405180830381865afa158015613f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fba9190615eac565b90506000816020015111613fcf576000613fd9565b613fd98583614a7a565b925082156140ce57613fe9613a62565b6001600160a01b031663095ea7b3613fff611b69565b856040518363ffffffff1660e01b815260040161401d929190615ad0565b6020604051808303816000875af115801561403c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061406091906154f8565b50614069611b69565b865160405163ca94b0e960e01b81526001600160a01b03929092169163ca94b0e99161409b9130908890600401615f1f565b600060405180830381600087803b1580156140b557600080fd5b505af11580156140c9573d6000803e3d6000fd5b505050505b6140d88386615845565b935083156141ec576001600160a01b0388166141df576140f6613a62565b6001600160a01b031663095ea7b361410c611b69565b866040518363ffffffff1660e01b815260040161412a929190615ad0565b6020604051808303816000875af1158015614149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416d91906154f8565b50614176611b69565b8651604051633a30904960e11b81526001600160a01b0392909216916374612092916141a89130908990600401615f1f565b600060405180830381600087803b1580156141c257600080fd5b505af11580156141d6573d6000803e3d6000fd5b505050506141ec565b6141ec8885612d3c613a62565b50505b602084015184516001600160a01b03808d1691167f443f56bd2098d273b8c8120398789a41da5925db4ba2f656813fc5299ac57b1f8686868f8f61423161457a565b6001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561426e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142929190615a7d565b6040516142a496959493929190615f43565b60405180910390a483516142b89088612ec1565b156142c8576142c88a6001612277565b509098975050505050505050565b600080846001600160a01b031663872d04898530866040518463ffffffff1660e01b815260040161430993929190615d95565b602060405180830381865afa158015614326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061434a9190615a7d565b6001600160a01b0385166000908152602088905260409020541115915050949350505050565b614378614ada565b610acd57604051631afcd79f60e31b815260040160405180910390fd5b611ab0614370565b6143a5614370565b6143b260006000196126d7565b6143c06000620f4240614af4565b6143d260006001600160401b03614bc5565b610acd63ffffffff611b15565b6143e7614370565b610a8f8282614c52565b60006143fc83611b8d565b9050610d3c8183611cce565b60006112b8614415614c93565b8360405161190160f01b8152600281019290925260228201526042902090565b600061444a6144448585613076565b83614c9d565b905080836001600160a01b038083169082161461447c57604051638c5b935d60e01b81526004016108ec929190615515565b505050505050565b6001600160a01b0380821660009081526020858152604091829020825180840190935280549093168252600190920154918101919091526144c490614842565b1581906144e557604051632d7d25f160e21b81526004016108ec9190615048565b506040516378eb06b360e11b81526001600160a01b0383169063f1d60d6690614512908490600401615048565b602060405180830381865afa15801561452f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455391906154f8565b15819061457457604051632d7d25f160e21b81526004016108ec9190615048565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6145a6614fae565b6001600160a01b03808716600090815260208a8152604091829020825161012081018452815490941684526001810154918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e0830152600801546101008201526146329060600151151590565b15869061465357604051630bc4def560e01b81526004016108ec9190615048565b505060408051610120810182526001600160a01b0397881681526020808201968752818301958652426060830190815260006080840181815260a0850182815260c0860198895260e0860183815261010087019889529b8d1683529c90935293909320825181546001600160a01b0319169a169990991789559551600189015593516002880155516003870155925160048601559451600585015593516006840155905160078301555160089091015590565b600082821882841102821861186c565b600082841015801561333557505090911115919050565b61475b6040518060800160405280600081526020016000815260200160008152602001600080191681525090565b6000828152609b602090815260409182902082516080810184528154815260018201549281018390526002820154938101939093526003015460608301528390611c895760405163107349a960e21b81526004016108ec91815260200190565b6000808460030154116147e15760405163ddaf8f2160e01b815260040160405180910390fd5b60006147f485600001548563ffffffff16565b905061480785600001548463ffffffff16565b600185600301600082825461481c9190615845565b9091555050808555600385015460000361483857600060018601555b5050915492915050565b516001600160a01b0316151590565b8051156148615780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6127108260030154106148a0576040516303a8c56b60e61b815260040160405180910390fd5b806148be57604051638f4a893d60e01b815260040160405180910390fd5b60018083018290556002830180546000906148da908490615ae9565b909155505060038201546000036148ef578082555b60018260030160008282546149049190615ae9565b90915550505050565b60006149198383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e0820152600882015461010082015290915061499090612054565b600482015483916149b6576040516361b66e0d60e01b81526004016108ec929190615ad0565b5050426005909101555050565b60006149cf8383613653565b604080516101208101825282546001600160a01b03168152600183015460208201526002830154918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e08201526008820154610100820152909150614a4690612054565b60048201548391614a6c576040516361b66e0d60e01b81526004016108ec929190615ad0565b505060006007909101555050565b6000614a8983620f4240101590565b80614a9c5750614a9c82620f4240101590565b83839091614abf5760405163768bf0eb60e11b81526004016108ec929190615277565b50620f42409050614ad08385615ca1565b61186c9190615f81565b6000614ae4612f04565b54600160401b900460ff16919050565b818163ffffffff8082169083161115614b225760405163ccccdafb60e01b81526004016108ec929190615180565b508290508163ffffffff8116620f42401015614b535760405163ccccdafb60e01b81526004016108ec929190615180565b50506002805463ffffffff838116600160a01b0263ffffffff60a01b19918616600160801b0291909116600160801b600160c01b0319909216919091171790556040517f2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a369061273a9084908490615180565b81816001600160401b038082169083161115614bf65760405163ccccdafb60e01b81526004016108ec92919061521c565b5050600280546001600160401b03838116600160401b026001600160801b0319909216908516171790556040517f2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d19061273a908490849061521c565b614c5a614370565b6000614c6461278d565b905060028101614c748482615742565b5060038101614c838382615742565b5060008082556001909101555050565b600061084b614cc7565b600080600080614cad8686614d3b565b925092509250614cbd8282614d88565b5090949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614cf2614e41565b614cfa614ea8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060008351604103614d755760208401516040850151606086015160001a614d6788828585614ee9565b955095509550505050614d81565b50508151600091506002905b9250925092565b6000826003811115614d9c57614d9c6158db565b03614da5575050565b6001826003811115614db957614db96158db565b03614dd75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614deb57614deb6158db565b03614e0c5760405163fce698f760e01b8152600481018290526024016108ec565b6003826003811115614e2057614e206158db565b03610a8f576040516335e2f38360e21b8152600481018290526024016108ec565b600080614e4c61278d565b90506000614e586127b1565b805190915015614e7057805160209091012092915050565b81548015614e7f579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600080614eb361278d565b90506000614ebf612852565b805190915015614ed757805160209091012092915050565b60018201548015614e7f579392505050565b600080806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841115614f1a5750600091506003905082614fa4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015614f6e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614f9a57506000925060019150829050614fa4565b9250600091508190505b9450945094915050565b60405180610120016040528060006001600160a01b0316815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461084857600080fd5b803561502681615006565b919050565b60006020828403121561503d57600080fd5b813561186c81615006565b6001600160a01b0391909116815260200190565b63ffffffff8116811461084857600080fd5b60006020828403121561508057600080fd5b813561186c8161505c565b60008083601f84011261509d57600080fd5b5081356001600160401b038111156150b457600080fd5b6020830191508360208285010111156134be57600080fd5b6000806000604084860312156150e157600080fd5b83356150ec81615006565b925060208401356001600160401b0381111561510757600080fd5b6151138682870161508b565b9497909650939450505050565b801515811461084857600080fd5b6000806040838503121561514157600080fd5b823561514c81615006565b9150602083013561515c81615120565b809150509250929050565b60006020828403121561517957600080fd5b5035919050565b63ffffffff92831681529116602082015260400190565b60005b838110156151b257818101518382015260200161519a565b50506000910152565b600081518084526151d3816020860160208601615197565b601f01601f19169290920160200192915050565b83815260606020820152600061520060608301856151bb565b828103604084015261521281856151bb565b9695505050505050565b6001600160401b0392831681529116602082015260400190565b60008060006060848603121561524b57600080fd5b833561525681615006565b9250602084013561526681615006565b929592945050506040919091013590565b918252602082015260400190565b60ff60f81b8816815260e0602082015260006152a460e08301896151bb565b82810360408401526152b681896151bb565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501528451808252602080870193509091019060005b8181101561530c5783518352602093840193909201916001016152ee565b50909b9a5050505050505050505050565b6000806020838503121561533057600080fd5b82356001600160401b0381111561534657600080fd5b8301601f8101851361535757600080fd5b80356001600160401b0381111561536d57600080fd5b8560208260051b840101111561538257600080fd5b6020919091019590945092505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156153eb57603f198786030184526153d68583516151bb565b945060209384019391909101906001016153ba565b50929695505050505050565b6000806000806060858703121561540d57600080fd5b843561541881615006565b935060208501356003811061542c57600080fd5b925060408501356001600160401b0381111561544757600080fd5b6154538782880161508b565b95989497509550505050565b6000806000806080858703121561547557600080fd5b843561548081615006565b93506020850135925060408501356154978161505c565b9396929550929360600135925050565b600080604083850312156154ba57600080fd5b82356154c581615006565b9150602083013561515c81615006565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561550a57600080fd5b815161186c81615120565b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156155685761556861552f565b60405290565b604080519081016001600160401b03811182821017156155685761556861552f565b60405160e081016001600160401b03811182821017156155685761556861552f565b600082601f8301126155c357600080fd5b8135602083016000806001600160401b038411156155e3576155e361552f565b50604051601f19601f85018116603f011681018181106001600160401b03821117156156115761561161552f565b60405283815290508082840187101561562957600080fd5b838360208301376000602085830101528094505050505092915050565b60008060006060848603121561565b57600080fd5b83356001600160401b0381111561567157600080fd5b61567d868287016155b2565b93505060208401356001600160401b0381111561569957600080fd5b6156a5868287016155b2565b92505060408401356156b681615006565b809150509250925092565b600181811c908216806156d557607f821691505b6020821081036156f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d3c57806000526020600020601f840160051c810160208510156157225750805b601f840160051c820191505b8181101561306f576000815560010161572e565b81516001600160401b0381111561575b5761575b61552f565b61576f8161576984546156c1565b846156fb565b6020601f8211600181146157a3576000831561578b5750848201515b600019600385901b1c1916600184901b17845561306f565b600084815260208120601f198516915b828110156157d357878501518255602094850194600190920191016157b3565b50848210156157f15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112b8576112b861582f565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261588557600080fd5b8301803591506001600160401b0382111561589f57600080fd5b6020019150368190038213156134be57600080fd5b8284823760008382016000815283516158d1818360208801615197565b0195945050505050565b634e487b7160e01b600052602160045260246000fd5b6003811061590f57634e487b7160e01b600052602160045260246000fd5b9052565b602081016112b882846158f1565b6000806040838503121561593457600080fd5b50508035926020909101359150565b6000806000806080858703121561595957600080fd5b8435935060208501359250604085013561597281615006565b915060608501356001600160401b0381111561598d57600080fd5b615999878288016155b2565b91505092959194509250565b80516150268161505c565b6001600160401b038116811461084857600080fd5b8051615026816159b0565b60006101408284031280156159e457600080fd5b5060006159ef615545565b835181526020808501519082015260408085015190820152615a13606085016159a5565b6060820152615a24608085016159c5565b6080820152615a3560a085016159c5565b60a0820152615a4660c085016159a5565b60c0820152615a5760e085016159c5565b60e082015261010084810151908201526101209384015193810193909352509092915050565b600060208284031215615a8f57600080fd5b5051919050565b600060208284031215615aa857600080fd5b815161186c8161505c565b600060208284031215615ac557600080fd5b815161186c816159b0565b6001600160a01b03929092168252602082015260400190565b808201808211156112b8576112b861582f565b60008251615b0e818460208701615197565b9190910192915050565b8035615026816159b0565b80356001600160801b038116811461502657600080fd5b60008060408385031215615b4d57600080fd5b82356001600160401b03811115615b6357600080fd5b830160408186031215615b7557600080fd5b615b7d61556e565b81356001600160401b03811115615b9357600080fd5b820160e08188031215615ba557600080fd5b615bad615590565b81358152615bbd6020830161501b565b6020820152615bce6040830161501b565b6040820152615bdf6060830161501b565b6060820152615bf060808301615b18565b6080820152615c0160a08301615b23565b60a082015260c08201356001600160401b03811115615c1f57600080fd5b615c2b898285016155b2565b60c08301525082525060208201356001600160401b03811115615c4d57600080fd5b615c59878285016155b2565b60208381019190915291979590910135955050505050565b615c7b81856158f1565b606060208201526000615c9160608301856151bb565b9050826040830152949350505050565b80820281158282048414176112b8576112b861582f565b600080600060608486031215615ccd57600080fd5b8335615cd881615006565b92506020840135915060408401356001600160401b03811115615cfa57600080fd5b615d06868287016155b2565b9150509250925092565b608081526000615d2360808301876151bb565b6020830195909552506040810192909252606090910152919050565b60008060408385031215615d5257600080fd5b8251602084015190925061515c81615006565b600081615d7457615d7461582f565b506000190190565b600060018201615d8e57615d8e61582f565b5060010190565b6001600160a01b03938416815291909216602082015263ffffffff909116604082015260600190565b606080825284516040838301819052815160a085015260208201516001600160a01b0390811660c086015290820151811660e08501529181015190911661010083015260808101516001600160401b038116610120840152600091905060a08101516001600160801b0381166101408501525060c0015160e0610160840152615e4b6101808401826151bb565b90506020860151605f19848303016080850152615e6882826151bb565b9250505083602083015261333560408301846001600160a01b03169052565b6001600160a01b038481168252831660208201526060810161333560408301846158f1565b600060a0828403128015615ebf57600080fd5b5060405160009060a081016001600160401b0381118282101715615ee557615ee561552f565b6040908152845182526020808601519083015284810151908201526060808501519082015260809384015193810193909352509092915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b86815285602082015284604082015283606082015260c060808201526000615f6e60c08301856151bb565b90508260a0830152979650505050505050565b600082615f9e57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220b85de947a2adf153b4d5d66360454c8d0624bca998d3fc8f12bd17e31d74127864736f6c634300081b00330000000000000000000000000750eda3185c758247e97819074bcd217a815fae0000000000000000000000001a7fb71014d4395903ec56662f32dd02344d361c000000000000000000000000b63bc33d13f73efd14d32d2b9fc0b6116b6611ce000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#SubgraphService","networkInteractionId":1,"nonce":1646,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#SubgraphService","networkInteractionId":1,"nonce":1646,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x298eb5bad638cb45f1e0d1996bee1ba329fee71b79411f1336941d0ebbf54775"},"type":"TRANSACTION_SEND"} +{"artifactId":"SubgraphService#SubgraphServiceProxy","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","contractName":"SubgraphServiceProxy","dependencies":[],"futureId":"SubgraphService#SubgraphServiceProxy","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"futureId":"DisputeManager#DisputeManager","hash":"0x525564dabe54e35e863db1333ed6de28d8c426663bf174e23acb630760bd8274","networkInteractionId":1,"receipt":{"blockHash":"0x7ebfb3c9f0e8d272a89e6eea3d0b7798c779044c95c38df9a00484aa8e503b3b","blockNumber":152513364,"contractAddress":"0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8","logs":[{"address":"0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]},{"address":"0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":1,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"DisputeManager#DisputeManager","result":{"address":"0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#SubgraphService","hash":"0x298eb5bad638cb45f1e0d1996bee1ba329fee71b79411f1336941d0ebbf54775","networkInteractionId":1,"receipt":{"blockHash":"0x3235e1189a927cc4c89b401cb09600fe66de79561b6ee1808b73637d41af4c0f","blockNumber":152513379,"contractAddress":"0x30b34eAaF354cAdd64836Bc0846F4414254271ea","logs":[{"address":"0x30b34eAaF354cAdd64836Bc0846F4414254271ea","data":"0x000000000000000000000000afd60629034fbdc3ef58518b817bbdb4ec861c9300000000000000000000000070d5afaaaef8f2f095e83d6e6151146c18a5bb85000000000000000000000000aa1debfb7a7c0ba85cef858b6e70cfad943fd4a20000000000000000000000001ab05a65fa6d5f6a90a23693d5d40a4d927a815f0000000000000000000000007284213d1cda80c892a4388f38da431f063431440000000000000000000000001cebe1c314cc454baf4bd553409d957c833623c0000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":0,"topics":["0xef5021414834d86e36470f5c1cecf6544fb2bb723f2ca51a4c86fcd8c5919a43","0x000000000000000000000000bbcb9a575176039c06f94d4d8337818318a26828","0x000000000000000000000000f5d432192daf7e8b045349693577ccf0b5165a12","0x0000000000000000000000000750eda3185c758247e97819074bcd217a815fae"]},{"address":"0x30b34eAaF354cAdd64836Bc0846F4414254271ea","data":"0x00000000000000000000000030b34eaaf354cadd64836bc0846f4414254271ea0000000000000000000000001a7fb71014d4395903ec56662f32dd02344d361c000000000000000000000000b63bc33d13f73efd14d32d2b9fc0b6116b6611ce000000000000000000000000e135bfd9e51bbafcebb0141af85f0bc6da1b3ba4","logIndex":1,"topics":["0x4175b2c37456dbac494e08de8666d31bb8f3f2aee36ea5d9e06894ff3e4ddda7"]},{"address":"0x30b34eAaF354cAdd64836Bc0846F4414254271ea","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":2,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#SubgraphService","result":{"address":"0x30b34eAaF354cAdd64836Bc0846F4414254271ea","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":["0xade6b8eb69a49b56929c1d4f4b428d791861db6f","0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b",2419200,"10000000000000000000000",500000,1000000],"artifactId":"DisputeManager#DisputeManager","dependencies":["DisputeManager#DisputeManager"],"functionName":"initialize","futureId":"DisputeManager#encodeFunctionCall(DisputeManager#DisputeManager.initialize)","result":"0x0bc7344b000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000022d491bde2303f2f43325b2108d26f1eaba1e32b000000000000000000000000000000000000000000000000000000000024ea0000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000f4240","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"args":["0xade6b8eb69a49b56929c1d4f4b428d791861db6f","100000000000000000000000",16,2],"artifactId":"SubgraphService#SubgraphService","dependencies":["SubgraphService#SubgraphService"],"functionName":"initialize","futureId":"SubgraphService#encodeFunctionCall(SubgraphService#SubgraphService.initialize)","result":"0xc84a5ef3000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002","strategy":"basic","strategyConfig":{},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"args":["0x1A7Fb71014d4395903eC56662f32dD02344D361C","0x75f7Bd9D2F0bca7bA7189BB582f5eb95afa051e8","0x0bc7344b000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000022d491bde2303f2f43325b2108d26f1eaba1e32b000000000000000000000000000000000000000000000000000000000024ea0000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000f4240"],"artifactId":"DisputeManager#ProxyAdmin","contractAddress":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","dependencies":["DisputeManager#ProxyAdmin","DisputeManager#DisputeManagerProxy","DisputeManager#DisputeManager","DisputeManager#encodeFunctionCall(DisputeManager#DisputeManager.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"upgradeAndCall","futureId":"DisputeManager#ProxyAdmin.upgradeAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"DisputeManager#ProxyAdmin.upgradeAndCall","networkInteraction":{"data":"0x9623609d0000000000000000000000001a7fb71014d4395903ec56662f32dd02344d361c00000000000000000000000075f7bd9d2f0bca7ba7189bb582f5eb95afa051e8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c40bc7344b000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000022d491bde2303f2f43325b2108d26f1eaba1e32b000000000000000000000000000000000000000000000000000000000024ea0000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000","id":1,"to":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"DisputeManager#ProxyAdmin.upgradeAndCall","networkInteractionId":1,"nonce":1647,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"DisputeManager#ProxyAdmin.upgradeAndCall","networkInteractionId":1,"nonce":1647,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xde8309972e5cf0f3f2029f80a9dbf2589f7ecde04d82fe6cff88a21a0336eb00"},"type":"TRANSACTION_SEND"} +{"args":["0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","0x30b34eAaF354cAdd64836Bc0846F4414254271ea","0xc84a5ef3000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002"],"artifactId":"SubgraphService#ProxyAdmin","contractAddress":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","dependencies":["SubgraphService#ProxyAdmin","SubgraphService#SubgraphServiceProxy","SubgraphService#SubgraphService","SubgraphService#encodeFunctionCall(SubgraphService#SubgraphService.initialize)"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"upgradeAndCall","futureId":"SubgraphService#ProxyAdmin.upgradeAndCall","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#ProxyAdmin.upgradeAndCall","networkInteraction":{"data":"0x9623609d00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b000000000000000000000000030b34eaaf354cadd64836bc0846f4414254271ea00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000084c84a5ef3000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f00000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000","id":1,"to":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#ProxyAdmin.upgradeAndCall","networkInteractionId":1,"nonce":1648,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#ProxyAdmin.upgradeAndCall","networkInteractionId":1,"nonce":1648,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x16944acdc1b3b5131f85dd8d3bc2c993c963afeed19a28b92d32c4b12e1487c4"},"type":"TRANSACTION_SEND"} +{"futureId":"DisputeManager#ProxyAdmin.upgradeAndCall","hash":"0xde8309972e5cf0f3f2029f80a9dbf2589f7ecde04d82fe6cff88a21a0336eb00","networkInteractionId":1,"receipt":{"blockHash":"0x0006f844409e13aa0667c1302bba90a019db312f8d825174cdad2bb474830869","blockNumber":152513405,"logs":[{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x00000000000000000000000075f7bd9d2f0bca7ba7189bb582f5eb95afa051e8"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x","logIndex":2,"topics":["0x51744122301b50e919f4e3d22adf8c53abc92195b8c667eda98c6ef20375672e","0x00000000000000000000000022d491bde2303f2f43325b2108d26f1eaba1e32b"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x000000000000000000000000000000000000000000000000000000000024ea00","logIndex":3,"topics":["0x310462a9bf49fff4a57910ec647c77cbf8aaf2f13394554ac6cdf14fc68db7e6"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x00000000000000000000000000000000000000000000021e19e0c9bab2400000","logIndex":4,"topics":["0x97896b9da0f97f36bf3011570bcff930069299de4b1e89c9cb44909841cac2f8"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x000000000000000000000000000000000000000000000000000000000007a120","logIndex":5,"topics":["0xc573dc0f869f6a1d0a74fc7712a63baabcb5567131d2d98005e163924eddcbab"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x00000000000000000000000000000000000000000000000000000000000f4240","logIndex":6,"topics":["0x7efaf01bec3cda8d104163bb466d01d7e16f68848301c7eb0749cfa59d680502"]},{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":7,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"DisputeManager#ProxyAdmin.upgradeAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#ProxyAdmin.upgradeAndCall","hash":"0x16944acdc1b3b5131f85dd8d3bc2c993c963afeed19a28b92d32c4b12e1487c4","networkInteractionId":1,"receipt":{"blockHash":"0x03b5ceb0f513d3bb64054fe7b0511d0511294982ed470c31e79e14c491442a13","blockNumber":152513417,"logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x00000000000000000000000030b34eaaf354cadd64836bc0846f4414254271ea"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","logIndex":2,"topics":["0x90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f568849"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240","logIndex":3,"topics":["0x2fe5a7039987697813605cc0b9d6db7aab575408e3fc59e8a457bef8d7bc0a36"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":4,"topics":["0x2867e04c500e438761486b78021d4f9eb97c77ff45d10c1183f5583ba4cbf7d1"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x00000000000000000000000000000000000000000000000000000000ffffffff","logIndex":5,"topics":["0x472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x00000000000000000000000000000000000000000000152d02c7e14af6800000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","logIndex":6,"topics":["0x90699b8b4bf48918fea1129c85f9bc7b51285df7ecc982910813c7805f568849"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000010","logIndex":7,"topics":["0x472aba493f9fd1d136ec54986f619f3aa5caff964f0e731a9909fb9a1270211f"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000002","logIndex":8,"topics":["0x2aaaf20b08565eebc0c962cd7c568e54c3c0c2b85a1f942b82cd1bd730fdcd23"]},{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":9,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#ProxyAdmin.upgradeAndCall","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"artifactId":"DisputeManager#DisputeManager_ProxyWithABI","contractAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","contractName":"DisputeManager_ProxyWithABI","dependencies":["DisputeManager#ProxyAdmin.upgradeAndCall","DisputeManager#DisputeManagerProxy"],"futureId":"DisputeManager#DisputeManager_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"SubgraphService#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","contractName":"SubgraphService_ProxyWithABI","dependencies":["SubgraphService#ProxyAdmin.upgradeAndCall","SubgraphService#SubgraphServiceProxy"],"futureId":"SubgraphService#SubgraphService_ProxyWithABI","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"args":["0x00fe8F95407AB61863d27c07F584A0930ee5F3b0"],"artifactId":"DisputeManager#DisputeManager_ProxyWithABI","contractAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","dependencies":["DisputeManager#DisputeManager_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setSubgraphService","futureId":"DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService","networkInteraction":{"data":"0x93a90a1e00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0","id":1,"to":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService","networkInteractionId":1,"nonce":1649,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService","networkInteractionId":1,"nonce":1649,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x23f016c9557b5342ee3d8c04995ccb8c675626cddfb9d86db98041da41f61ddc"},"type":"TRANSACTION_SEND"} +{"args":[100000],"artifactId":"SubgraphService#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","dependencies":["SubgraphService#SubgraphService_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setCurationCut","futureId":"SubgraphService#SubgraphService_ProxyWithABI.setCurationCut","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setCurationCut","networkInteraction":{"data":"0x7e89bac300000000000000000000000000000000000000000000000000000000000186a0","id":1,"to":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setCurationCut","networkInteractionId":1,"nonce":1650,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setCurationCut","networkInteractionId":1,"nonce":1650,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xf6f5bd22b0ed84883c23b65442dec22c7c47a967c398f229c3e1c58abdfa6298"},"type":"TRANSACTION_SEND"} +{"args":[2419200],"artifactId":"SubgraphService#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","dependencies":["SubgraphService#SubgraphService_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setMaxPOIStaleness","futureId":"SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","networkInteraction":{"data":"0x7aa31bce000000000000000000000000000000000000000000000000000000000024ea00","id":1,"to":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","networkInteractionId":1,"nonce":1651,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","networkInteractionId":1,"nonce":1651,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0xf4e9b9504d6133ea66e66ad9a4fb821459e3b1679bd401484dd4b9432fe9cbb6"},"type":"TRANSACTION_SEND"} +{"args":["0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0",true],"artifactId":"SubgraphService#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","dependencies":["SubgraphService#SubgraphService_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setPauseGuardian","futureId":"SubgraphService#setPauseGuardianGovernor","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#setPauseGuardianGovernor","networkInteraction":{"data":"0x35577962000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f00000000000000000000000000000000000000000000000000000000000000001","id":1,"to":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#setPauseGuardianGovernor","networkInteractionId":1,"nonce":1652,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#setPauseGuardianGovernor","networkInteractionId":1,"nonce":1652,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x0f0ef37e082d4587cd6ccae790d362e08bde486d687be254f884afe4af6e7e7f"},"type":"TRANSACTION_SEND"} +{"args":["0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d",true],"artifactId":"SubgraphService#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","dependencies":["SubgraphService#SubgraphService_ProxyWithABI"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"setPauseGuardian","futureId":"SubgraphService#setPauseGuardianPauseGuardian","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#setPauseGuardianPauseGuardian","networkInteraction":{"data":"0x35577962000000000000000000000000e11ba2b4d45eaed5996cd0823791e0c93114882d0000000000000000000000000000000000000000000000000000000000000001","id":1,"to":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#setPauseGuardianPauseGuardian","networkInteractionId":1,"nonce":1653,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#setPauseGuardianPauseGuardian","networkInteractionId":1,"nonce":1653,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x528afc4134ccaed020a6877b6583332c1593522653f0267fb9743df4f006e267"},"type":"TRANSACTION_SEND"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService","hash":"0x23f016c9557b5342ee3d8c04995ccb8c675626cddfb9d86db98041da41f61ddc","networkInteractionId":1,"receipt":{"blockHash":"0xe2815fe234b5a8edf0592c1e2ffc354c1d78fdaab2a5e027a1c16e479d376052","blockNumber":152513443,"logs":[{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x","logIndex":0,"topics":["0x81dcb738da3dabd5bb2adbc7dd107fbbfca936e9c8aecab25f5b17a710a784c7","0x00000000000000000000000000fe8f95407ab61863d27c07f584a0930ee5f3b0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setCurationCut","hash":"0xf6f5bd22b0ed84883c23b65442dec22c7c47a967c398f229c3e1c58abdfa6298","networkInteractionId":1,"receipt":{"blockHash":"0x05a793d76704c771a0fda53aa325471c30da29fb3f6c1a352c8095b6511e2b1b","blockNumber":152513454,"logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x00000000000000000000000000000000000000000000000000000000000186a0","logIndex":1,"topics":["0x6deef78ffe3df79ae5cd8e40b842c36ac6077e13746b9b68a9f327537b01e4e9"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setCurationCut","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","hash":"0xf4e9b9504d6133ea66e66ad9a4fb821459e3b1679bd401484dd4b9432fe9cbb6","networkInteractionId":1,"receipt":{"blockHash":"0xafed8778e9f6dfd02e2fa094f16848280734bd88175a72eb87169c5db404c3f8","blockNumber":152513466,"logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x000000000000000000000000000000000000000000000000000000000024ea00","logIndex":0,"topics":["0x21774046e2611ddb52c8c46e1ad97524eeb2e3fda7dcd9428867868b4c4d06ba"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#setPauseGuardianGovernor","hash":"0x0f0ef37e082d4587cd6ccae790d362e08bde486d687be254f884afe4af6e7e7f","networkInteractionId":1,"receipt":{"blockHash":"0x101ab5d1a9eab4c84829deed736272565b2110b12ed8beaa8c2aba2d374d0adc","blockNumber":152513477,"logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":0,"topics":["0xa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789","0x000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#setPauseGuardianGovernor","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#setPauseGuardianPauseGuardian","hash":"0x528afc4134ccaed020a6877b6583332c1593522653f0267fb9743df4f006e267","networkInteractionId":1,"receipt":{"blockHash":"0x0dd8089ebc15c3eba190422b8f0f0119e3591e718c27e14bf6c35497ae967f92","blockNumber":152513488,"logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":1,"topics":["0xa95bac2f3df0d40e8278281c1d39d53c60e4f2bf3550ca5665738d0916e89789","0x000000000000000000000000e11ba2b4d45eaed5996cd0823791e0c93114882d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#setPauseGuardianPauseGuardian","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"args":["0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0"],"artifactId":"DisputeManager#DisputeManager_ProxyWithABI","contractAddress":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","dependencies":["DisputeManager#DisputeManager_ProxyWithABI","DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"DisputeManager#DisputeManager_ProxyWithABI.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0","id":1,"to":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.transferOwnership","networkInteractionId":1,"nonce":1654,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.transferOwnership","networkInteractionId":1,"nonce":1654,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x48a98358cc9a3f8f5ee4cb34d5f2a0454e3d8e19c2c77e339602fcc0c0bc107d"},"type":"TRANSACTION_SEND"} +{"args":["0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0"],"artifactId":"DisputeManager#ProxyAdmin","contractAddress":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","dependencies":["DisputeManager#ProxyAdmin","DisputeManager#DisputeManager_ProxyWithABI.setSubgraphService"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"DisputeManager#ProxyAdmin.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"DisputeManager#ProxyAdmin.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0","id":1,"to":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"DisputeManager#ProxyAdmin.transferOwnership","networkInteractionId":1,"nonce":1655,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"DisputeManager#ProxyAdmin.transferOwnership","networkInteractionId":1,"nonce":1655,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x280144792d0c058292da7c8aaef1d4a213d471bb21bef18b368cbd235feccfee"},"type":"TRANSACTION_SEND"} +{"args":["0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0"],"artifactId":"SubgraphService#ProxyAdmin","contractAddress":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","dependencies":["SubgraphService#ProxyAdmin","SubgraphService#setPauseGuardianGovernor","SubgraphService#setPauseGuardianPauseGuardian","SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","SubgraphService#SubgraphService_ProxyWithABI.setCurationCut"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"SubgraphService#ProxyAdmin.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#ProxyAdmin.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0","id":1,"to":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#ProxyAdmin.transferOwnership","networkInteractionId":1,"nonce":1656,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#ProxyAdmin.transferOwnership","networkInteractionId":1,"nonce":1656,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x2ce174ad9c196019cfb47182c94f0a0a63d55e884ef68f05b461373ac475c541"},"type":"TRANSACTION_SEND"} +{"args":["0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0"],"artifactId":"SubgraphService#SubgraphService_ProxyWithABI","contractAddress":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","dependencies":["SubgraphService#SubgraphService_ProxyWithABI","SubgraphService#setPauseGuardianGovernor","SubgraphService#setPauseGuardianPauseGuardian","SubgraphService#SubgraphService_ProxyWithABI.setMaxPOIStaleness","SubgraphService#SubgraphService_ProxyWithABI.setCurationCut"],"from":"0xade6b8eb69a49b56929c1d4f4b428d791861db6f","functionName":"transferOwnership","futureId":"SubgraphService#SubgraphService_ProxyWithABI.transferOwnership","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.transferOwnership","networkInteraction":{"data":"0xf2fde38b000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0","id":1,"to":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.transferOwnership","networkInteractionId":1,"nonce":1657,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.transferOwnership","networkInteractionId":1,"nonce":1657,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"200000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"0"}},"hash":"0x8d7f207538113cda6a635addfe0d8ea47042678d031fe04c3609e06775e2ae90"},"type":"TRANSACTION_SEND"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.transferOwnership","hash":"0x48a98358cc9a3f8f5ee4cb34d5f2a0454e3d8e19c2c77e339602fcc0c0bc107d","networkInteractionId":1,"receipt":{"blockHash":"0xb134015eb3b545982ab6cd614bcf9f469c672b4a4489ac9b1de357897d7b837c","blockNumber":152513519,"logs":[{"address":"0x1A7Fb71014d4395903eC56662f32dD02344D361C","data":"0x","logIndex":0,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"DisputeManager#DisputeManager_ProxyWithABI.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"DisputeManager#ProxyAdmin.transferOwnership","hash":"0x280144792d0c058292da7c8aaef1d4a213d471bb21bef18b368cbd235feccfee","networkInteractionId":1,"receipt":{"blockHash":"0xa38649c33a3e9ad110bf356a6d9ad35cfba98fd2681307598704d66c620df06d","blockNumber":152513531,"logs":[{"address":"0x9a8C3B6D649108bd11670de0B9b981ae3C167707","data":"0x","logIndex":0,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"DisputeManager#ProxyAdmin.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#ProxyAdmin.transferOwnership","hash":"0x2ce174ad9c196019cfb47182c94f0a0a63d55e884ef68f05b461373ac475c541","networkInteractionId":1,"receipt":{"blockHash":"0x4aac37dcaea3464087ce44664fb3779a295719901ecbabb2738b0dd576d8f945","blockNumber":152513543,"logs":[{"address":"0xD23a972f47B7D45E729AB9B8399D628c87b6C0d6","data":"0x","logIndex":0,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#ProxyAdmin.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.transferOwnership","hash":"0x8d7f207538113cda6a635addfe0d8ea47042678d031fe04c3609e06775e2ae90","networkInteractionId":1,"receipt":{"blockHash":"0x879392e67ffd685f6cf06fdee99d588aba00d97b6f13957d98c9ae4e951f617d","blockNumber":152513554,"logs":[{"address":"0x00fe8F95407AB61863d27c07F584A0930ee5F3b0","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x000000000000000000000000ade6b8eb69a49b56929c1d4f4b428d791861db6f","0x000000000000000000000000ffcf8fdee72ac11b5c542428b35eef5769c409f0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"SubgraphService#SubgraphService_ProxyWithABI.transferOwnership","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/subgraph-service/ignition/modules/Curation.ts b/packages/subgraph-service/ignition/modules/Curation.ts new file mode 100644 index 000000000..55d3c9553 --- /dev/null +++ b/packages/subgraph-service/ignition/modules/Curation.ts @@ -0,0 +1,20 @@ +import CurationArtifact from '@graphprotocol/contracts/artifacts/contracts/l2/curation/L2Curation.sol/L2Curation.json' +import { buildModule } from '@nomicfoundation/ignition-core' + +// Note that this module is a no-op, we only run it to get curation addresses into the address book. +// Curation deployment should be managed by ignition scripts in subgraph-service package however +// due to tight coupling with Controller contract it's easier to do it on the horizon package. + +export default buildModule('L2Curation', (m) => { + const curationProxyAddress = m.getParameter('curationProxyAddress') + const curationImplementationAddress = m.getParameter('curationImplementationAddress') + + const L2Curation = m.contractAt('L2CurationAddressBook', CurationArtifact, curationProxyAddress) + const L2CurationImplementation = m.contractAt( + 'L2CurationImplementationAddressBook', + CurationArtifact, + curationImplementationAddress, + ) + + return { L2Curation, L2CurationImplementation } +}) diff --git a/packages/subgraph-service/ignition/modules/DisputeManager.ts b/packages/subgraph-service/ignition/modules/DisputeManager.ts new file mode 100644 index 000000000..4ea298d90 --- /dev/null +++ b/packages/subgraph-service/ignition/modules/DisputeManager.ts @@ -0,0 +1,57 @@ +import { deployImplementation, upgradeTransparentUpgradeableProxy } from '@graphprotocol/horizon/ignition' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' +import ProxyAdminArtifact from '@openzeppelin/contracts/build/contracts/ProxyAdmin.json' +import TransparentUpgradeableProxyArtifact from '@openzeppelin/contracts/build/contracts/TransparentUpgradeableProxy.json' + +import DisputeManagerArtifact from '../../build/contracts/contracts/DisputeManager.sol/DisputeManager.json' + +export default buildModule('DisputeManager', (m) => { + const deployer = m.getAccount(0) + const governor = m.getParameter('governor') + const controllerAddress = m.getParameter('controllerAddress') + const subgraphServiceProxyAddress = m.getParameter('subgraphServiceProxyAddress') + const disputeManagerProxyAddress = m.getParameter('disputeManagerProxyAddress') + const disputeManagerProxyAdminAddress = m.getParameter('disputeManagerProxyAdminAddress') + const arbitrator = m.getParameter('arbitrator') + const disputePeriod = m.getParameter('disputePeriod') + const disputeDeposit = m.getParameter('disputeDeposit') + const fishermanRewardCut = m.getParameter('fishermanRewardCut') + const maxSlashingCut = m.getParameter('maxSlashingCut') + + const DisputeManagerProxyAdmin = m.contractAt('ProxyAdmin', ProxyAdminArtifact, disputeManagerProxyAdminAddress) + const DisputeManagerProxy = m.contractAt( + 'DisputeManagerProxy', + TransparentUpgradeableProxyArtifact, + disputeManagerProxyAddress, + ) + + // Deploy implementation + const DisputeManagerImplementation = deployImplementation(m, { + name: 'DisputeManager', + constructorArgs: [controllerAddress], + artifact: DisputeManagerArtifact, + }) + + // Upgrade implementation + const DisputeManager = upgradeTransparentUpgradeableProxy( + m, + DisputeManagerProxyAdmin, + DisputeManagerProxy, + DisputeManagerImplementation, + { + name: 'DisputeManager', + artifact: DisputeManagerArtifact, + initArgs: [deployer, arbitrator, disputePeriod, disputeDeposit, fishermanRewardCut, maxSlashingCut], + }, + ) + + const callSetSubgraphService = m.call(DisputeManager, 'setSubgraphService', [subgraphServiceProxyAddress]) + + m.call(DisputeManager, 'transferOwnership', [governor], { after: [callSetSubgraphService] }) + m.call(DisputeManagerProxyAdmin, 'transferOwnership', [governor], { after: [callSetSubgraphService] }) + + return { + DisputeManager, + DisputeManagerImplementation, + } +}) diff --git a/packages/subgraph-service/ignition/modules/GNS.ts b/packages/subgraph-service/ignition/modules/GNS.ts new file mode 100644 index 000000000..5533ea04f --- /dev/null +++ b/packages/subgraph-service/ignition/modules/GNS.ts @@ -0,0 +1,19 @@ +import SubgraphNFTArtifact from '@graphprotocol/contracts/artifacts/contracts/discovery/SubgraphNFT.sol/SubgraphNFT.json' +import L2GNSArtifact from '@graphprotocol/contracts/artifacts/contracts/l2/discovery/L2GNS.sol/L2GNS.json' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +// Note that this module is a no-op, we only run it to get gns addresses into the address book. +// GNS deployment should be managed by ignition scripts in subgraph-service package however +// due to tight coupling with Controller contract it's easier to do it on the horizon package. + +export default buildModule('L2GNS', (m) => { + const gnsProxyAddress = m.getParameter('gnsProxyAddress') + const gnsImplementationAddress = m.getParameter('gnsImplementationAddress') + const subgraphNFTAddress = m.getParameter('subgraphNFTAddress') + + const SubgraphNFT = m.contractAt('SubgraphNFTAddressBook', SubgraphNFTArtifact, subgraphNFTAddress) + const L2GNS = m.contractAt('L2GNSAddressBook', L2GNSArtifact, gnsProxyAddress) + const L2GNSImplementation = m.contractAt('L2GNSImplementationAddressBook', L2GNSArtifact, gnsImplementationAddress) + + return { L2GNS, L2GNSImplementation, SubgraphNFT } +}) diff --git a/packages/subgraph-service/ignition/modules/Proxies.ts b/packages/subgraph-service/ignition/modules/Proxies.ts new file mode 100644 index 000000000..24d1968a9 --- /dev/null +++ b/packages/subgraph-service/ignition/modules/Proxies.ts @@ -0,0 +1,24 @@ +import { deployTransparentUpgradeableProxy } from '@graphprotocol/horizon/ignition' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import DisputeManagerArtifact from '../../build/contracts/contracts/DisputeManager.sol/DisputeManager.json' +import SubgraphServiceArtifact from '../../build/contracts/contracts/SubgraphService.sol/SubgraphService.json' + +export default buildModule('SubgraphServiceProxies', (m) => { + // Deploy proxies contracts using OZ TransparentUpgradeableProxy + const { Proxy: DisputeManagerProxy, ProxyAdmin: DisputeManagerProxyAdmin } = deployTransparentUpgradeableProxy(m, { + name: 'DisputeManager', + artifact: DisputeManagerArtifact, + }) + const { Proxy: SubgraphServiceProxy, ProxyAdmin: SubgraphServiceProxyAdmin } = deployTransparentUpgradeableProxy(m, { + name: 'SubgraphService', + artifact: SubgraphServiceArtifact, + }) + + return { + SubgraphServiceProxy, + SubgraphServiceProxyAdmin, + DisputeManagerProxy, + DisputeManagerProxyAdmin, + } +}) diff --git a/packages/subgraph-service/ignition/modules/SubgraphService.ts b/packages/subgraph-service/ignition/modules/SubgraphService.ts new file mode 100644 index 000000000..8efb6800b --- /dev/null +++ b/packages/subgraph-service/ignition/modules/SubgraphService.ts @@ -0,0 +1,80 @@ +import { deployImplementation, upgradeTransparentUpgradeableProxy } from '@graphprotocol/horizon/ignition' +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' +import ProxyAdminArtifact from '@openzeppelin/contracts/build/contracts/ProxyAdmin.json' +import TransparentUpgradeableProxyArtifact from '@openzeppelin/contracts/build/contracts/TransparentUpgradeableProxy.json' + +import SubgraphServiceArtifact from '../../build/contracts/contracts/SubgraphService.sol/SubgraphService.json' + +export default buildModule('SubgraphService', (m) => { + const deployer = m.getAccount(0) + const governor = m.getParameter('governor') + const pauseGuardian = m.getParameter('pauseGuardian') + const controllerAddress = m.getParameter('controllerAddress') + const subgraphServiceProxyAddress = m.getParameter('subgraphServiceProxyAddress') + const subgraphServiceProxyAdminAddress = m.getParameter('subgraphServiceProxyAdminAddress') + const disputeManagerProxyAddress = m.getParameter('disputeManagerProxyAddress') + const graphTallyCollectorAddress = m.getParameter('graphTallyCollectorAddress') + const curationProxyAddress = m.getParameter('curationProxyAddress') + const minimumProvisionTokens = m.getParameter('minimumProvisionTokens') + const maximumDelegationRatio = m.getParameter('maximumDelegationRatio') + const stakeToFeesRatio = m.getParameter('stakeToFeesRatio') + const maxPOIStaleness = m.getParameter('maxPOIStaleness') + const curationCut = m.getParameter('curationCut') + + const SubgraphServiceProxyAdmin = m.contractAt('ProxyAdmin', ProxyAdminArtifact, subgraphServiceProxyAdminAddress) + const SubgraphServiceProxy = m.contractAt( + 'SubgraphServiceProxy', + TransparentUpgradeableProxyArtifact, + subgraphServiceProxyAddress, + ) + + // Deploy implementation + const SubgraphServiceImplementation = deployImplementation(m, { + name: 'SubgraphService', + constructorArgs: [controllerAddress, disputeManagerProxyAddress, graphTallyCollectorAddress, curationProxyAddress], + }) + + // Upgrade implementation + const SubgraphService = upgradeTransparentUpgradeableProxy( + m, + SubgraphServiceProxyAdmin, + SubgraphServiceProxy, + SubgraphServiceImplementation, + { + name: 'SubgraphService', + artifact: SubgraphServiceArtifact, + initArgs: [deployer, minimumProvisionTokens, maximumDelegationRatio, stakeToFeesRatio], + }, + ) + + const callSetPauseGuardianGovernor = m.call(SubgraphService, 'setPauseGuardian', [governor, true], { + id: 'setPauseGuardianGovernor', + }) + const callSetPauseGuardianPauseGuardian = m.call(SubgraphService, 'setPauseGuardian', [pauseGuardian, true], { + id: 'setPauseGuardianPauseGuardian', + }) + const callSetMaxPOIStaleness = m.call(SubgraphService, 'setMaxPOIStaleness', [maxPOIStaleness]) + const callSetCurationCut = m.call(SubgraphService, 'setCurationCut', [curationCut]) + + m.call(SubgraphService, 'transferOwnership', [governor], { + after: [ + callSetPauseGuardianGovernor, + callSetPauseGuardianPauseGuardian, + callSetMaxPOIStaleness, + callSetCurationCut, + ], + }) + m.call(SubgraphServiceProxyAdmin, 'transferOwnership', [governor], { + after: [ + callSetPauseGuardianGovernor, + callSetPauseGuardianPauseGuardian, + callSetMaxPOIStaleness, + callSetCurationCut, + ], + }) + + return { + SubgraphService, + SubgraphServiceImplementation, + } +}) diff --git a/packages/subgraph-service/ignition/modules/deploy/deploy-1.ts b/packages/subgraph-service/ignition/modules/deploy/deploy-1.ts new file mode 100644 index 000000000..bae38f76b --- /dev/null +++ b/packages/subgraph-service/ignition/modules/deploy/deploy-1.ts @@ -0,0 +1,15 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import ProxiesModule from '../Proxies' + +export default buildModule('SubgraphService_Deploy_1', (m) => { + const { SubgraphServiceProxy, SubgraphServiceProxyAdmin, DisputeManagerProxy, DisputeManagerProxyAdmin } = + m.useModule(ProxiesModule) + + return { + Transparent_Proxy_SubgraphService: SubgraphServiceProxy, + Transparent_ProxyAdmin_SubgraphService: SubgraphServiceProxyAdmin, + Transparent_Proxy_DisputeManager: DisputeManagerProxy, + Transparent_ProxyAdmin_DisputeManager: DisputeManagerProxyAdmin, + } +}) diff --git a/packages/subgraph-service/ignition/modules/deploy/deploy-2.ts b/packages/subgraph-service/ignition/modules/deploy/deploy-2.ts new file mode 100644 index 000000000..2004d8a12 --- /dev/null +++ b/packages/subgraph-service/ignition/modules/deploy/deploy-2.ts @@ -0,0 +1,25 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import CurationModule from '../Curation' +import DisputeManagerModule from '../DisputeManager' +import GNSModule from '../GNS' +import SubgraphServiceModule from '../SubgraphService' + +export default buildModule('SubgraphService_Deploy_2', (m) => { + const { DisputeManager, DisputeManagerImplementation } = m.useModule(DisputeManagerModule) + const { SubgraphService, SubgraphServiceImplementation } = m.useModule(SubgraphServiceModule) + const { L2Curation, L2CurationImplementation } = m.useModule(CurationModule) + const { L2GNS, L2GNSImplementation, SubgraphNFT } = m.useModule(GNSModule) + + return { + Transparent_Proxy_DisputeManager: DisputeManager, + Implementation_DisputeManager: DisputeManagerImplementation, + Transparent_Proxy_SubgraphService: SubgraphService, + Implementation_SubgraphService: SubgraphServiceImplementation, + Graph_Proxy_L2Curation: L2Curation, + Implementation_L2Curation: L2CurationImplementation, + Graph_Proxy_L2GNS: L2GNS, + Implementation_L2GNS: L2GNSImplementation, + SubgraphNFT, + } +}) diff --git a/packages/subgraph-service/ignition/modules/migrate/migrate-1.ts b/packages/subgraph-service/ignition/modules/migrate/migrate-1.ts new file mode 100644 index 000000000..c876f3f1b --- /dev/null +++ b/packages/subgraph-service/ignition/modules/migrate/migrate-1.ts @@ -0,0 +1,15 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import ProxiesModule from '../Proxies' + +export default buildModule('SubgraphService_Migrate_1', (m) => { + const { SubgraphServiceProxy, SubgraphServiceProxyAdmin, DisputeManagerProxy, DisputeManagerProxyAdmin } = + m.useModule(ProxiesModule) + + return { + Transparent_Proxy_SubgraphService: SubgraphServiceProxy, + Transparent_ProxyAdmin_SubgraphService: SubgraphServiceProxyAdmin, + Transparent_Proxy_DisputeManager: DisputeManagerProxy, + Transparent_ProxyAdmin_DisputeManager: DisputeManagerProxyAdmin, + } +}) diff --git a/packages/subgraph-service/ignition/modules/migrate/migrate-2.ts b/packages/subgraph-service/ignition/modules/migrate/migrate-2.ts new file mode 100644 index 000000000..df005ad64 --- /dev/null +++ b/packages/subgraph-service/ignition/modules/migrate/migrate-2.ts @@ -0,0 +1,25 @@ +import { buildModule } from '@nomicfoundation/hardhat-ignition/modules' + +import CurationModule from '../Curation' +import DisputeManagerModule from '../DisputeManager' +import GNSModule from '../GNS' +import SubgraphServiceModule from '../SubgraphService' + +export default buildModule('SubgraphService_Migrate_2', (m) => { + const { DisputeManager, DisputeManagerImplementation } = m.useModule(DisputeManagerModule) + const { SubgraphService, SubgraphServiceImplementation } = m.useModule(SubgraphServiceModule) + const { L2Curation, L2CurationImplementation } = m.useModule(CurationModule) + const { L2GNS, L2GNSImplementation, SubgraphNFT } = m.useModule(GNSModule) + + return { + Transparent_Proxy_DisputeManager: DisputeManager, + Implementation_DisputeManager: DisputeManagerImplementation, + Transparent_Proxy_SubgraphService: SubgraphService, + Implementation_SubgraphService: SubgraphServiceImplementation, + Graph_Proxy_L2Curation: L2Curation, + Implementation_L2Curation: L2CurationImplementation, + Graph_Proxy_L2GNS: L2GNS, + Implementation_L2GNS: L2GNSImplementation, + SubgraphNFT, + } +}) diff --git a/packages/subgraph-service/natspec-smells.config.js b/packages/subgraph-service/natspec-smells.config.js new file mode 100644 index 000000000..dc4205e72 --- /dev/null +++ b/packages/subgraph-service/natspec-smells.config.js @@ -0,0 +1,11 @@ +/** + * 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 new file mode 100644 index 000000000..cfa05daae --- /dev/null +++ b/packages/subgraph-service/package.json @@ -0,0 +1,91 @@ +{ + "name": "@graphprotocol/subgraph-service", + "version": "0.5.0", + "publishConfig": { + "access": "public" + }, + "description": "", + "author": "The Graph core devs", + "license": "GPL-2.0-or-later", + "types": "typechain-types/index.ts", + "exports": { + "./artifacts/*": "./build/contracts/*", + "./addresses*": "./addresses*" + }, + "files": [ + "build/contracts/**/*", + "typechain-types/**/*", + "README.md" + ], + "scripts": { + "lint": "pnpm lint:ts; pnpm lint:sol; pnpm lint:natspec; 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:json": "prettier -w --cache --log-level warn '**/*.json'", + "clean": "rm -rf build dist cache cache_forge typechain-types", + "build": "hardhat compile", + "test": "forge test", + "test:deployment": "SECURE_ACCOUNTS_DISABLE_PROVIDER=true hardhat test test/deployment/*.ts", + "test:integration": "./scripts/integration", + "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-foundry": "^1.1.1", + "@nomicfoundation/hardhat-ignition": "^0.15.9", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.9", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.10", + "@nomicfoundation/ignition-core": "^0.15.9", + "@openzeppelin/contracts": "^5.0.2", + "@openzeppelin/contracts-upgradeable": "^5.0.2", + "@openzeppelin/foundry-upgrades": "0.4.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=16.0.0", + "chai": "^4.2.0", + "eslint": "^8.56.0", + "ethers": "6.13.7", + "forge-std": "https://github.com/foundry-rs/forge-std/tarball/v1.9.7", + "glob": "^11.0.1", + "hardhat": "^2.22.18", + "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", + "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" + }, + "lint-staged": { + "contracts/**/*.sol": [ + "pnpm lint:sol" + ], + "**/*.ts": [ + "pnpm lint:ts" + ], + "**/*.js": [ + "pnpm lint:ts" + ], + "**/*.json": [ + "pnpm lint:ts" + ] + } +} diff --git a/packages/subgraph-service/prettier.config.cjs b/packages/subgraph-service/prettier.config.cjs new file mode 100644 index 000000000..4e8dcf4f3 --- /dev/null +++ b/packages/subgraph-service/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/subgraph-service/remappings.txt b/packages/subgraph-service/remappings.txt new file mode 100644 index 000000000..2ed2aa7db --- /dev/null +++ b/packages/subgraph-service/remappings.txt @@ -0,0 +1,7 @@ +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ +@openzeppelin/foundry-upgrades/=node_modules/@openzeppelin/foundry-upgrades/src/ +@graphprotocol/contracts/=node_modules/@graphprotocol/contracts/ +@graphprotocol/horizon/=node_modules/@graphprotocol/horizon/ +@graphprotocol/interfaces/=node_modules/@graphprotocol/interfaces/ +forge-std/=node_modules/forge-std/src/ \ No newline at end of file diff --git a/packages/subgraph-service/scripts/integration b/packages/subgraph-service/scripts/integration new file mode 100755 index 000000000..d5d7f1c0d --- /dev/null +++ b/packages/subgraph-service/scripts/integration @@ -0,0 +1,140 @@ +#!/bin/bash + +set -eo pipefail + +NON_INTERACTIVE=${NON_INTERACTIVE:-false} + +# Set environment variables for this script +export SECURE_ACCOUNTS_DISABLE_PROVIDER=true +export FORK_FROM_CHAIN_ID=${FORK_FROM_CHAIN_ID:-421614} + +# Function to cleanup resources +cleanup() { + # Kill hardhat node only if we started it + if [ ! -z "$NODE_PID" ] && [ "$STARTED_NODE" = true ]; then + echo "Cleaning up Hardhat node (PID: $NODE_PID)..." + kill -TERM -- -$NODE_PID 2>/dev/null || true + fi +} + +# Set trap to call cleanup function on script exit (normal or error) +trap cleanup EXIT + +# Check if any deployment folders exist +SUBGRAPH_DEPLOYMENT_EXISTS=false +HORIZON_DEPLOYMENT_EXISTS=false + +if [ -d "ignition/deployments/subgraph-service-localhost" ]; then + SUBGRAPH_DEPLOYMENT_EXISTS=true +fi + +if [ -d "../horizon/ignition/deployments/horizon-localhost" ]; then + HORIZON_DEPLOYMENT_EXISTS=true +fi + +# If any deployment exists, ask once for confirmation +if [ "$SUBGRAPH_DEPLOYMENT_EXISTS" = true ] || [ "$HORIZON_DEPLOYMENT_EXISTS" = true ]; then + echo "The following deployment files already exist and must be removed for the tests to work properly:" + if [ "$SUBGRAPH_DEPLOYMENT_EXISTS" = true ]; then + echo "- Subgraph Service: ignition/deployments/subgraph-service-localhost" + fi + if [ "$HORIZON_DEPLOYMENT_EXISTS" = true ]; then + echo "- Horizon: ../horizon/ignition/deployments/horizon-localhost" + fi + + read -p "Remove these deployment files? (y/n) [y]: " confirm + confirm=${confirm:-y} + if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then + if [ "$SUBGRAPH_DEPLOYMENT_EXISTS" = true ]; then + echo "Removing Subgraph Service deployment files..." + rm -rf ignition/deployments/subgraph-service-localhost + fi + if [ "$HORIZON_DEPLOYMENT_EXISTS" = true ]; then + echo "Removing Horizon deployment files..." + rm -rf ../horizon/ignition/deployments/horizon-localhost + fi + else + echo "Cannot continue with existing deployment files. Exiting." + exit 1 + fi +fi + +# Check required env variables +BLOCKCHAIN_RPC=${BLOCKCHAIN_RPC:-$(npx hardhat vars get ARBITRUM_SEPOLIA_RPC)} +if [ -z "$BLOCKCHAIN_RPC" ]; then + echo "BLOCKCHAIN_RPC environment variable is required" + exit 1 +fi + +echo "Starting integration tests..." + +# Check if hardhat node is already running on port 8545 +STARTED_NODE=false +if lsof -i:8545 > /dev/null 2>&1; then + echo "Hardhat node already running on port 8545, using existing node" + # Get the PID of the process using port 8545 + NODE_PID=$(lsof -t -i:8545) +else + # Start local hardhat node forked from Arbitrum Sepolia + echo "Starting local hardhat node..." + npx hardhat node --fork $BLOCKCHAIN_RPC > node.log 2>&1 & + NODE_PID=$! + STARTED_NODE=true + + # Wait for node to start + sleep 10 +fi + +# Setup subgraph service address book +jq '{"31337": ."'"$FORK_FROM_CHAIN_ID"'"}' addresses-integration-tests.json > addresses-localhost.json + +# Run Horizon pre-upgrade steps +cd ../horizon + +# Setup horizon address book +jq '{"31337": ."'"$FORK_FROM_CHAIN_ID"'"}' addresses-integration-tests.json > addresses-localhost.json + +# Setup pre horizon migration state needed for the e2e tests +npx hardhat test:seed --network localhost + +# Transfer ownership of protocol to hardhat signer 1 +npx hardhat test:transfer-ownership --network localhost + +# Run Horizon steps 1 deployment +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 1 --patch-config + +# Run Subgraph Service steps 1 deployment +cd ../subgraph-service +npx hardhat deploy:migrate --network localhost --step 1 --subgraph-service-config integration --patch-config --hide-banner + +# Run Horizon deployment steps 2 and 3 +cd ../horizon +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 2 --patch-config --account-index 1 --hide-banner +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 3 --patch-config --hide-banner + +# Run Subgraph Service deployment step 2 +cd ../subgraph-service +npx hardhat deploy:migrate --network localhost --step 2 --subgraph-service-config integration --patch-config --hide-banner + +# Run Horizon deployment steps 4 +cd ../horizon +npx hardhat deploy:migrate --network localhost --horizon-config integration --step 4 --patch-config --account-index 1 --hide-banner + +# Run Subgraph Service seed steps +cd ../subgraph-service +npx hardhat test:seed --network localhost + +# Run integration tests - During transition period +npx hardhat test:integration --phase during-transition-period --network localhost + +# Clear thawing period +cd ../horizon +npx hardhat transition:clear-thawing --network localhost --governor-index 1 + +# Run integration tests - After transition period +cd ../subgraph-service +npx hardhat test:integration --phase after-transition-period --network localhost + +echo "" +echo "🎉 ✨ 🚀 ✅ E2E tests completed successfully! 🎉 ✨ 🚀 ✅" +echo "" diff --git a/packages/subgraph-service/scripts/ops/data.ts b/packages/subgraph-service/scripts/ops/data.ts new file mode 100644 index 000000000..82cee273b --- /dev/null +++ b/packages/subgraph-service/scripts/ops/data.ts @@ -0,0 +1,163 @@ +// 5 private keys for 14 indexers +export const allocationKeys = [ + // 0 + [ + '0xadc26f06df219d495e839e2bfbc3b7957cbd7ec2378402a71c348d5d14161508', + '0x3a4822389badea942368b5208e96f27e0f86d6218264b344b4aa4e9327126364', + '0xd2a01abc811463cc7a0024147bebde7060e65d51c7fa3192d9cde700a47c251f', + '0x3dfbdb0f34048b788940f120c0033aca8dcfd37e0dd5207a842dc61e1886e85a', + '0x920223c9235db8175356e159cc68d18ec02e262be45277e36b77454cd807bf86', + ], + // 1 + [ + '0xfc4de5954b21216f20bf330b531d337f26b596e9848ad6d42abeaeedc94f0b13', + '0xab337fe78fad371dbf49ff168f34482023b0c9ab82b3f43a828a4fde9750ec51', + '0x14415a4a8e175cfd6c0c4bf25e3f6ca2e31bd8dd6d1515572ecd2dcf38cb89c8', + '0xae323d19100fb157370d4e32ae0f2927a2ee08a9d17b00aec4a0d353b62cbc7d', + '0xce42812cc29b6c4d5b06b95434f62265a232fa0902b1d0adefb974a7b3e20d78', + ], + // 2 + [ + '0x10b4a9f0631aada6b4bf71c34778c0658bab59edf0aba8e4521f82b06039b8b6', + '0x927141f4ca7037c19f25b940f5acd4b3640057e28852ca211fcf18dda529859b', + '0x224356ab7c35241fafdbefbaf65e1595bcea90d494067add2af084836fb04a85', + '0xbf188a0f2bcefaa0018e6055914f740a4e9531530029a03d883c932cb5532dc0', + '0x21ab7915972caa6d80a9c1aa0087efa36fca354880452d85bd041aaab55f78ca', + ], + // 3 + [ + '0x518f5077f9496fc8f9ced68ee3ceb373c83499ced9555d23dd3db15662bbb9fc', + '0x198a89d12b724e588e02b5bc76e1fdf5f73f44ee1188b9025d086a958b856e96', + '0xd5187002b0e67ed351f0a0e60b22f7521657b2be37ceb9796f877549cd9ce222', + '0x2d9e9d37f31854cc383e49f9e63a79d3ee1f3cda0ee3e70022c1507f1f5daaf6', + '0xadbb875ed84fe3fce2b795e4a8b79c30af5e247f3dfdaae508bd5cc4521da2ae', + ], + // 4 + [ + '0x82125dc80334dceae262cc16f3424d5c216606a18ef4f14a81d6ed280b4024da', + '0xaa3128c72a194ff8ba61ce10fe6fe85125caf3a86c34087435b80305d00c6e1b', + '0x4300a2a2067c4c376eca3c34c70cbf909ca4bc370199f4cda58d95a0a00d9f5f', + '0x005520c586e3c4a69eac2e3ebf7647a3aa8a2e0a86bd1ac6efe3a6a71b96066e', + '0x566012e0fb640f9689959d682e8cf8f9a85184241178689a501b2eb6c8b15738', + ], + // 5 + [ + '0x89ebfce06c70a5d3508758f7fcd4a9036a4833d54fe2576b96b314330698d7cc', + '0x4173e8c46b0e986cbdba386648eae089ad023b575bfa14b7359a15bcbe4f5dca', + '0x216dc758c841eedf907fd63c189df9490a5dc5ef8ed78799157cd56c0cdacace', + '0x8017e5d08306448c6c83c6745d631c5db5902eb92ee5531773ed61b2484f7e13', + '0x8029f5e5334d6b0f543f6930c1c7c0b37b7294b372d5245b79ec93e22faebe72', + ], + // 6 + [ + '0x6c550086228105ce673eaccac85ed331d9406cad27d2f4dcdcd915991acaa2ec', + '0x79909074dfb609a91fe0e2be5be2ed7bbac4d25d429b462449d6b81d5bdd0aa3', + '0x8c817673ca090ada483fb7d5257b800802ec38dac5797e429b100281aba53a56', + '0x8df09c1559d1937569f93edb5027f1e0f37c7e0833bf11a78ee1dcb9b59811df', + '0x2a5b7747acd49567a763e82e6bd273b2485fa0bfc56ab0097fc78793695a922b', + ], + // 7 + [ + '0x01148072587e8db9a6600ab5493197454b8df92ba6a9c49634950b39cd27b0f8', + '0x4d81c121d9eccc9e10a9a52eec5486dea1ad06225fe763033038e88250cebe53', + '0xaea522baa4b245bae11efb99ef0d9a90ad9e44d3f9211c2936df4f08f4953d28', + '0x26b482f016849f6252607034acbd2d7bac2d8ec69e15f8e1f0cc0849f981463a', + '0x923dd9e6be0ea49ad4d9aa54516a4f7b82c7726f545f0310fc1d548d1b657353', + ], + // 8 + [ + '0x0feb254ae77a3dee38b2ae93ea7575f463c51f74bfc52fc9e4a26e39a6ecafd6', + '0xd851b1dcad9cde7dd528cf54c1157f0ce8276b4cfd979fbe66331065a382a5cf', + '0x014b03f8bd8233d2937d4081d6c17700f954f85fb84683b494e4ad81af742905', + '0x05d123da41d5138a692a5c848418bab90f010e578d05d6d547d6393db0e0b203', + '0x22c2978cc492babe94a4cffeff058a80b3538b2f383673055dbc321fe732782c', + ], + // 9 + [ + '0xa19dbff41dc89b35b1ab26211d4ea6c5d7ddbcfdd88c9dc984aca7e401213982', + '0x8ac0e5d925473ded2d7f518e038ce702c85f2cb4efa19c790d652549812e8095', + '0x5873d0babaf77992c162de724ad7ba43354112b023ddbc91081940859b04613d', + '0x750c6d01c25cbf124bcdebbda600d09a36d0353738b618bcbe1211f18841db1c', + '0xe823d63eef2a37596183505ee76683a1af57e8253920594a388b0b31ca2a4730', + ], + // 10 + [ + '0x21c015847aa2621d1d3ab6b92915e46995d51814c940d9242c99bc1c56aef025', + '0xa285c26d0d89c94360bf876174301f2acb226954b6c2e17081f02258590afd2c', + '0x6e08860ca769d6c45509b06c11c4734e51477c110213c6552290a1c56226927c', + '0x271df62461060c8fcd78bbe82bb592d695a486cce9c78f5f801b020a13d47951', + '0x2293da863dc9ab4d7a7160573f50bae66956c71ea3e16b9356dd0d4713932cdb', + ], + // 11 + [ + '0xe9817b310039c44dbb0b43e10e63aa999cf05017e0175f1a052a7ae506498bb3', + '0xeee418cba9ec638e7aa9f03ac6fbbb332741b1082f31e949940ab39f746c86f6', + '0x3e62bd3b87e9f45d5ed6924ccd21d67fe43fdd2c43f3c4c8c0ad598b8130302c', + '0x8dadfb35dba3fc01eb543c7016feeab4ec777485fef7efabef46637689d41648', + '0x7d1b521bce3d42dfd719d8202153fd5432efbcf5d4d33a0180811254ae8058a5', + ], + // 12 + [ + '0x3dd509ae6e664fee8ddd19094e80672ba55d7943112514f255f71f814389334e', + '0x88354bb0173d9db541c91668c722e189308411afdbed18843590c64eb4c65f4a', + '0xbe7f5ded918f2f85e937f9e658e7e78f5e3f6010a8ef552019a4cac02443499a', + '0xe2275db1ec82cfc4d96f711eb22894fe0fe4ed1223ead68fc2ae114cec9613ac', + '0xd7c830bc72657bd204636a1ed199928e70329959410b53e45d664539a95e6a17', + ], + // 13 + [ + '0x0ca66c3197efa4c0d61d0fda991c18c7039a562192d3e339d16142071b895356', + '0xc78a3bab4a94bf912b1db350e3baeaa4e82a8cc03833e3c6d5821b68af8729ca', + '0x304f55f25d20e54075fd11c38b0c79b6f35d8bbfdbf10954afd8c5bf3c34bed9', + '0xeb45fd351ba6cafd0c3aa600e73471967d9d9eaa30f0021141711ce682466559', + '0x7e71f34c1068d63bfc14c13e4ef9b5f3555e3a7efeae72948d584cf8f5acbf5c', + ], + // 14 + [ + '0x1f2e3d4c5b6a79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8', + '0x2e3d4c5b6a79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809', + '0x3d4c5b6a79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a', + '0x4c5b6a79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b', + '0x5b6a79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c', + ], + // 15 + [ + '0x6a79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d', + '0x79808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e', + '0x808192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f', + '0x8192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f70', + '0x92a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f7081', + ], + // 16 + [ + '0xa3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192', + '0xb4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3', + '0xc5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4', + '0xd6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5', + '0xe7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6', + ], + // 17 + [ + '0xf8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7', + '0x091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8', + '0x1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809', + '0x2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a', + '0x3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b', + ], + // 18 + [ + '0x4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c', + '0x5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d', + '0x6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e', + '0x708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f', + '0x8192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f70', + ], + // 19 + [ + '0x92a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f7081', + '0xa3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192', + '0xb4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3', + '0xc5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4', + '0xd6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5', + ], +] diff --git a/packages/subgraph-service/scripts/ops/protocol-activity.ts b/packages/subgraph-service/scripts/ops/protocol-activity.ts new file mode 100644 index 000000000..e53e83ab9 --- /dev/null +++ b/packages/subgraph-service/scripts/ops/protocol-activity.ts @@ -0,0 +1,413 @@ +import { + encodeCollectQueryFeesData, + encodePOIMetadata, + generateAllocationProof, + generatePOI, + generateSignedRAV, + generateSignerProof, + ONE_HUNDRED_THOUSAND, + ONE_THOUSAND, + PaymentTypes, + TEN_MILLION, + ThawRequestType, +} from '@graphprotocol/toolshed' +import { randomBigInt } from '@graphprotocol/toolshed/utils' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { Wallet } from 'ethers' +import hre, { ethers } from 'hardhat' + +import { allocationKeys } from './data' + +const GAS_LIMIT = process.env.GAS_LIMIT ? parseInt(process.env.GAS_LIMIT) : 1_000_000 +const LOCAL_NETWORK_INDEXER_PRIVATE_KEY = '0x2ee789a68207020b45607f5adb71933de0946baebbaaab74af7cbd69c8a90573' +const INDEXER_PRIVATE_KEY = process.env.INDEXER_PRIVATE_KEY ?? LOCAL_NETWORK_INDEXER_PRIVATE_KEY + +async function main() { + const graph = hre.graph() + const { HorizonStaking, GraphToken, PaymentsEscrow, GraphTallyCollector } = graph.horizon.contracts + const { SubgraphService, Curation, DisputeManager } = graph.subgraphService.contracts + + const { stake, stakeToProvision, delegate, addToDelegationPool } = graph.horizon.actions + + const indexer = new Wallet(INDEXER_PRIVATE_KEY, graph.provider) + const signers = [...(await graph.accounts.getTestAccounts()), indexer] + const deployer = await graph.accounts.getDeployer() + const gateway = await graph.accounts.getGateway() // note that this wont be the actual gateway address + + const PROVISION_THAWING_PERIOD = await DisputeManager.disputePeriod() + const PROVISION_MAX_VERIFIER_CUT = await DisputeManager.fishermanRewardCut() + const PROVISION_THAWING_PERIOD_B = PROVISION_THAWING_PERIOD - 1n + const PROVISION_MAX_VERIFIER_CUT_B = PROVISION_MAX_VERIFIER_CUT + 1000n + + const abi = new ethers.AbiCoder() + + console.log('🔄 Generating protocol activity...') + console.log('- Deployer: ', deployer.address) + const deployerEthBalance = await ethers.provider.getBalance(deployer.address) + const deployerGrtBalance = await GraphToken.balanceOf(deployer.address) + console.log(` + ETH Balance: ${ethers.formatEther(deployerEthBalance)} ETH`) + console.log(` + GRT Balance: ${ethers.formatEther(deployerGrtBalance)} GRT`) + console.log('- Signers: ', signers.length) + + // Fund signers - top up to 0.01 ETH + console.log('💸 Funding signers with ETH...') + for (const signer of [...signers, gateway]) { + const balance = await ethers.provider.getBalance(signer.address) + if (balance < ethers.parseEther('0.01')) { + await deployer.connect(graph.provider).sendTransaction({ to: signer.address, value: ethers.parseEther('0.01') }) + } + } + + // Fund signers - top up to 10M GRT + console.log('💰 Funding signers with GRT...') + for (const signer of [...signers, gateway]) { + const balance = await GraphToken.balanceOf(signer.address) + if (balance < TEN_MILLION) { + await GraphToken.connect(deployer).transfer(signer.address, TEN_MILLION - balance) + } + } + + // Stake - random amount between 0 and available balance + console.log('📈 Staking random amounts...') + for (const signer of signers) { + const balance = await GraphToken.balanceOf(signer.address) + const stakeAmount = randomBigInt(0n, balance) + await stake(signer as HardhatEthersSigner, [stakeAmount]) + } + + // Provision - if not exist, create with random amount between 100k and idle stake, otherwise add random amount + console.log('🔧 Provisioning or adding to provision...') + for (const signer of signers) { + const provision = await HorizonStaking.getProvision(signer.address, SubgraphService.target) + const provisionExists = provision.createdAt !== 0n + + if (provisionExists) { + const balance = await GraphToken.balanceOf(signer.address) + const addAmount = randomBigInt(0n, balance) + await stakeToProvision(signer as HardhatEthersSigner, [signer.address, SubgraphService.target, addAmount]) + } else { + const idleStake = await HorizonStaking.getIdleStake(signer.address) + const provisionAmount = randomBigInt(ONE_HUNDRED_THOUSAND, idleStake - ONE_HUNDRED_THOUSAND) + await HorizonStaking.connect(signer).provision( + signer.address, + SubgraphService.target, + provisionAmount, + PROVISION_MAX_VERIFIER_CUT, + PROVISION_THAWING_PERIOD, + ) + } + } + + // Unstake - random amount between 0 and idle stake, scaled down by 50% + console.log('📉 Unstaking random amounts...') + for (const signer of signers) { + const idleStake = await HorizonStaking.getIdleStake(signer.address) + const unstakeAmount = BigInt(Math.floor(Math.random() * Number(idleStake) * 0.5)) + await HorizonStaking.connect(signer).unstake(unstakeAmount) + } + + // Subgraph Service - register + console.log('📝 Subgraph Service - registering...') + for (const signer of signers) { + const indexer = await SubgraphService.indexers(signer.address) + const isRegistered = indexer.url.length > 0 + if (!isRegistered) { + const paymentsDestination = Math.random() < 0.5 ? signer.address : ethers.ZeroAddress + const data = abi.encode(['string', 'string', 'address'], ['http://indexer.xyz', '69y7mznpp', paymentsDestination]) + await SubgraphService.connect(signer).register(signer.address, data) + } + } + + // Thaw - random amount between 0 and provision tokens free, scaled down by 50% + console.log('❄️ Thawing provision tokens...') + for (const signer of signers) { + const provision = await HorizonStaking.getProvision(signer.address, SubgraphService.target) + const thawAmount = randomBigInt(0n, (provision.tokens - provision.tokensThawing) / 2n) + await HorizonStaking.connect(signer).thaw(signer.address, SubgraphService.target, thawAmount) + } + + // Deprovision/Reprovision - any thawed tokens + console.log('🧊 Deprovisioning thawed tokens...') + for (const signer of signers) { + const thawedTokens = await HorizonStaking.getThawedTokens( + ThawRequestType.Provision, + signer.address, + SubgraphService.target, + signer.address, + ) + if (thawedTokens > 0) { + const reprovision = Math.random() < 0.5 + if (reprovision) { + await HorizonStaking.connect(signer).provision( + signer.address, + ethers.ZeroAddress, + 1n, + PROVISION_MAX_VERIFIER_CUT, + PROVISION_THAWING_PERIOD, + ) + await HorizonStaking.connect(signer).reprovision(signer.address, SubgraphService.target, ethers.ZeroAddress, 0) + } else { + await HorizonStaking.connect(signer).deprovision(signer.address, SubgraphService.target, 0) + } + } + } + + // AddToProvision - random amount between 0 and idle stake, scaled down by 50% + console.log('➕ Adding to provision...') + for (const signer of signers) { + const idleStake = await HorizonStaking.getIdleStake(signer.address) + const addAmount = randomBigInt(0n, idleStake / 2n) + await HorizonStaking.connect(signer).addToProvision(signer.address, SubgraphService.target, addAmount) + } + + // Set provision parameters + console.log('🔨 Setting provision parameters...') + for (const signer of signers) { + await HorizonStaking.connect(signer).setProvisionParameters( + signer.address, + SubgraphService.target, + Math.random() < 0.5 ? PROVISION_MAX_VERIFIER_CUT_B : PROVISION_MAX_VERIFIER_CUT, + Math.random() < 0.5 ? PROVISION_THAWING_PERIOD_B : PROVISION_THAWING_PERIOD, + ) + } + + // Subgraph service - start service + console.log('🚀 Subgraph Service - starting service...') + for (const [i, signer] of signers.entries()) { + for (const privateKey of allocationKeys[i]) { + const wallet = new ethers.Wallet(privateKey) + const allocation = await SubgraphService.getAllocation(wallet.address) + if (allocation.createdAt === 0n) { + const freeAmount = + (await HorizonStaking.getProviderTokensAvailable(signer.address, SubgraphService.target)) - + (await SubgraphService.allocationProvisionTracker(signer.address)) + if (freeAmount > ONE_THOUSAND) { + const allocationAmount = randomBigInt(ONE_THOUSAND, freeAmount) + const subgraphDeploymentId = ethers.keccak256(`0x${i.toString(16).padStart(2, '0')}`) + const proof = await generateAllocationProof( + signer.address, + privateKey, + SubgraphService.target as string, + graph.chainId, + ) + const data = abi.encode( + ['bytes32', 'uint256', 'address', 'bytes'], + [subgraphDeploymentId, allocationAmount, wallet.address, proof], + ) + await SubgraphService.connect(signer).startService(signer.address, data, { gasLimit: GAS_LIMIT }) + // Curate + const curate = Math.random() < 0.5 + if (curate) { + await GraphToken.connect(signer).approve(Curation.target, 12345n) + await Curation.connect(signer).mint(subgraphDeploymentId, 12345n, 0) + } + } + } + } + } + + // Subgraph service - set payments destination + console.log('🏦 Subgraph Service - setting payments destination...') + for (const signer of signers) { + const paymentsDestination = Math.random() < 0.5 ? signer.address : ethers.ZeroAddress + await SubgraphService.connect(signer).setPaymentsDestination(paymentsDestination) + } + + // Delegation cuts + console.log('✂️ Delegation cuts...') + for (const signer of signers) { + const queryFeeCut = randomBigInt(0n, 50_000n) + const indexerFeeCut = randomBigInt(0n, 50_000n) + await HorizonStaking.connect(signer).setDelegationFeeCut( + signer.address, + SubgraphService.target, + PaymentTypes.QueryFee, + queryFeeCut, + ) + await HorizonStaking.connect(signer).setDelegationFeeCut( + signer.address, + SubgraphService.target, + PaymentTypes.IndexingRewards, + indexerFeeCut, + ) + } + + // Subgraph service - resize allocation + console.log('🔄 Subgraph Service - resizing allocation...') + for (const [i, signer] of signers.entries()) { + for (const privateKey of allocationKeys[i]) { + if (Math.random() > 0.5) { + const wallet = new ethers.Wallet(privateKey) + const allocation = await SubgraphService.getAllocation(wallet.address) + + if (allocation.createdAt !== 0n && allocation.closedAt === 0n) { + const resizeAmount = Math.random() > 0.5 ? (allocation.tokens * 9n) / 10n : (allocation.tokens * 11n) / 10n + const freeAmount = + (await HorizonStaking.getProviderTokensAvailable(signer.address, SubgraphService.target)) - + (await SubgraphService.allocationProvisionTracker(signer.address)) + if (resizeAmount - allocation.tokens < freeAmount) { + await SubgraphService.connect(signer).resizeAllocation(signer.address, wallet.address, resizeAmount, { + gasLimit: GAS_LIMIT, + }) + } + } + } + } + } + + // delegate + console.log('👥 Delegating...') + for (const signer of signers) { + const balance = await GraphToken.balanceOf(signer.address) + const delegationAmount = balance / 100n + const serviceProvider = signers[Math.floor(Math.random() * signers.length)] + await delegate(signer as HardhatEthersSigner, [serviceProvider, SubgraphService.target, delegationAmount, 0n]) + } + + // Add to delegation pool + console.log('🔁 Adding to delegation pool...') + for (const signer of signers) { + const balance = await GraphToken.balanceOf(signer.address) + const delegationAmount = balance / 500n + + const delegationPool = await HorizonStaking.getDelegationPool(signer.address, SubgraphService.target) + if (delegationPool.shares > 0) { + await addToDelegationPool(signer as HardhatEthersSigner, [ + signer.address, + SubgraphService.target, + delegationAmount, + ]) + } + } + + // Undelegate + console.log('🔄 Undelegate...') + for (const signer of signers) { + for (const serviceProvider of signers) { + const delegation = await HorizonStaking.getDelegation(serviceProvider, SubgraphService.target, signer.address) + if (delegation.shares > 0) { + await HorizonStaking.connect(signer)['undelegate(address,address,uint256)']( + serviceProvider, + SubgraphService.target, + delegation.shares, + ) + } + } + } + + // withdraw delegation + console.log('💸 Withdrawing delegation...') + for (const signer of signers) { + const tokensThawed = await HorizonStaking.getThawedTokens( + ThawRequestType.Delegation, + signer.address, + SubgraphService.target, + signer.address, + ) + if (tokensThawed > 0) { + await HorizonStaking.connect(signer)['withdrawDelegated(address,address,uint256)']( + signer.address, + SubgraphService.target, + 0, + ) + } + } + + // collect indexing fees + console.log('📊 Collecting indexing fees...') + for (const [i, signer] of signers.entries()) { + for (const privateKey of allocationKeys[i]) { + const wallet = new ethers.Wallet(privateKey) + const allocation = await SubgraphService.getAllocation(wallet.address) + + const timeSinceCreated = Math.floor(Date.now() / 1000) - Number(allocation.createdAt) + if (timeSinceCreated > 120 && allocation.createdAt !== 0n && allocation.closedAt === 0n) { + // 10 minutes + const poi = generatePOI('POI') + const publicPoi = generatePOI('publicPOI') + const poiMetadata = encodePOIMetadata(222, publicPoi, 1, 10, 0) // random data, doesnt matter + const data = abi.encode(['address', 'bytes32', 'bytes'], [wallet.address, poi, poiMetadata]) + await SubgraphService.connect(signer).collect(signer.address, PaymentTypes.IndexingRewards, data, { + gasLimit: GAS_LIMIT, + }) + } + } + } + + // collect query fees + console.log('💰 Collecting query fees...') + const gatewaySigner = new ethers.Wallet('0x6a0d63ca1ff7f0a6d3357fa59c2fb585f5fcf99e2c73d433022504e2147b6cdd') // use a random private key + const signerAuth = await GraphTallyCollector.authorizations(gatewaySigner.address) + + if (signerAuth.authorizer === ethers.ZeroAddress) { + const gatewayProof = generateSignerProof( + 9962283664n, + gateway.address, + gatewaySigner.privateKey, + GraphTallyCollector.target as string, + graph.chainId, + ) + await GraphTallyCollector.connect(gateway).authorizeSigner(gatewaySigner.address, 9962283664n, gatewayProof) + } + + for (const [i, signer] of signers.entries()) { + const escrowAccount = await PaymentsEscrow.escrowAccounts( + gateway.address, + GraphTallyCollector.target, + signer.address, + ) + if (escrowAccount.balance < ONE_HUNDRED_THOUSAND) { + await GraphToken.connect(gateway).approve(PaymentsEscrow.target, ONE_HUNDRED_THOUSAND - escrowAccount.balance) + await PaymentsEscrow.connect(gateway).deposit( + GraphTallyCollector.target, + signer.address, + ONE_HUNDRED_THOUSAND - escrowAccount.balance, + ) + } + + for (const privateKey of allocationKeys[i]) { + const wallet = new ethers.Wallet(privateKey) + const collectionId = abi.encode(['address'], [wallet.address]) + const tokensCollected = await GraphTallyCollector.tokensCollected( + SubgraphService.target, + collectionId, + signer.address, + gateway.address, + ) + const { rav, signature } = await generateSignedRAV( + wallet.address, + gateway.address, + signer.address, + SubgraphService.target as string, + 0n, + tokensCollected + ONE_THOUSAND, + ethers.toUtf8Bytes(''), + gatewaySigner.privateKey, + GraphTallyCollector.target as string, + graph.chainId, + ) + const data = encodeCollectQueryFeesData(rav, signature, 0n) + await SubgraphService.connect(signer).collect(signer.address, 0, data, { gasLimit: GAS_LIMIT }) + } + } + + // Subgraph service - stop service + console.log('🛑 Subgraph Service - stopping service...') + for (const [i, signer] of signers.entries()) { + for (const privateKey of allocationKeys[i]) { + const wallet = new ethers.Wallet(privateKey) + const allocation = await SubgraphService.getAllocation(wallet.address) + + if (allocation.createdAt !== 0n && allocation.closedAt === 0n) { + if (Math.random() < 0.35) { + await SubgraphService.connect(signer).stopService(signer.address, abi.encode(['address'], [wallet.address])) + } + } + } + } +} + +main().catch((error) => { + console.error(error) + process.exitCode = 1 +}) diff --git a/packages/subgraph-service/scripts/post-verify b/packages/subgraph-service/scripts/post-verify new file mode 100755 index 000000000..dfcae3bcc --- /dev/null +++ b/packages/subgraph-service/scripts/post-verify @@ -0,0 +1,3 @@ +#!/bin/bash + +git ls-files --others --exclude-standard ignition/deployments | xargs rm -f \ No newline at end of file diff --git a/packages/subgraph-service/scripts/pre-verify b/packages/subgraph-service/scripts/pre-verify new file mode 100755 index 000000000..fa596b4c2 --- /dev/null +++ b/packages/subgraph-service/scripts/pre-verify @@ -0,0 +1,70 @@ +#!/bin/bash + +# Move external artifacts +cp -r ../contracts/build/contracts/contracts/* build/contracts/contracts +cp -r ../contracts/build/contracts/build-info/* build/contracts/build-info + +cp -r ../horizon/build/contracts/contracts/* build/contracts/contracts +cp -r ../horizon/build/contracts/build-info/* build/contracts/build-info + +cp -r ../horizon/build/contracts/@openzeppelin/contracts/proxy/transparent/* build/contracts/contracts +cp -r ../horizon/build/contracts/build-info/* build/contracts/build-info + +# HardHat Ignition deployment ID +DEPLOYMENT_ID="${1:-chain-421614}" + +# .dbg.json files +DBG_DIR_SRC="./build/contracts/contracts" +DBG_DIR_DEST="./ignition/deployments/${DEPLOYMENT_ID}/artifacts" + +# build-info files +BUILD_INFO_DIR_SRC="./build/contracts/build-info" +BUILD_INFO_DIR_DEST="./ignition/deployments/${DEPLOYMENT_ID}/build-info" + +# Ensure the destination directories exist +mkdir -p "$DBG_DIR_DEST" +mkdir -p "$BUILD_INFO_DIR_DEST" + +# Copy .dbg.json files +echo "Searching for .dbg.json files in $DBG_DIR_SRC and copying them to $DBG_DIR_DEST..." +find "$DBG_DIR_SRC" -type f -name "*.dbg.json" | while read -r file; do + base_name=$(basename "$file" .dbg.json) + new_name="${base_name}#${base_name}.dbg.json" + + if [ ! -f "$DBG_DIR_DEST/$new_name" ]; then + cp "$file" "$DBG_DIR_DEST/$new_name" + fi + + jq '.buildInfo |= sub("../../../../"; "../") | .buildInfo |= sub("../../../"; "../") | .buildInfo |= sub("../../"; "../")' "$DBG_DIR_DEST/$new_name" > "${DBG_DIR_DEST}/${new_name}.tmp" && mv "${DBG_DIR_DEST}/${new_name}.tmp" "$DBG_DIR_DEST/$new_name" +done + +# Copy build-info files +echo "Searching for build-info files in $BUILD_INFO_DIR_SRC and copying them to $BUILD_INFO_DIR_DEST..." +find "$BUILD_INFO_DIR_SRC" -type f -name "*.json" | while read -r file; do + base_name=$(basename "$file" .json) + if [ ! -f "$BUILD_INFO_DIR_DEST/$base_name.json" ]; then + cp "$file" "$BUILD_INFO_DIR_DEST/$base_name.json" + fi +done + +echo "All files have been processed." + +# Patch proxy artifacts +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxies#GraphProxy_HorizonStaking.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2Curation#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2GraphToken#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/L2GraphTokenGateway#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/RewardsManager#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/BridgeEscrow#GraphProxy.dbg.json" +cp "$DBG_DIR_DEST/GraphProxy#GraphProxy.dbg.json" "$DBG_DIR_DEST/EpochManager#GraphProxy.dbg.json" + +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxies#TransparentUpgradeableProxy_GraphPayments.dbg.json" +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/HorizonProxies#TransparentUpgradeableProxy_PaymentsEscrow.dbg.json" +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/SubgraphServiceProxies#TransparentUpgradeableProxy_DisputeManager.dbg.json" +cp "$DBG_DIR_DEST/TransparentUpgradeableProxy#TransparentUpgradeableProxy.dbg.json" "$DBG_DIR_DEST/SubgraphServiceProxies#TransparentUpgradeableProxy_SubgraphService.dbg.json" + +# Rename DisputeManager to LegacyDisputeManager - this avoids artifact name collisions +mkdir -p "build/contracts/contracts/disputes/LegacyDisputeManager.sol" +mv "build/contracts/contracts/disputes/DisputeManager.sol/DisputeManager.json" "build/contracts/contracts/disputes/LegacyDisputeManager.sol/LegacyDisputeManager.json" +mv "build/contracts/contracts/disputes/DisputeManager.sol/DisputeManager.dbg.json" "build/contracts/contracts/disputes/LegacyDisputeManager.sol/LegacyDisputeManager.dbg.json" +rm -rf "build/contracts/contracts/disputes/DisputeManager.sol" \ No newline at end of file diff --git a/packages/subgraph-service/tasks/deploy.ts b/packages/subgraph-service/tasks/deploy.ts new file mode 100644 index 000000000..581138439 --- /dev/null +++ b/packages/subgraph-service/tasks/deploy.ts @@ -0,0 +1,227 @@ +/* eslint-disable no-case-declarations */ +import { HorizonModule } from '@graphprotocol/horizon/ignition' +import { ZERO_ADDRESS } from '@graphprotocol/toolshed' +import type { AddressBook } from '@graphprotocol/toolshed/deployments' +import { loadConfig, patchConfig, saveToAddressBook } from '@graphprotocol/toolshed/hardhat' +import { printHorizonBanner } from '@graphprotocol/toolshed/utils' +import { task, types } from 'hardhat/config' +import type { HardhatRuntimeEnvironment } from 'hardhat/types' + +import Deploy1Module from '../ignition/modules/deploy/deploy-1' +import Deploy2Module from '../ignition/modules/deploy/deploy-2' + +// Horizon needs the SubgraphService proxy address before it can be deployed +// But SubgraphService and DisputeManager implementations need Horizon... +// So the deployment order is: +// - Deploy SubgraphService and DisputeManager proxies +// - Deploy Horizon +// - Deploy SubgraphService and DisputeManager implementations +task('deploy:protocol', 'Deploy a new version of the Graph Protocol Horizon contracts - with Subgraph Service') + .addOptionalParam( + 'subgraphServiceConfig', + 'Name of the Subgraph Service configuration file to use. Format is "protocol..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', + undefined, + types.string, + ) + .addOptionalParam( + 'horizonConfig', + 'Name of the Horizon configuration file to use. Format is "protocol..json5", file must be in the "ignition/configs/" directory in the horizon package. Defaults to network name.', + undefined, + types.string, + ) + .setAction(async (args, hre: HardhatRuntimeEnvironment) => { + const graph = hre.graph({ createAddressBook: true }) + + // Load configuration files for the deployment + console.log('\n========== ⚙️ Deployment configuration ==========') + const { config: HorizonConfig, file: horizonFile } = loadConfig( + './node_modules/@graphprotocol/horizon/ignition/configs', + 'protocol', + args.horizonConfig ?? hre.network.name, + ) + const { config: SubgraphServiceConfig, file: subgraphServiceFile } = loadConfig( + './ignition/configs/', + 'protocol', + args.subgraphServiceConfig ?? hre.network.name, + ) + console.log(`Loaded Horizon migration configuration from ${horizonFile}`) + console.log(`Loaded Subgraph Service migration configuration from ${subgraphServiceFile}`) + + // Display the deployer -- this also triggers the secure accounts prompt if being used + console.log('\n========== 🔑 Deployer account ==========') + const deployer = await graph.accounts.getDeployer(args.deployerIndex) + console.log('Using deployer account:', deployer.address) + const balance = await hre.ethers.provider.getBalance(deployer.address) + console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') + if (balance === 0n) { + console.error('Error: Deployer account has no ETH balance') + process.exit(1) + } + + // 1. Deploy SubgraphService and DisputeManager proxies + console.log(`\n========== 🚧 SubgraphService and DisputeManager proxies ==========`) + const proxiesDeployment = await hre.ignition.deploy(Deploy1Module, { + displayUi: true, + parameters: SubgraphServiceConfig, + }) + + // 2. Deploy Horizon + console.log(`\n========== 🚧 Deploy Horizon ==========`) + const horizonDeployment = await hre.ignition.deploy(HorizonModule, { + displayUi: true, + parameters: patchConfig(HorizonConfig, { + $global: { + // The naming convention in the horizon package is slightly different + subgraphServiceAddress: proxiesDeployment.Transparent_Proxy_SubgraphService.target as string, + }, + }), + }) + + // 3. Deploy SubgraphService and DisputeManager implementations + console.log(`\n========== 🚧 Deploy SubgraphService implementations and upgrade them ==========`) + const subgraphServiceDeployment = await hre.ignition.deploy(Deploy2Module, { + displayUi: true, + parameters: patchConfig(SubgraphServiceConfig, { + $global: { + controllerAddress: horizonDeployment.Controller.target as string, + curationProxyAddress: horizonDeployment.Graph_Proxy_L2Curation.target as string, + curationImplementationAddress: horizonDeployment.Implementation_L2Curation.target as string, + disputeManagerProxyAddress: proxiesDeployment.Transparent_Proxy_DisputeManager.target as string, + disputeManagerProxyAdminAddress: proxiesDeployment.Transparent_ProxyAdmin_DisputeManager.target as string, + subgraphServiceProxyAddress: proxiesDeployment.Transparent_Proxy_SubgraphService.target as string, + subgraphServiceProxyAdminAddress: proxiesDeployment.Transparent_ProxyAdmin_SubgraphService.target as string, + graphTallyCollectorAddress: horizonDeployment.GraphTallyCollector.target as string, + gnsProxyAddress: horizonDeployment.Graph_Proxy_L2GNS.target as string, + gnsImplementationAddress: horizonDeployment.Implementation_L2GNS.target as string, + subgraphNFTAddress: horizonDeployment.SubgraphNFT.target as string, + }, + }), + }) + + // Save the addresses to the address book + console.log('\n========== 📖 Updating address book ==========') + // @ts-expect-error - @graphprotocol/toolshed/hardhat exports ts files so types mismatch here + saveToAddressBook(horizonDeployment, graph.horizon.addressBook) + // @ts-expect-error - @graphprotocol/toolshed/hardhat exports ts files so types mismatch here + saveToAddressBook(proxiesDeployment, graph.subgraphService.addressBook) + // @ts-expect-error - @graphprotocol/toolshed/hardhat exports ts files so types mismatch here + saveToAddressBook(subgraphServiceDeployment, graph.subgraphService.addressBook) + console.log(`Address book at ${graph.horizon.addressBook.file} updated!`) + console.log(`Address book at ${graph.subgraphService.addressBook.file} updated!`) + console.log('Note that Horizon deployment addresses are updated in the Horizon address book') + + console.log('\n\n🎉 ✨ 🚀 ✅ Deployment complete! 🎉 ✨ 🚀 ✅') + }) + +task('deploy:migrate', 'Deploy the Subgraph Service on an existing Horizon deployment') + .addOptionalParam('step', 'Migration step to run (1, 2)', undefined, types.int) + .addOptionalParam( + 'subgraphServiceConfig', + 'Name of the Subgraph Service configuration file to use. Format is "migrate..json5", file must be in the "ignition/configs/" directory. Defaults to network name.', + undefined, + types.string, + ) + .addOptionalParam('accountIndex', 'Derivation path index for the account to use', 0, types.int) + .addFlag('patchConfig', 'Patch configuration file using address book values - does not save changes') + .addFlag('hideBanner', 'Hide the banner display') + .setAction(async (args, hre: HardhatRuntimeEnvironment) => { + // Task parameters + const step: number = args.step ?? 0 + const patchConfig: boolean = args.patchConfig ?? false + + const graph = hre.graph() + + if (!args.hideBanner) { + printHorizonBanner() + } + + // Migration step to run + console.log('\n========== 🏗️ Migration steps ==========') + const validSteps = [1, 2] + if (!validSteps.includes(step)) { + console.error(`Error: Invalid migration step provided: ${step}`) + console.error(`Valid steps are: ${validSteps.join(', ')}`) + process.exit(1) + } + console.log(`Running migration step: ${step}`) + + // Load configuration for the migration + console.log('\n========== ⚙️ Deployment configuration ==========') + const { config: SubgraphServiceMigrateConfig, file } = loadConfig( + './ignition/configs/', + 'migrate', + args.subgraphServiceConfig ?? hre.network.name, + ) + console.log(`Loaded migration configuration from ${file}`) + + // Display the deployer -- this also triggers the secure accounts prompt if being used + console.log('\n========== 🔑 Deployer account ==========') + const deployer = await graph.accounts.getDeployer(args.accountIndex) + console.log('Using deployer account:', deployer.address) + const balance = await hre.ethers.provider.getBalance(deployer.address) + console.log('Deployer balance:', hre.ethers.formatEther(balance), 'ETH') + if (balance === 0n) { + console.error('Error: Deployer account has no ETH balance') + process.exit(1) + } + + // Run migration step + console.log(`\n========== 🚧 Running migration: step ${step} ==========`) + const MigrationModule = require(`../ignition/modules/migrate/migrate-${step}`).default + const deployment = await hre.ignition.deploy(MigrationModule, { + displayUi: true, + parameters: patchConfig + ? _patchStepConfig( + step, + SubgraphServiceMigrateConfig, + graph.subgraphService.addressBook, + graph.horizon.addressBook, + ) + : SubgraphServiceMigrateConfig, + deploymentId: `subgraph-service-${hre.network.name}`, + }) + + // Update address book + console.log('\n========== 📖 Updating address book ==========') + // @ts-expect-error - @graphprotocol/toolshed/hardhat exports ts files so types mismatch here + saveToAddressBook(deployment, graph.subgraphService.addressBook) + console.log(`Address book at ${graph.subgraphService.addressBook.file} updated!`) + + console.log('\n\n🎉 ✨ 🚀 ✅ Migration complete! 🎉 ✨ 🚀 ✅') + }) + +// This function patches the Ignition configuration object using an address book to fill in the gaps +// The resulting configuration is not saved back to the configuration file + +function _patchStepConfig( + step: number, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + config: any, + addressBook: AddressBook, + horizonAddressBook: AddressBook, + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): any { + let patchedConfig = config + + switch (step) { + case 2: + const SubgraphService = addressBook.getEntry('SubgraphService') + const DisputeManager = addressBook.getEntry('DisputeManager') + const GraphTallyCollector = horizonAddressBook.getEntry('GraphTallyCollector') + + patchedConfig = patchConfig(config, { + $global: { + disputeManagerProxyAddress: DisputeManager.address, + disputeManagerProxyAdminAddress: DisputeManager.proxyAdmin ?? ZERO_ADDRESS, + subgraphServiceProxyAddress: SubgraphService.address, + }, + SubgraphService: { + subgraphServiceProxyAdminAddress: SubgraphService.proxyAdmin ?? ZERO_ADDRESS, + graphTallyCollectorAddress: GraphTallyCollector.address, + }, + }) + break + } + + return patchedConfig +} diff --git a/packages/subgraph-service/tasks/test/integration.ts b/packages/subgraph-service/tasks/test/integration.ts new file mode 100644 index 000000000..130058e90 --- /dev/null +++ b/packages/subgraph-service/tasks/test/integration.ts @@ -0,0 +1,32 @@ +import { printBanner } from '@graphprotocol/toolshed/utils' +import { glob } from 'glob' +import { TASK_TEST } from 'hardhat/builtin-tasks/task-names' +import { task } from 'hardhat/config' + +task('test:integration', 'Runs all integration tests') + .addParam( + 'phase', + 'Test phase to run: "during-transition-period", "after-transition-period", "after-delegation-slashing-enabled"', + ) + .setAction(async (taskArgs, hre) => { + // Get test files for each phase + const duringTransitionPeriodFiles = await glob('test/integration/during-transition-period/**/*.{js,ts}') + const afterTransitionPeriodFiles = await glob('test/integration/after-transition-period/**/*.{js,ts}') + + // Display banner for the current test phase + printBanner(taskArgs.phase, 'INTEGRATION TESTS: ') + + // Run tests for the current phase + switch (taskArgs.phase) { + case 'during-transition-period': + await hre.run(TASK_TEST, { testFiles: duringTransitionPeriodFiles }) + break + case 'after-transition-period': + await hre.run(TASK_TEST, { testFiles: afterTransitionPeriodFiles }) + break + default: + throw new Error( + 'Invalid phase. Must be "during-transition-period", "after-transition-period", "after-delegation-slashing-enabled", or "all"', + ) + } + }) diff --git a/packages/subgraph-service/tasks/test/seed.ts b/packages/subgraph-service/tasks/test/seed.ts new file mode 100644 index 000000000..5c579f549 --- /dev/null +++ b/packages/subgraph-service/tasks/test/seed.ts @@ -0,0 +1,134 @@ +import { + encodeRegistrationData, + encodeStartServiceData, + generateAllocationProof, + generatePOI, + PaymentTypes, +} from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { task } from 'hardhat/config' + +task('test:seed', 'Seed the test environment, must be run after deployment').setAction(async (_, hre) => { + // Get contracts + const graph = hre.graph() + const horizonStaking = graph.horizon.contracts.HorizonStaking + const subgraphService = graph.subgraphService.contracts.SubgraphService + const disputeManager = graph.subgraphService.contracts.DisputeManager + + // Get contract addresses + const subgraphServiceAddress = await subgraphService.getAddress() + + // Get chain id + const chainId = (await hre.ethers.provider.getNetwork()).chainId + + // Get configs + const disputePeriod = await disputeManager.getDisputePeriod() + const maxSlashingCut = await disputeManager.maxSlashingCut() + + console.log('\n--- STEP 1: Close all legacy allocations ---') + + for (const indexer of indexers) { + // Skip indexers with no allocations + if (indexer.legacyAllocations.length === 0) { + continue + } + + console.log(`Closing allocations for indexer: ${indexer.address}`) + + // Get indexer signer + const indexerSigner = await hre.ethers.getSigner(indexer.address) + + // Close all allocations with POI != 0 + for (const allocation of indexer.legacyAllocations) { + console.log(`Closing allocation: ${allocation.allocationID}`) + + // Close allocation + const poi = generatePOI() + await horizonStaking.connect(indexerSigner).closeAllocation(allocation.allocationID, poi) + + const allocationData = await horizonStaking.getAllocation(allocation.allocationID) + console.log(`Allocation closed at epoch: ${allocationData.closedAtEpoch}`) + } + } + + console.log('\n--- STEP 2: Create provisions, set delegation cuts and register indexers ---') + + for (const indexer of indexers) { + // Create provision + console.log(`Creating subgraph service provision for indexer: ${indexer.address}`) + const indexerSigner = await hre.ethers.getSigner(indexer.address) + await horizonStaking + .connect(indexerSigner) + .provision( + indexer.address, + await subgraphService.getAddress(), + indexer.provisionTokens, + maxSlashingCut, + disputePeriod, + ) + console.log(`Provision created for indexer with ${indexer.provisionTokens} tokens`) + + // Set delegation fee cut + console.log(`Setting delegation fee cut for indexer: ${indexer.address}`) + await horizonStaking + .connect(indexerSigner) + .setDelegationFeeCut( + indexer.address, + subgraphServiceAddress, + PaymentTypes.IndexingRewards, + indexer.indexingRewardCut, + ) + await horizonStaking + .connect(indexerSigner) + .setDelegationFeeCut(indexer.address, subgraphServiceAddress, PaymentTypes.QueryFee, indexer.queryFeeCut) + + // Register indexer + console.log(`Registering indexer: ${indexer.address}`) + const indexerRegistrationData = encodeRegistrationData( + indexer.url, + indexer.geoHash, + indexer.rewardsDestination || hre.ethers.ZeroAddress, + ) + await subgraphService.connect(indexerSigner).register(indexerSigner.address, indexerRegistrationData) + + const indexerData = await subgraphService.indexers(indexerSigner.address) + + console.log(`Indexer registered at: ${indexerData.url} - ${indexerData.geoHash}`) + } + + console.log('\n--- STEP 3: Start allocations ---') + + for (const indexer of indexers) { + // Skip indexers with no allocations + if (indexer.allocations.length === 0) { + continue + } + + console.log(`Starting allocations for indexer: ${indexer.address}`) + + const indexerSigner = await hre.ethers.getSigner(indexer.address) + + for (const allocation of indexer.allocations) { + console.log(`Starting allocation: ${allocation.allocationID}`) + + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocation.allocationPrivateKey, + subgraphServiceAddress, + Number(chainId), + ) + const subgraphDeploymentId = allocation.subgraphDeploymentID + const allocationTokens = allocation.tokens + const allocationId = allocation.allocationID + + // Attempt to create an allocation with the same ID + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + + // Start allocation + await subgraphService.connect(indexerSigner).startService(indexerSigner.address, data) + + console.log(`Allocation started with tokens: ${allocationTokens}`) + } + } +}) diff --git a/packages/subgraph-service/test/deployment/DisputeManager.test.ts b/packages/subgraph-service/test/deployment/DisputeManager.test.ts new file mode 100644 index 000000000..92c588cf6 --- /dev/null +++ b/packages/subgraph-service/test/deployment/DisputeManager.test.ts @@ -0,0 +1,60 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { testIf } from '../../../horizon/test/deployment/lib/testIf' +import { transparentUpgradeableProxyTests } from '../../../horizon/test/deployment/lib/TransparentUpgradeableProxy.tests' + +const config = loadConfig( + './ignition/configs/', + 'migrate', + String(process.env.TEST_DEPLOYMENT_CONFIG ?? hre.network.name), +).config +const graph = hre.graph() + +const addressBookEntry = graph.subgraphService.addressBook.getEntry('DisputeManager') +const DisputeManager = graph.subgraphService.contracts.DisputeManager + +describe('DisputeManager', function () { + testIf(2)('should be owned by the governor', async function () { + const owner = await DisputeManager.owner() + expect(owner).to.equal(config.$global.governor) + }) + + testIf(2)('should set the right arbitrator', async function () { + const arbitrator = await DisputeManager.arbitrator() + expect(arbitrator).to.equal(config.$global.arbitrator) + }) + + testIf(2)('should set the right dispute period', async function () { + const disputePeriod = await DisputeManager.disputePeriod() + expect(disputePeriod).to.equal(config.DisputeManager.disputePeriod) + }) + + testIf(2)('should set the right dispute deposit', async function () { + const disputeDeposit = await DisputeManager.disputeDeposit() + expect(disputeDeposit).to.equal(config.DisputeManager.disputeDeposit) + }) + + testIf(2)('should set the right fisherman reward cut', async function () { + const fishermanRewardCut = await DisputeManager.fishermanRewardCut() + expect(fishermanRewardCut).to.equal(config.DisputeManager.fishermanRewardCut) + }) + + testIf(2)('should set the right max slashing cut', async function () { + const maxSlashingCut = await DisputeManager.maxSlashingCut() + expect(maxSlashingCut).to.equal(config.DisputeManager.maxSlashingCut) + }) + + testIf(2)('should set the right subgraph service address', async function () { + const subgraphService = await DisputeManager.subgraphService() + expect(subgraphService).to.equal(config.$global.subgraphServiceProxyAddress) + }) +}) + +transparentUpgradeableProxyTests( + 'DisputeManager', + addressBookEntry, + config.$global.governor as string, + Number(process.env.TEST_DEPLOYMENT_STEP ?? 1) >= 2, +) diff --git a/packages/subgraph-service/test/deployment/SubgraphService.test.ts b/packages/subgraph-service/test/deployment/SubgraphService.test.ts new file mode 100644 index 000000000..a3d14937a --- /dev/null +++ b/packages/subgraph-service/test/deployment/SubgraphService.test.ts @@ -0,0 +1,71 @@ +import { loadConfig } from '@graphprotocol/toolshed/hardhat' +import { expect } from 'chai' +import hre from 'hardhat' + +import { testIf } from '../../../horizon/test/deployment/lib/testIf' +import { transparentUpgradeableProxyTests } from '../../../horizon/test/deployment/lib/TransparentUpgradeableProxy.tests' + +const config = loadConfig('./ignition/configs/', 'migrate', hre.network.name).config +const graph = hre.graph() + +const addressBookEntry = graph.subgraphService.addressBook.getEntry('SubgraphService') +const SubgraphService = graph.subgraphService.contracts.SubgraphService + +describe('SubgraphService', function () { + testIf(2)('should be owned by the governor', async function () { + const owner = await SubgraphService.owner() + expect(owner).to.equal(config.$global.governor) + }) + + testIf(2)('should set the right minimum provision tokens', async function () { + const [minimumProvisionTokens] = await SubgraphService.getProvisionTokensRange() + expect(minimumProvisionTokens).to.equal(config.SubgraphService.minimumProvisionTokens) + }) + + testIf(2)('should set the right delegation ratio', async function () { + const delegationRatio = await SubgraphService.getDelegationRatio() + expect(delegationRatio).to.equal(config.SubgraphService.maximumDelegationRatio) + }) + + testIf(2)('should set the right stake to fees ratio', async function () { + const stakeToFeesRatio = await SubgraphService.stakeToFeesRatio() + expect(stakeToFeesRatio).to.equal(config.SubgraphService.stakeToFeesRatio) + }) + + testIf(2)('should set the right dispute manager address', async function () { + const disputeManagerAddress = await SubgraphService.getDisputeManager() + expect(disputeManagerAddress).to.equal(config.$global.disputeManagerProxyAddress) + }) + + testIf(2)('should set the right graph tally address', async function () { + const graphTallyAddress = await SubgraphService.getGraphTallyCollector() + expect(graphTallyAddress).to.equal(config.$global.graphTallyCollectorAddress) + }) + + testIf(2)('should set the right curation address', async function () { + const curationAddress = await SubgraphService.getCuration() + expect(curationAddress).to.equal(config.$global.curationProxyAddress) + }) + + testIf(2)('should set the right pause guardians', async function () { + expect(await SubgraphService.pauseGuardians(config.$global.pauseGuardian as string)).to.equal(true) + expect(await SubgraphService.pauseGuardians(config.$global.governor as string)).to.equal(true) + }) + + testIf(2)('should set the right maxPOIStaleness', async function () { + const maxPOIStaleness = await SubgraphService.maxPOIStaleness() + expect(maxPOIStaleness).to.equal(config.SubgraphService.maxPOIStaleness) + }) + + testIf(2)('should set the right curationCut', async function () { + const curationCut = await SubgraphService.curationFeesCut() + expect(curationCut).to.equal(config.SubgraphService.curationCut) + }) +}) + +transparentUpgradeableProxyTests( + 'SubgraphService', + addressBookEntry, + config.$global.governor as string, + Number(process.env.TEST_DEPLOYMENT_STEP ?? 1) >= 2, +) diff --git a/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/governance.test.ts b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/governance.test.ts new file mode 100644 index 000000000..8b3bfc17c --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/governance.test.ts @@ -0,0 +1,125 @@ +import { DisputeManager } from '@graphprotocol/interfaces' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('DisputeManager Governance', () => { + let disputeManager: DisputeManager + let snapshotId: string + + // Test addresses + let governor: HardhatEthersSigner + let nonOwner: HardhatEthersSigner + let newArbitrator: HardhatEthersSigner + let newSubgraphService: HardhatEthersSigner + + before(async () => { + const graph = hre.graph() + disputeManager = graph.subgraphService.contracts.DisputeManager + + // Get signers + governor = await graph.accounts.getGovernor() + ;[nonOwner, newArbitrator, newSubgraphService] = await graph.accounts.getTestAccounts() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Arbitrator', () => { + it('should set arbitrator', async () => { + await disputeManager.connect(governor).setArbitrator(newArbitrator.address) + expect(await disputeManager.arbitrator()).to.equal(newArbitrator.address) + }) + + it('should not allow non-owner to set arbitrator', async () => { + await expect(disputeManager.connect(nonOwner).setArbitrator(newArbitrator.address)).to.be.revertedWithCustomError( + disputeManager, + 'OwnableUnauthorizedAccount', + ) + }) + }) + + describe('Dispute Period', () => { + it('should set dispute period', async () => { + const newDisputePeriod = 7 * 24 * 60 * 60 // 7 days in seconds + await disputeManager.connect(governor).setDisputePeriod(newDisputePeriod) + expect(await disputeManager.disputePeriod()).to.equal(newDisputePeriod) + }) + + it('should not allow non-owner to set dispute period', async () => { + const newDisputePeriod = 7 * 24 * 60 * 60 + await expect(disputeManager.connect(nonOwner).setDisputePeriod(newDisputePeriod)).to.be.revertedWithCustomError( + disputeManager, + 'OwnableUnauthorizedAccount', + ) + }) + }) + + describe('Dispute Deposit', () => { + it('should set dispute deposit', async () => { + const newDisputeDeposit = ethers.parseEther('1000') + await disputeManager.connect(governor).setDisputeDeposit(newDisputeDeposit) + expect(await disputeManager.disputeDeposit()).to.equal(newDisputeDeposit) + }) + + it('should not allow non-owner to set dispute deposit', async () => { + const newDisputeDeposit = ethers.parseEther('1000') + await expect(disputeManager.connect(nonOwner).setDisputeDeposit(newDisputeDeposit)).to.be.revertedWithCustomError( + disputeManager, + 'OwnableUnauthorizedAccount', + ) + }) + }) + + describe('Fisherman Rewards Cut', () => { + it('should set fisherman rewards cut', async () => { + const newFishermanRewardsCut = 100000 // 10% in PPM + await disputeManager.connect(governor).setFishermanRewardCut(newFishermanRewardsCut) + expect(await disputeManager.fishermanRewardCut()).to.equal(newFishermanRewardsCut) + }) + + it('should not allow non-owner to set fisherman rewards cut', async () => { + const newFishermanRewardsCut = 100000 + await expect( + disputeManager.connect(nonOwner).setFishermanRewardCut(newFishermanRewardsCut), + ).to.be.revertedWithCustomError(disputeManager, 'OwnableUnauthorizedAccount') + }) + }) + + describe('Max Slashing Cut', () => { + it('should set max slashing cut', async () => { + const newMaxSlashingCut = 200000 // 20% in PPM + await disputeManager.connect(governor).setMaxSlashingCut(newMaxSlashingCut) + expect(await disputeManager.maxSlashingCut()).to.equal(newMaxSlashingCut) + }) + + it('should not allow non-owner to set max slashing cut', async () => { + const newMaxSlashingCut = 200000 + await expect(disputeManager.connect(nonOwner).setMaxSlashingCut(newMaxSlashingCut)).to.be.revertedWithCustomError( + disputeManager, + 'OwnableUnauthorizedAccount', + ) + }) + }) + + describe('Subgraph Service Address', () => { + it('should set subgraph service address', async () => { + await disputeManager.connect(governor).setSubgraphService(newSubgraphService.address) + expect(await disputeManager.subgraphService()).to.equal(newSubgraphService.address) + }) + + it('should not allow non-owner to set subgraph service address', async () => { + await expect( + disputeManager.connect(nonOwner).setSubgraphService(newSubgraphService.address), + ).to.be.revertedWithCustomError(disputeManager, 'OwnableUnauthorizedAccount') + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/indexing-disputes.test.ts b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/indexing-disputes.test.ts new file mode 100644 index 000000000..313cd155f --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/indexing-disputes.test.ts @@ -0,0 +1,271 @@ +import { DisputeManager, HorizonStaking, L2GraphToken, SubgraphService } from '@graphprotocol/interfaces' +import { generatePOI } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { EventLog } from 'ethers' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Indexing Disputes', () => { + let disputeManager: DisputeManager + let graphToken: L2GraphToken + let staking: HorizonStaking + let subgraphService: SubgraphService + + let snapshotId: string + + // Test addresses + let fisherman: HardhatEthersSigner + let arbitrator: HardhatEthersSigner + let indexer: HardhatEthersSigner + + let allocationId: string + + // Dispute manager variables + let disputeDeposit: bigint + let fishermanRewardCut: bigint + let disputePeriod: bigint + + before(async () => { + // Get contracts + const graph = hre.graph() + disputeManager = graph.subgraphService.contracts.DisputeManager + graphToken = graph.horizon.contracts.GraphToken + staking = graph.horizon.contracts.HorizonStaking + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get signers + arbitrator = await graph.accounts.getArbitrator() + ;[fisherman] = await graph.accounts.getTestAccounts() + + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + const allocation = indexerFixture.allocations[0] + allocationId = allocation.allocationID + + // Dispute manager variables + disputeDeposit = await disputeManager.disputeDeposit() + fishermanRewardCut = await disputeManager.fishermanRewardCut() + disputePeriod = await disputeManager.disputePeriod() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Fisherman', () => { + it('should allow fisherman to create an indexing dispute', async () => { + // Create dispute + const poi = generatePOI() + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const currentBlockNumber = await ethers.provider.getBlockNumber() + const tx = await disputeManager.connect(fisherman).createIndexingDispute(allocationId, poi, currentBlockNumber) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeCreatedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'IndexingDisputeCreated', + ) as EventLog + const disputeId = disputeCreatedEvent?.args[0] + + // Verify dispute was created + const dispute = await disputeManager.disputes(disputeId) + expect(dispute.indexer).to.equal(indexer.address, 'Indexer address mismatch') + expect(dispute.fisherman).to.equal(fisherman.address, 'Fisherman address mismatch') + expect(dispute.disputeType).to.equal(1, 'Dispute type should be indexing') + expect(dispute.status).to.equal(4, 'Dispute status should be pending') + }) + + it('should allow fisherman to cancel an indexing dispute', async () => { + // Create dispute + const poi = generatePOI() + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const currentBlockNumber = await ethers.provider.getBlockNumber() + const tx = await disputeManager.connect(fisherman).createIndexingDispute(allocationId, poi, currentBlockNumber) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeCreatedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'IndexingDisputeCreated', + ) as EventLog + const disputeId = disputeCreatedEvent?.args[0] + + // Get fisherman's balance before canceling dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Pass dispute period + await ethers.provider.send('evm_increaseTime', [Number(disputePeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Cancel dispute + await disputeManager.connect(fisherman).cancelDispute(disputeId) + + // Verify dispute was canceled + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(5, 'Dispute status should be canceled') + + // Verify fisherman got the deposit back + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + disputeDeposit, + 'Fisherman should receive the deposit back', + ) + }) + }) + + describe('Arbitrating Indexing Disputes', () => { + let disputeId: string + + beforeEach(async () => { + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const poi = generatePOI() + const currentBlockNumber = await ethers.provider.getBlockNumber() + const tx = await disputeManager.connect(fisherman).createIndexingDispute(allocationId, poi, currentBlockNumber) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeCreatedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'IndexingDisputeCreated', + ) as EventLog + disputeId = disputeCreatedEvent?.args[0] + }) + + it('should allow arbitrator to accept an indexing dispute', async () => { + // Get fisherman's balance before accepting dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before accepting dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + + // Accept dispute + await disputeManager.connect(arbitrator).acceptDispute(disputeId, tokensToSlash) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(1, 'Dispute status should be accepted') + + // Verify indexer's stake was slashed + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision - tokensToSlash, 'Indexer stake should be slashed') + + // Verify fisherman got the deposit plus the reward + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + const fishermanReward = (tokensToSlash * fishermanRewardCut) / 1000000n + const fishermanTotal = fishermanBalanceBefore + fishermanReward + disputeDeposit + expect(fishermanBalance).to.equal( + fishermanTotal, + 'Fisherman balance should be increased by the reward and deposit', + ) + }) + + it('should allow arbitrator to draw an indexing dispute', async () => { + // Get fisherman's balance before drawing dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before drawing dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Draw dispute + await disputeManager.connect(arbitrator).drawDispute(disputeId) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(3, 'Dispute status should be drawn') + + // Verify indexer's provision was not affected + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision, 'Indexer stake should not be affected') + + // Verify fisherman got the deposit back + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + disputeDeposit, + 'Fisherman should receive the deposit back', + ) + }) + + it('should allow arbitrator to reject an indexing dispute', async () => { + // Get fisherman's balance before rejecting dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before rejecting dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Reject dispute + await disputeManager.connect(arbitrator).rejectDispute(disputeId) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(2, 'Dispute status should be rejected') + + // Verify indexer's provision was not affected + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision, 'Indexer stake should not be affected') + + // Verify fisherman did not receive the deposit + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal(fishermanBalanceBefore, 'Fisherman balance should not receive the deposit back') + }) + + it('should not allow non-arbitrator to accept an indexing dispute', async () => { + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + + // Attempt to accept dispute as fisherman + await expect( + disputeManager.connect(fisherman).acceptDispute(disputeId, tokensToSlash), + ).to.be.revertedWithCustomError(disputeManager, 'DisputeManagerNotArbitrator') + }) + + it('should not allow non-arbitrator to draw an indexing dispute', async () => { + // Attempt to draw dispute as fisherman + await expect(disputeManager.connect(fisherman).drawDispute(disputeId)).to.be.revertedWithCustomError( + disputeManager, + 'DisputeManagerNotArbitrator', + ) + }) + + it('should not allow non-arbitrator to reject an indexing dispute', async () => { + // Attempt to reject dispute as fisherman + await expect(disputeManager.connect(fisherman).rejectDispute(disputeId)).to.be.revertedWithCustomError( + disputeManager, + 'DisputeManagerNotArbitrator', + ) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-conflict-disputes.test.ts b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-conflict-disputes.test.ts new file mode 100644 index 000000000..518b7b755 --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-conflict-disputes.test.ts @@ -0,0 +1,406 @@ +import { DisputeManager, HorizonStaking, L2GraphToken, SubgraphService } from '@graphprotocol/interfaces' +import { generateAttestationData } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { EventLog } from 'ethers' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Query Conflict Disputes', () => { + let disputeManager: DisputeManager + let graphToken: L2GraphToken + let staking: HorizonStaking + let subgraphService: SubgraphService + + let snapshotId: string + let chainId: number + + // Test addresses + let fisherman: HardhatEthersSigner + let arbitrator: HardhatEthersSigner + let indexer: HardhatEthersSigner + let relatedIndexer: HardhatEthersSigner + + // Allocation variables + let allocationPrivateKey: string + let relatedAllocationPrivateKey: string + let subgraphDeploymentId: string + + // Dispute manager variables + let disputeDeposit: bigint + let fishermanRewardCut: bigint + let disputePeriod: bigint + let disputeManagerAddress: string + + before(async () => { + // Get contracts + const graph = hre.graph() + disputeManager = graph.subgraphService.contracts.DisputeManager + graphToken = graph.horizon.contracts.GraphToken + staking = graph.horizon.contracts.HorizonStaking + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get signers + arbitrator = await graph.accounts.getArbitrator() + ;[fisherman] = await graph.accounts.getTestAccounts() + + // Get indexers + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + const relatedIndexerFixture = indexers[1] + relatedIndexer = await ethers.getSigner(relatedIndexerFixture.address) + + // Get allocation + const allocation = indexerFixture.allocations[0] + allocationPrivateKey = allocation.allocationPrivateKey + const relatedAllocation = relatedIndexerFixture.allocations[0] + relatedAllocationPrivateKey = relatedAllocation.allocationPrivateKey + subgraphDeploymentId = allocation.subgraphDeploymentID + + // Dispute manager variables + disputeDeposit = await disputeManager.disputeDeposit() + fishermanRewardCut = await disputeManager.fishermanRewardCut() + disputePeriod = await disputeManager.disputePeriod() + disputeManagerAddress = await disputeManager.getAddress() + + // Get chain ID + chainId = Number((await ethers.provider.getNetwork()).chainId) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Fisherman', () => { + it('should allow fisherman to create a query conflict dispute', async () => { + // Create dispute + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash1 = ethers.keccak256(ethers.toUtf8Bytes('test-response-1')) + const responseHash2 = ethers.keccak256(ethers.toUtf8Bytes('test-response-2')) + + // Create attestation data for both responses + const attestationData1 = await generateAttestationData( + queryHash, + responseHash1, + subgraphDeploymentId, + allocationPrivateKey, + disputeManagerAddress, + chainId, + ) + const attestationData2 = await generateAttestationData( + queryHash, + responseHash2, + subgraphDeploymentId, + relatedAllocationPrivateKey, + disputeManagerAddress, + chainId, + ) + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const tx = await disputeManager.connect(fisherman).createQueryDisputeConflict(attestationData1, attestationData2) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeLinkedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'DisputeLinked', + ) as EventLog + const disputeId = disputeLinkedEvent?.args[0] + const relatedDisputeId = disputeLinkedEvent?.args[1] + + // Verify dispute was created + const dispute = await disputeManager.disputes(disputeId) + expect(dispute.indexer).to.equal(indexer.address, 'Indexer address mismatch') + expect(dispute.fisherman).to.equal(fisherman.address, 'Fisherman address mismatch') + expect(dispute.disputeType).to.equal(2, 'Dispute type should be query') + expect(dispute.status).to.equal(4, 'Dispute status should be pending') + + // Verify related dispute was created + const relatedDispute = await disputeManager.disputes(relatedDisputeId) + expect(relatedDispute.indexer).to.equal(relatedIndexer.address, 'Related indexer address mismatch') + expect(relatedDispute.fisherman).to.equal(fisherman.address, 'Related fisherman address mismatch') + expect(relatedDispute.disputeType).to.equal(2, 'Related dispute type should be query') + expect(relatedDispute.status).to.equal(4, 'Related dispute status should be pending') + }) + + it('should allow fisherman to cancel a query conflict dispute', async () => { + // Create dispute + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash1 = ethers.keccak256(ethers.toUtf8Bytes('test-response-1')) + const responseHash2 = ethers.keccak256(ethers.toUtf8Bytes('test-response-2')) + + // Create attestation data for both responses + const attestationData1 = await generateAttestationData( + queryHash, + responseHash1, + subgraphDeploymentId, + allocationPrivateKey, + disputeManagerAddress, + chainId, + ) + const attestationData2 = await generateAttestationData( + queryHash, + responseHash2, + subgraphDeploymentId, + relatedAllocationPrivateKey, + disputeManagerAddress, + chainId, + ) + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const tx = await disputeManager.connect(fisherman).createQueryDisputeConflict(attestationData1, attestationData2) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeLinkedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'DisputeLinked', + ) as EventLog + const disputeId = disputeLinkedEvent?.args[0] + const relatedDisputeId = disputeLinkedEvent?.args[1] + + // Get fisherman's balance before canceling dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Pass dispute period + await ethers.provider.send('evm_increaseTime', [Number(disputePeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Cancel dispute + await disputeManager.connect(fisherman).cancelDispute(disputeId) + + // Verify dispute was canceled + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(5, 'Dispute status should be canceled') + + // Verify related dispute was canceled + const updatedRelatedDispute = await disputeManager.disputes(relatedDisputeId) + expect(updatedRelatedDispute.status).to.equal(5, 'Related dispute status should be canceled') + + // Verify fisherman got the deposit back + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + disputeDeposit, + 'Fisherman should receive the deposit back', + ) + }) + }) + + describe('Arbitrating Query Conflict Disputes', () => { + let disputeId: string + let relatedDisputeId: string + + beforeEach(async () => { + // Create dispute + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash1 = ethers.keccak256(ethers.toUtf8Bytes('test-response-1')) + const responseHash2 = ethers.keccak256(ethers.toUtf8Bytes('test-response-2')) + + // Create attestation data for both responses + const attestationData1 = await generateAttestationData( + queryHash, + responseHash1, + subgraphDeploymentId, + allocationPrivateKey, + disputeManagerAddress, + chainId, + ) + const attestationData2 = await generateAttestationData( + queryHash, + responseHash2, + subgraphDeploymentId, + relatedAllocationPrivateKey, + disputeManagerAddress, + chainId, + ) + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const tx = await disputeManager.connect(fisherman).createQueryDisputeConflict(attestationData1, attestationData2) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeLinkedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'DisputeLinked', + ) as EventLog + disputeId = disputeLinkedEvent?.args[0] + relatedDisputeId = disputeLinkedEvent?.args[1] + }) + + it('should allow arbitrator to accept one of the query conflict disputes', async () => { + // Get fisherman's balance before accepting dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before accepting dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + + // Accept dispute with first response + await disputeManager.connect(arbitrator).acceptDisputeConflict(disputeId, tokensToSlash, false, 0n) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(1, 'Dispute status should be accepted') + + // Verify indexer's stake was slashed + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision - tokensToSlash, 'Indexer stake should be slashed') + + // Verify fisherman got the deposit plus the reward + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + const fishermanReward = (tokensToSlash * fishermanRewardCut) / 1000000n + const fishermanTotal = fishermanBalanceBefore + fishermanReward + disputeDeposit + expect(fishermanBalance).to.equal( + fishermanTotal, + 'Fisherman balance should be increased by the reward and deposit', + ) + }) + + it('should allow arbitrator to accept both query conflict disputes', async () => { + // Get fisherman's balance before accepting dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before accepting dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + const provisionRelated = await staking.getProviderTokensAvailable( + relatedIndexer.address, + await subgraphService.getAddress(), + ) + + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const relatedDispute = await disputeManager.disputes(relatedDisputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + const tokensToSlashRelated = relatedDispute.stakeSnapshot / 10n + + // Accept dispute with both responses + await disputeManager + .connect(arbitrator) + .acceptDisputeConflict(disputeId, tokensToSlash, true, tokensToSlashRelated) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(1, 'Dispute status should be accepted') + + // Verify related dispute status + const updatedRelatedDispute = await disputeManager.disputes(relatedDisputeId) + expect(updatedRelatedDispute.status).to.equal(1, 'Related dispute status should be accepted') + + // Verify indexer's stake was slashed + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision - tokensToSlash, 'Indexer stake should be slashed') + + // Verify related indexer's stake was slashed + const updatedProvisionRelated = await staking.getProviderTokensAvailable( + relatedIndexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvisionRelated).to.equal( + provisionRelated - tokensToSlashRelated, + 'Related indexer stake should be slashed', + ) + + // Verify fisherman got the deposit plus the reward + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + const fishermanReward = ((tokensToSlash + tokensToSlashRelated) * fishermanRewardCut) / 1000000n + const fishermanTotal = fishermanBalanceBefore + fishermanReward + disputeDeposit + expect(fishermanBalance).to.equal( + fishermanTotal, + 'Fisherman balance should be increased by the reward and deposit', + ) + }) + + it('should allow arbitrator to draw query conflict dispute', async () => { + // Get fisherman's balance before drawing dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before drawing disputes + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + const provisionRelated = await staking.getProviderTokensAvailable( + relatedIndexer.address, + await subgraphService.getAddress(), + ) + + // Draw dispute + await disputeManager.connect(arbitrator).drawDispute(disputeId) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(3, 'Dispute status should be drawn') + + // Verify related dispute status + const updatedRelatedDispute = await disputeManager.disputes(relatedDisputeId) + expect(updatedRelatedDispute.status).to.equal(3, 'Related dispute status should be drawn') + + // Verify indexer's provision was not affected + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision, 'Indexer stake should not be affected') + + // Verify related indexer's provision was not affected + const updatedProvisionRelated = await staking.getProviderTokensAvailable( + relatedIndexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvisionRelated).to.equal(provisionRelated, 'Related indexer stake should not be affected') + + // Verify fisherman got the deposit back + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + disputeDeposit, + 'Fisherman should receive the deposit back', + ) + }) + + it('should not allow arbitrator to reject a query conflict dispute', async () => { + // Attempt to reject dispute + await expect(disputeManager.connect(arbitrator).rejectDispute(disputeId)).to.be.revertedWithCustomError( + disputeManager, + 'DisputeManagerDisputeInConflict', + ) + }) + + it('should not allow non-arbitrator to accept a query conflict dispute', async () => { + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + + // Attempt to accept dispute as fisherman + await expect( + disputeManager.connect(fisherman).acceptDispute(disputeId, tokensToSlash), + ).to.be.revertedWithCustomError(disputeManager, 'DisputeManagerNotArbitrator') + }) + + it('should not allow non-arbitrator to draw a query conflict dispute', async () => { + // Attempt to draw dispute as fisherman + await expect(disputeManager.connect(fisherman).drawDispute(disputeId)).to.be.revertedWithCustomError( + disputeManager, + 'DisputeManagerNotArbitrator', + ) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-disputes.test.ts b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-disputes.test.ts new file mode 100644 index 000000000..da17ecb8e --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/dispute-manager/query-disputes.test.ts @@ -0,0 +1,315 @@ +import { DisputeManager, HorizonStaking, L2GraphToken, SubgraphService } from '@graphprotocol/interfaces' +import { generateAttestationData } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { EventLog } from 'ethers' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Query Disputes', () => { + let disputeManager: DisputeManager + let graphToken: L2GraphToken + let staking: HorizonStaking + let subgraphService: SubgraphService + + let snapshotId: string + let chainId: number + // Test addresses + let fisherman: HardhatEthersSigner + let arbitrator: HardhatEthersSigner + let indexer: HardhatEthersSigner + + // Allocation variables + let allocationPrivateKey: string + let subgraphDeploymentId: string + + // Dispute manager variables + let disputeDeposit: bigint + let fishermanRewardCut: bigint + let disputePeriod: bigint + let disputeManagerAddress: string + + before(async () => { + // Get contracts + const graph = hre.graph() + disputeManager = graph.subgraphService.contracts.DisputeManager + graphToken = graph.horizon.contracts.GraphToken + staking = graph.horizon.contracts.HorizonStaking + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get signers + arbitrator = await graph.accounts.getArbitrator() + ;[fisherman] = await graph.accounts.getTestAccounts() + + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + const allocation = indexerFixture.allocations[0] + allocationPrivateKey = allocation.allocationPrivateKey + subgraphDeploymentId = allocation.subgraphDeploymentID + + // Dispute manager variables + disputeDeposit = await disputeManager.disputeDeposit() + fishermanRewardCut = await disputeManager.fishermanRewardCut() + disputePeriod = await disputeManager.disputePeriod() + disputeManagerAddress = await disputeManager.getAddress() + + // Get chain ID + chainId = Number((await ethers.provider.getNetwork()).chainId) + + // Set GRT balance for fisherman + await setGRTBalance(graph.provider, graphToken.target, fisherman.address, ethers.parseEther('1000000')) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Fisherman', () => { + it('should allow fisherman to create a query dispute', async () => { + // Create dispute + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash = ethers.keccak256(ethers.toUtf8Bytes('test-response')) + + // Create attestation data + const attestationData = await generateAttestationData( + queryHash, + responseHash, + subgraphDeploymentId, + allocationPrivateKey, + disputeManagerAddress, + chainId, + ) + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const tx = await disputeManager.connect(fisherman).createQueryDispute(attestationData) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeCreatedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'QueryDisputeCreated', + ) as EventLog + const disputeId = disputeCreatedEvent?.args[0] + + // Verify dispute was created + const dispute = await disputeManager.disputes(disputeId) + expect(dispute.indexer).to.equal(indexer.address, 'Indexer address mismatch') + expect(dispute.fisherman).to.equal(fisherman.address, 'Fisherman address mismatch') + expect(dispute.disputeType).to.equal(2, 'Dispute type should be query') + expect(dispute.status).to.equal(4, 'Dispute status should be pending') + }) + + it('should allow fisherman to cancel a query dispute after dispute period', async () => { + // Create dispute + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash = ethers.keccak256(ethers.toUtf8Bytes('test-response')) + + // Create attestation data + const attestationData = await generateAttestationData( + queryHash, + responseHash, + subgraphDeploymentId, + allocationPrivateKey, + disputeManagerAddress, + chainId, + ) + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const tx = await disputeManager.connect(fisherman).createQueryDispute(attestationData) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeCreatedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'QueryDisputeCreated', + ) as EventLog + const disputeId = disputeCreatedEvent?.args[0] + + // Get fisherman's balance before canceling dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Pass dispute period + await ethers.provider.send('evm_increaseTime', [Number(disputePeriod) + 1]) + await ethers.provider.send('evm_mine', []) + + // Cancel dispute + await disputeManager.connect(fisherman).cancelDispute(disputeId) + + // Verify dispute was canceled + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(5, 'Dispute status should be canceled') + + // Verify fisherman got the deposit back + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + disputeDeposit, + 'Fisherman should receive the deposit back', + ) + }) + }) + + describe('Arbitrating Query Disputes', () => { + let disputeId: string + + beforeEach(async () => { + // Create dispute + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash = ethers.keccak256(ethers.toUtf8Bytes('test-response')) + + // Create attestation data + const attestationData = await generateAttestationData( + queryHash, + responseHash, + subgraphDeploymentId, + allocationPrivateKey, + disputeManagerAddress, + chainId, + ) + + // Approve dispute manager for dispute deposit + await graphToken.connect(fisherman).approve(disputeManager.target, disputeDeposit) + + // Create dispute + const tx = await disputeManager.connect(fisherman).createQueryDispute(attestationData) + const receipt = await tx.wait() + + // Get dispute ID from event + const disputeCreatedEvent = receipt?.logs.find( + (log) => log instanceof EventLog && log.fragment?.name === 'QueryDisputeCreated', + ) as EventLog + disputeId = disputeCreatedEvent?.args[0] + }) + + it('should allow arbitrator to accept a query dispute', async () => { + // Get fisherman's balance before accepting dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before accepting dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + + // Accept dispute + await disputeManager.connect(arbitrator).acceptDispute(disputeId, tokensToSlash) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(1, 'Dispute status should be accepted') + + // Verify indexer's stake was slashed + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision - tokensToSlash, 'Indexer stake should be slashed') + + // Verify fisherman got the deposit plus the reward + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + const fishermanReward = (tokensToSlash * fishermanRewardCut) / 1000000n + const fishermanTotal = fishermanBalanceBefore + fishermanReward + disputeDeposit + expect(fishermanBalance).to.equal( + fishermanTotal, + 'Fisherman balance should be increased by the reward and deposit', + ) + }) + + it('should allow arbitrator to draw a query dispute', async () => { + // Get fisherman's balance before drawing dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before drawing dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Draw dispute + await disputeManager.connect(arbitrator).drawDispute(disputeId) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(3, 'Dispute status should be drawn') + + // Verify indexer's provision was not affected + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision, 'Indexer stake should not be affected') + + // Verify fisherman got the deposit back + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + disputeDeposit, + 'Fisherman should receive the deposit back', + ) + }) + + it('should allow arbitrator to reject a query dispute', async () => { + // Get fisherman's balance before rejecting dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before rejecting dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Reject dispute + await disputeManager.connect(arbitrator).rejectDispute(disputeId) + + // Verify dispute status + const updatedDispute = await disputeManager.disputes(disputeId) + expect(updatedDispute.status).to.equal(2, 'Dispute status should be rejected') + + // Verify indexer's provision was not affected + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision, 'Indexer stake should not be affected') + + // Verify fisherman did not receive the deposit + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal(fishermanBalanceBefore, 'Fisherman balance should not receive the deposit back') + }) + + it('should not allow non-arbitrator to accept a query dispute', async () => { + // Get indexer stake snapshot + const dispute = await disputeManager.disputes(disputeId) + const tokensToSlash = dispute.stakeSnapshot / 10n + + // Attempt to accept dispute as fisherman + await expect( + disputeManager.connect(fisherman).acceptDispute(disputeId, tokensToSlash), + ).to.be.revertedWithCustomError(disputeManager, 'DisputeManagerNotArbitrator') + }) + + it('should not allow non-arbitrator to draw a query dispute', async () => { + // Attempt to draw dispute as fisherman + await expect(disputeManager.connect(fisherman).drawDispute(disputeId)).to.be.revertedWithCustomError( + disputeManager, + 'DisputeManagerNotArbitrator', + ) + }) + + it('should not allow non-arbitrator to reject a query dispute', async () => { + // Attempt to reject dispute as fisherman + await expect(disputeManager.connect(fisherman).rejectDispute(disputeId)).to.be.revertedWithCustomError( + disputeManager, + 'DisputeManagerNotArbitrator', + ) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/pause.test.ts b/packages/subgraph-service/test/integration/after-transition-period/pause.test.ts new file mode 100644 index 000000000..f3a224bf7 --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/pause.test.ts @@ -0,0 +1,41 @@ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +describe('Pausing', () => { + let snapshotId: string + + // Test addresses + let pauseGuardian: HardhatEthersSigner + let governor: HardhatEthersSigner + const graph = hre.graph() + const subgraphService = graph.subgraphService.contracts.SubgraphService + + before(async () => { + pauseGuardian = await graph.accounts.getPauseGuardian() + governor = await graph.accounts.getGovernor() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('SubgraphService', () => { + it('should be pausable by pause guardian', async () => { + await subgraphService.connect(pauseGuardian).pause() + expect(await subgraphService.paused()).to.equal(true) + }) + + it('should be pausable by governor', async () => { + await subgraphService.connect(governor).pause() + expect(await subgraphService.paused()).to.equal(true) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/governance.test.ts b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/governance.test.ts new file mode 100644 index 000000000..5f033747a --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/governance.test.ts @@ -0,0 +1,167 @@ +import { SubgraphService } from '@graphprotocol/interfaces' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Subgraph Service Governance', () => { + let subgraphService: SubgraphService + let snapshotId: string + + // Test addresses + let governor: HardhatEthersSigner + let nonOwner: HardhatEthersSigner + let pauseGuardian: HardhatEthersSigner + + before(async () => { + const graph = hre.graph() + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get signers + governor = await graph.accounts.getGovernor() + ;[nonOwner, pauseGuardian] = await graph.accounts.getTestAccounts() + + // Set eth balance for non-owner and pause guardian + await ethers.provider.send('hardhat_setBalance', [nonOwner.address, '0x56BC75E2D63100000']) + await ethers.provider.send('hardhat_setBalance', [pauseGuardian.address, '0x56BC75E2D63100000']) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Minimum Provision Tokens', () => { + it('should set minimum provision tokens', async () => { + const newMinimumProvisionTokens = ethers.parseEther('1000') + await subgraphService.connect(governor).setMinimumProvisionTokens(newMinimumProvisionTokens) + + // Get the provision tokens range + const [minTokens, maxTokens] = await subgraphService.getProvisionTokensRange() + expect(minTokens).to.equal(newMinimumProvisionTokens, 'Minimum provision tokens should be set') + expect(maxTokens).to.equal(ethers.MaxUint256, 'Maximum provision tokens should be set') + }) + + it('should not allow non-owner to set minimum provision tokens', async () => { + const newMinimumProvisionTokens = ethers.parseEther('1000') + await expect( + subgraphService.connect(nonOwner).setMinimumProvisionTokens(newMinimumProvisionTokens), + 'Non-owner should not be able to set minimum provision tokens', + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + }) + + describe('Pause Guardian', () => { + it('should set pause guardian and allow them to pause the service', async () => { + // Set pause guardian + await subgraphService.connect(governor).setPauseGuardian(pauseGuardian.address, true) + + // Pause guardian should be able to pause the service + await subgraphService.connect(pauseGuardian).pause() + expect(await subgraphService.paused(), 'Pause guardian should be able to pause the service').to.be.true + }) + + it('should remove pause guardian and prevent them from pausing the service', async () => { + // First set pause guardian + await subgraphService.connect(governor).setPauseGuardian(pauseGuardian.address, true) + + // Check that pause guardian can pause the service + await subgraphService.connect(pauseGuardian).pause() + expect(await subgraphService.paused(), 'Pause guardian should be able to pause the service').to.be.true + + // Then remove pause guardian + await subgraphService.connect(governor).setPauseGuardian(pauseGuardian.address, false) + + // Pause guardian should no longer be able to unpause the service + await expect( + subgraphService.connect(pauseGuardian).unpause(), + 'Pause guardian should no longer be able to unpause the service', + ).to.be.revertedWithCustomError(subgraphService, 'DataServicePausableNotPauseGuardian') + }) + + it('should not allow non-owner to set pause guardian', async () => { + await expect( + subgraphService.connect(nonOwner).setPauseGuardian(pauseGuardian.address, true), + 'Non-owner should not be able to set pause guardian', + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + }) + + describe('Delegation Ratio', () => { + it('should set delegation ratio', async () => { + const newDelegationRatio = 5 + await subgraphService.connect(governor).setDelegationRatio(newDelegationRatio) + expect(await subgraphService.getDelegationRatio(), 'Delegation ratio should be set').to.equal(newDelegationRatio) + }) + + it('should not allow non-owner to set delegation ratio', async () => { + const newDelegationRatio = 5 + await expect( + subgraphService.connect(nonOwner).setDelegationRatio(newDelegationRatio), + 'Non-owner should not be able to set delegation ratio', + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + }) + + describe('Stake to Fees Ratio', () => { + it('should set stake to fees ratio', async () => { + const newStakeToFeesRatio = ethers.parseEther('1') + await subgraphService.connect(governor).setStakeToFeesRatio(newStakeToFeesRatio) + + // Get the stake to fees ratio by calling a function that uses it + const stakeToFeesRatio = await subgraphService.stakeToFeesRatio() + expect(stakeToFeesRatio).to.equal(newStakeToFeesRatio, 'Stake to fees ratio should be set') + }) + + it('should not allow non-owner to set stake to fees ratio', async () => { + const newStakeToFeesRatio = ethers.parseEther('1') + await expect( + subgraphService.connect(nonOwner).setStakeToFeesRatio(newStakeToFeesRatio), + 'Non-owner should not be able to set stake to fees ratio', + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + }) + + describe('Max POI Staleness', () => { + it('should set max POI staleness', async () => { + const newMaxPOIStaleness = 3600 // 1 hour in seconds + await subgraphService.connect(governor).setMaxPOIStaleness(newMaxPOIStaleness) + + // Get the max POI staleness + const maxPOIStaleness = await subgraphService.maxPOIStaleness() + expect(maxPOIStaleness).to.equal(newMaxPOIStaleness, 'Max POI staleness should be set') + }) + + it('should not allow non-owner to set max POI staleness', async () => { + const newMaxPOIStaleness = 3600 + await expect( + subgraphService.connect(nonOwner).setMaxPOIStaleness(newMaxPOIStaleness), + 'Non-owner should not be able to set max POI staleness', + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + }) + + describe('Curation Cut', () => { + it('should set curation cut', async () => { + const newCurationCut = 100000 // 10% in PPM + await subgraphService.connect(governor).setCurationCut(newCurationCut) + + // Get the curation cut + const curationCut = await subgraphService.curationFeesCut() + expect(curationCut).to.equal(newCurationCut, 'Curation cut should be set') + }) + + it('should not allow non-owner to set curation cut', async () => { + const newCurationCut = 100000 + await expect( + subgraphService.connect(nonOwner).setCurationCut(newCurationCut), + 'Non-owner should not be able to set curation cut', + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/indexer.test.ts b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/indexer.test.ts new file mode 100644 index 000000000..4295a90e0 --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/indexer.test.ts @@ -0,0 +1,734 @@ +import { + GraphPayments, + GraphTallyCollector, + HorizonStaking, + L2GraphToken, + PaymentsEscrow, + SubgraphService, +} from '@graphprotocol/interfaces' +import { + encodeCollectIndexingRewardsData, + encodeCollectQueryFeesData, + encodePOIMetadata, + encodeStartServiceData, + generateAllocationProof, + generatePOI, + generateSignedRAV, + generateSignerProof, + PaymentTypes, +} from '@graphprotocol/toolshed' +import { delegators, IndexerData as Indexer, indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { HDNodeWallet } from 'ethers' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Indexer', () => { + let escrow: PaymentsEscrow + let graphPayments: GraphPayments + let graphTallyCollector: GraphTallyCollector + let graphToken: L2GraphToken + let staking: HorizonStaking + let subgraphService: SubgraphService + + let snapshotId: string + let chainId: number + + // Test addresses + let indexer: HardhatEthersSigner + let graphTallyCollectorAddress: string + let subgraphServiceAddress: string + + const graph = hre.graph() + const { collect } = graph.subgraphService.actions + + before(async () => { + // Get contracts + escrow = graph.horizon.contracts.PaymentsEscrow + graphPayments = graph.horizon.contracts.GraphPayments + graphTallyCollector = graph.horizon.contracts.GraphTallyCollector + graphToken = graph.horizon.contracts.GraphToken + staking = graph.horizon.contracts.HorizonStaking + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get contract addresses + graphTallyCollectorAddress = await graphTallyCollector.getAddress() + subgraphServiceAddress = await subgraphService.getAddress() + + // Get chain ID + chainId = Number((await ethers.provider.getNetwork()).chainId) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Indexer Registration', () => { + let indexerUrl: string + let indexerGeoHash: string + + beforeEach(async () => { + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + indexerUrl = indexerFixture.url + indexerGeoHash = indexerFixture.geoHash + }) + + it('should register indexer with valid parameters', async () => { + // Verify indexer metadata + const indexerInfo = await subgraphService.indexers(indexer.address) + expect(indexerInfo.url).to.equal(indexerUrl) + expect(indexerInfo.geoHash).to.equal(indexerGeoHash) + }) + }) + + describe('Allocation Management', () => { + let allocationId: string + let allocationPrivateKey: string + let allocationTokens: bigint + let subgraphDeploymentId: string + let indexerFixture: Indexer + + before(async () => { + // Get indexer data + indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + }) + + describe('New allocation', () => { + let provisionTokens: bigint + + before(() => { + // Generate new allocation ID and private key + const wallet = ethers.Wallet.createRandom() + allocationId = wallet.address + allocationPrivateKey = wallet.privateKey + allocationTokens = ethers.parseEther('1000') + subgraphDeploymentId = indexerFixture.allocations[0].subgraphDeploymentID + + // Get provision tokens + provisionTokens = indexerFixture.provisionTokens + }) + + it('should start an allocation with valid parameters', async () => { + // Get locked tokens before allocation + const beforeLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Attempt to create an allocation with the same ID + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + + // Start allocation + await subgraphService.connect(indexer).startService(indexer.address, data) + + // Verify allocation + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.indexer).to.equal(indexer.address, 'Allocation indexer is not the expected indexer') + expect(allocation.tokens).to.equal(allocationTokens, 'Allocation tokens are not the expected tokens') + expect(allocation.subgraphDeploymentId).to.equal( + subgraphDeploymentId, + 'Allocation subgraph deployment ID is not the expected subgraph deployment ID', + ) + + // Verify tokens are locked + const afterLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + expect(afterLockedTokens).to.equal(beforeLockedTokens + allocationTokens) + }) + + it('should be able to start an allocation with zero tokens', async () => { + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Attempt to create an allocation with the same ID + const data = encodeStartServiceData(subgraphDeploymentId, 0n, allocationId, signature) + + // Start allocation with zero tokens + await subgraphService.connect(indexer).startService(indexer.address, data) + + // Verify allocation + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.indexer).to.equal(indexer.address, 'Allocation indexer is not the expected indexer') + expect(allocation.tokens).to.equal(0, 'Allocation tokens are not zero') + expect(allocation.subgraphDeploymentId).to.equal( + subgraphDeploymentId, + 'Allocation subgraph deployment ID is not the expected subgraph deployment ID', + ) + }) + + it('should not start an allocation without enough tokens', async () => { + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Build allocation data + const allocationTokens = provisionTokens + ethers.parseEther('10000000') + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + + // Attempt to open allocation with excessive tokens + await expect( + subgraphService.connect(indexer).startService(indexer.address, data), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionTrackerInsufficientTokens') + }) + }) + + describe('Existing allocation', () => { + beforeEach(() => { + // Get allocation data + const allocation = indexerFixture.allocations[0] + allocationId = allocation.allocationID + allocationTokens = allocation.tokens + subgraphDeploymentId = allocation.subgraphDeploymentID + }) + + describe('Resize allocation', () => { + it('should resize an open allocation increasing tokens', async () => { + // Get locked tokens before resize + const beforeLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + + // Resize allocation + const increaseTokens = ethers.parseEther('5000') + const newAllocationTokens = allocationTokens + increaseTokens + await subgraphService.connect(indexer).resizeAllocation(indexer.address, allocationId, newAllocationTokens) + + // Verify allocation + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.tokens).to.equal(newAllocationTokens, 'Allocation tokens were not resized') + + // Verify tokens are locked + const afterLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + expect(afterLockedTokens).to.equal(beforeLockedTokens + increaseTokens) + }) + + it('should resize an open allocation decreasing tokens', async () => { + // Get locked tokens before resize + const beforeLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + + // Resize allocation + const decreaseTokens = ethers.parseEther('5000') + const newAllocationTokens = allocationTokens - decreaseTokens + await subgraphService.connect(indexer).resizeAllocation(indexer.address, allocationId, newAllocationTokens) + + // Verify allocation + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.tokens).to.equal(newAllocationTokens) + + // Verify tokens are released + const afterLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + expect(afterLockedTokens).to.equal(beforeLockedTokens - decreaseTokens) + }) + }) + + describe('Close allocation', () => { + it('should be able to close an allocation', async () => { + // Get before locked tokens + const beforeLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + + // Close allocation + const data = ethers.AbiCoder.defaultAbiCoder().encode(['address'], [allocationId]) + await subgraphService.connect(indexer).stopService(indexer.address, data) + + // Verify allocation is closed + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.closedAt).to.not.equal(0) + + // Verify tokens are released + const afterLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + expect(afterLockedTokens).to.equal(beforeLockedTokens - allocationTokens) + }) + }) + }) + }) + + describe('Indexing Rewards', () => { + let allocationId: string + let indexingRewardCut: number + + describe('With delegation pool tokens greater than zero', () => { + describe('Re-provisioning', () => { + let otherAllocationId: string + + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + indexingRewardCut = indexerFixture.indexingRewardCut + + // Get allocations + allocationId = indexerFixture.allocations[0].allocationID + otherAllocationId = indexerFixture.allocations[1].allocationID + + // Check rewards destination is not set + const paymentsDestination = await subgraphService.paymentsDestination(indexer.address) + expect(paymentsDestination).to.equal(ethers.ZeroAddress, 'Payments destination should be zero address') + }) + + it('should collect indexing rewards with re-provisioning', async () => { + // Get before provision and delegation pool tokens + const beforeProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + const beforeDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 1000; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const data = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + // Collect rewards + const rewards = await collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, data]) + expect(rewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Verify rewards are added to delegation pool + const delegationRewards = (rewards * BigInt(indexingRewardCut)) / BigInt(1e6) + const afterDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + expect(afterDelegationPoolTokens).to.equal( + beforeDelegationPoolTokens + delegationRewards, + 'Rewards should be added to delegation pool', + ) + + // Verify rewards are added to provision + const indexerRewards = rewards - delegationRewards + const afterProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + expect(afterProvisionTokens).to.equal( + beforeProvisionTokens + indexerRewards, + 'Rewards should be added to provision', + ) + }) + + it('should collect rewards continuously for multiple allocations', async () => { + // Get before provision and delegation pool tokens + const beforeProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + const beforeDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const allocationData = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + const otherAllocationData = encodeCollectIndexingRewardsData(otherAllocationId, poi, poiMetadata) + + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 1000; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Collect rewards for first allocation + let rewards = await collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, allocationData]) + expect(rewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Collect rewards for second allocation + let otherRewards = await collect(indexer, [ + indexer.address, + PaymentTypes.IndexingRewards, + otherAllocationData, + ]) + expect(otherRewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Verify rewards are added to delegation pool + const delegationRewards = + (rewards * BigInt(indexingRewardCut)) / BigInt(1e6) + + (otherRewards * BigInt(indexingRewardCut)) / BigInt(1e6) + const afterDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + expect(afterDelegationPoolTokens).to.equal( + beforeDelegationPoolTokens + delegationRewards, + 'Rewards should be continuously added to delegation pool', + ) + + // Verify rewards collected + const indexerRewards = rewards + otherRewards - delegationRewards + const afterFirstCollectionProvisionTokens = ( + await staking.getProvision(indexer.address, subgraphService.target) + ).tokens + expect(afterFirstCollectionProvisionTokens).to.equal( + beforeProvisionTokens + indexerRewards, + 'Rewards should be continuously added to provision', + ) + + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 500; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Collect rewards for first allocation + rewards = await collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, allocationData]) + expect(rewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Collect rewards for second allocation + otherRewards = await collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, otherAllocationData]) + expect(otherRewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Verify rewards are added to delegation pool + const secondCollectionDelegationRewards = + (rewards * BigInt(indexingRewardCut)) / BigInt(1e6) + + (otherRewards * BigInt(indexingRewardCut)) / BigInt(1e6) + const afterSecondCollectionDelegationPoolTokens = ( + await staking.getDelegationPool(indexer.address, subgraphService.target) + ).tokens + expect(afterSecondCollectionDelegationPoolTokens).to.equal( + afterDelegationPoolTokens + secondCollectionDelegationRewards, + 'Rewards should be continuously added to delegation pool', + ) + + // Verify total rewards collected + const secondCollectionIndexerRewards = rewards + otherRewards - secondCollectionDelegationRewards + const afterSecondCollectionProvisionTokens = ( + await staking.getProvision(indexer.address, subgraphService.target) + ).tokens + expect(afterSecondCollectionProvisionTokens).to.equal( + afterFirstCollectionProvisionTokens + secondCollectionIndexerRewards, + 'Rewards should be collected continuously', + ) + }) + + it('should not collect rewards after POI staleness', async () => { + // Get before provision tokens + const beforeProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + + // Wait for POI staleness + const maxPOIStaleness = await subgraphService.maxPOIStaleness() + await ethers.provider.send('evm_increaseTime', [Number(maxPOIStaleness) + 1]) + await ethers.provider.send('evm_mine', []) + + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const data = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + // Attempt to collect rewards + await subgraphService.connect(indexer).collect(indexer.address, PaymentTypes.IndexingRewards, data) + + // Verify no rewards were collected + const afterProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + expect(afterProvisionTokens).to.equal( + beforeProvisionTokens, + 'Rewards should not be collected after POI staleness', + ) + }) + + describe('Over allocated', () => { + let subgraphDeploymentId: string + let delegator: HardhatEthersSigner + let allocationPrivateKey: string + beforeEach(async () => { + // Get delegator + delegator = await ethers.getSigner(delegators[0].address) + + // Get locked tokens + const lockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + + // Get delegation ratio + const delegationRatio = await subgraphService.getDelegationRatio() + const availableTokens = await staking.getTokensAvailable( + indexer.address, + subgraphService.target, + delegationRatio, + ) + + // Create allocation with tokens available + const wallet = ethers.Wallet.createRandom() + allocationId = wallet.address + allocationPrivateKey = wallet.privateKey + subgraphDeploymentId = indexers[0].allocations[0].subgraphDeploymentID + const allocationTokens = availableTokens - lockedTokens + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + await subgraphService.connect(indexer).startService(indexer.address, data) + + // Undelegate from indexer so they become over allocated + const delegation = await staking.getDelegation(indexer.address, subgraphService.target, delegator.address) + + // Undelegate tokens + await staking + .connect(delegator) + ['undelegate(address,address,uint256)'](indexer.address, subgraphServiceAddress, delegation.shares) + }) + + it('should collect rewards while over allocated with fresh POI', async () => { + // Get before provision tokens + const beforeProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 1000; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const data = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + // Collect rewards + const rewards = await collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, data]) + expect(rewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Verify rewards are added to provision + const afterProvisionTokens = (await staking.getProvision(indexer.address, subgraphService.target)).tokens + expect(afterProvisionTokens).to.equal(beforeProvisionTokens + rewards, 'Rewards should be collected') + + // Verify allocation was closed + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.closedAt).to.not.equal(0) + }) + }) + }) + }) + + describe('With delegation pool tokens equal to zero', () => { + describe('With rewards destination', () => { + let paymentsDestination: string + + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[1] + indexer = await ethers.getSigner(indexerFixture.address) + indexingRewardCut = indexerFixture.indexingRewardCut + + // Get allocation + const allocation = indexerFixture.allocations[0] + allocationId = allocation.allocationID + + // Check rewards destination is set + paymentsDestination = await subgraphService.paymentsDestination(indexer.address) + expect(paymentsDestination).not.equal(ethers.ZeroAddress, 'Payments destination should be set') + }) + + it('should collect indexing rewards with rewards destination', async () => { + // Get before balance of rewards destination + const beforePaymentsDestinationBalance = await graphToken.balanceOf(paymentsDestination) + + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 500; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const data = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + // Collect rewards + const rewards = await collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, data]) + expect(rewards).to.not.equal(0n, 'Rewards should be greater than zero') + + // Verify rewards are transferred to payments destination + const afterPaymentsDestinationBalance = await graphToken.balanceOf(paymentsDestination) + expect(afterPaymentsDestinationBalance).to.equal( + beforePaymentsDestinationBalance + rewards, + 'Rewards should be transferred to payments destination', + ) + }) + }) + }) + }) + + describe('Query Fees', () => { + let payer: HDNodeWallet + let signer: HDNodeWallet + let allocationId: string + let otherAllocationId: string + let collectTokens: bigint + let queryFeeCut: number + + before(async () => { + // Get payer + payer = ethers.Wallet.createRandom() + payer = payer.connect(ethers.provider) + + // Get signer + signer = ethers.Wallet.createRandom() + + // Mint GRT to payer and fund payer and signer with ETH + await setGRTBalance(graph.provider, graphToken.target, payer.address, ethers.parseEther('1000000')) + await ethers.provider.send('hardhat_setBalance', [payer.address, '0x56BC75E2D63100000']) + await ethers.provider.send('hardhat_setBalance', [signer.address, '0x56BC75E2D63100000']) + + // Authorize payer as signer + // Block timestamp plus 1 year + const proofDeadline = (await ethers.provider.getBlock('latest'))!.timestamp + 31536000 + const signerProof = generateSignerProof( + BigInt(proofDeadline), + payer.address, + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + await graphTallyCollector.connect(payer).authorizeSigner(signer.address, proofDeadline, signerProof) + + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + queryFeeCut = indexerFixture.queryFeeCut + // Get allocation + allocationId = indexerFixture.allocations[0].allocationID + otherAllocationId = indexerFixture.allocations[1].allocationID + // Get collect tokens + collectTokens = ethers.parseUnits('1000') + }) + + beforeEach(async () => { + // Deposit tokens in escrow + await graphToken.connect(payer).approve(escrow.target, collectTokens) + await escrow.connect(payer).deposit(graphTallyCollector.target, indexer.address, collectTokens) + }) + + it('should collect query fees with SignedRAV', async () => { + const { rav, signature } = await generateSignedRAV( + allocationId, + payer.address, + indexer.address, + subgraphServiceAddress, + 0n, + collectTokens, + ethers.toUtf8Bytes(''), + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + const encodedSignedRAV = encodeCollectQueryFeesData(rav, signature, 0n) + + // Get balance and delegation pool tokens before collect + const beforeIndexerStake = await staking.getStake(indexer.address) + const beforeDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + + // Collect query fees + await collect(indexer, [indexer.address, PaymentTypes.QueryFee, encodedSignedRAV]) + + // Calculate expected rewards + const rewardsAfterTax = + collectTokens - (collectTokens * BigInt(await graphPayments.PROTOCOL_PAYMENT_CUT())) / BigInt(1e6) + const rewardsAfterCuration = + rewardsAfterTax - (rewardsAfterTax * BigInt(await subgraphService.curationFeesCut())) / BigInt(1e6) + + // Verify tokens where added to delegation pool + const delegatorTokens = (rewardsAfterCuration * BigInt(queryFeeCut)) / BigInt(1e6) + const afterDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + expect(afterDelegationPoolTokens).to.equal(beforeDelegationPoolTokens + delegatorTokens) + + // Verify indexer received tokens were automatically restaked + const indexerTokens = rewardsAfterCuration - delegatorTokens + const afterIndexerStake = await staking.getStake(indexer.address) + expect(afterIndexerStake).to.equal(beforeIndexerStake + indexerTokens) + }) + + it('should collect multiple SignedRAVs', async () => { + // Get balance and delegation pool tokens before collect + const beforeDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + const beforeIndexerStake = await staking.getStake(indexer.address) + // Get fees + const fees1 = collectTokens / 4n + const fees2 = collectTokens / 2n + + // Get encoded SignedRAVs + const { rav: rav1, signature: signature1 } = await generateSignedRAV( + allocationId, + payer.address, + indexer.address, + subgraphServiceAddress, + 0n, + fees1, + ethers.toUtf8Bytes(''), + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + const encodedSignedRAV1 = encodeCollectQueryFeesData(rav1, signature1, 0n) + + const { rav: rav2, signature: signature2 } = await generateSignedRAV( + otherAllocationId, + payer.address, + indexer.address, + subgraphServiceAddress, + 0n, + fees2, + ethers.toUtf8Bytes(''), + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + const encodedSignedRAV2 = encodeCollectQueryFeesData(rav2, signature2, 0n) + + // Collect first set of fees + const rewards1 = await collect(indexer, [indexer.address, PaymentTypes.QueryFee, encodedSignedRAV1]) + + // Collect second set of fees + const rewards2 = await collect(indexer, [indexer.address, PaymentTypes.QueryFee, encodedSignedRAV2]) + + // Verify total rewards collected + const totalRewards = rewards1 + rewards2 + const totalRewardsAfterTax = + totalRewards - (totalRewards * BigInt(await graphPayments.PROTOCOL_PAYMENT_CUT())) / BigInt(1e6) + const totalRewardsAfterCuration = + totalRewardsAfterTax - (totalRewardsAfterTax * BigInt(await subgraphService.curationFeesCut())) / BigInt(1e6) + + // Verify tokens where added to delegation pool + const delegatorTokens = (totalRewardsAfterCuration * BigInt(queryFeeCut)) / BigInt(1e6) + const afterDelegationPoolTokens = (await staking.getDelegationPool(indexer.address, subgraphService.target)) + .tokens + expect(afterDelegationPoolTokens).to.equal(beforeDelegationPoolTokens + delegatorTokens) + + // Verify indexer received tokens + const indexerTokens = totalRewardsAfterCuration - delegatorTokens + const afterIndexerStake = await staking.getStake(indexer.address) + expect(afterIndexerStake).to.equal(beforeIndexerStake + indexerTokens) + + // Collect new RAV for allocation 1 + const newFees1 = fees1 * 2n + const { rav: newRav1, signature: newSignature1 } = await generateSignedRAV( + allocationId, + payer.address, + indexer.address, + subgraphServiceAddress, + 0n, + newFees1, + ethers.toUtf8Bytes(''), + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + const encodedNewRAV1 = encodeCollectQueryFeesData(newRav1, newSignature1, 0n) + + // Collect new RAV for allocation 1 + const newRewards1 = await collect(indexer, [indexer.address, PaymentTypes.QueryFee, encodedNewRAV1]) + + // Verify only the difference was collected + expect(newRewards1).to.equal(newFees1 - fees1) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/operator.test.ts b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/operator.test.ts new file mode 100644 index 000000000..481d9dc02 --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/operator.test.ts @@ -0,0 +1,394 @@ +import { + DisputeManager, + GraphTallyCollector, + HorizonStaking, + L2GraphToken, + PaymentsEscrow, + SubgraphService, +} from '@graphprotocol/interfaces' +import { + encodeCollectIndexingRewardsData, + encodeCollectQueryFeesData, + encodePOIMetadata, + encodeRegistrationData, + encodeStartServiceData, + generateAllocationProof, + generatePOI, + generateSignedRAV, + generateSignerProof, +} from '@graphprotocol/toolshed' +import { PaymentTypes } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Operator', () => { + let subgraphService: SubgraphService + let staking: HorizonStaking + let graphToken: L2GraphToken + let escrow: PaymentsEscrow + let disputeManager: DisputeManager + let graphTallyCollector: GraphTallyCollector + + let snapshotId: string + let chainId: number + + // Test addresses + let indexer: HardhatEthersSigner + let authorizedOperator: HardhatEthersSigner + let unauthorizedOperator: HardhatEthersSigner + let allocationId: string + let subgraphDeploymentId: string + let allocationTokens: bigint + let graphTallyCollectorAddress: string + let subgraphServiceAddress: string + const graph = hre.graph() + const { provision } = graph.horizon.actions + const { collect } = graph.subgraphService.actions + + before(async () => { + // Get contracts + subgraphService = graph.subgraphService.contracts.SubgraphService + staking = graph.horizon.contracts.HorizonStaking + graphToken = graph.horizon.contracts.GraphToken + escrow = graph.horizon.contracts.PaymentsEscrow + graphTallyCollector = graph.horizon.contracts.GraphTallyCollector + disputeManager = graph.subgraphService.contracts.DisputeManager + + // Get contract addresses + graphTallyCollectorAddress = await graphTallyCollector.getAddress() + subgraphServiceAddress = await subgraphService.getAddress() + + // Get chain ID + chainId = Number((await ethers.provider.getNetwork()).chainId) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('New indexer', () => { + beforeEach(async () => { + // Get indexer + ;[indexer, authorizedOperator, unauthorizedOperator] = await graph.accounts.getTestAccounts() + + // Set balances for operators + await ethers.provider.send('hardhat_setBalance', [authorizedOperator.address, '0x56BC75E2D63100000']) + await ethers.provider.send('hardhat_setBalance', [unauthorizedOperator.address, '0x56BC75E2D63100000']) + + // Create provision + const disputePeriod = await disputeManager.getDisputePeriod() + const maxSlashingCut = await disputeManager.maxSlashingCut() + await setGRTBalance(graph.provider, graphToken.target, indexer.address, ethers.parseEther('100000')) + await provision(indexer, [ + indexer.address, + subgraphServiceAddress, + ethers.parseEther('100000'), + maxSlashingCut, + disputePeriod, + ]) + }) + + describe('Authorized Operator', () => { + beforeEach(async () => { + // Authorize operator + await staking.connect(indexer).setOperator(subgraphServiceAddress, authorizedOperator.address, true) + }) + + it('should be able to register the indexer', async () => { + const indexerUrl = 'https://test-indexer.com' + const indexerGeoHash = 'test-geo-hash' + const indexerRegistrationData = encodeRegistrationData(indexerUrl, indexerGeoHash, ethers.ZeroAddress) + + await subgraphService.connect(authorizedOperator).register(indexer.address, indexerRegistrationData) + + // Verify indexer metadata + const indexerInfo = await subgraphService.indexers(indexer.address) + expect(indexerInfo.url).to.equal(indexerUrl) + expect(indexerInfo.geoHash).to.equal(indexerGeoHash) + }) + }) + + describe('Unauthorized Operator', () => { + it('should not be able to register the indexer', async () => { + const indexerUrl = 'https://test-indexer.com' + const indexerGeoHash = 'test-geo-hash' + const indexerRegistrationData = encodeRegistrationData(indexerUrl, indexerGeoHash, ethers.ZeroAddress) + + await expect( + subgraphService.connect(unauthorizedOperator).register(indexer.address, indexerRegistrationData), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionManagerNotAuthorized') + }) + }) + }) + + describe('Existing indexer', () => { + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + ;[authorizedOperator, unauthorizedOperator] = await graph.accounts.getTestAccounts() + }) + + describe('New allocation', () => { + let allocationPrivateKey: string + + beforeEach(() => { + // Generate test allocation + const wallet = ethers.Wallet.createRandom() + allocationId = wallet.address + allocationPrivateKey = wallet.privateKey + subgraphDeploymentId = ethers.keccak256(ethers.toUtf8Bytes('test-subgraph-deployment')) + allocationTokens = ethers.parseEther('10000') + }) + + describe('Authorized Operator', () => { + beforeEach(async () => { + // Authorize operator + await staking.connect(indexer).setOperator(subgraphServiceAddress, authorizedOperator.address, true) + }) + + it('should be able to create an allocation', async () => { + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Build allocation data + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + // Start allocation + await subgraphService.connect(authorizedOperator).startService(indexer.address, data) + + // Verify allocation + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.indexer).to.equal(indexer.address) + expect(allocation.tokens).to.equal(allocationTokens) + expect(allocation.subgraphDeploymentId).to.equal(subgraphDeploymentId) + }) + }) + + describe('Unauthorized Operator', () => { + it('should not be able to create an allocation', async () => { + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Build allocation data + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + + await expect( + subgraphService.connect(unauthorizedOperator).startService(indexer.address, data), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionManagerNotAuthorized') + }) + }) + }) + + describe('Open allocation', () => { + beforeEach(() => { + // Get allocation data + const allocationFixture = indexers[0].allocations[0] + allocationId = allocationFixture.allocationID + subgraphDeploymentId = allocationFixture.subgraphDeploymentID + allocationTokens = allocationFixture.tokens + }) + + describe('Authorized Operator', () => { + beforeEach(async () => { + // Authorize operator + await staking.connect(indexer).setOperator(subgraphServiceAddress, authorizedOperator.address, true) + }) + + it('should be able to resize an allocation', async () => { + // Resize allocation + const newAllocationTokens = allocationTokens + ethers.parseEther('5000') + await subgraphService + .connect(authorizedOperator) + .resizeAllocation(indexer.address, allocationId, newAllocationTokens) + + // Verify allocation + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.tokens).to.equal(newAllocationTokens) + }) + + it('should be able to close an allocation', async () => { + // Close allocation + const data = ethers.AbiCoder.defaultAbiCoder().encode(['address'], [allocationId]) + await subgraphService.connect(authorizedOperator).stopService(indexer.address, data) + + // Verify allocation is closed + const allocation = await subgraphService.getAllocation(allocationId) + expect(allocation.closedAt).to.not.equal(0) + }) + + it('should be able to collect indexing rewards', async () => { + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 1000; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Build data for collect indexing rewards + const poi = generatePOI() + const publicPOI = generatePOI('public poi') + const poiMetadata = encodePOIMetadata(0, publicPOI, 0, 0, 0) + const collectData = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + // Collect rewards + const rewards = await collect(authorizedOperator, [ + indexer.address, + PaymentTypes.IndexingRewards, + collectData, + ]) + expect(rewards).to.not.equal(0n) + }) + + it('should be able to collect query fees', async () => { + // Setup query fees collection + let payer = ethers.Wallet.createRandom() + payer = payer.connect(ethers.provider) + let signer = ethers.Wallet.createRandom() + signer = signer.connect(ethers.provider) + const collectTokens = ethers.parseUnits('1000') + + // Mint GRT to payer and fund payer and signer with ETH + await setGRTBalance(graph.provider, graphToken.target, payer.address, ethers.parseEther('1000000')) + await ethers.provider.send('hardhat_setBalance', [payer.address, '0x56BC75E2D63100000']) + await ethers.provider.send('hardhat_setBalance', [signer.address, '0x56BC75E2D63100000']) + + // Authorize payer as signer + const proofDeadline = (await ethers.provider.getBlock('latest'))!.timestamp + 31536000 + const signerProof = generateSignerProof( + BigInt(proofDeadline), + payer.address, + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + await graphTallyCollector.connect(payer).authorizeSigner(signer.address, proofDeadline, signerProof) + + // Deposit tokens in escrow + await graphToken.connect(payer).approve(escrow.target, collectTokens) + await escrow.connect(payer).deposit(graphTallyCollector.target, indexer.address, collectTokens) + + // Get encoded SignedRAV + const { rav, signature } = await generateSignedRAV( + allocationId, + payer.address, + indexer.address, + subgraphServiceAddress, + 0n, + collectTokens, + ethers.toUtf8Bytes(''), + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + const encodedSignedRAV = encodeCollectQueryFeesData(rav, signature, 0n) + + // Collect query fees + const rewards = await collect(authorizedOperator, [indexer.address, PaymentTypes.QueryFee, encodedSignedRAV]) + expect(rewards).to.not.equal(0n) + }) + }) + + describe('Unauthorized Operator', () => { + it('should not be able to resize an allocation', async () => { + // Attempt to resize with unauthorized operator + const newAllocationTokens = allocationTokens + ethers.parseEther('5000') + await expect( + subgraphService + .connect(unauthorizedOperator) + .resizeAllocation(indexer.address, allocationId, newAllocationTokens), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionManagerNotAuthorized') + }) + + it('should not be able to close an allocation', async () => { + // Attempt to close with unauthorized operator + await expect( + subgraphService.connect(unauthorizedOperator).stopService(indexer.address, allocationId), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionManagerNotAuthorized') + }) + + it('should not be able to collect indexing rewards', async () => { + // Mine multiple blocks to simulate time passing + for (let i = 0; i < 1000; i++) { + await ethers.provider.send('evm_mine', []) + } + + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, generatePOI('public poi'), 0, 0, 0) + const collectData = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + // Attempt to collect rewards with unauthorized operator + await expect( + collect(unauthorizedOperator, [indexer.address, PaymentTypes.IndexingRewards, collectData]), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionManagerNotAuthorized') + }) + + it('should not be able to collect query fees', async () => { + // Setup query fees collection + let payer = ethers.Wallet.createRandom() + payer = payer.connect(ethers.provider) + let signer = ethers.Wallet.createRandom() + signer = signer.connect(ethers.provider) + const collectTokens = ethers.parseUnits('1000') + + // Mint GRT to payer and fund payer and signer with ETH + await setGRTBalance(graph.provider, graphToken.target, payer.address, ethers.parseEther('1000000')) + await ethers.provider.send('hardhat_setBalance', [payer.address, '0x56BC75E2D63100000']) + await ethers.provider.send('hardhat_setBalance', [signer.address, '0x56BC75E2D63100000']) + + // Authorize payer as signer + const proofDeadline = (await ethers.provider.getBlock('latest'))!.timestamp + 31536000 + const signerProof = generateSignerProof( + BigInt(proofDeadline), + payer.address, + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + await graphTallyCollector.connect(payer).authorizeSigner(signer.address, proofDeadline, signerProof) + + // Deposit tokens in escrow + await graphToken.connect(payer).approve(escrow.target, collectTokens) + await escrow.connect(payer).deposit(escrow.target, indexer.address, collectTokens) + + // Get encoded SignedRAV + const { rav, signature } = await generateSignedRAV( + allocationId, + payer.address, + indexer.address, + subgraphServiceAddress, + 0n, + collectTokens, + ethers.toUtf8Bytes(''), + signer.privateKey, + graphTallyCollectorAddress, + chainId, + ) + const encodedSignedRAV = encodeCollectQueryFeesData(rav, signature, 0n) + // Attempt to collect query fees with unauthorized operator + await expect( + collect(unauthorizedOperator, [indexer.address, PaymentTypes.QueryFee, encodedSignedRAV]), + ).to.be.revertedWithCustomError(subgraphService, 'ProvisionManagerNotAuthorized') + }) + }) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/paused.test.ts b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/paused.test.ts new file mode 100644 index 000000000..1bb3d0133 --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/paused.test.ts @@ -0,0 +1,225 @@ +import { DisputeManager, L2GraphToken, SubgraphService } from '@graphprotocol/interfaces' +import { + encodeCollectIndexingRewardsData, + encodePOIMetadata, + encodeRegistrationData, + encodeStartServiceData, + generateAllocationProof, + generatePOI, + PaymentTypes, +} from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Paused Protocol', () => { + let disputeManager: DisputeManager + let graphToken: L2GraphToken + let subgraphService: SubgraphService + + let snapshotId: string + let chainId: number + + // Test addresses + let pauseGuardian: HardhatEthersSigner + let indexer: HardhatEthersSigner + let allocationId: string + let subgraphDeploymentId: string + let allocationTokens: bigint + let subgraphServiceAddress: string + + const graph = hre.graph() + const { provision } = graph.horizon.actions + const { collect } = graph.subgraphService.actions + + before(async () => { + // Get contracts + disputeManager = graph.subgraphService.contracts.DisputeManager + graphToken = graph.horizon.contracts.GraphToken + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get signers + pauseGuardian = await graph.accounts.getPauseGuardian() + + // Get chain id + chainId = Number((await hre.ethers.provider.getNetwork()).chainId) + + // Get subgraph service address + subgraphServiceAddress = await subgraphService.getAddress() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + + // Get indexer + ;[indexer] = await graph.accounts.getTestAccounts() + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Pause actions', () => { + it('should allow pause guardian to pause the protocol', async () => { + await subgraphService.connect(pauseGuardian).pause() + expect(await subgraphService.paused()).to.be.true + }) + + it('should allow pause guardian to unpause the protocol', async () => { + // First pause the protocol + await subgraphService.connect(pauseGuardian).pause() + expect(await subgraphService.paused()).to.be.true + + // Then unpause it + await subgraphService.connect(pauseGuardian).unpause() + expect(await subgraphService.paused()).to.be.false + }) + }) + + describe('Indexer Operations While Paused', () => { + beforeEach(async () => { + // Pause the protocol before each test + await subgraphService.connect(pauseGuardian).pause() + }) + + describe('Existing indexer', () => { + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + }) + + describe('Opened allocation', () => { + beforeEach(() => { + // Get allocation + const allocation = indexers[0].allocations[0] + allocationId = allocation.allocationID + subgraphDeploymentId = allocation.subgraphDeploymentID + allocationTokens = allocation.tokens + }) + + it('should not allow indexer to stop an allocation while paused', async () => { + await expect( + subgraphService.connect(indexer).stopService(indexer.address, allocationId), + ).to.be.revertedWithCustomError(subgraphService, 'EnforcedPause') + }) + + it('should not allow indexer to collect indexing rewards while paused', async () => { + // Build data for collect indexing rewards + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const data = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + await expect( + collect(indexer, [indexer.address, PaymentTypes.IndexingRewards, data]), + ).to.be.revertedWithCustomError(subgraphService, 'EnforcedPause') + }) + + it('should not allow indexer to collect query fees while paused', async () => { + // Build data for collect query fees + const poi = generatePOI() + const poiMetadata = encodePOIMetadata(0, poi, 0, 0, 0) + const data = encodeCollectIndexingRewardsData(allocationId, poi, poiMetadata) + + await expect(collect(indexer, [indexer.address, PaymentTypes.QueryFee, data])).to.be.revertedWithCustomError( + subgraphService, + 'EnforcedPause', + ) + }) + + it('should not allow indexer to resize an allocation while paused', async () => { + await expect( + subgraphService + .connect(indexer) + .resizeAllocation(indexer.address, allocationId, allocationTokens + ethers.parseEther('1000')), + ).to.be.revertedWithCustomError(subgraphService, 'EnforcedPause') + }) + }) + + describe('New allocation', () => { + let allocationPrivateKey: string + + beforeEach(() => { + // Get allocation + const wallet = ethers.Wallet.createRandom() + allocationId = wallet.address + allocationPrivateKey = wallet.privateKey + subgraphDeploymentId = indexers[0].allocations[0].subgraphDeploymentID + allocationTokens = 1000n + }) + + it('should not allow indexer to start an allocation while paused', async () => { + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Build allocation data + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + + await expect( + subgraphService.connect(indexer).startService(indexer.address, data), + ).to.be.revertedWithCustomError(subgraphService, 'EnforcedPause') + }) + }) + }) + + describe('New indexer', () => { + beforeEach(async () => { + // Get indexer + ;[indexer] = await graph.accounts.getTestAccounts() + + // Create provision + const disputePeriod = await disputeManager.getDisputePeriod() + const maxSlashingCut = await disputeManager.maxSlashingCut() + await setGRTBalance(graph.provider, graphToken.target, indexer.address, ethers.parseEther('100000')) + await provision(indexer, [ + indexer.address, + await subgraphService.getAddress(), + ethers.parseEther('100000'), + maxSlashingCut, + disputePeriod, + ]) + }) + + it('should not allow indexer to register while paused', async () => { + const indexerUrl = 'https://test-indexer.com' + const indexerGeoHash = 'test-geo-hash' + const indexerRegistrationData = encodeRegistrationData(indexerUrl, indexerGeoHash, ethers.ZeroAddress) + + await expect( + subgraphService.connect(indexer).register(indexer.address, indexerRegistrationData), + ).to.be.revertedWithCustomError(subgraphService, 'EnforcedPause') + }) + }) + + describe('Permissionless', () => { + let anyone: HardhatEthersSigner + + before(async () => { + // Get anyone address + ;[anyone] = await graph.accounts.getTestAccounts() + }) + + it('should not allow anyone to close a stale allocation while paused', async () => { + // Wait for POI staleness + const maxPOIStaleness = await subgraphService.maxPOIStaleness() + await ethers.provider.send('evm_increaseTime', [Number(maxPOIStaleness) + 1]) + await ethers.provider.send('evm_mine', []) + + await expect(subgraphService.connect(anyone).closeStaleAllocation(allocationId)).to.be.revertedWithCustomError( + subgraphService, + 'EnforcedPause', + ) + }) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/permisionless.test.ts b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/permisionless.test.ts new file mode 100644 index 000000000..3652d9087 --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/subgraph-service/permisionless.test.ts @@ -0,0 +1,115 @@ +import { SubgraphService } from '@graphprotocol/interfaces' +import { encodeStartServiceData, generateAllocationProof } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Permissionless', () => { + let subgraphService: SubgraphService + let snapshotId: string + + // Test data + let indexer: HardhatEthersSigner + let anyone: HardhatEthersSigner + let allocationId: string + let subgraphDeploymentId: string + let allocationTokens: bigint + + const graph = hre.graph() + + before(async () => { + // Get contracts + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get anyone address + ;[anyone] = await graph.accounts.getTestAccounts() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Non-altruistic allocation', () => { + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + const allocation = indexerFixture.allocations[0] + allocationId = allocation.allocationID + subgraphDeploymentId = allocation.subgraphDeploymentID + allocationTokens = allocation.tokens + }) + + it('should allow anyone to close an allocation after max POI staleness passes', async () => { + // Wait for POI staleness + const maxPOIStaleness = await subgraphService.maxPOIStaleness() + await ethers.provider.send('evm_increaseTime', [Number(maxPOIStaleness) + 1]) + await ethers.provider.send('evm_mine', []) + + // Get before state + const beforeLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + + // Close allocation as anyone + await subgraphService.connect(anyone).closeStaleAllocation(allocationId) + + // Verify allocation is closed + const afterAllocation = await subgraphService.getAllocation(allocationId) + expect(afterAllocation.closedAt).to.not.equal(0, 'Allocation should be closed') + + // Verify tokens are released + const afterLockedTokens = await subgraphService.allocationProvisionTracker(indexer.address) + expect(afterLockedTokens).to.equal(beforeLockedTokens - allocationTokens, 'Tokens should be released') + }) + }) + + describe('Altruistic allocation', () => { + let allocationPrivateKey: string + + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Generate random allocation + const wallet = ethers.Wallet.createRandom() + allocationId = wallet.address + allocationPrivateKey = wallet.privateKey + subgraphDeploymentId = indexerFixture.allocations[0].subgraphDeploymentID + allocationTokens = 0n + + // Start allocation + const subgraphServiceAddress = await subgraphService.getAddress() + const chainId = Number((await hre.ethers.provider.getNetwork()).chainId) + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + const data = encodeStartServiceData(subgraphDeploymentId, allocationTokens, allocationId, signature) + await subgraphService.connect(indexer).startService(indexer.address, data) + }) + + it('should not allow closing an altruistic allocation permissionless', async () => { + // Wait for POI staleness + const maxPOIStaleness = await subgraphService.maxPOIStaleness() + await ethers.provider.send('evm_increaseTime', [Number(maxPOIStaleness) + 1]) + await ethers.provider.send('evm_mine', []) + + // Attempt to close allocation as anyone + await expect(subgraphService.connect(anyone).closeStaleAllocation(allocationId)) + .to.be.revertedWithCustomError(subgraphService, 'SubgraphServiceAllocationIsAltruistic') + .withArgs(allocationId) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/after-transition-period/upgrade.test.ts b/packages/subgraph-service/test/integration/after-transition-period/upgrade.test.ts new file mode 100644 index 000000000..dc8b3a2ff --- /dev/null +++ b/packages/subgraph-service/test/integration/after-transition-period/upgrade.test.ts @@ -0,0 +1,93 @@ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { zeroPadValue } from 'ethers' +import hre from 'hardhat' +import { ethers } from 'hardhat' + +const abi = [ + { + inputs: [ + { + internalType: 'contract ITransparentUpgradeableProxy', + name: 'proxy', + type: 'address', + }, + { + internalType: 'address', + name: 'implementation', + type: 'address', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'upgradeAndCall', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, +] + +describe('Upgrading contracts', () => { + let snapshotId: string + + // Test addresses + let governor: HardhatEthersSigner + const graph = hre.graph() + + before(async () => { + governor = await graph.accounts.getGovernor() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + it('subgraph service should be upgradeable by the governor', async () => { + const entry = graph.subgraphService.addressBook.getEntry('SubgraphService') + const proxyAdmin = entry.proxyAdmin! + const proxy = entry.address + + // Upgrade the contract to a different implementation + // the implementation we use is the GraphTallyCollector, this is obviously absurd but we just need an address with code on it + const ProxyAdmin = new ethers.Contract(proxyAdmin, abi, governor) + await ProxyAdmin.upgradeAndCall(proxy, graph.horizon.contracts.GraphTallyCollector.target, '0x') + + // https:// github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/ERC1967/ERC1967Utils.sol#L37C53-L37C119 + const implementation = await hre.ethers.provider.getStorage( + proxy, + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc', + ) + expect(zeroPadValue(implementation, 32)).to.equal( + zeroPadValue(graph.horizon.contracts.GraphTallyCollector.target as string, 32), + ) + }) + + it('dispute manager should be upgradeable by the governor', async () => { + const entry = graph.subgraphService.addressBook.getEntry('DisputeManager') + const proxyAdmin = entry.proxyAdmin! + const proxy = entry.address + + // Upgrade the contract to a different implementation + // the implementation we use is the GraphTallyCollector, this is obviously absurd but we just need an address with code on it + const ProxyAdmin = new ethers.Contract(proxyAdmin, abi, governor) + await ProxyAdmin.upgradeAndCall(proxy, graph.horizon.contracts.GraphTallyCollector.target, '0x') + + // https:// github.com/OpenZeppelin/openzeppelin-contracts/blob/dbb6104ce834628e473d2173bbc9d47f81a9eec3/contracts/proxy/ERC1967/ERC1967Utils.sol#L37C53-L37C119 + const implementation = await hre.ethers.provider.getStorage( + proxy, + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc', + ) + expect(zeroPadValue(implementation, 32)).to.equal( + zeroPadValue(graph.horizon.contracts.GraphTallyCollector.target as string, 32), + ) + }) +}) diff --git a/packages/subgraph-service/test/integration/during-transition-period/dispute-manager.test.ts b/packages/subgraph-service/test/integration/during-transition-period/dispute-manager.test.ts new file mode 100644 index 000000000..a24f9703a --- /dev/null +++ b/packages/subgraph-service/test/integration/during-transition-period/dispute-manager.test.ts @@ -0,0 +1,157 @@ +import { + DisputeManager, + HorizonStaking, + L2GraphToken, + LegacyDisputeManager, + SubgraphService, +} from '@graphprotocol/interfaces' +import { generateLegacyIndexingDisputeId, generateLegacyTypeDisputeId } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Dispute Manager', () => { + let disputeManager: DisputeManager + let legacyDisputeManager: LegacyDisputeManager + let graphToken: L2GraphToken + let staking: HorizonStaking + let subgraphService: SubgraphService + + let snapshotId: string + + // Test addresses + let governor: HardhatEthersSigner + let fisherman: HardhatEthersSigner + let arbitrator: HardhatEthersSigner + let indexer: HardhatEthersSigner + + let disputeDeposit: bigint + + // Allocation variables + let allocationId: string + + before(async () => { + // Get contracts + const graph = hre.graph() + disputeManager = graph.subgraphService.contracts.DisputeManager + legacyDisputeManager = graph.subgraphService.contracts.LegacyDisputeManager + graphToken = graph.horizon.contracts.GraphToken + staking = graph.horizon.contracts.HorizonStaking + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get signers + governor = await graph.accounts.getGovernor() + arbitrator = await graph.accounts.getArbitrator() + ;[fisherman] = await graph.accounts.getTestAccounts() + + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + const allocation = indexerFixture.legacyAllocations[0] + allocationId = allocation.allocationID + + // Get dispute deposit + disputeDeposit = ethers.parseEther('10000') + + // Set GRT balance for fisherman + await setGRTBalance(graph.provider, graphToken.target, fisherman.address, ethers.parseEther('1000000')) + + // Set arbitrator + await legacyDisputeManager.connect(governor).setArbitrator(arbitrator.address) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Legacy dispute type', () => { + describe('Arbitrator', () => { + it('should allow arbitrator to create and accept a legacy dispute on the new dispute manager after slashing on the legacy dispute manager', async () => { + // Create an indexing dispute on legacy dispute manager + await graphToken.connect(fisherman).approve(legacyDisputeManager.target, disputeDeposit) + await legacyDisputeManager.connect(fisherman).createIndexingDispute(allocationId, disputeDeposit) + const legacyDisputeId = generateLegacyIndexingDisputeId(allocationId) + + // Accept the dispute on the legacy dispute manager + await legacyDisputeManager.connect(arbitrator).acceptDispute(legacyDisputeId) + + // Get fisherman's balance before creating dispute + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Get indexer's provision before creating dispute + const provision = await staking.getProviderTokensAvailable(indexer.address, await subgraphService.getAddress()) + + // Create and accept legacy dispute using the same allocation ID + const tokensToSlash = ethers.parseEther('100000') + const tokensToReward = tokensToSlash / 2n + await disputeManager + .connect(arbitrator) + .createAndAcceptLegacyDispute(allocationId, fisherman.address, tokensToSlash, tokensToReward) + + // Get dispute ID from event + const disputeId = generateLegacyTypeDisputeId(allocationId) + + // Verify dispute was created and accepted + const dispute = await disputeManager.disputes(disputeId) + expect(dispute.indexer).to.equal(indexer.address, 'Indexer address mismatch') + expect(dispute.fisherman).to.equal(fisherman.address, 'Fisherman address mismatch') + expect(dispute.disputeType).to.equal(3, 'Dispute type should be legacy') + expect(dispute.status).to.equal(1, 'Dispute status should be accepted') + + // Verify indexer's stake was slashed + const updatedProvision = await staking.getProviderTokensAvailable( + indexer.address, + await subgraphService.getAddress(), + ) + expect(updatedProvision).to.equal(provision - tokensToSlash, 'Indexer stake should be slashed') + + // Verify fisherman got the reward + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + tokensToReward, + 'Fisherman balance should be increased by the reward', + ) + }) + + it('should not allow creating a legacy dispute for non-existent allocation', async () => { + const tokensToSlash = ethers.parseEther('1000') + const tokensToReward = tokensToSlash / 2n + + // Attempt to create legacy dispute with non-existent allocation + await expect( + disputeManager + .connect(arbitrator) + .createAndAcceptLegacyDispute( + ethers.Wallet.createRandom().address, + fisherman.address, + tokensToSlash, + tokensToReward, + ), + ).to.be.revertedWithCustomError(disputeManager, 'DisputeManagerIndexerNotFound') + }) + }) + + it('should not allow non-arbitrator to create a legacy dispute', async () => { + const tokensToSlash = ethers.parseEther('1000') + const tokensToReward = tokensToSlash / 2n + + // Attempt to create legacy dispute as fisherman + await expect( + disputeManager + .connect(fisherman) + .createAndAcceptLegacyDispute(allocationId, fisherman.address, tokensToSlash, tokensToReward), + ).to.be.revertedWithCustomError(disputeManager, 'DisputeManagerNotArbitrator') + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/during-transition-period/governance.test.ts b/packages/subgraph-service/test/integration/during-transition-period/governance.test.ts new file mode 100644 index 000000000..ad638b306 --- /dev/null +++ b/packages/subgraph-service/test/integration/during-transition-period/governance.test.ts @@ -0,0 +1,76 @@ +import { SubgraphService } from '@graphprotocol/interfaces' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Governance', () => { + let subgraphService: SubgraphService + let snapshotId: string + + // Test addresses + let governor: HardhatEthersSigner + let indexer: HardhatEthersSigner + let nonOwner: HardhatEthersSigner + let allocationId: string + let subgraphDeploymentId: string + + const graph = hre.graph() + + before(() => { + subgraphService = graph.subgraphService.contracts.SubgraphService + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + + // Get signers + governor = await graph.accounts.getGovernor() + ;[indexer, nonOwner] = await graph.accounts.getTestAccounts() + + // Generate test addresses + allocationId = ethers.Wallet.createRandom().address + subgraphDeploymentId = ethers.keccak256(ethers.toUtf8Bytes('test-subgraph-deployment')) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Legacy Allocation Migration', () => { + it('should migrate legacy allocation', async () => { + // Migrate legacy allocation + await subgraphService + .connect(governor) + .migrateLegacyAllocation(indexer.address, allocationId, subgraphDeploymentId) + + // Verify the legacy allocation was migrated + const legacyAllocation = await subgraphService.getLegacyAllocation(allocationId) + expect(legacyAllocation.indexer).to.equal(indexer.address) + expect(legacyAllocation.subgraphDeploymentId).to.equal(subgraphDeploymentId) + }) + + it('should not allow non-owner to migrate legacy allocation', async () => { + // Attempt to migrate legacy allocation as non-owner + await expect( + subgraphService.connect(nonOwner).migrateLegacyAllocation(indexer.address, allocationId, subgraphDeploymentId), + ).to.be.revertedWithCustomError(subgraphService, 'OwnableUnauthorizedAccount') + }) + + it('should not allow migrating a legacy allocation that was already migrated', async () => { + // First migration + await subgraphService + .connect(governor) + .migrateLegacyAllocation(indexer.address, allocationId, subgraphDeploymentId) + + // Attempt to migrate the same allocation again + await expect( + subgraphService.connect(governor).migrateLegacyAllocation(indexer.address, allocationId, subgraphDeploymentId), + ) + .to.be.revertedWithCustomError(subgraphService, 'LegacyAllocationAlreadyExists') + .withArgs(allocationId) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/during-transition-period/indexer.test.ts b/packages/subgraph-service/test/integration/during-transition-period/indexer.test.ts new file mode 100644 index 000000000..7fd508c40 --- /dev/null +++ b/packages/subgraph-service/test/integration/during-transition-period/indexer.test.ts @@ -0,0 +1,100 @@ +import { SubgraphService } from '@graphprotocol/interfaces' +import { encodeStartServiceData, generateAllocationProof } from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Indexer', () => { + let subgraphService: SubgraphService + let snapshotId: string + let chainId: number + + // Test addresses + let governor: HardhatEthersSigner + let indexer: HardhatEthersSigner + let allocationId: string + let subgraphDeploymentId: string + let allocationPrivateKey: string + let subgraphServiceAddress: string + + const graph = hre.graph() + + before(async () => { + // Get contracts + subgraphService = graph.subgraphService.contracts.SubgraphService + + // Get governor and non-owner + governor = await graph.accounts.getGovernor() + + // Get chain id + chainId = Number((await hre.ethers.provider.getNetwork()).chainId) + + // Get subgraph service address + subgraphServiceAddress = await subgraphService.getAddress() + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Allocation', () => { + beforeEach(async () => { + // Get indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Generate test addresses + const allocation = indexerFixture.legacyAllocations[0] + allocationId = allocation.allocationID + subgraphDeploymentId = allocation.subgraphDeploymentID + allocationPrivateKey = allocation.allocationPrivateKey + }) + + it('should not be able to create an allocation with an AllocationID that already exists in HorizonStaking contract', async () => { + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Attempt to create an allocation with the same ID + const data = encodeStartServiceData(subgraphDeploymentId, 1000n, allocationId, signature) + + await expect(subgraphService.connect(indexer).startService(indexer.address, data)) + .to.be.revertedWithCustomError(subgraphService, 'LegacyAllocationAlreadyExists') + .withArgs(allocationId) + }) + + it('should not be able to create an allocation that was already migrated by the owner', async () => { + // Migrate legacy allocation + await subgraphService + .connect(governor) + .migrateLegacyAllocation(indexer.address, allocationId, subgraphDeploymentId) + + // Build allocation proof + const signature = await generateAllocationProof( + indexer.address, + allocationPrivateKey, + subgraphServiceAddress, + chainId, + ) + + // Attempt to create the same allocation + const data = encodeStartServiceData(subgraphDeploymentId, 1000n, allocationId, signature) + + await expect(subgraphService.connect(indexer).startService(indexer.address, data)) + .to.be.revertedWithCustomError(subgraphService, 'LegacyAllocationAlreadyExists') + .withArgs(allocationId) + }) + }) +}) diff --git a/packages/subgraph-service/test/integration/during-transition-period/legacy-dispute-manager.test.ts b/packages/subgraph-service/test/integration/during-transition-period/legacy-dispute-manager.test.ts new file mode 100644 index 000000000..51cfc557c --- /dev/null +++ b/packages/subgraph-service/test/integration/during-transition-period/legacy-dispute-manager.test.ts @@ -0,0 +1,256 @@ +import { HorizonStaking, L2GraphToken, LegacyDisputeManager } from '@graphprotocol/interfaces' +import { + generateAttestationData, + generateLegacyIndexingDisputeId, + generateLegacyQueryDisputeId, +} from '@graphprotocol/toolshed' +import { indexersData as indexers } from '@graphprotocol/toolshed/fixtures' +import { setGRTBalance } from '@graphprotocol/toolshed/hardhat' +import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { expect } from 'chai' +import { ethers } from 'hardhat' +import hre from 'hardhat' + +describe('Legacy Dispute Manager', () => { + let legacyDisputeManager: LegacyDisputeManager + let graphToken: L2GraphToken + let staking: HorizonStaking + + let snapshotId: string + + let governor: HardhatEthersSigner + let arbitrator: HardhatEthersSigner + let indexer: HardhatEthersSigner + let fisherman: HardhatEthersSigner + + let disputeDeposit: bigint + + const graph = hre.graph() + + // We have to use Aribtrm Sepolia since we're testing an already deployed contract but running on a hardhat fork + const chainId = 421614 + + before(async () => { + governor = await graph.accounts.getGovernor() + ;[arbitrator, fisherman] = await graph.accounts.getTestAccounts() + + // Get contract instances with correct types + legacyDisputeManager = graph.subgraphService.contracts.LegacyDisputeManager + graphToken = graph.horizon.contracts.GraphToken + staking = graph.horizon.contracts.HorizonStaking + + // Set GRT balances + await setGRTBalance(graph.provider, graphToken.target, fisherman.address, ethers.parseEther('100000')) + }) + + beforeEach(async () => { + // Take a snapshot before each test + snapshotId = await ethers.provider.send('evm_snapshot', []) + + // Legacy dispute manager + disputeDeposit = ethers.parseEther('10000') + + // Set arbitrator + await legacyDisputeManager.connect(governor).setArbitrator(arbitrator.address) + }) + + afterEach(async () => { + // Revert to the snapshot after each test + await ethers.provider.send('evm_revert', [snapshotId]) + }) + + describe('Indexing Disputes', () => { + let allocationId: string + + beforeEach(async () => { + // Get Indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + allocationId = indexerFixture.legacyAllocations[0].allocationID + }) + + it('should allow creating and accepting indexing disputes', async () => { + // Create an indexing dispute + await graphToken.connect(fisherman).approve(legacyDisputeManager.target, disputeDeposit) + await legacyDisputeManager.connect(fisherman).createIndexingDispute(allocationId, disputeDeposit) + const disputeId = generateLegacyIndexingDisputeId(allocationId) + + // Verify dispute was created + const disputeExists = await legacyDisputeManager.isDisputeCreated(disputeId) + expect(disputeExists).to.be.true + + // Get state before slashing + const idxSlashingPercentage = 25000n + const indexerStakeBefore = (await staking.getServiceProvider(indexer.address)).tokensStaked + const slashedAmount = (indexerStakeBefore * idxSlashingPercentage) / 1_000_000n + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Accept the dispute + await legacyDisputeManager.connect(arbitrator).acceptDispute(disputeId) + + // Verify indexer was slashed for 2.5% of their stake + const indexerStake = (await staking.getServiceProvider(indexer.address)).tokensStaked + expect(indexerStake).to.equal(indexerStakeBefore - slashedAmount, 'Indexer stake was not slashed correctly') + + // Verify fisherman received their deposit and 50% of the slashed amount + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + slashedAmount / 2n + disputeDeposit, + 'Fisherman balance was not updated correctly', + ) + }) + }) + + describe('Query Disputes', () => { + let allocationPrivateKey: string + let subgraphDeploymentId: string + + beforeEach(async () => { + // Get Indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + const allocation = indexerFixture.legacyAllocations[0] + allocationPrivateKey = allocation.allocationPrivateKey + subgraphDeploymentId = allocation.subgraphDeploymentID + }) + + it('should allow creating and accepting query disputes', async () => { + // Create attestation data + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash = ethers.keccak256(ethers.toUtf8Bytes('test-response')) + const attestationData = await generateAttestationData( + queryHash, + responseHash, + subgraphDeploymentId, + allocationPrivateKey, + await legacyDisputeManager.getAddress(), + chainId, + ) + + // Create a query dispute + await graphToken.connect(fisherman).approve(legacyDisputeManager.target, disputeDeposit) + await legacyDisputeManager.connect(fisherman).createQueryDispute(attestationData, disputeDeposit) + const disputeId = generateLegacyQueryDisputeId( + queryHash, + responseHash, + subgraphDeploymentId, + indexer.address, + fisherman.address, + ) + + // Verify dispute was created + const disputeExists = await legacyDisputeManager.isDisputeCreated(disputeId) + expect(disputeExists).to.be.true + + // Get state before slashing + const qrySlashingPercentage = 25000n + const indexerStakeBefore = (await staking.getServiceProvider(indexer.address)).tokensStaked + const slashedAmount = (indexerStakeBefore * qrySlashingPercentage) / 1_000_000n + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Accept the dispute + await legacyDisputeManager.connect(arbitrator).acceptDispute(disputeId) + + // Verify indexer was slashed for 2.5% of their stake + const indexerStake = (await staking.getServiceProvider(indexer.address)).tokensStaked + expect(indexerStake).to.equal(indexerStakeBefore - slashedAmount, 'Indexer stake was not slashed correctly') + + // Verify fisherman received their deposit and 50% of the slashed amount + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + slashedAmount / 2n + disputeDeposit, + 'Fisherman balance was not updated correctly', + ) + }) + }) + + describe('Query Dispute Conflict', () => { + let allocationPrivateKey: string + let subgraphDeploymentId: string + + beforeEach(async () => { + // Get Indexer + const indexerFixture = indexers[0] + indexer = await ethers.getSigner(indexerFixture.address) + + // Get allocation + const allocation = indexerFixture.legacyAllocations[0] + allocationPrivateKey = allocation.allocationPrivateKey + subgraphDeploymentId = allocation.subgraphDeploymentID + }) + + it('should allow creating conflicting query disputes', async () => { + // Create first attestation data + const queryHash = ethers.keccak256(ethers.toUtf8Bytes('test-query')) + const responseHash1 = ethers.keccak256(ethers.toUtf8Bytes('test-response-1')) + const attestationData1 = await generateAttestationData( + queryHash, + responseHash1, + subgraphDeploymentId, + allocationPrivateKey, + await legacyDisputeManager.getAddress(), + chainId, + ) + + // Create second attestation data with different query/response + const responseHash2 = ethers.keccak256(ethers.toUtf8Bytes('test-response-2')) + const attestationData2 = await generateAttestationData( + queryHash, + responseHash2, + subgraphDeploymentId, + allocationPrivateKey, + await legacyDisputeManager.getAddress(), + chainId, + ) + + // Create query dispute + await legacyDisputeManager.connect(fisherman).createQueryDisputeConflict(attestationData1, attestationData2) + + // Create dispute IDs + const disputeId1 = generateLegacyQueryDisputeId( + queryHash, + responseHash1, + subgraphDeploymentId, + indexer.address, + fisherman.address, + ) + const disputeId2 = generateLegacyQueryDisputeId( + queryHash, + responseHash2, + subgraphDeploymentId, + indexer.address, + fisherman.address, + ) + + // Verify both disputes were created + const disputeExists1 = await legacyDisputeManager.isDisputeCreated(disputeId1) + const disputeExists2 = await legacyDisputeManager.isDisputeCreated(disputeId2) + expect(disputeExists1).to.be.true + expect(disputeExists2).to.be.true + + // Get state before slashing + const qrySlashingPercentage = 25000n + const indexerStakeBefore = (await staking.getServiceProvider(indexer.address)).tokensStaked + const slashedAmount = (indexerStakeBefore * qrySlashingPercentage) / 1_000_000n + const fishermanBalanceBefore = await graphToken.balanceOf(fisherman.address) + + // Accept one dispute + await legacyDisputeManager.connect(arbitrator).acceptDispute(disputeId1) + + // Verify indexer was slashed for 2.5% of their stake + const indexerStake = (await staking.getServiceProvider(indexer.address)).tokensStaked + expect(indexerStake).to.equal(indexerStakeBefore - slashedAmount, 'Indexer stake was not slashed correctly') + + // Verify fisherman received 50% of the slashed amount + const fishermanBalance = await graphToken.balanceOf(fisherman.address) + expect(fishermanBalance).to.equal( + fishermanBalanceBefore + slashedAmount / 2n, + 'Fisherman balance was not updated correctly', + ) + }) + }) +}) diff --git a/packages/subgraph-service/test/unit/SubgraphBaseTest.t.sol b/packages/subgraph-service/test/unit/SubgraphBaseTest.t.sol new file mode 100644 index 000000000..0997d1aeb --- /dev/null +++ b/packages/subgraph-service/test/unit/SubgraphBaseTest.t.sol @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { Controller } from "@graphprotocol/contracts/contracts/governance/Controller.sol"; +import { GraphPayments } from "@graphprotocol/horizon/contracts/payments/GraphPayments.sol"; +import { GraphProxy } from "@graphprotocol/contracts/contracts/upgrades/GraphProxy.sol"; +import { GraphProxyAdmin } from "@graphprotocol/contracts/contracts/upgrades/GraphProxyAdmin.sol"; +import { HorizonStaking } from "@graphprotocol/horizon/contracts/staking/HorizonStaking.sol"; +import { HorizonStakingExtension } from "@graphprotocol/horizon/contracts/staking/HorizonStakingExtension.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IHorizonStaking } from "@graphprotocol/interfaces/contracts/horizon/IHorizonStaking.sol"; +import { IPaymentsEscrow } from "@graphprotocol/interfaces/contracts/horizon/IPaymentsEscrow.sol"; +import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; +import { GraphTallyCollector } from "@graphprotocol/horizon/contracts/payments/collectors/GraphTallyCollector.sol"; +import { PaymentsEscrow } from "@graphprotocol/horizon/contracts/payments/PaymentsEscrow.sol"; +import { UnsafeUpgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; + +import { Constants } from "./utils/Constants.sol"; +import { DisputeManager } from "../../contracts/DisputeManager.sol"; +import { SubgraphService } from "../../contracts/SubgraphService.sol"; +import { Users } from "./utils/Users.sol"; +import { Utils } from "./utils/Utils.sol"; + +import { MockCuration } from "./mocks/MockCuration.sol"; +import { MockGRTToken } from "./mocks/MockGRTToken.sol"; +import { MockRewardsManager } from "./mocks/MockRewardsManager.sol"; +import { MockEpochManager } from "./mocks/MockEpochManager.sol"; + +abstract contract SubgraphBaseTest is Utils, Constants { + /* + * VARIABLES + */ + + /* Contracts */ + + GraphProxyAdmin proxyAdmin; + Controller controller; + SubgraphService subgraphService; + DisputeManager disputeManager; + IHorizonStaking staking; + GraphPayments graphPayments; + IPaymentsEscrow escrow; + GraphTallyCollector graphTallyCollector; + + HorizonStaking private stakingBase; + HorizonStakingExtension private stakingExtension; + + MockCuration curation; + MockGRTToken token; + MockRewardsManager rewardsManager; + MockEpochManager epochManager; + + /* Users */ + + Users internal users; + + /* + * SET UP + */ + + function setUp() public virtual { + token = new MockGRTToken(); + + // Setup Users + users = Users({ + governor: createUser("governor"), + deployer: createUser("deployer"), + indexer: createUser("indexer"), + operator: createUser("operator"), + gateway: createUser("gateway"), + verifier: createUser("verifier"), + delegator: createUser("delegator"), + arbitrator: createUser("arbitrator"), + fisherman: createUser("fisherman"), + rewardsDestination: createUser("rewardsDestination"), + pauseGuardian: createUser("pauseGuardian") + }); + + deployProtocolContracts(); + setupProtocol(); + unpauseProtocol(); + vm.stopPrank(); + } + + function deployProtocolContracts() private { + resetPrank(users.governor); + proxyAdmin = new GraphProxyAdmin(); + controller = new Controller(); + + resetPrank(users.deployer); + GraphProxy stakingProxy = new GraphProxy(address(0), address(proxyAdmin)); + rewardsManager = new MockRewardsManager(token, rewardsPerSignal, rewardsPerSubgraphAllocationUpdate); + curation = new MockCuration(); + epochManager = new MockEpochManager(); + + // GraphPayments predict address + bytes32 saltGraphPayments = keccak256("GraphPaymentsSalt"); + bytes32 paymentsHash = keccak256( + bytes.concat( + vm.getCode("GraphPayments.sol:GraphPayments"), + abi.encode(address(controller), protocolPaymentCut) + ) + ); + address predictedGraphPaymentsAddress = vm.computeCreate2Address( + saltGraphPayments, + paymentsHash, + users.deployer + ); + + // GraphEscrow predict address + bytes32 saltEscrow = keccak256("GraphEscrowSalt"); + bytes32 escrowHash = keccak256( + bytes.concat( + vm.getCode("PaymentsEscrow.sol:PaymentsEscrow"), + abi.encode(address(controller), withdrawEscrowThawingPeriod) + ) + ); + address predictedEscrowAddress = vm.computeCreate2Address(saltEscrow, escrowHash, users.deployer); + + resetPrank(users.governor); + controller.setContractProxy(keccak256("GraphToken"), address(token)); + controller.setContractProxy(keccak256("Staking"), address(stakingProxy)); + controller.setContractProxy(keccak256("RewardsManager"), address(rewardsManager)); + controller.setContractProxy(keccak256("GraphPayments"), predictedGraphPaymentsAddress); + controller.setContractProxy(keccak256("PaymentsEscrow"), predictedEscrowAddress); + controller.setContractProxy(keccak256("EpochManager"), address(epochManager)); + controller.setContractProxy(keccak256("GraphTokenGateway"), makeAddr("GraphTokenGateway")); + controller.setContractProxy(keccak256("GraphProxyAdmin"), makeAddr("GraphProxyAdmin")); + controller.setContractProxy(keccak256("Curation"), address(curation)); + + resetPrank(users.deployer); + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + address disputeManagerProxy = UnsafeUpgrades.deployTransparentProxy( + disputeManagerImplementation, + users.governor, + abi.encodeCall( + DisputeManager.initialize, + ( + users.deployer, + users.arbitrator, + disputePeriod, + disputeDeposit, + fishermanRewardPercentage, + maxSlashingPercentage + ) + ) + ); + disputeManager = DisputeManager(disputeManagerProxy); + disputeManager.transferOwnership(users.governor); + + graphTallyCollector = new GraphTallyCollector( + "GraphTallyCollector", + "1", + address(controller), + revokeSignerThawingPeriod + ); + address subgraphServiceImplementation = address( + new SubgraphService( + address(controller), + address(disputeManager), + address(graphTallyCollector), + address(curation) + ) + ); + address subgraphServiceProxy = UnsafeUpgrades.deployTransparentProxy( + subgraphServiceImplementation, + users.governor, + abi.encodeCall( + SubgraphService.initialize, + (users.deployer, minimumProvisionTokens, delegationRatio, stakeToFeesRatio) + ) + ); + subgraphService = SubgraphService(subgraphServiceProxy); + + stakingExtension = new HorizonStakingExtension(address(controller), address(subgraphService)); + stakingBase = new HorizonStaking(address(controller), address(stakingExtension), address(subgraphService)); + + graphPayments = new GraphPayments{ salt: saltGraphPayments }(address(controller), protocolPaymentCut); + escrow = new PaymentsEscrow{ salt: saltEscrow }(address(controller), withdrawEscrowThawingPeriod); + + resetPrank(users.governor); + disputeManager.setSubgraphService(address(subgraphService)); + proxyAdmin.upgrade(stakingProxy, address(stakingBase)); + proxyAdmin.acceptProxy(stakingBase, stakingProxy); + staking = IHorizonStaking(address(stakingProxy)); + } + + function setupProtocol() private { + resetPrank(users.deployer); + subgraphService.transferOwnership(users.governor); + resetPrank(users.governor); + staking.setMaxThawingPeriod(MAX_WAIT_PERIOD); + epochManager.setEpochLength(EPOCH_LENGTH); + subgraphService.setMaxPOIStaleness(maxPOIStaleness); + subgraphService.setCurationCut(curationCut); + subgraphService.setPauseGuardian(users.pauseGuardian, true); + } + + function unpauseProtocol() private { + resetPrank(users.governor); + controller.setPaused(false); + } + + function createUser(string memory name) internal returns (address) { + address user = makeAddr(name); + vm.deal({ account: user, newBalance: 100 ether }); + deal({ token: address(token), to: user, give: 10_000_000_000 ether }); + vm.label({ account: user, newLabel: name }); + return user; + } + + function mint(address _address, uint256 amount) internal { + deal({ token: address(token), to: _address, give: amount }); + } + + function burn(address _from, uint256 amount) internal { + token.burnFrom(_from, amount); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/DisputeManager.t.sol b/packages/subgraph-service/test/unit/disputeManager/DisputeManager.t.sol new file mode 100644 index 000000000..e6115057e --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/DisputeManager.t.sol @@ -0,0 +1,840 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { MathUtils } from "@graphprotocol/horizon/contracts/libraries/MathUtils.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; + +import { Attestation } from "../../../contracts/libraries/Attestation.sol"; +import { SubgraphServiceSharedTest } from "../shared/SubgraphServiceShared.t.sol"; + +contract DisputeManagerTest is SubgraphServiceSharedTest { + using PPMMath for uint256; + + /* + * MODIFIERS + */ + + modifier useGovernor() { + vm.startPrank(users.governor); + _; + vm.stopPrank(); + } + + modifier useFisherman() { + vm.startPrank(users.fisherman); + _; + vm.stopPrank(); + } + + /* + * ACTIONS + */ + + function _setArbitrator(address _arbitrator) internal { + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.ArbitratorSet(_arbitrator); + disputeManager.setArbitrator(_arbitrator); + assertEq(disputeManager.arbitrator(), _arbitrator, "Arbitrator should be set."); + } + + function _setFishermanRewardCut(uint32 _fishermanRewardCut) internal { + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.FishermanRewardCutSet(_fishermanRewardCut); + disputeManager.setFishermanRewardCut(_fishermanRewardCut); + assertEq(disputeManager.fishermanRewardCut(), _fishermanRewardCut, "Fisherman reward cut should be set."); + } + + function _setMaxSlashingCut(uint32 _maxSlashingCut) internal { + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.MaxSlashingCutSet(_maxSlashingCut); + disputeManager.setMaxSlashingCut(_maxSlashingCut); + assertEq(disputeManager.maxSlashingCut(), _maxSlashingCut, "Max slashing cut should be set."); + } + + function _setDisputeDeposit(uint256 _disputeDeposit) internal { + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeDepositSet(_disputeDeposit); + disputeManager.setDisputeDeposit(_disputeDeposit); + assertEq(disputeManager.disputeDeposit(), _disputeDeposit, "Dispute deposit should be set."); + } + + function _setSubgraphService(address _subgraphService) internal { + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.SubgraphServiceSet(_subgraphService); + disputeManager.setSubgraphService(_subgraphService); + assertEq(address(disputeManager.subgraphService()), _subgraphService, "Subgraph service should be set."); + } + + function _createIndexingDispute( + address _allocationId, + bytes32 _poi, + uint256 _blockNumber + ) internal returns (bytes32) { + (, address fisherman, ) = vm.readCallers(); + bytes32 expectedDisputeId = keccak256(abi.encodePacked(_allocationId, _poi, _blockNumber)); + uint256 disputeDeposit = disputeManager.disputeDeposit(); + uint256 beforeFishermanBalance = token.balanceOf(fisherman); + IAllocation.State memory alloc = subgraphService.getAllocation(_allocationId); + uint256 stakeSnapshot = disputeManager.getStakeSnapshot(alloc.indexer); + uint256 cancellableAt = block.timestamp + disputeManager.disputePeriod(); + + // Approve the dispute deposit + token.approve(address(disputeManager), disputeDeposit); + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.IndexingDisputeCreated( + expectedDisputeId, + alloc.indexer, + fisherman, + disputeDeposit, + _allocationId, + _poi, + _blockNumber, + stakeSnapshot, + cancellableAt + ); + + // Create the indexing dispute + bytes32 _disputeId = disputeManager.createIndexingDispute(_allocationId, _poi, _blockNumber); + + // Check that the dispute was created and that it has the correct ID + assertTrue(disputeManager.isDisputeCreated(_disputeId), "Dispute should be created."); + assertEq(expectedDisputeId, _disputeId, "Dispute ID should match"); + + // Check dispute values + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + assertEq(dispute.indexer, alloc.indexer, "Indexer should match"); + assertEq(dispute.fisherman, fisherman, "Fisherman should match"); + assertEq(dispute.deposit, disputeDeposit, "Deposit should match"); + assertEq(dispute.relatedDisputeId, bytes32(0), "Related dispute ID should be empty"); + assertEq( + uint8(dispute.disputeType), + uint8(IDisputeManager.DisputeType.IndexingDispute), + "Dispute type should be indexing" + ); + assertEq( + uint8(dispute.status), + uint8(IDisputeManager.DisputeStatus.Pending), + "Dispute status should be pending" + ); + assertEq(dispute.createdAt, block.timestamp, "Created at should match"); + assertEq(dispute.stakeSnapshot, stakeSnapshot, "Stake snapshot should match"); + + // Check that the fisherman was charged the dispute deposit + uint256 afterFishermanBalance = token.balanceOf(fisherman); + assertEq( + afterFishermanBalance, + beforeFishermanBalance - disputeDeposit, + "Fisherman should be charged the dispute deposit" + ); + + return _disputeId; + } + + function _createQueryDispute(bytes memory _attestationData) internal returns (bytes32) { + (, address fisherman, ) = vm.readCallers(); + IAttestation.State memory attestation = Attestation.parse(_attestationData); + address indexer = disputeManager.getAttestationIndexer(attestation); + bytes32 expectedDisputeId = keccak256( + abi.encodePacked( + attestation.requestCID, + attestation.responseCID, + attestation.subgraphDeploymentId, + indexer, + fisherman + ) + ); + uint256 disputeDeposit = disputeManager.disputeDeposit(); + uint256 beforeFishermanBalance = token.balanceOf(fisherman); + uint256 stakeSnapshot = disputeManager.getStakeSnapshot(indexer); + uint256 cancellableAt = block.timestamp + disputeManager.disputePeriod(); + + // Approve the dispute deposit + token.approve(address(disputeManager), disputeDeposit); + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.QueryDisputeCreated( + expectedDisputeId, + indexer, + fisherman, + disputeDeposit, + attestation.subgraphDeploymentId, + _attestationData, + cancellableAt, + stakeSnapshot + ); + + bytes32 _disputeID = disputeManager.createQueryDispute(_attestationData); + + // Check that the dispute was created and that it has the correct ID + assertTrue(disputeManager.isDisputeCreated(_disputeID), "Dispute should be created."); + assertEq(expectedDisputeId, _disputeID, "Dispute ID should match"); + + // Check dispute values + IDisputeManager.Dispute memory dispute = _getDispute(_disputeID); + assertEq(dispute.indexer, indexer, "Indexer should match"); + assertEq(dispute.fisherman, fisherman, "Fisherman should match"); + assertEq(dispute.deposit, disputeDeposit, "Deposit should match"); + assertEq(dispute.relatedDisputeId, bytes32(0), "Related dispute ID should be empty"); + assertEq( + uint8(dispute.disputeType), + uint8(IDisputeManager.DisputeType.QueryDispute), + "Dispute type should be query" + ); + assertEq( + uint8(dispute.status), + uint8(IDisputeManager.DisputeStatus.Pending), + "Dispute status should be pending" + ); + assertEq(dispute.createdAt, block.timestamp, "Created at should match"); + assertEq(dispute.stakeSnapshot, stakeSnapshot, "Stake snapshot should match"); + + // Check that the fisherman was charged the dispute deposit + uint256 afterFishermanBalance = token.balanceOf(fisherman); + assertEq( + afterFishermanBalance, + beforeFishermanBalance - disputeDeposit, + "Fisherman should be charged the dispute deposit" + ); + + return _disputeID; + } + + struct Balances { + uint256 indexer; + uint256 fisherman; + uint256 arbitrator; + uint256 disputeManager; + uint256 staking; + } + + function _createAndAcceptLegacyDispute( + address _allocationId, + address _fisherman, + uint256 _tokensSlash, + uint256 _tokensRewards + ) internal returns (bytes32) { + (, address arbitrator, ) = vm.readCallers(); + address indexer = staking.getAllocation(_allocationId).indexer; + + Balances memory beforeBalances = Balances({ + indexer: token.balanceOf(indexer), + fisherman: token.balanceOf(_fisherman), + arbitrator: token.balanceOf(arbitrator), + disputeManager: token.balanceOf(address(disputeManager)), + staking: token.balanceOf(address(staking)) + }); + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.LegacyDisputeCreated( + keccak256(abi.encodePacked(_allocationId, "legacy")), + indexer, + _fisherman, + _allocationId, + _tokensSlash, + _tokensRewards + ); + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeAccepted( + keccak256(abi.encodePacked(_allocationId, "legacy")), + indexer, + _fisherman, + _tokensRewards + ); + bytes32 _disputeId = disputeManager.createAndAcceptLegacyDispute( + _allocationId, + _fisherman, + _tokensSlash, + _tokensRewards + ); + + Balances memory afterBalances = Balances({ + indexer: token.balanceOf(indexer), + fisherman: token.balanceOf(_fisherman), + arbitrator: token.balanceOf(arbitrator), + disputeManager: token.balanceOf(address(disputeManager)), + staking: token.balanceOf(address(staking)) + }); + + assertEq(afterBalances.indexer, beforeBalances.indexer); + assertEq(afterBalances.fisherman, beforeBalances.fisherman + _tokensRewards); + assertEq(afterBalances.arbitrator, beforeBalances.arbitrator); + assertEq(afterBalances.disputeManager, beforeBalances.disputeManager); + assertEq(afterBalances.staking, beforeBalances.staking - _tokensSlash); + + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + assertEq(dispute.indexer, indexer); + assertEq(dispute.fisherman, _fisherman); + assertEq(dispute.deposit, 0); + assertEq(dispute.relatedDisputeId, bytes32(0)); + assertEq(uint8(dispute.disputeType), uint8(IDisputeManager.DisputeType.LegacyDispute)); + assertEq(uint8(dispute.status), uint8(IDisputeManager.DisputeStatus.Accepted)); + assertEq(dispute.createdAt, block.timestamp); + assertEq(dispute.stakeSnapshot, 0); + + return _disputeId; + } + + struct BeforeValues_CreateQueryDisputeConflict { + IAttestation.State attestation1; + IAttestation.State attestation2; + address indexer1; + address indexer2; + uint256 stakeSnapshot1; + uint256 stakeSnapshot2; + } + + function _createQueryDisputeConflict( + bytes memory attestationData1, + bytes memory attestationData2 + ) internal returns (bytes32, bytes32) { + (, address fisherman, ) = vm.readCallers(); + + BeforeValues_CreateQueryDisputeConflict memory beforeValues; + beforeValues.attestation1 = Attestation.parse(attestationData1); + beforeValues.attestation2 = Attestation.parse(attestationData2); + beforeValues.indexer1 = disputeManager.getAttestationIndexer(beforeValues.attestation1); + beforeValues.indexer2 = disputeManager.getAttestationIndexer(beforeValues.attestation2); + beforeValues.stakeSnapshot1 = disputeManager.getStakeSnapshot(beforeValues.indexer1); + beforeValues.stakeSnapshot2 = disputeManager.getStakeSnapshot(beforeValues.indexer2); + + uint256 beforeFishermanBalance = token.balanceOf(fisherman); + + // Approve the dispute deposit + token.approve(address(disputeManager), disputeDeposit); + + bytes32 expectedDisputeId1 = keccak256( + abi.encodePacked( + beforeValues.attestation1.requestCID, + beforeValues.attestation1.responseCID, + beforeValues.attestation1.subgraphDeploymentId, + beforeValues.indexer1, + fisherman + ) + ); + bytes32 expectedDisputeId2 = keccak256( + abi.encodePacked( + beforeValues.attestation2.requestCID, + beforeValues.attestation2.responseCID, + beforeValues.attestation2.subgraphDeploymentId, + beforeValues.indexer2, + fisherman + ) + ); + + uint256 cancellableAt = block.timestamp + disputeManager.disputePeriod(); + + // createQueryDisputeConflict + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.QueryDisputeCreated( + expectedDisputeId1, + beforeValues.indexer1, + fisherman, + disputeDeposit / 2, + beforeValues.attestation1.subgraphDeploymentId, + attestationData1, + cancellableAt, + beforeValues.stakeSnapshot1 + ); + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.QueryDisputeCreated( + expectedDisputeId2, + beforeValues.indexer2, + fisherman, + disputeDeposit / 2, + beforeValues.attestation2.subgraphDeploymentId, + attestationData2, + cancellableAt, + beforeValues.stakeSnapshot2 + ); + + (bytes32 _disputeId1, bytes32 _disputeId2) = disputeManager.createQueryDisputeConflict( + attestationData1, + attestationData2 + ); + + // Check that the disputes were created and that they have the correct IDs + assertTrue(disputeManager.isDisputeCreated(_disputeId1), "Dispute 1 should be created."); + assertTrue(disputeManager.isDisputeCreated(_disputeId2), "Dispute 2 should be created."); + assertEq(expectedDisputeId1, _disputeId1, "Dispute 1 ID should match"); + assertEq(expectedDisputeId2, _disputeId2, "Dispute 2 ID should match"); + + // Check dispute values + IDisputeManager.Dispute memory dispute1 = _getDispute(_disputeId1); + assertEq(dispute1.indexer, beforeValues.indexer1, "Indexer 1 should match"); + assertEq(dispute1.fisherman, fisherman, "Fisherman 1 should match"); + assertEq(dispute1.deposit, disputeDeposit / 2, "Deposit 1 should match"); + assertEq(dispute1.relatedDisputeId, _disputeId2, "Related dispute ID 1 should be the id of the other dispute"); + assertEq( + uint8(dispute1.disputeType), + uint8(IDisputeManager.DisputeType.QueryDispute), + "Dispute type 1 should be query" + ); + assertEq( + uint8(dispute1.status), + uint8(IDisputeManager.DisputeStatus.Pending), + "Dispute status 1 should be pending" + ); + assertEq(dispute1.createdAt, block.timestamp, "Created at 1 should match"); + assertEq(dispute1.stakeSnapshot, beforeValues.stakeSnapshot1, "Stake snapshot 1 should match"); + + IDisputeManager.Dispute memory dispute2 = _getDispute(_disputeId2); + assertEq(dispute2.indexer, beforeValues.indexer2, "Indexer 2 should match"); + assertEq(dispute2.fisherman, fisherman, "Fisherman 2 should match"); + assertEq(dispute2.deposit, disputeDeposit / 2, "Deposit 2 should match"); + assertEq(dispute2.relatedDisputeId, _disputeId1, "Related dispute ID 2 should be the id of the other dispute"); + assertEq( + uint8(dispute2.disputeType), + uint8(IDisputeManager.DisputeType.QueryDispute), + "Dispute type 2 should be query" + ); + assertEq( + uint8(dispute2.status), + uint8(IDisputeManager.DisputeStatus.Pending), + "Dispute status 2 should be pending" + ); + assertEq(dispute2.createdAt, block.timestamp, "Created at 2 should match"); + assertEq(dispute2.stakeSnapshot, beforeValues.stakeSnapshot2, "Stake snapshot 2 should match"); + + // Check that the fisherman was charged the dispute deposit + uint256 afterFishermanBalance = token.balanceOf(fisherman); + assertEq( + afterFishermanBalance, + beforeFishermanBalance - disputeDeposit, + "Fisherman should be charged the dispute deposit" + ); + + return (_disputeId1, _disputeId2); + } + + function _acceptDispute(bytes32 _disputeId, uint256 _tokensSlash) internal { + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + address fisherman = dispute.fisherman; + uint256 fishermanPreviousBalance = token.balanceOf(fisherman); + uint256 indexerTokensAvailable = staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)); + uint256 disputeDeposit = dispute.deposit; + uint256 fishermanReward; + { + uint32 provisionMaxVerifierCut = staking + .getProvision(dispute.indexer, address(subgraphService)) + .maxVerifierCut; + uint256 fishermanRewardPercentage = MathUtils.min( + disputeManager.fishermanRewardCut(), + provisionMaxVerifierCut + ); + fishermanReward = _tokensSlash.mulPPM(fishermanRewardPercentage); + } + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeAccepted( + _disputeId, + dispute.indexer, + dispute.fisherman, + dispute.deposit + fishermanReward + ); + + // Accept the dispute + disputeManager.acceptDispute(_disputeId, _tokensSlash); + + // Check fisherman's got their reward and their deposit (if any) back + uint256 fishermanExpectedBalance = fishermanPreviousBalance + fishermanReward + disputeDeposit; + assertEq( + token.balanceOf(fisherman), + fishermanExpectedBalance, + "Fisherman should get their reward and deposit back" + ); + + // Check indexer was slashed by the correct amount + uint256 expectedIndexerTokensAvailable; + if (_tokensSlash > indexerTokensAvailable) { + expectedIndexerTokensAvailable = 0; + } else { + expectedIndexerTokensAvailable = indexerTokensAvailable - _tokensSlash; + } + assertEq( + staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)), + expectedIndexerTokensAvailable, + "Indexer should be slashed by the correct amount" + ); + + // Check dispute status + dispute = _getDispute(_disputeId); + assertEq( + uint8(dispute.status), + uint8(IDisputeManager.DisputeStatus.Accepted), + "Dispute status should be accepted" + ); + } + + struct FishermanParams { + address fisherman; + uint256 previousBalance; + uint256 disputeDeposit; + uint256 relatedDisputeDeposit; + uint256 rewardPercentage; + uint256 rewardFirstDispute; + uint256 rewardRelatedDispute; + uint256 totalReward; + uint256 expectedBalance; + } + + function _acceptDisputeConflict( + bytes32 _disputeId, + uint256 _tokensSlash, + bool _acceptRelatedDispute, + uint256 _tokensRelatedSlash + ) internal { + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + IDisputeManager.Dispute memory relatedDispute = _getDispute(dispute.relatedDisputeId); + uint256 indexerTokensAvailable = staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)); + uint256 relatedIndexerTokensAvailable = staking.getProviderTokensAvailable( + relatedDispute.indexer, + address(subgraphService) + ); + + FishermanParams memory params; + params.fisherman = dispute.fisherman; + params.previousBalance = token.balanceOf(params.fisherman); + params.disputeDeposit = dispute.deposit; + params.relatedDisputeDeposit = relatedDispute.deposit; + params.rewardPercentage = disputeManager.fishermanRewardCut(); + params.rewardFirstDispute = _tokensSlash.mulPPM(params.rewardPercentage); + params.rewardRelatedDispute = (_acceptRelatedDispute) ? _tokensRelatedSlash.mulPPM(params.rewardPercentage) : 0; + params.totalReward = params.rewardFirstDispute + params.rewardRelatedDispute; + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeAccepted( + _disputeId, + dispute.indexer, + params.fisherman, + params.disputeDeposit + params.rewardFirstDispute + ); + + if (_acceptRelatedDispute) { + emit IDisputeManager.DisputeAccepted( + dispute.relatedDisputeId, + relatedDispute.indexer, + relatedDispute.fisherman, + relatedDispute.deposit + params.rewardRelatedDispute + ); + } else { + emit IDisputeManager.DisputeDrawn( + dispute.relatedDisputeId, + relatedDispute.indexer, + relatedDispute.fisherman, + relatedDispute.deposit + ); + } + + // Accept the dispute + disputeManager.acceptDisputeConflict(_disputeId, _tokensSlash, _acceptRelatedDispute, _tokensRelatedSlash); + + // Check fisherman's got their reward and their deposit back + params.expectedBalance = + params.previousBalance + + params.totalReward + + params.disputeDeposit + + params.relatedDisputeDeposit; + assertEq( + token.balanceOf(params.fisherman), + params.expectedBalance, + "Fisherman should get their reward and deposit back" + ); + + // If both disputes are for the same indexer, check that the indexer was slashed by the correct amount + if (dispute.indexer == relatedDispute.indexer) { + uint256 tokensToSlash = (_acceptRelatedDispute) ? _tokensSlash + _tokensRelatedSlash : _tokensSlash; + uint256 expectedIndexerTokensAvailable; + if (tokensToSlash > indexerTokensAvailable) { + expectedIndexerTokensAvailable = 0; + } else { + expectedIndexerTokensAvailable = indexerTokensAvailable - tokensToSlash; + } + assertEq( + staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)), + expectedIndexerTokensAvailable, + "Indexer should be slashed by the correct amount" + ); + } else { + // Check indexer for first dispute was slashed by the correct amount + uint256 expectedIndexerTokensAvailable; + uint256 tokensToSlash = (_acceptRelatedDispute) ? _tokensSlash : _tokensSlash; + if (tokensToSlash > indexerTokensAvailable) { + expectedIndexerTokensAvailable = 0; + } else { + expectedIndexerTokensAvailable = indexerTokensAvailable - tokensToSlash; + } + assertEq( + staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)), + expectedIndexerTokensAvailable, + "Indexer should be slashed by the correct amount" + ); + + // Check indexer for related dispute was slashed by the correct amount if it was accepted + if (_acceptRelatedDispute) { + uint256 expectedRelatedIndexerTokensAvailable; + if (_tokensRelatedSlash > relatedIndexerTokensAvailable) { + expectedRelatedIndexerTokensAvailable = 0; + } else { + expectedRelatedIndexerTokensAvailable = relatedIndexerTokensAvailable - _tokensRelatedSlash; + } + assertEq( + staking.getProviderTokensAvailable(relatedDispute.indexer, address(subgraphService)), + expectedRelatedIndexerTokensAvailable, + "Indexer should be slashed by the correct amount" + ); + } + } + + // Check dispute status + dispute = _getDispute(_disputeId); + assertEq( + uint8(dispute.status), + uint8(IDisputeManager.DisputeStatus.Accepted), + "Dispute status should be accepted" + ); + + // If there's a related dispute, check it + relatedDispute = _getDispute(dispute.relatedDisputeId); + assertEq( + uint8(relatedDispute.status), + _acceptRelatedDispute + ? uint8(IDisputeManager.DisputeStatus.Accepted) + : uint8(IDisputeManager.DisputeStatus.Drawn), + "Related dispute status should be drawn" + ); + } + + function _drawDispute(bytes32 _disputeId) internal { + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + bool isConflictingDispute = dispute.relatedDisputeId != bytes32(0); + IDisputeManager.Dispute memory relatedDispute; + if (isConflictingDispute) relatedDispute = _getDispute(dispute.relatedDisputeId); + address fisherman = dispute.fisherman; + uint256 fishermanPreviousBalance = token.balanceOf(fisherman); + uint256 indexerTokensAvailable = staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)); + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeDrawn(_disputeId, dispute.indexer, dispute.fisherman, dispute.deposit); + + if (isConflictingDispute) { + emit IDisputeManager.DisputeDrawn( + dispute.relatedDisputeId, + relatedDispute.indexer, + relatedDispute.fisherman, + relatedDispute.deposit + ); + } + // Draw the dispute + disputeManager.drawDispute(_disputeId); + + // Check that the fisherman got their deposit back + uint256 fishermanExpectedBalance = fishermanPreviousBalance + + dispute.deposit + + (isConflictingDispute ? relatedDispute.deposit : 0); + assertEq(token.balanceOf(fisherman), fishermanExpectedBalance, "Fisherman should receive their deposit back."); + + // Check that indexer was not slashed + assertEq( + staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)), + indexerTokensAvailable, + "Indexer should not be slashed" + ); + + // Check dispute status + dispute = _getDispute(_disputeId); + assertEq(uint8(dispute.status), uint8(IDisputeManager.DisputeStatus.Drawn), "Dispute status should be drawn"); + + // If there's a related dispute, check that it was drawn too + if (dispute.relatedDisputeId != bytes32(0)) { + relatedDispute = _getDispute(dispute.relatedDisputeId); + assertEq( + uint8(relatedDispute.status), + uint8(IDisputeManager.DisputeStatus.Drawn), + "Related dispute status should be drawn" + ); + } + } + + function _rejectDispute(bytes32 _disputeId) internal { + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + address fisherman = dispute.fisherman; + uint256 fishermanPreviousBalance = token.balanceOf(fisherman); + uint256 indexerTokensAvailable = staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)); + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeRejected(_disputeId, dispute.indexer, dispute.fisherman, dispute.deposit); + + // Reject the dispute + disputeManager.rejectDispute(_disputeId); + + // Check that the fisherman didn't get their deposit back + assertEq(token.balanceOf(users.fisherman), fishermanPreviousBalance, "Fisherman should lose the deposit."); + + // Check that indexer was not slashed + assertEq( + staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)), + indexerTokensAvailable, + "Indexer should not be slashed" + ); + + // Check dispute status + dispute = _getDispute(_disputeId); + assertEq( + uint8(dispute.status), + uint8(IDisputeManager.DisputeStatus.Rejected), + "Dispute status should be rejected" + ); + // Checl related id is empty + assertEq(dispute.relatedDisputeId, bytes32(0), "Related dispute ID should be empty"); + } + + function _cancelDispute(bytes32 _disputeId) internal { + IDisputeManager.Dispute memory dispute = _getDispute(_disputeId); + bool isDisputeInConflict = dispute.relatedDisputeId != bytes32(0); + IDisputeManager.Dispute memory relatedDispute; + if (isDisputeInConflict) relatedDispute = _getDispute(dispute.relatedDisputeId); + address fisherman = dispute.fisherman; + uint256 fishermanPreviousBalance = token.balanceOf(fisherman); + uint256 indexerTokensAvailable = staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)); + + vm.expectEmit(address(disputeManager)); + emit IDisputeManager.DisputeCancelled(_disputeId, dispute.indexer, dispute.fisherman, dispute.deposit); + + if (isDisputeInConflict) { + emit IDisputeManager.DisputeCancelled( + dispute.relatedDisputeId, + relatedDispute.indexer, + relatedDispute.fisherman, + relatedDispute.deposit + ); + } + + // Cancel the dispute + disputeManager.cancelDispute(_disputeId); + + // Check that the fisherman got their deposit back + uint256 fishermanExpectedBalance = fishermanPreviousBalance + + dispute.deposit + + (isDisputeInConflict ? relatedDispute.deposit : 0); + assertEq( + token.balanceOf(users.fisherman), + fishermanExpectedBalance, + "Fisherman should receive their deposit back." + ); + + // Check that indexer was not slashed + assertEq( + staking.getProviderTokensAvailable(dispute.indexer, address(subgraphService)), + indexerTokensAvailable, + "Indexer should not be slashed" + ); + + // Check dispute status + dispute = _getDispute(_disputeId); + assertEq( + uint8(dispute.status), + uint8(IDisputeManager.DisputeStatus.Cancelled), + "Dispute status should be cancelled" + ); + + if (isDisputeInConflict) { + relatedDispute = _getDispute(dispute.relatedDisputeId); + assertEq( + uint8(relatedDispute.status), + uint8(IDisputeManager.DisputeStatus.Cancelled), + "Related dispute status should be cancelled" + ); + } + } + + /* + * HELPERS + */ + + function _createAttestationReceipt( + bytes32 requestCID, + bytes32 responseCID, + bytes32 subgraphDeploymentId + ) internal pure returns (IAttestation.Receipt memory receipt) { + return + IAttestation.Receipt({ + requestCID: requestCID, + responseCID: responseCID, + subgraphDeploymentId: subgraphDeploymentId + }); + } + + function _createConflictingAttestations( + bytes32 requestCID, + bytes32 subgraphDeploymentId, + bytes32 responseCID1, + bytes32 responseCID2, + uint256 signer1, + uint256 signer2 + ) internal view returns (bytes memory attestationData1, bytes memory attestationData2) { + IAttestation.Receipt memory receipt1 = _createAttestationReceipt( + requestCID, + responseCID1, + subgraphDeploymentId + ); + IAttestation.Receipt memory receipt2 = _createAttestationReceipt( + requestCID, + responseCID2, + subgraphDeploymentId + ); + + bytes memory _attestationData1 = _createAtestationData(receipt1, signer1); + bytes memory _attestationData2 = _createAtestationData(receipt2, signer2); + return (_attestationData1, _attestationData2); + } + + function _createAtestationData( + IAttestation.Receipt memory receipt, + uint256 signer + ) internal view returns (bytes memory attestationData) { + bytes32 digest = disputeManager.encodeReceipt(receipt); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signer, digest); + + return abi.encodePacked(receipt.requestCID, receipt.responseCID, receipt.subgraphDeploymentId, r, s, v); + } + + /* + * PRIVATE FUNCTIONS + */ + + function _getDispute(bytes32 _disputeId) internal view returns (IDisputeManager.Dispute memory) { + ( + address indexer, + address fisherman, + uint256 deposit, + bytes32 relatedDisputeId, + IDisputeManager.DisputeType disputeType, + IDisputeManager.DisputeStatus status, + uint256 createdAt, + uint256 cancellableAt, + uint256 stakeSnapshot + ) = disputeManager.disputes(_disputeId); + return + IDisputeManager.Dispute({ + indexer: indexer, + fisherman: fisherman, + deposit: deposit, + relatedDisputeId: relatedDisputeId, + disputeType: disputeType, + status: status, + createdAt: createdAt, + cancellableAt: cancellableAt, + stakeSnapshot: stakeSnapshot + }); + } + + function _setStorage_SubgraphService(address _subgraphService) internal { + vm.store(address(disputeManager), bytes32(uint256(51)), bytes32(uint256(uint160(_subgraphService)))); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/constructor/constructor.t.sol b/packages/subgraph-service/test/unit/disputeManager/constructor/constructor.t.sol new file mode 100644 index 000000000..9382cd83a --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/constructor/constructor.t.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { GraphDirectory } from "@graphprotocol/horizon/contracts/utilities/GraphDirectory.sol"; +import { UnsafeUpgrades } from "@openzeppelin/foundry-upgrades/Upgrades.sol"; +import { DisputeManager } from "../../../../contracts/DisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; + +contract DisputeManagerConstructorTest is DisputeManagerTest { + using PPMMath for uint256; + + /* + * MODIFIERS + */ + + modifier useDeployer() { + vm.startPrank(users.deployer); + _; + vm.stopPrank(); + } + + /* + * HELPERS + */ + + function _initializeDisputeManager( + address implementation, + address arbitrator, + uint64 disputePeriod, + uint256 disputeDeposit, + uint32 fishermanRewardPercentage, + uint32 maxSlashingPercentage + ) private returns (address) { + return + UnsafeUpgrades.deployTransparentProxy( + implementation, + users.governor, + abi.encodeCall( + DisputeManager.initialize, + ( + users.deployer, + arbitrator, + disputePeriod, + disputeDeposit, + fishermanRewardPercentage, + maxSlashingPercentage + ) + ) + ); + } + + /* + * TESTS + */ + + function test_DisputeManager_Constructor( + uint32 fishermanRewardPercentage, + uint32 maxSlashingPercentage + ) public useDeployer { + vm.assume(fishermanRewardPercentage <= disputeManager.MAX_FISHERMAN_REWARD_CUT()); + vm.assume(maxSlashingPercentage <= PPMMath.MAX_PPM); + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + address proxy = _initializeDisputeManager( + disputeManagerImplementation, + users.arbitrator, + disputePeriod, + disputeDeposit, + fishermanRewardPercentage, + maxSlashingPercentage + ); + + DisputeManager disputeManager = DisputeManager(proxy); + assertEq(disputeManager.arbitrator(), users.arbitrator); + assertEq(disputeManager.disputePeriod(), disputePeriod); + assertEq(disputeManager.disputeDeposit(), disputeDeposit); + assertEq(disputeManager.fishermanRewardCut(), fishermanRewardPercentage); + } + + function test_DisputeManager_Constructor_RevertIf_ControllerAddressIsZero() public useDeployer { + bytes memory expectedError = abi.encodeWithSelector( + GraphDirectory.GraphDirectoryInvalidZeroAddress.selector, + "Controller" + ); + vm.expectRevert(expectedError); + new DisputeManager(address(0)); + } + + function test_DisputeManager_Constructor_RevertIf_ArbitratorAddressIsZero() public useDeployer { + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + bytes memory expectedError = abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidZeroAddress.selector); + vm.expectRevert(expectedError); + _initializeDisputeManager( + disputeManagerImplementation, + address(0), + disputePeriod, + disputeDeposit, + fishermanRewardPercentage, + maxSlashingPercentage + ); + } + + function test_DisputeManager_Constructor_RevertIf_InvalidDisputePeriod() public useDeployer { + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + bytes memory expectedError = abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodZero.selector); + vm.expectRevert(expectedError); + _initializeDisputeManager( + disputeManagerImplementation, + users.arbitrator, + 0, + disputeDeposit, + fishermanRewardPercentage, + maxSlashingPercentage + ); + } + + function test_DisputeManager_Constructor_RevertIf_InvalidDisputeDeposit() public useDeployer { + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidDisputeDeposit.selector, + 0 + ); + vm.expectRevert(expectedError); + _initializeDisputeManager( + disputeManagerImplementation, + users.arbitrator, + disputePeriod, + 0, + fishermanRewardPercentage, + maxSlashingPercentage + ); + } + + function test_DisputeManager_Constructor_RevertIf_InvalidFishermanRewardPercentage( + uint32 _fishermanRewardPercentage + ) public useDeployer { + vm.assume(_fishermanRewardPercentage > disputeManager.MAX_FISHERMAN_REWARD_CUT()); + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidFishermanReward.selector, + _fishermanRewardPercentage + ); + vm.expectRevert(expectedError); + _initializeDisputeManager( + disputeManagerImplementation, + users.arbitrator, + disputePeriod, + disputeDeposit, + _fishermanRewardPercentage, + maxSlashingPercentage + ); + } + + function test_DisputeManager_Constructor_RevertIf_InvalidMaxSlashingPercentage( + uint32 _maxSlashingPercentage + ) public useDeployer { + vm.assume(_maxSlashingPercentage > PPMMath.MAX_PPM); + address disputeManagerImplementation = address(new DisputeManager(address(controller))); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidMaxSlashingCut.selector, + _maxSlashingPercentage + ); + vm.expectRevert(expectedError); + _initializeDisputeManager( + disputeManagerImplementation, + users.arbitrator, + disputePeriod, + disputeDeposit, + fishermanRewardPercentage, + _maxSlashingPercentage + ); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/disputes.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/disputes.t.sol new file mode 100644 index 000000000..1aec4d899 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/disputes.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; + +contract DisputeManagerDisputeTest is DisputeManagerTest { + using PPMMath for uint256; + + /* + * TESTS + */ + + function test_Dispute_Accept_RevertIf_DisputeDoesNotExist( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + bytes32 disputeID = bytes32("0x0"); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidDispute.selector, disputeID)); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Dispute_Accept_RevertIf_SlashZeroTokens(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI101"), block.number); + + // attempt to accept dispute with 0 tokens slashed + resetPrank(users.arbitrator); + uint256 maxTokensToSlash = uint256(maxSlashingPercentage).mulPPM(tokens); + vm.expectRevert( + abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidTokensSlash.selector, 0, maxTokensToSlash) + ); + disputeManager.acceptDispute(disputeID, 0); + } + + function test_Dispute_Reject_RevertIf_DisputeDoesNotExist(uint256 tokens) public useIndexer useAllocation(tokens) { + bytes32 disputeID = bytes32("0x0"); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidDispute.selector, disputeID)); + disputeManager.rejectDispute(disputeID); + } + + function test_Dispute_Draw_RevertIf_DisputeDoesNotExist(uint256 tokens) public useIndexer useAllocation(tokens) { + bytes32 disputeID = bytes32("0x0"); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidDispute.selector, disputeID)); + disputeManager.drawDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/accept.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/accept.t.sol new file mode 100644 index 000000000..4c6210fa4 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/accept.t.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerIndexingAcceptDisputeTest is DisputeManagerTest { + using PPMMath for uint256; + + /* + * TESTS + */ + + function test_Indexing_Accept_Dispute(uint256 tokens, uint256 tokensSlash) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + resetPrank(users.arbitrator); + _acceptDispute(disputeID, tokensSlash); + } + + function test_Indexing_Accept_Dispute_RevertWhen_SubgraphServiceNotSet( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + resetPrank(users.arbitrator); + // clear subgraph service address from storage + _setStorage_SubgraphService(address(0)); + + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerSubgraphServiceNotSet.selector)); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Indexing_Accept_Dispute_OptParam( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + resetPrank(users.arbitrator); + _acceptDispute(disputeID, tokensSlash); + } + + function test_Indexing_Accept_RevertIf_CallerIsNotArbitrator( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // attempt to accept dispute as fisherman + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Indexing_Accept_RevertWhen_SlashingOverMaxSlashPercentage( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + tokensSlash = bound(tokensSlash, uint256(maxSlashingPercentage).mulPPM(tokens) + 1, type(uint256).max); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI101"), block.number); + + // max slashing percentage is 50% + resetPrank(users.arbitrator); + uint256 maxTokensToSlash = uint256(maxSlashingPercentage).mulPPM(tokens); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidTokensSlash.selector, + tokensSlash, + maxTokensToSlash + ); + vm.expectRevert(expectedError); + disputeManager.acceptDispute(disputeID, tokensSlash); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/cancel.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/cancel.t.sol new file mode 100644 index 000000000..658240526 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/cancel.t.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerIndexingCancelDisputeTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Indexing_Cancel_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // skip to end of dispute period + uint256 disputePeriod = disputeManager.disputePeriod(); + skip(disputePeriod + 1); + + _cancelDispute(disputeID); + } + + function test_Indexing_Cancel_RevertIf_CallerIsNotFisherman( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotFisherman.selector)); + disputeManager.cancelDispute(disputeID); + } + + function test_Indexing_Cancel_RevertIf_DisputePeriodNotOver( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodNotFinished.selector)); + disputeManager.cancelDispute(disputeID); + } + + function test_Indexing_Cancel_After_DisputePeriodIncreased(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // change the dispute period to a higher value + uint256 oldDisputePeriod = disputeManager.disputePeriod(); + resetPrank(users.governor); + disputeManager.setDisputePeriod(uint64(oldDisputePeriod * 2)); + + // skip to end of old dispute period + skip(oldDisputePeriod + 1); + + // should be able to cancel + resetPrank(users.fisherman); + _cancelDispute(disputeID); + } + + function test_Indexing_Cancel_After_DisputePeriodDecreased(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // change the dispute period to a lower value + uint256 oldDisputePeriod = disputeManager.disputePeriod(); + resetPrank(users.governor); + disputeManager.setDisputePeriod(uint64(oldDisputePeriod / 2)); + + // skip to end of new dispute period + skip(oldDisputePeriod / 2 + 1); + + // should not be able to cancel + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodNotFinished.selector)); + disputeManager.cancelDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/create.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/create.t.sol new file mode 100644 index 000000000..8d84a2d41 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/create.t.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerIndexingCreateDisputeTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Indexing_Create_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + } + + function test_Indexing_Create_Dispute_WithDelegation(uint256 tokens, uint256 delegationTokens) public useIndexer { + vm.assume(tokens >= minimumProvisionTokens); + vm.assume(tokens < 100_000_000 ether); // set a low cap to test overdelegation + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + bytes memory data = _createSubgraphAllocationData( + users.indexer, + subgraphDeployment, + allocationIDPrivateKey, + tokens + ); + _startService(users.indexer, data); + + uint256 delegationRatio = subgraphService.getDelegationRatio(); + delegationTokens = bound(delegationTokens, 1e18, tokens * delegationRatio * 2); // make sure we have overdelegation + + resetPrank(users.delegator); + token.approve(address(staking), delegationTokens); + staking.delegate(users.indexer, address(subgraphService), delegationTokens, 0); + + resetPrank(users.fisherman); + _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + } + + function test_Indexing_Create_Dispute_RevertWhen_SubgraphServiceNotSet( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + + // clear subgraph service address from storage + _setStorage_SubgraphService(address(0)); + + // // Approve the dispute deposit + token.approve(address(disputeManager), disputeDeposit); + + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerSubgraphServiceNotSet.selector)); + disputeManager.createIndexingDispute(allocationID, bytes32("POI2"), block.number); + } + + function test_Indexing_Create_MultipleDisputes() public { + uint256 tokens = 10000 ether; + uint8 numIndexers = 10; + uint256[] memory allocationIDPrivateKeys = new uint256[](numIndexers); + for (uint i = 0; i < numIndexers; i++) { + string memory indexerName = string(abi.encodePacked("Indexer ", i)); + address indexer = createUser(indexerName); + vm.assume(indexer != address(0)); + + resetPrank(indexer); + mint(indexer, tokens); + _createProvision(indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(indexer, abi.encode("url", "geoHash", address(0))); + uint256 allocationIDPrivateKey = uint256(keccak256(abi.encodePacked(i))); + bytes memory data = _createSubgraphAllocationData( + indexer, + subgraphDeployment, + allocationIDPrivateKey, + tokens + ); + _startService(indexer, data); + allocationIDPrivateKeys[i] = allocationIDPrivateKey; + } + + resetPrank(users.fisherman); + for (uint i = 0; i < allocationIDPrivateKeys.length; i++) { + _createIndexingDispute(vm.addr(allocationIDPrivateKeys[i]), bytes32("POI1"), block.number); + } + } + + function test_Indexing_Create_RevertWhen_DisputeAlreadyCreated( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // Create another dispute with different fisherman + address otherFisherman = makeAddr("otherFisherman"); + resetPrank(otherFisherman); + mint(otherFisherman, disputeDeposit); + token.approve(address(disputeManager), disputeDeposit); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerDisputeAlreadyCreated.selector, + disputeID + ); + vm.expectRevert(expectedError); + disputeManager.createIndexingDispute(allocationID, bytes32("POI1"), block.number); + vm.stopPrank(); + } + + function test_Indexing_Create_DisputesSamePOIAndAllo(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + resetPrank(users.arbitrator); + disputeManager.acceptDispute(disputeID, 100); + + _createIndexingDispute(allocationID, bytes32("POI1"), block.number + 1); + } + + function test_Indexing_Create_RevertIf_DepositUnderMinimum(uint256 tokensDeposit) public useFisherman { + tokensDeposit = bound(tokensDeposit, 0, disputeDeposit - 1); + token.approve(address(disputeManager), tokensDeposit); + bytes memory expectedError = abi.encodeWithSignature( + "ERC20InsufficientAllowance(address,uint256,uint256)", + address(disputeManager), + tokensDeposit, + disputeDeposit + ); + vm.expectRevert(expectedError); + disputeManager.createIndexingDispute(allocationID, bytes32("POI3"), block.number); + vm.stopPrank(); + } + + function test_Indexing_Create_RevertIf_AllocationDoesNotExist(uint256 tokens) public useFisherman { + tokens = bound(tokens, disputeDeposit, 10_000_000_000 ether); + token.approve(address(disputeManager), tokens); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerIndexerNotFound.selector, + allocationID + ); + vm.expectRevert(expectedError); + disputeManager.createIndexingDispute(allocationID, bytes32("POI4"), block.number); + vm.stopPrank(); + } + + function test_Indexing_Create_RevertIf_IndexerIsBelowStake(uint256 tokens) public useIndexer useAllocation(tokens) { + // Close allocation + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + // Thaw, deprovision and unstake + address subgraphDataServiceAddress = address(subgraphService); + _thawDeprovisionAndUnstake(users.indexer, subgraphDataServiceAddress, tokens); + + // Attempt to create dispute + resetPrank(users.fisherman); + token.approve(address(disputeManager), tokens); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerZeroTokens.selector)); + disputeManager.createIndexingDispute(allocationID, bytes32("POI1"), block.number); + } + + function test_Indexing_Create_DontRevertIf_IndexerIsBelowStake_WithDelegation( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useAllocation(tokens) { + // Close allocation + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + // Thaw, deprovision and unstake + address subgraphDataServiceAddress = address(subgraphService); + _thawDeprovisionAndUnstake(users.indexer, subgraphDataServiceAddress, tokens); + + delegationTokens = bound(delegationTokens, 1 ether, 100_000_000 ether); + + resetPrank(users.delegator); + token.approve(address(staking), delegationTokens); + staking.delegate(users.indexer, address(subgraphService), delegationTokens, 0); + + // create dispute + resetPrank(users.fisherman); + token.approve(address(disputeManager), tokens); + _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/draw.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/draw.t.sol new file mode 100644 index 000000000..ffbbd6291 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/draw.t.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerIndexingDrawDisputeTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Indexing_Draw_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI32"), block.number); + + resetPrank(users.arbitrator); + _drawDispute(disputeID); + } + + function test_Indexing_Draw_RevertIf_CallerIsNotArbitrator(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // attempt to draw dispute as fisherman + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.drawDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/reject.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/reject.t.sol new file mode 100644 index 000000000..a350d1661 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/indexing/reject.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerIndexingRejectDisputeTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Indexing_Reject_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + resetPrank(users.arbitrator); + _rejectDispute(disputeID); + } + + function test_Indexing_Reject_RevertIf_CallerIsNotArbitrator( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + bytes32 disputeID = _createIndexingDispute(allocationID, bytes32("POI1"), block.number); + + // attempt to accept dispute as fisherman + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.rejectDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/legacy.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/legacy.t.sol new file mode 100644 index 000000000..3bab2eaa6 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/legacy.t.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { Attestation } from "../../../../contracts/libraries/Attestation.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; + +contract DisputeManagerLegacyDisputeTest is DisputeManagerTest { + using PPMMath for uint256; + + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID = keccak256(abi.encodePacked("Response CID")); + bytes32 private subgraphDeploymentId = keccak256(abi.encodePacked("Subgraph Deployment ID")); + + /* + * TESTS + */ + + function test_LegacyDispute( + uint256 tokensStaked, + uint256 tokensProvisioned, + uint256 tokensSlash, + uint256 tokensRewards + ) public { + vm.assume(tokensStaked <= MAX_TOKENS); + vm.assume(tokensStaked >= minimumProvisionTokens); + tokensProvisioned = bound(tokensProvisioned, minimumProvisionTokens, tokensStaked); + tokensSlash = bound(tokensSlash, 2, tokensProvisioned); + tokensRewards = bound(tokensRewards, 1, tokensSlash.mulPPM(fishermanRewardPercentage)); + + // setup indexer state + resetPrank(users.indexer); + _stake(tokensStaked); + _setStorage_allocation_hardcoded(users.indexer, allocationID, tokensStaked - tokensProvisioned); + _provision(users.indexer, tokensProvisioned, fishermanRewardPercentage, disputePeriod); + + resetPrank(users.arbitrator); + _createAndAcceptLegacyDispute(allocationID, users.fisherman, tokensSlash, tokensRewards); + } + + function test_LegacyDispute_RevertIf_NotArbitrator() public useIndexer { + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.createAndAcceptLegacyDispute(allocationID, users.fisherman, 0, 0); + } + + function test_LegacyDispute_RevertIf_AllocationNotFound() public useIndexer { + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerIndexerNotFound.selector, address(0))); + disputeManager.createAndAcceptLegacyDispute(address(0), users.fisherman, 0, 0); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/query/accept.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/query/accept.t.sol new file mode 100644 index 000000000..74a51b28a --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/query/accept.t.sol @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryAcceptDisputeTest is DisputeManagerTest { + using PPMMath for uint256; + + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID = keccak256(abi.encodePacked("Response CID")); + bytes32 private subgraphDeploymentId = keccak256(abi.encodePacked("Subgraph Deployment ID")); + + /* + * TESTS + */ + + function test_Query_Accept_Dispute(uint256 tokens, uint256 tokensSlash) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + _acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_Dispute_RevertWhen_SubgraphServiceNotSet( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + // clear subgraph service address from storage + _setStorage_SubgraphService(address(0)); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerSubgraphServiceNotSet.selector)); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_Dispute_OptParam( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + _acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_RevertIf_CallerIsNotArbitrator( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // attempt to accept dispute as fisherman + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_RevertWhen_SlashingOverMaxSlashPercentage( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, uint256(maxSlashingPercentage).mulPPM(tokens) + 1, type(uint256).max); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // max slashing percentage is 50% + resetPrank(users.arbitrator); + uint256 maxTokensToSlash = uint256(maxSlashingPercentage).mulPPM(tokens); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidTokensSlash.selector, + tokensSlash, + maxTokensToSlash + ); + vm.expectRevert(expectedError); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_RevertWhen_UsingConflictAccept( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputeNotInConflict.selector, disputeID)); + disputeManager.acceptDisputeConflict(disputeID, tokensSlash, true, 0); + } + + function test_Query_Accept_RevertWhen_SlashingOverMaxSlashPercentage_WithDelegation( + uint256 tokens, + uint256 tokensDelegated, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) useDelegation(tokensDelegated) { + uint256 maxTokensToSlash = uint256(maxSlashingPercentage).mulPPM( + _calculateStakeSnapshot(tokens, tokensDelegated) + ); + tokensSlash = bound(tokensSlash, maxTokensToSlash + 1, type(uint256).max); + + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // max slashing percentage is 50% + resetPrank(users.arbitrator); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidTokensSlash.selector, + tokensSlash, + maxTokensToSlash + ); + vm.expectRevert(expectedError); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_RevertWhen_SlashingOverMaxSlashPercentage_WithDelegation_DelegationSlashing( + uint256 tokens, + uint256 tokensDelegated, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) useDelegation(tokensDelegated) { + // enable delegation slashing + resetPrank(users.governor); + staking.setDelegationSlashingEnabled(); + + resetPrank(users.fisherman); + uint256 maxTokensToSlash = uint256(maxSlashingPercentage).mulPPM( + _calculateStakeSnapshot(tokens, tokensDelegated) + ); + tokensSlash = bound(tokensSlash, maxTokensToSlash + 1, type(uint256).max); + + // Create a new dispute with delegation slashing enabled + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // max slashing percentage is 50% + resetPrank(users.arbitrator); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidTokensSlash.selector, + tokensSlash, + maxTokensToSlash + ); + vm.expectRevert(expectedError); + disputeManager.acceptDispute(disputeID, tokensSlash); + } + + function test_Query_Accept_Dispute_AfterFishermanRewardCutIncreased( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer { + vm.assume(tokens >= minimumProvisionTokens); + vm.assume(tokens < 10_000_000_000 ether); + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + // Set fishermanRewardCut to 25% + resetPrank(users.governor); + uint32 oldFishermanRewardCut = 250_000; + disputeManager.setFishermanRewardCut(oldFishermanRewardCut); + + // Create provision with maxVerifierCut == fishermanRewardCut and allocate + resetPrank(users.indexer); + _createProvision(users.indexer, tokens, oldFishermanRewardCut, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + bytes memory data = _createSubgraphAllocationData( + users.indexer, + subgraphDeployment, + allocationIDPrivateKey, + tokens + ); + _startService(users.indexer, data); + + // Create a dispute with prov.maxVerifierCut == fishermanRewardCut + uint256 beforeFishermanBalance = token.balanceOf(users.fisherman); + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // Now bump the fishermanRewardCut to 50% + resetPrank(users.governor); + disputeManager.setFishermanRewardCut(500_000); + + // Accept the dispute + resetPrank(users.arbitrator); + _acceptDispute(disputeID, tokensSlash); + + // Check that the fisherman received the correct amount of tokens + // which should use the old fishermanRewardCut + uint256 afterFishermanBalance = token.balanceOf(users.fisherman); + assertEq(afterFishermanBalance, beforeFishermanBalance + tokensSlash.mulPPM(oldFishermanRewardCut)); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/query/cancel.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/query/cancel.t.sol new file mode 100644 index 000000000..16bc188e0 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/query/cancel.t.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryCancelDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID = keccak256(abi.encodePacked("Response CID")); + bytes32 private subgraphDeploymentId = keccak256(abi.encodePacked("Subgraph Deployment ID")); + + /* + * TESTS + */ + + function test_Query_Cancel_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // skip to end of dispute period + uint256 disputePeriod = disputeManager.disputePeriod(); + skip(disputePeriod + 1); + + _cancelDispute(disputeID); + } + + function test_Query_Cancel_RevertIf_CallerIsNotFisherman(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotFisherman.selector)); + disputeManager.cancelDispute(disputeID); + } + + function test_Query_Cancel_RevertIf_DisputePeriodNotOver(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodNotFinished.selector)); + disputeManager.cancelDispute(disputeID); + } + + function test_Query_Cancel_After_DisputePeriodIncreased(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // change the dispute period to a higher value + uint256 oldDisputePeriod = disputeManager.disputePeriod(); + resetPrank(users.governor); + disputeManager.setDisputePeriod(uint64(oldDisputePeriod * 2)); + + // skip to end of old dispute period + skip(oldDisputePeriod + 1); + + // should be able to cancel + resetPrank(users.fisherman); + _cancelDispute(disputeID); + } + + function test_Query_Cancel_After_DisputePeriodDecreased(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // change the dispute period to a lower value + uint256 oldDisputePeriod = disputeManager.disputePeriod(); + resetPrank(users.governor); + disputeManager.setDisputePeriod(uint64(oldDisputePeriod / 2)); + + // skip to end of new dispute period + skip(oldDisputePeriod / 2 + 1); + + // should not be able to cancel + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodNotFinished.selector)); + disputeManager.cancelDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/query/create.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/query/create.t.sol new file mode 100644 index 000000000..aea69edc0 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/query/create.t.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryCreateDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID = keccak256(abi.encodePacked("Response CID")); + bytes32 private subgraphDeploymentId = keccak256(abi.encodePacked("Subgraph Deployment ID")); + + /* + * TESTS + */ + + function test_Query_Create_Dispute_Only(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + _createQueryDispute(attestationData); + } + + function test_Query_Create_Dispute_RevertWhen_SubgraphServiceNotSet( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + + // clear subgraph service address from storage + _setStorage_SubgraphService(address(0)); + + // // Approve the dispute deposit + token.approve(address(disputeManager), disputeDeposit); + + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerSubgraphServiceNotSet.selector)); + disputeManager.createQueryDispute(attestationData); + } + + function test_Query_Create_MultipleDisputes_DifferentFisherman( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + _createQueryDispute(attestationData); + + // Create another dispute with different fisherman + address otherFisherman = makeAddr("otherFisherman"); + resetPrank(otherFisherman); + mint(otherFisherman, MAX_TOKENS); + IAttestation.Receipt memory otherFishermanReceipt = _createAttestationReceipt( + requestCID, + responseCID, + subgraphDeploymentId + ); + bytes memory otherFishermanAttestationData = _createAtestationData( + otherFishermanReceipt, + allocationIDPrivateKey + ); + _createQueryDispute(otherFishermanAttestationData); + } + + function test_Query_Create_MultipleDisputes_DifferentIndexer( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + // Create first dispute for indexer + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + _createQueryDispute(attestationData); + + // Setup new indexer + address newIndexer = makeAddr("newIndexer"); + uint256 newAllocationIDKey = uint256(keccak256(abi.encodePacked("newAllocationID"))); + mint(newIndexer, tokens); + resetPrank(newIndexer); + _createProvision(newIndexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(newIndexer, abi.encode("url", "geoHash", 0x0)); + bytes memory data = _createSubgraphAllocationData(newIndexer, subgraphDeployment, newAllocationIDKey, tokens); + _startService(newIndexer, data); + + // Create another dispute with same receipt but different indexer + resetPrank(users.fisherman); + bytes memory attestationData2 = _createAtestationData(receipt, newAllocationIDKey); + _createQueryDispute(attestationData2); + } + + function test_Query_Create_RevertIf_Duplicate(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + IAttestation.Receipt memory newReceipt = _createAttestationReceipt( + requestCID, + responseCID, + subgraphDeploymentId + ); + bytes memory newAttestationData = _createAtestationData(newReceipt, allocationIDPrivateKey); + token.approve(address(disputeManager), disputeDeposit); + vm.expectRevert( + abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputeAlreadyCreated.selector, disputeID) + ); + disputeManager.createQueryDispute(newAttestationData); + } + + function test_Query_Create_RevertIf_DepositUnderMinimum(uint256 tokensDispute) public useFisherman { + tokensDispute = bound(tokensDispute, 0, disputeDeposit - 1); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + + token.approve(address(disputeManager), tokensDispute); + bytes memory expectedError = abi.encodeWithSignature( + "ERC20InsufficientAllowance(address,uint256,uint256)", + address(disputeManager), + tokensDispute, + disputeDeposit + ); + vm.expectRevert(expectedError); + disputeManager.createQueryDispute(attestationData); + } + + function test_Query_Create_RevertIf_AllocationDoesNotExist(uint256 tokens) public useFisherman { + tokens = bound(tokens, disputeDeposit, 10_000_000_000 ether); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + token.approve(address(disputeManager), tokens); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerIndexerNotFound.selector, + allocationID + ); + vm.expectRevert(expectedError); + disputeManager.createQueryDispute(attestationData); + vm.stopPrank(); + } + + function test_Query_Create_RevertIf_IndexerIsBelowStake(uint256 tokens) public useIndexer useAllocation(tokens) { + // Close allocation + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + + // Thaw, deprovision and unstake + address subgraphDataServiceAddress = address(subgraphService); + _thawDeprovisionAndUnstake(users.indexer, subgraphDataServiceAddress, tokens); + + // Atempt to create dispute + resetPrank(users.fisherman); + token.approve(address(disputeManager), tokens); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerZeroTokens.selector)); + disputeManager.createQueryDispute(attestationData); + } + + function test_Query_Create_DontRevertIf_IndexerIsBelowStake_WithDelegation( + uint256 tokens, + uint256 delegationTokens + ) public useIndexer useAllocation(tokens) { + // Close allocation + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + // Thaw, deprovision and unstake + address subgraphDataServiceAddress = address(subgraphService); + _thawDeprovisionAndUnstake(users.indexer, subgraphDataServiceAddress, tokens); + + delegationTokens = bound(delegationTokens, 1 ether, 100_000_000 ether); + + resetPrank(users.delegator); + token.approve(address(staking), delegationTokens); + staking.delegate(users.indexer, address(subgraphService), delegationTokens, 0); + + // create dispute + resetPrank(users.fisherman); + token.approve(address(disputeManager), tokens); + + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + _createQueryDispute(attestationData); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/query/draw.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/query/draw.t.sol new file mode 100644 index 000000000..7269704dc --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/query/draw.t.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryDrawDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID = keccak256(abi.encodePacked("Response CID")); + bytes32 private subgraphDeploymentId = keccak256(abi.encodePacked("Subgraph Deployment ID")); + + /* + * TESTS + */ + + function test_Query_Draw_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + _drawDispute(disputeID); + } + + function test_Query_Draw_RevertIf_CallerIsNotArbitrator(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // attempt to draw dispute as fisherman + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.drawDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/query/reject.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/query/reject.t.sol new file mode 100644 index 000000000..5078ff047 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/query/reject.t.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryRejectDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID = keccak256(abi.encodePacked("Response CID")); + bytes32 private subgraphDeploymentId = keccak256(abi.encodePacked("Subgraph Deployment ID")); + + /* + * TESTS + */ + + function test_Query_Reject_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + resetPrank(users.arbitrator); + _rejectDispute(disputeID); + } + + function test_Query_Reject_RevertIf_CallerIsNotArbitrator(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + IAttestation.Receipt memory receipt = _createAttestationReceipt(requestCID, responseCID, subgraphDeploymentId); + bytes memory attestationData = _createAtestationData(receipt, allocationIDPrivateKey); + bytes32 disputeID = _createQueryDispute(attestationData); + + // attempt to accept dispute as fisherman + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.rejectDispute(disputeID); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/accept.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/accept.t.sol new file mode 100644 index 000000000..4c2c2567d --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/accept.t.sol @@ -0,0 +1,206 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryConflictAcceptDisputeTest is DisputeManagerTest { + using PPMMath for uint256; + + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID1 = keccak256(abi.encodePacked("Response CID 1")); + bytes32 private responseCID2 = keccak256(abi.encodePacked("Response CID 2")); + + /* + * TESTS + */ + + function test_Query_Conflict_Accept_Dispute_Draw_Other( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + uint256 fishermanBalanceBefore = token.balanceOf(users.fisherman); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.arbitrator); + _acceptDisputeConflict(disputeID1, tokensSlash, false, 0); + + uint256 fishermanRewardPercentage = disputeManager.fishermanRewardCut(); + uint256 fishermanReward = tokensSlash.mulPPM(fishermanRewardPercentage); + uint256 fishermanBalanceAfter = token.balanceOf(users.fisherman); + + assertEq(fishermanBalanceAfter, fishermanBalanceBefore + fishermanReward); + } + + function test_Query_Conflict_Accept_Dispute_Accept_Other( + uint256 tokens, + uint256 tokensSlash, + uint256 tokensSlashRelatedDispute + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + tokensSlashRelatedDispute = bound(tokensSlashRelatedDispute, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + uint256 fishermanBalanceBefore = token.balanceOf(users.fisherman); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.arbitrator); + _acceptDisputeConflict(disputeID1, tokensSlash, true, tokensSlashRelatedDispute); + + uint256 fishermanRewardPercentage = disputeManager.fishermanRewardCut(); + uint256 fishermanRewardFirstDispute = tokensSlash.mulPPM(fishermanRewardPercentage); + uint256 fishermanRewardRelatedDispute = tokensSlashRelatedDispute.mulPPM(fishermanRewardPercentage); + uint256 fishermanReward = fishermanRewardFirstDispute + fishermanRewardRelatedDispute; + uint256 fishermanBalanceAfter = token.balanceOf(users.fisherman); + + assertEq(fishermanBalanceAfter, fishermanBalanceBefore + fishermanReward); + } + + function test_Query_Conflict_Accept_RevertIf_CallerIsNotArbitrator( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + // attempt to accept dispute as fisherman + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.acceptDisputeConflict(disputeID1, tokensSlash, false, 0); + } + + function test_Query_Conflict_Accept_RevertWhen_SlashingOverMaxSlashPercentage( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, uint256(maxSlashingPercentage).mulPPM(tokens) + 1, type(uint256).max); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + // max slashing percentage is 50% + resetPrank(users.arbitrator); + uint256 maxTokensToSlash = uint256(maxSlashingPercentage).mulPPM(tokens); + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerInvalidTokensSlash.selector, + tokensSlash, + maxTokensToSlash + ); + vm.expectRevert(expectedError); + disputeManager.acceptDisputeConflict(disputeID1, tokensSlash, false, 0); + } + + function test_Query_Conflict_Accept_AcceptRelated_DifferentIndexer( + uint256 tokensFirstIndexer, + uint256 tokensSecondIndexer, + uint256 tokensSlash, + uint256 tokensSlashRelatedDispute + ) public useIndexer useAllocation(tokensFirstIndexer) { + tokensSecondIndexer = bound(tokensSecondIndexer, minimumProvisionTokens, 10_000_000_000 ether); + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokensFirstIndexer)); + + // Setup different indexer for related dispute + address differentIndexer = makeAddr("DifferentIndexer"); + mint(differentIndexer, tokensSecondIndexer); + uint256 differentIndexerAllocationIDPrivateKey = uint256(keccak256(abi.encodePacked(differentIndexer))); + resetPrank(differentIndexer); + _createProvision(differentIndexer, tokensSecondIndexer, fishermanRewardPercentage, disputePeriod); + _register(differentIndexer, abi.encode("url", "geoHash", address(0))); + bytes memory data = _createSubgraphAllocationData( + differentIndexer, + subgraphDeployment, + differentIndexerAllocationIDPrivateKey, + tokensSecondIndexer + ); + _startService(differentIndexer, data); + tokensSlashRelatedDispute = bound( + tokensSlashRelatedDispute, + 1, + uint256(maxSlashingPercentage).mulPPM(tokensSecondIndexer) + ); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + differentIndexerAllocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.arbitrator); + _acceptDisputeConflict(disputeID1, tokensSlash, true, tokensSlashRelatedDispute); + } + + function test_Query_Conflict_Accept_RevertWhen_UsingSingleAccept( + uint256 tokens, + uint256 tokensSlash + ) public useIndexer useAllocation(tokens) { + tokensSlash = bound(tokensSlash, 1, uint256(maxSlashingPercentage).mulPPM(tokens)); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputeInConflict.selector, disputeID1)); + disputeManager.acceptDispute(disputeID1, tokensSlash); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/cancel.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/cancel.t.sol new file mode 100644 index 000000000..f20f19aae --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/cancel.t.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryConflictCancelDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID1 = keccak256(abi.encodePacked("Response CID 1")); + bytes32 private responseCID2 = keccak256(abi.encodePacked("Response CID 2")); + + /* + * TESTS + */ + + function test_Query_Conflict_Cancel_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + // skip to end of dispute period + uint256 disputePeriod = disputeManager.disputePeriod(); + skip(disputePeriod + 1); + + _cancelDispute(disputeID1); + } + + function test_Query_Conflict_Cancel_RevertIf_CallerIsNotFisherman( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.indexer); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotFisherman.selector)); + disputeManager.cancelDispute(disputeID1); + } + + function test_Query_Conflict_Cancel_RevertIf_DisputePeriodNotOver( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodNotFinished.selector)); + disputeManager.cancelDispute(disputeID1); + } + + function test_Query_Conflict_Cancel_After_DisputePeriodIncreased( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + // change the dispute period to a higher value + uint256 oldDisputePeriod = disputeManager.disputePeriod(); + resetPrank(users.governor); + disputeManager.setDisputePeriod(uint64(oldDisputePeriod * 2)); + + // skip to end of old dispute period + skip(oldDisputePeriod + 1); + + // should be able to cancel + resetPrank(users.fisherman); + _cancelDispute(disputeID1); + } + + function test_Query_Cancel_After_DisputePeriodDecreased(uint256 tokens) public useIndexer useAllocation(tokens) { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + // change the dispute period to a lower value + uint256 oldDisputePeriod = disputeManager.disputePeriod(); + resetPrank(users.governor); + disputeManager.setDisputePeriod(uint64(oldDisputePeriod / 2)); + + // skip to end of new dispute period + skip(oldDisputePeriod / 2 + 1); + + // should not be able to cancel + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputePeriodNotFinished.selector)); + disputeManager.cancelDispute(disputeID1); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/create.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/create.t.sol new file mode 100644 index 000000000..3ab0b1e45 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/create.t.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { IAttestation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAttestation.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryConflictCreateDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID1 = keccak256(abi.encodePacked("Response CID 1")); + bytes32 private responseCID2 = keccak256(abi.encodePacked("Response CID 2")); + + /* + * TESTS + */ + + function test_Query_Conflict_Create_DisputeAttestation(uint256 tokens) public useIndexer useAllocation(tokens) { + resetPrank(users.fisherman); + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + _createQueryDisputeConflict(attestationData1, attestationData2); + } + + function test_Query_Conflict_Create_DisputeAttestationDifferentIndexers( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + // Setup new indexer + address newIndexer = makeAddr("newIndexer"); + uint256 newAllocationIDKey = uint256(keccak256(abi.encodePacked("newAllocationID"))); + mint(newIndexer, tokens); + resetPrank(newIndexer); + _createProvision(newIndexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(newIndexer, abi.encode("url", "geoHash", 0x0)); + bytes memory data = _createSubgraphAllocationData(newIndexer, subgraphDeployment, newAllocationIDKey, tokens); + _startService(newIndexer, data); + + // Create query conflict dispute + resetPrank(users.fisherman); + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + newAllocationIDKey + ); + + _createQueryDisputeConflict(attestationData1, attestationData2); + } + + function test_Query_Conflict_Create_RevertIf_AttestationsResponsesAreTheSame() public useFisherman { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID1, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerNonConflictingAttestations.selector, + requestCID, + responseCID1, + subgraphDeployment, + requestCID, + responseCID1, + subgraphDeployment + ); + vm.expectRevert(expectedError); + disputeManager.createQueryDisputeConflict(attestationData1, attestationData2); + } + + function test_Query_Conflict_Create_RevertIf_AttestationsHaveDifferentSubgraph() public useFisherman { + bytes32 subgraphDeploymentId2 = keccak256(abi.encodePacked("Subgraph Deployment ID 2")); + + IAttestation.Receipt memory receipt1 = _createAttestationReceipt(requestCID, responseCID1, subgraphDeployment); + bytes memory attestationData1 = _createAtestationData(receipt1, allocationIDPrivateKey); + + IAttestation.Receipt memory receipt2 = _createAttestationReceipt( + requestCID, + responseCID2, + subgraphDeploymentId2 + ); + bytes memory attestationData2 = _createAtestationData(receipt2, allocationIDPrivateKey); + + bytes memory expectedError = abi.encodeWithSelector( + IDisputeManager.DisputeManagerNonConflictingAttestations.selector, + requestCID, + responseCID1, + subgraphDeployment, + requestCID, + responseCID2, + subgraphDeploymentId2 + ); + vm.expectRevert(expectedError); + disputeManager.createQueryDisputeConflict(attestationData1, attestationData2); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/draw.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/draw.t.sol new file mode 100644 index 000000000..6f116854d --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/draw.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryConflictDrawDisputeTest is DisputeManagerTest { + bytes32 private requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 private responseCID1 = keccak256(abi.encodePacked("Response CID 1")); + bytes32 private responseCID2 = keccak256(abi.encodePacked("Response CID 2")); + + /* + * TESTS + */ + + function test_Query_Conflict_Draw_Dispute(uint256 tokens) public useIndexer useAllocation(tokens) { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.arbitrator); + _drawDispute(disputeID1); + } + + function test_Query_Conflict_Draw_RevertIf_CallerIsNotArbitrator( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + // attempt to draw dispute as fisherman + resetPrank(users.fisherman); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerNotArbitrator.selector)); + disputeManager.drawDispute(disputeID1); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/reject.t.sol b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/reject.t.sol new file mode 100644 index 000000000..dfde41d2b --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/disputes/queryConflict/reject.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../../DisputeManager.t.sol"; + +contract DisputeManagerQueryConflictRejectDisputeTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Query_Conflict_Reject_Revert(uint256 tokens) public useIndexer useAllocation(tokens) { + bytes32 requestCID = keccak256(abi.encodePacked("Request CID")); + bytes32 responseCID1 = keccak256(abi.encodePacked("Response CID 1")); + bytes32 responseCID2 = keccak256(abi.encodePacked("Response CID 2")); + + (bytes memory attestationData1, bytes memory attestationData2) = _createConflictingAttestations( + requestCID, + subgraphDeployment, + responseCID1, + responseCID2, + allocationIDPrivateKey, + allocationIDPrivateKey + ); + + resetPrank(users.fisherman); + (bytes32 disputeID1, ) = _createQueryDisputeConflict(attestationData1, attestationData2); + + resetPrank(users.arbitrator); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerDisputeInConflict.selector, disputeID1)); + disputeManager.rejectDispute(disputeID1); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/governance/arbitrator.t.sol b/packages/subgraph-service/test/unit/disputeManager/governance/arbitrator.t.sol new file mode 100644 index 000000000..e3b69bc69 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/governance/arbitrator.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract DisputeManagerGovernanceArbitratorTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Governance_SetArbitrator() public useGovernor { + address arbitrator = makeAddr("newArbitrator"); + _setArbitrator(arbitrator); + } + + function test_Governance_RevertWhen_ZeroAddress() public useGovernor { + address arbitrator = address(0); + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidZeroAddress.selector)); + disputeManager.setArbitrator(arbitrator); + } + + function test_Governance_RevertWhen_NotGovernor() public useFisherman { + address arbitrator = makeAddr("newArbitrator"); + vm.expectRevert( + abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, users.fisherman) + ); + disputeManager.setArbitrator(arbitrator); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/governance/disputeDeposit.t.sol b/packages/subgraph-service/test/unit/disputeManager/governance/disputeDeposit.t.sol new file mode 100644 index 000000000..ea2b145bc --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/governance/disputeDeposit.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract DisputeManagerGovernanceDisputeDepositTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Governance_SetDisputeDeposit(uint256 disputeDeposit) public useGovernor { + vm.assume(disputeDeposit >= MIN_DISPUTE_DEPOSIT); + _setDisputeDeposit(disputeDeposit); + } + + function test_Governance_RevertWhen_DepositTooLow(uint256 disputeDeposit) public useGovernor { + vm.assume(disputeDeposit < MIN_DISPUTE_DEPOSIT); + vm.expectRevert( + abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidDisputeDeposit.selector, disputeDeposit) + ); + disputeManager.setDisputeDeposit(disputeDeposit); + } + + function test_Governance_RevertWhen_NotGovernor() public useFisherman { + uint256 disputeDeposit = 100 ether; + vm.expectRevert( + abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, users.fisherman) + ); + disputeManager.setDisputeDeposit(disputeDeposit); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/governance/fishermanRewardCut.t.sol b/packages/subgraph-service/test/unit/disputeManager/governance/fishermanRewardCut.t.sol new file mode 100644 index 000000000..b7719078c --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/governance/fishermanRewardCut.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract DisputeManagerGovernanceFishermanRewardCutTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Governance_SetFishermanRewardCut(uint32 fishermanRewardCut) public useGovernor { + vm.assume(fishermanRewardCut <= disputeManager.MAX_FISHERMAN_REWARD_CUT()); + _setFishermanRewardCut(fishermanRewardCut); + } + + function test_Governance_RevertWhen_OverMaximumValue(uint32 fishermanRewardCut) public useGovernor { + vm.assume(fishermanRewardCut > disputeManager.MAX_FISHERMAN_REWARD_CUT()); + vm.expectRevert( + abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidFishermanReward.selector, fishermanRewardCut) + ); + disputeManager.setFishermanRewardCut(fishermanRewardCut); + } + + function test_Governance_RevertWhen_NotGovernor() public useFisherman { + uint32 fishermanRewardCut = 1000; + vm.expectRevert( + abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, users.fisherman) + ); + disputeManager.setFishermanRewardCut(fishermanRewardCut); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/governance/maxSlashingCut.t.sol b/packages/subgraph-service/test/unit/disputeManager/governance/maxSlashingCut.t.sol new file mode 100644 index 000000000..e524e9dc2 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/governance/maxSlashingCut.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract DisputeManagerGovernanceMaxSlashingCutTest is DisputeManagerTest { + /* + * TESTS + */ + + function test_Governance_SetMaxSlashingCut(uint32 maxSlashingCut) public useGovernor { + vm.assume(maxSlashingCut <= MAX_PPM); + _setMaxSlashingCut(maxSlashingCut); + } + + function test_Governance_RevertWhen_NotPPM(uint32 maxSlashingCut) public useGovernor { + vm.assume(maxSlashingCut > MAX_PPM); + vm.expectRevert( + abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidMaxSlashingCut.selector, maxSlashingCut) + ); + disputeManager.setMaxSlashingCut(maxSlashingCut); + } + + function test_Governance_RevertWhen_NotGovernor() public useFisherman { + uint32 maxSlashingCut = 1000; + vm.expectRevert( + abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, users.fisherman) + ); + disputeManager.setMaxSlashingCut(maxSlashingCut); + } +} diff --git a/packages/subgraph-service/test/unit/disputeManager/governance/subgraphService.t.sol b/packages/subgraph-service/test/unit/disputeManager/governance/subgraphService.t.sol new file mode 100644 index 000000000..3bd0b7db4 --- /dev/null +++ b/packages/subgraph-service/test/unit/disputeManager/governance/subgraphService.t.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDisputeManager } from "@graphprotocol/interfaces/contracts/subgraph-service/IDisputeManager.sol"; +import { DisputeManagerTest } from "../DisputeManager.t.sol"; + +contract DisputeManagerGovernanceSubgraphService is DisputeManagerTest { + /* + * TESTS + */ + + function test_Governance_SetSubgraphService(address subgraphService) public useGovernor { + vm.assume(subgraphService != address(0)); + _setSubgraphService(subgraphService); + } + + function test_Governance_SetSubgraphService_RevertWhenZero() public useGovernor { + vm.expectRevert(abi.encodeWithSelector(IDisputeManager.DisputeManagerInvalidZeroAddress.selector)); + disputeManager.setSubgraphService(address(0)); + } +} diff --git a/packages/subgraph-service/test/unit/mocks/MockCuration.sol b/packages/subgraph-service/test/unit/mocks/MockCuration.sol new file mode 100644 index 000000000..0fb417c6d --- /dev/null +++ b/packages/subgraph-service/test/unit/mocks/MockCuration.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +contract MockCuration { + function isCurated(bytes32) public pure returns (bool) { + return true; + } + + function collect(bytes32, uint256) external {} +} diff --git a/packages/subgraph-service/test/unit/mocks/MockEpochManager.sol b/packages/subgraph-service/test/unit/mocks/MockEpochManager.sol new file mode 100644 index 000000000..2fcfb8e71 --- /dev/null +++ b/packages/subgraph-service/test/unit/mocks/MockEpochManager.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity 0.8.27; + +import { IEpochManager } from "@graphprotocol/interfaces/contracts/contracts/epochs/IEpochManager.sol"; + +contract MockEpochManager is IEpochManager { + // -- Variables -- + + uint256 public epochLength; + uint256 public lastRunEpoch; + uint256 public lastLengthUpdateEpoch; + uint256 public lastLengthUpdateBlock; + + // -- Configuration -- + + function setEpochLength(uint256 _epochLength) public { + lastLengthUpdateEpoch = 1; + lastLengthUpdateBlock = blockNum(); + epochLength = _epochLength; + } + + // -- Epochs + + function runEpoch() public { + lastRunEpoch = currentEpoch(); + } + + // -- Getters -- + + function isCurrentEpochRun() public view returns (bool) { + return lastRunEpoch == currentEpoch(); + } + + function blockNum() public view returns (uint256) { + return block.number; + } + + function blockHash(uint256 _block) public view returns (bytes32) { + return blockhash(_block); + } + + function currentEpoch() public view returns (uint256) { + return lastLengthUpdateEpoch + epochsSinceUpdate(); + } + + function currentEpochBlock() public view returns (uint256) { + return lastLengthUpdateBlock + (epochsSinceUpdate() * epochLength); + } + + function currentEpochBlockSinceStart() public view returns (uint256) { + return blockNum() - currentEpochBlock(); + } + + function epochsSince(uint256 _epoch) public view returns (uint256) { + uint256 epoch = currentEpoch(); + return _epoch < epoch ? (epoch - _epoch) : 0; + } + + function epochsSinceUpdate() public view returns (uint256) { + return (blockNum() - lastLengthUpdateBlock) / epochLength; + } +} diff --git a/packages/subgraph-service/test/unit/mocks/MockGRTToken.sol b/packages/subgraph-service/test/unit/mocks/MockGRTToken.sol new file mode 100644 index 000000000..b5e47afb1 --- /dev/null +++ b/packages/subgraph-service/test/unit/mocks/MockGRTToken.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@graphprotocol/interfaces/contracts/contracts/token/IGraphToken.sol"; + +contract MockGRTToken is ERC20, IGraphToken { + constructor() ERC20("Graph Token", "GRT") {} + + function burn(uint256 amount) external { + _burn(msg.sender, amount); + } + + function burnFrom(address _from, uint256 amount) external { + _burn(_from, amount); + } + + function mint(address to, uint256 amount) public { + _mint(to, amount); + } + + // -- Mint Admin -- + + function addMinter(address _account) external {} + + function removeMinter(address _account) external {} + + function renounceMinter() external {} + + function isMinter(address _account) external view returns (bool) {} + + // -- Permit -- + + function permit( + address _owner, + address _spender, + uint256 _value, + uint256 _deadline, + uint8 _v, + bytes32 _r, + bytes32 _s + ) external {} + + // -- Allowance -- + + function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {} + function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {} +} diff --git a/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol b/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol new file mode 100644 index 000000000..b3724daae --- /dev/null +++ b/packages/subgraph-service/test/unit/mocks/MockRewardsManager.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IRewardsManager } from "@graphprotocol/interfaces/contracts/contracts/rewards/IRewardsManager.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; + +import { MockGRTToken } from "./MockGRTToken.sol"; + +interface IRewardsIssuer { + function getAllocationData( + address allocationId + ) + external + view + returns ( + bool isActive, + address indexer, + bytes32 subgraphDeploymentId, + uint256 tokens, + uint256 accRewardsPerAllocatedToken + ); +} + +contract MockRewardsManager is IRewardsManager { + using PPMMath for uint256; + + MockGRTToken public token; + uint256 public rewardsPerSignal; + uint256 public rewardsPerSubgraphAllocationUpdate; + mapping(bytes32 => bool) public subgraphs; + + uint256 private constant FIXED_POINT_SCALING_FACTOR = 1e18; + + constructor(MockGRTToken _token, uint256 _rewardsPerSignal, uint256 _rewardsPerSubgraphAllocationUpdate) { + token = _token; + rewardsPerSignal = _rewardsPerSignal; + rewardsPerSubgraphAllocationUpdate = _rewardsPerSubgraphAllocationUpdate; + } + + // -- Config -- + + function setIssuancePerBlock(uint256) external {} + + function setMinimumSubgraphSignal(uint256) external {} + + function setSubgraphService(address) external {} + + // -- Denylist -- + + function setSubgraphAvailabilityOracle(address) external {} + + function setDenied(bytes32, bool) external {} + + function setDeniedMany(bytes32[] calldata, bool[] calldata) external {} + + function isDenied(bytes32) external view returns (bool) {} + + // -- Getters -- + + function getNewRewardsPerSignal() external view returns (uint256) {} + + function getAccRewardsPerSignal() external view returns (uint256) {} + + function getAccRewardsForSubgraph(bytes32) external view returns (uint256) {} + + function getAccRewardsPerAllocatedToken(bytes32) external view returns (uint256, uint256) {} + + function getRewards(address, address) external view returns (uint256) {} + + function calcRewards(uint256, uint256) external pure returns (uint256) {} + + // -- Updates -- + + function updateAccRewardsPerSignal() external returns (uint256) {} + + function takeRewards(address _allocationID) external returns (uint256) { + address rewardsIssuer = msg.sender; + (bool isActive, , , uint256 tokens, uint256 accRewardsPerAllocatedToken) = IRewardsIssuer(rewardsIssuer) + .getAllocationData(_allocationID); + + if (!isActive) { + return 0; + } + + uint256 accRewardsPerTokens = tokens.mulPPM(rewardsPerSignal); + uint256 rewards = accRewardsPerTokens - accRewardsPerAllocatedToken; + token.mint(rewardsIssuer, rewards); + return rewards; + } + + // -- Hooks -- + + function onSubgraphSignalUpdate(bytes32) external pure returns (uint256) {} + + function onSubgraphAllocationUpdate(bytes32 _subgraphDeploymentID) external returns (uint256) { + if (subgraphs[_subgraphDeploymentID]) { + return rewardsPerSubgraphAllocationUpdate; + } + + subgraphs[_subgraphDeploymentID] = true; + return 0; + } + + function subgraphService() external pure returns (address) { + return address(0x00); + } +} diff --git a/packages/subgraph-service/test/unit/shared/HorizonStakingShared.t.sol b/packages/subgraph-service/test/unit/shared/HorizonStakingShared.t.sol new file mode 100644 index 000000000..290644bea --- /dev/null +++ b/packages/subgraph-service/test/unit/shared/HorizonStakingShared.t.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { IHorizonStakingExtension } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingExtension.sol"; + +import { SubgraphBaseTest } from "../SubgraphBaseTest.t.sol"; + +abstract contract HorizonStakingSharedTest is SubgraphBaseTest { + /* + * HELPERS + */ + + function _provision( + address _indexer, + uint256 _tokens, + uint32 _maxSlashingPercentage, + uint64 _disputePeriod + ) internal { + staking.provision(_indexer, address(subgraphService), _tokens, _maxSlashingPercentage, _disputePeriod); + } + + function _createProvision( + address _indexer, + uint256 _tokens, + uint32 _maxSlashingPercentage, + uint64 _disputePeriod + ) internal { + _stakeTo(_indexer, _tokens); + staking.provision(_indexer, address(subgraphService), _tokens, _maxSlashingPercentage, _disputePeriod); + } + + function _addToProvision(address _indexer, uint256 _tokens) internal { + _stakeTo(_indexer, _tokens); + staking.addToProvision(_indexer, address(subgraphService), _tokens); + } + + function _delegate(address _indexer, address _verifier, uint256 _tokens, uint256 _minSharesOut) internal { + staking.delegate(_indexer, _verifier, _tokens, _minSharesOut); + } + + function _undelegate(address _indexer, address _verifier, uint256 _shares) internal { + staking.undelegate(_indexer, _verifier, _shares); + } + + function _setDelegationFeeCut( + address _indexer, + address _verifier, + IGraphPayments.PaymentTypes _paymentType, + uint256 _cut + ) internal { + staking.setDelegationFeeCut(_indexer, _verifier, _paymentType, _cut); + } + + function _thawDeprovisionAndUnstake(address _indexer, address _verifier, uint256 _tokens) internal { + // Initiate thaw request + staking.thaw(_indexer, _verifier, _tokens); + + // Skip thawing period + IHorizonStakingTypes.Provision memory provision = staking.getProvision(_indexer, _verifier); + skip(provision.thawingPeriod + 1); + + // Deprovision and unstake + staking.deprovision(_indexer, _verifier, 0); + staking.unstake(_tokens); + } + + function _setProvisionParameters( + address _indexer, + address _verifier, + uint32 _maxVerifierCut, + uint64 _thawingPeriod + ) internal { + staking.setProvisionParameters(_indexer, _verifier, _maxVerifierCut, _thawingPeriod); + } + + function _setStorage_allocation_hardcoded(address indexer, address allocationId, uint256 tokens) internal { + IHorizonStakingExtension.Allocation memory allocation = IHorizonStakingExtension.Allocation({ + indexer: indexer, + subgraphDeploymentID: bytes32("0x12344321"), + tokens: tokens, + createdAtEpoch: 1234, + closedAtEpoch: 1235, + collectedFees: 1234, + __DEPRECATED_effectiveAllocation: 1222234, + accRewardsPerAllocatedToken: 1233334, + distributedRebates: 1244434 + }); + + // __DEPRECATED_allocations + uint256 allocationsSlot = 15; + bytes32 allocationBaseSlot = keccak256(abi.encode(allocationId, allocationsSlot)); + vm.store(address(staking), allocationBaseSlot, bytes32(uint256(uint160(allocation.indexer)))); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 1), allocation.subgraphDeploymentID); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 2), bytes32(tokens)); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 3), bytes32(allocation.createdAtEpoch)); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 4), bytes32(allocation.closedAtEpoch)); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 5), bytes32(allocation.collectedFees)); + vm.store( + address(staking), + bytes32(uint256(allocationBaseSlot) + 6), + bytes32(allocation.__DEPRECATED_effectiveAllocation) + ); + vm.store( + address(staking), + bytes32(uint256(allocationBaseSlot) + 7), + bytes32(allocation.accRewardsPerAllocatedToken) + ); + vm.store(address(staking), bytes32(uint256(allocationBaseSlot) + 8), bytes32(allocation.distributedRebates)); + + // _serviceProviders + uint256 serviceProviderSlot = 14; + bytes32 serviceProviderBaseSlot = keccak256(abi.encode(allocation.indexer, serviceProviderSlot)); + uint256 currentTokensStaked = uint256(vm.load(address(staking), serviceProviderBaseSlot)); + uint256 currentTokensProvisioned = uint256( + vm.load(address(staking), bytes32(uint256(serviceProviderBaseSlot) + 1)) + ); + vm.store( + address(staking), + bytes32(uint256(serviceProviderBaseSlot) + 0), + bytes32(currentTokensStaked + tokens) + ); + vm.store( + address(staking), + bytes32(uint256(serviceProviderBaseSlot) + 1), + bytes32(currentTokensProvisioned + tokens) + ); + + // __DEPRECATED_subgraphAllocations + uint256 subgraphsAllocationsSlot = 16; + bytes32 subgraphAllocationsBaseSlot = keccak256( + abi.encode(allocation.subgraphDeploymentID, subgraphsAllocationsSlot) + ); + uint256 currentAllocatedTokens = uint256(vm.load(address(staking), subgraphAllocationsBaseSlot)); + vm.store(address(staking), subgraphAllocationsBaseSlot, bytes32(currentAllocatedTokens + tokens)); + } + + function _stakeTo(address _indexer, uint256 _tokens) internal { + token.approve(address(staking), _tokens); + staking.stakeTo(_indexer, _tokens); + } + + function _stake(uint256 _tokens) internal { + token.approve(address(staking), _tokens); + staking.stake(_tokens); + } +} diff --git a/packages/subgraph-service/test/unit/shared/SubgraphServiceShared.t.sol b/packages/subgraph-service/test/unit/shared/SubgraphServiceShared.t.sol new file mode 100644 index 000000000..ed05e0ce5 --- /dev/null +++ b/packages/subgraph-service/test/unit/shared/SubgraphServiceShared.t.sol @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { Allocation } from "../../../contracts/libraries/Allocation.sol"; +import { AllocationManager } from "../../../contracts/utilities/AllocationManager.sol"; + +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; + +import { HorizonStakingSharedTest } from "./HorizonStakingShared.t.sol"; + +abstract contract SubgraphServiceSharedTest is HorizonStakingSharedTest { + using Allocation for IAllocation.State; + + /* + * VARIABLES + */ + + uint256 allocationIDPrivateKey; + address allocationID; + bytes32 subgraphDeployment; + + /* + * MODIFIERS + */ + + modifier useIndexer() { + vm.startPrank(users.indexer); + _; + vm.stopPrank(); + } + + modifier useAllocation(uint256 tokens) { + vm.assume(tokens >= minimumProvisionTokens); + vm.assume(tokens < 10_000_000_000 ether); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + bytes memory data = _createSubgraphAllocationData( + users.indexer, + subgraphDeployment, + allocationIDPrivateKey, + tokens + ); + _startService(users.indexer, data); + _; + } + + modifier useDelegation(uint256 tokens) { + vm.assume(tokens > MIN_DELEGATION); + vm.assume(tokens < 10_000_000_000 ether); + (, address msgSender, ) = vm.readCallers(); + resetPrank(users.delegator); + token.approve(address(staking), tokens); + _delegate(users.indexer, address(subgraphService), tokens, 0); + resetPrank(msgSender); + _; + } + + /* + * SET UP + */ + + function setUp() public virtual override { + super.setUp(); + (allocationID, allocationIDPrivateKey) = makeAddrAndKey("allocationId"); + subgraphDeployment = keccak256(abi.encodePacked("Subgraph Deployment ID")); + } + + /* + * ACTIONS + */ + + function _register(address _indexer, bytes memory _data) internal { + (string memory url, string memory geohash, address rewardsDestination) = abi.decode( + _data, + (string, string, address) + ); + + vm.expectEmit(address(subgraphService)); + emit IDataService.ServiceProviderRegistered(_indexer, _data); + + // Register indexer + subgraphService.register(_indexer, _data); + + // Check registered indexer data + ISubgraphService.Indexer memory indexer = _getIndexer(_indexer); + assertEq(indexer.url, url); + assertEq(indexer.geoHash, geohash); + + // Check rewards destination + assertEq(subgraphService.paymentsDestination(_indexer), rewardsDestination); + } + + function _startService(address _indexer, bytes memory _data) internal { + (bytes32 subgraphDeploymentId, uint256 tokens, address allocationId, ) = abi.decode( + _data, + (bytes32, uint256, address, bytes) + ); + uint256 previousSubgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens(subgraphDeploymentId); + uint256 currentEpoch = epochManager.currentEpoch(); + + vm.expectEmit(address(subgraphService)); + emit IDataService.ServiceStarted(_indexer, _data); + emit AllocationManager.AllocationCreated(_indexer, allocationId, subgraphDeploymentId, tokens, currentEpoch); + + // TODO: improve this + uint256 accRewardsPerAllocatedToken = 0; + if (rewardsManager.subgraphs(subgraphDeploymentId)) { + accRewardsPerAllocatedToken = rewardsManager.rewardsPerSubgraphAllocationUpdate(); + } + + // Start service + subgraphService.startService(_indexer, _data); + + // Check allocation data + IAllocation.State memory allocation = subgraphService.getAllocation(allocationId); + assertEq(allocation.tokens, tokens); + assertEq(allocation.indexer, _indexer); + assertEq(allocation.subgraphDeploymentId, subgraphDeploymentId); + assertEq(allocation.createdAt, block.timestamp); + assertEq(allocation.closedAt, 0); + assertEq(allocation.lastPOIPresentedAt, 0); + assertEq(allocation.accRewardsPerAllocatedToken, accRewardsPerAllocatedToken); + assertEq(allocation.accRewardsPending, 0); + assertEq(allocation.createdAtEpoch, currentEpoch); + + // Check subgraph deployment allocated tokens + uint256 subgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens(subgraphDeploymentId); + assertEq(subgraphAllocatedTokens, previousSubgraphAllocatedTokens + tokens); + } + + function _stopService(address _indexer, bytes memory _data) internal { + address allocationId = abi.decode(_data, (address)); + + IAllocation.State memory allocation = subgraphService.getAllocation(allocationId); + assertTrue(allocation.isOpen()); + uint256 previousSubgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens( + allocation.subgraphDeploymentId + ); + + vm.expectEmit(address(subgraphService)); + emit AllocationManager.AllocationClosed( + _indexer, + allocationId, + allocation.subgraphDeploymentId, + allocation.tokens, + false + ); + emit IDataService.ServiceStopped(_indexer, _data); + + // stop allocation + subgraphService.stopService(_indexer, _data); + + // update allocation + allocation = subgraphService.getAllocation(allocationId); + + // check allocation + assertEq(allocation.closedAt, block.timestamp); + + // check subgraph deployment allocated tokens + uint256 subgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens(subgraphDeployment); + assertEq(subgraphAllocatedTokens, previousSubgraphAllocatedTokens - allocation.tokens); + } + + /* + * HELPERS + */ + + function _createSubgraphAllocationData( + address _indexer, + bytes32 _subgraphDeployment, + uint256 _allocationIdPrivateKey, + uint256 _tokens + ) internal view returns (bytes memory) { + address allocationId = vm.addr(_allocationIdPrivateKey); + bytes32 digest = subgraphService.encodeAllocationProof(_indexer, allocationId); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_allocationIdPrivateKey, digest); + + return abi.encode(_subgraphDeployment, _tokens, allocationId, abi.encodePacked(r, s, v)); + } + + function _delegate(uint256 tokens) internal { + token.approve(address(staking), tokens); + staking.delegate(users.indexer, address(subgraphService), tokens, 0); + } + + function _calculateStakeSnapshot(uint256 _tokens, uint256 _tokensDelegated) internal pure returns (uint256) { + return _tokens + _tokensDelegated; + } + + /* + * PRIVATE FUNCTIONS + */ + + function _getIndexer(address _indexer) private view returns (ISubgraphService.Indexer memory) { + (string memory url, string memory geoHash) = subgraphService.indexers(_indexer); + return ISubgraphService.Indexer({ url: url, geoHash: geoHash }); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/SubgraphService.t.sol b/packages/subgraph-service/test/unit/subgraphService/SubgraphService.t.sol new file mode 100644 index 000000000..74c677504 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/SubgraphService.t.sol @@ -0,0 +1,553 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { LinkedList } from "@graphprotocol/horizon/contracts/libraries/LinkedList.sol"; +import { IDataServiceFees } from "@graphprotocol/interfaces/contracts/data-service/IDataServiceFees.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; +import { ILinkedList } from "@graphprotocol/interfaces/contracts/horizon/internal/ILinkedList.sol"; +import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol"; + +import { Allocation } from "../../../contracts/libraries/Allocation.sol"; +import { AllocationManager } from "../../../contracts/utilities/AllocationManager.sol"; +import { LegacyAllocation } from "../../../contracts/libraries/LegacyAllocation.sol"; +import { SubgraphServiceSharedTest } from "../shared/SubgraphServiceShared.t.sol"; + +contract SubgraphServiceTest is SubgraphServiceSharedTest { + using PPMMath for uint256; + using Allocation for IAllocation.State; + using LinkedList for ILinkedList.List; + + /* + * MODIFIERS + */ + + modifier useGovernor() { + vm.startPrank(users.governor); + _; + vm.stopPrank(); + } + + modifier useOperator() { + resetPrank(users.indexer); + staking.setOperator(address(subgraphService), users.operator, true); + resetPrank(users.operator); + _; + vm.stopPrank(); + } + + modifier useRewardsDestination() { + _setRewardsDestination(users.rewardsDestination); + _; + } + + /* + * SET UP + */ + + function setUp() public virtual override { + super.setUp(); + } + + /* + * ACTIONS + */ + + function _setRewardsDestination(address _rewardsDestination) internal { + (, address indexer, ) = vm.readCallers(); + + vm.expectEmit(address(subgraphService)); + emit ISubgraphService.PaymentsDestinationSet(indexer, _rewardsDestination); + + // Set rewards destination + subgraphService.setPaymentsDestination(_rewardsDestination); + + // Check rewards destination + assertEq(subgraphService.paymentsDestination(indexer), _rewardsDestination); + } + + function _acceptProvision(address _indexer, bytes memory _data) internal { + IHorizonStakingTypes.Provision memory provision = staking.getProvision(_indexer, address(subgraphService)); + uint32 maxVerifierCut = provision.maxVerifierCut; + uint64 thawingPeriod = provision.thawingPeriod; + uint32 maxVerifierCutPending = provision.maxVerifierCutPending; + uint64 thawingPeriodPending = provision.thawingPeriodPending; + + vm.expectEmit(address(subgraphService)); + emit IDataService.ProvisionPendingParametersAccepted(_indexer); + + // Accept provision + subgraphService.acceptProvisionPendingParameters(_indexer, _data); + + // Update provision after acceptance + provision = staking.getProvision(_indexer, address(subgraphService)); + + // Check that max verifier cut updated to pending value if needed + if (maxVerifierCut != maxVerifierCutPending) { + assertEq(provision.maxVerifierCut, maxVerifierCutPending); + } + + // Check that thawing period updated to pending value if needed + if (thawingPeriod != thawingPeriodPending) { + assertEq(provision.thawingPeriod, thawingPeriodPending); + } + } + + function _resizeAllocation(address _indexer, address _allocationId, uint256 _tokens) internal { + // before state + IAllocation.State memory beforeAllocation = subgraphService.getAllocation(_allocationId); + bytes32 subgraphDeploymentId = beforeAllocation.subgraphDeploymentId; + uint256 beforeSubgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens(subgraphDeploymentId); + uint256 beforeAllocatedTokens = subgraphService.allocationProvisionTracker(_indexer); + + uint256 allocatedTokensDelta; + if (_tokens > beforeAllocation.tokens) { + allocatedTokensDelta = _tokens - beforeAllocation.tokens; + } else { + allocatedTokensDelta = beforeAllocation.tokens - _tokens; + } + + vm.expectEmit(address(subgraphService)); + emit AllocationManager.AllocationResized( + _indexer, + _allocationId, + subgraphDeploymentId, + _tokens, + beforeSubgraphAllocatedTokens + ); + + // resize allocation + subgraphService.resizeAllocation(_indexer, _allocationId, _tokens); + + // after state + uint256 afterSubgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens(subgraphDeploymentId); + uint256 afterAllocatedTokens = subgraphService.allocationProvisionTracker(_indexer); + IAllocation.State memory afterAllocation = subgraphService.getAllocation(_allocationId); + uint256 accRewardsPerAllocatedTokenDelta = afterAllocation.accRewardsPerAllocatedToken - + beforeAllocation.accRewardsPerAllocatedToken; + uint256 afterAccRewardsPending = rewardsManager.calcRewards( + beforeAllocation.tokens, + accRewardsPerAllocatedTokenDelta + ); + + // check state + if (_tokens > beforeAllocation.tokens) { + assertEq(afterAllocatedTokens, beforeAllocatedTokens + allocatedTokensDelta); + } else { + assertEq(afterAllocatedTokens, beforeAllocatedTokens - allocatedTokensDelta); + } + assertEq(afterAllocation.tokens, _tokens); + assertEq(afterAllocation.accRewardsPerAllocatedToken, rewardsPerSubgraphAllocationUpdate); + assertEq(afterAllocation.accRewardsPending, afterAccRewardsPending); + assertEq(afterSubgraphAllocatedTokens, _tokens); + } + + function _closeStaleAllocation(address _allocationId) internal { + IAllocation.State memory allocation = subgraphService.getAllocation(_allocationId); + assertTrue(allocation.isOpen()); + uint256 previousSubgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens( + allocation.subgraphDeploymentId + ); + + vm.expectEmit(address(subgraphService)); + emit AllocationManager.AllocationClosed( + allocation.indexer, + _allocationId, + allocation.subgraphDeploymentId, + allocation.tokens, + true + ); + + // close stale allocation + subgraphService.closeStaleAllocation(_allocationId); + + // update allocation + allocation = subgraphService.getAllocation(_allocationId); + + // check allocation + assertEq(allocation.closedAt, block.timestamp); + + // check subgraph deployment allocated tokens + uint256 subgraphAllocatedTokens = subgraphService.getSubgraphAllocatedTokens(subgraphDeployment); + assertEq(subgraphAllocatedTokens, previousSubgraphAllocatedTokens - allocation.tokens); + } + + struct IndexingRewardsData { + bytes32 poi; + bytes poiMetadata; + uint256 tokensIndexerRewards; + uint256 tokensDelegationRewards; + } + + struct QueryFeeData { + uint256 curationCut; + uint256 protocolPaymentCut; + } + + struct CollectPaymentData { + uint256 rewardsDestinationBalance; + uint256 indexerProvisionBalance; + uint256 delegationPoolBalance; + uint256 indexerBalance; + uint256 curationBalance; + uint256 lockedTokens; + uint256 indexerStake; + } + + function _collect(address _indexer, IGraphPayments.PaymentTypes _paymentType, bytes memory _data) internal { + // Reset storage variables + uint256 paymentCollected = 0; + address allocationId; + IndexingRewardsData memory indexingRewardsData; + CollectPaymentData memory collectPaymentDataBefore = _collectPaymentDataBefore(_indexer); + + if (_paymentType == IGraphPayments.PaymentTypes.QueryFee) { + paymentCollected = _handleQueryFeeCollection(_indexer, _data); + } else if (_paymentType == IGraphPayments.PaymentTypes.IndexingRewards) { + (paymentCollected, allocationId, indexingRewardsData) = _handleIndexingRewardsCollection(_data); + } + + vm.expectEmit(address(subgraphService)); + emit IDataService.ServicePaymentCollected(_indexer, _paymentType, paymentCollected); + + // collect rewards + subgraphService.collect(_indexer, _paymentType, _data); + + CollectPaymentData memory collectPaymentDataAfter = _collectPaymentDataAfter(_indexer); + + if (_paymentType == IGraphPayments.PaymentTypes.QueryFee) { + _verifyQueryFeeCollection( + _indexer, + paymentCollected, + _data, + collectPaymentDataBefore, + collectPaymentDataAfter + ); + } else if (_paymentType == IGraphPayments.PaymentTypes.IndexingRewards) { + _verifyIndexingRewardsCollection( + _indexer, + allocationId, + indexingRewardsData, + collectPaymentDataBefore, + collectPaymentDataAfter + ); + } + } + + function _collectPaymentDataBefore(address _indexer) private view returns (CollectPaymentData memory) { + address paymentsDestination = subgraphService.paymentsDestination(_indexer); + CollectPaymentData memory collectPaymentDataBefore; + collectPaymentDataBefore.rewardsDestinationBalance = token.balanceOf(paymentsDestination); + collectPaymentDataBefore.indexerProvisionBalance = staking.getProviderTokensAvailable( + _indexer, + address(subgraphService) + ); + collectPaymentDataBefore.delegationPoolBalance = staking.getDelegatedTokensAvailable( + _indexer, + address(subgraphService) + ); + collectPaymentDataBefore.indexerBalance = token.balanceOf(_indexer); + collectPaymentDataBefore.curationBalance = token.balanceOf(address(curation)); + collectPaymentDataBefore.lockedTokens = subgraphService.feesProvisionTracker(_indexer); + collectPaymentDataBefore.indexerStake = staking.getStake(_indexer); + return collectPaymentDataBefore; + } + + function _collectPaymentDataAfter(address _indexer) private view returns (CollectPaymentData memory) { + CollectPaymentData memory collectPaymentDataAfter; + address paymentsDestination = subgraphService.paymentsDestination(_indexer); + collectPaymentDataAfter.rewardsDestinationBalance = token.balanceOf(paymentsDestination); + collectPaymentDataAfter.indexerProvisionBalance = staking.getProviderTokensAvailable( + _indexer, + address(subgraphService) + ); + collectPaymentDataAfter.delegationPoolBalance = staking.getDelegatedTokensAvailable( + _indexer, + address(subgraphService) + ); + collectPaymentDataAfter.indexerBalance = token.balanceOf(_indexer); + collectPaymentDataAfter.curationBalance = token.balanceOf(address(curation)); + collectPaymentDataAfter.lockedTokens = subgraphService.feesProvisionTracker(_indexer); + collectPaymentDataAfter.indexerStake = staking.getStake(_indexer); + return collectPaymentDataAfter; + } + + function _handleQueryFeeCollection( + address _indexer, + bytes memory _data + ) private returns (uint256 paymentCollected) { + (IGraphTallyCollector.SignedRAV memory signedRav, uint256 tokensToCollect) = abi.decode( + _data, + (IGraphTallyCollector.SignedRAV, uint256) + ); + address allocationId = address(uint160(uint256(signedRav.rav.collectionId))); + IAllocation.State memory allocation = subgraphService.getAllocation(allocationId); + bytes32 subgraphDeploymentId = allocation.subgraphDeploymentId; + + address payer = graphTallyCollector.isAuthorized(signedRav.rav.payer, _recoverRAVSigner(signedRav)) + ? signedRav.rav.payer + : address(0); + + uint256 tokensCollected = graphTallyCollector.tokensCollected( + address(subgraphService), + signedRav.rav.collectionId, + _indexer, + payer + ); + paymentCollected = tokensToCollect == 0 ? signedRav.rav.valueAggregate - tokensCollected : tokensToCollect; + + QueryFeeData memory queryFeeData = _queryFeeData(allocation.subgraphDeploymentId); + uint256 tokensProtocol = paymentCollected.mulPPMRoundUp(queryFeeData.protocolPaymentCut); + uint256 tokensCurators = (paymentCollected - tokensProtocol).mulPPMRoundUp(queryFeeData.curationCut); + + vm.expectEmit(address(subgraphService)); + emit ISubgraphService.QueryFeesCollected( + _indexer, + payer, + allocationId, + subgraphDeploymentId, + paymentCollected, + tokensCurators + ); + + return paymentCollected; + } + + function _queryFeeData(bytes32 _subgraphDeploymentId) private view returns (QueryFeeData memory) { + QueryFeeData memory queryFeeData; + queryFeeData.protocolPaymentCut = graphPayments.PROTOCOL_PAYMENT_CUT(); + uint256 curationFeesCut = subgraphService.curationFeesCut(); + queryFeeData.curationCut = curation.isCurated(_subgraphDeploymentId) ? curationFeesCut : 0; + return queryFeeData; + } + + function _handleIndexingRewardsCollection( + bytes memory _data + ) private returns (uint256 paymentCollected, address allocationId, IndexingRewardsData memory indexingRewardsData) { + (allocationId, indexingRewardsData.poi, indexingRewardsData.poiMetadata) = abi.decode( + _data, + (address, bytes32, bytes) + ); + IAllocation.State memory allocation = subgraphService.getAllocation(allocationId); + + // Calculate accumulated tokens, this depends on the rewards manager which we have mocked + uint256 accRewardsPerTokens = allocation.tokens.mulPPM(rewardsManager.rewardsPerSignal()); + // Calculate the payment collected by the indexer for this transaction + paymentCollected = accRewardsPerTokens - allocation.accRewardsPerAllocatedToken; + + uint256 currentEpoch = epochManager.currentEpoch(); + paymentCollected = currentEpoch > allocation.createdAtEpoch ? paymentCollected : 0; + + uint256 delegatorCut = staking.getDelegationFeeCut( + allocation.indexer, + address(subgraphService), + IGraphPayments.PaymentTypes.IndexingRewards + ); + IHorizonStakingTypes.DelegationPool memory delegationPool = staking.getDelegationPool( + allocation.indexer, + address(subgraphService) + ); + indexingRewardsData.tokensDelegationRewards = delegationPool.shares > 0 + ? paymentCollected.mulPPM(delegatorCut) + : 0; + indexingRewardsData.tokensIndexerRewards = paymentCollected - indexingRewardsData.tokensDelegationRewards; + + vm.expectEmit(address(subgraphService)); + emit AllocationManager.IndexingRewardsCollected( + allocation.indexer, + allocationId, + allocation.subgraphDeploymentId, + paymentCollected, + indexingRewardsData.tokensIndexerRewards, + indexingRewardsData.tokensDelegationRewards, + indexingRewardsData.poi, + indexingRewardsData.poiMetadata, + epochManager.currentEpoch() + ); + + return (paymentCollected, allocationId, indexingRewardsData); + } + + function _verifyQueryFeeCollection( + address _indexer, + uint256 _paymentCollected, + bytes memory _data, + CollectPaymentData memory collectPaymentDataBefore, + CollectPaymentData memory collectPaymentDataAfter + ) private view { + (IGraphTallyCollector.SignedRAV memory signedRav, uint256 tokensToCollect) = abi.decode( + _data, + (IGraphTallyCollector.SignedRAV, uint256) + ); + IAllocation.State memory allocation = subgraphService.getAllocation( + address(uint160(uint256(signedRav.rav.collectionId))) + ); + QueryFeeData memory queryFeeData = _queryFeeData(allocation.subgraphDeploymentId); + uint256 tokensProtocol = _paymentCollected.mulPPMRoundUp(queryFeeData.protocolPaymentCut); + uint256 curationTokens = (_paymentCollected - tokensProtocol).mulPPMRoundUp(queryFeeData.curationCut); + uint256 expectedIndexerTokensPayment = _paymentCollected - tokensProtocol - curationTokens; + + assertEq( + collectPaymentDataAfter.indexerBalance - collectPaymentDataBefore.indexerBalance, + subgraphService.paymentsDestination(signedRav.rav.serviceProvider) == address(0) + ? 0 + : expectedIndexerTokensPayment + ); + + assertEq( + collectPaymentDataAfter.rewardsDestinationBalance - collectPaymentDataBefore.rewardsDestinationBalance, + subgraphService.paymentsDestination(signedRav.rav.serviceProvider) == address(0) + ? 0 + : expectedIndexerTokensPayment + ); + + assertEq( + collectPaymentDataAfter.indexerStake - collectPaymentDataBefore.indexerStake, + subgraphService.paymentsDestination(signedRav.rav.serviceProvider) == address(0) + ? expectedIndexerTokensPayment + : 0 + ); + assertEq(collectPaymentDataAfter.curationBalance, collectPaymentDataBefore.curationBalance + curationTokens); + + // Check locked tokens + uint256 tokensToLock = _paymentCollected * subgraphService.stakeToFeesRatio(); + assertEq(collectPaymentDataAfter.lockedTokens, collectPaymentDataBefore.lockedTokens + tokensToLock); + + // Check the stake claim + ILinkedList.List memory claimsList = _getClaimList(_indexer); + bytes32 claimId = _buildStakeClaimId(_indexer, claimsList.nonce - 1); + IDataServiceFees.StakeClaim memory stakeClaim = _getStakeClaim(claimId); + uint64 disputePeriod = disputeManager.getDisputePeriod(); + assertEq(stakeClaim.tokens, tokensToLock); + assertEq(stakeClaim.createdAt, block.timestamp); + assertEq(stakeClaim.releasableAt, block.timestamp + disputePeriod); + assertEq(stakeClaim.nextClaim, bytes32(0)); + } + + function _verifyIndexingRewardsCollection( + address _indexer, + address allocationId, + IndexingRewardsData memory indexingRewardsData, + CollectPaymentData memory collectPaymentDataBefore, + CollectPaymentData memory collectPaymentDataAfter + ) private { + IAllocation.State memory allocation = subgraphService.getAllocation(allocationId); + + // Check allocation state + assertEq(allocation.accRewardsPending, 0); + uint256 accRewardsPerAllocatedToken = rewardsManager.onSubgraphAllocationUpdate( + allocation.subgraphDeploymentId + ); + assertEq(allocation.accRewardsPerAllocatedToken, accRewardsPerAllocatedToken); + assertEq(allocation.lastPOIPresentedAt, block.timestamp); + + // Check indexer got paid the correct amount + address paymentsDestination = subgraphService.paymentsDestination(_indexer); + if (paymentsDestination == address(0)) { + // If rewards destination is address zero indexer should get paid to their provision balance + assertEq( + collectPaymentDataAfter.indexerProvisionBalance, + collectPaymentDataBefore.indexerProvisionBalance + indexingRewardsData.tokensIndexerRewards + ); + } else { + // If rewards destination is set indexer should get paid to the rewards destination address + assertEq( + collectPaymentDataAfter.rewardsDestinationBalance, + collectPaymentDataBefore.rewardsDestinationBalance + indexingRewardsData.tokensIndexerRewards + ); + } + + // Check delegation pool got paid the correct amount + assertEq( + collectPaymentDataAfter.delegationPoolBalance, + collectPaymentDataBefore.delegationPoolBalance + indexingRewardsData.tokensDelegationRewards + ); + + // If after collecting indexing rewards the indexer is over allocated the allcation should close + uint256 tokensAvailable = staking.getTokensAvailable( + _indexer, + address(subgraphService), + subgraphService.getDelegationRatio() + ); + if (allocation.tokens <= tokensAvailable) { + // Indexer isn't over allocated so allocation should still be open + assertTrue(allocation.isOpen()); + } else { + // Indexer is over allocated so allocation should be closed + assertFalse(allocation.isOpen()); + } + } + + function _migrateLegacyAllocation(address _indexer, address _allocationId, bytes32 _subgraphDeploymentID) internal { + vm.expectEmit(address(subgraphService)); + emit AllocationManager.LegacyAllocationMigrated(_indexer, _allocationId, _subgraphDeploymentID); + + subgraphService.migrateLegacyAllocation(_indexer, _allocationId, _subgraphDeploymentID); + + ILegacyAllocation.State memory afterLegacyAllocation = subgraphService.getLegacyAllocation(_allocationId); + assertEq(afterLegacyAllocation.indexer, _indexer); + assertEq(afterLegacyAllocation.subgraphDeploymentId, _subgraphDeploymentID); + } + + /* + * HELPERS + */ + + function _createAndStartAllocation(address _indexer, uint256 _tokens) internal { + mint(_indexer, _tokens); + + resetPrank(_indexer); + token.approve(address(staking), _tokens); + staking.stakeTo(_indexer, _tokens); + staking.provision(_indexer, address(subgraphService), _tokens, fishermanRewardPercentage, disputePeriod); + _register(_indexer, abi.encode("url", "geoHash", address(0))); + + (address newIndexerAllocationId, uint256 newIndexerAllocationKey) = makeAddrAndKey("newIndexerAllocationId"); + bytes32 digest = subgraphService.encodeAllocationProof(_indexer, newIndexerAllocationId); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(newIndexerAllocationKey, digest); + + bytes memory data = abi.encode(subgraphDeployment, _tokens, newIndexerAllocationId, abi.encodePacked(r, s, v)); + _startService(_indexer, data); + } + + /* + * PRIVATE FUNCTIONS + */ + + function _recoverRAVSigner(IGraphTallyCollector.SignedRAV memory _signedRAV) private view returns (address) { + bytes32 messageHash = graphTallyCollector.encodeRAV(_signedRAV.rav); + return ECDSA.recover(messageHash, _signedRAV.signature); + } + + function _getClaimList(address _indexer) private view returns (ILinkedList.List memory) { + (bytes32 head, bytes32 tail, uint256 nonce, uint256 count) = subgraphService.claimsLists(_indexer); + return ILinkedList.List(head, tail, nonce, count); + } + + function _buildStakeClaimId(address _indexer, uint256 _nonce) private view returns (bytes32) { + return keccak256(abi.encodePacked(address(subgraphService), _indexer, _nonce)); + } + + function _getStakeClaim(bytes32 _claimId) private view returns (IDataServiceFees.StakeClaim memory) { + (uint256 tokens, uint256 createdAt, uint256 releasableAt, bytes32 nextClaim) = subgraphService.claims(_claimId); + return IDataServiceFees.StakeClaim(tokens, createdAt, releasableAt, nextClaim); + } + + // This doesn't matter for testing because the metadata is not decoded onchain but it's expected to be of the form: + // - uint256 blockNumber - the block number (indexed chain) the poi’s where computed at + // - bytes32 publicPOI - the public POI matching the presenting poi + // - uint8 indexingStatus - status (failed, syncing, etc). Mapping maintained by indexer agent. + // - uint8 errorCode - Again up to indexer agent, but seems sensible to use 0 if no error, and error codes for anything else. + // - uint256 errorBlockNumber - Block number (indexed chain) where the indexing error happens. 0 if no error. + function _getHardcodedPOIMetadata() internal view returns (bytes memory) { + return abi.encode(block.number, bytes32("PUBLIC_POI1"), uint8(0), uint8(0), uint256(0)); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/allocation/forceClose.t.sol b/packages/subgraph-service/test/unit/subgraphService/allocation/forceClose.t.sol new file mode 100644 index 000000000..6f75888f8 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/allocation/forceClose.t.sol @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; + +import { Allocation } from "../../../../contracts/libraries/Allocation.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceAllocationForceCloseTest is SubgraphServiceTest { + address private permissionlessBob = makeAddr("permissionlessBob"); + + /* + * TESTS + */ + + function test_SubgraphService_Allocation_ForceClose_Stale(uint256 tokens) public useIndexer useAllocation(tokens) { + // Skip forward + skip(maxPOIStaleness + 1); + + resetPrank(permissionlessBob); + _closeStaleAllocation(allocationID); + } + + function test_SubgraphService_Allocation_ForceClose_Stale_AfterCollecting( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + // Simulate POIs being submitted + uint8 numberOfPOIs = 5; + uint256 timeBetweenPOIs = 5 days; + + for (uint8 i = 0; i < numberOfPOIs; i++) { + // Skip forward + skip(timeBetweenPOIs); + + bytes memory data = abi.encode(allocationID, bytes32("POI1"), _getHardcodedPOIMetadata()); + _collect(users.indexer, IGraphPayments.PaymentTypes.IndexingRewards, data); + } + + // Skip forward so that the allocation is stale + skip(maxPOIStaleness + 1); + + // Close the stale allocation + resetPrank(permissionlessBob); + _closeStaleAllocation(allocationID); + } + + function test_SubgraphService_Allocation_ForceClose_RevertIf_NotStale( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + // Simulate POIs being submitted + uint8 numberOfPOIs = 20; + uint256 timeBetweenPOIs = (maxPOIStaleness - 1) / numberOfPOIs; + + for (uint8 i = 0; i < numberOfPOIs; i++) { + // Skip forward + skip(timeBetweenPOIs); + + resetPrank(users.indexer); + + bytes memory data = abi.encode(allocationID, bytes32("POI1"), _getHardcodedPOIMetadata()); + _collect(users.indexer, IGraphPayments.PaymentTypes.IndexingRewards, data); + + resetPrank(permissionlessBob); + vm.expectRevert( + abi.encodeWithSelector( + ISubgraphService.SubgraphServiceCannotForceCloseAllocation.selector, + allocationID + ) + ); + subgraphService.closeStaleAllocation(allocationID); + } + } + + function test_SubgraphService_Allocation_ForceClose_RevertIf_Altruistic(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = _createSubgraphAllocationData(users.indexer, subgraphDeployment, allocationIDPrivateKey, 0); + _startService(users.indexer, data); + + skip(maxPOIStaleness + 1); + + resetPrank(permissionlessBob); + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceAllocationIsAltruistic.selector, allocationID) + ); + subgraphService.closeStaleAllocation(allocationID); + } + + function test_SubgraphService_Allocation_ForceClose_RevertIf_Paused() public useIndexer useAllocation(1000 ether) { + resetPrank(users.pauseGuardian); + subgraphService.pause(); + + resetPrank(permissionlessBob); + vm.expectRevert(abi.encodeWithSelector(PausableUpgradeable.EnforcedPause.selector)); + subgraphService.closeStaleAllocation(allocationID); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/allocation/overDelegated.t.sol b/packages/subgraph-service/test/unit/subgraphService/allocation/overDelegated.t.sol new file mode 100644 index 000000000..263f031ec --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/allocation/overDelegated.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IHorizonStakingTypes } from "@graphprotocol/interfaces/contracts/horizon/internal/IHorizonStakingTypes.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; + +import { Allocation } from "../../../../contracts/libraries/Allocation.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceAllocationOverDelegatedTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Allocation_OverDelegated_NotOverAllocatedAfterUndelegation( + uint256 delegationTokens, + uint256 undelegationTokens + ) public useIndexer { + // Use minimum provision tokens + uint256 indexerTokens = minimumProvisionTokens; + uint256 allocationTokens = indexerTokens * delegationRatio; + // Bound delegation tokens to be over delegated + delegationTokens = bound(delegationTokens, allocationTokens, MAX_TOKENS); + // Assume undelegation tokens to still leave indexer over delegated + vm.assume(undelegationTokens > 1); + vm.assume(undelegationTokens < delegationTokens - allocationTokens); + + // Create provision + token.approve(address(staking), indexerTokens); + _createProvision(users.indexer, indexerTokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + // Delegate so that indexer is over allocated + resetPrank(users.delegator); + token.approve(address(staking), delegationTokens); + _delegate(users.indexer, address(subgraphService), delegationTokens, 0); + + // Create allocation + resetPrank(users.indexer); + bytes memory data = _createSubgraphAllocationData( + users.indexer, + subgraphDeployment, + allocationIDPrivateKey, + allocationTokens + ); + _startService(users.indexer, data); + + // Undelegate + resetPrank(users.delegator); + _undelegate(users.indexer, address(subgraphService), undelegationTokens); + + // Check that indexer is not over allocated + assertFalse(subgraphService.isOverAllocated(users.indexer)); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/allocation/resize.t.sol b/packages/subgraph-service/test/unit/subgraphService/allocation/resize.t.sol new file mode 100644 index 000000000..638356e2b --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/allocation/resize.t.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { Allocation } from "../../../../contracts/libraries/Allocation.sol"; +import { AllocationManager } from "../../../../contracts/utilities/AllocationManager.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +contract SubgraphServiceAllocationResizeTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Allocation_Resize( + uint256 tokens, + uint256 resizeTokens + ) public useIndexer useAllocation(tokens) { + resizeTokens = bound(resizeTokens, 1, MAX_TOKENS); + vm.assume(resizeTokens != tokens); + + mint(users.indexer, resizeTokens); + _addToProvision(users.indexer, resizeTokens); + _resizeAllocation(users.indexer, allocationID, resizeTokens); + } + + function test_SubgraphService_Allocation_Resize_AfterCollectingIndexingRewards( + uint256 tokens, + uint256 resizeTokens + ) public useIndexer useAllocation(tokens) { + resizeTokens = bound(resizeTokens, 1, MAX_TOKENS); + vm.assume(resizeTokens != tokens); + + mint(users.indexer, resizeTokens); + + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + bytes memory data = abi.encode(allocationID, bytes32("POI1"), _getHardcodedPOIMetadata()); + _collect(users.indexer, paymentType, data); + _addToProvision(users.indexer, resizeTokens); + _resizeAllocation(users.indexer, allocationID, resizeTokens); + } + + function test_SubgraphService_Allocation_Resize_SecondTime( + uint256 tokens, + uint256 firstResizeTokens, + uint256 secondResizeTokens + ) public useIndexer useAllocation(tokens) { + firstResizeTokens = bound(firstResizeTokens, 1, MAX_TOKENS); + secondResizeTokens = bound(secondResizeTokens, 1, MAX_TOKENS); + vm.assume(firstResizeTokens != tokens); + vm.assume(secondResizeTokens != firstResizeTokens); + + mint(users.indexer, firstResizeTokens); + _addToProvision(users.indexer, firstResizeTokens); + _resizeAllocation(users.indexer, allocationID, firstResizeTokens); + + mint(users.indexer, secondResizeTokens); + _addToProvision(users.indexer, secondResizeTokens); + _resizeAllocation(users.indexer, allocationID, secondResizeTokens); + } + + function test_SubgraphService_Allocation_Resize_RevertWhen_NotAuthorized( + uint256 tokens, + uint256 resizeTokens + ) public useIndexer useAllocation(tokens) { + resizeTokens = bound(resizeTokens, tokens + 1, MAX_TOKENS); + + address newIndexer = makeAddr("newIndexer"); + _createAndStartAllocation(newIndexer, tokens); + vm.expectRevert( + abi.encodeWithSelector( + ISubgraphService.SubgraphServiceAllocationNotAuthorized.selector, + newIndexer, + allocationID + ) + ); + subgraphService.resizeAllocation(newIndexer, allocationID, resizeTokens); + } + + function test_SubgraphService_Allocation_Resize_RevertWhen_SameSize( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + vm.expectRevert( + abi.encodeWithSelector(AllocationManager.AllocationManagerAllocationSameSize.selector, allocationID, tokens) + ); + subgraphService.resizeAllocation(users.indexer, allocationID, tokens); + } + + function test_SubgraphService_Allocation_Resize_RevertIf_AllocationIsClosed( + uint256 tokens, + uint256 resizeTokens + ) public useIndexer useAllocation(tokens) { + resizeTokens = bound(resizeTokens, tokens + 1, MAX_TOKENS); + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + vm.expectRevert( + abi.encodeWithSelector(AllocationManager.AllocationManagerAllocationClosed.selector, allocationID) + ); + subgraphService.resizeAllocation(users.indexer, allocationID, resizeTokens); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/allocation/start.t.sol b/packages/subgraph-service/test/unit/subgraphService/allocation/start.t.sol new file mode 100644 index 000000000..4a251f506 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/allocation/start.t.sol @@ -0,0 +1,215 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { ProvisionManager } from "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol"; +import { ProvisionTracker } from "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; +import { ILegacyAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/ILegacyAllocation.sol"; + +import { Allocation } from "../../../../contracts/libraries/Allocation.sol"; +import { AllocationManager } from "../../../../contracts/utilities/AllocationManager.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { LegacyAllocation } from "../../../../contracts/libraries/LegacyAllocation.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceAllocationStartTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Allocation_Start(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = _generateData(tokens); + _startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_AllowsZeroTokens(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = _generateData(0); + _startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_ByOperator(uint256 tokens) public useOperator { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = _generateData(tokens); + _startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_NotAuthorized(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + resetPrank(users.operator); + bytes memory data = _generateData(tokens); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerNotAuthorized.selector, + users.indexer, + users.operator + ) + ); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_NoValidProvision(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + bytes memory data = _generateData(tokens); + vm.expectRevert( + abi.encodeWithSelector(ProvisionManager.ProvisionManagerProvisionNotFound.selector, users.indexer) + ); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_NotRegistered(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + + bytes memory data = _generateData(tokens); + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceIndexerNotRegistered.selector, users.indexer) + ); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_ZeroAllocationId(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes32 digest = subgraphService.encodeAllocationProof(users.indexer, address(0)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(allocationIDPrivateKey, digest); + bytes memory data = abi.encode(subgraphDeployment, tokens, address(0), abi.encodePacked(r, s, v)); + vm.expectRevert(abi.encodeWithSelector(AllocationManager.AllocationManagerInvalidZeroAllocationId.selector)); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_InvalidSignature(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + (address signer, uint256 signerPrivateKey) = makeAddrAndKey("invalidSigner"); + bytes32 digest = subgraphService.encodeAllocationProof(users.indexer, allocationID); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, digest); + bytes memory data = abi.encode(subgraphDeployment, tokens, allocationID, abi.encodePacked(r, s, v)); + vm.expectRevert( + abi.encodeWithSelector( + AllocationManager.AllocationManagerInvalidAllocationProof.selector, + signer, + allocationID + ) + ); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_InvalidData(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = abi.encode(subgraphDeployment, tokens, allocationID, _generateRandomHexBytes(32)); + vm.expectRevert(abi.encodeWithSelector(ECDSA.ECDSAInvalidSignatureLength.selector, 32)); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_AlreadyExists_SubgraphService( + uint256 tokens + ) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = _generateData(tokens); + _startService(users.indexer, data); + + vm.expectRevert(abi.encodeWithSelector(IAllocation.AllocationAlreadyExists.selector, allocationID)); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_AlreadyExists_Migrated(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + resetPrank(users.governor); + _migrateLegacyAllocation(users.indexer, allocationID, subgraphDeployment); + + resetPrank(users.indexer); + bytes memory data = _generateData(tokens); + vm.expectRevert(abi.encodeWithSelector(ILegacyAllocation.LegacyAllocationAlreadyExists.selector, allocationID)); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_AlreadyExists_Staking(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + // create dummy allo in staking contract + _setStorage_allocation_hardcoded(users.indexer, allocationID, tokens); + + bytes memory data = _generateData(tokens); + vm.expectRevert(abi.encodeWithSelector(ILegacyAllocation.LegacyAllocationAlreadyExists.selector, allocationID)); + subgraphService.startService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Start_RevertWhen_NotEnoughTokens( + uint256 tokens, + uint256 lockTokens + ) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS - 1); + lockTokens = bound(lockTokens, tokens + 1, MAX_TOKENS); + + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + bytes memory data = _generateData(lockTokens); + vm.expectRevert( + abi.encodeWithSelector(ProvisionTracker.ProvisionTrackerInsufficientTokens.selector, tokens, lockTokens) + ); + subgraphService.startService(users.indexer, data); + } + + /* + * PRIVATE FUNCTIONS + */ + + function _generateData(uint256 tokens) private view returns (bytes memory) { + return _createSubgraphAllocationData(users.indexer, subgraphDeployment, allocationIDPrivateKey, tokens); + } + + function _generateRandomHexBytes(uint256 length) private view returns (bytes memory) { + bytes memory randomBytes = new bytes(length); + for (uint256 i = 0; i < length; i++) { + randomBytes[i] = bytes1( + uint8(uint256(keccak256(abi.encodePacked(block.timestamp, block.prevrandao, i))) % 256) + ); + } + return randomBytes; + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/allocation/stop.t.sol b/packages/subgraph-service/test/unit/subgraphService/allocation/stop.t.sol new file mode 100644 index 000000000..de215da04 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/allocation/stop.t.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; +import { ProvisionManager } from "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol"; +import { ProvisionTracker } from "@graphprotocol/horizon/contracts/data-service/libraries/ProvisionTracker.sol"; + +import { Allocation } from "../../../../contracts/libraries/Allocation.sol"; +import { AllocationManager } from "../../../../contracts/utilities/AllocationManager.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { IAllocation } from "@graphprotocol/interfaces/contracts/subgraph-service/internal/IAllocation.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceAllocationStopTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Allocation_Stop(uint256 tokens) public useIndexer useAllocation(tokens) { + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Stop_RevertWhen_IndexerIsNotTheAllocationOwner( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + // Setup new indexer + address newIndexer = makeAddr("newIndexer"); + _createAndStartAllocation(newIndexer, tokens); + + // Attempt to close other indexer's allocation + bytes memory data = abi.encode(allocationID); + vm.expectRevert( + abi.encodeWithSelector( + ISubgraphService.SubgraphServiceAllocationNotAuthorized.selector, + newIndexer, + allocationID + ) + ); + subgraphService.stopService(newIndexer, data); + } + + function test_SubgraphService_Allocation_Stop_RevertWhen_NotAuthorized( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + resetPrank(users.operator); + bytes memory data = abi.encode(allocationID); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerNotAuthorized.selector, + users.indexer, + users.operator + ) + ); + subgraphService.stopService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Stop_RevertWhen_NotRegistered() public useIndexer { + bytes memory data = abi.encode(allocationID); + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceIndexerNotRegistered.selector, users.indexer) + ); + subgraphService.stopService(users.indexer, data); + } + + function test_SubgraphService_Allocation_Stop_RevertWhen_NotOpen( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + bytes memory data = abi.encode(allocationID); + _stopService(users.indexer, data); + vm.expectRevert(abi.encodeWithSelector(IAllocation.AllocationClosed.selector, allocationID, block.timestamp)); + subgraphService.stopService(users.indexer, data); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/collect/collect.t.sol b/packages/subgraph-service/test/unit/subgraphService/collect/collect.t.sol new file mode 100644 index 000000000..8dd319c26 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/collect/collect.t.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceCollectTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Collect_RevertWhen_InvalidPayment( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + IGraphPayments.PaymentTypes invalidPaymentType = IGraphPayments.PaymentTypes.IndexingFee; + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceInvalidPaymentType.selector, invalidPaymentType) + ); + subgraphService.collect(users.indexer, invalidPaymentType, ""); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/collect/indexing/indexing.t.sol b/packages/subgraph-service/test/unit/subgraphService/collect/indexing/indexing.t.sol new file mode 100644 index 000000000..61224ff23 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/collect/indexing/indexing.t.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; + +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../../SubgraphService.t.sol"; +import { Allocation } from "../../../../../contracts/libraries/Allocation.sol"; +contract SubgraphServiceCollectIndexingTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Collect_Indexing(uint256 tokens) public useIndexer useAllocation(tokens) { + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + _collect(users.indexer, paymentType, data); + } + + function test_SubgraphService_Collect_Indexing_WithDelegation( + uint256 tokens, + uint256 delegationTokens, + uint256 delegationFeeCut + ) public useIndexer useAllocation(tokens) useDelegation(delegationTokens) { + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); + _setDelegationFeeCut( + users.indexer, + address(subgraphService), + IGraphPayments.PaymentTypes.IndexingRewards, + delegationFeeCut + ); + + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + _collect(users.indexer, paymentType, data); + } + + function test_SubgraphService_Collect_Indexing_AfterUndelegate( + uint256 tokens, + uint256 delegationTokens, + uint256 delegationFeeCut + ) public useIndexer useAllocation(tokens) useDelegation(delegationTokens) { + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); + _setDelegationFeeCut( + users.indexer, + address(subgraphService), + IGraphPayments.PaymentTypes.IndexingRewards, + delegationFeeCut + ); + // Undelegate + resetPrank(users.delegator); + staking.undelegate(users.indexer, address(subgraphService), delegationTokens); + + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + resetPrank(users.indexer); + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + _collect(users.indexer, paymentType, data); + } + + function test_SubgraphService_Collect_Indexing_RewardsDestination( + uint256 tokens + ) public useIndexer useAllocation(tokens) useRewardsDestination { + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + _collect(users.indexer, paymentType, data); + } + + function test_subgraphService_Collect_Indexing_MultipleOverTime( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + uint8 numberOfPOIs = 20; + uint256 timeBetweenPOIs = 5 days; + + for (uint8 i = 0; i < numberOfPOIs; i++) { + // Skip forward + skip(timeBetweenPOIs); + + resetPrank(users.indexer); + + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + _collect(users.indexer, IGraphPayments.PaymentTypes.IndexingRewards, data); + } + } + + function test_subgraphService_Collect_Indexing_MultipleOverTime_WithDelegation( + uint256 tokens, + uint256 delegationTokens, + uint256 delegationFeeCut + ) public useIndexer useAllocation(tokens) useDelegation(delegationTokens) { + delegationFeeCut = bound(delegationFeeCut, 0, MAX_PPM); + _setDelegationFeeCut( + users.indexer, + address(subgraphService), + IGraphPayments.PaymentTypes.IndexingRewards, + delegationFeeCut + ); + + uint8 numberOfPOIs = 20; + uint256 timeBetweenPOIs = 5 days; + for (uint8 i = 0; i < numberOfPOIs; i++) { + // Skip forward + skip(timeBetweenPOIs); + + resetPrank(users.indexer); + + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + _collect(users.indexer, IGraphPayments.PaymentTypes.IndexingRewards, data); + } + } + + function test_SubgraphService_Collect_Indexing_OverAllocated(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens * 2, 10_000_000_000 ether); + + // setup allocation + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + bytes memory data = _createSubgraphAllocationData( + users.indexer, + subgraphDeployment, + allocationIDPrivateKey, + tokens + ); + _startService(users.indexer, data); + + // thaw some tokens to become over allocated + staking.thaw(users.indexer, address(subgraphService), tokens / 2); + + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + // this collection should close the allocation + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + bytes memory collectData = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + _collect(users.indexer, paymentType, collectData); + } + + function test_SubgraphService_Collect_Indexing_RevertWhen_IndexerIsNotAllocationOwner( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.IndexingRewards; + // Setup new indexer + address newIndexer = makeAddr("newIndexer"); + _createAndStartAllocation(newIndexer, tokens); + bytes memory data = abi.encode(allocationID, bytes32("POI"), _getHardcodedPOIMetadata()); + + // skip time to ensure allocation gets rewards + vm.roll(block.number + EPOCH_LENGTH); + + // Attempt to collect from other indexer's allocation + vm.expectRevert( + abi.encodeWithSelector( + ISubgraphService.SubgraphServiceAllocationNotAuthorized.selector, + newIndexer, + allocationID + ) + ); + subgraphService.collect(newIndexer, paymentType, data); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/collect/query/query.t.sol b/packages/subgraph-service/test/unit/subgraphService/collect/query/query.t.sol new file mode 100644 index 000000000..a785c4e39 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/collect/query/query.t.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IGraphPayments } from "@graphprotocol/interfaces/contracts/horizon/IGraphPayments.sol"; +import { IGraphTallyCollector } from "@graphprotocol/interfaces/contracts/horizon/IGraphTallyCollector.sol"; +import { PPMMath } from "@graphprotocol/horizon/contracts/libraries/PPMMath.sol"; +import { ProvisionManager } from "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol"; +import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol"; + +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../../SubgraphService.t.sol"; + +contract SubgraphServiceRegisterTest is SubgraphServiceTest { + using PPMMath for uint128; + using PPMMath for uint256; + + address signer; + uint256 signerPrivateKey; + + /* + * HELPERS + */ + + function _getSignerProof(uint256 _proofDeadline, uint256 _signer) private returns (bytes memory) { + (, address msgSender, ) = vm.readCallers(); + bytes32 messageHash = keccak256( + abi.encodePacked( + block.chainid, + address(graphTallyCollector), + "authorizeSignerProof", + _proofDeadline, + msgSender + ) + ); + bytes32 proofToDigest = MessageHashUtils.toEthSignedMessageHash(messageHash); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_signer, proofToDigest); + return abi.encodePacked(r, s, v); + } + + function _getQueryFeeEncodedData( + address indexer, + uint128 tokens, + uint256 tokensToCollect + ) private view returns (bytes memory) { + IGraphTallyCollector.ReceiptAggregateVoucher memory rav = _getRAV( + indexer, + bytes32(uint256(uint160(allocationID))), + tokens + ); + bytes32 messageHash = graphTallyCollector.encodeRAV(rav); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, messageHash); + bytes memory signature = abi.encodePacked(r, s, v); + IGraphTallyCollector.SignedRAV memory signedRAV = IGraphTallyCollector.SignedRAV(rav, signature); + return abi.encode(signedRAV, tokensToCollect); + } + + function _getRAV( + address indexer, + bytes32 collectionId, + uint128 tokens + ) private view returns (IGraphTallyCollector.ReceiptAggregateVoucher memory rav) { + return + IGraphTallyCollector.ReceiptAggregateVoucher({ + collectionId: collectionId, + payer: users.gateway, + serviceProvider: indexer, + dataService: address(subgraphService), + timestampNs: 0, + valueAggregate: tokens, + metadata: "" + }); + } + + function _deposit(uint256 tokens) private { + token.approve(address(escrow), tokens); + escrow.deposit(address(graphTallyCollector), users.indexer, tokens); + } + + function _authorizeSigner() private { + uint256 proofDeadline = block.timestamp + 1; + bytes memory proof = _getSignerProof(proofDeadline, signerPrivateKey); + graphTallyCollector.authorizeSigner(signer, proofDeadline, proof); + } + + /* + * SET UP + */ + + function setUp() public virtual override { + super.setUp(); + (signer, signerPrivateKey) = makeAddrAndKey("signer"); + vm.label({ account: signer, newLabel: "signer" }); + } + + /* + * TESTS + */ + + function testCollect_QueryFees( + uint256 tokensAllocated, + uint256 tokensPayment + ) public useIndexer useAllocation(tokensAllocated) { + vm.assume(tokensAllocated > minimumProvisionTokens * stakeToFeesRatio); + uint256 maxTokensPayment = tokensAllocated / stakeToFeesRatio > type(uint128).max + ? type(uint128).max + : tokensAllocated / stakeToFeesRatio; + tokensPayment = bound(tokensPayment, minimumProvisionTokens, maxTokensPayment); + + resetPrank(users.gateway); + _deposit(tokensPayment); + _authorizeSigner(); + + resetPrank(users.indexer); + bytes memory data = _getQueryFeeEncodedData(users.indexer, uint128(tokensPayment), 0); + _collect(users.indexer, IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testCollect_QueryFees_WithRewardsDestination( + uint256 tokensAllocated, + uint256 tokensPayment + ) public useIndexer useAllocation(tokensAllocated) { + vm.assume(tokensAllocated > minimumProvisionTokens * stakeToFeesRatio); + uint256 maxTokensPayment = tokensAllocated / stakeToFeesRatio > type(uint128).max + ? type(uint128).max + : tokensAllocated / stakeToFeesRatio; + tokensPayment = bound(tokensPayment, minimumProvisionTokens, maxTokensPayment); + + resetPrank(users.gateway); + _deposit(tokensPayment); + _authorizeSigner(); + + resetPrank(users.indexer); + subgraphService.setPaymentsDestination(users.indexer); + bytes memory data = _getQueryFeeEncodedData(users.indexer, uint128(tokensPayment), 0); + _collect(users.indexer, IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testCollect_MultipleQueryFees( + uint256 tokensAllocated, + uint8 numPayments + ) public useIndexer useAllocation(tokensAllocated) { + vm.assume(tokensAllocated > minimumProvisionTokens * stakeToFeesRatio); + numPayments = uint8(bound(numPayments, 2, 10)); + uint256 tokensPayment = tokensAllocated / stakeToFeesRatio / numPayments; + + resetPrank(users.gateway); + _deposit(tokensAllocated); + _authorizeSigner(); + + resetPrank(users.indexer); + uint256 accTokensPayment = 0; + for (uint i = 0; i < numPayments; i++) { + accTokensPayment = accTokensPayment + tokensPayment; + bytes memory data = _getQueryFeeEncodedData(users.indexer, uint128(accTokensPayment), 0); + _collect(users.indexer, IGraphPayments.PaymentTypes.QueryFee, data); + } + } + + function testCollect_RevertWhen_NotAuthorized(uint256 tokens) public useIndexer useAllocation(tokens) { + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.QueryFee; + bytes memory data = _getQueryFeeEncodedData(users.indexer, uint128(tokens), 0); + resetPrank(users.operator); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerNotAuthorized.selector, + users.indexer, + users.operator + ) + ); + subgraphService.collect(users.indexer, paymentType, data); + } + + function testCollect_QueryFees_RevertWhen_IndexerIsNotAllocationOwner( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.QueryFee; + // Setup new indexer + address newIndexer = makeAddr("newIndexer"); + _createAndStartAllocation(newIndexer, tokens); + + // This data is for user.indexer allocationId + bytes memory data = _getQueryFeeEncodedData(newIndexer, uint128(tokens), 0); + + resetPrank(newIndexer); + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceInvalidRAV.selector, newIndexer, users.indexer) + ); + subgraphService.collect(newIndexer, paymentType, data); + } + + function testCollect_QueryFees_RevertWhen_CollectingOtherIndexersFees( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.QueryFee; + // Setup new indexer + address newIndexer = makeAddr("newIndexer"); + _createAndStartAllocation(newIndexer, tokens); + bytes memory data = _getQueryFeeEncodedData(users.indexer, uint128(tokens), 0); + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceIndexerMismatch.selector, users.indexer, newIndexer) + ); + subgraphService.collect(newIndexer, paymentType, data); + } + + function testCollect_QueryFees_RevertWhen_CollectionIdTooLarge() public useIndexer useAllocation(1000 ether) { + bytes32 collectionId = keccak256(abi.encodePacked("Large collection id, longer than 160 bits")); + IGraphTallyCollector.ReceiptAggregateVoucher memory rav = _getRAV(users.indexer, collectionId, 1000 ether); + bytes32 messageHash = graphTallyCollector.encodeRAV(rav); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPrivateKey, messageHash); + bytes memory signature = abi.encodePacked(r, s, v); + IGraphTallyCollector.SignedRAV memory signedRAV = IGraphTallyCollector.SignedRAV(rav, signature); + bytes memory data = abi.encode(signedRAV); + vm.expectRevert( + abi.encodeWithSelector(ISubgraphService.SubgraphServiceInvalidCollectionId.selector, collectionId) + ); + subgraphService.collect(users.indexer, IGraphPayments.PaymentTypes.QueryFee, data); + } + + function testCollect_QueryFees_PartialCollect( + uint256 tokensAllocated, + uint256 tokensPayment + ) public useIndexer useAllocation(tokensAllocated) { + vm.assume(tokensAllocated > minimumProvisionTokens * stakeToFeesRatio); + uint256 maxTokensPayment = tokensAllocated / stakeToFeesRatio > type(uint128).max + ? type(uint128).max + : tokensAllocated / stakeToFeesRatio; + tokensPayment = bound(tokensPayment, minimumProvisionTokens, maxTokensPayment); + + resetPrank(users.gateway); + _deposit(tokensPayment); + _authorizeSigner(); + + uint256 beforeGatewayBalance = escrow.getBalance(users.gateway, address(graphTallyCollector), users.indexer); + uint256 beforeTokensCollected = graphTallyCollector.tokensCollected( + address(subgraphService), + bytes32(uint256(uint160(allocationID))), + users.indexer, + users.gateway + ); + + // Collect the RAV in two steps + resetPrank(users.indexer); + uint256 tokensToCollect = tokensPayment / 2; + bool oddTokensPayment = tokensPayment % 2 == 1; + bytes memory data = _getQueryFeeEncodedData(users.indexer, uint128(tokensPayment), tokensToCollect); + _collect(users.indexer, IGraphPayments.PaymentTypes.QueryFee, data); + + uint256 intermediateGatewayBalance = escrow.getBalance( + users.gateway, + address(graphTallyCollector), + users.indexer + ); + assertEq(intermediateGatewayBalance, beforeGatewayBalance - tokensToCollect); + uint256 intermediateTokensCollected = graphTallyCollector.tokensCollected( + address(subgraphService), + bytes32(uint256(uint160(allocationID))), + users.indexer, + users.gateway + ); + assertEq(intermediateTokensCollected, beforeTokensCollected + tokensToCollect); + + bytes memory data2 = _getQueryFeeEncodedData( + users.indexer, + uint128(tokensPayment), + oddTokensPayment ? tokensToCollect + 1 : tokensToCollect + ); + _collect(users.indexer, IGraphPayments.PaymentTypes.QueryFee, data2); + + // Check the indexer received the correct amount of tokens + uint256 afterGatewayBalance = escrow.getBalance(users.gateway, address(graphTallyCollector), users.indexer); + assertEq(afterGatewayBalance, beforeGatewayBalance - tokensPayment); + uint256 afterTokensCollected = graphTallyCollector.tokensCollected( + address(subgraphService), + bytes32(uint256(uint160(allocationID))), + users.indexer, + users.gateway + ); + assertEq(afterTokensCollected, intermediateTokensCollected + tokensToCollect + (oddTokensPayment ? 1 : 0)); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/governance/legacy.t.sol b/packages/subgraph-service/test/unit/subgraphService/governance/legacy.t.sol new file mode 100644 index 000000000..d1b5dd124 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/governance/legacy.t.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceLegacyAllocation is SubgraphServiceTest { + /* + * TESTS + */ + + function test_MigrateAllocation() public useGovernor { + _migrateLegacyAllocation(users.indexer, allocationID, subgraphDeployment); + } + + function test_MigrateAllocation_WhenNotGovernor() public useIndexer { + vm.expectRevert(abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, users.indexer)); + subgraphService.migrateLegacyAllocation(users.indexer, allocationID, subgraphDeployment); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/governance/stakeToFeesRatio.t.sol b/packages/subgraph-service/test/unit/subgraphService/governance/stakeToFeesRatio.t.sol new file mode 100644 index 000000000..346b15347 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/governance/stakeToFeesRatio.t.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract DisputeManagerGovernanceArbitratorTest is SubgraphServiceTest { + /** + * ACTIONS + */ + + function _setStakeToFeesRatio(uint256 _stakeToFeesRatio) internal { + vm.expectEmit(address(subgraphService)); + emit ISubgraphService.StakeToFeesRatioSet(_stakeToFeesRatio); + subgraphService.setStakeToFeesRatio(_stakeToFeesRatio); + assertEq(subgraphService.stakeToFeesRatio(), _stakeToFeesRatio); + } + + /* + * TESTS + */ + + function test_Governance_SetStakeToFeesRatio(uint256 stakeToFeesRatio) public useGovernor { + vm.assume(stakeToFeesRatio > 0); + _setStakeToFeesRatio(stakeToFeesRatio); + } + + function test_Governance_RevertWhen_ZeroValue() public useGovernor { + uint256 stakeToFeesRatio = 0; + vm.expectRevert(abi.encodeWithSelector(ISubgraphService.SubgraphServiceInvalidZeroStakeToFeesRatio.selector)); + subgraphService.setStakeToFeesRatio(stakeToFeesRatio); + } + + function test_Governance_RevertWhen_NotGovernor() public useIndexer { + uint256 stakeToFeesRatio = 2; + vm.expectRevert(abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, users.indexer)); + subgraphService.setStakeToFeesRatio(stakeToFeesRatio); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/provider/register.t.sol b/packages/subgraph-service/test/unit/subgraphService/provider/register.t.sol new file mode 100644 index 000000000..90dd028f4 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/provider/register.t.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { ProvisionManager } from "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceProviderRegisterTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Provider_Register(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + bytes memory data = abi.encode("url", "geoHash", users.rewardsDestination); + _register(users.indexer, data); + } + + function test_SubgraphService_Provider_Register_MultipleTimes( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + bytes memory data = abi.encode("url", "geoHash", users.rewardsDestination); + _register(users.indexer, data); + + bytes memory data2 = abi.encode("url2", "geoHash2", users.rewardsDestination); + _register(users.indexer, data2); + + (string memory url, string memory geoHash) = subgraphService.indexers(users.indexer); + assertEq(url, "url2"); + assertEq(geoHash, "geoHash2"); + } + + function test_SubgraphService_Provider_Register_RevertWhen_InvalidProvision() public useIndexer { + vm.expectRevert( + abi.encodeWithSelector(ProvisionManager.ProvisionManagerProvisionNotFound.selector, users.indexer) + ); + bytes memory data = abi.encode("url", "geoHash", users.rewardsDestination); + subgraphService.register(users.indexer, data); + } + + function test_SubgraphService_Provider_Register_RevertWhen_NotAuthorized() public { + resetPrank(users.operator); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerNotAuthorized.selector, + users.indexer, + users.operator + ) + ); + bytes memory data = abi.encode("url", "geoHash", users.rewardsDestination); + subgraphService.register(users.indexer, data); + } + + function test_SubgraphService_Provider_Register_RevertWhen_InvalidProvisionValues( + uint256 tokens + ) public useIndexer { + tokens = bound(tokens, 1, minimumProvisionTokens - 1); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "tokens", + tokens, + minimumProvisionTokens, + maximumProvisionTokens + ) + ); + subgraphService.register(users.indexer, abi.encode("url", "geoHash", address(0))); + } + + function test_SubgraphService_Provider_Register_RevertIf_EmptyUrl(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + bytes memory data = abi.encode("", "geoHash", users.rewardsDestination); + vm.expectRevert(abi.encodeWithSelector(ISubgraphService.SubgraphServiceEmptyUrl.selector)); + subgraphService.register(users.indexer, data); + } + + function test_SubgraphService_Provider_Register_RevertIf_EmptyGeohash(uint256 tokens) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + bytes memory data = abi.encode("url", "", users.rewardsDestination); + vm.expectRevert(abi.encodeWithSelector(ISubgraphService.SubgraphServiceEmptyGeohash.selector)); + subgraphService.register(users.indexer, data); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/provider/rewardsDestination.t.sol b/packages/subgraph-service/test/unit/subgraphService/provider/rewardsDestination.t.sol new file mode 100644 index 000000000..d266739f0 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/provider/rewardsDestination.t.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; +import { ProvisionManager } from "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceProviderRewardsDestinationTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Provider_RewardsDestination_Set( + uint256 tokens + ) public useIndexer useAllocation(tokens) { + // Should be able to use new address + _setRewardsDestination(users.rewardsDestination); + + // Should be able to set back to address zero + _setRewardsDestination(address(0)); + } +} diff --git a/packages/subgraph-service/test/unit/subgraphService/provision/accept.t.sol b/packages/subgraph-service/test/unit/subgraphService/provision/accept.t.sol new file mode 100644 index 000000000..19110aaa5 --- /dev/null +++ b/packages/subgraph-service/test/unit/subgraphService/provision/accept.t.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +import { IDataService } from "@graphprotocol/interfaces/contracts/data-service/IDataService.sol"; +import { ProvisionManager } from "@graphprotocol/horizon/contracts/data-service/utilities/ProvisionManager.sol"; +import { ISubgraphService } from "@graphprotocol/interfaces/contracts/subgraph-service/ISubgraphService.sol"; +import { SubgraphServiceTest } from "../SubgraphService.t.sol"; + +contract SubgraphServiceProvisionAcceptTest is SubgraphServiceTest { + /* + * TESTS + */ + + function test_SubgraphService_Provision_Accept( + uint256 tokens, + uint32 newVerifierCut, + uint64 newDisputePeriod + ) public { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + vm.assume(newVerifierCut >= fishermanRewardPercentage); + vm.assume(newVerifierCut <= MAX_PPM); + newDisputePeriod = uint64(bound(newDisputePeriod, 1, MAX_WAIT_PERIOD)); + + // Set the dispute period to the new value + resetPrank(users.governor); + disputeManager.setDisputePeriod(newDisputePeriod); + + // Setup indexer + resetPrank(users.indexer); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, newDisputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + // Update parameters with new values + _setProvisionParameters(users.indexer, address(subgraphService), newVerifierCut, newDisputePeriod); + + // Accept provision and check parameters + _acceptProvision(users.indexer, ""); + } + + function test_SubgraphService_Provision_Accept_When_NotRegistered( + uint256 tokens, + uint32 newVerifierCut, + uint64 newDisputePeriod + ) public { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + vm.assume(newVerifierCut >= fishermanRewardPercentage); + vm.assume(newVerifierCut <= MAX_PPM); + newDisputePeriod = uint64(bound(newDisputePeriod, 1, MAX_WAIT_PERIOD)); + + // Set the dispute period to the new value + resetPrank(users.governor); + disputeManager.setDisputePeriod(newDisputePeriod); + + // Setup indexer but dont register + resetPrank(users.indexer); + _createProvision(users.indexer, tokens, fishermanRewardPercentage, newDisputePeriod); + + // Update parameters with new values + _setProvisionParameters(users.indexer, address(subgraphService), newVerifierCut, newDisputePeriod); + + // Accept provision and check parameters + _acceptProvision(users.indexer, ""); + } + + function test_SubgraphService_Provision_Accept_RevertWhen_NotAuthorized() public { + resetPrank(users.operator); + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerNotAuthorized.selector, + users.indexer, + users.operator + ) + ); + subgraphService.acceptProvisionPendingParameters(users.indexer, ""); + } + + function test_SubgraphService_Provision_Accept_RevertIf_InvalidVerifierCut( + uint256 tokens, + uint32 newVerifierCut + ) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + vm.assume(newVerifierCut < fishermanRewardPercentage); + + // Setup indexer + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + // Update parameters with new values + _setProvisionParameters(users.indexer, address(subgraphService), newVerifierCut, disputePeriod); + + // Should revert since newVerifierCut is invalid + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "maxVerifierCut", + newVerifierCut, + fishermanRewardPercentage, + MAX_PPM + ) + ); + subgraphService.acceptProvisionPendingParameters(users.indexer, ""); + } + + function test_SubgraphService_Provision_Accept_RevertIf_InvalidDisputePeriod( + uint256 tokens, + uint64 newDisputePeriod + ) public useIndexer { + tokens = bound(tokens, minimumProvisionTokens, MAX_TOKENS); + vm.assume(newDisputePeriod < disputePeriod); + + // Setup indexer + _createProvision(users.indexer, tokens, fishermanRewardPercentage, disputePeriod); + _register(users.indexer, abi.encode("url", "geoHash", address(0))); + + // Update parameters with new values + _setProvisionParameters(users.indexer, address(subgraphService), fishermanRewardPercentage, newDisputePeriod); + + // Should revert since newDisputePeriod is invalid + vm.expectRevert( + abi.encodeWithSelector( + ProvisionManager.ProvisionManagerInvalidValue.selector, + "thawingPeriod", + newDisputePeriod, + disputePeriod, + disputePeriod + ) + ); + subgraphService.acceptProvisionPendingParameters(users.indexer, ""); + } +} diff --git a/packages/subgraph-service/test/unit/utils/Constants.sol b/packages/subgraph-service/test/unit/utils/Constants.sol new file mode 100644 index 000000000..04d64437e --- /dev/null +++ b/packages/subgraph-service/test/unit/utils/Constants.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +abstract contract Constants { + uint256 internal constant MAX_TOKENS = 10_000_000_000 ether; + uint256 internal constant MAX_PPM = 1_000_000; + uint256 internal constant EPOCH_LENGTH = 1; + // Dispute Manager + uint64 internal constant disputePeriod = 7 days; + uint256 internal constant MIN_DISPUTE_DEPOSIT = 1 ether; // 1 GRT + uint256 internal constant disputeDeposit = 100 ether; // 100 GRT + uint32 internal constant fishermanRewardPercentage = 500000; // 50% + uint32 internal constant maxSlashingPercentage = 100000; // 10% + // Subgraph Service + uint256 internal constant minimumProvisionTokens = 1000 ether; + uint256 internal constant maximumProvisionTokens = type(uint256).max; + uint32 internal constant delegationRatio = 16; + uint256 public constant stakeToFeesRatio = 2; + uint256 public constant maxPOIStaleness = 28 days; + uint256 public constant curationCut = 10000; + // Staking + uint64 internal constant MAX_WAIT_PERIOD = 28 days; + uint256 internal constant MIN_DELEGATION = 1 ether; + // GraphEscrow parameters + uint256 internal constant withdrawEscrowThawingPeriod = 60; + // GraphPayments parameters + uint256 internal constant protocolPaymentCut = 10000; + // RewardsMananger parameters + uint256 public constant rewardsPerSignal = 10000; + uint256 public constant rewardsPerSubgraphAllocationUpdate = 1000; + // GraphTallyCollector parameters + uint256 public constant revokeSignerThawingPeriod = 7 days; +} diff --git a/packages/subgraph-service/test/unit/utils/Users.sol b/packages/subgraph-service/test/unit/utils/Users.sol new file mode 100644 index 000000000..e0c142fe1 --- /dev/null +++ b/packages/subgraph-service/test/unit/utils/Users.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +struct Users { + address governor; + address deployer; + address indexer; + address operator; + address gateway; + address verifier; + address delegator; + address arbitrator; + address fisherman; + address rewardsDestination; + address pauseGuardian; +} diff --git a/packages/subgraph-service/test/unit/utils/Utils.sol b/packages/subgraph-service/test/unit/utils/Utils.sol new file mode 100644 index 000000000..be42f269f --- /dev/null +++ b/packages/subgraph-service/test/unit/utils/Utils.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.27; + +import "forge-std/Test.sol"; + +abstract contract Utils is Test { + /// @dev Stops the active prank and sets a new one. + function resetPrank(address msgSender) internal { + vm.stopPrank(); + vm.startPrank(msgSender); + } +} diff --git a/packages/subgraph-service/tsconfig.json b/packages/subgraph-service/tsconfig.json new file mode 100644 index 000000000..24570e8ab --- /dev/null +++ b/packages/subgraph-service/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": [ + "hardhat.config.ts", + "types/**/*.ts", + "scripts/**/*.ts", + "tasks/**/*.ts", + "test/**/*.ts", + "ignition/**/*.ts", + "natspec-smells.config.js" + ] +} diff --git a/packages/token-distribution/hardhat.config.ts b/packages/token-distribution/hardhat.config.ts index 59146e5e7..64a99fd41 100644 --- a/packages/token-distribution/hardhat.config.ts +++ b/packages/token-distribution/hardhat.config.ts @@ -20,6 +20,7 @@ import './ops/delete' import './ops/info' import './ops/manager' import './ops/beneficiary' +import './ops/update-auth-functions-horizon' // Networks diff --git a/packages/token-distribution/ops/update-auth-functions-horizon.ts b/packages/token-distribution/ops/update-auth-functions-horizon.ts new file mode 100644 index 000000000..d25b70267 --- /dev/null +++ b/packages/token-distribution/ops/update-auth-functions-horizon.ts @@ -0,0 +1,252 @@ +import consola from 'consola' +import { task } from 'hardhat/config' +import { HardhatRuntimeEnvironment } from 'hardhat/types' + +import { askConfirm, getTokenLockManagerOrFail, prettyEnv, waitTransaction } from './create' +import { TxBuilder } from './tx-builder' + +const logger = consola.create({}) + +task('update-auth-functions-horizon', 'Update authorized functions for Horizon upgrade') + .addParam('horizonStakingAddress', 'Address of the HorizonStaking contract') + .addParam('subgraphServiceAddress', 'Address of the SubgraphService contract') + .addParam('managerName', 'Name of the token lock manager deployment', 'GraphTokenLockManager') + .addFlag('txBuilder', 'Output transaction batch in JSON format for Safe multisig') + .addOptionalParam('txBuilderTemplate', 'File to use as a template for the transaction builder') + .setAction(async (taskArgs, hre: HardhatRuntimeEnvironment) => { + const manager = await getTokenLockManagerOrFail(hre, taskArgs.managerName) + + logger.info('Updating authorized functions for Horizon upgrade...') + logger.log(`> GraphTokenLockManager: ${manager.address}`) + logger.log(`> HorizonStaking: ${taskArgs.horizonStakingAddress}`) + logger.log(`> SubgraphService: ${taskArgs.subgraphServiceAddress}`) + + logger.log(await prettyEnv(hre)) + + // Functions to ADD for HorizonStaking + const horizonStakingFunctionsToAdd = [ + 'provisionLocked(address,address,uint256,uint32,uint64)', + 'thaw(address,address,uint256)', + 'deprovision(address,address,uint256)', + 'setDelegationFeeCut(address,address,uint8,uint256)', + 'setOperatorLocked(address,address,bool)', + 'withdrawDelegated(address,address,uint256)', + ] + + // Functions to ADD for SubgraphService + const subgraphServiceFunctionsToAdd = ['setPaymentsDestination(address)'] + + // Functions to REMOVE for old Staking contract + const functionsToRemove = [ + 'setDelegationParameters(uint32,uint32,uint32)', + 'setOperator(address,bool)', + 'setRewardsDestination(address)', + ] + + logger.info('\n=== Functions to be ADDED ===') + logger.info('For HorizonStaking:') + horizonStakingFunctionsToAdd.forEach((sig) => logger.log(` + ${sig}`)) + logger.info('\nFor SubgraphService:') + subgraphServiceFunctionsToAdd.forEach((sig) => logger.log(` + ${sig}`)) + + logger.info('\n=== Functions to be REMOVED ===') + functionsToRemove.forEach((sig) => logger.log(` - ${sig}`)) + + // Check if not using tx-builder that deployer is the manager owner + if (!taskArgs.txBuilder) { + const tokenLockManagerOwner = await manager.owner() + const { deployer } = await hre.getNamedAccounts() + if (tokenLockManagerOwner !== deployer) { + logger.error('Only the owner can update authorized functions') + process.exit(1) + } + logger.success(`\nDeployer is the manager owner: ${deployer}`) + } + + // Confirm before proceeding + logger.info('\n=== Summary ===') + logger.info(`Functions to remove: ${functionsToRemove.length}`) + logger.info(`Functions to add for HorizonStaking: ${horizonStakingFunctionsToAdd.length}`) + logger.info(`Functions to add for SubgraphService: ${subgraphServiceFunctionsToAdd.length}`) + + if (!(await askConfirm())) { + logger.log('Cancelled') + process.exit(1) + } + + if (taskArgs.txBuilder) { + // Generate tx-builder JSON for Safe multisig + logger.info('\nCreating transaction builder JSON file for Safe multisig...') + const chainId = (await hre.ethers.provider.getNetwork()).chainId.toString() + const txBuilder = new TxBuilder(chainId, taskArgs.txBuilderTemplate) + + // Add transactions to remove old functions + logger.log('\nBuilding transactions to remove old functions...') + for (const signature of functionsToRemove) { + const tx = await manager.populateTransaction.unsetAuthFunctionCall(signature) + txBuilder.addTx({ + to: manager.address, + value: '0', + data: tx.data, + }) + logger.log(` - Remove: ${signature}`) + } + + // Add transactions to add HorizonStaking functions + logger.log('\nBuilding transactions to add HorizonStaking functions...') + const horizonTargets = Array(horizonStakingFunctionsToAdd.length).fill(taskArgs.horizonStakingAddress) + const tx1 = await manager.populateTransaction.setAuthFunctionCallMany( + horizonStakingFunctionsToAdd, + horizonTargets, + ) + txBuilder.addTx({ + to: manager.address, + value: '0', + data: tx1.data, + }) + logger.log(` + Added ${horizonStakingFunctionsToAdd.length} functions for HorizonStaking`) + + // Add transactions to add SubgraphService functions + logger.log('\nBuilding transactions to add SubgraphService functions...') + const subgraphTargets = Array(subgraphServiceFunctionsToAdd.length).fill(taskArgs.subgraphServiceAddress) + const tx2 = await manager.populateTransaction.setAuthFunctionCallMany( + subgraphServiceFunctionsToAdd, + subgraphTargets, + ) + txBuilder.addTx({ + to: manager.address, + value: '0', + data: tx2.data, + }) + logger.log(` + Added ${subgraphServiceFunctionsToAdd.length} functions for SubgraphService`) + + // Add token destinations if needed + logger.log('\nChecking and adding token destinations if needed...') + + // Check if HorizonStaking is already a token destination + const isHorizonStakingDestination = await manager.isTokenDestination(taskArgs.horizonStakingAddress) + if (!isHorizonStakingDestination) { + const tx3 = await manager.populateTransaction.addTokenDestination(taskArgs.horizonStakingAddress) + txBuilder.addTx({ + to: manager.address, + value: '0', + data: tx3.data, + }) + logger.log(` + Add HorizonStaking as token destination`) + } else { + logger.log(` ✓ HorizonStaking already added as token destination`) + } + + // Check if SubgraphService is already a token destination + const isSubgraphServiceDestination = await manager.isTokenDestination(taskArgs.subgraphServiceAddress) + if (!isSubgraphServiceDestination) { + const tx4 = await manager.populateTransaction.addTokenDestination(taskArgs.subgraphServiceAddress) + txBuilder.addTx({ + to: manager.address, + value: '0', + data: tx4.data, + }) + logger.log(` + Add SubgraphService as token destination`) + } else { + logger.log(` ✓ SubgraphService already added as token destination`) + } + + // Save result into json file + const outputFile = txBuilder.saveToFile() + logger.success(`\nTransaction batch saved to ${outputFile}`) + logger.info('\nUpload this file to your Safe multisig to execute the transactions.') + + // Summary + logger.info('\n=== SUMMARY ===') + logger.info(`Total transactions: ${txBuilder.contents.transactions.length}`) + logger.info(` - Remove functions: ${functionsToRemove.length}`) + logger.info(` - Add HorizonStaking functions: 1 batch (${horizonStakingFunctionsToAdd.length} functions)`) + logger.info(` - Add SubgraphService functions: 1 batch (${subgraphServiceFunctionsToAdd.length} functions)`) + const destinationsAdded = (!isHorizonStakingDestination ? 1 : 0) + (!isSubgraphServiceDestination ? 1 : 0) + logger.info(` - Add token destinations: ${destinationsAdded}`) + } else { + // Execute transactions + logger.info('\nExecuting transactions...') + + // Remove old functions + logger.info('\nRemoving old functions...') + for (const signature of functionsToRemove) { + try { + logger.log(` Removing: ${signature}`) + const tx = await manager.unsetAuthFunctionCall(signature) + await waitTransaction(tx) + logger.success(` ✓ Removed: ${signature}`) + } catch (error) { + logger.error(` ✗ Failed to remove ${signature}: ${error.message}`) + process.exit(1) + } + } + + // Add HorizonStaking functions + logger.info('\nAdding HorizonStaking functions...') + try { + const horizonTargets = Array(horizonStakingFunctionsToAdd.length).fill(taskArgs.horizonStakingAddress) + const tx = await manager.setAuthFunctionCallMany(horizonStakingFunctionsToAdd, horizonTargets) + await waitTransaction(tx) + logger.success(` ✓ Added ${horizonStakingFunctionsToAdd.length} functions for HorizonStaking`) + } catch (error) { + logger.error(` ✗ Failed to add HorizonStaking functions: ${error.message}`) + process.exit(1) + } + + // Add SubgraphService functions + logger.info('\nAdding SubgraphService functions...') + try { + const subgraphTargets = Array(subgraphServiceFunctionsToAdd.length).fill(taskArgs.subgraphServiceAddress) + const tx = await manager.setAuthFunctionCallMany(subgraphServiceFunctionsToAdd, subgraphTargets) + await waitTransaction(tx) + logger.success(` ✓ Added ${subgraphServiceFunctionsToAdd.length} functions for SubgraphService`) + } catch (error) { + logger.error(` ✗ Failed to add SubgraphService functions: ${error.message}`) + process.exit(1) + } + + // Add token destinations if needed + logger.info('\nChecking and adding token destinations if needed...') + + // Check if HorizonStaking is already a token destination + const isHorizonStakingDestination = await manager.isTokenDestination(taskArgs.horizonStakingAddress) + if (!isHorizonStakingDestination) { + try { + logger.log(` Adding HorizonStaking as token destination...`) + const tx = await manager.addTokenDestination(taskArgs.horizonStakingAddress) + await waitTransaction(tx) + logger.success(` ✓ Added HorizonStaking as token destination`) + } catch (error) { + logger.error(` ✗ Failed to add HorizonStaking as token destination: ${error.message}`) + process.exit(1) + } + } else { + logger.success(` ✓ HorizonStaking already a token destination`) + } + + // Check if SubgraphService is already a token destination + const isSubgraphServiceDestination = await manager.isTokenDestination(taskArgs.subgraphServiceAddress) + if (!isSubgraphServiceDestination) { + try { + logger.log(` Adding SubgraphService as token destination...`) + const tx = await manager.addTokenDestination(taskArgs.subgraphServiceAddress) + await waitTransaction(tx) + logger.success(` ✓ Added SubgraphService as token destination`) + } catch (error) { + logger.error(` ✗ Failed to add SubgraphService as token destination: ${error.message}`) + process.exit(1) + } + } else { + logger.success(` ✓ SubgraphService already a token destination`) + } + + // Summary + logger.info('\n=== COMPLETED SUCCESSFULLY ===') + logger.info(`Removed ${functionsToRemove.length} old functions`) + logger.info(`Added ${horizonStakingFunctionsToAdd.length} functions for HorizonStaking`) + logger.info(`Added ${subgraphServiceFunctionsToAdd.length} functions for SubgraphService`) + const destinationsAdded = (!isHorizonStakingDestination ? 1 : 0) + (!isSubgraphServiceDestination ? 1 : 0) + logger.info(`Added ${destinationsAdded} token destinations`) + } + }) diff --git a/packages/token-distribution/package.json b/packages/token-distribution/package.json index 28c891f75..a61e3ae8b 100644 --- a/packages/token-distribution/package.json +++ b/packages/token-distribution/package.json @@ -11,7 +11,7 @@ "build:self": "node scripts/build.js", "build:legacy": "scripts/build", "extract": "node scripts/extract-graphclient.js", - "clean": "rm -rf build/ cache/ dist/ .graphclient/", + "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", diff --git a/packages/token-distribution/scripts/build.js b/packages/token-distribution/scripts/build.js index bf19da698..dfcb282f6 100755 --- a/packages/token-distribution/scripts/build.js +++ b/packages/token-distribution/scripts/build.js @@ -29,6 +29,11 @@ const graphClientIndex = path.join(graphClientDir, 'index.js') const contractsDir = path.join(rootDir, 'contracts') const artifactsDir = path.join(rootDir, 'artifacts') +if (!process.env.STUDIO_API_KEY) { + console.log('Warning: STUDIO_API_KEY is not set. Skipping build steps. Some functionality may be limited.') + process.exit(0) +} + // Check if a file exists function fileExists(filePath) { try { diff --git a/packages/token-distribution/scripts/test b/packages/token-distribution/scripts/test index 865f4a371..066840a1e 100755 --- a/packages/token-distribution/scripts/test +++ b/packages/token-distribution/scripts/test @@ -5,6 +5,11 @@ set -eo pipefail MNEMONIC="myth like bonus scare over problem client lizard pioneer submit female collect" TESTRPC_PORT=8545 +if [ -z "${STUDIO_API_KEY}" ]; then + echo "Warning: STUDIO_API_KEY is not set. Skipping tests." + exit 0 +fi + ### Functions evm_running() { diff --git a/packages/toolshed/CHANGELOG.md b/packages/toolshed/CHANGELOG.md new file mode 100644 index 000000000..cbca76216 --- /dev/null +++ b/packages/toolshed/CHANGELOG.md @@ -0,0 +1,314 @@ +# @graphprotocol/toolshed + +## 0.6.13 + +### Patch Changes + +- Use bigint for RAV timestamp + +## 0.6.12 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.6.0 + +## 0.6.11 + +### Patch Changes + +- Fix address book path resolution in toolshed + +## 0.6.10 + +### Patch Changes + +- Fixing release bug where dependency uses workspace nomenclature + +## 0.6.9 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/address-book@0.2.0 + +## 0.6.8 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.5.0 + +## 0.6.7 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.4.0 + +## 0.6.6 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.3.0 + +## 0.6.5 + +### Patch Changes + +- Updated dependencies [fbe38f9] +- Updated dependencies + - @graphprotocol/interfaces@0.2.5 + +## 0.6.4 + +### Patch Changes + +- Ensure latest build is published to npm +- Updated dependencies + - @graphprotocol/interfaces@0.2.4 + +## 0.6.3 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.2.3 + +## 0.6.2 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.2.2 + +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.2.1 + +## 0.6.0 + +### Minor Changes + +- Extracted contract interfaces into its own package + +### Patch Changes + +- Updated dependencies + - @graphprotocol/interfaces@0.2.0 + +## 0.5.7 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.2.1 + - @graphprotocol/horizon@0.3.3 + - @graphprotocol/subgraph-service@0.3.5 + +## 0.5.6 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.2.0 + - @graphprotocol/horizon@0.3.3 + - @graphprotocol/subgraph-service@0.3.5 + +## 0.5.5 + +### Patch Changes + +- Properly address type issues + - @graphprotocol/horizon@0.3.3 + - @graphprotocol/subgraph-service@0.3.5 + +## 0.5.4 + +### Patch Changes + +- Fix type issue with GNS + - @graphprotocol/horizon@0.3.3 + - @graphprotocol/subgraph-service@0.3.5 + +## 0.5.3 + +### Patch Changes + +- Add encodeStopServiceData helper + - @graphprotocol/horizon@0.3.3 + - @graphprotocol/subgraph-service@0.3.5 + +## 0.5.1 + +### Patch Changes + +- Add GNS to deployments +- Updated dependencies + - @graphprotocol/subgraph-service@0.3.5 + - @graphprotocol/horizon@0.3.3 + +## 0.5.0 + +### Minor Changes + +- Ensure toolshed core components dont import hardhat runtime + +### Patch Changes + +- @graphprotocol/horizon@0.3.2 +- @graphprotocol/subgraph-service@0.3.4 + +## 0.4.2 + +### Patch Changes + +- Ensure all contracts are not wrapped when using connect shortcuts + - @graphprotocol/horizon@0.3.2 + - @graphprotocol/subgraph-service@0.3.4 + +## 0.4.1 + +### Patch Changes + +- Build before publishing + - @graphprotocol/horizon@0.3.2 + - @graphprotocol/subgraph-service@0.3.4 + +## 0.4.0 + +### Minor Changes + +- Make transaction logging optional, default to false for connect methods + +### Patch Changes + +- @graphprotocol/horizon@0.3.2 +- @graphprotocol/subgraph-service@0.3.4 + +## 0.3.2 + +### Patch Changes + +- Fix package exports + - @graphprotocol/horizon@0.3.2 + - @graphprotocol/subgraph-service@0.3.4 + +## 0.3.1 + +### Patch Changes + +- chore: fix package visibility +- Updated dependencies + - @graphprotocol/subgraph-service@0.3.4 + - @graphprotocol/contracts@7.1.2 + - @graphprotocol/horizon@0.3.2 + +## 0.3.0 + +### Minor Changes + +- Proper path resolution for contract artifacts + +### Patch Changes + +- @graphprotocol/horizon@0.3.1 +- @graphprotocol/subgraph-service@0.3.3 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/subgraph-service@0.3.3 + - @graphprotocol/horizon@0.3.1 + +## 0.2.5 + +### Patch Changes + +- Fix IServiceRegistry import in subgraph service toolshed deployment +- Updated dependencies + - @graphprotocol/subgraph-service@0.3.2 + - @graphprotocol/contracts@7.1.1 + - @graphprotocol/horizon@0.3.1 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/contracts@7.1.0 + - @graphprotocol/horizon@0.3.1 + - @graphprotocol/subgraph-service@0.3.1 + +## 0.2.3 + +### Patch Changes + +- Use proper types for Curation contract, add epochLength to EpochManager import in Horizon. +- Updated dependencies + - @graphprotocol/subgraph-service@0.3.1 + - @graphprotocol/horizon@0.3.1 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @graphprotocol/subgraph-service@0.3.0 + - @graphprotocol/horizon@0.3.0 + +## 0.2.1 + +### Patch Changes + +- Pin ethers version +- Updated dependencies + - @graphprotocol/subgraph-service@0.2.1 + - @graphprotocol/horizon@0.2.1 + +## 0.2.0 + +### Minor Changes + +- Add connectContracts utility functions to deployments + +### Patch Changes + +- @graphprotocol/horizon@0.2.0 +- @graphprotocol/subgraph-service@0.2.0 + +## 0.1.2 + +### Patch Changes + +- 585cf27: Allow loading empty address books for subgraph service +- Updated dependencies + - @graphprotocol/subgraph-service@0.2.0 + - @graphprotocol/horizon@0.2.0 + +## 0.1.1 + +### Patch Changes + +- Publish fork 1 deployment +- Updated dependencies + - @graphprotocol/subgraph-service@0.1.1 + - @graphprotocol/horizon@0.1.1 + +## 0.1.0 + +### Minor Changes + +- Publish initial dev versions + +### Patch Changes + +- Updated dependencies + - @graphprotocol/subgraph-service@0.1.0 + - @graphprotocol/horizon@0.1.0 diff --git a/packages/toolshed/README.md b/packages/toolshed/README.md new file mode 100644 index 000000000..86f64ed34 --- /dev/null +++ b/packages/toolshed/README.md @@ -0,0 +1,34 @@ +# @graphprotocol/toolshed + +A collection of tools and utilities for The Graph Protocol's TypeScript components. This package provides essential functionality for working with The Graph Protocol's smart contracts, deployments, and development tools. + +## Features + +- **Core**: Essential tools and functions for working with The Graph Protocol +- **Deployment Tools**: Utilities for interacting with protocol deployments +- **Hardhat Integration**: Tools and plugins for Hardhat development +- **Utility Functions**: Helper functions for common operations + +## Installation + +```bash +pnpm add @graphprotocol/toolshed +``` + +## Usage + +The package is organized into several modules that can be imported separately: + +```typescript +// Import core functionality +import { generateAllocationProof } from '@graphprotocol/toolshed' + +// Import deployment +import { loadGraphHorizon } from '@graphprotocol/toolshed/deployments/horizon' + +// Import Hardhat utilities +import { hardhatBaseConfig } from '@graphprotocol/toolshed/hardhat' + +// Import utility functions +import { printBanner } from '@graphprotocol/toolshed/utils' +``` diff --git a/packages/toolshed/package.json b/packages/toolshed/package.json new file mode 100644 index 000000000..e5051ab0b --- /dev/null +++ b/packages/toolshed/package.json @@ -0,0 +1,68 @@ +{ + "name": "@graphprotocol/toolshed", + "version": "0.6.13", + "publishConfig": { + "access": "public" + }, + "description": "A collection of tools and utilities for the Graph Protocol Typescript components", + "author": "Tomás Migone ", + "license": "MIT", + "main": "./dist/core/index.js", + "types": "./dist/core/index.d.ts", + "exports": { + ".": { + "types": "./dist/core/index.d.ts", + "default": "./dist/core/index.js" + }, + "./deployments": { + "types": "./dist/deployments/index.d.ts", + "default": "./dist/deployments/index.js" + }, + "./fixtures": { + "types": "./dist/fixtures/index.d.ts", + "default": "./dist/fixtures/index.js" + }, + "./hardhat": { + "types": "./src/hardhat/index.ts", + "default": "./src/hardhat/index.ts" + }, + "./utils": { + "types": "./dist/utils/index.d.ts", + "default": "./dist/utils/index.js" + } + }, + "scripts": { + "build": "tsc", + "watch": "tsc --watch", + "lint": "pnpm lint:ts; 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:json": "prettier -w --cache --log-level warn '**/*.json'", + "clean": "rm -rf dist", + "prepublishOnly": "pnpm run build" + }, + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "hardhat-plugin", + "graph", + "graph-protocol", + "horizon" + ], + "dependencies": { + "@graphprotocol/address-book": "workspace:^", + "@graphprotocol/interfaces": "workspace:^", + "@nomicfoundation/hardhat-ethers": "3.0.8", + "debug": "^4.4.0", + "ethers": "6.13.7", + "glob": "^11.0.1", + "hardhat": "^2.22.16", + "json5": "^2.2.3" + }, + "devDependencies": { + "@types/debug": "^4.1.12", + "@types/json5": "^2.2.0", + "eslint": "^8.56.0", + "typescript": "^5.0.0" + } +} diff --git a/packages/toolshed/prettier.config.cjs b/packages/toolshed/prettier.config.cjs new file mode 100644 index 000000000..4e8dcf4f3 --- /dev/null +++ b/packages/toolshed/prettier.config.cjs @@ -0,0 +1,5 @@ +const baseConfig = require('../../prettier.config.cjs') + +module.exports = { + ...baseConfig, +} diff --git a/packages/toolshed/src/core/accounts.ts b/packages/toolshed/src/core/accounts.ts new file mode 100644 index 000000000..ae2a70087 --- /dev/null +++ b/packages/toolshed/src/core/accounts.ts @@ -0,0 +1,90 @@ +import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' + +// The Graph convention for account derivation is: +// 0: Deployer +// 1: Governor +// 2: Arbitrator +// 3: Pause guardian +// 4: Subgraph Availability Oracle +// 5: Gateway/payer +// 6+: Test accounts + +enum GraphAccountIndex { + Deployer = 0, + Governor = 1, + Arbitrator = 2, + PauseGuardian = 3, + SubgraphAvailabilityOracle = 4, + Gateway = 5, +} + +export type GraphAccounts = { + deployer: HardhatEthersSigner + governor: HardhatEthersSigner + arbitrator: HardhatEthersSigner + pauseGuardian: HardhatEthersSigner + subgraphAvailabilityOracle: HardhatEthersSigner + gateway: HardhatEthersSigner + test: HardhatEthersSigner[] +} + +export async function getAccounts(provider: HardhatEthersProvider): Promise { + return { + deployer: await getDeployer(provider, GraphAccountIndex.Deployer), + governor: await getGovernor(provider, GraphAccountIndex.Governor), + arbitrator: await getArbitrator(provider, GraphAccountIndex.Arbitrator), + pauseGuardian: await getPauseGuardian(provider, GraphAccountIndex.PauseGuardian), + subgraphAvailabilityOracle: await getSubgraphAvailabilityOracle( + provider, + GraphAccountIndex.SubgraphAvailabilityOracle, + ), + gateway: await getGateway(provider, GraphAccountIndex.Gateway), + test: await getTestAccounts(provider), + } +} + +export async function getDeployer(provider: HardhatEthersProvider, accountIndex = GraphAccountIndex.Deployer) { + return _getAccount(provider, accountIndex) +} + +export async function getGovernor(provider: HardhatEthersProvider, accountIndex = GraphAccountIndex.Governor) { + return _getAccount(provider, accountIndex) +} + +export async function getArbitrator(provider: HardhatEthersProvider, accountIndex = GraphAccountIndex.Arbitrator) { + return _getAccount(provider, accountIndex) +} + +export async function getPauseGuardian( + provider: HardhatEthersProvider, + accountIndex = GraphAccountIndex.PauseGuardian, +) { + return _getAccount(provider, accountIndex) +} + +export async function getSubgraphAvailabilityOracle( + provider: HardhatEthersProvider, + accountIndex = GraphAccountIndex.SubgraphAvailabilityOracle, +) { + return _getAccount(provider, accountIndex) +} + +export async function getGateway(provider: HardhatEthersProvider, accountIndex = GraphAccountIndex.Gateway) { + return _getAccount(provider, accountIndex) +} + +export async function getTestAccounts(provider: HardhatEthersProvider) { + const accounts = (await provider.send('eth_accounts', [])) as string[] + const numReservedAccounts = Object.values(GraphAccountIndex).filter((v) => typeof v === 'number').length + if (accounts.length < numReservedAccounts) { + return [] + } + return await Promise.all( + accounts.slice(numReservedAccounts).map(async (account) => await _getAccount(provider, account)), + ) +} + +async function _getAccount(provider: HardhatEthersProvider, accountIndex: number | string) { + return await provider.getSigner(accountIndex) +} diff --git a/packages/toolshed/src/core/allocation.ts b/packages/toolshed/src/core/allocation.ts new file mode 100644 index 000000000..6bedfcfac --- /dev/null +++ b/packages/toolshed/src/core/allocation.ts @@ -0,0 +1,46 @@ +import { ethers, id } from 'ethers' + +import { randomHexBytes } from '../lib/bytes' + +// For legacy allocations in the staking contract +export async function generateLegacyAllocationProof(indexerAddress: string, allocationPrivateKey: string) { + const wallet = new ethers.Wallet(allocationPrivateKey) + const messageHash = ethers.solidityPackedKeccak256(['address', 'address'], [indexerAddress, wallet.address]) + const messageHashBytes = ethers.getBytes(messageHash) + return wallet.signMessage(messageHashBytes) +} + +export const EIP712_ALLOCATION_PROOF_TYPEHASH = id('AllocationIdProof(address indexer,address allocationId)') + +export const EIP712_ALLOCATION_ID_PROOF_TYPES = { + AllocationIdProof: [ + { name: 'indexer', type: 'address' }, + { name: 'allocationId', type: 'address' }, + ], +} + +// For new allocations in the subgraph service +export async function generateAllocationProof( + indexerAddress: string, + allocationPrivateKey: string, + subgraphServiceAddress: string, + chainId: number, +) { + const wallet = new ethers.Wallet(allocationPrivateKey) + + const domain = { + name: 'SubgraphService', + version: '1.0', + chainId: chainId, + verifyingContract: subgraphServiceAddress, + } + + return wallet.signTypedData(domain, EIP712_ALLOCATION_ID_PROOF_TYPES, { + indexer: indexerAddress, + allocationId: wallet.address, + }) +} + +export function randomAllocationMetadata() { + return randomHexBytes(32) +} diff --git a/packages/toolshed/src/core/attestations.ts b/packages/toolshed/src/core/attestations.ts new file mode 100644 index 000000000..b2d788ee2 --- /dev/null +++ b/packages/toolshed/src/core/attestations.ts @@ -0,0 +1,123 @@ +import { ethers, id, Wallet } from 'ethers' + +export const EIP712_DISPUTE_MANAGER_DOMAIN_SALT = ethers.getBytes( + '0xa070ffb1cd7409649bf77822cce74495468e06dbfaef09556838bf188679b9c2', +) + +export const EIP712_ATTESTATION_PROOF_TYPEHASH = id( + 'Receipt(bytes32 requestCID,bytes32 responseCID,bytes32 subgraphDeploymentID)', +) +export const EIP712_ATTESTATION_PROOF_TYPES = { + Receipt: [ + { name: 'requestCID', type: 'bytes32' }, + { name: 'responseCID', type: 'bytes32' }, + { name: 'subgraphDeploymentID', type: 'bytes32' }, + ], +} + +/** + * Creates an attestation data for a given request and response CIDs. + * @param requestCID The request CID. + * @param responseCID The response CID. + * @param signerPrivateKey The private key of the signer. + * @param subgraphDeploymentId The subgraph deployment ID. + * @param disputeManagerAddress The address of the dispute manager contract. + * @param chainId The chain ID. + * @returns The attestation data. + */ +export async function generateAttestationData( + requestCID: string, + responseCID: string, + subgraphDeploymentId: string, + signerPrivateKey: string, + disputeManagerAddress: string, + chainId: number, +): Promise { + // Create the domain for the EIP712 signature + const domain = { + name: 'Graph Protocol', + version: '0', + chainId: chainId, + verifyingContract: disputeManagerAddress, + salt: EIP712_DISPUTE_MANAGER_DOMAIN_SALT, + } + + // Create receipt struct + const receipt = { + requestCID: ethers.hexlify(ethers.getBytes(requestCID)), + responseCID: ethers.hexlify(ethers.getBytes(responseCID)), + subgraphDeploymentID: ethers.hexlify(ethers.getBytes(subgraphDeploymentId)), + } + + // Sign the receipt hash with the allocation private key + const signer = new Wallet(signerPrivateKey) + const signature = await signer.signTypedData(domain, EIP712_ATTESTATION_PROOF_TYPES, receipt) + const sig = ethers.Signature.from(signature) + + // Concatenate the bytes directly + return ethers.concat([ + ethers.getBytes(requestCID), + ethers.getBytes(responseCID), + ethers.getBytes(subgraphDeploymentId), + ethers.getBytes(sig.r), + ethers.getBytes(sig.s), + new Uint8Array([sig.v]), + ]) +} + +/** + * Verifies the signer of an attestation data. + * @param attestationData The attestation data to verify. + * @param expectedSigner The expected signer address. + * @param disputeManagerAddress The address of the dispute manager contract. + * @param chainId The chain ID. + * @returns True if the signer matches the expected signer, false otherwise. + */ +export function verifyAttestationSigner( + attestationData: string, + expectedSigner: string, + disputeManagerAddress: string, + chainId: number, +): boolean { + try { + // Extract components from attestation data + const data = ethers.getBytes(attestationData) + + // Each CID and deployment ID is 32 bytes + const requestCID = ethers.hexlify(data.slice(0, 32)) + const responseCID = ethers.hexlify(data.slice(32, 64)) + const subgraphDeploymentID = ethers.hexlify(data.slice(64, 96)) + + // Extract signature components + const r = ethers.hexlify(data.slice(96, 128)) + const s = ethers.hexlify(data.slice(128, 160)) + const v = data[160] + + // Create the domain for the EIP712 signature + const domain = { + name: 'Graph Protocol', + version: '0', + chainId: chainId, + verifyingContract: disputeManagerAddress, + salt: EIP712_DISPUTE_MANAGER_DOMAIN_SALT, + } + + // Create receipt struct + const receipt = { + requestCID, + responseCID, + subgraphDeploymentID, + } + + // Recover the signer address + const signature = ethers.Signature.from({ r, s, v }) + const recoveredAddress = ethers.verifyTypedData(domain, EIP712_ATTESTATION_PROOF_TYPES, receipt, signature) + console.log(`recoveredAddress: ${recoveredAddress}`) + + // Compare addresses (case-insensitive) + return recoveredAddress.toLowerCase() === expectedSigner.toLowerCase() + } catch (error) { + console.log(error) + return false + } +} diff --git a/packages/toolshed/src/core/constants.ts b/packages/toolshed/src/core/constants.ts new file mode 100644 index 000000000..7bfe2cf5f --- /dev/null +++ b/packages/toolshed/src/core/constants.ts @@ -0,0 +1,9 @@ +import { ethers } from 'ethers' + +export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +export const ONE_THOUSAND = ethers.parseEther('1000') +export const TEN_THOUSAND = ethers.parseEther('10000') +export const ONE_HUNDRED_THOUSAND = ethers.parseEther('100000') +export const ONE_MILLION = ethers.parseEther('1000000') +export const TEN_MILLION = ethers.parseEther('10000000') diff --git a/packages/toolshed/src/core/disputes.ts b/packages/toolshed/src/core/disputes.ts new file mode 100644 index 000000000..f7959d5cd --- /dev/null +++ b/packages/toolshed/src/core/disputes.ts @@ -0,0 +1,24 @@ +import { ethers } from 'ethers' + +// For disputes in the legacy dispute manager contract +export function generateLegacyIndexingDisputeId(allocationId: string) { + return ethers.solidityPackedKeccak256(['address'], [allocationId]) +} + +export function generateLegacyQueryDisputeId( + queryHash: string, + responseHash: string, + subgraphDeploymentId: string, + indexer: string, + fisherman: string, +) { + return ethers.solidityPackedKeccak256( + ['bytes32', 'bytes32', 'bytes32', 'address', 'address'], + [queryHash, responseHash, subgraphDeploymentId, indexer, fisherman], + ) +} + +// For legacy dispute type in dispute manager contract +export function generateLegacyTypeDisputeId(allocationId: string) { + return ethers.solidityPackedKeccak256(['address', 'string'], [allocationId, 'legacy']) +} diff --git a/packages/toolshed/src/core/graph-tally.ts b/packages/toolshed/src/core/graph-tally.ts new file mode 100644 index 000000000..65e264793 --- /dev/null +++ b/packages/toolshed/src/core/graph-tally.ts @@ -0,0 +1,117 @@ +import { BytesLike, ethers, Signature, Wallet } from 'ethers' + +import type { RAV } from './types' + +export const EIP712_DOMAIN_NAME = 'GraphTallyCollector' +export const EIP712_DOMAIN_VERSION = '1' +export const EIP712_RAV_TYPES = { + ReceiptAggregateVoucher: [ + { name: 'collectionId', type: 'bytes32' }, + { name: 'payer', type: 'address' }, + { name: 'serviceProvider', type: 'address' }, + { name: 'dataService', type: 'address' }, + { name: 'timestampNs', type: 'uint64' }, + { name: 'valueAggregate', type: 'uint128' }, + { name: 'metadata', type: 'bytes' }, + ], +} + +/** + * Generates a signed RAV + * @param allocationId The allocation ID + * @param payer The payer + * @param serviceProvider The service provider + * @param dataService The data service + * @param timestampNs The timestamp in nanoseconds + * @param valueAggregate The value aggregate + * @param metadata The metadata + * @param signerPrivateKey The private key of the signer + * @param graphTallyCollectorAddress The address of the Graph Tally Collector contract + * @param chainId The chain ID + * @returns The encoded signed RAV calldata + */ +export async function generateSignedRAV( + allocationId: string, + payer: string, + serviceProvider: string, + dataService: string, + timestampNs: bigint, + valueAggregate: bigint, + metadata: BytesLike, + signerPrivateKey: string, + graphTallyCollectorAddress: string, + chainId: number, +): Promise<{ rav: RAV; signature: string }> { + // Create the domain for the EIP712 signature + const domain = { + name: EIP712_DOMAIN_NAME, + version: EIP712_DOMAIN_VERSION, + chainId, + verifyingContract: graphTallyCollectorAddress, + } + + // Create the RAV data + const ravData = { + collectionId: ethers.zeroPadValue(allocationId, 32), + payer: payer, + serviceProvider: serviceProvider, + dataService: dataService, + timestampNs: timestampNs, + valueAggregate: valueAggregate, + metadata: metadata, + } + + // Sign the RAV data + const signer = new Wallet(signerPrivateKey) + const signature = await signer.signTypedData(domain, EIP712_RAV_TYPES, ravData) + + // Return the signed RAV + return { rav: ravData, signature: signature } +} + +export function recoverRAVSigner( + rav: RAV, + signature: string, + graphTallyCollectorAddress: string, + chainId: number, +): string { + const domain = { + name: EIP712_DOMAIN_NAME, + version: EIP712_DOMAIN_VERSION, + chainId, + verifyingContract: graphTallyCollectorAddress, + } + return ethers.verifyTypedData(domain, EIP712_RAV_TYPES, rav, signature) +} + +/** + * Generates a signer proof for authorizing a signer in the Graph Tally Collector + * @param graphTallyCollector The Graph Tally Collector contract + * @param signer The signer + * @param chainId The chain ID + * @param proofDeadline The deadline for the proof + * @param signerPrivateKey The private key of the signer + * @returns The encoded signer proof + */ +export function generateSignerProof( + proofDeadline: bigint, + payer: string, + signerPrivateKey: string, + graphTallyCollectorAddress: string, + chainId: number, +): string { + // Create the message hash + const messageHash = ethers.keccak256( + ethers.solidityPacked( + ['uint256', 'address', 'string', 'uint256', 'address'], + [chainId, graphTallyCollectorAddress, 'authorizeSignerProof', proofDeadline, payer], + ), + ) + + // Convert to EIP-191 signed message hash (this is the proofToDigest) + const proofToDigest = ethers.hashMessage(ethers.getBytes(messageHash)) + + // Sign the message + const signer = new Wallet(signerPrivateKey) + return Signature.from(signer.signingKey.sign(proofToDigest)).serialized +} diff --git a/packages/toolshed/src/core/index.ts b/packages/toolshed/src/core/index.ts new file mode 100644 index 000000000..d921cccc3 --- /dev/null +++ b/packages/toolshed/src/core/index.ts @@ -0,0 +1,9 @@ +export * from './accounts' +export * from './allocation' +export * from './attestations' +export * from './constants' +export * from './disputes' +export * from './graph-tally' +export * from './poi' +export * from './subgraph-service' +export * from './types' diff --git a/packages/toolshed/src/core/poi.ts b/packages/toolshed/src/core/poi.ts new file mode 100644 index 000000000..647ede6b9 --- /dev/null +++ b/packages/toolshed/src/core/poi.ts @@ -0,0 +1,18 @@ +import { BytesLike, ethers, keccak256, toUtf8Bytes } from 'ethers' + +export function generatePOI(message = 'poi') { + return ethers.getBytes(keccak256(toUtf8Bytes(message))) +} + +export function encodePOIMetadata( + blockNumber: number, + publicPOI: BytesLike, + indexingStatus: number, + errorCode: number, + errorBlockNumber: number, +) { + return ethers.AbiCoder.defaultAbiCoder().encode( + ['uint256', 'bytes32', 'uint8', 'uint8', 'uint256'], + [blockNumber, publicPOI, indexingStatus, errorCode, errorBlockNumber], + ) +} diff --git a/packages/toolshed/src/core/subgraph-service.ts b/packages/toolshed/src/core/subgraph-service.ts new file mode 100644 index 000000000..b4301900f --- /dev/null +++ b/packages/toolshed/src/core/subgraph-service.ts @@ -0,0 +1,37 @@ +import { BytesLike, ethers } from 'ethers' + +import { RAV } from './types' + +export function encodeRegistrationData(url: string, geoHash: string, rewardsDestination: string) { + return ethers.AbiCoder.defaultAbiCoder().encode(['string', 'string', 'address'], [url, geoHash, rewardsDestination]) +} + +export function encodeStartServiceData( + subgraphDeploymentId: string, + allocationTokens: bigint, + allocationId: string, + signature: string, +) { + return ethers.AbiCoder.defaultAbiCoder().encode( + ['bytes32', 'uint256', 'address', 'bytes'], + [subgraphDeploymentId, allocationTokens, allocationId, signature], + ) +} + +export function encodeCollectIndexingRewardsData(allocationId: string, poi: BytesLike, poiMetadata: BytesLike) { + return ethers.AbiCoder.defaultAbiCoder().encode(['address', 'bytes32', 'bytes'], [allocationId, poi, poiMetadata]) +} + +export function encodeCollectQueryFeesData(rav: RAV, signature: string, tokensToCollect: bigint) { + return ethers.AbiCoder.defaultAbiCoder().encode( + [ + 'tuple(tuple(bytes32 collectionId, address payer, address serviceProvider, address dataService, uint64 timestampNs, uint128 valueAggregate, bytes metadata) rav, bytes signature)', + 'uint256', + ], + [{ rav, signature }, tokensToCollect], + ) +} + +export function encodeStopServiceData(allocationId: string) { + return ethers.AbiCoder.defaultAbiCoder().encode(['address'], [allocationId]) +} diff --git a/packages/toolshed/src/core/types.ts b/packages/toolshed/src/core/types.ts new file mode 100644 index 000000000..357c593c5 --- /dev/null +++ b/packages/toolshed/src/core/types.ts @@ -0,0 +1,32 @@ +import type { BytesLike } from 'ethers' + +export enum PaymentTypes { + QueryFee = 0, + IndexingFee = 1, + IndexingRewards = 2, +} + +export enum ThawRequestType { + Provision = 0, + Delegation = 1, +} + +export type RAV = { + collectionId: string + payer: string + serviceProvider: string + dataService: string + timestampNs: bigint + valueAggregate: bigint + metadata: BytesLike +} + +export type Receipt = { + collection_id: string + payer: string + data_service: string + service_provider: string + timestamp_ns: bigint + nonce: bigint + value: bigint +} diff --git a/packages/toolshed/src/deployments/address-book.ts b/packages/toolshed/src/deployments/address-book.ts new file mode 100644 index 000000000..002ecbbcc --- /dev/null +++ b/packages/toolshed/src/deployments/address-book.ts @@ -0,0 +1,233 @@ +import { Provider, Signer } from 'ethers' +import fs from 'fs' + +import { assertObject } from '../lib/assert' +import { logDebug, logError, logWarn } from '../lib/logger' +import { ContractList, loadContract } from './contract' + +export type AddressBookJson = Record< + ChainId, + Record +> + +export type AddressBookEntry = { + address: string + proxy?: 'graph' | 'transparent' + proxyAdmin?: string + implementation?: string +} + +/** + * An abstract class to manage an address book + * The address book must be a JSON file with the following structure: + * { + * "": { + * "": { + * "address": "

", + * "proxy": "", // optional + * "proxyAdmin": "
", // optional + * "implementation": "
", // optional + * ... + * } + * } + * Uses generics to allow specifying a ContractName type to indicate which contracts should be loaded from the address book + * Implementation should provide: + * - `isContractName(name: string): name is ContractName`, a type predicate to check if a given string is a ContractName + * - `loadContracts(signerOrProvider?: Signer | Provider): ContractList` to load contracts from the address book + */ +export abstract class AddressBook { + // The path to the address book file + public file: string + + // The chain id of the network the address book should be loaded for + public chainId: ChainId + + // The raw contents of the address book file + public addressBook: AddressBookJson + + // Contracts in the address book of type ContractName + private validContracts: ContractName[] = [] + + // Contracts in the address book that are not of type ContractName, these are ignored + private invalidContracts: string[] = [] + + // Type predicate to check if a given string is a ContractName + abstract isContractName(name: string): name is ContractName + + // Method to load valid contracts from the address book + abstract loadContracts(signerOrProvider?: Signer | Provider): ContractList + + /** + * Constructor for the `AddressBook` class + * + * @param _file the path to the address book file + * @param _chainId the chain id of the network the address book should be loaded for + * @param _strictAssert + * + * @throws AssertionError if the target file is not a valid address book + * @throws Error if the target file does not exist + */ + constructor(_file: string, _chainId: ChainId, _strictAssert = false) { + this.file = _file + this.chainId = _chainId + + logDebug(`Loading address book from ${this.file}.`) + + // Create empty address book if file doesn't exist + if (!fs.existsSync(this.file)) { + const emptyAddressBook = { [this.chainId]: {} } + fs.writeFileSync(this.file, JSON.stringify(emptyAddressBook, null, 2)) + logDebug(`Created new address book at ${this.file}`) + } + + // Load address book and validate its shape + const fileContents = JSON.parse(fs.readFileSync(this.file, 'utf8')) as Record + if (typeof fileContents !== 'object' || fileContents === null) { + throw new Error('Address book is not an object') + } + if (!fileContents[this.chainId]) { + fileContents[this.chainId] = {} + } + this.assertAddressBookJson(fileContents) + this.addressBook = fileContents + this._parseAddressBook() + } + + /** + * List entry names in the address book + * + * @returns a list with all the names of the entries in the address book + */ + listEntries(): ContractName[] { + return this.validContracts + } + + entryExists(name: string): boolean { + if (!this.isContractName(name)) { + throw new Error(`Contract name ${name} is not a valid contract name`) + } + return this.addressBook[this.chainId][name] !== undefined + } + + /** + * Get an entry from the address book + * + * @param name the name of the contract to get + * @param strict if true it will throw an error if the contract is not found + * @returns the address book entry for the contract + * Returns an empty address book entry if the contract is not found + */ + getEntry(name: string): AddressBookEntry { + if (!this.isContractName(name)) { + throw new Error(`Contract name ${name} is not a valid contract name`) + } + const entry = this.addressBook[this.chainId][name] + this._assertAddressBookEntry(entry) + return entry + } + + /** + * Save an entry to the address book + * Allows partial address book entries to be saved + * @param name the name of the contract to save + * @param entry the address book entry for the contract + */ + setEntry(name: ContractName, entry: Partial): void { + if (entry.address === undefined) { + entry.address = '0x0000000000000000000000000000000000000000' + } + this._assertAddressBookEntry(entry) + this.addressBook[this.chainId][name] = entry + try { + fs.writeFileSync(this.file, JSON.stringify(this.addressBook, null, 2)) + } catch (e: unknown) { + if (e instanceof Error) logError(`Error saving entry: ${e.message}`) + else logError(`Error saving entry`) + } + } + + /** + * Parse address book and separate valid and invalid contracts + */ + _parseAddressBook() { + const contractList = this.addressBook[this.chainId] + + const contractNames = contractList ? Object.keys(contractList) : [] + for (const contract of contractNames) { + if (!this.isContractName(contract)) { + this.invalidContracts.push(contract) + } else { + this.validContracts.push(contract) + } + } + + if (this.invalidContracts.length > 0) { + logWarn( + `Detected invalid contracts in address book - these will not be loaded: ${this.invalidContracts.join(', ')}`, + ) + } + } + + /** + * Loads all valid contracts from an address book + * + * @param addressBook Address book to use + * @param signerOrProvider Signer or provider to use + * @param enableTxLogging Enable transaction logging to console and output file. Defaults to false. + * @returns the loaded contracts + */ + _loadContracts(signerOrProvider?: Signer | Provider, enableTxLogging?: boolean): ContractList { + const contracts = {} as ContractList + if (this.listEntries().length == 0) { + logError('No valid contracts found in address book') + return contracts + } + for (const contractName of this.listEntries()) { + logDebug(`Loading contract ${contractName}`) + + const contract = loadContract( + contractName, + this.getEntry(contractName).address, + signerOrProvider, + enableTxLogging, + ) + contracts[contractName] = contract + } + + return contracts + } + + // Asserts the provided object has the correct JSON format shape for an address book + // This method can be overridden by subclasses to provide custom validation + assertAddressBookJson(json: unknown): asserts json is AddressBookJson { + this._assertAddressBookJson(json) + } + + // Asserts the provided object is a valid address book + _assertAddressBookJson(json: unknown): asserts json is AddressBookJson { + assertObject(json, 'Assertion failed: address book is not an object') + + const contractList = json[this.chainId] + assertObject(contractList, 'Assertion failed: chain contract list is not an object') + + const contractNames = Object.keys(contractList) + for (const contractName of contractNames) { + this._assertAddressBookEntry(contractList[contractName]) + } + } + + // Asserts the provided object is a valid address book entry + _assertAddressBookEntry(entry: unknown): asserts entry is AddressBookEntry { + assertObject(entry) + if (!('address' in entry)) { + throw new Error('Address book entry must have an address field') + } + + const allowedFields = ['address', 'implementation', 'proxyAdmin', 'proxy'] + const entryFields = Object.keys(entry) + const invalidFields = entryFields.filter((field) => !allowedFields.includes(field)) + if (invalidFields.length > 0) { + throw new Error(`Address book entry contains invalid fields: ${invalidFields.join(', ')}`) + } + } +} diff --git a/packages/toolshed/src/deployments/contract.ts b/packages/toolshed/src/deployments/contract.ts new file mode 100644 index 000000000..0a72d9103 --- /dev/null +++ b/packages/toolshed/src/deployments/contract.ts @@ -0,0 +1,44 @@ +import { getInterface } from '@graphprotocol/interfaces' +import { Contract, Provider, Signer } from 'ethers' + +import { wrapTransactionCalls } from './tx-logging' + +export type ContractList = Partial> + +/** + * Loads a contract from an address book + * + * @param name Name of the contract + * @param address Contract address + * @param signerOrProvider Signer or provider to use + * @param enableTxLogging Enable transaction logging to console and output file. Defaults to false. + * @returns the loaded contract + * + * @throws Error if the contract could not be loaded + */ +export function loadContract( + name: ContractName, + address: string, + signerOrProvider?: Signer | Provider, + enableTxLogging?: boolean, +): Contract { + try { + let contract = new Contract(address, getInterface(name), signerOrProvider) + + if (signerOrProvider) { + contract = contract.connect(signerOrProvider) as Contract + } + + if (enableTxLogging) { + contract = wrapTransactionCalls(contract, name) + } + + return contract + } catch (err: unknown) { + if (err instanceof Error) { + throw new Error(`Could not load contract ${name} - ${err.message}`) + } else { + throw new Error(`Could not load contract ${name}`) + } + } +} diff --git a/packages/toolshed/src/deployments/horizon/actions.ts b/packages/toolshed/src/deployments/horizon/actions.ts new file mode 100644 index 000000000..8fc9bd4df --- /dev/null +++ b/packages/toolshed/src/deployments/horizon/actions.ts @@ -0,0 +1,199 @@ +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' + +import type { GraphHorizonContracts } from './contracts' + +/** + * It's important to use JSDoc in the return functions here for good developer experience as + * intellisense does not expand the args type aliases. + */ +export function loadActions(contracts: GraphHorizonContracts) { + return { + /** + * Stakes GRT tokens in the Horizon staking contract + * Note that it will approve HorizonStaking to spend the tokens + * + * @param signer - The signer that will execute the transactions + * @param args Parameters: + * - [tokens] - Amount of GRT tokens to stake + */ + stake: (signer: HardhatEthersSigner, args: Parameters) => + stake(contracts, signer, args), + /** + * Stakes GRT tokens in the Horizon staking contract to a service provider + * Note that it will approve HorizonStaking to spend the tokens + * + * @param signer - The signer that will execute the transactions + * @param args Parameters: + * - [serviceProvider, tokens] - The provision parameters + */ + stakeTo: (signer: HardhatEthersSigner, args: Parameters) => + stakeTo(contracts, signer, args), + /** + * Stakes GRT tokens in the Horizon staking contract to a provision + * Note that it will approve HorizonStaking to spend the tokens + * + * @param signer - The signer that will execute the transactions + * @param args Parameters: + * - [serviceProvider, verifier, tokens] - The provision parameters + */ + stakeToProvision: ( + signer: HardhatEthersSigner, + args: Parameters, + ) => stakeToProvision(contracts, signer, args), + /** + * Adds tokens to a provision + * Note that it will approve HorizonStaking to spend the tokens + * + * @param signer - The signer that will execute the transactions + * @param args Parameters: + * - [serviceProvider, verifier, tokens] - The provision parameters + */ + addToProvision: ( + signer: HardhatEthersSigner, + args: Parameters, + ) => addToProvision(contracts, signer, args), + /** + * Provisions tokens in the Horizon staking contract + * Note that it will approve HorizonStaking to spend the tokens and stake them + * + * @param signer - The signer that will execute the provision transaction + * @param args Parameters: + * - `[serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod]` - The provision parameters + */ + provision: (signer: HardhatEthersSigner, args: Parameters) => + provision(contracts, signer, args), + /** + * [Legacy] Collects query fees from the Horizon staking contract + * Note that it will approve HorizonStaking to spend the tokens + * @param signer - The signer that will execute the collect transaction + * @param args Parameters: + * - `[tokens, allocationID]` - The collect parameters + */ + collect: (signer: HardhatEthersSigner, args: Parameters) => + collect(contracts, signer, args), + /** + * Delegates tokens in the Horizon staking contract + * Note that it will approve HorizonStaking to spend the tokens + * @param signer - The signer that will execute the delegate transaction + * @param args Parameters: + * - `[serviceProvider, verifier, tokens, minSharesOut]` - The delegate parameters + */ + delegate: ( + signer: HardhatEthersSigner, + args: Parameters, + ) => delegate(contracts, signer, args), + /** + * Adds tokens to a delegation pool + * Note that it will approve HorizonStaking to spend the tokens + * @param signer - The signer that will execute the addToDelegationPool transaction + * @param args Parameters: + * - `[serviceProvider, verifier, tokens]` - The addToDelegationPool parameters + */ + addToDelegationPool: ( + signer: HardhatEthersSigner, + args: Parameters, + ) => addToDelegationPool(contracts, signer, args), + } +} + +async function stake( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [tokens] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).stake(tokens) +} + +async function stakeTo( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [serviceProvider, tokens] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).stakeTo(serviceProvider, tokens) +} + +async function stakeToProvision( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [serviceProvider, verifier, tokens] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).stakeToProvision(serviceProvider, verifier, tokens) +} + +async function addToProvision( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [serviceProvider, verifier, tokens] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).addToProvision(serviceProvider, verifier, tokens) +} + +async function provision( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).stake(tokens) + await HorizonStaking.connect(signer).provision(serviceProvider, verifier, tokens, maxVerifierCut, thawingPeriod) +} + +async function collect( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [tokens, allocationID] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).collect(tokens, allocationID) +} + +async function delegate( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [serviceProvider, verifier, tokens, minSharesOut] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer)['delegate(address,address,uint256,uint256)']( + serviceProvider, + verifier, + tokens, + minSharesOut, + ) +} + +async function addToDelegationPool( + contracts: GraphHorizonContracts, + signer: HardhatEthersSigner, + args: Parameters, +) { + const { GraphToken, HorizonStaking } = contracts + const [serviceProvider, verifier, tokens] = args + + await GraphToken.connect(signer).approve(HorizonStaking.target, tokens) + await HorizonStaking.connect(signer).addToDelegationPool(serviceProvider, verifier, tokens) +} diff --git a/packages/toolshed/src/deployments/horizon/address-book.ts b/packages/toolshed/src/deployments/horizon/address-book.ts new file mode 100644 index 000000000..fbf72aa98 --- /dev/null +++ b/packages/toolshed/src/deployments/horizon/address-book.ts @@ -0,0 +1,51 @@ +import type { LegacyStaking } from '@graphprotocol/interfaces' +import { getInterface } from '@graphprotocol/interfaces' +import { Provider, Signer } from 'ethers' +import { Contract } from 'ethers' + +import { assertObject } from '../../lib/assert' +import { logDebug, logError } from '../../lib/logger' +import { AddressBook } from '../address-book' +import { wrapTransactionCalls } from '../tx-logging' +import type { GraphHorizonContractName, GraphHorizonContracts } from './contracts' +import { GraphHorizonContractNameList } from './contracts' + +export class GraphHorizonAddressBook extends AddressBook { + isContractName(name: unknown): name is GraphHorizonContractName { + return typeof name === 'string' && GraphHorizonContractNameList.includes(name as GraphHorizonContractName) + } + + loadContracts(signerOrProvider?: Signer | Provider, enableTxLogging?: boolean): GraphHorizonContracts { + logDebug('Loading Graph Horizon contracts...') + + const contracts = this._loadContracts(signerOrProvider, enableTxLogging) + + this._assertGraphHorizonContracts(contracts) + + // Aliases + contracts.GraphToken = contracts.L2GraphToken + contracts.Curation = contracts.L2Curation + contracts.GNS = contracts.L2GNS + + if (contracts.HorizonStaking) { + // add LegacyStaking alias using old IL2Staking abi + const contract = new Contract(contracts.HorizonStaking.target, getInterface('IL2Staking'), signerOrProvider) + contracts.LegacyStaking = (enableTxLogging + ? wrapTransactionCalls(contract, 'LegacyStaking') + : contract) as unknown as LegacyStaking + } + + return contracts + } + + _assertGraphHorizonContracts(contracts: unknown): asserts contracts is GraphHorizonContracts { + assertObject(contracts) + + // Assert that all GraphHorizonContracts were loaded + for (const contractName of GraphHorizonContractNameList) { + if (!contracts[contractName]) { + logError(`Missing GraphHorizon contract: ${contractName}`) + } + } + } +} diff --git a/packages/toolshed/src/deployments/horizon/contracts.ts b/packages/toolshed/src/deployments/horizon/contracts.ts new file mode 100644 index 000000000..2f8655a40 --- /dev/null +++ b/packages/toolshed/src/deployments/horizon/contracts.ts @@ -0,0 +1,66 @@ +import type { + Controller, + EpochManager, + GraphPayments, + GraphProxyAdmin, + GraphTallyCollector, + HorizonStaking, + L2Curation, + L2GNS, + L2GraphToken, + LegacyStaking, + PaymentsEscrow, + RewardsManager, + SubgraphNFT, +} from '@graphprotocol/interfaces' + +import type { ContractList } from '../contract' + +export const GraphHorizonContractNameList = [ + // @graphprotocol/contracts + 'GraphProxyAdmin', + 'Controller', + 'EpochManager', + 'RewardsManager', + 'L2GraphToken', + 'L2GraphTokenGateway', + + // @graphprotocol/contracts - subgraph-service compatibility + 'L2Curation', + 'L2GNS', + 'SubgraphNFT', + + // @graphprotocol/horizon + 'HorizonStaking', + 'GraphPayments', + 'PaymentsEscrow', + 'GraphTallyCollector', +] as const + +export interface GraphHorizonContracts extends ContractList { + // @graphprotocol/contracts + EpochManager: EpochManager + RewardsManager: RewardsManager + GraphProxyAdmin: GraphProxyAdmin + Controller: Controller + L2GraphToken: L2GraphToken + + // @graphprotocol/contracts - subgraph-service compatibility + L2Curation: L2Curation + L2GNS: L2GNS + SubgraphNFT: SubgraphNFT + + // @graphprotocol/horizon + HorizonStaking: HorizonStaking + GraphPayments: GraphPayments + PaymentsEscrow: PaymentsEscrow + GraphTallyCollector: GraphTallyCollector + + // Aliases + GraphToken: L2GraphToken + Curation: L2Curation + GNS: L2GNS + LegacyStaking: LegacyStaking +} + +export type GraphHorizonContractName = (typeof GraphHorizonContractNameList)[number] diff --git a/packages/toolshed/src/deployments/horizon/index.ts b/packages/toolshed/src/deployments/horizon/index.ts new file mode 100644 index 000000000..57f70cf15 --- /dev/null +++ b/packages/toolshed/src/deployments/horizon/index.ts @@ -0,0 +1,28 @@ +import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { Provider, Signer } from 'ethers' + +import { resolveAddressBook } from '../../lib/resolve' +import { loadActions } from './actions' +import { GraphHorizonAddressBook } from './address-book' + +export { GraphHorizonAddressBook } from './address-book' +export type { GraphHorizonContractName, GraphHorizonContracts } from './contracts' + +export function loadGraphHorizon(addressBookPath: string, chainId: number, provider: HardhatEthersProvider) { + const addressBook = new GraphHorizonAddressBook(addressBookPath, chainId) + const contracts = addressBook.loadContracts(provider, false) + return { + addressBook: addressBook, + contracts: contracts, + actions: loadActions(contracts), + } +} + +export function connectGraphHorizon(chainId: number, signerOrProvider: Signer | Provider, addressBookPath?: string) { + addressBookPath = addressBookPath ?? resolveAddressBook(require, '@graphprotocol/address-book/horizon/addresses.json') + if (!addressBookPath) { + throw new Error('Address book path not found') + } + const addressBook = new GraphHorizonAddressBook(addressBookPath, chainId) + return addressBook.loadContracts(signerOrProvider, false) +} diff --git a/packages/toolshed/src/deployments/index.ts b/packages/toolshed/src/deployments/index.ts new file mode 100644 index 000000000..0a86f4442 --- /dev/null +++ b/packages/toolshed/src/deployments/index.ts @@ -0,0 +1,5 @@ +export { AddressBook, AddressBookEntry } from './address-book' +export * from './horizon' +export * from './subgraph-service' +export type { GraphDeploymentName, GraphDeployments } from './types' +export { GraphDeploymentsList } from './types' diff --git a/packages/toolshed/src/deployments/subgraph-service/actions.ts b/packages/toolshed/src/deployments/subgraph-service/actions.ts new file mode 100644 index 000000000..df1742773 --- /dev/null +++ b/packages/toolshed/src/deployments/subgraph-service/actions.ts @@ -0,0 +1,39 @@ +import type { SubgraphService } from '@graphprotocol/interfaces' +import type { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers' +import { Interface } from 'ethers' + +export function loadActions(contracts: { SubgraphService: SubgraphService }) { + return { + /** + * Collects the allocated funds for a subgraph deployment + * @param signer - The signer that will execute the collect transaction + * @param args Parameters: + * - `[indexer, paymentType, data]` - The collect parameters + * @returns The payment collected + */ + collect: (signer: HardhatEthersSigner, args: Parameters): Promise => + collect(contracts, signer, args), + } +} + +// Collects payment from the subgraph service +async function collect( + contracts: { SubgraphService: SubgraphService }, + signer: HardhatEthersSigner, + args: Parameters, +): Promise { + const { SubgraphService } = contracts + const [indexer, paymentType, data] = args + + const tx = await SubgraphService.connect(signer).collect(indexer, paymentType, data) + const receipt = await tx.wait() + if (!receipt) throw new Error('Transaction failed') + + const iface = new Interface([ + 'event ServicePaymentCollected(address indexed serviceProvider, uint8 indexed feeType, uint256 tokens)', + ]) + const event = receipt.logs.find((log) => log.topics[0] === iface.getEvent('ServicePaymentCollected')?.topicHash) + if (!event) throw new Error('ServicePaymentCollected event not found') + + return BigInt(event.data) +} diff --git a/packages/toolshed/src/deployments/subgraph-service/address-book.ts b/packages/toolshed/src/deployments/subgraph-service/address-book.ts new file mode 100644 index 000000000..39a467f5a --- /dev/null +++ b/packages/toolshed/src/deployments/subgraph-service/address-book.ts @@ -0,0 +1,38 @@ +import { Provider, Signer } from 'ethers' + +import { assertObject } from '../../lib/assert' +import { logDebug, logError } from '../../lib/logger' +import { AddressBook } from '../address-book' +import type { SubgraphServiceContractName, SubgraphServiceContracts } from './contracts' +import { SubgraphServiceContractNameList } from './contracts' + +export class SubgraphServiceAddressBook extends AddressBook { + isContractName(name: unknown): name is SubgraphServiceContractName { + return typeof name === 'string' && SubgraphServiceContractNameList.includes(name as SubgraphServiceContractName) + } + + loadContracts(signerOrProvider?: Signer | Provider, enableTxLogging?: boolean): SubgraphServiceContracts { + logDebug('Loading Subgraph Service contracts...') + + const contracts = this._loadContracts(signerOrProvider, enableTxLogging) + + this._assertSubgraphServiceContracts(contracts) + + // Aliases + contracts.Curation = contracts.L2Curation + contracts.GNS = contracts.L2GNS + + return contracts + } + + _assertSubgraphServiceContracts(contracts: unknown): asserts contracts is SubgraphServiceContracts { + assertObject(contracts) + + // Assert that all SubgraphServiceContracts were loaded + for (const contractName of SubgraphServiceContractNameList) { + if (!contracts[contractName]) { + logError(`Missing SubgraphService contract: ${contractName}`) + } + } + } +} diff --git a/packages/toolshed/src/deployments/subgraph-service/contracts.ts b/packages/toolshed/src/deployments/subgraph-service/contracts.ts new file mode 100644 index 000000000..bf25b48cb --- /dev/null +++ b/packages/toolshed/src/deployments/subgraph-service/contracts.ts @@ -0,0 +1,47 @@ +import type { + DisputeManager, + L2Curation, + L2GNS, + LegacyDisputeManager, + LegacyServiceRegistry, + SubgraphNFT, + SubgraphService, +} from '@graphprotocol/interfaces' + +import type { ContractList } from '../contract' + +export const SubgraphServiceContractNameList = [ + // @graphprotocol/contracts + 'L2Curation', + 'L2GNS', + 'SubgraphNFT', + + // @graphprotocol/subgraph-service + 'SubgraphService', + 'DisputeManager', + + // @graphprotocol/contracts - legacy + 'LegacyDisputeManager', + 'LegacyServiceRegistry', +] as const + +export interface SubgraphServiceContracts extends ContractList { + // @graphprotocol/contracts + L2Curation: L2Curation + L2GNS: L2GNS + SubgraphNFT: SubgraphNFT + + // @graphprotocol/subgraph-service + SubgraphService: SubgraphService + DisputeManager: DisputeManager + + // @graphprotocol/contracts - legacy + LegacyDisputeManager: LegacyDisputeManager + LegacyServiceRegistry: LegacyServiceRegistry + + // Aliases + Curation: L2Curation + GNS: L2GNS +} + +export type SubgraphServiceContractName = (typeof SubgraphServiceContractNameList)[number] diff --git a/packages/toolshed/src/deployments/subgraph-service/index.ts b/packages/toolshed/src/deployments/subgraph-service/index.ts new file mode 100644 index 000000000..c24fbe804 --- /dev/null +++ b/packages/toolshed/src/deployments/subgraph-service/index.ts @@ -0,0 +1,29 @@ +import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { Provider, Signer } from 'ethers' + +import { resolveAddressBook } from '../../lib/resolve' +import { loadActions } from './actions' +import { SubgraphServiceAddressBook } from './address-book' + +export { SubgraphServiceAddressBook } +export type { SubgraphServiceContractName, SubgraphServiceContracts } from './contracts' + +export function loadSubgraphService(addressBookPath: string, chainId: number, provider: HardhatEthersProvider) { + const addressBook = new SubgraphServiceAddressBook(addressBookPath, chainId) + const contracts = addressBook.loadContracts(provider, true) + return { + addressBook: addressBook, + contracts: contracts, + actions: loadActions(contracts), + } +} + +export function connectSubgraphService(chainId: number, signerOrProvider: Signer | Provider, addressBookPath?: string) { + addressBookPath = + addressBookPath ?? resolveAddressBook(require, '@graphprotocol/address-book/subgraph-service/addresses.json') + if (!addressBookPath) { + throw new Error('Address book path not found') + } + const addressBook = new SubgraphServiceAddressBook(addressBookPath, chainId) + return addressBook.loadContracts(signerOrProvider, false) +} diff --git a/packages/toolshed/src/deployments/tx-logging.ts b/packages/toolshed/src/deployments/tx-logging.ts new file mode 100644 index 000000000..d5cdf5d62 --- /dev/null +++ b/packages/toolshed/src/deployments/tx-logging.ts @@ -0,0 +1,108 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { + Contract, + ContractMethod, + ContractMethodArgs, + ContractRunner, + ContractTransactionReceipt, + ContractTransactionResponse, +} from 'ethers' +import fs from 'fs' + +import { logTxLogging } from '../lib/logger' + +/** + * Wraps contract calls with a modified call function that logs the tx details + * Also intercepts connect calls and wraps the returned contract with this function + * + * @remarks + * The overriden functions will: + * 1. Make the contract call + * 2. Wait for tx confirmation + * 3. Log the tx details and the receipt details, both to the console and to a file + * + * @param contract Contract to be wrapped + * @param contractName Name of the contract + * @returns the wrapped contract + */ +export function wrapTransactionCalls(contract: T, contractName: string): T { + return new Proxy(contract, { + get(target, prop) { + const orig = Reflect.get(target, prop) + + // Intercept connect calls + if (prop === 'connect') { + return (runner: ContractRunner) => { + const connected = orig.call(target, runner) as unknown as Contract + return wrapTransactionCalls(connected, contractName) + } + } + + // Only intercept function calls + if (typeof orig !== 'function') { + return orig + } + + // Only intercept function calls from the ABI + let fn: ContractMethod | undefined + try { + fn = contract.getFunction(String(prop)) + } catch (_) { + return orig + } + + // Only intercept state changing calls - aka transactions + const fragment = fn.fragment + if (['view', 'pure'].includes(fragment.stateMutability)) { + return orig + } + + // Finally, this is a transaction call so intercept it :D + return async (...args: unknown[]) => { + // Make the call + const response = (await orig.apply(target, args)) as ContractTransactionResponse + logContractTransaction(response, contractName, String(prop), args) + + // And wait for confirmation + const receipt = await response.wait() + if (receipt) { + logContractTransactionReceipt(receipt) + } + + return response + } + }, + }) +} + +function logContractTransaction( + tx: ContractTransactionResponse, + contractName: string, + fn: string, + args: ContractMethodArgs, +) { + const msg: string[] = [] + msg.push(`> Sending transaction: ${contractName}.${fn}`) + msg.push(` = Sender: ${tx.from}`) + msg.push(` = Contract: ${tx.to}`) + msg.push(` = Params: [ ${args.join(', ')} ]`) + msg.push(` = TxHash: ${tx.hash}`) + + logToConsoleAndFile(msg) +} + +function logContractTransactionReceipt(receipt: ContractTransactionReceipt) { + const msg: string[] = [] + msg.push(receipt.status ? ` ✔ Transaction succeeded!` : ` ✖ Transaction failed!`) + logToConsoleAndFile(msg) +} + +function logToConsoleAndFile(msg: string[]) { + const isoDate = new Date().toISOString() + const fileName = `tx-${isoDate.substring(0, 10)}.log` + + msg.map((line) => { + logTxLogging(line) + fs.appendFileSync(fileName, `[${isoDate}] ${line}\n`) + }) +} diff --git a/packages/toolshed/src/deployments/types.ts b/packages/toolshed/src/deployments/types.ts new file mode 100644 index 000000000..1328430a3 --- /dev/null +++ b/packages/toolshed/src/deployments/types.ts @@ -0,0 +1,20 @@ +import type { GraphHorizonAddressBook, GraphHorizonContracts } from './horizon' +import type { loadActions } from './horizon/actions' +import type { SubgraphServiceAddressBook, SubgraphServiceContracts } from './subgraph-service' +import type { loadActions as loadSubgraphServiceActions } from './subgraph-service/actions' +export const GraphDeploymentsList = ['horizon', 'subgraphService'] as const + +export type GraphDeploymentName = (typeof GraphDeploymentsList)[number] + +export type GraphDeployments = { + horizon: { + contracts: GraphHorizonContracts + addressBook: GraphHorizonAddressBook + actions: ReturnType + } + subgraphService: { + contracts: SubgraphServiceContracts + addressBook: SubgraphServiceAddressBook + actions: ReturnType + } +} diff --git a/packages/toolshed/src/fixtures/delegators.ts b/packages/toolshed/src/fixtures/delegators.ts new file mode 100644 index 000000000..4d8de7dc7 --- /dev/null +++ b/packages/toolshed/src/fixtures/delegators.ts @@ -0,0 +1,59 @@ +import { parseEther } from 'ethers' + +import { indexers } from './indexers' + +export interface Delegator { + address: string + delegations: { + indexerAddress: string + tokens: bigint + }[] + undelegate: boolean // Whether this delegator should undelegate at the end +} + +export const delegators: Delegator[] = [ + { + address: '0x610Bb1573d1046FCb8A70Bbbd395754cD57C2b60', // Hardhat account #10 + delegations: [ + { + indexerAddress: indexers[0].address, + tokens: parseEther('50000'), + }, + { + indexerAddress: indexers[1].address, + tokens: parseEther('25000'), + }, + ], + undelegate: false, + }, + { + address: '0x855FA758c77D68a04990E992aA4dcdeF899F654A', // Hardhat account #11 + delegations: [ + { + indexerAddress: indexers[1].address, + tokens: parseEther('75000'), + }, + ], + undelegate: false, + }, + { + address: '0xfA2435Eacf10Ca62ae6787ba2fB044f8733Ee843', // Hardhat account #12 + delegations: [ + { + indexerAddress: indexers[0].address, + tokens: parseEther('100000'), + }, + ], + undelegate: true, // This delegator will undelegate + }, + { + address: '0x64E078A8Aa15A41B85890265648e965De686bAE6', // Hardhat account #13 + delegations: [], + undelegate: false, + }, + { + address: '0x2F560290FEF1B3Ada194b6aA9c40aa71f8e95598', // Hardhat account #14 + delegations: [], + undelegate: false, + }, +] diff --git a/packages/toolshed/src/fixtures/index.ts b/packages/toolshed/src/fixtures/index.ts new file mode 100644 index 000000000..2367e809f --- /dev/null +++ b/packages/toolshed/src/fixtures/index.ts @@ -0,0 +1,3 @@ +export * from './delegators' +export * from './indexers' +export * from './indexers-subgraph-service' diff --git a/packages/toolshed/src/fixtures/indexers-subgraph-service.ts b/packages/toolshed/src/fixtures/indexers-subgraph-service.ts new file mode 100644 index 000000000..8cce1a867 --- /dev/null +++ b/packages/toolshed/src/fixtures/indexers-subgraph-service.ts @@ -0,0 +1,112 @@ +import { parseEther } from 'ethers' + +import { indexers as horizonIndexers } from './indexers' + +// Allocation interface +export interface AllocationData { + allocationID: string + subgraphDeploymentID: string + allocationPrivateKey: string + tokens: bigint +} + +// Indexer interface +export interface IndexerData { + address: string + indexingRewardCut: number + queryFeeCut: number + url: string + geoHash: string + rewardsDestination?: string + provisionTokens: bigint + legacyAllocations: AllocationData[] + allocations: AllocationData[] +} + +// Subgraph deployment IDs +const SUBGRAPH_DEPLOYMENT_ID_ONE = '0x02cd85012c1f075fd58fad178fd23ab841d3b5ddcf5cd3377c30118da97cb2a4' +const SUBGRAPH_DEPLOYMENT_ID_TWO = '0x03ca89485a59894f1acfa34660c69024b6b90ce45171dece7662b0886bc375c7' +const SUBGRAPH_DEPLOYMENT_ID_THREE = '0x0472e8c46f728adb65a22187c6740532f82c2ebadaeabbbe59a2bb4a1bdde197' + +// Indexer one allocations +const INDEXER_ONE_FIRST_ALLOCATION_ID = '0x097DC23d51A7800f9B1EA37919A5b223C0224eC2' +const INDEXER_ONE_FIRST_ALLOCATION_PRIVATE_KEY = '0xec5739112bc20845cdd80b2612dfb0a75599ea6fbdd8916a1e7d5be98118c315' +const INDEXER_ONE_SECOND_ALLOCATION_ID = '0x897E7056FB86372CB676EBAE73a360c22b21D4aD' +const INDEXER_ONE_SECOND_ALLOCATION_PRIVATE_KEY = '0x298519bdc6a73f0d64c96e1f7c39aba3f825886a37e0349294ce7c407bd88370' +const INDEXER_ONE_THIRD_ALLOCATION_ID = '0x02C64e54100b3Cb324ac50d9b3823402e6aA5297' +const INDEXER_ONE_THIRD_ALLOCATION_PRIVATE_KEY = '0xb8ca0ab93098c2c478c5657da7a7bb89522bb1e3198f8b469de252dfee5469a3' + +// Indexer two allocations +const INDEXER_TWO_FIRST_ALLOCATION_ID = '0xB609bBf1D5Ae3C246dA1F9a5EA327DBa66BbcB05' +const INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY = '0x21dce628700b82e2d9045d756e4d0ba736f652a170655398a15fadae10b0e846' +const INDEXER_TWO_SECOND_ALLOCATION_ID = '0x1bF6afCF9542983432B2fab15717c2537A3d3F2A' +const INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY = '0x4bf454f7d52fff97701c1ea5d1e6184c81543780ca61b82cce155a5a3e35a134' + +// Allocations map +const allocations = new Map([ + [ + horizonIndexers[0].address, + [ + { + allocationID: INDEXER_ONE_FIRST_ALLOCATION_ID, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_ONE, + allocationPrivateKey: INDEXER_ONE_FIRST_ALLOCATION_PRIVATE_KEY, + tokens: parseEther('10000'), + }, + { + allocationID: INDEXER_ONE_SECOND_ALLOCATION_ID, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_TWO, + allocationPrivateKey: INDEXER_ONE_SECOND_ALLOCATION_PRIVATE_KEY, + tokens: parseEther('8000'), + }, + { + allocationID: INDEXER_ONE_THIRD_ALLOCATION_ID, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_THREE, + allocationPrivateKey: INDEXER_ONE_THIRD_ALLOCATION_PRIVATE_KEY, + tokens: parseEther('5000'), + }, + ], + ], + [ + horizonIndexers[2].address, + [ + { + allocationID: INDEXER_TWO_FIRST_ALLOCATION_ID, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_ONE, + allocationPrivateKey: INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY, + tokens: parseEther('10000'), + }, + { + allocationID: INDEXER_TWO_SECOND_ALLOCATION_ID, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_TWO, + allocationPrivateKey: INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY, + tokens: parseEther('8000'), + }, + ], + ], +]) + +// Indexers data +export const indexersData: IndexerData[] = horizonIndexers + .filter((indexer) => !indexer.tokensToUnstake || indexer.tokensToUnstake <= parseEther('100000')) + .map((indexer) => { + // Move existing allocations to legacyAllocations + const legacyAllocations = indexer.allocations + + // Previsouly cuts were indexer's share, Horizon cuts are delegator's share. Invert values: + // 1_000_000 - oldValue converts from "indexer keeps X%" to "delegators get X%" + const maxPpm = 1_000_000 + const indexingRewardCut = maxPpm - indexer.indexingRewardCut + const queryFeeCut = maxPpm - indexer.queryFeeCut + + return { + ...indexer, + indexingRewardCut, + queryFeeCut, + url: 'url', + geoHash: 'geohash', + provisionTokens: parseEther('1000000'), + legacyAllocations, + allocations: allocations.get(indexer.address) || [], + } + }) diff --git a/packages/toolshed/src/fixtures/indexers.ts b/packages/toolshed/src/fixtures/indexers.ts new file mode 100644 index 000000000..d92559ac0 --- /dev/null +++ b/packages/toolshed/src/fixtures/indexers.ts @@ -0,0 +1,105 @@ +import { parseEther } from 'ethers' + +// Indexer interface +export interface Indexer { + address: string + stake: bigint + tokensToUnstake?: bigint + indexingRewardCut: number + queryFeeCut: number + rewardsDestination?: string + allocations: Allocation[] +} + +// Allocation interface +export interface Allocation { + allocationID: string + allocationPrivateKey: string + subgraphDeploymentID: string + tokens: bigint +} + +// Indexer one data +const INDEXER_ONE_ADDRESS = '0x95cED938F7991cd0dFcb48F0a06a40FA1aF46EBC' // Hardhat account #5 +const INDEXER_ONE_FIRST_ALLOCATION_ID = '0x70043e424171076D74a1f6a6a56087Bb4c7A61AA' +const INDEXER_ONE_FIRST_ALLOCATION_PRIVATE_KEY = '0x9c41bca4eb319bdf4cac23ae3366eed5f9fa12eb05c0ef29319afcfaa3fc2d79' +const INDEXER_ONE_SECOND_ALLOCATION_ID = '0xd67CE7F6A2eCa6fD78A7E2A5C5e56Fb821BEdE0c' +const INDEXER_ONE_SECOND_ALLOCATION_PRIVATE_KEY = '0x827a0b66fbeb3fefb4a99b6ba0b4bea3b8dd590b97fa7a1bbe74e5b33c935f16' +const INDEXER_ONE_THIRD_ALLOCATION_ID = '0x212e51125e4Ed4C2041614b139eC6cb8FA6d561C' +const INDEXER_ONE_THIRD_ALLOCATION_PRIVATE_KEY = '0x434f1d4435e978299ec64841153c25af2f611a145da3e8539c65b9bd5d9c08b5' + +// Indexer two data +const INDEXER_TWO_ADDRESS = '0x3E5e9111Ae8eB78Fe1CC3bb8915d5D461F3Ef9A9' // Hardhat account #6 +const INDEXER_TWO_REWARDS_DESTINATION = '0x227A35f9912693240E842FaAB6cf5e4E6371ff63' +const INDEXER_TWO_FIRST_ALLOCATION_ID = '0xD0EAc83b0bf328bbf68F4f1a1480e17A38BFb192' +const INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY = '0x80ff89a67cf4b41ea3ece2574b7212b5fee43c0fa370bf3e188a645b561ac810' +const INDEXER_TWO_SECOND_ALLOCATION_ID = '0x63280ec9EA63859b7e2041f07a549F311C86B3bd' +const INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY = '0xab6cb9dbb3646a856e6cac2c0e2a59615634e93cde11385eb6c6ba58e2873a46' + +// Indexer three data +const INDEXER_THREE_ADDRESS = '0x28a8746e75304c0780E011BEd21C72cD78cd535E' // Hardhat account #6 +const INDEXER_THREE_REWARDS_DESTINATION = '0xA3D22DDf431A8745888804F520D4eA51Cb43A458' +// Subgraph deployment IDs +const SUBGRAPH_DEPLOYMENT_ID_ONE = '0x02cd85012c1f075fd58fad178fd23ab841d3b5ddcf5cd3377c30118da97cb2a4' +const SUBGRAPH_DEPLOYMENT_ID_TWO = '0x03ca89485a59894f1acfa34660c69024b6b90ce45171dece7662b0886bc375c7' +const SUBGRAPH_DEPLOYMENT_ID_THREE = '0x0472e8c46f728adb65a22187c6740532f82c2ebadaeabbbe59a2bb4a1bdde197' + +export const indexers: Indexer[] = [ + { + address: INDEXER_ONE_ADDRESS, + stake: parseEther('1100000'), + tokensToUnstake: parseEther('10000'), + indexingRewardCut: 900000, // 90% + queryFeeCut: 900000, // 90% + allocations: [ + { + allocationID: INDEXER_ONE_FIRST_ALLOCATION_ID, + allocationPrivateKey: INDEXER_ONE_FIRST_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_ONE, + tokens: parseEther('400000'), + }, + { + allocationID: INDEXER_ONE_SECOND_ALLOCATION_ID, + allocationPrivateKey: INDEXER_ONE_SECOND_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_TWO, + tokens: parseEther('300000'), + }, + { + allocationID: INDEXER_ONE_THIRD_ALLOCATION_ID, + allocationPrivateKey: INDEXER_ONE_THIRD_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_THREE, + tokens: parseEther('250000'), + }, + ], + }, + { + address: INDEXER_TWO_ADDRESS, + stake: parseEther('1100000'), + tokensToUnstake: parseEther('1000000'), + indexingRewardCut: 850000, // 85% + queryFeeCut: 850000, // 85% + rewardsDestination: INDEXER_TWO_REWARDS_DESTINATION, + allocations: [ + { + allocationID: INDEXER_TWO_FIRST_ALLOCATION_ID, + allocationPrivateKey: INDEXER_TWO_FIRST_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_ONE, + tokens: parseEther('400000'), + }, + { + allocationID: INDEXER_TWO_SECOND_ALLOCATION_ID, + allocationPrivateKey: INDEXER_TWO_SECOND_ALLOCATION_PRIVATE_KEY, + subgraphDeploymentID: SUBGRAPH_DEPLOYMENT_ID_TWO, + tokens: parseEther('200000'), + }, + ], + }, + { + address: INDEXER_THREE_ADDRESS, + stake: parseEther('1100000'), + indexingRewardCut: 800000, // 80% + queryFeeCut: 800000, // 80% + rewardsDestination: INDEXER_THREE_REWARDS_DESTINATION, + allocations: [], + }, +] diff --git a/packages/toolshed/src/hardhat/config.ts b/packages/toolshed/src/hardhat/config.ts new file mode 100644 index 000000000..dbff56acb --- /dev/null +++ b/packages/toolshed/src/hardhat/config.ts @@ -0,0 +1,14 @@ +import { existsSync } from 'fs' +import { globSync } from 'glob' +import { join } from 'path' + +export function loadTasks(rootPath: string) { + const tasksPath = join(rootPath, 'tasks') + const files: string[] = globSync('**/*.ts', { cwd: tasksPath, absolute: true }) + files.forEach(require) +} + +// This is going to fail if the project is using a different build directory +export function isProjectBuilt(rootPath: string) { + return existsSync(join(rootPath, 'build/contracts')) +} diff --git a/packages/toolshed/src/hardhat/erc20.ts b/packages/toolshed/src/hardhat/erc20.ts new file mode 100644 index 000000000..bcd884d04 --- /dev/null +++ b/packages/toolshed/src/hardhat/erc20.ts @@ -0,0 +1,38 @@ +import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { Addressable } from 'ethers' +import { keccak256 } from 'ethers/crypto' +import { toBeHex, zeroPadValue } from 'ethers/utils' + +export async function setGRTBalance( + provider: HardhatEthersProvider, + tokenAddress: string | Addressable, + userAddress: string | Addressable, + balance: bigint | string | number, +): Promise { + await setERC20Balance(provider, tokenAddress, userAddress, balance, 52) +} + +export async function setERC20Balance( + provider: HardhatEthersProvider, + tokenAddress: string | Addressable, + userAddress: string | Addressable, + balance: bigint | string | number, + slot = 0, +): Promise { + if (typeof tokenAddress !== 'string') { + tokenAddress = await tokenAddress.getAddress() + } + if (typeof userAddress !== 'string') { + userAddress = await userAddress.getAddress() + } + const paddedAddress = zeroPadValue(userAddress, 32) // 32-byte padded user address + const paddedSlot = zeroPadValue(toBeHex(slot), 32) // 32-byte padded slot index + + // Compute the storage key for the mapping: keccak256(paddedAddress ++ paddedSlot) + const storageKey = keccak256(paddedAddress + paddedSlot.slice(2)) + + // Pad the balance to 32 bytes + const paddedValue = toBeHex(balance, 32) + + await provider.send('hardhat_setStorageAt', [tokenAddress, storageKey, paddedValue]) +} diff --git a/packages/toolshed/src/hardhat/event.ts b/packages/toolshed/src/hardhat/event.ts new file mode 100644 index 000000000..022621224 --- /dev/null +++ b/packages/toolshed/src/hardhat/event.ts @@ -0,0 +1,20 @@ +import type { TransactionResponse } from 'ethers' +import { ethers } from 'ethers' + +export async function getEventData(tx: TransactionResponse, eventAbi: string) { + const receipt = await tx.wait() + const abi = [eventAbi] + const iface = new ethers.Interface(abi) + if (receipt?.logs === undefined) { + return [] + } + + for (const log of receipt.logs) { + const event = iface.parseLog(log) + if (event !== null) { + return event.args + } + } + + return [] +} diff --git a/packages/toolshed/src/hardhat/hardhat.base.config.ts b/packages/toolshed/src/hardhat/hardhat.base.config.ts new file mode 100644 index 000000000..a31236a83 --- /dev/null +++ b/packages/toolshed/src/hardhat/hardhat.base.config.ts @@ -0,0 +1,167 @@ +import { vars } from 'hardhat/config' +import type { HardhatUserConfig, NetworksUserConfig, ProjectPathsUserConfig, SolidityUserConfig } from 'hardhat/types' + +import { resolveAddressBook } from '../lib/resolve' + +// This base config file assumes the project is using the following hardhat plugins: +// - hardhat-graph-protocol +// - hardhat-secure-accounts +// - hardhat-verify +// To avoid adding those dependencies on toolshed we re-declare some types here +interface SecureAccountsOptions { + enabled?: boolean +} + +type GraphRuntimeEnvironmentOptions = { + deployments?: { + [deployment in 'horizon' | 'subgraphService']?: + | string + | { + addressBook: string + } + } +} + +interface EtherscanConfig { + apiKey: string | Record + customChains: { + network: string + chainId: number + urls: { + apiURL: string + browserURL: string + } + }[] + enabled: boolean +} + +// Hardhat variables +const ARBITRUM_ONE_RPC = vars.get('ARBITRUM_ONE_RPC', 'https://arb1.arbitrum.io/rpc') +const ARBITRUM_SEPOLIA_RPC = vars.get('ARBITRUM_SEPOLIA_RPC', 'https://sepolia-rollup.arbitrum.io/rpc') +const LOCAL_NETWORK_RPC = vars.get('LOCAL_NETWORK_RPC', 'http://chain:8545') +const LOCALHOST_RPC = vars.get('LOCALHOST_RPC', 'http://localhost:8545') + +export const solidityUserConfig: SolidityUserConfig = { + version: '0.8.27', + settings: { + optimizer: { + enabled: true, + runs: 100, + }, + }, +} + +export const projectPathsUserConfig: ProjectPathsUserConfig = { + artifacts: './build/contracts', + sources: './contracts', +} + +export const etherscanUserConfig: Partial = { + apiKey: { + ...(vars.has('ARBISCAN_API_KEY') && { + arbitrumSepolia: vars.get('ARBISCAN_API_KEY'), + }), + }, +} + +// In general: +// - "hardhat" is used for unit tests +// - "localhost" is used for local development on a hardhat network or fork +// - "localNetwork" is used for testing in the local network environment +type EnhancedNetworkConfig = T & { + secureAccounts?: SecureAccountsOptions + deployments?: { + horizon?: string + subgraphService?: string + } +} + +type BaseNetworksUserConfig = { + [K in keyof NetworksUserConfig]: EnhancedNetworkConfig +} +export const networksUserConfig = function (callerRequire: typeof require): BaseNetworksUserConfig { + return { + hardhat: { + chainId: 31337, + accounts: { + mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', + }, + deployments: { + horizon: resolveAddressBook(callerRequire, '@graphprotocol/horizon/addresses.json', 'addresses-hardhat.json'), + subgraphService: resolveAddressBook( + callerRequire, + '@graphprotocol/subgraph-service/addresses.json', + 'addresses-hardhat.json', + ), + }, + }, + localNetwork: { + chainId: 1337, + url: LOCAL_NETWORK_RPC, + deployments: { + horizon: resolveAddressBook( + callerRequire, + '@graphprotocol/horizon/addresses.json', + 'addresses-local-network.json', + ), + subgraphService: resolveAddressBook( + callerRequire, + '@graphprotocol/subgraph-service/addresses.json', + 'addresses-local-network.json', + ), + }, + }, + localhost: { + chainId: 31337, + url: LOCALHOST_RPC, + secureAccounts: { + enabled: true, + }, + deployments: { + horizon: resolveAddressBook(callerRequire, '@graphprotocol/horizon/addresses.json', 'addresses-localhost.json'), + subgraphService: resolveAddressBook( + callerRequire, + '@graphprotocol/subgraph-service/addresses.json', + 'addresses-localhost.json', + ), + }, + }, + arbitrumOne: { + chainId: 42161, + url: ARBITRUM_ONE_RPC, + secureAccounts: { + enabled: true, + }, + }, + arbitrumSepolia: { + chainId: 421614, + url: ARBITRUM_SEPOLIA_RPC, + secureAccounts: { + enabled: true, + }, + }, + } +} + +type BaseHardhatConfig = HardhatUserConfig & { etherscan: Partial } & { + graph: GraphRuntimeEnvironmentOptions +} & { secureAccounts: SecureAccountsOptions } +export const hardhatBaseConfig = function (callerRequire: typeof require): BaseHardhatConfig { + return { + solidity: solidityUserConfig, + paths: projectPathsUserConfig, + secureAccounts: { + enabled: false, + }, + networks: networksUserConfig(callerRequire), + graph: { + deployments: { + horizon: resolveAddressBook(callerRequire, '@graphprotocol/horizon/addresses.json'), + subgraphService: resolveAddressBook(callerRequire, '@graphprotocol/subgraph-service/addresses.json'), + }, + }, + etherscan: etherscanUserConfig, + } +} + +export default hardhatBaseConfig diff --git a/packages/toolshed/src/hardhat/ignition.ts b/packages/toolshed/src/hardhat/ignition.ts new file mode 100644 index 000000000..a5e5fb018 --- /dev/null +++ b/packages/toolshed/src/hardhat/ignition.ts @@ -0,0 +1,126 @@ +import fs from 'fs' +import { parse } from 'json5' +import path from 'path' + +import type { AddressBook } from '../deployments/address-book' + +type IgnitionConfigValue = string | number +type IgnitionConfig = { + [key: string]: Record +} + +export function loadConfig( + configPath: string, + prefix: string, + configName: string, +): { + config: IgnitionConfig + file: string +} { + prefix = process.env.IGNITION_DEPLOYMENT_TYPE ?? prefix + + const configFileCandidates = [ + path.resolve(process.cwd(), configPath, `${prefix}.${configName}.json5`), + path.resolve(process.cwd(), configPath, `${prefix}.default.json5`), + ] + + const configFile = configFileCandidates.find((file) => fs.existsSync(file)) + if (!configFile) { + throw new Error(`Config file not found. Tried:\n${configFileCandidates.map((f) => `- ${f}`).join('\n')}`) + } + + const config = parse(fs.readFileSync(configFile, 'utf8')) + + return { + config: removeNFromBigInts(config), + file: configFile, + } +} + +export function patchConfig(jsonData: IgnitionConfig, patches: IgnitionConfig): IgnitionConfig { + const result: IgnitionConfig = { ...jsonData } + for (const [key, patchValue] of Object.entries(patches)) { + const existingValue = result[key] + if (existingValue) { + result[key] = { ...existingValue, ...patchValue } + } else { + result[key] = patchValue + } + } + return result +} + +type IgnitionModuleResult = { + [key: string]: { + target: string + } +} + +export function saveToAddressBook( + ignitionModuleResult: unknown, + addressBook: AddressBook, +): AddressBook { + const contracts = ignitionModuleResult as IgnitionModuleResult + for (const [ignitionContractName, contract] of Object.entries(contracts)) { + // Proxy contracts + if (ignitionContractName.includes('_Proxy_')) { + const contractName = ignitionContractName.replace(/(Transparent_Proxy_|Graph_Proxy_)/, '') as ContractName + const proxy = ignitionContractName.includes('Transparent_Proxy_') ? 'transparent' : 'graph' + const entry = addressBook.entryExists(contractName) ? addressBook.getEntry(contractName) : {} + addressBook.setEntry(contractName, { + ...entry, + address: contract.target, + proxy, + }) + } + + // Proxy admin contracts + if (ignitionContractName.includes('_ProxyAdmin_')) { + const contractName = ignitionContractName.replace( + /(Transparent_ProxyAdmin_|Graph_ProxyAdmin_)/, + '', + ) as ContractName + const proxy = ignitionContractName.includes('Transparent_ProxyAdmin_') ? 'transparent' : 'graph' + const entry = addressBook.entryExists(contractName) ? addressBook.getEntry(contractName) : {} + addressBook.setEntry(contractName, { + ...entry, + proxy, + proxyAdmin: contract.target, + }) + } + + // Implementation contracts + if (ignitionContractName.startsWith('Implementation_')) { + const contractName = ignitionContractName.replace('Implementation_', '') as ContractName + const entry = addressBook.entryExists(contractName) ? addressBook.getEntry(contractName) : {} + addressBook.setEntry(contractName, { + ...entry, + implementation: contract.target, + }) + } + + // Non proxied contracts + if (addressBook.isContractName(ignitionContractName)) { + const entry = addressBook.entryExists(ignitionContractName) ? addressBook.getEntry(ignitionContractName) : {} + addressBook.setEntry(ignitionContractName, { + ...entry, + address: contract.target, + }) + } + } + + return addressBook +} + +// Ignition requires "n" suffix for bigints, but not in js runtime +function removeNFromBigInts(config: IgnitionConfig): IgnitionConfig { + const result: IgnitionConfig = {} + for (const [key, value] of Object.entries(config)) { + if (typeof value === 'object') { + result[key] = Object.fromEntries( + Object.entries(value).map(([k, v]) => [k, typeof v === 'string' && /^\d+n$/.test(v) ? v.slice(0, -1) : v]), + ) + } + } + return result +} diff --git a/packages/toolshed/src/hardhat/index.ts b/packages/toolshed/src/hardhat/index.ts new file mode 100644 index 000000000..d0b1183e6 --- /dev/null +++ b/packages/toolshed/src/hardhat/index.ts @@ -0,0 +1,6 @@ +export { isProjectBuilt, loadTasks } from './config' +export { setERC20Balance, setGRTBalance } from './erc20' +export { getEventData } from './event' +export { hardhatBaseConfig } from './hardhat.base.config' +export { loadConfig, patchConfig, saveToAddressBook } from './ignition' +export { requireLocalNetwork } from './local' diff --git a/packages/toolshed/src/hardhat/local.ts b/packages/toolshed/src/hardhat/local.ts new file mode 100644 index 000000000..1258b08b6 --- /dev/null +++ b/packages/toolshed/src/hardhat/local.ts @@ -0,0 +1,21 @@ +import type { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider' +import type { HardhatRuntimeEnvironment } from 'hardhat/types' + +const localNetworks = ['localhost', 'hardhat', 'localNetwork'] + +export function requireLocalNetwork(hre: HardhatRuntimeEnvironment) { + if (!localNetworks.includes(hre.network.name)) { + throw new Error(`Network ${hre.network.name} is not a local network.`) + } +} + +export async function warp(provider: HardhatEthersProvider, seconds: number) { + await provider.send('evm_increaseTime', [seconds]) + await provider.send('evm_mine', []) +} + +export async function mine(provider: HardhatEthersProvider, blocks: number) { + for (let i = 0; i < blocks; i++) { + await provider.send('evm_mine', []) + } +} diff --git a/packages/sdk/src/utils/assertions.ts b/packages/toolshed/src/lib/assert.ts similarity index 100% rename from packages/sdk/src/utils/assertions.ts rename to packages/toolshed/src/lib/assert.ts diff --git a/packages/toolshed/src/lib/bytes.ts b/packages/toolshed/src/lib/bytes.ts new file mode 100644 index 000000000..e688fc72f --- /dev/null +++ b/packages/toolshed/src/lib/bytes.ts @@ -0,0 +1,3 @@ +import { ethers } from 'ethers' + +export const randomHexBytes = (n = 32): string => ethers.hexlify(ethers.randomBytes(n)) diff --git a/packages/sdk/src/deployments/logger.ts b/packages/toolshed/src/lib/logger.ts similarity index 51% rename from packages/sdk/src/deployments/logger.ts rename to packages/toolshed/src/lib/logger.ts index b5ff377ad..c8aa2dd6a 100644 --- a/packages/sdk/src/deployments/logger.ts +++ b/packages/toolshed/src/lib/logger.ts @@ -1,11 +1,9 @@ import debug from 'debug' -const LOG_BASE = 'graph:deployments' +const LOG_BASE = 'toolshed' + export const logDebug = debug(`${LOG_BASE}:debug`) -export const logInfo = debug(`${LOG_BASE}:info`) export const logWarn = debug(`${LOG_BASE}:warn`) export const logError = debug(`${LOG_BASE}:error`) -// if (process.env.DEBUG === undefined) { -// debug.enable(`${LOG_BASE}:info`) -// } +export const logTxLogging = debug(`${LOG_BASE}:tx`) diff --git a/packages/toolshed/src/lib/resolve.ts b/packages/toolshed/src/lib/resolve.ts new file mode 100644 index 000000000..01370ca24 --- /dev/null +++ b/packages/toolshed/src/lib/resolve.ts @@ -0,0 +1,48 @@ +import path from 'path' + +/** + * Resolves the absolute path to an address book file relative to an existing file. + * + * This function uses `require.resolve` (from the caller's context) on the provided + * `existingAddressBookPath` to locate a known file (e.g., an existing address book JSON file). + * Once located, it returns the absolute path to the desired `addressBookPath`, which is resolved + * relative to the directory of the existing file. + * + * If the existing file cannot be resolved, the function returns `undefined`. + * + * This is useful when: + * - You know the location of one file in a package or module. + * - You need the path to another file in the same directory (or nearby), whether or not it exists. + * + * ## Examples + * + * ```ts + * // Example 1: Resolve a different file in the same folder + * // Locates: /@graphprotocol/horizon/addresses.json + * // Returns: /@graphprotocol/horizon/addresses-hardhat.json + * resolveAddressBook(require, 'addresses.json', 'addresses-hardhat.json') + * ``` + * + * ```ts + * // Example 2: Resolve the same file you use for lookup + * // Locates and returns: /@graphprotocol/address-book/horizon/addresses.json + * resolveAddressBook(require, '@graphprotocol/address-book/horizon/addresses.json') + * ``` + * + * @param callerRequire - The `require` function from the calling module, used for resolution relative to the caller. + * @param existingAddressBookPath - A resolvable path to an existing file (relative to the caller), used as an anchor. Defaults to `"addresses.json"`. + * @param addressBookPath - The path (relative to the anchor's directory) to the file you want returned. Defaults to `"addresses.json"`. + * @returns The absolute path to the requested file, or `undefined` if the existing file cannot be resolved. + */ +export function resolveAddressBook( + callerRequire: typeof require, + existingAddressBookPath: string = 'addresses.json', + addressBookPath: string = 'addresses.json', +): string | undefined { + try { + const packageRoot = path.dirname(callerRequire.resolve(`${existingAddressBookPath}`)) + return path.join(packageRoot, addressBookPath) + } catch (_) { + return undefined + } +} diff --git a/packages/toolshed/src/utils/banner.ts b/packages/toolshed/src/utils/banner.ts new file mode 100644 index 000000000..e88f0dcab --- /dev/null +++ b/packages/toolshed/src/utils/banner.ts @@ -0,0 +1,58 @@ +/** + * Creates and prints a box-style banner with centered text to the console + * @param title The main title text to display + * @param prefix Optional prefix text that appears before the title (default: '') + * @param minWidth Minimum width of the banner (default: 47) + */ +export function printBanner(title: string, prefix = '', minWidth = 47): void { + // Format title with capitalized words if it contains hyphens + const formattedTitle = title.includes('-') + ? title + .split('-') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' ') + : title + + const fullText = prefix + formattedTitle + + // Calculate minimum banner width needed for the text + const contentWidth = fullText.length + const bannerWidth = Math.max(minWidth, contentWidth + 10) // Add padding + + // Create the centered text line + const paddingLeft = Math.floor((bannerWidth - contentWidth) / 2) + const paddingRight = bannerWidth - contentWidth - paddingLeft + const centeredLine = '|' + ' '.repeat(paddingLeft) + fullText + ' '.repeat(paddingRight) + '|' + + // Create empty line with correct width + const emptyLine = '|' + ' '.repeat(bannerWidth) + '|' + + // Create border with correct width + const border = '+' + '-'.repeat(bannerWidth) + '+' + + console.log(` +${border} +${emptyLine} +${centeredLine} +${emptyLine} +${border} +`) +} + +export function printHorizonBanner() { + console.log(` + ██╗ ██╗ ██████╗ ██████╗ ██╗███████╗ ██████╗ ███╗ ██╗ + ██║ ██║██╔═══██╗██╔══██╗██║╚══███╔╝██╔═══██╗████╗ ██║ + ███████║██║ ██║██████╔╝██║ ███╔╝ ██║ ██║██╔██╗ ██║ + ██╔══██║██║ ██║██╔══██╗██║ ███╔╝ ██║ ██║██║╚██╗██║ + ██║ ██║╚██████╔╝██║ ██║██║███████╗╚██████╔╝██║ ╚████║ + ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═══╝ + + ██╗ ██╗██████╗ ██████╗ ██████╗ █████╗ ██████╗ ███████╗ + ██║ ██║██╔══██╗██╔════╝ ██╔══██╗██╔══██╗██╔══██╗██╔════╝ + ██║ ██║██████╔╝██║ ███╗██████╔╝███████║██║ ██║█████╗ + ██║ ██║██╔═══╝ ██║ ██║██╔══██╗██╔══██║██║ ██║██╔══╝ + ╚██████╔╝██║ ╚██████╔╝██║ ██║██║ ██║██████╔╝███████╗ + ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚══════╝ + `) +} diff --git a/packages/toolshed/src/utils/bigint.ts b/packages/toolshed/src/utils/bigint.ts new file mode 100644 index 000000000..e86d73c44 --- /dev/null +++ b/packages/toolshed/src/utils/bigint.ts @@ -0,0 +1,17 @@ +import { hexlify } from 'ethers' +import { randomBytes } from 'ethers' + +export function randomBigInt(min: bigint, max: bigint): bigint { + if (min > max) throw new Error('min must be <= max') + const range = max - min + 1n + const bits = range.toString(2).length + const byteLen = Math.ceil(bits / 8) + + let rand: bigint + do { + const bytes = randomBytes(byteLen) + rand = BigInt('0x' + hexlify(bytes).slice(2)) + } while (rand >= range) + + return min + rand +} diff --git a/packages/toolshed/src/utils/index.ts b/packages/toolshed/src/utils/index.ts new file mode 100644 index 000000000..ecfc5c9c0 --- /dev/null +++ b/packages/toolshed/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './banner' +export * from './bigint' diff --git a/packages/toolshed/tsconfig.json b/packages/toolshed/tsconfig.json new file mode 100644 index 000000000..f6387508a --- /dev/null +++ b/packages/toolshed/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src/**/*.ts", "test/**/*.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd783abe7..ab624d1a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,9 +6,6 @@ settings: catalogs: default: - '@eslint/js': - specifier: ^9.28.0 - version: 9.28.0 '@nomicfoundation/hardhat-ethers': specifier: ^3.1.0 version: 3.1.0 @@ -24,9 +21,6 @@ catalogs: eslint: specifier: ^9.28.0 version: 9.28.0 - eslint-config-prettier: - specifier: ^10.1.5 - version: 10.1.5 eslint-plugin-no-only-tests: specifier: ^3.3.0 version: 3.3.0 @@ -78,7 +72,7 @@ importers: version: 2.29.4 '@commitlint/cli': specifier: 19.8.1 - version: 19.8.1(@types/node@20.19.9)(typescript@5.8.3) + version: 19.8.1(@types/node@20.17.58)(typescript@5.8.3) '@commitlint/config-conventional': specifier: 19.8.1 version: 19.8.1 @@ -152,45 +146,11 @@ importers: specifier: ^1.7.0 version: 1.7.0 - packages/common: - dependencies: - dotenv: - specifier: ^16.3.1 - version: 16.5.0 + packages/address-book: devDependencies: - '@openzeppelin/contracts': - specifier: ^5.3.0 - version: 5.3.0 - '@openzeppelin/contracts-upgradeable': - specifier: ^5.3.0 - version: 5.3.0(@openzeppelin/contracts@5.3.0) - '@types/node': - specifier: ^20.17.50 - version: 20.17.58 - eslint: - specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) - eslint-config-prettier: - specifier: 'catalog:' - version: 10.1.5(eslint@9.28.0(jiti@2.4.2)) - globals: - specifier: ^16.1.0 - version: 16.1.0 - markdownlint-cli: - specifier: 'catalog:' - version: 0.45.0 prettier: specifier: ^3.5.3 version: 3.5.3 - solhint: - specifier: 'catalog:' - version: 6.0.1(typescript@5.8.3) - typescript: - specifier: ^5.8.3 - version: 5.8.3 - typescript-eslint: - specifier: 'catalog:' - version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) packages/contracts: devDependencies: @@ -215,12 +175,12 @@ importers: '@ethersproject/providers': specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@graphprotocol/common': - specifier: workspace:^ - version: link:../common '@graphprotocol/common-ts': specifier: ^1.8.3 version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@graphprotocol/interfaces': + specifier: workspace:^ + version: link:../interfaces '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -345,8 +305,8 @@ importers: specifier: workspace:^ version: link:.. '@graphprotocol/sdk': - specifier: workspace:^ - version: link:../../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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) axios: specifier: ^1.9.0 version: 1.9.0(debug@4.4.1) @@ -372,9 +332,6 @@ importers: '@ethersproject/providers': specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@graphprotocol/common': - specifier: workspace:^ - version: link:../../common '@graphprotocol/common-ts': specifier: ^1.8.3 version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -484,8 +441,8 @@ importers: specifier: workspace:^ version: link:.. '@graphprotocol/sdk': - specifier: workspace:^ - version: link:../../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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) devDependencies: '@arbitrum/sdk': specifier: ~3.1.13 @@ -508,9 +465,6 @@ importers: '@ethersproject/providers': specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@graphprotocol/common': - specifier: workspace:^ - version: link:../../common '@graphprotocol/common-ts': specifier: ^1.8.3 version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -752,21 +706,247 @@ importers: specifier: ^5.8.3 version: 5.8.3 + packages/hardhat-graph-protocol: + dependencies: + '@graphprotocol/toolshed': + 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: + specifier: ^4.3.7 + version: 4.4.1(supports-color@9.4.0) + json5: + specifier: ^2.2.3 + version: 2.2.3 + devDependencies: + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.12 + version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@types/chai': + specifier: ^4.0.0 + version: 4.3.20 + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 + '@types/mocha': + specifier: ^10.0.9 + version: 10.0.10 + chai: + specifier: ^4.0.0 + version: 4.5.0 + eslint: + specifier: ^8.56.0 + version: 8.57.1 + ethers: + specifier: 6.13.7 + version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: + specifier: ^2.22.16 + version: 2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.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.8.3) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + + packages/horizon: + devDependencies: + '@defi-wonderland/natspec-smells': + specifier: ^1.1.6 + version: 1.1.6(typescript@5.8.3)(zod@3.25.51) + '@graphprotocol/contracts': + specifier: workspace:^ + version: link:../contracts + '@graphprotocol/interfaces': + specifier: workspace:^ + version: link:../interfaces + '@graphprotocol/toolshed': + specifier: workspace:^ + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-foundry': + specifier: ^1.1.1 + version: 1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': + specifier: ^4.0.0 + version: 4.0.0(418f442e9ae8e9c553b9d925825153d3) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.10 + version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) + '@openzeppelin/contracts': + specifier: ^5.0.2 + version: 5.3.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.0.2 + version: 5.3.0(@openzeppelin/contracts@5.3.0) + '@openzeppelin/foundry-upgrades': + specifier: 0.4.0 + 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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + '@types/chai': + specifier: ^4.2.0 + version: 4.3.20 + '@types/mocha': + specifier: '>=9.1.0' + version: 10.0.10 + '@types/node': + specifier: ^20.17.50 + version: 20.17.58 + chai: + specifier: ^4.2.0 + version: 4.5.0 + eslint: + specifier: ^8.56.0 + version: 8.57.1 + ethers: + specifier: 6.13.7 + version: 6.13.7(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 + glob: + specifier: ^11.0.1 + version: 11.0.2 + hardhat: + specifier: ^2.22.18 + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-contract-sizer: + specifier: ^2.10.0 + version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + lint-staged: + specifier: ^15.2.2 + version: 15.5.2 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + prettier-plugin-solidity: + specifier: ^2.0.0 + version: 2.0.0(prettier@3.5.3) + solhint: + specifier: ^5.1.0 + version: 5.1.0(typescript@5.8.3) + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: + specifier: '>=8.0.0' + version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + typechain: + specifier: ^8.3.0 + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: + specifier: ^5.8.3 + version: 5.8.3 + + packages/interfaces: + devDependencies: + '@defi-wonderland/natspec-smells': + specifier: ^1.1.6 + version: 1.1.6(typescript@5.8.3)(zod@3.25.51) + '@ethersproject/abi': + specifier: 5.7.0 + version: 5.7.0 + '@ethersproject/providers': + specifier: 5.7.2 + 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(639b455d9367db27d2db58403e8352ae) + '@openzeppelin/contracts': + specifier: 3.4.1 + version: 3.4.1 + '@openzeppelin/contracts-upgradeable': + specifier: 3.4.2 + 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.8.3))(typescript@5.8.3) + '@wagmi/cli': + specifier: ^2.3.1 + version: 2.5.1(bufferutil@4.0.9)(typescript@5.8.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) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + markdownlint-cli: + specifier: ^0.45.0 + version: 0.45.0 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + prettier-plugin-solidity: + specifier: ^2.0.0 + version: 2.0.0(prettier@3.5.3) + solhint: + specifier: 5.1.0 + version: 5.1.0(typescript@5.8.3) + typechain: + specifier: ^8.3.2 + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + viem: + specifier: ^2.31.7 + version: 2.37.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + packages/issuance: dependencies: '@noble/hashes': specifier: ^1.8.0 version: 1.8.0 devDependencies: - '@graphprotocol/common': + '@graphprotocol/interfaces': specifier: workspace:^ - version: link:../common + version: link:../interfaces '@nomicfoundation/hardhat-ethers': 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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': specifier: 'catalog:' - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.3.0 version: 5.3.0 @@ -775,16 +955,16 @@ importers: version: 5.3.0(@openzeppelin/contracts@5.3.0) '@openzeppelin/hardhat-upgrades': specifier: ^3.9.0 - version: 3.9.1(@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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.9.1(@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': specifier: ^0.5.0 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.8.3))(typescript@5.8.3) '@typechain/hardhat': specifier: 'catalog:' - 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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/node': specifier: ^20.17.50 - version: 20.19.9 + version: 20.17.58 dotenv: specifier: 'catalog:' version: 16.5.0 @@ -802,16 +982,16 @@ importers: version: 16.1.0 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: 'catalog:' - version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-secure-accounts: specifier: 'catalog:' - 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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) hardhat-storage-layout: specifier: 'catalog:' - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) lint-staged: specifier: 16.0.0 version: 16.0.0 @@ -829,7 +1009,7 @@ importers: version: 6.0.1(typescript@5.8.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) + version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typechain: specifier: ^8.3.0 version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) @@ -845,34 +1025,31 @@ importers: packages/issuance/test: dependencies: - '@graphprotocol/common': - specifier: workspace:^ - version: link:../../common '@graphprotocol/contracts': specifier: workspace:^ version: link:../../contracts + '@graphprotocol/interfaces': + specifier: workspace:^ + version: link:../../interfaces '@graphprotocol/issuance': specifier: workspace:^ version: link:.. - '@graphprotocol/sdk': - specifier: workspace:^ - version: link:../../sdk devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: 5.0.0 - version: 5.0.0(61d5f017e0083574a1beadf99c37b1b6) + version: 5.0.0(34987977931eb7f67aaf635190f51b0d) '@openzeppelin/contracts': specifier: ^5.3.0 version: 5.3.0 @@ -890,7 +1067,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.19.9 + version: 20.17.58 chai: specifier: ^4.3.7 version: 4.5.0 @@ -905,7 +1082,7 @@ importers: version: 3.3.0 ethers: specifier: ^6.13.4 - version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + version: 6.13.7(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 @@ -914,119 +1091,148 @@ importers: version: 11.0.2 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: 'catalog:' - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) prettier: specifier: ^3.5.3 version: 3.5.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.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) + version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 - packages/sdk: - dependencies: - '@arbitrum/sdk': - specifier: ~3.1.13 - version: 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@ethersproject/abstract-provider': - specifier: ^5.8.0 - version: 5.8.0 - '@ethersproject/experimental': - specifier: ^5.7.0 - version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@ethersproject/providers': - specifier: ^5.8.0 - version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@graphprotocol/common-ts': - specifier: ^2.0.7 - version: 2.0.11(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + packages/subgraph-service: + devDependencies: + '@defi-wonderland/natspec-smells': + specifier: ^1.1.6 + version: 1.1.6(typescript@5.8.3)(zod@3.25.51) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts + '@graphprotocol/horizon': + specifier: workspace:^ + version: link:../horizon + '@graphprotocol/interfaces': + specifier: workspace:^ + version: link:../interfaces + '@graphprotocol/toolshed': + specifier: workspace:^ + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-foundry': + specifier: ^1.1.1 + version: 1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': - specifier: ^1.0.9 - version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: - specifier: ^4.3.4 - version: 4.4.1(supports-color@9.4.0) - ethers: - specifier: ^5.7.0 - version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: - specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - inquirer: - specifier: ^8.0.0 - version: 8.0.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - yaml: - specifier: ^1.10.2 - version: 1.10.2 - devDependencies: - '@eslint/js': - specifier: 'catalog:' - version: 9.28.0 + specifier: ^1.0.0 + version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': + specifier: ^4.0.0 + version: 4.0.0(418f442e9ae8e9c553b9d925825153d3) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.10 + version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) + '@openzeppelin/contracts': + specifier: ^5.0.2 + version: 5.3.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.0.2 + version: 5.3.0(@openzeppelin/contracts@5.3.0) + '@openzeppelin/foundry-upgrades': + specifier: 0.4.0 + 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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) '@types/chai': - specifier: ^4.3.9 + specifier: ^4.2.0 version: 4.3.20 - '@types/chai-as-promised': - specifier: ^7.1.7 - version: 7.1.8 - '@types/debug': - specifier: ^4.1.10 - version: 4.1.12 - '@types/inquirer': - specifier: ^8.0.0 - version: 8.2.11 - '@types/lodash': - specifier: ^4.14.200 - version: 4.17.17 '@types/mocha': - specifier: ^10.0.3 + specifier: '>=9.1.0' version: 10.0.10 '@types/node': specifier: ^20.17.50 version: 20.17.58 chai: - specifier: ^4.3.10 + specifier: ^4.2.0 version: 4.5.0 - chai-as-promised: - specifier: ^7.1.1 - version: 7.1.2(chai@4.5.0) eslint: - specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) - globals: - specifier: 16.1.0 - version: 16.1.0 - markdownlint-cli: - specifier: 0.45.0 - version: 0.45.0 - mocha: - specifier: ^11.7.1 - version: 11.7.1 + specifier: ^8.56.0 + version: 8.57.1 + ethers: + specifier: 6.13.7 + version: 6.13.7(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 + glob: + specifier: ^11.0.1 + version: 11.0.2 + hardhat: + specifier: ^2.22.18 + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-contract-sizer: + specifier: ^2.10.0 + version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + hardhat-gas-reporter: + specifier: ^1.0.8 + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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 prettier: specifier: ^3.5.3 version: 3.5.3 + prettier-plugin-solidity: + specifier: ^2.0.0 + version: 2.0.0(prettier@3.5.3) + solhint: + specifier: ^5.1.0 + version: 5.1.0(typescript@5.8.3) + solidity-coverage: + specifier: ^0.8.0 + version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + solidity-docgen: + specifier: ^0.6.0-beta.36 + version: 0.6.0-beta.36(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) ts-node: - specifier: ^10.9.2 + specifier: '>=8.0.0' version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + typechain: + specifier: ^8.3.0 + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -1173,11 +1379,54 @@ importers: specifier: 'catalog:' version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + packages/toolshed: + dependencies: + '@graphprotocol/address-book': + specifier: workspace:^ + version: link:../address-book + '@graphprotocol/interfaces': + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: + specifier: ^4.4.0 + version: 4.4.1(supports-color@9.4.0) + ethers: + specifier: 6.13.7 + version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + glob: + specifier: ^11.0.1 + version: 11.0.2 + hardhat: + specifier: ^2.22.16 + version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + json5: + specifier: ^2.2.3 + version: 2.2.3 + devDependencies: + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 + '@types/json5': + specifier: ^2.2.0 + version: 2.2.0 + eslint: + specifier: ^8.56.0 + version: 8.57.1 + typescript: + specifier: ^5.8.3 + version: 5.8.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==} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1225,95 +1474,95 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-lambda@3.865.0': - resolution: {integrity: sha512-ncCEW/kNRV8yJA/45z5HO6WEeihADzFY7RISfezDbvP3/X4dZb2gycRVPmJIE6CBqf01jwTkbG36qO+/iHIELg==} + '@aws-sdk/client-lambda@3.891.0': + resolution: {integrity: sha512-NRi/bOK3ccboNAQngIjF9Hp9EGEosotzlN8UyTfn2SEXTc3Sg8rvK0OBZGe8b4vSeJCQw+A1wM1ZsSyeF2te7Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.864.0': - resolution: {integrity: sha512-THiOp0OpQROEKZ6IdDCDNNh3qnNn/kFFaTSOiugDpgcE5QdsOxh1/RXq7LmHpTJum3cmnFf8jG59PHcz9Tjnlw==} + '@aws-sdk/client-sso@3.891.0': + resolution: {integrity: sha512-QMDaD9GhJe7l0KQp3Tt7dzqFCz/H2XuyNjQgvi10nM1MfI1RagmLtmEhZveQxMPhZ/AtohLSK0Tisp/I5tR8RQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.864.0': - resolution: {integrity: sha512-LFUREbobleHEln+Zf7IG83lAZwvHZG0stI7UU0CtwyuhQy5Yx0rKksHNOCmlM7MpTEbSCfntEhYi3jUaY5e5lg==} + '@aws-sdk/core@3.890.0': + resolution: {integrity: sha512-CT+yjhytHdyKvV3Nh/fqBjnZ8+UiQZVz4NMm4LrPATgVSOdfygXHqrWxrPTVgiBtuJWkotg06DF7+pTd5ekLBw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.864.0': - resolution: {integrity: sha512-StJPOI2Rt8UE6lYjXUpg6tqSZaM72xg46ljPg8kIevtBAAfdtq9K20qT/kSliWGIBocMFAv0g2mC0hAa+ECyvg==} + '@aws-sdk/credential-provider-env@3.890.0': + resolution: {integrity: sha512-BtsUa2y0Rs8phmB2ScZ5RuPqZVmxJJXjGfeiXctmLFTxTwoayIK1DdNzOWx6SRMPVc3s2RBGN4vO7T1TwN+ajA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.864.0': - resolution: {integrity: sha512-E/RFVxGTuGnuD+9pFPH2j4l6HvrXzPhmpL8H8nOoJUosjx7d4v93GJMbbl1v/fkDLqW9qN4Jx2cI6PAjohA6OA==} + '@aws-sdk/credential-provider-http@3.890.0': + resolution: {integrity: sha512-0sru3LVwsuGYyzbD90EC/d5HnCZ9PL4O9BA2LYT6b9XceC005Oj86uzE47LXb+mDhTAt3T6ZO0+ZcVQe0DDi8w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.864.0': - resolution: {integrity: sha512-PlxrijguR1gxyPd5EYam6OfWLarj2MJGf07DvCx9MAuQkw77HBnsu6+XbV8fQriFuoJVTBLn9ROhMr/ROAYfUg==} + '@aws-sdk/credential-provider-ini@3.891.0': + resolution: {integrity: sha512-9LOfm97oy2d2frwCQjl53XLkoEYG6/rsNM3Y6n8UtRU3bzGAEjixdIuv3b6Z/Mk/QLeikcQEJ9FMC02DuQh2Yw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.864.0': - resolution: {integrity: sha512-2BEymFeXURS+4jE9tP3vahPwbYRl0/1MVaFZcijj6pq+nf5EPGvkFillbdBRdc98ZI2NedZgSKu3gfZXgYdUhQ==} + '@aws-sdk/credential-provider-node@3.891.0': + resolution: {integrity: sha512-IjGvQJhpCN512xlT1DFGaPeE1q0YEm/X62w7wHsRpBindW//M+heSulJzP4KPkoJvmJNVu1NxN26/p4uH+M8TQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.864.0': - resolution: {integrity: sha512-Zxnn1hxhq7EOqXhVYgkF4rI9MnaO3+6bSg/tErnBQ3F8kDpA7CFU24G1YxwaJXp2X4aX3LwthefmSJHwcVP/2g==} + '@aws-sdk/credential-provider-process@3.890.0': + resolution: {integrity: sha512-dWZ54TI1Q+UerF5YOqGiCzY+x2YfHsSQvkyM3T4QDNTJpb/zjiVv327VbSOULOlI7gHKWY/G3tMz0D9nWI7YbA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.864.0': - resolution: {integrity: sha512-UPyPNQbxDwHVGmgWdGg9/9yvzuedRQVF5jtMkmP565YX9pKZ8wYAcXhcYdNPWFvH0GYdB0crKOmvib+bmCuwkw==} + '@aws-sdk/credential-provider-sso@3.891.0': + resolution: {integrity: sha512-RtF9BwUIZqc/7sFbK6n6qhe0tNaWJQwin89nSeZ1HOsA0Z7TfTOelX8Otd0L5wfeVBMVcgiN3ofqrcZgjFjQjA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.864.0': - resolution: {integrity: sha512-nNcjPN4SYg8drLwqK0vgVeSvxeGQiD0FxOaT38mV2H8cu0C5NzpvA+14Xy+W6vT84dxgmJYKk71Cr5QL2Oz+rA==} + '@aws-sdk/credential-provider-web-identity@3.891.0': + resolution: {integrity: sha512-yq7kzm1sHZ0GZrtS+qpjMUp4ES66UoT1+H2xxrOuAZkvUnkpQq1iSjOgBgJJ9FW1EsDUEmlgn94i4hJTNvm7fg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.862.0': - resolution: {integrity: sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==} + '@aws-sdk/middleware-host-header@3.891.0': + resolution: {integrity: sha512-OYaxbqNDeo/noE7MfYWWQDu86cF/R/bMXdZ2QZwpWpX2yjy8xMwxSg7c/4tEK/OtiDZTKRXXrvPxRxG2+1bnJw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.862.0': - resolution: {integrity: sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==} + '@aws-sdk/middleware-logger@3.891.0': + resolution: {integrity: sha512-azL4mg1H1FLpOAECiFtU+r+9VDhpeF6Vh9pzD4m51BWPJ60CVnyHayeI/0gqPsL60+5l90/b9VWonoA8DvAvpg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.862.0': - resolution: {integrity: sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==} + '@aws-sdk/middleware-recursion-detection@3.891.0': + resolution: {integrity: sha512-n++KwAEnNlvx5NZdIQZnvl2GjSH/YE3xGSqW2GmPB5780tFY5lOYSb1uA+EUzJSVX4oAKAkSPdR2AOW09kzoew==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.864.0': - resolution: {integrity: sha512-wrddonw4EyLNSNBrApzEhpSrDwJiNfjxDm5E+bn8n32BbAojXASH8W8jNpxz/jMgNkkJNxCfyqybGKzBX0OhbQ==} + '@aws-sdk/middleware-user-agent@3.891.0': + resolution: {integrity: sha512-xyxIZtR7FunCWymPAxEm61VUq9lruXxWIYU5AIh5rt0av7nXa2ayAAlscQ7ch9jUlw+lbC2PVbw0K/OYrMovuA==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.864.0': - resolution: {integrity: sha512-H1C+NjSmz2y8Tbgh7Yy89J20yD/hVyk15hNoZDbCYkXg0M358KS7KVIEYs8E2aPOCr1sK3HBE819D/yvdMgokA==} + '@aws-sdk/nested-clients@3.891.0': + resolution: {integrity: sha512-cpol+Yk4T3GXPXbRfUyN2u6tpMEHUxAiesZgrfMm11QGHV+pmzyejJV/QZ0pdJKj5sXKaCr4DCntoJ5iBx++Cw==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.862.0': - resolution: {integrity: sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==} + '@aws-sdk/region-config-resolver@3.890.0': + resolution: {integrity: sha512-VfdT+tkF9groRYNzKvQCsCGDbOQdeBdzyB1d6hWiq22u13UafMIoskJ1ec0i0H1X29oT6mjTitfnvPq1UiKwzQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.864.0': - resolution: {integrity: sha512-gTc2QHOBo05SCwVA65dUtnJC6QERvFaPiuppGDSxoF7O5AQNK0UR/kMSenwLqN8b5E1oLYvQTv3C1idJLRX0cg==} + '@aws-sdk/token-providers@3.891.0': + resolution: {integrity: sha512-n31JDMWhj/53QX33C97+1W63JGtgO8pg1/Tfmv4f9TR2VSGf1rFwYH7cPZ7dVIMmcUBeI2VCVhwUIabGNHw86Q==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.821.0': resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.862.0': - resolution: {integrity: sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==} + '@aws-sdk/types@3.887.0': + resolution: {integrity: sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.862.0': - resolution: {integrity: sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==} + '@aws-sdk/util-endpoints@3.891.0': + resolution: {integrity: sha512-MgxvmHIQJbUK+YquX4bdjDw1MjdBqTRJGHs6iU2KM8nN1ut0bPwvavkq7NrY/wB3ZKKECqmv6J/nw+hYKKUIHA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.804.0': - resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} + '@aws-sdk/util-locate-window@3.873.0': + resolution: {integrity: sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.862.0': - resolution: {integrity: sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==} + '@aws-sdk/util-user-agent-browser@3.887.0': + resolution: {integrity: sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==} - '@aws-sdk/util-user-agent-node@3.864.0': - resolution: {integrity: sha512-d+FjUm2eJEpP+FRpVR3z6KzMdx1qwxEYDz8jzNKwxYLBBquaBaP/wfoMtMQKAcbrR7aT9FZVZF7zDgzNxUvQlQ==} + '@aws-sdk/util-user-agent-node@3.891.0': + resolution: {integrity: sha512-/mmvVL2PJE2NMTWj9JSY98OISx7yov0mi72eOViWCHQMRYJCN12DY54i1rc4Q/oPwJwTwIrx69MLjVhQ1OZsgw==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1324,8 +1573,12 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.862.0': - resolution: {integrity: sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==} + '@aws-sdk/xml-builder@3.887.0': + resolution: {integrity: sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.0.1': + resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.27.1': @@ -1344,10 +1597,6 @@ packages: resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -1362,10 +1611,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} @@ -1419,11 +1664,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-proposal-class-properties@7.18.6': resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -1659,10 +1899,6 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.28.2': - resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1671,18 +1907,10 @@ packages: resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.27.6': resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} - engines: {node: '>=6.9.0'} - '@bytecodealliance/preview2-shim@0.17.0': resolution: {integrity: sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==} @@ -1897,6 +2125,10 @@ packages: '@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 + '@defi-wonderland/smock@2.4.1': resolution: {integrity: sha512-SvWg0joZppEWEB1XopkJazH1+whLw48KgwYLblml0Y7meJLK+J33uuPNtEsmAwgXWCCt6CouK2fXtSEDz2zKVw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -1950,6 +2182,162 @@ packages: resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@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.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@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.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@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.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@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.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@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.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@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.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@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.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1972,10 +2360,18 @@ packages: resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 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.28.0': resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2237,6 +2633,9 @@ packages: '@ethersproject/networks@5.7.0': resolution: {integrity: sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==} + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/networks@5.8.0': resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} @@ -2264,6 +2663,9 @@ packages: '@ethersproject/providers@5.7.0': resolution: {integrity: sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==} + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + '@ethersproject/providers@5.8.0': resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} @@ -2354,6 +2756,9 @@ packages: '@ethersproject/web@5.7.0': resolution: {integrity: sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==} + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/web@5.8.0': resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} @@ -2450,10 +2855,16 @@ packages: '@graphprotocol/contracts@5.3.3': resolution: {integrity: sha512-fmFSKr+VDinWWotj2q/Ztn92PppcRrYXeO/62gLgkLos/DcYa7bGWKbcOWyMUw0vsUvXxk6QAtr5o/LG3yQ1WQ==} + '@graphprotocol/contracts@7.2.1': + resolution: {integrity: sha512-Ge2RD5QoEeSabCzdlMG3DT1mdsTGaD3aqxDsxRWwDx9nejudkrTlhjTTRAGVtBkfxlEy7P4Kxejr+fZmK29yRg==} + '@graphprotocol/pino-sentry-simple@0.7.1': resolution: {integrity: sha512-iccKFdFBjarSp8/liXuK1EtGq8Vwn118tqymbOJBxblecRsi4rOebk63qnL+dK/a0IvxH6h2+RjjWDbRt7UsUA==} engines: {node: '>=10'} + '@graphprotocol/sdk@0.6.0': + resolution: {integrity: sha512-oZGzUNFvZZ5MVsBvKXE0IzVBMzQ6Rxp9L3eCSeeOvHxQD7fUTFwbNr3SsGQagQlo3axLemAvK1hrl+aB5DlZIA==} + '@graphql-codegen/core@3.1.0': resolution: {integrity: sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==} peerDependencies: @@ -2823,6 +3234,11 @@ packages: resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 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'} @@ -2831,6 +3247,10 @@ packages: resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} engines: {node: '>=10.10.0'} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} @@ -2879,9 +3299,6 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -2894,21 +3311,15 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2957,6 +3368,10 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} @@ -2967,6 +3382,10 @@ packages: resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -3087,10 +3506,10 @@ packages: ethers: ^6.14.0 hardhat: ^2.26.0 - '@nomicfoundation/hardhat-ethers@3.0.9': - resolution: {integrity: sha512-xBJdRUiCwKpr0OYrOzPwAyNGtsVzoBx32HFPJVv6S+sFA9TmBIBDaqNlFPmBH58ZjgNnGhEr/4oBZvGr4q4TjQ==} + '@nomicfoundation/hardhat-ethers@3.0.8': + resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} peerDependencies: - ethers: ^6.14.0 + ethers: ^6.1.0 hardhat: ^2.0.0 '@nomicfoundation/hardhat-ethers@3.1.0': @@ -3124,6 +3543,27 @@ packages: peerDependencies: hardhat: ^2.9.5 + '@nomicfoundation/hardhat-toolbox@4.0.0': + resolution: {integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==} + peerDependencies: + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + '@typechain/ethers-v6': ^0.5.0 + '@typechain/hardhat': ^9.0.0 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': ^20.17.50 + chai: ^4.2.0 + ethers: ^6.4.0 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: '>=8.0.0' + typechain: ^8.3.0 + typescript: ^5.8.3 + '@nomicfoundation/hardhat-toolbox@5.0.0': resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} peerDependencies: @@ -3236,6 +3676,9 @@ packages: peerDependencies: '@openzeppelin/contracts': 5.3.0 + '@openzeppelin/contracts@3.4.1': + resolution: {integrity: sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ==} + '@openzeppelin/contracts@3.4.2': resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} @@ -3426,12 +3869,18 @@ packages: '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -3481,200 +3930,200 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.0.5': - resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} + '@smithy/abort-controller@4.1.1': + resolution: {integrity: sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.5': - resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==} + '@smithy/config-resolver@4.2.2': + resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.8.0': - resolution: {integrity: sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==} + '@smithy/core@3.11.1': + resolution: {integrity: sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.7': - resolution: {integrity: sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==} + '@smithy/credential-provider-imds@4.1.2': + resolution: {integrity: sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.5': - resolution: {integrity: sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==} + '@smithy/eventstream-codec@4.1.1': + resolution: {integrity: sha512-PwkQw1hZwHTQB6X5hSUWz2OSeuj5Z6enWuAqke7DgWoP3t6vg3ktPpqPz3Erkn6w+tmsl8Oss6nrgyezoea2Iw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.5': - resolution: {integrity: sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==} + '@smithy/eventstream-serde-browser@4.1.1': + resolution: {integrity: sha512-Q9QWdAzRaIuVkefupRPRFAasaG/droBqn1feiMnmLa+LLEUG45pqX1+FurHFmlqiCfobB3nUlgoJfeXZsr7MPA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.1.3': - resolution: {integrity: sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==} + '@smithy/eventstream-serde-config-resolver@4.2.1': + resolution: {integrity: sha512-oSUkF9zDN9zcOUBMtxp8RewJlh71E9NoHWU8jE3hU9JMYCsmW4assVTpgic/iS3/dM317j6hO5x18cc3XrfvEw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.0.5': - resolution: {integrity: sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==} + '@smithy/eventstream-serde-node@4.1.1': + resolution: {integrity: sha512-tn6vulwf/ScY0vjhzptSJuDJJqlhNtUjkxJ4wiv9E3SPoEqTEKbaq6bfqRO7nvhTG29ALICRcvfFheOUPl8KNA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.5': - resolution: {integrity: sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==} + '@smithy/eventstream-serde-universal@4.1.1': + resolution: {integrity: sha512-uLOAiM/Dmgh2CbEXQx+6/ssK7fbzFhd+LjdyFxXid5ZBCbLHTFHLdD/QbXw5aEDsLxQhgzDxLLsZhsftAYwHJA==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.1.1': - resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==} + '@smithy/fetch-http-handler@5.2.1': + resolution: {integrity: sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.5': - resolution: {integrity: sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==} + '@smithy/hash-node@4.1.1': + resolution: {integrity: sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.0.5': - resolution: {integrity: sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==} + '@smithy/invalid-dependency@4.1.1': + resolution: {integrity: sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==} 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.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + '@smithy/is-array-buffer@4.1.0': + resolution: {integrity: sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.5': - resolution: {integrity: sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==} + '@smithy/middleware-content-length@4.1.1': + resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.18': - resolution: {integrity: sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==} + '@smithy/middleware-endpoint@4.2.3': + resolution: {integrity: sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.19': - resolution: {integrity: sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==} + '@smithy/middleware-retry@4.2.4': + resolution: {integrity: sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.9': - resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==} + '@smithy/middleware-serde@4.1.1': + resolution: {integrity: sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.5': - resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==} + '@smithy/middleware-stack@4.1.1': + resolution: {integrity: sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.4': - resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==} + '@smithy/node-config-provider@4.2.2': + resolution: {integrity: sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.1.1': - resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==} + '@smithy/node-http-handler@4.2.1': + resolution: {integrity: sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.5': - resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==} + '@smithy/property-provider@4.1.1': + resolution: {integrity: sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.3': - resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==} + '@smithy/protocol-http@5.2.1': + resolution: {integrity: sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.5': - resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==} + '@smithy/querystring-builder@4.1.1': + resolution: {integrity: sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.5': - resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==} + '@smithy/querystring-parser@4.1.1': + resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.7': - resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==} + '@smithy/service-error-classification@4.1.2': + resolution: {integrity: sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.5': - resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==} + '@smithy/shared-ini-file-loader@4.2.0': + resolution: {integrity: sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.1.3': - resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==} + '@smithy/signature-v4@5.2.1': + resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.10': - resolution: {integrity: sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==} + '@smithy/smithy-client@4.6.3': + resolution: {integrity: sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==} engines: {node: '>=18.0.0'} '@smithy/types@4.3.1': resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} - '@smithy/types@4.3.2': - resolution: {integrity: sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==} + '@smithy/types@4.5.0': + resolution: {integrity: sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.5': - resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==} + '@smithy/url-parser@4.1.1': + resolution: {integrity: sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + '@smithy/util-base64@4.1.0': + resolution: {integrity: sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + '@smithy/util-body-length-browser@4.1.0': + resolution: {integrity: sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.0.0': - resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + '@smithy/util-body-length-node@4.1.0': + resolution: {integrity: sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==} 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.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + '@smithy/util-buffer-from@4.1.0': + resolution: {integrity: sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.0.0': - resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + '@smithy/util-config-provider@4.1.0': + resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.26': - resolution: {integrity: sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==} + '@smithy/util-defaults-mode-browser@4.1.3': + resolution: {integrity: sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.26': - resolution: {integrity: sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==} + '@smithy/util-defaults-mode-node@4.1.3': + resolution: {integrity: sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.7': - resolution: {integrity: sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==} + '@smithy/util-endpoints@3.1.2': + resolution: {integrity: sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + '@smithy/util-hex-encoding@4.1.0': + resolution: {integrity: sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.5': - resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==} + '@smithy/util-middleware@4.1.1': + resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.7': - resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==} + '@smithy/util-retry@4.1.2': + resolution: {integrity: sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.4': - resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==} + '@smithy/util-stream@4.3.2': + resolution: {integrity: sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + '@smithy/util-uri-escape@4.1.0': + resolution: {integrity: sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==} 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.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + '@smithy/util-utf8@4.1.0': + resolution: {integrity: sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.7': - resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==} + '@smithy/util-waiter@4.1.1': + resolution: {integrity: sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==} engines: {node: '>=18.0.0'} '@solidity-parser/parser@0.14.5': @@ -3785,8 +4234,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -3830,9 +4279,6 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/inquirer@8.2.11': - resolution: {integrity: sha512-15UboTvxb9SOaPG7CcXZ9dkv8lNqfiAwuh/5WxJDLjmElBt9tbx1/FDsEnJddUBKvN4mlPKvr8FyO1rAmBanzg==} - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -3848,6 +4294,10 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/json5@2.2.0': + resolution: {integrity: sha512-NrVug5woqbvNZ0WX+Gv4R+L4TGddtmFek2u8RtccAgFZWtS9QXF2xCXY22/M4nzkaKF0q9Fc6M/5rxLDhfwc/A==} + deprecated: This is a stub types definition. json5 provides its own type definitions, so you do not need this installed. + '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} @@ -3860,9 +4310,6 @@ packages: '@types/levelup@4.3.3': resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} - '@types/lodash@4.17.17': - resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} - '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} @@ -3893,9 +4340,6 @@ packages: '@types/node@20.17.58': resolution: {integrity: sha512-UvxetCgGwZ9HmsgGZ2tpStt6CiFU1bu28ftHWpDyfthsCt7OHXas0C7j0VgO3gBq8UHKI785wXmtcQVhLekcRg==} - '@types/node@20.19.9': - resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3932,9 +4376,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/through@0.0.33': - resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} - '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -4015,6 +4456,9 @@ packages: resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} 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: @@ -4035,6 +4479,15 @@ 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==} + hasBin: true + peerDependencies: + typescript: ^5.8.3 + peerDependenciesMeta: + typescript: + optional: true + '@whatwg-node/cookie-store@0.0.1': resolution: {integrity: sha512-uoti8QU5xd+X+9PULOGpPpOqPDdwkz+ukMc4kyQG1GwXeKVGktr4FSllr6dBotjOjNVPSBPpmj5V6zrUdDcLaw==} @@ -4084,8 +4537,28 @@ packages: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + + abitype@0.7.1: + resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + peerDependencies: + typescript: ^5.8.3 + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} + peerDependencies: + typescript: ^5.8.3 + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -4137,11 +4610,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} @@ -4637,10 +5105,10 @@ packages: babel-plugin-transform-strict-mode@6.24.1: resolution: {integrity: sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==} - babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 + '@babel/core': ^7.0.0 babel-preset-env@1.7.0: resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} @@ -4782,8 +5250,8 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - bowser@2.12.0: - resolution: {integrity: sha512-HcOcTudTeEWgbHh0Y1Tyb6fdeR71m4b/QACf0D4KswGTsNeIJQmg38mRENZPAYPZvGFN3fk3604XbQEPdxXdKg==} + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} @@ -4884,6 +5352,12 @@ packages: resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} engines: {node: '>=6.14.2'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4902,6 +5376,10 @@ packages: bytewise@1.1.0: resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cacache@18.0.4: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5039,6 +5517,9 @@ packages: change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + 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==} @@ -5076,6 +5557,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -5581,6 +6066,9 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decode-named-character-reference@1.1.0: resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} @@ -5600,6 +6088,9 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} @@ -5701,6 +6192,10 @@ 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'} @@ -5733,10 +6228,6 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} - engines: {node: '>=0.3.1'} - diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -5754,6 +6245,10 @@ 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==} @@ -5764,6 +6259,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dotenv@16.5.0: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} @@ -5924,6 +6423,11 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -6018,6 +6522,10 @@ 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.3.0: resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6030,6 +6538,12 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 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.28.0: resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6048,6 +6562,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 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'} @@ -6235,9 +6753,16 @@ packages: ethers@5.7.0: resolution: {integrity: sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==} + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + 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'} @@ -6282,6 +6807,10 @@ 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'} @@ -6298,6 +6827,10 @@ 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==} @@ -6368,6 +6901,10 @@ 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'} @@ -6432,6 +6969,10 @@ 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'} @@ -6501,6 +7042,14 @@ 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'} @@ -6524,15 +7073,6 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -6613,6 +7153,10 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} @@ -6743,6 +7287,10 @@ 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'} @@ -6824,10 +7372,18 @@ packages: 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'} @@ -6839,6 +7395,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + 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'} @@ -7132,14 +7692,14 @@ packages: hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - hermes-estree@0.29.1: - resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + hermes-estree@0.28.1: + resolution: {integrity: sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ==} hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hermes-parser@0.29.1: - resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + hermes-parser@0.28.1: + resolution: {integrity: sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg==} hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -7148,6 +7708,10 @@ 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==} @@ -7215,6 +7779,10 @@ 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'} @@ -7578,6 +8146,10 @@ 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'} @@ -7626,6 +8198,10 @@ 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'} @@ -7718,6 +8294,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -7816,6 +8397,10 @@ packages: 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 @@ -8113,6 +8698,11 @@ 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.0.0: resolution: {integrity: sha512-sUCprePs6/rbx4vKC60Hez6X10HPkpDJaGcy3D1NdwR7g1RcNkWL8q9mJMreOqmHBTs+1sNFp+wOiX9fr+hoOQ==} engines: {node: '>=20.18'} @@ -8135,6 +8725,10 @@ packages: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -8440,61 +9034,61 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.82.5: - resolution: {integrity: sha512-W/scFDnwJXSccJYnOFdGiYr9srhbHPdxX9TvvACOFsIXdLilh3XuxQl/wXW6jEJfgIb0jTvoTlwwrqvuwymr6Q==} + metro-babel-transformer@0.82.4: + resolution: {integrity: sha512-4juJahGRb1gmNbQq48lNinB6WFNfb6m0BQqi/RQibEltNiqTCxew/dBspI2EWA4xVCd3mQWGfw0TML4KurQZnQ==} engines: {node: '>=18.18'} - metro-cache-key@0.82.5: - resolution: {integrity: sha512-qpVmPbDJuRLrT4kcGlUouyqLGssJnbTllVtvIgXfR7ZuzMKf0mGS+8WzcqzNK8+kCyakombQWR0uDd8qhWGJcA==} + metro-cache-key@0.82.4: + resolution: {integrity: sha512-2JCTqcpF+f2OghOpe/+x+JywfzDkrHdAqinPFWmK2ezNAU/qX0jBFaTETogPibFivxZJil37w9Yp6syX8rFUng==} engines: {node: '>=18.18'} - metro-cache@0.82.5: - resolution: {integrity: sha512-AwHV9607xZpedu1NQcjUkua8v7HfOTKfftl6Vc9OGr/jbpiJX6Gpy8E/V9jo/U9UuVYX2PqSUcVNZmu+LTm71Q==} + metro-cache@0.82.4: + resolution: {integrity: sha512-vX0ylSMGtORKiZ4G8uP6fgfPdDiCWvLZUGZ5zIblSGylOX6JYhvExl0Zg4UA9pix/SSQu5Pnp9vdODMFsNIxhw==} engines: {node: '>=18.18'} - metro-config@0.82.5: - resolution: {integrity: sha512-/r83VqE55l0WsBf8IhNmc/3z71y2zIPe5kRSuqA5tY/SL/ULzlHUJEMd1szztd0G45JozLwjvrhAzhDPJ/Qo/g==} + metro-config@0.82.4: + resolution: {integrity: sha512-Ki3Wumr3hKHGDS7RrHsygmmRNc/PCJrvkLn0+BWWxmbOmOcMMJDSmSI+WRlT8jd5VPZFxIi4wg+sAt5yBXAK0g==} engines: {node: '>=18.18'} - metro-core@0.82.5: - resolution: {integrity: sha512-OJL18VbSw2RgtBm1f2P3J5kb892LCVJqMvslXxuxjAPex8OH7Eb8RBfgEo7VZSjgb/LOf4jhC4UFk5l5tAOHHA==} + metro-core@0.82.4: + resolution: {integrity: sha512-Xo4ozbxPg2vfgJGCgXZ8sVhC2M0lhTqD+tsKO2q9aelq/dCjnnSb26xZKcQO80CQOQUL7e3QWB7pLFGPjZm31A==} engines: {node: '>=18.18'} - metro-file-map@0.82.5: - resolution: {integrity: sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ==} + metro-file-map@0.82.4: + resolution: {integrity: sha512-eO7HD1O3aeNsbEe6NBZvx1lLJUrxgyATjnDmb7bm4eyF6yWOQot9XVtxTDLNifECuvsZ4jzRiTInrbmIHkTdGA==} engines: {node: '>=18.18'} - metro-minify-terser@0.82.5: - resolution: {integrity: sha512-v6Nx7A4We6PqPu/ta1oGTqJ4Usz0P7c+3XNeBxW9kp8zayS3lHUKR0sY0wsCHInxZlNAEICx791x+uXytFUuwg==} + metro-minify-terser@0.82.4: + resolution: {integrity: sha512-W79Mi6BUwWVaM8Mc5XepcqkG+TSsCyyo//dmTsgYfJcsmReQorRFodil3bbJInETvjzdnS1mCsUo9pllNjT1Hg==} engines: {node: '>=18.18'} - metro-resolver@0.82.5: - resolution: {integrity: sha512-kFowLnWACt3bEsuVsaRNgwplT8U7kETnaFHaZePlARz4Fg8tZtmRDUmjaD68CGAwc0rwdwNCkWizLYpnyVcs2g==} + metro-resolver@0.82.4: + resolution: {integrity: sha512-uWoHzOBGQTPT5PjippB8rRT3iI9CTgFA9tRiLMzrseA5o7YAlgvfTdY9vFk2qyk3lW3aQfFKWkmqENryPRpu+Q==} engines: {node: '>=18.18'} - metro-runtime@0.82.5: - resolution: {integrity: sha512-rQZDoCUf7k4Broyw3Ixxlq5ieIPiR1ULONdpcYpbJQ6yQ5GGEyYjtkztGD+OhHlw81LCR2SUAoPvtTus2WDK5g==} + metro-runtime@0.82.4: + resolution: {integrity: sha512-vVyFO7H+eLXRV2E7YAUYA7aMGBECGagqxmFvC2hmErS7oq90BbPVENfAHbUWq1vWH+MRiivoRxdxlN8gBoF/dw==} engines: {node: '>=18.18'} - metro-source-map@0.82.5: - resolution: {integrity: sha512-wH+awTOQJVkbhn2SKyaw+0cd+RVSCZ3sHVgyqJFQXIee/yLs3dZqKjjeKKhhVeudgjXo7aE/vSu/zVfcQEcUfw==} + metro-source-map@0.82.4: + resolution: {integrity: sha512-9jzDQJ0FPas1FuQFtwmBHsez2BfhFNufMowbOMeG3ZaFvzeziE8A0aJwILDS3U+V5039ssCQFiQeqDgENWvquA==} engines: {node: '>=18.18'} - metro-symbolicate@0.82.5: - resolution: {integrity: sha512-1u+07gzrvYDJ/oNXuOG1EXSvXZka/0JSW1q2EYBWerVKMOhvv9JzDGyzmuV7hHbF2Hg3T3S2uiM36sLz1qKsiw==} + metro-symbolicate@0.82.4: + resolution: {integrity: sha512-LwEwAtdsx7z8rYjxjpLWxuFa2U0J6TS6ljlQM4WAATKa4uzV8unmnRuN2iNBWTmRqgNR77mzmI2vhwD4QSCo+w==} engines: {node: '>=18.18'} hasBin: true - metro-transform-plugins@0.82.5: - resolution: {integrity: sha512-57Bqf3rgq9nPqLrT2d9kf/2WVieTFqsQ6qWHpEng5naIUtc/Iiw9+0bfLLWSAw0GH40iJ4yMjFcFJDtNSYynMA==} + metro-transform-plugins@0.82.4: + resolution: {integrity: sha512-NoWQRPHupVpnDgYguiEcm7YwDhnqW02iWWQjO2O8NsNP09rEMSq99nPjARWfukN7+KDh6YjLvTIN20mj3dk9kw==} engines: {node: '>=18.18'} - metro-transform-worker@0.82.5: - resolution: {integrity: sha512-mx0grhAX7xe+XUQH6qoHHlWedI8fhSpDGsfga7CpkO9Lk9W+aPitNtJWNGrW8PfjKEWbT9Uz9O50dkI8bJqigw==} + metro-transform-worker@0.82.4: + resolution: {integrity: sha512-kPI7Ad/tdAnI9PY4T+2H0cdgGeSWWdiPRKuytI806UcN4VhFL6OmYa19/4abYVYF+Cd2jo57CDuwbaxRfmXDhw==} engines: {node: '>=18.18'} - metro@0.82.5: - resolution: {integrity: sha512-8oAXxL7do8QckID/WZEKaIFuQJFUTLzfVcC48ghkHhNK2RGuQq8Xvf4AVd+TUA0SZtX0q8TGNXZ/eba1ckeGCg==} + metro@0.82.4: + resolution: {integrity: sha512-/gFmw3ux9CPG5WUmygY35hpyno28zi/7OUn6+OFfbweA8l0B+PPqXXLr0/T6cf5nclCcH0d22o+02fICaShVxw==} engines: {node: '>=18.18'} hasBin: true @@ -8622,6 +9216,10 @@ 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'} @@ -8761,11 +9359,6 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true - mocha@11.7.1: - resolution: {integrity: sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - mocha@4.1.0: resolution: {integrity: sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==} engines: {node: '>= 4.0.0'} @@ -8837,6 +9430,9 @@ packages: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} + napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -8993,6 +9589,10 @@ 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. @@ -9011,8 +9611,8 @@ packages: oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - ob1@0.82.5: - resolution: {integrity: sha512-QyQQ6e66f+Ut/qUVjEce0E/wux5nAGLXYZDn1jr15JWstHsCH3l6VVrg8NKDptW9NEiBXKOJeGF/ydxeSDF3IQ==} + ob1@0.82.4: + resolution: {integrity: sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA==} engines: {node: '>=18.18'} object-assign@4.1.1: @@ -9107,6 +9707,10 @@ 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'} @@ -9156,6 +9760,14 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + ox@0.9.3: + resolution: {integrity: sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg==} + peerDependencies: + typescript: ^5.8.3 + peerDependenciesMeta: + typescript: + optional: true + p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} @@ -9291,6 +9903,10 @@ packages: 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==} @@ -9349,6 +9965,10 @@ 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==} @@ -9386,6 +10006,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -9455,6 +10078,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} @@ -9794,8 +10421,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-devtools-core@6.1.5: - resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + react-devtools-core@6.1.2: + resolution: {integrity: sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -9994,6 +10621,10 @@ 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'} @@ -10477,6 +11108,10 @@ 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 @@ -10491,11 +11126,20 @@ 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==} + hasBin: true + solhint@6.0.1: resolution: {integrity: sha512-Lew5nhmkXqHPybzBzkMzvvWkpOJSSLTkfTZwRriWvfR2naS4YW2PsjVGaoX9tZFmHh7SuS+e2GEGo5FPYYmJ8g==} hasBin: true @@ -10509,6 +11153,11 @@ packages: peerDependencies: hardhat: ^2.11.0 + solidity-docgen@0.6.0-beta.36: + resolution: {integrity: sha512-f/I5G2iJgU1h0XrrjRD0hHMr7C10u276vYvm//rw1TzFcYQ4xTOyAoi9oNAHRU0JU4mY9eTuxdVc2zahdMuhaQ==} + peerDependencies: + hardhat: ^2.8.0 + solium-plugin-security@0.1.1: resolution: {integrity: sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==} peerDependencies: @@ -10592,6 +11241,9 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + 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'} @@ -10729,6 +11381,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'} @@ -10827,8 +11483,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.41.0: + resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} engines: {node: '>=10'} hasBin: true @@ -11010,6 +11666,13 @@ packages: '@swc/wasm': optional: true + ts-node@8.10.2: + resolution: {integrity: sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==} + engines: {node: '>=6.0.0'} + hasBin: true + peerDependencies: + typescript: ^5.8.3 + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -11197,9 +11860,6 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -11316,6 +11976,9 @@ 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'} @@ -11367,6 +12030,14 @@ 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==} + peerDependencies: + typescript: ^5.8.3 + peerDependenciesMeta: + typescript: + optional: true + vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} @@ -11405,10 +12076,18 @@ 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'} @@ -11457,6 +12136,10 @@ 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'} @@ -11465,6 +12148,14 @@ 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'} @@ -11566,9 +12257,6 @@ packages: workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - workerpool@9.3.3: - resolution: {integrity: sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==} - wrap-ansi@2.1.0: resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} engines: {node: '>=0.10.0'} @@ -11689,8 +12377,8 @@ packages: utf-8-validate: optional: true - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11828,6 +12516,8 @@ snapshots: '@adraffy/ens-normalize@1.10.1': {} + '@adraffy/ens-normalize@1.11.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -11885,7 +12575,7 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.887.0 tslib: 2.8.1 '@aws-crypto/sha256-browser@5.2.0': @@ -11893,8 +12583,8 @@ 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.862.0 - '@aws-sdk/util-locate-window': 3.804.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-locate-window': 3.873.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -11907,7 +12597,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.887.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -11922,299 +12612,301 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.887.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-lambda@3.865.0': + '@aws-sdk/client-lambda@3.891.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.864.0 - '@aws-sdk/credential-provider-node': 3.864.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.864.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.864.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/eventstream-serde-browser': 4.0.5 - '@smithy/eventstream-serde-config-resolver': 4.1.3 - '@smithy/eventstream-serde-node': 4.0.5 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.7 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/credential-provider-node': 3.891.0 + '@aws-sdk/middleware-host-header': 3.891.0 + '@aws-sdk/middleware-logger': 3.891.0 + '@aws-sdk/middleware-recursion-detection': 3.891.0 + '@aws-sdk/middleware-user-agent': 3.891.0 + '@aws-sdk/region-config-resolver': 3.890.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.891.0 + '@aws-sdk/util-user-agent-browser': 3.887.0 + '@aws-sdk/util-user-agent-node': 3.891.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/core': 3.11.1 + '@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.3 + '@smithy/middleware-retry': 4.2.4 + '@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.3 + '@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.3 + '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-endpoints': 3.1.2 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@smithy/util-stream': 4.3.2 + '@smithy/util-utf8': 4.1.0 + '@smithy/util-waiter': 4.1.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.864.0': + '@aws-sdk/client-sso@3.891.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.864.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.864.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.864.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/middleware-host-header': 3.891.0 + '@aws-sdk/middleware-logger': 3.891.0 + '@aws-sdk/middleware-recursion-detection': 3.891.0 + '@aws-sdk/middleware-user-agent': 3.891.0 + '@aws-sdk/region-config-resolver': 3.890.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.891.0 + '@aws-sdk/util-user-agent-browser': 3.887.0 + '@aws-sdk/util-user-agent-node': 3.891.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/core': 3.11.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.3 + '@smithy/middleware-retry': 4.2.4 + '@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.3 + '@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.3 + '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-endpoints': 3.1.2 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.864.0': - dependencies: - '@aws-sdk/types': 3.862.0 - '@aws-sdk/xml-builder': 3.862.0 - '@smithy/core': 3.8.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core@3.890.0': + dependencies: + '@aws-sdk/types': 3.887.0 + '@aws-sdk/xml-builder': 3.887.0 + '@smithy/core': 3.11.1 + '@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.3 + '@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 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.864.0': + '@aws-sdk/credential-provider-env@3.890.0': dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/types': 3.887.0 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.864.0': - dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/node-http-handler': 4.1.1 - '@smithy/property-provider': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-stream': 4.2.4 + '@aws-sdk/credential-provider-http@3.890.0': + dependencies: + '@aws-sdk/core': 3.890.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.3 + '@smithy/types': 4.5.0 + '@smithy/util-stream': 4.3.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.864.0': - dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/credential-provider-env': 3.864.0 - '@aws-sdk/credential-provider-http': 3.864.0 - '@aws-sdk/credential-provider-process': 3.864.0 - '@aws-sdk/credential-provider-sso': 3.864.0 - '@aws-sdk/credential-provider-web-identity': 3.864.0 - '@aws-sdk/nested-clients': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/credential-provider-ini@3.891.0': + dependencies: + '@aws-sdk/core': 3.890.0 + '@aws-sdk/credential-provider-env': 3.890.0 + '@aws-sdk/credential-provider-http': 3.890.0 + '@aws-sdk/credential-provider-process': 3.890.0 + '@aws-sdk/credential-provider-sso': 3.891.0 + '@aws-sdk/credential-provider-web-identity': 3.891.0 + '@aws-sdk/nested-clients': 3.891.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 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.864.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.864.0 - '@aws-sdk/credential-provider-http': 3.864.0 - '@aws-sdk/credential-provider-ini': 3.864.0 - '@aws-sdk/credential-provider-process': 3.864.0 - '@aws-sdk/credential-provider-sso': 3.864.0 - '@aws-sdk/credential-provider-web-identity': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/credential-provider-node@3.891.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.890.0 + '@aws-sdk/credential-provider-http': 3.890.0 + '@aws-sdk/credential-provider-ini': 3.891.0 + '@aws-sdk/credential-provider-process': 3.890.0 + '@aws-sdk/credential-provider-sso': 3.891.0 + '@aws-sdk/credential-provider-web-identity': 3.891.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 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.864.0': + '@aws-sdk/credential-provider-process@3.890.0': dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.890.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 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.864.0': + '@aws-sdk/credential-provider-sso@3.891.0': dependencies: - '@aws-sdk/client-sso': 3.864.0 - '@aws-sdk/core': 3.864.0 - '@aws-sdk/token-providers': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/client-sso': 3.891.0 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/token-providers': 3.891.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 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.864.0': + '@aws-sdk/credential-provider-web-identity@3.891.0': dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/nested-clients': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/nested-clients': 3.891.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 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.862.0': + '@aws-sdk/middleware-host-header@3.891.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.887.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.862.0': + '@aws-sdk/middleware-logger@3.891.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.887.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.862.0': + '@aws-sdk/middleware-recursion-detection@3.891.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.887.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.864.0': + '@aws-sdk/middleware-user-agent@3.891.0': dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@smithy/core': 3.8.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.891.0 + '@smithy/core': 3.11.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.864.0': + '@aws-sdk/nested-clients@3.891.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.864.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.864.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.864.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/middleware-host-header': 3.891.0 + '@aws-sdk/middleware-logger': 3.891.0 + '@aws-sdk/middleware-recursion-detection': 3.891.0 + '@aws-sdk/middleware-user-agent': 3.891.0 + '@aws-sdk/region-config-resolver': 3.890.0 + '@aws-sdk/types': 3.887.0 + '@aws-sdk/util-endpoints': 3.891.0 + '@aws-sdk/util-user-agent-browser': 3.887.0 + '@aws-sdk/util-user-agent-node': 3.891.0 + '@smithy/config-resolver': 4.2.2 + '@smithy/core': 3.11.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.3 + '@smithy/middleware-retry': 4.2.4 + '@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.3 + '@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.3 + '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-endpoints': 3.1.2 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.862.0': + '@aws-sdk/region-config-resolver@3.890.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 + '@aws-sdk/types': 3.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 tslib: 2.8.1 - '@aws-sdk/token-providers@3.864.0': + '@aws-sdk/token-providers@3.891.0': dependencies: - '@aws-sdk/core': 3.864.0 - '@aws-sdk/nested-clients': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.890.0 + '@aws-sdk/nested-clients': 3.891.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 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -12224,47 +12916,49 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/types@3.862.0': + '@aws-sdk/types@3.887.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.862.0': + '@aws-sdk/util-endpoints@3.891.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-endpoints': 3.0.7 + '@aws-sdk/types': 3.887.0 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 + '@smithy/util-endpoints': 3.1.2 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.804.0': + '@aws-sdk/util-locate-window@3.873.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.862.0': + '@aws-sdk/util-user-agent-browser@3.887.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 - bowser: 2.12.0 + '@aws-sdk/types': 3.887.0 + '@smithy/types': 4.5.0 + bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.864.0': + '@aws-sdk/util-user-agent-node@3.891.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.864.0 - '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 + '@aws-sdk/middleware-user-agent': 3.891.0 + '@aws-sdk/types': 3.887.0 + '@smithy/node-config-provider': 4.2.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.862.0': + '@aws-sdk/xml-builder@3.887.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 + '@aws/lambda-invoke-store@0.0.1': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -12301,14 +12995,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/generator@7.28.0': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.27.6 @@ -12334,8 +13020,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.27.4 @@ -12396,10 +13080,6 @@ snapshots: dependencies: '@babel/types': 7.27.6 - '@babel/parser@7.28.0': - dependencies: - '@babel/types': 7.28.2 - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -12640,8 +13320,6 @@ snapshots: '@babel/runtime@7.27.6': {} - '@babel/runtime@7.28.2': {} - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -12660,28 +13338,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.1(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color - '@babel/types@7.27.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.2': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@bytecodealliance/preview2-shim@0.17.0': {} '@bytecodealliance/preview2-shim@0.17.2': {} @@ -12848,11 +13509,11 @@ snapshots: - '@swc/core' - '@swc/wasm' - '@commitlint/cli@19.8.1(@types/node@20.19.9)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@20.17.58)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@20.19.9)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@20.17.58)(typescript@5.8.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -12938,10 +13599,10 @@ snapshots: '@commitlint/execute-rule': 16.2.1 '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 - '@types/node': 20.19.9 + '@types/node': 20.17.58 chalk: 4.1.2 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2(@types/node@20.19.9)(cosmiconfig@7.1.0)(typescript@5.8.3) + cosmiconfig-typescript-loader: 2.0.2(@types/node@20.17.58)(cosmiconfig@7.1.0)(typescript@5.8.3) lodash: 4.17.21 resolve-from: 5.0.0 typescript: 5.8.3 @@ -12949,7 +13610,7 @@ snapshots: - '@swc/core' - '@swc/wasm' - '@commitlint/load@19.8.1(@types/node@20.19.9)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@20.17.58)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -12957,7 +13618,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.4.1 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@20.19.9)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@20.17.58)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -13060,6 +13721,16 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 + '@defi-wonderland/natspec-smells@1.1.6(typescript@5.8.3)(zod@3.25.51)': + dependencies: + fast-glob: 3.3.2 + solc-typed-ast: 18.2.4(typescript@5.8.3)(zod@3.25.51) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 @@ -13104,54 +13775,137 @@ snapshots: '@ensdomains/resolver@0.2.4': {} - '@envelop/core@3.0.6': - dependencies: - '@envelop/types': 3.0.2 - tslib: 2.8.1 + '@envelop/core@3.0.6': + dependencies: + '@envelop/types': 3.0.2 + tslib: 2.8.1 + + '@envelop/core@5.2.3': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@envelop/types': 5.2.1 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/extended-validation@2.0.6(@envelop/core@3.0.6)(graphql@16.11.0)': + dependencies: + '@envelop/core': 3.0.6 + '@graphql-tools/utils': 8.13.1(graphql@16.11.0) + graphql: 16.11.0 + tslib: 2.8.1 + + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/types@3.0.2': + dependencies: + tslib: 2.8.1 + + '@envelop/types@5.2.1': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@envelop/validation-cache@5.1.3(@envelop/core@3.0.6)(graphql@16.11.0)': + dependencies: + '@envelop/core': 3.0.6 + graphql: 16.11.0 + hash-it: 6.0.0 + lru-cache: 6.0.0 + tslib: 2.8.1 + + '@es-joy/jsdoccomment@0.50.2': + dependencies: + '@types/estree': 1.0.7 + '@typescript-eslint/types': 8.33.1 + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.1.0 + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true - '@envelop/core@5.2.3': - dependencies: - '@envelop/instrumentation': 1.0.0 - '@envelop/types': 5.2.1 - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@esbuild/openbsd-x64@0.25.10': + optional: true - '@envelop/extended-validation@2.0.6(@envelop/core@3.0.6)(graphql@16.11.0)': - dependencies: - '@envelop/core': 3.0.6 - '@graphql-tools/utils': 8.13.1(graphql@16.11.0) - graphql: 16.11.0 - tslib: 2.8.1 + '@esbuild/openharmony-arm64@0.25.10': + optional: true - '@envelop/instrumentation@1.0.0': - dependencies: - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@esbuild/sunos-x64@0.25.10': + optional: true - '@envelop/types@3.0.2': - dependencies: - tslib: 2.8.1 + '@esbuild/win32-arm64@0.25.10': + optional: true - '@envelop/types@5.2.1': - dependencies: - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@esbuild/win32-ia32@0.25.10': + optional: true - '@envelop/validation-cache@5.1.3(@envelop/core@3.0.6)(graphql@16.11.0)': - dependencies: - '@envelop/core': 3.0.6 - graphql: 16.11.0 - hash-it: 6.0.0 - lru-cache: 6.0.0 - tslib: 2.8.1 + '@esbuild/win32-x64@0.25.10': + optional: true - '@es-joy/jsdoccomment@0.50.2': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: - '@types/estree': 1.0.7 - '@typescript-eslint/types': 8.33.1 - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': dependencies: @@ -13174,6 +13928,20 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1(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 + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -13188,6 +13956,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} @@ -13810,6 +14580,10 @@ snapshots: dependencies: '@ethersproject/logger': 5.8.0 + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks@5.8.0': dependencies: '@ethersproject/logger': 5.8.0 @@ -13892,6 +14666,32 @@ snapshots: - bufferutil - utf-8-validate + '@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/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: + - bufferutil + - utf-8-validate + '@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.8.0 @@ -14162,6 +14962,14 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/web@5.8.0': dependencies: '@ethersproject/base64': 5.8.0 @@ -14415,6 +15223,8 @@ snapshots: - bufferutil - utf-8-validate + '@graphprotocol/contracts@7.2.1': {} + '@graphprotocol/pino-sentry-simple@0.7.1': dependencies: '@sentry/node': 5.30.0 @@ -14424,6 +15234,39 @@ 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.17.58)(typescript@5.8.3))(typescript@5.8.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 + '@ethersproject/experimental': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@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.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: 4.4.1(supports-color@9.4.0) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + inquirer: 8.0.0 + lodash: 4.17.21 + yaml: 1.10.2 + transitivePeerDependencies: + - bufferutil + - encoding + - ibm_db + - mariadb + - mysql2 + - oracledb + - pg-native + - snowflake-sdk + - sqlite3 + - supports-color + - tedious + - ts-node + - typescript + - utf-8-validate + '@graphql-codegen/core@3.1.0(graphql@16.11.0)': dependencies: '@graphql-codegen/plugin-helpers': 4.2.0(graphql@16.11.0) @@ -14613,7 +15456,7 @@ snapshots: tsconfig-paths: 4.2.0 tslib: 2.8.1 typescript: 5.8.3 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - '@babel/core' @@ -15008,10 +15851,10 @@ snapshots: '@types/ws': 8.18.1 '@whatwg-node/fetch': 0.8.8 graphql: 16.11.0 - isomorphic-ws: 5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tslib: 2.8.1 value-or-promise: 1.0.12 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/node' - bufferutil @@ -15100,10 +15943,20 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1(supports-color@9.4.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/momoa@2.0.4': {} + '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -15137,14 +15990,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.9 + '@types/node': 20.17.58 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.9 + '@types/node': 20.17.58 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -15157,7 +16010,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -15178,15 +16031,10 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.12': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -15197,25 +16045,18 @@ snapshots: '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.10': + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.29': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -15296,7 +16137,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.27.6 - '@types/node': 20.19.9 + '@types/node': 20.17.58 find-up: 4.1.0 fs-extra: 8.1.0 @@ -15309,6 +16150,8 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@noble/ciphers@1.3.0': {} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 @@ -15321,6 +16164,10 @@ snapshots: dependencies: '@noble/hashes': 1.7.2 + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} @@ -15400,22 +16247,62 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ordinal: 1.0.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ordinal: 1.0.3 + + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@9.4.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.1(supports-color@9.4.0) + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.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@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -15429,37 +16316,75 @@ snapshots: transitivePeerDependencies: - supports-color - '@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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.1(supports-color@9.4.0) + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.1(supports-color@9.4.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + picocolors: 1.1.1 + + '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + + '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) + fs-extra: 10.1.0 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + json5: 2.2.3 + prompts: 2.4.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.1(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -15477,39 +16402,104 @@ snapshots: ethereumjs-util: 7.1.5 hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-toolbox@4.0.0(418f442e9ae8e9c553b9d925825153d3)': dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 20.17.58 + chai: 4.5.0 + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-toolbox@4.0.0(639b455d9367db27d2db58403e8352ae)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 20.17.58 + chai: 4.5.0 + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-toolbox@5.0.0(34987977931eb7f67aaf635190f51b0d)': + 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.10 + '@types/node': 20.17.58 + 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.3 + + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + picocolors: 1.1.1 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + transitivePeerDependencies: + - supports-color - '@nomicfoundation/hardhat-toolbox@5.0.0(61d5f017e0083574a1beadf99c37b1b6)': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.14(@nomicfoundation/hardhat-ethers@3.0.9(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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) - '@types/chai': 4.3.20 - '@types/mocha': 10.0.10 - '@types/node': 20.19.9 - 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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + cbor: 8.1.0 + debug: 4.4.1(supports-color@9.4.0) + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + picocolors: 1.1.1 + semver: 6.3.1 + table: 6.9.0 + undici: 5.29.0 + transitivePeerDependencies: + - supports-color - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -15663,6 +16653,8 @@ snapshots: dependencies: '@openzeppelin/contracts': 5.3.0 + '@openzeppelin/contracts@3.4.1': {} + '@openzeppelin/contracts@3.4.2': {} '@openzeppelin/contracts@4.9.6': {} @@ -15694,7 +16686,7 @@ snapshots: '@openzeppelin/defender-sdk-base-client@2.7.0(encoding@0.1.13)': dependencies: - '@aws-sdk/client-lambda': 3.865.0 + '@aws-sdk/client-lambda': 3.891.0 amazon-cognito-identity-js: 6.3.15(encoding@0.1.13) async-retry: 1.3.3 transitivePeerDependencies: @@ -15758,9 +16750,9 @@ snapshots: - encoding - supports-color - '@openzeppelin/hardhat-upgrades@3.9.1(@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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@3.9.1(@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: - '@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.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) @@ -15769,11 +16761,11 @@ snapshots: debug: 4.4.1(supports-color@9.4.0) ethereumjs-util: 7.1.5 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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) proper-lockfile: 4.1.2 undici: 6.21.3 optionalDependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) transitivePeerDependencies: - aws-crt - encoding @@ -15858,9 +16850,9 @@ snapshots: chalk: 4.1.2 debug: 2.6.9 invariant: 2.2.4 - metro: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-config: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.82.5 + metro: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-config: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-core: 0.82.4 semver: 7.7.2 transitivePeerDependencies: - bufferutil @@ -15985,6 +16977,12 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 @@ -15995,6 +16993,11 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@sentry/core@5.30.0': dependencies: '@sentry/hub': 5.30.0 @@ -16062,231 +17065,231 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.0.5': + '@smithy/abort-controller@4.1.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/config-resolver@4.1.5': + '@smithy/config-resolver@4.2.2': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 + '@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 tslib: 2.8.1 - '@smithy/core@3.8.0': + '@smithy/core@3.11.1': dependencies: - '@smithy/middleware-serde': 4.0.9 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 + '@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.2 + '@smithy/util-utf8': 4.1.0 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/credential-provider-imds@4.0.7': + '@smithy/credential-provider-imds@4.1.2': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 + '@smithy/node-config-provider': 4.2.2 + '@smithy/property-provider': 4.1.1 + '@smithy/types': 4.5.0 + '@smithy/url-parser': 4.1.1 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.5': + '@smithy/eventstream-codec@4.1.1': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.2 - '@smithy/util-hex-encoding': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-hex-encoding': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.5': + '@smithy/eventstream-serde-browser@4.1.1': dependencies: - '@smithy/eventstream-serde-universal': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-serde-universal': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.3': + '@smithy/eventstream-serde-config-resolver@4.2.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.5': + '@smithy/eventstream-serde-node@4.1.1': dependencies: - '@smithy/eventstream-serde-universal': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-serde-universal': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.5': + '@smithy/eventstream-serde-universal@4.1.1': dependencies: - '@smithy/eventstream-codec': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-codec': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.1.1': + '@smithy/fetch-http-handler@5.2.1': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/querystring-builder': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 + '@smithy/protocol-http': 5.2.1 + '@smithy/querystring-builder': 4.1.1 + '@smithy/types': 4.5.0 + '@smithy/util-base64': 4.1.0 tslib: 2.8.1 - '@smithy/hash-node@4.0.5': + '@smithy/hash-node@4.1.1': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.5': + '@smithy/invalid-dependency@4.1.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.0.0': + '@smithy/is-array-buffer@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.5': + '@smithy/middleware-content-length@4.1.1': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.18': + '@smithy/middleware-endpoint@4.2.3': dependencies: - '@smithy/core': 3.8.0 - '@smithy/middleware-serde': 4.0.9 - '@smithy/node-config-provider': 4.1.4 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-middleware': 4.0.5 + '@smithy/core': 3.11.1 + '@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 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.19': + '@smithy/middleware-retry@4.2.4': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/service-error-classification': 4.0.7 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 + '@smithy/node-config-provider': 4.2.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/service-error-classification': 4.1.2 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + '@smithy/util-middleware': 4.1.1 + '@smithy/util-retry': 4.1.2 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.9': + '@smithy/middleware-serde@4.1.1': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.5': + '@smithy/middleware-stack@4.1.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.4': + '@smithy/node-config-provider@4.2.2': dependencies: - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.1.1 + '@smithy/shared-ini-file-loader': 4.2.0 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.1.1': + '@smithy/node-http-handler@4.2.1': dependencies: - '@smithy/abort-controller': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/querystring-builder': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/abort-controller': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/querystring-builder': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/property-provider@4.0.5': + '@smithy/property-provider@4.1.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/protocol-http@5.1.3': + '@smithy/protocol-http@5.2.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.5': + '@smithy/querystring-builder@4.1.1': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-uri-escape': 4.0.0 + '@smithy/types': 4.5.0 + '@smithy/util-uri-escape': 4.1.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.5': + '@smithy/querystring-parser@4.1.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.7': + '@smithy/service-error-classification@4.1.2': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 - '@smithy/shared-ini-file-loader@4.0.5': + '@smithy/shared-ini-file-loader@4.2.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/signature-v4@5.1.3': + '@smithy/signature-v4@5.2.1': dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@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 tslib: 2.8.1 - '@smithy/smithy-client@4.4.10': + '@smithy/smithy-client@4.6.3': dependencies: - '@smithy/core': 3.8.0 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-stack': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-stream': 4.2.4 + '@smithy/core': 3.11.1 + '@smithy/middleware-endpoint': 4.2.3 + '@smithy/middleware-stack': 4.1.1 + '@smithy/protocol-http': 5.2.1 + '@smithy/types': 4.5.0 + '@smithy/util-stream': 4.3.2 tslib: 2.8.1 '@smithy/types@4.3.1': dependencies: tslib: 2.8.1 - '@smithy/types@4.3.2': + '@smithy/types@4.5.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.5': + '@smithy/url-parser@4.1.1': dependencies: - '@smithy/querystring-parser': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/querystring-parser': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-base64@4.0.0': + '@smithy/util-base64@4.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-buffer-from': 4.1.0 + '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.0.0': + '@smithy/util-body-length-browser@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.0.0': + '@smithy/util-body-length-node@4.1.0': dependencies: tslib: 2.8.1 @@ -16295,66 +17298,66 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.0.0': + '@smithy/util-buffer-from@4.1.0': dependencies: - '@smithy/is-array-buffer': 4.0.0 + '@smithy/is-array-buffer': 4.1.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.0.0': + '@smithy/util-config-provider@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.26': + '@smithy/util-defaults-mode-browser@4.1.3': dependencies: - '@smithy/property-provider': 4.0.5 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - bowser: 2.12.0 + '@smithy/property-provider': 4.1.1 + '@smithy/smithy-client': 4.6.3 + '@smithy/types': 4.5.0 + bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.26': + '@smithy/util-defaults-mode-node@4.1.3': dependencies: - '@smithy/config-resolver': 4.1.5 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 + '@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.3 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.7': + '@smithy/util-endpoints@3.1.2': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 + '@smithy/node-config-provider': 4.2.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.0.0': + '@smithy/util-hex-encoding@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.5': + '@smithy/util-middleware@4.1.1': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-retry@4.0.7': + '@smithy/util-retry@4.1.2': dependencies: - '@smithy/service-error-classification': 4.0.7 - '@smithy/types': 4.3.2 + '@smithy/service-error-classification': 4.1.2 + '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-stream@4.2.4': + '@smithy/util-stream@4.3.2': dependencies: - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/node-http-handler': 4.1.1 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/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 tslib: 2.8.1 - '@smithy/util-uri-escape@4.0.0': + '@smithy/util-uri-escape@4.1.0': dependencies: tslib: 2.8.1 @@ -16363,15 +17366,15 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': + '@smithy/util-utf8@4.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-buffer-from': 4.1.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.7': + '@smithy/util-waiter@4.1.1': dependencies: - '@smithy/abort-controller': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/abort-controller': 4.1.1 + '@smithy/types': 4.5.0 tslib: 2.8.1 '@solidity-parser/parser@0.14.5': @@ -16469,6 +17472,16 @@ 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.8.3))(typescript@5.8.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) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.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.8.3))(typescript@5.8.3)': dependencies: '@ethersproject/abi': 5.8.0 @@ -16484,6 +17497,14 @@ snapshots: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) typechain: 3.0.0(typescript@5.8.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.8.3))(typescript@5.8.3)': + dependencies: + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + typescript: 5.8.3 + '@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.8.3))(typescript@5.8.3)': dependencies: ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -16512,50 +17533,66 @@ snapshots: hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3) + ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) + fs-extra: 9.1.0 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3))(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3) + ethers: 6.13.7(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))': dependencies: '@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.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) '@types/abstract-leveldown@7.2.5': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.27.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - '@types/babel__traverse@7.28.0': + '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.27.6 '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/bn.js@5.2.0': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/responselike': 1.0.3 optional: true @@ -16567,11 +17604,11 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/debug@4.1.12': dependencies: @@ -16581,12 +17618,12 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/glob@8.1.0': dependencies: @@ -16595,15 +17632,10 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/http-cache-semantics@4.0.4': {} - '@types/inquirer@8.2.11': - dependencies: - '@types/through': 0.0.33 - rxjs: 7.8.2 - '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -16618,11 +17650,15 @@ snapshots: '@types/json5@0.0.29': {} + '@types/json5@2.2.0': + dependencies: + json5: 2.2.3 + '@types/katex@0.16.7': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 optional: true '@types/level-errors@3.0.2': {} @@ -16631,9 +17667,7 @@ snapshots: dependencies: '@types/abstract-leveldown': 7.2.5 '@types/level-errors': 3.0.2 - '@types/node': 20.19.9 - - '@types/lodash@4.17.17': {} + '@types/node': 20.17.58 '@types/lru-cache@5.1.1': {} @@ -16647,7 +17681,7 @@ snapshots: '@types/mkdirp@0.5.2': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/mocha@10.0.10': {} @@ -16657,24 +17691,20 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 form-data: 4.0.3 '@types/node@20.17.58': dependencies: undici-types: 6.19.8 - '@types/node@20.19.9': - 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.9 + '@types/node': 20.17.58 '@types/prettier@2.7.3': {} @@ -16682,16 +17712,16 @@ snapshots: '@types/resolve@0.0.8': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 optional: true '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/sinon-chai@3.2.12': dependencies: @@ -16706,10 +17736,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/through@0.0.33': - dependencies: - '@types/node': 20.19.9 - '@types/triple-beam@1.3.5': {} '@types/unist@2.0.11': {} @@ -16720,7 +17746,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/yargs-parser@21.0.3': {} @@ -16820,6 +17846,8 @@ snapshots: '@typescript-eslint/types': 8.33.1 eslint-visitor-keys: 4.2.0 + '@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) @@ -16843,6 +17871,32 @@ snapshots: graphql: 16.8.0 wonka: 6.3.5 + '@wagmi/cli@2.5.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + abitype: 1.1.0(typescript@5.8.3)(zod@3.25.51) + 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.5.0 + dotenv-expand: 10.0.0 + esbuild: 0.25.10 + escalade: 3.2.0 + fdir: 6.4.5(picomatch@3.0.1) + nanospinner: 1.2.2 + pathe: 1.1.2 + picocolors: 1.1.1 + picomatch: 3.0.1 + prettier: 3.5.3 + viem: 2.37.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + zod: 3.25.51 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@whatwg-node/cookie-store@0.0.1': dependencies: '@whatwg-node/events': 0.0.3 @@ -16915,6 +17969,17 @@ snapshots: abbrev@1.0.9: {} + abitype@0.7.1(typescript@5.8.3)(zod@3.25.51): + dependencies: + typescript: 5.8.3 + optionalDependencies: + zod: 3.25.51 + + abitype@1.1.0(typescript@5.8.3)(zod@3.25.51): + optionalDependencies: + typescript: 5.8.3 + zod: 3.25.51 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -16966,8 +18031,6 @@ snapshots: acorn@8.14.1: {} - acorn@8.15.0: {} - adm-zip@0.4.16: {} aes-js@3.0.0: {} @@ -17478,9 +18541,9 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.27.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 + '@types/babel__traverse': 7.20.7 babel-plugin-syntax-async-functions@6.13.0: {} @@ -17663,7 +18726,7 @@ snapshots: babel-runtime: 6.26.0 babel-types: 6.26.0 - babel-preset-current-node-syntax@1.2.0(@babel/core@7.27.4): + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) @@ -17754,7 +18817,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) babel-register@6.26.0: dependencies: @@ -17885,7 +18948,7 @@ snapshots: bip39@3.0.4: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 create-hash: 1.2.0 pbkdf2: 3.1.2 randombytes: 2.1.0 @@ -17989,7 +19052,7 @@ snapshots: - supports-color optional: true - bowser@2.12.0: {} + bowser@2.12.1: {} boxen@5.1.2: dependencies: @@ -18150,6 +19213,11 @@ snapshots: dependencies: node-gyp-build: 4.8.4 + bundle-require@5.1.0(esbuild@0.25.10): + dependencies: + esbuild: 0.25.10 + load-tsconfig: 0.2.5 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -18167,6 +19235,8 @@ snapshots: bytewise-core: 1.2.3 typewise: 1.0.3 + cac@6.7.14: {} + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.1 @@ -18383,6 +19453,8 @@ snapshots: snake-case: 3.0.4 tslib: 2.8.1 + change-case@5.4.4: {} + character-entities-legacy@1.1.4: {} character-entities-legacy@3.0.0: {} @@ -18434,6 +19506,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.1.2 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -18445,7 +19521,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -18454,7 +19530,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -18784,19 +19860,19 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@2.0.2(@types/node@20.19.9)(cosmiconfig@7.1.0)(typescript@5.8.3): + cosmiconfig-typescript-loader@2.0.2(@types/node@20.17.58)(cosmiconfig@7.1.0)(typescript@5.8.3): dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 cosmiconfig: 7.1.0 - ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - cosmiconfig-typescript-loader@6.1.0(@types/node@20.19.9)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@20.17.58)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.4.2 typescript: 5.8.3 @@ -18999,6 +20075,8 @@ snapshots: decamelize@4.0.0: {} + decimal.js@10.5.0: {} + decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -19019,6 +20097,8 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@0.7.0: {} + deep-eql@4.1.4: dependencies: type-detect: 4.1.0 @@ -19114,6 +20194,8 @@ snapshots: destroy@1.2.0: {} + detect-file@1.0.0: {} + detect-indent@4.0.0: dependencies: repeating: 2.0.1 @@ -19135,8 +20217,6 @@ snapshots: diff@5.2.0: {} - diff@7.0.0: {} - diffie-hellman@5.0.3: dependencies: bn.js: 4.12.2 @@ -19161,6 +20241,10 @@ 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: @@ -19172,6 +20256,8 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv-expand@10.0.0: {} + dotenv@16.5.0: {} dotignore@0.1.2: @@ -19397,6 +20483,35 @@ snapshots: d: 1.0.2 ext: 1.7.0 + esbuild@0.25.10: + optionalDependencies: + '@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: {} escape-html@1.0.3: {} @@ -19502,6 +20617,11 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 @@ -19511,6 +20631,49 @@ snapshots: eslint-visitor-keys@4.2.0: {} + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.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.1(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.28.0(jiti@2.4.2): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) @@ -19566,6 +20729,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 + espree@9.6.1: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 3.4.3 + esprima@2.7.3: {} esprima@4.0.1: {} @@ -20013,6 +21182,42 @@ snapshots: - bufferutil - utf-8-validate + ethers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 @@ -20049,12 +21254,25 @@ 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.17.58 + 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.9 + '@types/node': 20.17.58 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) @@ -20131,6 +21349,18 @@ snapshots: 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 + expand-brackets@0.1.5: dependencies: is-posix-bracket: 0.1.1 @@ -20154,6 +21384,10 @@ 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: @@ -20322,6 +21556,14 @@ 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 @@ -20374,6 +21616,10 @@ snapshots: transitivePeerDependencies: - encoding + fdir@6.4.5(picomatch@3.0.1): + optionalDependencies: + picomatch: 3.0.1 + fdir@6.4.5(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -20403,6 +21649,10 @@ 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 @@ -20513,6 +21763,19 @@ 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 @@ -20532,10 +21795,6 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.11(debug@4.4.1): - optionalDependencies: - debug: 4.4.1(supports-color@9.4.0) - follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: debug: 4.4.1(supports-color@9.4.0) @@ -20613,7 +21872,13 @@ snapshots: path-is-absolute: 1.0.1 rimraf: 2.7.1 - fs-extra@10.1.0: + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -20786,6 +22051,8 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -20906,10 +22173,24 @@ snapshots: 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 @@ -20923,6 +22204,10 @@ snapshots: globals@11.12.0: {} + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globals@14.0.0: {} globals@16.1.0: {} @@ -21120,13 +22405,6 @@ snapshots: hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 - hardhat-contract-sizer@2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.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): dependencies: '@ethersproject/abi': 5.8.0 @@ -21211,18 +22489,6 @@ snapshots: - debug - 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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - sha1: 1.1.1 - transitivePeerDependencies: - - '@codechecks/client' - - bufferutil - - 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -21247,6 +22513,30 @@ snapshots: 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: 4.4.1(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + debug: 4.4.1(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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + prompt-sync: 4.2.0 + transitivePeerDependencies: + - supports-color + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: '@nomicfoundation/hardhat-ethers': 3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) @@ -21259,13 +22549,13 @@ snapshots: transitivePeerDependencies: - supports-color - 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.9)(typescript@5.8.3))(typescript@5.8.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.9)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: - '@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.9)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) debug: 4.4.1(supports-color@9.4.0) enquirer: 2.4.1 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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: @@ -21281,11 +22571,6 @@ snapshots: console-table-printer: 2.14.1 hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - console-table-printer: 2.14.1 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 @@ -21337,13 +22622,15 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.3 + '@nomicfoundation/edr': 0.11.0 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 + '@types/bn.js': 5.2.0 + '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -21379,14 +22666,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.17.58)(typescript@5.8.3) + ts-node: 8.10.2(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -21428,7 +22715,7 @@ 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.9)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bufferutil @@ -21529,15 +22816,15 @@ snapshots: hermes-estree@0.25.1: {} - hermes-estree@0.29.1: {} + hermes-estree@0.28.1: {} hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 - hermes-parser@0.29.1: + hermes-parser@0.28.1: dependencies: - hermes-estree: 0.29.1 + hermes-estree: 0.28.1 hmac-drbg@1.0.1: dependencies: @@ -21550,6 +22837,10 @@ 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: @@ -21599,7 +22890,7 @@ snapshots: http-response-object@3.0.2: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 http-signature@1.2.0: dependencies: @@ -21636,6 +22927,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@5.0.0: {} + husky@7.0.4: {} husky@9.1.7: {} @@ -21950,6 +23243,8 @@ snapshots: is-obj@2.0.0: {} + is-path-inside@3.0.3: {} + is-plain-obj@1.1.0: {} is-plain-obj@2.1.0: {} @@ -21988,6 +23283,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -22073,9 +23370,13 @@ snapshots: dependencies: ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isomorphic-ws@5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) isstream@0.1.2: {} @@ -22084,7 +23385,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.4 - '@babel/parser': 7.28.0 + '@babel/parser': 7.27.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -22106,7 +23407,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.9 + '@types/node': 20.17.58 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -22116,7 +23417,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.19.9 + '@types/node': 20.17.58 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -22143,7 +23444,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.9 + '@types/node': 20.17.58 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -22151,7 +23452,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.9 + '@types/node': 20.17.58 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -22168,7 +23469,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -22204,6 +23505,8 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} + jsel@1.1.6: {} + jsesc@0.5.0: {} jsesc@1.3.0: {} @@ -22543,6 +23846,21 @@ snapshots: transitivePeerDependencies: - enquirer + lint-staged@15.5.2: + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.1(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.0 + transitivePeerDependencies: + - supports-color + lint-staged@16.0.0: dependencies: chalk: 5.4.1 @@ -22588,6 +23906,8 @@ snapshots: pinkie-promise: 2.0.1 strip-bom: 2.0.0 + load-tsconfig@0.2.5: {} + localforage@1.10.0: dependencies: lie: 3.1.1 @@ -22936,50 +24256,50 @@ snapshots: methods@1.1.2: {} - metro-babel-transformer@0.82.5: + metro-babel-transformer@0.82.4: dependencies: '@babel/core': 7.27.4 flow-enums-runtime: 0.0.6 - hermes-parser: 0.29.1 + hermes-parser: 0.28.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.82.5: + metro-cache-key@0.82.4: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.82.5: + metro-cache@0.82.4: dependencies: exponential-backoff: 3.1.2 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.82.5 + metro-core: 0.82.4 transitivePeerDependencies: - supports-color - metro-config@0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-config@0.82.4(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.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-cache: 0.82.5 - metro-core: 0.82.5 - metro-runtime: 0.82.5 + metro: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-cache: 0.82.4 + metro-core: 0.82.4 + metro-runtime: 0.82.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.82.5: + metro-core@0.82.4: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.82.5 + metro-resolver: 0.82.4 - metro-file-map@0.82.5: + metro-file-map@0.82.4: dependencies: debug: 4.4.1(supports-color@9.4.0) fb-watchman: 2.0.2 @@ -22993,86 +24313,86 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.82.5: + metro-minify-terser@0.82.4: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.43.1 + terser: 5.41.0 - metro-resolver@0.82.5: + metro-resolver@0.82.4: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.82.5: + metro-runtime@0.82.4: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.27.6 flow-enums-runtime: 0.0.6 - metro-source-map@0.82.5: + metro-source-map@0.82.4: dependencies: - '@babel/traverse': 7.28.0 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.28.0' - '@babel/types': 7.28.2 + '@babel/traverse': 7.27.4 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.27.4' + '@babel/types': 7.27.6 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.82.5 + metro-symbolicate: 0.82.4 nullthrows: 1.1.1 - ob1: 0.82.5 + ob1: 0.82.4 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.82.5: + metro-symbolicate@0.82.4: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.82.5 + metro-source-map: 0.82.4 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.82.5: + metro-transform-plugins@0.82.4: dependencies: '@babel/core': 7.27.4 - '@babel/generator': 7.28.0 + '@babel/generator': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.27.4 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-transform-worker@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.27.4 - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 flow-enums-runtime: 0.0.6 - metro: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-babel-transformer: 0.82.5 - metro-cache: 0.82.5 - metro-cache-key: 0.82.5 - metro-minify-terser: 0.82.5 - metro-source-map: 0.82.5 - metro-transform-plugins: 0.82.5 + metro: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.82.4 + metro-cache: 0.82.4 + metro-cache-key: 0.82.4 + metro-minify-terser: 0.82.4 + metro-source-map: 0.82.4 + metro-transform-plugins: 0.82.4 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.27.4 - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -23081,24 +24401,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.28.1 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.82.5 - metro-cache: 0.82.5 - metro-cache-key: 0.82.5 - metro-config: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.82.5 - metro-file-map: 0.82.5 - metro-resolver: 0.82.5 - metro-runtime: 0.82.5 - metro-source-map: 0.82.5 - metro-symbolicate: 0.82.5 - metro-transform-plugins: 0.82.5 - metro-transform-worker: 0.82.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.82.4 + metro-cache: 0.82.4 + metro-cache-key: 0.82.4 + metro-config: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + metro-core: 0.82.4 + metro-file-map: 0.82.4 + metro-resolver: 0.82.4 + metro-runtime: 0.82.4 + metro-source-map: 0.82.4 + metro-symbolicate: 0.82.4 + metro-transform-plugins: 0.82.4 + metro-transform-worker: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -23358,6 +24678,8 @@ snapshots: mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} mimic-response@1.0.1: @@ -23506,29 +24828,6 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - mocha@11.7.1: - dependencies: - browser-stdout: 1.3.1 - chokidar: 4.0.3 - debug: 4.4.1(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 10.4.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 9.0.5 - ms: 2.1.3 - picocolors: 1.1.1 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 9.3.3 - yargs: 17.7.2 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 - mocha@4.1.0: dependencies: browser-stdout: 1.3.0 @@ -23638,6 +24937,10 @@ snapshots: transitivePeerDependencies: - supports-color + nanospinner@1.2.2: + dependencies: + picocolors: 1.1.1 + napi-build-utils@1.0.2: optional: true @@ -23800,6 +25103,10 @@ 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 @@ -23819,7 +25126,7 @@ snapshots: oauth-sign@0.9.0: {} - ob1@0.82.5: + ob1@0.82.4: dependencies: flow-enums-runtime: 0.0.6 @@ -23929,6 +25236,10 @@ 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 @@ -23988,6 +25299,21 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + ox@0.9.3(typescript@5.8.3)(zod@3.25.51): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@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.8.3)(zod@3.25.51) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + p-cancelable@1.1.0: optional: true @@ -24143,6 +25469,8 @@ 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: {} @@ -24211,6 +25539,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-root-regex@0.1.2: {} @@ -24244,6 +25574,8 @@ snapshots: path-type@4.0.0: {} + pathe@1.1.2: {} + pathval@1.1.1: {} pbkdf2@3.1.2: @@ -24317,6 +25649,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@3.0.1: {} + picomatch@4.0.2: {} pidtree@0.5.0: {} @@ -24673,7 +26007,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): + react-devtools-core@6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -24715,13 +26049,13 @@ snapshots: invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.82.5 - metro-source-map: 0.82.5 + metro-runtime: 0.82.4 + metro-source-map: 0.82.4 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 react: 19.1.0 - react-devtools-core: 6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) + react-devtools-core: 6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.25.0 @@ -24955,6 +26289,11 @@ 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: {} @@ -25511,6 +26850,23 @@ snapshots: sol-explore@1.6.1: {} + solc-typed-ast@18.2.4(typescript@5.8.3)(zod@3.25.51): + dependencies: + axios: 1.9.0(debug@4.4.1) + commander: 12.1.0 + decimal.js: 10.5.0 + findup-sync: 5.0.0 + fs-extra: 11.3.0 + 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.8.3)(zod@3.25.51) + transitivePeerDependencies: + - debug + - typescript + - zod + solc@0.4.26: dependencies: fs-extra: 0.30.0 @@ -25542,11 +26898,23 @@ snapshots: transitivePeerDependencies: - debug + solc@0.8.25: + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.4.1) + 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.1): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.11(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.1) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -25554,6 +26922,31 @@ snapshots: transitivePeerDependencies: - debug + solhint@5.1.0(typescript@5.8.3): + dependencies: + '@solidity-parser/parser': 0.20.1 + ajv: 6.12.6 + antlr4: 4.13.2 + ast-parents: 0.0.1 + chalk: 4.1.2 + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.8.3) + fast-diff: 1.3.0 + glob: 8.1.0 + ignore: 5.3.2 + js-yaml: 4.1.0 + latest-version: 7.0.0 + 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.5.3 + transitivePeerDependencies: + - typescript + solhint@6.0.1(typescript@5.8.3): dependencies: '@solidity-parser/parser': 0.20.2 @@ -25628,28 +27021,11 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + solidity-docgen@0.6.0-beta.36(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): dependencies: - '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 - chalk: 2.4.2 - death: 1.1.0 - difflib: 0.2.4 - fs-extra: 8.1.0 - 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.9)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - jsonschema: 1.5.0 - lodash: 4.17.21 - mocha: 10.8.2 - node-emoji: 1.11.0 - pify: 4.0.1 - recursive-readdir: 2.2.3 - sc-istanbul: 0.4.6 - semver: 7.7.2 - shelljs: 0.8.5 - web3-utils: 1.10.4 + handlebars: 4.7.8 + hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + solidity-ast: 0.4.60 solium-plugin-security@0.1.1(solium@1.2.5): dependencies: @@ -25758,6 +27134,8 @@ snapshots: sprintf-js@1.1.3: {} + src-location@1.1.0: {} + sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -25908,6 +27286,8 @@ 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 @@ -26058,10 +27438,10 @@ snapshots: term-size@2.2.1: {} - terser@5.43.1: + terser@5.41.0: dependencies: - '@jridgewell/source-map': 0.3.10 - acorn: 8.15.0 + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -26090,7 +27470,7 @@ snapshots: dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 - '@types/node': 20.19.9 + '@types/node': 20.17.58 '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 @@ -26255,22 +27635,13 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.19.9)(typescript@5.8.3): + ts-node@8.10.2(typescript@5.8.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.9 - acorn: 8.14.1 - acorn-walk: 8.3.4 arg: 4.1.3 - create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 + source-map-support: 0.5.21 typescript: 5.8.3 - v8-compile-cache-lib: 3.0.1 yn: 3.1.1 tsconfig-paths@3.15.0: @@ -26463,8 +27834,6 @@ snapshots: undici-types@6.19.8: {} - undici-types@6.21.0: {} - undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 @@ -26584,6 +27953,14 @@ 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: @@ -26619,6 +27996,23 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + viem@2.37.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + 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.8.3)(zod@3.25.51) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.9.3(typescript@5.8.3)(zod@3.25.51) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vlq@1.0.1: {} walker@1.0.8: @@ -26629,7 +28023,7 @@ snapshots: web3-bzz@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 got: 9.6.0 swarm-js: 0.1.42(bufferutil@4.0.9)(utf-8-validate@5.0.10) underscore: 1.9.1 @@ -26682,7 +28076,7 @@ snapshots: web3-core@1.2.11: dependencies: '@types/bn.js': 4.11.6 - '@types/node': 20.19.9 + '@types/node': 20.17.58 bignumber.js: 9.3.0 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -26692,6 +28086,10 @@ 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 @@ -26699,6 +28097,17 @@ snapshots: web3-utils: 1.2.11 optional: true + web3-eth-abi@4.4.1(typescript@5.8.3)(zod@3.25.51): + dependencies: + abitype: 0.7.1(typescript@5.8.3)(zod@3.25.51) + 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 @@ -26754,7 +28163,7 @@ snapshots: web3-eth-personal@1.2.11: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 web3-core: 1.2.11 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -26853,6 +28262,8 @@ snapshots: - supports-color optional: true + web3-types@1.10.0: {} + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 @@ -26876,6 +28287,22 @@ 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.51 + 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) @@ -27010,7 +28437,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 20.19.9 + '@types/node': 20.17.58 wonka@4.0.15: {} @@ -27027,8 +28454,6 @@ snapshots: workerpool@6.5.1: {} - workerpool@9.3.3: {} - wrap-ansi@2.1.0: dependencies: string-width: 1.0.2 @@ -27114,7 +28539,7 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 diff --git a/scripts/bytecode-diff.sh b/scripts/bytecode-diff.sh new file mode 100755 index 000000000..432694526 --- /dev/null +++ b/scripts/bytecode-diff.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +DIR1="$1" +DIR2="$2" + +TMPDIR=$(mktemp -d) + +# Function to extract, strip metadata, and chunk bytecode +process() { + local file="$1" + local out="$2" + + jq -r '.bytecode' "$file" | fold -w 64 > "$out" +} + +# Find all JSON files in DIR1 +find "$DIR1" -type f -name '*.json' ! -name '*dbg.json' ! -name 'I*.json' | while read -r file1; do + # Get relative path + rel_path="${file1#$DIR1/}" + file2="$DIR2/$rel_path" + + if [ ! -f "$file2" ]; then + echo "⚠️ Missing in second dir: $rel_path" + continue + fi + + tmp1="$TMPDIR/1" + tmp2="$TMPDIR/2" + + process "$file1" "$tmp1" + process "$file2" "$tmp2" + + if ! diff -q "$tmp1" "$tmp2" > /dev/null; then + echo "🧨 Difference found in: $rel_path" + if command -v colordiff &> /dev/null; then + colordiff -u "$tmp1" "$tmp2" + else + diff -u "$tmp1" "$tmp2" + fi + echo + fi +done + +rm -rf "$TMPDIR" From cd6d67f7dda9be9dead1d59d4faa3e063a9a530b Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Fri, 19 Sep 2025 13:56:43 +0000 Subject: [PATCH 20/28] chore: add core dump files to .gitignore Add core and core.* patterns to .gitignore to prevent core dump files from being accidentally committed to version control. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b68fcd815..b1c33f5f5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,10 @@ yarn-debug.log* yarn-error.log* node.log +# Core dumps +core +core.* + # Dependency directories node_modules/ .pnpm-store/ From e65b5bbd6f1b917196375364041719bc64a4775b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Thu, 18 Sep 2025 11:59:12 -0300 Subject: [PATCH 21/28] fix: set legacy contracts to zero address in protocol deployment mode for subgraph service MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- .../subgraph-service/ignition/configs/protocol.default.json5 | 5 +++++ .../ignition/configs/protocol.localNetwork.json5 | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/subgraph-service/ignition/configs/protocol.default.json5 b/packages/subgraph-service/ignition/configs/protocol.default.json5 index 77b2ac66e..aedf53531 100644 --- a/packages/subgraph-service/ignition/configs/protocol.default.json5 +++ b/packages/subgraph-service/ignition/configs/protocol.default.json5 @@ -13,6 +13,11 @@ "gnsImplementationAddress": "", "subgraphNFTAddress": "", + // These do not exist in the protocol deployment, but are needed by ignition modules + // so we set them to 0x00...00 + "legacyDisputeManagerAddress": "0x0000000000000000000000000000000000000000", + "legacyServiceRegistryAddress": "0x0000000000000000000000000000000000000000", + // Must be set for step 2 of the deployment "disputeManagerProxyAddress": "", "disputeManagerProxyAdminAddress": "", diff --git a/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 index bafa504cc..1b35b18c1 100644 --- a/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 +++ b/packages/subgraph-service/ignition/configs/protocol.localNetwork.json5 @@ -13,6 +13,11 @@ "gnsImplementationAddress": "", "subgraphNFTAddress": "", + // These do not exist in the protocol deployment, but are needed by ignition modules + // so we set them to 0x00...00 + "legacyDisputeManagerAddress": "0x0000000000000000000000000000000000000000", + "legacyServiceRegistryAddress": "0x0000000000000000000000000000000000000000", + // Must be set for step 2 of the deployment "disputeManagerProxyAddress": "", "disputeManagerProxyAdminAddress": "", From 3df30716ac0c7abc821459b5f68616815ff867d3 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Fri, 19 Sep 2025 18:54:40 +0000 Subject: [PATCH 22/28] chore: tmp pr planning docs --- .../planning/pr3-lint-infrastructure-guide.md | 196 ++++++++++++++ docs/planning/pr4-lint-fixes-guide.md | 239 ++++++++++++++++++ docs/planning/worktree-workflow.md | 106 ++++++++ 3 files changed, 541 insertions(+) create mode 100644 docs/planning/pr3-lint-infrastructure-guide.md create mode 100644 docs/planning/pr4-lint-fixes-guide.md create mode 100644 docs/planning/worktree-workflow.md diff --git a/docs/planning/pr3-lint-infrastructure-guide.md b/docs/planning/pr3-lint-infrastructure-guide.md new file mode 100644 index 000000000..4bc685f88 --- /dev/null +++ b/docs/planning/pr3-lint-infrastructure-guide.md @@ -0,0 +1,196 @@ +# PR 3: Build & Lint Infrastructure - Implementation Guide + +## Objective + +Update linting and build infrastructure configuration without changing any actual code. + +## Files to Add/Modify + +### 1. eslint.config.mjs + +- Migrate to flat config format (ESLint v9) +- Add necessary plugins and rules +- This file should already exist in rewards-eligibility-oracle branch + +### 2. .markdownlint.json + +### 3. .markdownlintignore + +Create to exclude generated/third-party files: + +``` +node_modules/ +**/lib/ +**/build/ +**/dist/ +.changeset/ +``` + +### 4. CLAUDE.md + +Documentation file for Claude Code context - copy from current branch + +### 5. package.json updates + +Update lint scripts if needed (check differences between branches) + +## Implementation Steps + +1. **Create worktree:** + + ```bash + git worktree add ../c.reo-pr3-lint-infra -b pr/lint-infrastructure origin/main + cd ../c.reo-pr3-lint-infra + ``` + +2. **Copy configuration files:** + + ```bash + # Copy ESLint config + cp /work/c.reo/eslint.config.mjs . + + # Copy markdownlint config + cp /work/c.reo/.markdownlint.json . + cp /work/c.reo/.markdownlintignore . + + # Copy CLAUDE.md + cp /work/c.reo/CLAUDE.md . + + # Check if prettierignore needs updates + diff .prettierignore /work/c.reo/.prettierignore + # If different, copy it too + cp /work/c.reo/.prettierignore . + ``` + +3. **Check package.json for script updates:** + + ```bash + # Compare lint scripts + diff -u package.json /work/c.reo/package.json | grep -A2 -B2 '"lint' + + # Key changes to look for: + # - "lint:natspec" vs "lint:sol" script names + # - Script command updates + # - New script additions + ``` + +4. **Ensure configs work with current code:** + + ```bash + # Install dependencies + pnpm install + + # Test each lint command (expect some failures - we're just adding configs) + pnpm lint:ts --max-warnings=0 || true + pnpm lint:md || true + + # The goal is configs load without errors, not that code passes lint + ``` + +5. **Remove any code changes:** + + ```bash + # This PR should ONLY have config files + git status + # Should only show: + # - eslint.config.mjs + # - .markdownlint.json + # - .markdownlintignore + # - CLAUDE.md + # - possibly package.json (scripts only) + # - possibly .prettierignore + ``` + +6. **Commit changes:** + + ```bash + git add eslint.config.mjs .markdownlint.json .markdownlintignore CLAUDE.md + # Add package.json if scripts were updated + git add package.json # if needed + + git commit -m "chore: update lint and build infrastructure + + - Migrate to ESLint flat config format + - Add markdownlint configuration + - Add CLAUDE.md for AI assistant context + - Update lint scripts in package.json + + Note: This PR only adds/updates configuration files. + Actual lint fixes will come in a follow-up PR." + ``` + +7. **Create PR:** + + ```bash + git push origin pr/lint-infrastructure + + gh pr create \ + --base main \ + --head pr/lint-infrastructure \ + --title "chore: update lint and build infrastructure" \ + --body "## Summary + + Updates linting and build tool configurations to latest standards. + + ## Changes + - Migrate to ESLint v9 flat config format + - Add markdownlint configuration and ignore file + - Add CLAUDE.md documentation for AI assistance + - Update lint scripts in package.json (if needed) + + ## Important Notes + - **This PR contains NO code changes**, only configuration files + - Lint errors are expected - fixes come in PR #4 + - Configs are tested to load without errors + + ## Testing + - [x] ESLint config loads successfully + - [x] Markdownlint config loads successfully + - [x] Build still works with new configs + + ## Follow-up + PR #4 will apply all auto-fixable lint corrections" + ``` + +## Configuration Details + +### ESLint Flat Config + +The new eslint.config.mjs should: + +- Use @eslint/js base config +- Include TypeScript support +- Configure import sorting +- Set up prettier integration + +### Markdownlint Rules + +Key rules we're setting: + +- MD004: Use dashes for unordered lists +- MD007: 2-space indent for lists +- MD013: Disable line length limit +- MD033: Allow HTML in markdown + +## Verification Checklist + +- [ ] Only configuration files changed (no .ts, .js, .sol files) +- [ ] eslint.config.mjs is valid syntax +- [ ] markdownlint config is valid JSON +- [ ] Package.json only has script changes (if any) +- [ ] No node_modules or lock file changes +- [ ] Configs load without syntax errors + +## What NOT to Include + +- Any source code changes (.ts, .js, .sol files) +- Dependency updates (unless absolutely required for configs) +- Lock file changes +- Any auto-fixes or formatting changes + +## Notes + +- This PR sets the stage for PR #4 (lint fixes) +- Keep this PR minimal - just configs +- Some lint commands may fail - that's expected +- Goal is configuration setup, not compliance diff --git a/docs/planning/pr4-lint-fixes-guide.md b/docs/planning/pr4-lint-fixes-guide.md new file mode 100644 index 000000000..bd5f35e65 --- /dev/null +++ b/docs/planning/pr4-lint-fixes-guide.md @@ -0,0 +1,239 @@ +# PR 4: Pure Lint Fixes - Implementation Guide + +## Objective + +Apply all automatic lint fixes to the codebase without any manual code changes. This is a mechanical PR that only contains auto-formatting. + +## Prerequisites + +- PR #3 must be merged first (or cherry-picked into this branch) +- This PR will touch many files but with zero logic changes + +## Implementation Steps + +1. **Create worktree:** + + ```bash + git worktree add ../c.reo-pr4-lint-fixes -b pr/lint-fixes origin/main + cd ../c.reo-pr4-lint-fixes + ``` + +2. **Ensure PR #3 changes are included:** + + ```bash + # If PR #3 is merged: + git pull origin main + + # If PR #3 is not yet merged: + git fetch origin + git merge origin/pr/lint-infrastructure + # or cherry-pick the config commits + ``` + +3. **Install dependencies:** + + ```bash + pnpm install + ``` + +4. **Run all auto-fixes:** + + ```bash + # Run each lint command with auto-fix + pnpm lint:ts # ESLint + Prettier for TS/JS files + pnpm lint:sol # Solhint + Prettier for Solidity + pnpm lint:md # Markdownlint + Prettier for Markdown + pnpm lint:json # Prettier for JSON + pnpm lint:yaml # Prettier for YAML + + # Or if there's a combined command: + pnpm lint + ``` + +5. **Verify changes are only formatting:** + + ```bash + # Check what changed + git diff --stat + + # Spot-check some files to ensure only formatting changed + git diff packages/contracts/contracts/governance/Governed.sol + git diff packages/horizon/contracts/Horizon.sol + + # Look for: + # - Whitespace changes + # - Import reordering + # - Semicolon additions + # - Quote style changes + # - Indentation fixes + # + # Should NOT see: + # - Logic changes + # - Variable renames + # - Function modifications + ``` + +6. **Run tests to ensure nothing broke:** + + ```bash + # Build everything + pnpm build + + # Run tests + pnpm test + ``` + +7. **Commit in logical chunks (optional):** + + ```bash + # Option A: Single commit for everything + git add -A + git commit -m "style: apply automated lint fixes across codebase + + Applied auto-fixes from: + - ESLint (import ordering, semicolons) + - Prettier (formatting, indentation) + - Markdownlint (markdown formatting) + - Solhint (Solidity style) + + No logic changes - purely mechanical formatting." + + # Option B: Separate commits by file type + git add "**/*.ts" "**/*.js" "**/*.tsx" "**/*.jsx" + git commit -m "style: apply lint fixes to TypeScript/JavaScript files" + + git add "**/*.sol" + git commit -m "style: apply lint fixes to Solidity files" + + git add "**/*.md" + git commit -m "style: apply lint fixes to Markdown files" + + git add -A + git commit -m "style: apply lint fixes to remaining files (JSON, YAML)" + ``` + +8. **Create PR:** + + ```bash + git push origin pr/lint-fixes + + gh pr create \ + --base main \ + --head pr/lint-fixes \ + --title "style: apply automated lint fixes" \ + --body "## Summary + + Applies all automated lint fixes across the codebase. Zero logic changes. + + ## Changes (all automatic) + - Import statement ordering + - Whitespace and indentation + - Semicolon consistency + - Quote style consistency + - Markdown formatting + - JSON/YAML formatting + + ## Verification + - [x] All changes are from auto-fix tools + - [x] No manual code modifications + - [x] Build succeeds + - [x] Tests pass + - [x] Zero logic changes + + ## File Count + - Files changed: ~XXX + - Insertions: +XXX + - Deletions: -XXX + + ## Review Guidance + This PR is large but mechanical. Recommended review approach: + 1. Spot-check a few files to verify formatting-only changes + 2. Verify CI passes + 3. Trust the tooling + + ## Dependencies + - Requires PR #3 (lint infrastructure) to be merged first" + ``` + +## Expected Changes + +### TypeScript/JavaScript + +- Import statements reordered (alphabetically or by type) +- Trailing commas added/removed +- Semicolons added consistently +- Quote style unified (' vs ") +- Indentation fixed + +### Solidity + +- Indentation fixes +- Bracket positioning +- Import ordering +- Event/error positioning + +### Markdown + +- List indentation (2 spaces) +- Trailing spaces removed +- Blank lines normalized +- List markers unified (- vs \*) + +### JSON/YAML + +- Indentation (2 spaces) +- Trailing commas +- Property ordering (in package.json) + +## Verification Checklist + +- [ ] PR #3 configs are present +- [ ] Only auto-fix commands were run +- [ ] No manual edits were made +- [ ] git diff shows only formatting +- [ ] Build completes successfully +- [ ] Tests pass +- [ ] No logic changes visible in diff + +## What to Watch For + +### Good (expected) + +```diff +- import {ContractB} from "./ContractB" +- import {ContractA} from "./ContractA" ++ import {ContractA} from "./ContractA"; ++ import {ContractB} from "./ContractB"; +``` + +### Bad (should not see) + +```diff +- function calculate(value) { ++ function compute(amount) { +``` + +## Tips + +1. **Use git diff -w** to ignore whitespace and see if any real changes exist +2. **Review in GitHub** with "Hide whitespace changes" option enabled +3. **If unsure**, reset and re-run only the auto-fix commands +4. **Large PR is OK** - reviewers know it's mechanical + +## Rollback Plan + +If issues found after merge: + +```bash +git revert HEAD +# Fix specific issues +# Re-run lint fixes +git push +``` + +## Notes + +- This PR intentionally has a large file count +- All changes are reversible +- Sets clean baseline for future development +- After this PR, all new code will follow consistent style diff --git a/docs/planning/worktree-workflow.md b/docs/planning/worktree-workflow.md new file mode 100644 index 000000000..1a8f6c8c7 --- /dev/null +++ b/docs/planning/worktree-workflow.md @@ -0,0 +1,106 @@ +# Git Worktree Workflow for Incremental PRs + +## Overview + +Using git worktrees allows working on multiple PRs simultaneously without constantly switching branches in a single checkout. This is especially beneficial when using dev containers, as each worktree can have its own container instance with isolated node_modules and build artifacts. + +## Current Setup + +- Main repository: `/work/c.reo` (current location) +- Current branch: `rewards-eligibility-oracle` +- Target branch: `main` + +## Recommended Worktree Structure + +``` +/work/ +├── c.reo/ # Main checkout (rewards-eligibility-oracle branch) +├── c.lint-config/ # Worktree for PR 3 (lint infrastructure) +└── c.lint-fixes/ # Worktree for PR 4 (lint fixes) +``` + +## Step-by-Step Workflow + +### Initial Setup (from main checkout) + +```bash +# Ensure main is up to date +git fetch origin main + +# Create worktrees for each PR +git worktree add ../c.reo-pr3-lint-infra -b pr/lint-infrastructure origin/main +git worktree add ../c.reo-pr4-lint-fixes -b pr/lint-fixes origin/main +``` + +### Working on Each PR + +#### PR 3: Lint Infrastructure + +```bash +cd /work/c.reo-pr3-lint-infra + +# Copy configuration files +cp /work/c.reo/eslint.config.mjs . +cp /work/c.reo/.markdownlint.json . +cp /work/c.reo/.markdownlintignore . +cp /work/c.reo/CLAUDE.md . + +# Update package.json scripts if needed +# Review changes + +git add -A +git commit -m "chore: update lint and build infrastructure" +git push origin pr/lint-infrastructure +``` + +#### PR 4: Lint Fixes + +```bash +cd /work/c.reo-pr4-lint-fixes + +# First, ensure PR 3 changes are included (after PR 3 is merged) +git pull origin main +# Or if PR 3 isn't merged yet: +git merge origin/pr/lint-infrastructure + +# Run all lint fixes +pnpm lint + +# Commit only the auto-fixed changes +git add -A +git commit -m "style: apply lint fixes across codebase" +git push origin pr/lint-fixes +``` + +## Tips + +1. **Keep worktrees focused**: Each worktree should contain only changes for its specific PR +2. **Test in isolation**: Build and test each PR independently + +## Current State Analysis + +To identify which changes to apply to each PR: + +```bash +# See all changes between main and rewards-eligibility-oracle +git diff --name-status origin/main..rewards-eligibility-oracle + +# Filter by path +git diff --name-status origin/main..rewards-eligibility-oracle -- .devcontainer/ +git diff --name-status origin/main..rewards-eligibility-oracle -- package.json +``` + +## Alternative: Using Patches + +Instead of cherry-picking, you can create patches: + +```bash +# Create patch for specific paths +git diff origin/main..rewards-eligibility-oracle -- .devcontainer/ > devcontainer.patch + +# Apply in worktree +cd /work/c.reo-pr2-devcontainer +git apply ../c.reo/devcontainer.patch +``` + +This approach gives you more control over what changes to include. From a763fb4dbc5efd624f8137e1348f9ec613a90360 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Fri, 19 Sep 2025 13:21:17 +0000 Subject: [PATCH 23/28] chore: merging dev container update from main b7f507af --- .devcontainer/Dockerfile | 46 +------------- .devcontainer/README.md | 100 ++++--------------------------- .devcontainer/devcontainer.json | 9 ++- .devcontainer/docker-compose.yml | 31 ---------- .devcontainer/host-setup.sh | 40 ------------- .devcontainer/project-setup.sh | 65 +++++++++++++------- 6 files changed, 61 insertions(+), 230 deletions(-) delete mode 100755 .devcontainer/host-setup.sh diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a55122563..32bc9dc3c 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,53 +1,15 @@ -FROM mcr.microsoft.com/devcontainers/base:debian - -# Set non-interactive frontend for apt -ENV DEBIAN_FRONTEND=noninteractive +FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04 # Switch to root for installing packages USER root # Install additional dependencies -RUN apt update && apt install -y \ +RUN apt update && DEBIAN_FRONTEND=noninteractive apt install -y \ build-essential \ - curl \ jq \ - python3 \ - python3-pip \ - python3-venv \ - pipx \ && apt clean \ && rm -rf /var/lib/apt/lists/* -# Install Node.js 20.x using NodeSource -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - apt update && \ - apt install -y nodejs && \ - apt clean && \ - rm -rf /var/lib/apt/lists/* - -# Install Solidity compiler using pipx (isolated environment) -RUN pipx install solc-select && \ - pipx ensurepath && \ - /root/.local/bin/solc-select install 0.8.27 && \ - /root/.local/bin/solc-select use 0.8.27 && \ - # Copy binaries to /usr/local/bin with proper permissions (not symlinks) - cp /root/.local/bin/solc /usr/local/bin/solc && \ - cp /root/.local/bin/solc-select /usr/local/bin/solc-select && \ - chmod 755 /usr/local/bin/solc && \ - chmod 755 /usr/local/bin/solc-select && \ - # Set up for vscode user - mkdir -p /home/vscode/.solc-select && \ - cp -r /root/.solc-select/* /home/vscode/.solc-select/ && \ - chown -R vscode:vscode /home/vscode/.solc-select - -RUN npm install -g ethers@6.13.4 - -# Install cloc for code analysis -RUN npm install -g cloc - -# Install Claude Code -RUN npm install -g @anthropic-ai/claude-code - # Install Foundry for Anvil (as root for global installation) RUN curl -L https://foundry.paradigm.xyz | bash && \ /root/.foundry/bin/foundryup && \ @@ -62,10 +24,6 @@ RUN curl -L https://foundry.paradigm.xyz | bash && \ chmod 755 /usr/local/bin/forge && \ chmod 755 /usr/local/bin/chisel -# Set up pnpm -RUN corepack enable && \ - corepack prepare pnpm@9.0.6 --activate - # Ensure all users have access to the tools RUN chmod 755 /usr/local/bin/* && \ # Create a directory for vscode user's binaries diff --git a/.devcontainer/README.md b/.devcontainer/README.md index 3091caa58..644575fd4 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -13,51 +13,10 @@ The dev container provides a consistent development environment with caching to 1. **Docker Compose Configuration**: Defines the container setup, volume mounts, and environment variables 2. **Dockerfile**: Specifies the container image and installed tools 3. **project-setup.sh**: Configures the environment after container creation -4. **host-setup.sh**: Sets up the host environment before starting the container -5. **setup-git-signing.sh**: Automatically configures Git to use SSH signing with forwarded SSH keys - -## Cache System - -The container uses a conservative caching approach to prevent cache corruption issues: - -1. **Local Cache Directories**: Each container instance maintains its own cache directories - - - `vscode-cache` → `/home/vscode/.cache` (VS Code cache) - - `vscode-config` → `/home/vscode/.config` (VS Code configuration) - - `vscode-data` → `/home/vscode/.local/share` (VS Code data) - - `vscode-bin` → `/home/vscode/.local/bin` (User binaries) - -2. **Safe Caches Only**: Only caches that won't cause cross-branch issues are configured - - - GitHub CLI: `/home/vscode/.cache/github` - - Python packages: `/home/vscode/.cache/pip` - -3. **Intentionally Not Cached**: These tools use their default cache locations to avoid contamination - - NPM (different dependency versions per branch) - - Foundry, Solidity (different compilation artifacts per branch) - - Hardhat (different build artifacts per branch) ## Setup Instructions -### Setup Instructions - -#### First-Time Setup (Required) - -**IMPORTANT**: Before starting any dev container, you must run the host setup script on your host machine: - -```bash -.devcontainer/host-setup.sh -``` - -This script: - -- Creates global Docker volumes like `global-pnpm-cache` that are shared across all dev containers -- Sets proper ownership (UID 1000:1000) for the vscode user inside containers -- Prevents permission denied errors when tools try to write to cache directories - -**Without running this script first, the dev container will fail with permission errors.** - -#### Start the Dev Container +### Start the Dev Container To start the dev container: @@ -68,11 +27,9 @@ To start the dev container: When the container starts, the `project-setup.sh` script will automatically run and: - Install project dependencies using pnpm -- Configure Git to use SSH signing with your forwarded SSH key +- Configure basic Git settings (user.name, user.email) from environment variables - Source shell customizations if available in PATH -**Note**: The `host-setup.sh` script is required to create the global pnpm cache volume with proper permissions. Without it, the dev container will fail with permission denied errors when pnpm tries to write to its cache directory. - ## Environment Variables Environment variables are defined in two places: @@ -82,10 +39,10 @@ Environment variables are defined in two places: ### Git Configuration -To enable Git commit signing, add the following settings to your environment file: +To configure Git user settings, add the following to your environment file: ```env -# Git settings for commit signing +# Git settings GIT_USER_NAME=Your Name GIT_USER_EMAIL=your.email@example.com ``` @@ -94,51 +51,20 @@ These environment variables are needed for Git commit signing to work properly. ## Troubleshooting -### Permission Issues - -If you encounter "permission denied" errors when the dev container starts (especially with pnpm cache): - -1. **Run host setup first**: Make sure you've run `.devcontainer/host-setup.sh` on your host machine -2. **Fix existing volumes**: If you already have volumes with wrong permissions, run: - - ```bash - # Remove the problematic volume - docker volume rm global-pnpm-cache - - # Run host setup to recreate it with correct permissions - .devcontainer/host-setup.sh - ``` +### Build Issues -3. **Rebuild container**: After fixing volumes, rebuild your dev container +If you encounter build or compilation issues: -### Cache Issues - -If you encounter build or compilation issues that seem related to cached artifacts: - -1. **Rebuild the container**: This rebuilds the container image but preserves Docker volume caches +1. **Rebuild the container**: This will start with fresh isolated caches 2. **Clean project caches**: Run `pnpm clean` to clear project-specific build artifacts 3. **Clear node modules**: Delete `node_modules` and run `pnpm install` again -### Git SSH Signing Issues - -If you encounter issues with Git SSH signing: +### Git Authentication Issues -1. **SSH Agent Forwarding**: Make sure SSH agent forwarding is properly set up in your VS Code settings -2. **GitHub Configuration**: Ensure your SSH key is added to GitHub as a signing key in your account settings -3. **Manual Setup**: If automatic setup fails, you can manually configure SSH signing: +If you encounter issues with Git operations: -```bash -# Check available SSH keys -ssh-add -l - -# Configure Git to use SSH signing -git config --global gpg.format ssh -git config --global user.signingkey "key::ssh-ed25519 YOUR_KEY_CONTENT" -git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers -git config --global commit.gpgsign true - -# Create allowed signers file -echo "your.email@example.com ssh-ed25519 YOUR_KEY_CONTENT" > ~/.ssh/allowed_signers -``` +1. **GitHub CLI**: Use `gh auth login` to authenticate with GitHub +2. **Git Configuration**: Set user.name and user.email if not configured via environment variables +3. **Commit Signing**: Handle commit signing on your host machine for security -For other issues, check the `project-setup.sh` and `setup-git-signing.sh` scripts for any errors. +For other issues, check the `project-setup.sh` script for any errors. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e8701c86f..02b0f69d0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -11,16 +11,16 @@ "ghcr.io/devcontainers/features/node:1": { "version": "20" }, - "ghcr.io/devcontainers/features/docker-outside-of-docker:1": { - "moby": false + "ghcr.io/devcontainers/features/python:1": { + "version": "3.11" } }, - "workspaceFolder": "/work/${localWorkspaceFolderBasename}", "mounts": [ "source=${localWorkspaceFolder},target=/work/${localWorkspaceFolderBasename},type=bind,consistency=cached" ], "postCreateCommand": ".devcontainer/project-setup.sh", "remoteUser": "vscode", + "workspaceFolder": "/work/${localWorkspaceFolderBasename}", "customizations": { "vscode": { "extensions": [ @@ -32,7 +32,6 @@ "shd101wyy.markdown-preview-enhanced", "bierner.markdown-preview-github-styles", "Gruntfuggly.todo-tree", - "ms-azuretools.vscode-docker", "donjayamanne.githistory", "eamodio.gitlens", "fill-labs.dependi", @@ -40,7 +39,7 @@ "Augment.vscode-augment", "NomicFoundation.hardhat-solidity", "foundry-rs.foundry-vscode", - "BlueGlassBlock.better-json5" + "esbenp.prettier-vscode" ] } } diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 0d6e2a751..6a7019746 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -3,7 +3,6 @@ services: build: context: . dockerfile: Dockerfile - user: vscode env_file: - /opt/configs/graphprotocol/contracts.env environment: @@ -16,36 +15,6 @@ services: # Disable interactive prompts - COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - # Standard user directories - - XDG_CACHE_HOME=/home/vscode/.cache - - XDG_CONFIG_HOME=/home/vscode/.config - - XDG_DATA_HOME=/home/vscode/.local/share - - # Safe caches (won't cause cross-branch issues) - - GH_CONFIG_DIR=/home/vscode/.cache/github - - PIP_CACHE_DIR=/home/vscode/.cache/pip - - # pnpm cache is safe to share due to content-addressable storage - # PNPM_HOME is for global packages and should be user-specific (uses default) - - PNPM_STORE_DIR=/home/vscode/.cache/pnpm/store - # Note: NPM, Foundry, and Solidity caches are intentionally not set - # to avoid cross-branch contamination. Tools will use their default locations. volumes: # Git repo root - /git:/git - - # Cached directories - - vscode-config:/home/vscode/.config - - vscode-data:/home/vscode/.local/share - - vscode-bin:/home/vscode/.local/bin - - vscode-cache:/home/vscode/.cache - # Global pnpm store (content-addressable cache only) - - global-pnpm-cache:/home/vscode/.cache/pnpm - -volumes: - vscode-cache: - vscode-config: - vscode-data: - vscode-bin: - global-pnpm-cache: - external: true diff --git a/.devcontainer/host-setup.sh b/.devcontainer/host-setup.sh deleted file mode 100755 index 3d2aa0927..000000000 --- a/.devcontainer/host-setup.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash -# Host setup script for creating global cache volumes -# Run this script to create shared cache volumes across all dev containers -# Usage: .devcontainer/host-setup.sh - -set -euo pipefail - -echo "Setting up global cache volumes for dev containers..." - -# Global cache volumes that should be shared across all projects -GLOBAL_VOLUMES=( - "global-pnpm-cache" - # Add other global caches here as needed - # "global-pip-cache" - # "global-npm-cache" -) - -echo "Creating global cache volumes..." -for volume in "${GLOBAL_VOLUMES[@]}"; do - if docker volume inspect "$volume" >/dev/null 2>&1; then - echo "✓ $volume already exists" - else - echo "Creating $volume..." - docker volume create "$volume" - echo "✓ $volume created" - fi -done - -echo "" -echo "Cache volumes created successfully!" -echo "Note: Permissions will be set automatically when the dev container starts." - -echo "" -echo "Global cache volumes setup completed!" -echo "These volumes will be shared across all dev containers that reference them." -echo "" -echo "Created volumes:" -for volume in "${GLOBAL_VOLUMES[@]}"; do - echo " - $volume" -done diff --git a/.devcontainer/project-setup.sh b/.devcontainer/project-setup.sh index 93ffcf328..414a68119 100755 --- a/.devcontainer/project-setup.sh +++ b/.devcontainer/project-setup.sh @@ -11,25 +11,37 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" echo "Script directory: $SCRIPT_DIR" echo "Repository root: $REPO_ROOT" -# Ensure pnpm cache directory exists with correct permissions -echo "Setting up pnpm cache directory..." -# Fix ownership if the directory exists but is owned by root -if [ -d ~/.cache/pnpm ] && [ "$(stat -c %U ~/.cache/pnpm 2>/dev/null || echo 'vscode')" = "root" ]; then - echo "Fixing pnpm cache directory ownership..." - sudo chown -R vscode:vscode ~/.cache/pnpm -fi -# Create the directory structure with proper permissions -if mkdir -p ~/.cache/pnpm/store 2>/dev/null || sudo mkdir -p ~/.cache/pnpm/store; then - # Ensure the directory is writable by the vscode user (use sudo if needed) - if [ "$(stat -c %U ~/.cache/pnpm 2>/dev/null || echo 'vscode')" = "root" ]; then - sudo chown -R vscode:vscode ~/.cache/pnpm - fi - chmod -R 755 ~/.cache/pnpm - echo "✓ pnpm cache directory created successfully" -else - echo "❌ Failed to create pnpm cache directory" - exit 1 -fi +# Set up local user directories with proper permissions +echo "Setting up local user directories..." + +# Ensure all user directories exist and have proper ownership +sudo mkdir -p /home/vscode/.cache /home/vscode/.config /home/vscode/.local/share /home/vscode/.local/bin +sudo chown -R vscode:vscode /home/vscode/.cache /home/vscode/.config /home/vscode/.local +sudo chmod -R 755 /home/vscode/.cache /home/vscode/.config /home/vscode/.local + +echo "User directories set up with proper permissions" + +# Install Solidity compiler (moved from Dockerfile since Python/pipx is now available) +echo "Installing Solidity compiler..." +pipx install solc-select +pipx ensurepath +solc-select install 0.8.27 +solc-select use 0.8.27 + +# Upgrade npm to latest version for better compatibility and security +echo "Upgrading npm to latest version..." +npm install -g npm@latest + +npm install -g ethers@6.13.4 cloc @anthropic-ai/claude-code + +# Set up pnpm with correct version (matching package.json) +echo "Setting up pnpm..." +corepack enable +corepack prepare pnpm@10.17.0 --activate + +# Verify pnpm is working +echo "Verifying pnpm installation..." +pnpm --version # Install project dependencies echo "Installing project dependencies..." @@ -82,11 +94,18 @@ else echo "Shell customizations not found in PATH, skipping..." fi -# Set up Git SSH signing -if [ -f "$SCRIPT_DIR/setup-git-signing.sh" ]; then - "$SCRIPT_DIR/setup-git-signing.sh" +# Set up basic Git configuration (user.name and user.email from environment) +echo "Setting up basic Git configuration..." +if [[ -n "${GIT_USER_NAME:-}" && -n "${GIT_USER_EMAIL:-}" ]]; then + echo "Setting Git user.name: $GIT_USER_NAME" + git config --global user.name "$GIT_USER_NAME" + echo "Setting Git user.email: $GIT_USER_EMAIL" + git config --global user.email "$GIT_USER_EMAIL" + echo "Git user configuration complete" else - echo "WARNING: setup-git-signing.sh not found, skipping Git SSH signing setup" + echo "GIT_USER_NAME and/or GIT_USER_EMAIL not set - skipping Git user configuration" + echo "You can set these manually with: git config --global user.name 'Your Name'" + echo "and: git config --global user.email 'your.email@example.com'" fi echo "Project-specific setup completed" From db7d0acc4b1d3c77c50582e76c70bd69cc29b79f Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Fri, 19 Sep 2025 13:20:05 +0000 Subject: [PATCH 24/28] feat(build): matching main pnpm v10.17 from b5848dfa --- .github/actions/setup/action.yml | 2 +- .gitignore | 3 + package.json | 2 +- pnpm-lock.yaml | 5479 +++++++++++++++--------------- 4 files changed, 2654 insertions(+), 2832 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index d34d8e5d4..23c24f1be 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -21,7 +21,7 @@ runs: cache: 'pnpm' - name: Set up pnpm via Corepack shell: bash - run: corepack prepare pnpm@9.0.6 --activate + run: corepack prepare pnpm@10.17.0 --activate - name: Install dependencies shell: bash run: pnpm install --frozen-lockfile diff --git a/.gitignore b/.gitignore index b1c33f5f5..85b41c697 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,9 @@ deployments/hardhat/ # Ignore solc bin output bin/ +# PNPM store (project-local) +.pnpm-store/ + # Others .env .DS_Store diff --git a/package.json b/package.json index 3a773164a..ef4930eba 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "GPL-2.0-or-later", "repository": "git@github.com:graphprotocol/contracts.git", "author": "Edge & Node", - "packageManager": "pnpm@10.14.0", + "packageManager": "pnpm@10.17.0", "scripts": { "postinstall": "husky", "clean": "pnpm -r run clean", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab624d1a3..cc2387138 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,10 +17,10 @@ catalogs: version: 9.1.0 dotenv: specifier: ^16.5.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: ^9.28.0 - version: 9.28.0 + version: 9.35.0 eslint-plugin-no-only-tests: specifier: ^3.3.0 version: 3.3.0 @@ -32,7 +32,7 @@ catalogs: version: 2.26.3 hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.0 + version: 2.10.1 hardhat-gas-reporter: specifier: ^1.0.8 version: 1.0.10 @@ -50,7 +50,7 @@ catalogs: version: 6.0.1 typescript-eslint: specifier: ^8.33.1 - version: 8.33.1 + version: 8.44.0 overrides: prettier: ^3.5.3 @@ -69,10 +69,10 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.27.1 - version: 2.29.4 + version: 2.29.7(@types/node@20.19.14) '@commitlint/cli': specifier: 19.8.1 - version: 19.8.1(@types/node@20.17.58)(typescript@5.8.3) + version: 19.8.1(@types/node@20.19.14)(typescript@5.9.2) '@commitlint/config-conventional': specifier: 19.8.1 version: 19.8.1 @@ -81,67 +81,67 @@ importers: version: 3.3.1 '@eslint/js': specifier: ^9.28.0 - version: 9.28.0 + version: 9.35.0 '@typescript-eslint/eslint-plugin': specifier: ^8.33.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 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': specifier: ^8.33.1 - version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) eslint: specifier: ^9.28.0 - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.1) eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.28.0(jiti@2.4.2)) + version: 10.1.8(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) + version: 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-jsdoc: specifier: ^50.6.17 - version: 50.7.1(eslint@9.28.0(jiti@2.4.2)) + version: 50.8.0(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-markdown: specifier: ^5.1.0 - version: 5.1.0(eslint@9.28.0(jiti@2.4.2)) + version: 5.1.0(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-no-only-tests: specifier: ^3.3.0 version: 3.3.0 eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.28.0(jiti@2.4.2)) + version: 12.1.1(eslint@9.35.0(jiti@2.5.1)) eslint-plugin-unused-imports: specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) + version: 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)) globals: specifier: ^16.1.0 - version: 16.1.0 + version: 16.4.0 husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: specifier: ^16.0.0 - version: 16.0.0 + version: 16.1.6 markdownlint-cli: specifier: ^0.45.0 version: 0.45.0 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) pretty-quick: specifier: ^4.1.1 - version: 4.2.2(prettier@3.5.3) + version: 4.2.2(prettier@3.6.2) solhint: specifier: 'catalog:' - version: 6.0.1(typescript@5.8.3) + version: 6.0.1(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 typescript-eslint: specifier: ^8.33.1 - version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) yaml-lint: specifier: ^1.7.0 version: 1.7.0 @@ -150,7 +150,7 @@ importers: devDependencies: prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 packages/contracts: devDependencies: @@ -159,7 +159,7 @@ importers: version: 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@defi-wonderland/smock': specifier: ^2.4.1 - version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@ethersproject/abi': specifier: ^5.8.0 version: 5.8.0 @@ -183,64 +183,64 @@ importers: version: link:../interfaces '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@openzeppelin/contracts': specifier: ^3.4.1 - version: 3.4.2 + version: 3.4.1 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.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)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 10.0.10 + version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) chai: specifier: ^4.2.0 version: 4.5.0 dotenv: specifier: ^16.5.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.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.8.3) + 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) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: specifier: ^4.0.0 - version: 4.0.3 + version: 4.0.4 glob: specifier: ^8.0.3 version: 8.1.0 @@ -252,43 +252,43 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: 'catalog:' - version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: 'catalog:' - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.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: 'catalog:' - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.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)))(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-storage-layout: specifier: 'catalog:' - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: 'catalog:' - version: 6.0.1(typescript@5.8.3) + version: 6.0.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 winston: specifier: ^3.3.3 version: 3.17.0 @@ -306,13 +306,13 @@ 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10) axios: specifier: ^1.9.0 - version: 1.9.0(debug@4.4.1) + version: 1.12.2(debug@4.4.3) console-table-printer: specifier: ^2.14.1 - version: 2.14.1 + version: 2.14.6 devDependencies: '@arbitrum/sdk': specifier: ~3.1.13 @@ -337,49 +337,49 @@ 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.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^3.4.1 - version: 3.4.2 + version: 3.4.1 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.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)) '@types/glob': specifier: ^8.1.0 version: 8.1.0 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 arbos-precompiles: specifier: ^1.0.2 - version: 1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) dotenv: specifier: ^16.5.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: ^9.28.0 - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.1) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: specifier: ^4.0.0 - version: 4.0.3 + version: 4.0.4 glob: specifier: ^8.0.3 version: 8.1.0 @@ -391,37 +391,37 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: ^2.24.0 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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-storage-layout: specifier: ^0.1.7 - version: 0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 winston: specifier: ^3.3.3 version: 3.17.0 @@ -442,14 +442,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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@ethersproject/abi': specifier: ^5.8.0 version: 5.8.0 @@ -470,64 +470,64 @@ 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.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@openzeppelin/contracts': specifier: ^3.4.1 - version: 3.4.2 + version: 3.4.1 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.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)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 10.0.10 + version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) chai: specifier: ^4.2.0 version: 4.5.0 dotenv: specifier: ^16.5.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: ^9.28.0 - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.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.8.3) + 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) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) form-data: specifier: ^4.0.0 - version: 4.0.3 + version: 4.0.4 glob: specifier: ^8.0.3 version: 8.1.0 @@ -539,40 +539,40 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: ^2.24.0 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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-storage-layout: specifier: ^0.1.7 - version: 0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 winston: specifier: ^3.3.3 version: 3.17.0 @@ -602,37 +602,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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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': specifier: ^3.1.2 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@tenderly/api-client': specifier: ^1.0.13 - version: 1.1.0(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3) + version: 1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2) '@tenderly/hardhat-tenderly': specifier: ^1.0.13 - version: 1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.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) '@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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.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)) '@types/mocha': specifier: ^9.0.0 version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 '@types/sinon-chai': specifier: ^3.2.12 version: 3.2.12 @@ -641,13 +641,13 @@ importers: version: 4.5.0 dotenv: specifier: ^16.0.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.1) ethereum-waffle: specifier: ^3.0.2 - version: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -656,19 +656,19 @@ importers: version: 1.2.5(solium@1.2.5) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.3 - version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) husky: specifier: ^7.0.4 version: 7.0.4 @@ -683,28 +683,28 @@ importers: version: 0.45.0 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: 'catalog:' - version: 6.0.1(typescript@5.8.3) + version: 6.0.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 packages/hardhat-graph-protocol: dependencies: @@ -713,17 +713,17 @@ importers: 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) debug: specifier: ^4.3.7 - version: 4.4.1(supports-color@9.4.0) + version: 4.4.3(supports-color@9.4.0) json5: specifier: ^2.2.3 version: 2.2.3 devDependencies: '@nomicfoundation/hardhat-verify': specifier: ^2.0.12 - version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(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.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@types/chai': specifier: ^4.0.0 version: 4.3.20 @@ -744,25 +744,25 @@ importers: version: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: ^2.22.16 - version: 2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) mocha: specifier: ^10.8.2 version: 10.8.2 ts-node: specifier: ^8.0.0 - version: 8.10.2(typescript@5.8.3) + version: 8.10.2(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 packages/horizon: devDependencies: '@defi-wonderland/natspec-smells': specifier: ^1.1.6 - version: 1.1.6(typescript@5.8.3)(zod@3.25.51) + version: 1.1.6(typescript@5.9.2)(zod@3.25.76) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts @@ -774,55 +774,55 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.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-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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(418f442e9ae8e9c553b9d925825153d3) + version: 4.0.0(319f36fa853933d46d380da2276493de) '@nomicfoundation/hardhat-verify': specifier: ^2.0.10 - version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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) '@openzeppelin/contracts': specifier: ^5.0.2 - version: 5.3.0 + version: 5.4.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.0.2 - version: 5.3.0(@openzeppelin/contracts@5.3.0) + version: 5.4.0(@openzeppelin/contracts@5.4.0) '@openzeppelin/foundry-upgrades': specifier: 0.4.0 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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 10.0.10 + version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 chai: specifier: ^4.2.0 version: 4.5.0 @@ -837,52 +837,52 @@ importers: version: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 glob: specifier: ^11.0.1 - version: 11.0.2 + version: 11.0.3 hardhat: specifier: ^2.22.18 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) lint-staged: specifier: ^15.2.2 version: 15.5.2 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) + version: 5.1.0(typescript@5.9.2) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 packages/interfaces: devDependencies: '@defi-wonderland/natspec-smells': specifier: ^1.1.6 - version: 1.1.6(typescript@5.8.3)(zod@3.25.51) + version: 1.1.6(typescript@5.9.2)(zod@3.25.76) '@ethersproject/abi': specifier: 5.7.0 version: 5.7.0 @@ -891,7 +891,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(639b455d9367db27d2db58403e8352ae) + version: 4.0.0(d35e8d65535ba70c86963f53cf6ab913) '@openzeppelin/contracts': specifier: 3.4.1 version: 3.4.1 @@ -900,10 +900,10 @@ 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.8.3))(typescript@5.8.3) + 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) '@wagmi/cli': specifier: ^2.3.1 - version: 2.5.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 2.5.1(bufferutil@4.0.9)(typescript@5.9.2)(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) @@ -912,25 +912,25 @@ importers: version: ethers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: ^2.24.0 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) markdownlint-cli: specifier: ^0.45.0 version: 0.45.0 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: 5.1.0 - version: 5.1.0(typescript@5.8.3) + version: 5.1.0(typescript@5.9.2) typechain: specifier: ^8.3.2 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) viem: specifier: ^2.31.7 - version: 2.37.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) + version: 2.37.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) packages/issuance: dependencies: @@ -943,55 +943,55 @@ importers: version: link:../interfaces '@nomicfoundation/hardhat-ethers': 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': specifier: 'catalog:' - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^5.3.0 - version: 5.3.0 + version: 5.4.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.3.0 - version: 5.3.0(@openzeppelin/contracts@5.3.0) + version: 5.4.0(@openzeppelin/contracts@5.4.0) '@openzeppelin/hardhat-upgrades': specifier: ^3.9.0 - version: 3.9.1(@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 3.9.1(@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.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)))(encoding@0.1.13)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': specifier: ^0.5.0 - 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.8.3))(typescript@5.8.3) + 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.2))(typescript@5.9.2) '@typechain/hardhat': specifier: 'catalog:' - 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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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.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.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/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 dotenv: specifier: 'catalog:' - version: 16.5.0 + version: 16.6.1 eslint: specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.1) ethers: specifier: 'catalog:' version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) glob: specifier: ^11.0.2 - version: 11.0.2 + version: 11.0.3 globals: specifier: ^16.1.0 - version: 16.1.0 + version: 16.4.0 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) hardhat-contract-sizer: specifier: 'catalog:' - version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-secure-accounts: specifier: 'catalog:' - 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-storage-layout: specifier: 'catalog:' - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) lint-staged: specifier: 16.0.0 version: 16.0.0 @@ -1000,25 +1000,25 @@ importers: version: 0.45.0 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: 'catalog:' - version: 6.0.1(typescript@5.8.3) + version: 6.0.1(typescript@5.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 typescript-eslint: specifier: 'catalog:' - version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) yaml-lint: specifier: ^1.7.0 version: 1.7.0 @@ -1037,25 +1037,25 @@ importers: devDependencies: '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: 5.0.0 - version: 5.0.0(34987977931eb7f67aaf635190f51b0d) + version: 5.0.0(388c65bfd887f02655892c196bace5c8) '@openzeppelin/contracts': specifier: ^5.3.0 - version: 5.3.0 + version: 5.4.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.3.0 - version: 5.3.0(@openzeppelin/contracts@5.3.0) + version: 5.4.0(@openzeppelin/contracts@5.4.0) '@openzeppelin/foundry-upgrades': specifier: 0.4.0 version: 0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1) @@ -1067,16 +1067,16 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 chai: specifier: ^4.3.7 version: 4.5.0 dotenv: specifier: ^16.5.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.1) eslint-plugin-no-only-tests: specifier: 'catalog:' version: 3.3.0 @@ -1088,31 +1088,31 @@ importers: version: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 glob: specifier: ^11.0.2 - version: 11.0.2 + version: 11.0.3 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) hardhat-gas-reporter: specifier: 'catalog:' - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 packages/subgraph-service: devDependencies: '@defi-wonderland/natspec-smells': specifier: ^1.1.6 - version: 1.1.6(typescript@5.8.3)(zod@3.25.51) + version: 1.1.6(typescript@5.9.2)(zod@3.25.76) '@graphprotocol/contracts': specifier: workspace:^ version: link:../contracts @@ -1127,55 +1127,55 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.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-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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(418f442e9ae8e9c553b9d925825153d3) + version: 4.0.0(319f36fa853933d46d380da2276493de) '@nomicfoundation/hardhat-verify': specifier: ^2.0.10 - version: 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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) '@openzeppelin/contracts': specifier: ^5.0.2 - version: 5.3.0 + version: 5.4.0 '@openzeppelin/contracts-upgradeable': specifier: ^5.0.2 - version: 5.3.0(@openzeppelin/contracts@5.3.0) + version: 5.4.0(@openzeppelin/contracts@5.4.0) '@openzeppelin/foundry-upgrades': specifier: 0.4.0 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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 '@types/mocha': specifier: '>=9.1.0' - version: 10.0.10 + version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 chai: specifier: ^4.2.0 version: 4.5.0 @@ -1190,22 +1190,22 @@ importers: version: https://github.com/foundry-rs/forge-std/tarball/v1.9.7 glob: specifier: ^11.0.1 - version: 11.0.2 + version: 11.0.3 hardhat: specifier: ^2.22.18 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) json5: specifier: ^2.2.3 version: 2.2.3 @@ -1214,28 +1214,28 @@ importers: version: 15.5.2 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: ^5.1.0 - version: 5.1.0(typescript@5.8.3) + version: 5.1.0(typescript@5.9.2) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) solidity-docgen: specifier: ^0.6.0-beta.36 - version: 0.6.0-beta.36(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 packages/token-distribution: dependencies: @@ -1260,43 +1260,43 @@ 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.27.4)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.0.24(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.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/contracts': specifier: workspace:^ version: link:../contracts '@graphql-yoga/plugin-persisted-operations': specifier: ^3.13.5 - version: 3.13.6(graphql-yoga@5.13.5(graphql@16.11.0))(graphql@16.11.0) + version: 3.15.2(graphql-yoga@5.15.2(graphql@16.11.0))(graphql@16.11.0) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@openzeppelin/contracts': specifier: ^3.4.1 - version: 3.4.2 + version: 3.4.1 '@openzeppelin/contracts-upgradeable': specifier: 3.4.2 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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)) '@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.8.3))(typescript@5.8.3) + 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) '@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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.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)) '@types/mocha': specifier: ^9.1.0 version: 9.1.1 '@types/node': specifier: ^20.17.50 - version: 20.17.58 + version: 20.19.14 '@types/sinon-chai': specifier: ^3.2.12 version: 3.2.12 @@ -1311,13 +1311,13 @@ importers: version: 2.15.3 dotenv: specifier: ^16.0.0 - version: 16.5.0 + version: 16.6.1 eslint: specifier: 'catalog:' - version: 9.28.0(jiti@2.4.2) + version: 9.35.0(jiti@2.5.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.8.3) + 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) ethers: specifier: ^5.7.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -1326,22 +1326,22 @@ importers: version: 16.11.0 graphql-yoga: specifier: ^5.13.4 - version: 5.13.5(graphql@16.11.0) + version: 5.15.2(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.1 - version: 2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.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: 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) inquirer: specifier: 8.0.0 version: 8.0.0 @@ -1356,28 +1356,28 @@ importers: version: 6.6.2 prettier: specifier: ^3.5.3 - version: 3.5.3 + version: 3.6.2 prettier-plugin-solidity: specifier: ^2.0.0 - version: 2.0.0(prettier@3.5.3) + version: 2.1.0(prettier@3.6.2) solhint: specifier: 'catalog:' - version: 6.0.1(typescript@5.8.3) + version: 6.0.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + version: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) typechain: specifier: ^8.3.0 - version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + version: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 typescript-eslint: specifier: 'catalog:' - version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) packages/toolshed: dependencies: @@ -1389,19 +1389,19 @@ importers: 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + 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)) debug: specifier: ^4.4.0 - version: 4.4.1(supports-color@9.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) glob: specifier: ^11.0.1 - version: 11.0.2 + version: 11.0.3 hardhat: specifier: ^2.22.16 - version: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) json5: specifier: ^2.2.3 version: 2.2.3 @@ -1417,7 +1417,7 @@ importers: version: 8.57.1 typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.2 packages: @@ -1427,10 +1427,6 @@ packages: '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@arbitrum/sdk@3.1.13': resolution: {integrity: sha512-oE/j8ThWWEdFfV0helmR8lD0T67/CY1zMCt6RVslaCLrytFdbg3QsrHs/sQE3yiCXgisQlsx3qomCgh8PfBo8Q==} engines: {node: '>=v11', npm: please-use-yarn, yarn: '>= 1.0.0'} @@ -1474,84 +1470,80 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-lambda@3.891.0': - resolution: {integrity: sha512-NRi/bOK3ccboNAQngIjF9Hp9EGEosotzlN8UyTfn2SEXTc3Sg8rvK0OBZGe8b4vSeJCQw+A1wM1ZsSyeF2te7Q==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-sso@3.891.0': - resolution: {integrity: sha512-QMDaD9GhJe7l0KQp3Tt7dzqFCz/H2XuyNjQgvi10nM1MfI1RagmLtmEhZveQxMPhZ/AtohLSK0Tisp/I5tR8RQ==} + '@aws-sdk/client-lambda@3.888.0': + resolution: {integrity: sha512-5s3S+2E2jnyRnX/u5Dp4TCFANVcCKnUuvVLUc0jS9peUAPJLeE4ZfksC2XmWha3ZwInE/7XU2j7maPbM/BinkA==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.890.0': - resolution: {integrity: sha512-CT+yjhytHdyKvV3Nh/fqBjnZ8+UiQZVz4NMm4LrPATgVSOdfygXHqrWxrPTVgiBtuJWkotg06DF7+pTd5ekLBw==} + '@aws-sdk/client-sso@3.888.0': + resolution: {integrity: sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.890.0': - resolution: {integrity: sha512-BtsUa2y0Rs8phmB2ScZ5RuPqZVmxJJXjGfeiXctmLFTxTwoayIK1DdNzOWx6SRMPVc3s2RBGN4vO7T1TwN+ajA==} + '@aws-sdk/core@3.888.0': + resolution: {integrity: sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.890.0': - resolution: {integrity: sha512-0sru3LVwsuGYyzbD90EC/d5HnCZ9PL4O9BA2LYT6b9XceC005Oj86uzE47LXb+mDhTAt3T6ZO0+ZcVQe0DDi8w==} + '@aws-sdk/credential-provider-env@3.888.0': + resolution: {integrity: sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.891.0': - resolution: {integrity: sha512-9LOfm97oy2d2frwCQjl53XLkoEYG6/rsNM3Y6n8UtRU3bzGAEjixdIuv3b6Z/Mk/QLeikcQEJ9FMC02DuQh2Yw==} + '@aws-sdk/credential-provider-http@3.888.0': + resolution: {integrity: sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.891.0': - resolution: {integrity: sha512-IjGvQJhpCN512xlT1DFGaPeE1q0YEm/X62w7wHsRpBindW//M+heSulJzP4KPkoJvmJNVu1NxN26/p4uH+M8TQ==} + '@aws-sdk/credential-provider-ini@3.888.0': + resolution: {integrity: sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.890.0': - resolution: {integrity: sha512-dWZ54TI1Q+UerF5YOqGiCzY+x2YfHsSQvkyM3T4QDNTJpb/zjiVv327VbSOULOlI7gHKWY/G3tMz0D9nWI7YbA==} + '@aws-sdk/credential-provider-node@3.888.0': + resolution: {integrity: sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.891.0': - resolution: {integrity: sha512-RtF9BwUIZqc/7sFbK6n6qhe0tNaWJQwin89nSeZ1HOsA0Z7TfTOelX8Otd0L5wfeVBMVcgiN3ofqrcZgjFjQjA==} + '@aws-sdk/credential-provider-process@3.888.0': + resolution: {integrity: sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.891.0': - resolution: {integrity: sha512-yq7kzm1sHZ0GZrtS+qpjMUp4ES66UoT1+H2xxrOuAZkvUnkpQq1iSjOgBgJJ9FW1EsDUEmlgn94i4hJTNvm7fg==} + '@aws-sdk/credential-provider-sso@3.888.0': + resolution: {integrity: sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.891.0': - resolution: {integrity: sha512-OYaxbqNDeo/noE7MfYWWQDu86cF/R/bMXdZ2QZwpWpX2yjy8xMwxSg7c/4tEK/OtiDZTKRXXrvPxRxG2+1bnJw==} + '@aws-sdk/credential-provider-web-identity@3.888.0': + resolution: {integrity: sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.891.0': - resolution: {integrity: sha512-azL4mg1H1FLpOAECiFtU+r+9VDhpeF6Vh9pzD4m51BWPJ60CVnyHayeI/0gqPsL60+5l90/b9VWonoA8DvAvpg==} + '@aws-sdk/middleware-host-header@3.887.0': + resolution: {integrity: sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.891.0': - resolution: {integrity: sha512-n++KwAEnNlvx5NZdIQZnvl2GjSH/YE3xGSqW2GmPB5780tFY5lOYSb1uA+EUzJSVX4oAKAkSPdR2AOW09kzoew==} + '@aws-sdk/middleware-logger@3.887.0': + resolution: {integrity: sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.891.0': - resolution: {integrity: sha512-xyxIZtR7FunCWymPAxEm61VUq9lruXxWIYU5AIh5rt0av7nXa2ayAAlscQ7ch9jUlw+lbC2PVbw0K/OYrMovuA==} + '@aws-sdk/middleware-recursion-detection@3.887.0': + resolution: {integrity: sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.891.0': - resolution: {integrity: sha512-cpol+Yk4T3GXPXbRfUyN2u6tpMEHUxAiesZgrfMm11QGHV+pmzyejJV/QZ0pdJKj5sXKaCr4DCntoJ5iBx++Cw==} + '@aws-sdk/middleware-user-agent@3.888.0': + resolution: {integrity: sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.890.0': - resolution: {integrity: sha512-VfdT+tkF9groRYNzKvQCsCGDbOQdeBdzyB1d6hWiq22u13UafMIoskJ1ec0i0H1X29oT6mjTitfnvPq1UiKwzQ==} + '@aws-sdk/nested-clients@3.888.0': + resolution: {integrity: sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.891.0': - resolution: {integrity: sha512-n31JDMWhj/53QX33C97+1W63JGtgO8pg1/Tfmv4f9TR2VSGf1rFwYH7cPZ7dVIMmcUBeI2VCVhwUIabGNHw86Q==} + '@aws-sdk/region-config-resolver@3.887.0': + resolution: {integrity: sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.821.0': - resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} + '@aws-sdk/token-providers@3.888.0': + resolution: {integrity: sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.887.0': resolution: {integrity: sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.891.0': - resolution: {integrity: sha512-MgxvmHIQJbUK+YquX4bdjDw1MjdBqTRJGHs6iU2KM8nN1ut0bPwvavkq7NrY/wB3ZKKECqmv6J/nw+hYKKUIHA==} + '@aws-sdk/util-endpoints@3.887.0': + resolution: {integrity: sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.873.0': @@ -1561,8 +1553,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.887.0': resolution: {integrity: sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==} - '@aws-sdk/util-user-agent-node@3.891.0': - resolution: {integrity: sha512-/mmvVL2PJE2NMTWj9JSY98OISx7yov0mi72eOViWCHQMRYJCN12DY54i1rc4Q/oPwJwTwIrx69MLjVhQ1OZsgw==} + '@aws-sdk/util-user-agent-node@3.888.0': + resolution: {integrity: sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1585,16 +1577,16 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -1605,12 +1597,16 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} @@ -1619,8 +1615,8 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1655,12 +1651,12 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true @@ -1787,14 +1783,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.5': - resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} + '@babel/plugin-transform-block-scoping@7.28.4': + resolution: {integrity: sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-classes@7.27.1': - resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1805,8 +1801,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.27.3': - resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1853,8 +1849,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.1': - resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1865,8 +1861,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1895,20 +1891,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} '@bytecodealliance/preview2-shim@0.17.0': @@ -1917,17 +1913,17 @@ packages: '@bytecodealliance/preview2-shim@0.17.2': resolution: {integrity: sha512-mNm/lblgES8UkVle8rGImXOz4TtL3eU3inHay/7TVchkKrb/lgcVvTK0+VAw8p5zQ0rgQsXm1j5dOlAAd+MeoA==} - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} - '@changesets/assemble-release-plan@6.0.8': - resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.4': - resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} hasBin: true '@changesets/config@3.1.1': @@ -1939,8 +1935,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.12': - resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -2151,8 +2147,8 @@ packages: '@envelop/core@3.0.6': resolution: {integrity: sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig==} - '@envelop/core@5.2.3': - resolution: {integrity: sha512-KfoGlYD/XXQSc3BkM1/k15+JQbkQ4ateHazeZoWl9P71FsLTDXSjGy6j7QqfhpIDSbxNISqhPMfZHYSbDFOofQ==} + '@envelop/core@5.3.1': + resolution: {integrity: sha512-n29V3vRqXvPcG76C8zE482LQykk0P66zv1mjpk7aHeGe9qnh8AzB/RvoX5SVFwApJQPp0ixob8NoYXg4FHKMGA==} engines: {node: '>=18.0.0'} '@envelop/extended-validation@2.0.6': @@ -2182,164 +2178,164 @@ packages: resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -2348,16 +2344,16 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.2': - resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@2.1.4': @@ -2372,16 +2368,16 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.28.0': - resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} + '@eslint/js@9.35.0': + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} 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.1': - resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ethereum-waffle/chai@3.4.4': @@ -2775,8 +2771,8 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@fastify/busboy@3.1.1': - resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} '@fastify/deepmerge@1.3.0': resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} @@ -3099,8 +3095,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor@1.4.7': - resolution: {integrity: sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA==} + '@graphql-tools/executor@1.4.9': + resolution: {integrity: sha512-SAUlDT70JAvXeqV87gGzvDzUGofn39nvaVcVhNf12Dt+GfWHtNNO/RCn/Ea4VJaSLGzraUd41ObnN3i80EBU7w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3130,8 +3126,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/merge@9.0.24': - resolution: {integrity: sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==} + '@graphql-tools/merge@9.1.1': + resolution: {integrity: sha512-BJ5/7Y7GOhTuvzzO5tSBFL4NGr7PVqTJY3KeIDlVTT8YLcTXtBR+hlrC3uyEym7Ragn+zyWdHeJ9ev+nRX1X2w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3146,8 +3142,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/schema@10.0.23': - resolution: {integrity: sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==} + '@graphql-tools/schema@10.0.25': + resolution: {integrity: sha512-/PqE8US8kdQ7lB9M5+jlW8AyVjRGCKU7TSktuW3WNKSKmDO0MK1wakvb5gGdyT49MjAIb4a3LWxIpwo5VygZuw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3172,8 +3168,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/utils@10.8.6': - resolution: {integrity: sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==} + '@graphql-tools/utils@10.9.1': + resolution: {integrity: sha512-B1wwkXk9UvU7LCBkPs8513WxOQ2H8Fo5p8HR1+Id9WmYE5+bd51vqN+MbrqvWczHCH2gwkREgHJN88tE0n1FCw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -3205,12 +3201,12 @@ packages: resolution: {integrity: sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA==} engines: {node: '>=18.0.0'} - '@graphql-yoga/plugin-persisted-operations@3.13.6': - resolution: {integrity: sha512-4NfIDQzo4xZw4ZNIRXzlJRuV8zthFU4fyRaNOoj8ZdRkfjvUnfK0+/zV2LY+cqd+hDrTZCCBLT5XyUCYoW7Qkg==} + '@graphql-yoga/plugin-persisted-operations@3.15.2': + resolution: {integrity: sha512-Vgn1rZPTaiWsolpQt9ygjUEHyOiPBvvp3ovkEvWmt+Cqps7KlL7pjJU3uE57JZlBHblIWmUmdM4Ec9F/ahZjOw==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^15.2.0 || ^16.0.0 - graphql-yoga: ^5.13.5 + graphql-yoga: ^5.15.2 '@graphql-yoga/subscription@3.1.0': resolution: {integrity: sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==} @@ -3230,8 +3226,8 @@ packages: resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/config-array@0.13.0': @@ -3251,14 +3247,27 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': ^20.17.50 + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3299,26 +3308,24 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -3420,66 +3427,34 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.11.0': - resolution: {integrity: sha512-aYTVdcSs27XG7ayTzvZ4Yn9z/ABSaUwicrtrYK2NR8IH0ik4N4bWzo/qH8rax6rewVLbHUkGyGYnsy5ZN4iiMw==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-arm64@0.11.3': resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.11.0': - resolution: {integrity: sha512-RxX7UYgvJrfcyT/uHUn44Nsy1XaoW+Q1khKMdHKxeW7BrgIi+Lz+siz3bX5vhSoAnKilDPhIVLrnC8zxQhjR2A==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.11.3': resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': - resolution: {integrity: sha512-J0j+rs0s11FuSipt/ymqrFmpJ7c0FSz1/+FohCIlUXDxFv//+1R/8lkGPjEYFmy8DPpk/iO8mcpqHTGckREbqA==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': - resolution: {integrity: sha512-4r32zkGMN7WT/CMEuW0VjbuEdIeCskHNDMW4SSgQSJOE/N9L1KSLJCSsAbPD3aYE+e4WRDTyOwmuLjeUTcLZKQ==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.3': resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': - resolution: {integrity: sha512-SmdncQHLYtVNWLIMyGaY6LpAfamzTDe3fxjkirmJv3CWR5tcEyC6LMui/GsIVnJzXeNJBXAzwl8hTUAxHTM6kQ==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.3': resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': - resolution: {integrity: sha512-w6hUqpn/trwiH6SRuRGysj37LsQVCX5XDCA3Xi81sbOaLhbHrNvK9TXWyZmcuzbdTKQQW6VNywcSxDdOiChcJg==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.11.3': resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': - resolution: {integrity: sha512-BLmULjRKoH9BsX+c4Na2ypV7NGeJ+M6Zpqj/faPOwleVscDdSr/IhriyPaXCe8dyfwbge7lWsbekiADtPSnB2Q==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.3': resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.11.0': - resolution: {integrity: sha512-36WERf8ldvyHR6UAbcYsa+vpbW7tCrJGBwF4gXSsb8+STj1n66Hz85Y/O7B9+8AauX3PhglvV5dKl91tk43mWw==} - engines: {node: '>= 18'} - '@nomicfoundation/edr@0.11.3': resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} engines: {node: '>= 18'} @@ -3538,10 +3513,10 @@ packages: '@nomicfoundation/hardhat-verify': ^2.1.0 hardhat: ^2.26.0 - '@nomicfoundation/hardhat-network-helpers@1.0.12': - resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} + '@nomicfoundation/hardhat-network-helpers@1.1.0': + resolution: {integrity: sha512-ZS+NulZuR99NUHt2VwcgZvgeD6Y63qrbORNRuKO+lTowJxNVsrJ0zbRx1j5De6G3dOno5pVGvuYSq2QVG0qCYg==} peerDependencies: - hardhat: ^2.9.5 + hardhat: ^2.26.0 '@nomicfoundation/hardhat-toolbox@4.0.0': resolution: {integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==} @@ -3600,8 +3575,8 @@ packages: '@nomicfoundation/slang@0.18.3': resolution: {integrity: sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==} - '@nomicfoundation/slang@1.1.0': - resolution: {integrity: sha512-g2BofMUq1qCP22L/ksOftScrCxjdHTxgg8ch5PYon2zfSSKGCMwE4TgIC64CuorMcSsvCmqNNFEWR/fwFcMeTw==} + '@nomicfoundation/slang@1.2.0': + resolution: {integrity: sha512-+04Z1RHbbz0ldDbHKQFOzveCdI9Rd3TZZu7fno5hHy3OsqTo9UK5Jgqo68wMvRovCO99POv6oCEyO7+urGeN8Q==} '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} @@ -3671,22 +3646,19 @@ packages: '@openzeppelin/contracts-upgradeable@3.4.2': resolution: {integrity: sha512-mDlBS17ymb2wpaLcrqRYdnBAmP1EwqhOXMvqWk2c5Q1N1pm5TkiCtXM9Xzznh4bYsQBq0aIWEkFFE2+iLSN1Tw==} - '@openzeppelin/contracts-upgradeable@5.3.0': - resolution: {integrity: sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg==} + '@openzeppelin/contracts-upgradeable@5.4.0': + resolution: {integrity: sha512-STJKyDzUcYuB35Zub1JpWW58JxvrFFVgQ+Ykdr8A9PGXgtq/obF5uoh07k2XmFyPxfnZdPdBdhkJ/n2YxJ87HQ==} peerDependencies: - '@openzeppelin/contracts': 5.3.0 + '@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==} - '@openzeppelin/contracts@5.3.0': - resolution: {integrity: sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==} + '@openzeppelin/contracts@5.4.0': + resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==} '@openzeppelin/defender-base-client@1.54.6': resolution: {integrity: sha512-PTef+rMxkM5VQ7sLwLKSjp2DBakYQd661ZJiSRywx+q/nIpm3B/HYGcz5wPZCA5O/QcEP6TatXXDoeMwimbcnw==} @@ -3744,8 +3716,8 @@ packages: resolution: {integrity: sha512-yqvDj7eC7m5kCDgqCxVFgk9sVo9SXP/fQFaExPousNfAJJbX+20l4fKZp17aXbNTpo1g+2205s6cR9VhFFOCaQ==} hasBin: true - '@peculiar/asn1-schema@2.3.15': - resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} + '@peculiar/asn1-schema@2.5.0': + resolution: {integrity: sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==} '@peculiar/json-schema@1.1.12': resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} @@ -3759,8 +3731,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + '@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': @@ -3775,49 +3747,52 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@react-native/assets-registry@0.79.3': - resolution: {integrity: sha512-Vy8DQXCJ21YSAiHxrNBz35VqVlZPpRYm50xRTWRf660JwHuJkFQG8cUkrLzm7AUriqUXxwpkQHcY+b0ibw9ejQ==} - engines: {node: '>=18'} + '@react-native/assets-registry@0.81.4': + resolution: {integrity: sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA==} + engines: {node: '>= 20.19.4'} - '@react-native/codegen@0.79.3': - resolution: {integrity: sha512-CZejXqKch/a5/s/MO5T8mkAgvzCXgsTkQtpCF15kWR9HN8T+16k0CsN7TXAxXycltoxiE3XRglOrZNEa/TiZUQ==} - engines: {node: '>=18'} + '@react-native/codegen@0.81.4': + resolution: {integrity: sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==} + engines: {node: '>= 20.19.4'} peerDependencies: '@babel/core': '*' - '@react-native/community-cli-plugin@0.79.3': - resolution: {integrity: sha512-N/+p4HQqN4yK6IRzn7OgMvUIcrmEWkecglk1q5nj+AzNpfIOzB+mqR20SYmnPfeXF+mZzYCzRANb3KiM+WsSDA==} - engines: {node: '>=18'} + '@react-native/community-cli-plugin@0.81.4': + resolution: {integrity: sha512-8mpnvfcLcnVh+t1ok6V9eozWo8Ut+TZhz8ylJ6gF9d6q9EGDQX6s8jenan5Yv/pzN4vQEKI4ib2pTf/FELw+SA==} + engines: {node: '>= 20.19.4'} peerDependencies: '@react-native-community/cli': '*' + '@react-native/metro-config': '*' peerDependenciesMeta: '@react-native-community/cli': optional: true + '@react-native/metro-config': + optional: true - '@react-native/debugger-frontend@0.79.3': - resolution: {integrity: sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A==} - engines: {node: '>=18'} + '@react-native/debugger-frontend@0.81.4': + resolution: {integrity: sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==} + engines: {node: '>= 20.19.4'} - '@react-native/dev-middleware@0.79.3': - resolution: {integrity: sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw==} - engines: {node: '>=18'} + '@react-native/dev-middleware@0.81.4': + resolution: {integrity: sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==} + engines: {node: '>= 20.19.4'} - '@react-native/gradle-plugin@0.79.3': - resolution: {integrity: sha512-imfpZLhNBc9UFSzb/MOy2tNcIBHqVmexh/qdzw83F75BmUtLb/Gs1L2V5gw+WI1r7RqDILbWk7gXB8zUllwd+g==} - engines: {node: '>=18'} + '@react-native/gradle-plugin@0.81.4': + resolution: {integrity: sha512-T7fPcQvDDCSusZFVSg6H1oVDKb/NnVYLnsqkcHsAF2C2KGXyo3J7slH/tJAwNfj/7EOA2OgcWxfC1frgn9TQvw==} + engines: {node: '>= 20.19.4'} - '@react-native/js-polyfills@0.79.3': - resolution: {integrity: sha512-PEBtg6Kox6KahjCAch0UrqCAmHiNLEbp2SblUEoFAQnov4DSxBN9safh+QSVaCiMAwLjvNfXrJyygZz60Dqz3Q==} - engines: {node: '>=18'} + '@react-native/js-polyfills@0.81.4': + resolution: {integrity: sha512-sr42FaypKXJHMVHhgSbu2f/ZJfrLzgaoQ+HdpRvKEiEh2mhFf6XzZwecyLBvWqf2pMPZa+CpPfNPiejXjKEy8w==} + engines: {node: '>= 20.19.4'} - '@react-native/normalize-colors@0.79.3': - resolution: {integrity: sha512-T75NIQPRFCj6DFMxtcVMJTZR+3vHXaUMSd15t+CkJpc5LnyX91GVaPxpRSAdjFh7m3Yppl5MpdjV/fntImheYQ==} + '@react-native/normalize-colors@0.81.4': + resolution: {integrity: sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==} - '@react-native/virtualized-lists@0.79.3': - resolution: {integrity: sha512-/0rRozkn+iIHya2vnnvprDgT7QkfI54FLrACAN3BLP7MRlfOIGOrZsXpRLndnLBVnjNzkcre84i1RecjoXnwIA==} - engines: {node: '>=18'} + '@react-native/virtualized-lists@0.81.4': + resolution: {integrity: sha512-hBM+rMyL6Wm1Q4f/WpqGsaCojKSNUBqAXLABNGoWm1vabZ7cSnARMxBvA/2vo3hLcoR4v7zDK8tkKm9+O0LjVA==} + engines: {node: '>= 20.19.4'} peerDependencies: - '@types/react': ^19.0.0 + '@types/react': ^19.1.0 react: '*' react-native: '*' peerDependenciesMeta: @@ -3938,8 +3913,8 @@ packages: resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.11.1': - resolution: {integrity: sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==} + '@smithy/core@3.11.0': + resolution: {integrity: sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.1.2': @@ -3990,12 +3965,12 @@ packages: resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.2.3': - resolution: {integrity: sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==} + '@smithy/middleware-endpoint@4.2.2': + resolution: {integrity: sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.2.4': - resolution: {integrity: sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==} + '@smithy/middleware-retry@4.2.2': + resolution: {integrity: sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.1.1': @@ -4030,8 +4005,8 @@ packages: resolution: {integrity: sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.1.2': - resolution: {integrity: sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ==} + '@smithy/service-error-classification@4.1.1': + resolution: {integrity: sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==} engines: {node: '>=18.0.0'} '@smithy/shared-ini-file-loader@4.2.0': @@ -4042,12 +4017,8 @@ packages: resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.6.3': - resolution: {integrity: sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.3.1': - resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + '@smithy/smithy-client@4.6.2': + resolution: {integrity: sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==} engines: {node: '>=18.0.0'} '@smithy/types@4.5.0': @@ -4082,12 +4053,12 @@ packages: resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.1.3': - resolution: {integrity: sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==} + '@smithy/util-defaults-mode-browser@4.1.2': + resolution: {integrity: sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.1.3': - resolution: {integrity: sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==} + '@smithy/util-defaults-mode-node@4.1.2': + resolution: {integrity: sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.1.2': @@ -4102,12 +4073,12 @@ packages: resolution: {integrity: sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.1.2': - resolution: {integrity: sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==} + '@smithy/util-retry@4.1.1': + resolution: {integrity: sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.3.2': - resolution: {integrity: sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g==} + '@smithy/util-stream@4.3.1': + resolution: {integrity: sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.1.0': @@ -4129,9 +4100,6 @@ packages: '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - '@solidity-parser/parser@0.20.1': - resolution: {integrity: sha512-58I2sRpzaQUN+jJmWbHfbWf9AKfzqCI8JAdFB0vbyY+u8tBRcuTt9LxzasvR0LGQpcRv97eyV7l61FQ3Ib7zVw==} - '@solidity-parser/parser@0.20.2': resolution: {integrity: sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==} @@ -4234,8 +4202,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -4261,8 +4229,8 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/form-data@0.0.33': resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} @@ -4310,15 +4278,16 @@ packages: '@types/levelup@4.3.3': resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimatch@6.0.0': + 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==} @@ -4334,11 +4303,11 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node-fetch@2.6.12': - resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@20.17.58': - resolution: {integrity: sha512-UvxetCgGwZ9HmsgGZ2tpStt6CiFU1bu28ftHWpDyfthsCt7OHXas0C7j0VgO3gBq8UHKI785wXmtcQVhLekcRg==} + '@types/node@20.19.14': + resolution: {integrity: sha512-gqiKWld3YIkmtrrg9zDvg9jfksZCcPywXVN7IauUGhilwGV/yOyeUsvpR796m/Jye0zUzMXPKe8Ct1B79A7N5Q==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4385,8 +4354,8 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/validator@13.15.1': - resolution: {integrity: sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==} + '@types/validator@13.15.3': + resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==} '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -4397,63 +4366,63 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.33.1': - resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} + '@typescript-eslint/eslint-plugin@8.44.0': + resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.33.1 + '@typescript-eslint/parser': ^8.44.0 eslint: ^8.57.0 || ^9.0.0 typescript: ^5.8.3 - '@typescript-eslint/parser@8.33.1': - resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} + '@typescript-eslint/parser@8.44.0': + resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ^5.8.3 - '@typescript-eslint/project-service@8.33.1': - resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} + '@typescript-eslint/project-service@8.44.0': + resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: ^5.8.3 - '@typescript-eslint/scope-manager@8.33.1': - resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} + '@typescript-eslint/scope-manager@8.44.0': + resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.33.1': - resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} + '@typescript-eslint/tsconfig-utils@8.44.0': + resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: ^5.8.3 - '@typescript-eslint/type-utils@8.33.1': - resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} + '@typescript-eslint/type-utils@8.44.0': + resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ^5.8.3 - '@typescript-eslint/types@8.33.1': - resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} + '@typescript-eslint/types@8.44.0': + resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.33.1': - resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} + '@typescript-eslint/typescript-estree@8.44.0': + resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: ^5.8.3 - '@typescript-eslint/utils@8.33.1': - resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} + '@typescript-eslint/utils@8.44.0': + resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ^5.8.3 - '@typescript-eslint/visitor-keys@8.33.1': - resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} + '@typescript-eslint/visitor-keys@8.44.0': + resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -4505,8 +4474,8 @@ packages: resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==} engines: {node: '>=18.0.0'} - '@whatwg-node/fetch@0.10.8': - resolution: {integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==} + '@whatwg-node/fetch@0.10.10': + resolution: {integrity: sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==} engines: {node: '>=18.0.0'} '@whatwg-node/fetch@0.8.8': @@ -4515,16 +4484,16 @@ packages: '@whatwg-node/node-fetch@0.3.6': resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} - '@whatwg-node/node-fetch@0.7.21': - resolution: {integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==} + '@whatwg-node/node-fetch@0.7.25': + resolution: {integrity: sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==} engines: {node: '>=18.0.0'} '@whatwg-node/promise-helpers@1.3.2': resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} engines: {node: '>=16.0.0'} - '@whatwg-node/server@0.10.10': - resolution: {integrity: sha512-GwpdMgUmwIp0jGjP535YtViP/nnmETAyHpGPWPZKdX++Qht/tSLbGXgFUMSsQvEACmZAR1lAPNu2CnYL1HpBgg==} + '@whatwg-node/server@0.10.12': + resolution: {integrity: sha512-MQIvvQyPvKGna586MzXhgwnEbGtbm7QtOgJ/KPd/tC70M/jbhd1xHdIQQbh3okBw+MrDF/EvaC2vB5oRC7QdlQ==} engines: {node: '>=18.0.0'} '@whatwg-node/server@0.7.7': @@ -4605,8 +4574,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -4627,8 +4596,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} aggregate-error@3.1.0: @@ -4678,8 +4647,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + ansi-escapes@7.1.0: + resolution: {integrity: sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==} engines: {node: '>=18'} ansi-regex@2.1.1: @@ -4698,8 +4667,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@2.2.1: @@ -4718,8 +4687,8 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} antlr4@4.13.2: @@ -4944,8 +4913,8 @@ packages: axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} babel-code-frame@6.26.0: resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} @@ -5018,8 +4987,8 @@ packages: babel-plugin-syntax-exponentiation-operator@6.13.0: resolution: {integrity: sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==} - babel-plugin-syntax-hermes-parser@0.25.1: - resolution: {integrity: sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==} + babel-plugin-syntax-hermes-parser@0.29.1: + resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==} babel-plugin-syntax-trailing-function-commas@6.22.0: resolution: {integrity: sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==} @@ -5105,10 +5074,10 @@ packages: babel-plugin-transform-strict-mode@6.24.1: resolution: {integrity: sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-env@1.7.0: resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} @@ -5169,6 +5138,10 @@ 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==} + hasBin: true + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -5189,8 +5162,8 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - bignumber.js@9.3.0: - resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} binary-extensions@1.13.1: resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} @@ -5257,11 +5230,11 @@ packages: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@1.8.5: resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} @@ -5305,8 +5278,8 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + browserslist@4.26.0: + resolution: {integrity: sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5462,8 +5435,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001721: - resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} + caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -5471,9 +5444,9 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - cbor@10.0.3: - resolution: {integrity: sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw==} - engines: {node: '>=18'} + cbor@10.0.11: + resolution: {integrity: sha512-vIwORDd/WyB8Nc23o2zNN5RrtFGlR6Fca61TtjkUXueI3Jf2DOZDl1zsshvBntZ3wZHBM9ztjnkXSmzQDaq3WA==} + engines: {node: '>=20'} cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} @@ -5504,8 +5477,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} change-case-all@1.0.14: @@ -5541,6 +5514,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -5639,6 +5615,10 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + cli-truncate@5.0.0: + resolution: {integrity: sha512-ds7u02fPOOBpcUl2VSjLF3lfnAik9u7Zt0BTaaAQlT5RtABALl4cvpJHthXx+rM50J4gSfXKPH5Tix/tfdefUQ==} + engines: {node: '>=20'} + cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -5741,6 +5721,10 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + commander@2.11.0: resolution: {integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==} @@ -5795,8 +5779,8 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - console-table-printer@2.14.1: - resolution: {integrity: sha512-Nvz+lt5BRvG8qJ8KrqhK0rtbE4hbi0oj4G5/2ig7pbMXBCvy+zcHEZbyIdidl2GEL0AwtxYX4Zc3C28fFSPXyA==} + console-table-printer@2.14.6: + resolution: {integrity: sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==} constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} @@ -5866,8 +5850,8 @@ packages: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} - core-js-pure@3.42.0: - resolution: {integrity: sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==} + core-js-pure@3.45.1: + resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} @@ -5933,6 +5917,9 @@ 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==} @@ -5948,6 +5935,9 @@ packages: cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -6045,8 +6035,8 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -6066,11 +6056,11 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -6263,8 +6253,8 @@ packages: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} dotignore@0.1.2: @@ -6297,8 +6287,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.165: - resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} + electron-to-chromium@1.5.218: + resolution: {integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -6310,8 +6300,8 @@ packages: resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} engines: {node: '>=12'} - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6346,8 +6336,8 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} @@ -6375,8 +6365,8 @@ packages: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -6423,8 +6413,8 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -6452,8 +6442,8 @@ packages: engines: {node: '>=0.12.0'} hasBin: true - eslint-config-prettier@10.1.5: - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -6461,8 +6451,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6482,8 +6472,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6492,8 +6482,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@50.7.1: - resolution: {integrity: sha512-XBnVA5g2kUVokTNUiE1McEPse5n9/mNUmuJcx52psT6zBs2eVcXSmQBvjfa7NZdfLVSy3u1pEDDUxoxpwy89WA==} + 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 @@ -6501,6 +6491,7 @@ packages: 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' @@ -6513,8 +6504,8 @@ packages: peerDependencies: eslint: '>=5.0.0' - eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + eslint-plugin-unused-imports@4.2.0: + resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 @@ -6526,16 +6517,16 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@8.57.1: @@ -6544,8 +6535,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.28.0: - resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} + eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6558,8 +6549,8 @@ packages: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -6789,6 +6780,9 @@ packages: eventemitter3@4.0.4: resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -6922,8 +6916,8 @@ packages: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -6948,8 +6942,9 @@ packages: fbjs@3.0.5: resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -7073,8 +7068,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -7116,16 +7111,16 @@ packages: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} - form-data@2.5.3: - resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} + form-data@2.5.5: + resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} engines: {node: '>= 0.12'} - form-data@3.0.3: - resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} + form-data@3.0.4: + resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} engines: {node: '>= 6'} - form-data@4.0.3: - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -7153,8 +7148,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs-extra@4.0.3: @@ -7248,8 +7243,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} get-func-name@2.0.2: @@ -7338,8 +7333,8 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.2: - resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} hasBin: true @@ -7391,10 +7386,6 @@ packages: global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -7403,8 +7394,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.1.0: - resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} globals@9.18.0: @@ -7476,8 +7467,8 @@ packages: peerDependencies: graphql: ^15.2.0 || ^16.0.0 - graphql-yoga@5.13.5: - resolution: {integrity: sha512-a0DxeXr2oazOlnh8i+By8EM8QJPIG9OcI/nB6K//paM6fjv97WTYgXd57r0Ni0yOm6ts+y1yYL5IG90N4UWFmQ==} + graphql-yoga@5.15.2: + resolution: {integrity: sha512-8cAdS1HNz5XRfYwr+t3jPP9KTyws1G0fYYaLZ5kgqXbcDJLhGjF1RVL21qL86g+DdmNi7uR+g4R+Zgzz6GBAzw==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^15.2.0 || ^16.0.0 @@ -7522,8 +7513,8 @@ packages: peerDependencies: hardhat: ^2.0.0 - hardhat-contract-sizer@2.10.0: - resolution: {integrity: sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==} + hardhat-contract-sizer@2.10.1: + resolution: {integrity: sha512-/PPQQbUMgW6ERzk8M0/DA8/v2TEM9xRRAnF9qKPNMYF6FX5DFWcnxBsQvtp8uBz+vy7rmLyV9Elti2wmmhgkbg==} peerDependencies: hardhat: ^2.0.0 @@ -7560,18 +7551,6 @@ packages: peerDependencies: hardhat: ^2.0.3 - hardhat@2.24.2: - resolution: {integrity: sha512-oYt+tcN2379Z3kqIhvVw6IFgWqTm/ixcrTvyAuQdE2RbD+kknwF7hDfUeggy0akrw6xdgCtXvnw9DFrxAB70hA==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: ^5.8.3 - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - hardhat@2.26.3: resolution: {integrity: sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==} hasBin: true @@ -7646,6 +7625,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'} @@ -7689,17 +7671,11 @@ packages: resolution: {integrity: sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==} engines: {node: '>=16.0.0'} - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-estree@0.28.1: - resolution: {integrity: sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ==} + hermes-estree@0.29.1: + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - - hermes-parser@0.28.1: - resolution: {integrity: sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg==} + hermes-parser@0.29.1: + resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -7801,6 +7777,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + idna-uts46-hx@2.3.1: resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} engines: {node: '>=4.0.0'} @@ -7852,8 +7832,8 @@ packages: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} @@ -7915,8 +7895,8 @@ packages: io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -7954,8 +7934,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} @@ -8079,8 +8059,8 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} is-function@1.0.2: @@ -8353,8 +8333,8 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true js-cookie@2.2.1: @@ -8387,9 +8367,6 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsc-safe-url@0.2.4: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} @@ -8496,8 +8473,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} @@ -8708,6 +8685,11 @@ packages: engines: {node: '>=20.18'} hasBin: true + lint-staged@16.1.6: + resolution: {integrity: sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==} + engines: {node: '>=20.17'} + hasBin: true + listr2@4.0.5: resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} engines: {node: '>=12'} @@ -8721,6 +8703,10 @@ packages: 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'} + load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} @@ -8861,8 +8847,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} lru-cache@3.2.0: @@ -9021,8 +9007,8 @@ packages: merkle-patricia-tree@4.2.4: resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} - meros@1.3.0: - resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} + meros@1.3.2: + resolution: {integrity: sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==} engines: {node: '>=13'} peerDependencies: '@types/node': ^20.17.50 @@ -9034,62 +9020,62 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.82.4: - resolution: {integrity: sha512-4juJahGRb1gmNbQq48lNinB6WFNfb6m0BQqi/RQibEltNiqTCxew/dBspI2EWA4xVCd3mQWGfw0TML4KurQZnQ==} - engines: {node: '>=18.18'} + metro-babel-transformer@0.83.1: + resolution: {integrity: sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==} + engines: {node: '>=20.19.4'} - metro-cache-key@0.82.4: - resolution: {integrity: sha512-2JCTqcpF+f2OghOpe/+x+JywfzDkrHdAqinPFWmK2ezNAU/qX0jBFaTETogPibFivxZJil37w9Yp6syX8rFUng==} - engines: {node: '>=18.18'} + metro-cache-key@0.83.1: + resolution: {integrity: sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==} + engines: {node: '>=20.19.4'} - metro-cache@0.82.4: - resolution: {integrity: sha512-vX0ylSMGtORKiZ4G8uP6fgfPdDiCWvLZUGZ5zIblSGylOX6JYhvExl0Zg4UA9pix/SSQu5Pnp9vdODMFsNIxhw==} - engines: {node: '>=18.18'} + metro-cache@0.83.1: + resolution: {integrity: sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==} + engines: {node: '>=20.19.4'} - metro-config@0.82.4: - resolution: {integrity: sha512-Ki3Wumr3hKHGDS7RrHsygmmRNc/PCJrvkLn0+BWWxmbOmOcMMJDSmSI+WRlT8jd5VPZFxIi4wg+sAt5yBXAK0g==} - engines: {node: '>=18.18'} + metro-config@0.83.1: + resolution: {integrity: sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==} + engines: {node: '>=20.19.4'} - metro-core@0.82.4: - resolution: {integrity: sha512-Xo4ozbxPg2vfgJGCgXZ8sVhC2M0lhTqD+tsKO2q9aelq/dCjnnSb26xZKcQO80CQOQUL7e3QWB7pLFGPjZm31A==} - engines: {node: '>=18.18'} + metro-core@0.83.1: + resolution: {integrity: sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==} + engines: {node: '>=20.19.4'} - metro-file-map@0.82.4: - resolution: {integrity: sha512-eO7HD1O3aeNsbEe6NBZvx1lLJUrxgyATjnDmb7bm4eyF6yWOQot9XVtxTDLNifECuvsZ4jzRiTInrbmIHkTdGA==} - engines: {node: '>=18.18'} + metro-file-map@0.83.1: + resolution: {integrity: sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==} + engines: {node: '>=20.19.4'} - metro-minify-terser@0.82.4: - resolution: {integrity: sha512-W79Mi6BUwWVaM8Mc5XepcqkG+TSsCyyo//dmTsgYfJcsmReQorRFodil3bbJInETvjzdnS1mCsUo9pllNjT1Hg==} - engines: {node: '>=18.18'} + metro-minify-terser@0.83.1: + resolution: {integrity: sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==} + engines: {node: '>=20.19.4'} - metro-resolver@0.82.4: - resolution: {integrity: sha512-uWoHzOBGQTPT5PjippB8rRT3iI9CTgFA9tRiLMzrseA5o7YAlgvfTdY9vFk2qyk3lW3aQfFKWkmqENryPRpu+Q==} - engines: {node: '>=18.18'} + metro-resolver@0.83.1: + resolution: {integrity: sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==} + engines: {node: '>=20.19.4'} - metro-runtime@0.82.4: - resolution: {integrity: sha512-vVyFO7H+eLXRV2E7YAUYA7aMGBECGagqxmFvC2hmErS7oq90BbPVENfAHbUWq1vWH+MRiivoRxdxlN8gBoF/dw==} - engines: {node: '>=18.18'} + metro-runtime@0.83.1: + resolution: {integrity: sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==} + engines: {node: '>=20.19.4'} - metro-source-map@0.82.4: - resolution: {integrity: sha512-9jzDQJ0FPas1FuQFtwmBHsez2BfhFNufMowbOMeG3ZaFvzeziE8A0aJwILDS3U+V5039ssCQFiQeqDgENWvquA==} - engines: {node: '>=18.18'} + metro-source-map@0.83.1: + resolution: {integrity: sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==} + engines: {node: '>=20.19.4'} - metro-symbolicate@0.82.4: - resolution: {integrity: sha512-LwEwAtdsx7z8rYjxjpLWxuFa2U0J6TS6ljlQM4WAATKa4uzV8unmnRuN2iNBWTmRqgNR77mzmI2vhwD4QSCo+w==} - engines: {node: '>=18.18'} + metro-symbolicate@0.83.1: + resolution: {integrity: sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==} + engines: {node: '>=20.19.4'} hasBin: true - metro-transform-plugins@0.82.4: - resolution: {integrity: sha512-NoWQRPHupVpnDgYguiEcm7YwDhnqW02iWWQjO2O8NsNP09rEMSq99nPjARWfukN7+KDh6YjLvTIN20mj3dk9kw==} - engines: {node: '>=18.18'} + metro-transform-plugins@0.83.1: + resolution: {integrity: sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==} + engines: {node: '>=20.19.4'} - metro-transform-worker@0.82.4: - resolution: {integrity: sha512-kPI7Ad/tdAnI9PY4T+2H0cdgGeSWWdiPRKuytI806UcN4VhFL6OmYa19/4abYVYF+Cd2jo57CDuwbaxRfmXDhw==} - engines: {node: '>=18.18'} + metro-transform-worker@0.83.1: + resolution: {integrity: sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==} + engines: {node: '>=20.19.4'} - metro@0.82.4: - resolution: {integrity: sha512-/gFmw3ux9CPG5WUmygY35hpyno28zi/7OUn6+OFfbweA8l0B+PPqXXLr0/T6cf5nclCcH0d22o+02fICaShVxw==} - engines: {node: '>=18.18'} + metro@0.83.1: + resolution: {integrity: sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==} + engines: {node: '>=20.19.4'} hasBin: true micro-eth-signer@0.14.0: @@ -9253,8 +9239,8 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -9416,14 +9402,14 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + nan@2.23.0: + resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} nano-json-stream-parser@0.1.2: resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} - nano-spawn@1.0.2: - resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} + nano-spawn@1.0.3: + resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} engines: {node: '>=20.17'} nanomatch@1.2.13: @@ -9532,8 +9518,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -9569,8 +9555,8 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} npm-package-arg@11.0.3: @@ -9611,9 +9597,9 @@ packages: oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - ob1@0.82.4: - resolution: {integrity: sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA==} - engines: {node: '>=18.18'} + ob1@0.83.1: + resolution: {integrity: sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==} + engines: {node: '>=20.19.4'} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -10012,8 +9998,8 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + pbkdf2@3.1.3: + resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} engines: {node: '>=0.12'} pegjs@0.10.0: @@ -10024,11 +10010,11 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - pg-cloudflare@1.2.5: - resolution: {integrity: sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==} + pg-cloudflare@1.2.7: + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} - pg-connection-string@2.9.0: - resolution: {integrity: sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==} + pg-connection-string@2.9.1: + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} pg-hstore@2.3.4: resolution: {integrity: sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==} @@ -10038,13 +10024,13 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.10.0: - resolution: {integrity: sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==} + pg-pool@3.10.1: + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} peerDependencies: pg: '>=8.0' - pg-protocol@1.10.0: - resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==} + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -10082,8 +10068,8 @@ packages: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pidtree@0.5.0: @@ -10191,14 +10177,14 @@ packages: resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} engines: {node: '>=0.10.0'} - prettier-plugin-solidity@2.0.0: - resolution: {integrity: sha512-tis3SwLSrYKDzzRFle48fjPM4GQKBtkVBUajAkt4b75/cc6zojFP7qjz6fDxKfup+34q0jKeSM3QeP9flJFXWw==} - engines: {node: '>=18'} + prettier-plugin-solidity@2.1.0: + resolution: {integrity: sha512-O5HX4/PCE5aqiaEiNGbSRLbSBZQ6kLswAav5LBSewwzhT+sZlN6iAaLZlZcJzPEnIAxwLEHP03xKEg92fflT9Q==} + engines: {node: '>=20'} peerDependencies: prettier: ^3.5.3 - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -10303,8 +10289,8 @@ packages: pull-window@2.1.4: resolution: {integrity: sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} pumpify@2.0.1: resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} @@ -10363,8 +10349,8 @@ packages: resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} engines: {node: '>=0.6'} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} query-string@5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} @@ -10421,8 +10407,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-devtools-core@6.1.2: - resolution: {integrity: sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==} + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -10439,13 +10425,13 @@ packages: react-native-path@0.0.5: resolution: {integrity: sha512-WJr256xBquk7X2O83QYWKqgLg43Zg3SrgjPc/kr0gCD2LoXA+2L72BW4cmstH12GbGeutqs/eXk3jgDQ2iCSvQ==} - react-native@0.79.3: - resolution: {integrity: sha512-EzH1+9gzdyEo9zdP6u7Sh3Jtf5EOMwzy+TK65JysdlgAzfEVfq4mNeXcAZ6SmD+CW6M7ARJbvXLyTD0l2S5rpg==} - engines: {node: '>=18'} + react-native@0.81.4: + resolution: {integrity: sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==} + engines: {node: '>= 20.19.4'} hasBin: true peerDependencies: - '@types/react': ^19.0.0 - react: ^19.0.0 + '@types/react': ^19.1.0 + react: ^19.1.0 peerDependenciesMeta: '@types/react': optional: true @@ -10454,8 +10440,8 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} read-pkg-up@1.0.1: @@ -10713,6 +10699,9 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + ripemd160@2.0.1: + resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} @@ -10781,8 +10770,8 @@ packages: resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} hasBin: true - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} @@ -10967,8 +10956,9 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} hasBin: true sha1@1.1.1: @@ -11034,11 +11024,11 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - simple-wcswidth@1.0.1: - resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} + simple-wcswidth@1.1.2: + resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -11067,8 +11057,8 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} smart-buffer@4.2.0: @@ -11098,8 +11088,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.4: - resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sol-digger@0.0.2: @@ -11144,8 +11134,8 @@ packages: resolution: {integrity: sha512-Lew5nhmkXqHPybzBzkMzvvWkpOJSSLTkfTZwRriWvfR2naS4YW2PsjVGaoX9tZFmHh7SuS+e2GEGo5FPYYmJ8g==} hasBin: true - solidity-ast@0.4.60: - resolution: {integrity: sha512-UwhasmQ37ji1ul8cIp0XlrQ/+SVQhy09gGqJH4jnwdo2TgI6YIByzi0PI5QvIGcIdFOs1pbSmJW1pnWB7AVh2w==} + solidity-ast@0.4.61: + resolution: {integrity: sha512-OYBJYcYyG7gLV0VuXl9CUrvgJXjV/v0XnR4+1YomVe3q+QyENQXJJxAEASUz4vN6lMAl+C8RSRSr5MBAz09f6w==} solidity-coverage@0.8.16: resolution: {integrity: sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==} @@ -11218,8 +11208,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} @@ -11238,9 +11228,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - src-location@1.1.0: resolution: {integrity: sha512-idBVZgLZGzB3B2Et317AFDQto7yRgp1tOuFd+VKIH2dw1jO1b6p07zNjtQoVhkW+CY6oGTp9Y5UIfbJoZRsoFQ==} @@ -11324,6 +11311,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -11361,8 +11352,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@2.0.0: @@ -11483,8 +11474,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.41.0: - resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true @@ -11550,8 +11541,8 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} title-case@3.0.3: @@ -11568,6 +11559,10 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} + to-fast-properties@1.0.3: resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} engines: {node: '>=0.10.0'} @@ -11793,15 +11788,15 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.33.1: - resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} + typescript-eslint@8.44.0: + resolution: {integrity: sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ^5.8.3 - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -11828,8 +11823,8 @@ packages: u2f-api@0.2.7: resolution: {integrity: sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg==} - ua-parser-js@1.0.40: - resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} hasBin: true uc.micro@2.1.0: @@ -11857,8 +11852,8 @@ packages: underscore@1.9.1: resolution: {integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} @@ -12273,8 +12268,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} wrappy@1.0.2: @@ -12441,8 +12436,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -12504,13 +12499,13 @@ packages: peerDependencies: ethers: ^5.7.0 - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: zod: ^3.24.1 - zod@3.25.51: - resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: @@ -12518,11 +12513,6 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - '@arbitrum/sdk@3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/address': 5.8.0 @@ -12544,13 +12534,13 @@ snapshots: '@ardatan/relay-compiler@12.0.0(encoding@0.1.13)(graphql@16.11.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/runtime': 7.27.6 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - babel-preset-fbjs: 3.4.0(@babel/core@7.27.4) + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/runtime': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + babel-preset-fbjs: 3.4.0(@babel/core@7.28.4) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5(encoding@0.1.13) @@ -12591,7 +12581,7 @@ snapshots: '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.821.0 + '@aws-sdk/types': 3.887.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': @@ -12606,7 +12596,7 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.821.0 + '@aws-sdk/types': 3.887.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -12616,23 +12606,23 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-lambda@3.891.0': + '@aws-sdk/client-lambda@3.888.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/credential-provider-node': 3.891.0 - '@aws-sdk/middleware-host-header': 3.891.0 - '@aws-sdk/middleware-logger': 3.891.0 - '@aws-sdk/middleware-recursion-detection': 3.891.0 - '@aws-sdk/middleware-user-agent': 3.891.0 - '@aws-sdk/region-config-resolver': 3.890.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.891.0 + '@aws-sdk/util-endpoints': 3.887.0 '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.891.0 + '@aws-sdk/util-user-agent-node': 3.888.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@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 @@ -12640,84 +12630,84 @@ snapshots: '@smithy/hash-node': 4.1.1 '@smithy/invalid-dependency': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.3 - '@smithy/middleware-retry': 4.2.4 + '@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.3 + '@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.3 - '@smithy/util-defaults-mode-node': 4.1.3 + '@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.2 - '@smithy/util-stream': 4.3.2 + '@smithy/util-retry': 4.1.1 + '@smithy/util-stream': 4.3.1 '@smithy/util-utf8': 4.1.0 '@smithy/util-waiter': 4.1.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.891.0': + '@aws-sdk/client-sso@3.888.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/middleware-host-header': 3.891.0 - '@aws-sdk/middleware-logger': 3.891.0 - '@aws-sdk/middleware-recursion-detection': 3.891.0 - '@aws-sdk/middleware-user-agent': 3.891.0 - '@aws-sdk/region-config-resolver': 3.890.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.891.0 + '@aws-sdk/util-endpoints': 3.887.0 '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.891.0 + '@aws-sdk/util-user-agent-node': 3.888.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@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.3 - '@smithy/middleware-retry': 4.2.4 + '@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.3 + '@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.3 - '@smithy/util-defaults-mode-node': 4.1.3 + '@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.2 + '@smithy/util-retry': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.890.0': + '@aws-sdk/core@3.888.0': dependencies: '@aws-sdk/types': 3.887.0 '@aws-sdk/xml-builder': 3.887.0 - '@smithy/core': 3.11.1 + '@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.3 + '@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 @@ -12726,36 +12716,36 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.890.0': + '@aws-sdk/credential-provider-env@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 + '@aws-sdk/core': 3.888.0 '@aws-sdk/types': 3.887.0 '@smithy/property-provider': 4.1.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.890.0': + '@aws-sdk/credential-provider-http@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 + '@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.3 + '@smithy/smithy-client': 4.6.2 '@smithy/types': 4.5.0 - '@smithy/util-stream': 4.3.2 + '@smithy/util-stream': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.891.0': + '@aws-sdk/credential-provider-ini@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/credential-provider-env': 3.890.0 - '@aws-sdk/credential-provider-http': 3.890.0 - '@aws-sdk/credential-provider-process': 3.890.0 - '@aws-sdk/credential-provider-sso': 3.891.0 - '@aws-sdk/credential-provider-web-identity': 3.891.0 - '@aws-sdk/nested-clients': 3.891.0 + '@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 @@ -12765,14 +12755,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.891.0': + '@aws-sdk/credential-provider-node@3.888.0': dependencies: - '@aws-sdk/credential-provider-env': 3.890.0 - '@aws-sdk/credential-provider-http': 3.890.0 - '@aws-sdk/credential-provider-ini': 3.891.0 - '@aws-sdk/credential-provider-process': 3.890.0 - '@aws-sdk/credential-provider-sso': 3.891.0 - '@aws-sdk/credential-provider-web-identity': 3.891.0 + '@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 @@ -12782,20 +12772,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.890.0': + '@aws-sdk/credential-provider-process@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 + '@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 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.891.0': + '@aws-sdk/credential-provider-sso@3.888.0': dependencies: - '@aws-sdk/client-sso': 3.891.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/token-providers': 3.891.0 + '@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 @@ -12804,32 +12794,31 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.891.0': + '@aws-sdk/credential-provider-web-identity@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/nested-clients': 3.891.0 + '@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 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.891.0': + '@aws-sdk/middleware-host-header@3.887.0': dependencies: '@aws-sdk/types': 3.887.0 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.891.0': + '@aws-sdk/middleware-logger@3.887.0': dependencies: '@aws-sdk/types': 3.887.0 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.891.0': + '@aws-sdk/middleware-recursion-detection@3.887.0': dependencies: '@aws-sdk/types': 3.887.0 '@aws/lambda-invoke-store': 0.0.1 @@ -12837,60 +12826,60 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.891.0': + '@aws-sdk/middleware-user-agent@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 + '@aws-sdk/core': 3.888.0 '@aws-sdk/types': 3.887.0 - '@aws-sdk/util-endpoints': 3.891.0 - '@smithy/core': 3.11.1 + '@aws-sdk/util-endpoints': 3.887.0 + '@smithy/core': 3.11.0 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.891.0': + '@aws-sdk/nested-clients@3.888.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.890.0 - '@aws-sdk/middleware-host-header': 3.891.0 - '@aws-sdk/middleware-logger': 3.891.0 - '@aws-sdk/middleware-recursion-detection': 3.891.0 - '@aws-sdk/middleware-user-agent': 3.891.0 - '@aws-sdk/region-config-resolver': 3.890.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.891.0 + '@aws-sdk/util-endpoints': 3.887.0 '@aws-sdk/util-user-agent-browser': 3.887.0 - '@aws-sdk/util-user-agent-node': 3.891.0 + '@aws-sdk/util-user-agent-node': 3.888.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@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.3 - '@smithy/middleware-retry': 4.2.4 + '@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.3 + '@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.3 - '@smithy/util-defaults-mode-node': 4.1.3 + '@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.2 + '@smithy/util-retry': 4.1.1 '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.890.0': + '@aws-sdk/region-config-resolver@3.887.0': dependencies: '@aws-sdk/types': 3.887.0 '@smithy/node-config-provider': 4.2.2 @@ -12899,10 +12888,10 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.891.0': + '@aws-sdk/token-providers@3.888.0': dependencies: - '@aws-sdk/core': 3.890.0 - '@aws-sdk/nested-clients': 3.891.0 + '@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 @@ -12911,17 +12900,12 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.821.0': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - '@aws-sdk/types@3.887.0': dependencies: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.891.0': + '@aws-sdk/util-endpoints@3.887.0': dependencies: '@aws-sdk/types': 3.887.0 '@smithy/types': 4.5.0 @@ -12940,9 +12924,9 @@ snapshots: bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.891.0': + '@aws-sdk/util-user-agent-node@3.888.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.891.0 + '@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 @@ -12965,103 +12949,105 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.27.4': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.5': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + browserslist: 4.26.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -13071,274 +13057,277 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 - '@babel/parser@7.27.5': + '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.4)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.27.4)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.28.4)': dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - globals: 11.12.0 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@babel/traverse@7.27.4': + '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@9.4.0) - globals: 11.12.0 + '@babel/types': 7.28.4 + debug: 4.4.3(supports-color@9.4.0) transitivePeerDependencies: - supports-color - '@babel/types@7.27.6': + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -13347,7 +13336,7 @@ snapshots: '@bytecodealliance/preview2-shim@0.17.2': {} - '@changesets/apply-release-plan@7.0.12': + '@changesets/apply-release-plan@7.0.13': dependencies: '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 @@ -13359,11 +13348,11 @@ snapshots: fs-extra: 7.0.1 lodash.startcase: 4.4.0 outdent: 0.5.0 - prettier: 3.5.3 + prettier: 3.6.2 resolve-from: 5.0.0 semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.8': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -13376,15 +13365,15 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.4': + '@changesets/cli@2.29.7(@types/node@20.19.14)': dependencies: - '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.12 + '@changesets/get-release-plan': 4.0.13 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 @@ -13392,11 +13381,11 @@ 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) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 @@ -13406,6 +13395,8 @@ snapshots: semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' '@changesets/config@3.1.1': dependencies: @@ -13428,9 +13419,9 @@ snapshots: picocolors: 1.1.1 semver: 7.7.2 - '@changesets/get-release-plan@4.0.12': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/config': 3.1.1 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.5 @@ -13487,7 +13478,7 @@ snapshots: '@changesets/types': 6.1.0 fs-extra: 7.0.1 human-id: 4.1.1 - prettier: 3.5.3 + prettier: 3.6.2 '@colors/colors@1.5.0': optional: true @@ -13509,11 +13500,11 @@ snapshots: - '@swc/core' - '@swc/wasm' - '@commitlint/cli@19.8.1(@types/node@20.17.58)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@20.19.14)(typescript@5.9.2)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@20.17.58)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@20.19.14)(typescript@5.9.2) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -13567,7 +13558,7 @@ snapshots: '@commitlint/format@19.8.1': dependencies: '@commitlint/types': 19.8.1 - chalk: 5.4.1 + chalk: 5.6.2 '@commitlint/is-ignored@16.2.4': dependencies: @@ -13599,26 +13590,26 @@ snapshots: '@commitlint/execute-rule': 16.2.1 '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 - '@types/node': 20.17.58 + '@types/node': 20.19.14 chalk: 4.1.2 cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 2.0.2(@types/node@20.17.58)(cosmiconfig@7.1.0)(typescript@5.8.3) + 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.8.3 + typescript: 5.9.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@commitlint/load@19.8.1(@types/node@20.17.58)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@20.19.14)(typescript@5.9.2)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 '@commitlint/resolve-extends': 19.8.1 '@commitlint/types': 19.8.1 - chalk: 5.4.1 - cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@20.17.58)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + 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) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -13671,7 +13662,7 @@ snapshots: '@commitlint/config-validator': 19.8.1 '@commitlint/types': 19.8.1 global-directory: 4.0.1 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 @@ -13709,7 +13700,7 @@ snapshots: '@commitlint/types@19.8.1': dependencies: '@types/conventional-commits-parser': 5.0.1 - chalk: 5.4.1 + chalk: 5.6.2 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -13721,43 +13712,26 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@defi-wonderland/natspec-smells@1.1.6(typescript@5.8.3)(zod@3.25.51)': + '@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.8.3)(zod@3.25.51) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - lodash.isequal: 4.5.0 - lodash.isequalwith: 4.4.0 - rxjs: 7.8.2 - semver: 7.7.2 - transitivePeerDependencies: - - c-kzg - - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@defi-wonderland/smock@2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.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))': 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.2 @@ -13780,7 +13754,7 @@ snapshots: '@envelop/types': 3.0.2 tslib: 2.8.1 - '@envelop/core@5.2.3': + '@envelop/core@5.3.1': dependencies: '@envelop/instrumentation': 1.0.0 '@envelop/types': 5.2.1 @@ -13818,120 +13792,120 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: - '@types/estree': 1.0.7 - '@typescript-eslint/types': 8.33.1 + '@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.10': + '@esbuild/aix-ppc64@0.25.9': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/android-arm64@0.25.9': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm@0.25.9': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-x64@0.25.9': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/darwin-arm64@0.25.9': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/darwin-x64@0.25.9': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.25.9': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/freebsd-x64@0.25.9': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/linux-arm64@0.25.9': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/linux-arm@0.25.9': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/linux-ia32@0.25.9': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-loong64@0.25.9': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-mips64el@0.25.9': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ppc64@0.25.9': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-riscv64@0.25.9': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-s390x@0.25.9': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/netbsd-arm64@0.25.9': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/sunos-x64@0.25.9': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/win32-arm64@0.25.9': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-ia32@0.25.9': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@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.7.0(eslint@9.28.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.5.1))': dependencies: - eslint: 9.28.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.20.0': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.2': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.14.0': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -13945,8 +13919,8 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@9.4.0) - espree: 10.3.0 + debug: 4.4.3(supports-color@9.4.0) + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -13958,13 +13932,13 @@ snapshots: '@eslint/js@8.57.1': {} - '@eslint/js@9.28.0': {} + '@eslint/js@9.35.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.1': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.14.0 + '@eslint/core': 0.15.2 levn: 0.4.1 '@ethereum-waffle/chai@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': @@ -13980,7 +13954,7 @@ snapshots: '@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))': dependencies: '@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)) - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) json-bigint: 1.0.0 transitivePeerDependencies: @@ -13988,19 +13962,19 @@ snapshots: - '@ensdomains/resolver' - supports-color - '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(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)': 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.8.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)) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.12 + '@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.6.12 ts-generator: 0.1.1 - typechain: 3.0.0(typescript@5.8.3) + typechain: 3.0.0(typescript@5.9.2) transitivePeerDependencies: - bufferutil - encoding @@ -14008,18 +13982,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.8.3))(typescript@5.8.3)': + '@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)': 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.8.3))(typescript@5.8.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) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.12 + '@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.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) transitivePeerDependencies: - '@ethersproject/abi' - '@ethersproject/providers' @@ -14071,7 +14045,7 @@ snapshots: dependencies: '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@ganache/ethereum-options': 0.1.4 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ganache: 7.4.3 transitivePeerDependencies: @@ -14091,7 +14065,7 @@ snapshots: '@ethereumjs/block': 3.6.3 '@ethereumjs/common': 2.6.5 '@ethereumjs/ethash': 1.1.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) ethereumjs-util: 7.1.5 level-mem: 5.0.1 lru-cache: 5.1.1 @@ -14146,10 +14120,10 @@ snapshots: dependencies: '@ethereumjs/block': 3.6.3 '@ethereumjs/blockchain': 5.5.3 - '@ethereumjs/common': 2.6.5 - '@ethereumjs/tx': 3.5.2 + '@ethereumjs/common': 2.6.0 + '@ethereumjs/tx': 3.4.0 async-eventemitter: 0.2.4 - core-js-pure: 3.42.0 + core-js-pure: 3.45.1 debug: 2.6.9 ethereumjs-util: 7.1.5 functional-red-black-tree: 1.0.1 @@ -14175,14 +14149,14 @@ snapshots: '@ethersproject/abi@5.6.0': dependencies: '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/constants': 5.6.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 '@ethersproject/abi@5.7.0': dependencies: @@ -14210,23 +14184,23 @@ snapshots: '@ethersproject/abstract-provider@5.6.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/web': 5.8.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/networks': 5.6.1 + '@ethersproject/properties': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/web': 5.6.0 '@ethersproject/abstract-provider@5.7.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/web': 5.8.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 '@ethersproject/abstract-provider@5.8.0': dependencies: @@ -14241,18 +14215,18 @@ snapshots: '@ethersproject/abstract-signer@5.6.0': dependencies: '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 '@ethersproject/abstract-signer@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 '@ethersproject/abstract-signer@5.8.0': dependencies: @@ -14264,11 +14238,11 @@ snapshots: '@ethersproject/address@5.6.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/rlp': 5.8.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/rlp': 5.6.0 '@ethersproject/address@5.6.1': dependencies: @@ -14280,11 +14254,11 @@ snapshots: '@ethersproject/address@5.7.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/rlp': 5.8.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 '@ethersproject/address@5.8.0': dependencies: @@ -14309,12 +14283,12 @@ snapshots: '@ethersproject/basex@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/properties': 5.8.0 + '@ethersproject/properties': 5.6.0 '@ethersproject/basex@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/properties': 5.8.0 + '@ethersproject/properties': 5.7.0 '@ethersproject/basex@5.8.0': dependencies: @@ -14324,13 +14298,13 @@ snapshots: '@ethersproject/bignumber@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 bn.js: 4.12.2 '@ethersproject/bignumber@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 bn.js: 5.2.2 '@ethersproject/bignumber@5.8.0': @@ -14341,11 +14315,11 @@ snapshots: '@ethersproject/bytes@5.6.1': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/bytes@5.7.0': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/bytes@5.8.0': dependencies: @@ -14353,11 +14327,11 @@ snapshots: '@ethersproject/constants@5.6.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/constants@5.7.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants@5.8.0': dependencies: @@ -14369,25 +14343,25 @@ snapshots: '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 - - '@ethersproject/contracts@5.7.0': - dependencies: + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/transactions': 5.6.0 + + '@ethersproject/contracts@5.7.0': + dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 '@ethersproject/contracts@5.8.0': dependencies: @@ -14427,24 +14401,24 @@ snapshots: dependencies: '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 '@ethersproject/hash@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 '@ethersproject/hash@5.8.0': dependencies: @@ -14461,32 +14435,32 @@ snapshots: '@ethersproject/hdnode@5.6.0': dependencies: '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/basex': 5.6.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wordlists': 5.8.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/wordlists': 5.6.0 '@ethersproject/hdnode@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wordlists': 5.8.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 '@ethersproject/hdnode@5.8.0': dependencies: @@ -14508,14 +14482,14 @@ snapshots: '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 aes-js: 3.0.0 scrypt-js: 3.0.1 @@ -14524,14 +14498,14 @@ snapshots: '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/pbkdf2': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 @@ -14574,15 +14548,15 @@ snapshots: '@ethersproject/networks@5.6.1': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/networks@5.7.0': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/networks@5.7.1': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/networks@5.8.0': dependencies: @@ -14591,12 +14565,12 @@ snapshots: '@ethersproject/pbkdf2@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/sha2': 5.8.0 + '@ethersproject/sha2': 5.6.0 '@ethersproject/pbkdf2@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/sha2': 5.8.0 + '@ethersproject/sha2': 5.7.0 '@ethersproject/pbkdf2@5.8.0': dependencies: @@ -14605,11 +14579,11 @@ snapshots: '@ethersproject/properties@5.6.0': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/properties@5.7.0': dependencies: - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/properties@5.8.0': dependencies: @@ -14620,20 +14594,20 @@ snapshots: '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/basex': 5.6.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.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 + '@ethersproject/constants': 5.6.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/networks': 5.6.1 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/rlp': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/web': 5.6.0 bech32: 1.1.4 ws: 7.4.6(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -14645,21 +14619,21 @@ snapshots: '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.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 + '@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 bech32: 1.1.4 ws: 7.4.6(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -14721,12 +14695,12 @@ snapshots: '@ethersproject/random@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/random@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/random@5.8.0': dependencies: @@ -14736,12 +14710,12 @@ snapshots: '@ethersproject/rlp@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/rlp@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/rlp@5.8.0': dependencies: @@ -14751,13 +14725,13 @@ snapshots: '@ethersproject/sha2@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.6.0 hash.js: 1.1.7 '@ethersproject/sha2@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 '@ethersproject/sha2@5.8.0': @@ -14769,8 +14743,8 @@ snapshots: '@ethersproject/signing-key@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 bn.js: 4.12.2 elliptic: 6.5.4 hash.js: 1.1.7 @@ -14778,8 +14752,8 @@ snapshots: '@ethersproject/signing-key@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 bn.js: 5.2.2 elliptic: 6.5.4 hash.js: 1.1.7 @@ -14795,21 +14769,21 @@ snapshots: '@ethersproject/solidity@5.6.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/strings': 5.6.0 '@ethersproject/solidity@5.7.0': dependencies: - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 '@ethersproject/solidity@5.8.0': dependencies: @@ -14823,14 +14797,14 @@ snapshots: '@ethersproject/strings@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/strings@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/strings@5.8.0': dependencies: @@ -14841,26 +14815,26 @@ snapshots: '@ethersproject/transactions@5.6.0': dependencies: '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/signing-key': 5.8.0 + '@ethersproject/constants': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/rlp': 5.6.0 + '@ethersproject/signing-key': 5.6.0 '@ethersproject/transactions@5.7.0': dependencies: '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/signing-key': 5.8.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions@5.8.0': dependencies: @@ -14876,15 +14850,15 @@ snapshots: '@ethersproject/units@5.6.0': dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 '@ethersproject/units@5.7.0': dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 '@ethersproject/units@5.8.0': dependencies: @@ -14897,36 +14871,36 @@ snapshots: '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/json-wallets': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wordlists': 5.8.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/json-wallets': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/wordlists': 5.6.0 '@ethersproject/wallet@5.7.0': dependencies: '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/hdnode': 5.8.0 - '@ethersproject/json-wallets': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/wordlists': 5.8.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 '@ethersproject/wallet@5.8.0': dependencies: @@ -14948,27 +14922,27 @@ snapshots: '@ethersproject/web@5.6.0': dependencies: - '@ethersproject/base64': 5.8.0 + '@ethersproject/base64': 5.6.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 '@ethersproject/web@5.7.0': dependencies: - '@ethersproject/base64': 5.8.0 + '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 '@ethersproject/web@5.7.1': dependencies: - '@ethersproject/base64': 5.8.0 + '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 '@ethersproject/web@5.8.0': dependencies: @@ -14981,18 +14955,18 @@ snapshots: '@ethersproject/wordlists@5.6.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 '@ethersproject/wordlists@5.7.0': dependencies: '@ethersproject/bytes': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 '@ethersproject/wordlists@5.8.0': dependencies: @@ -15004,7 +14978,7 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@fastify/busboy@3.1.1': {} + '@fastify/busboy@3.2.0': {} '@fastify/deepmerge@1.3.0': {} @@ -15056,21 +15030,21 @@ 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@9.2.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.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)': dependencies: - '@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/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-tools/utils': 9.2.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: 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@9.2.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)': dependencies: - '@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/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-tools/utils': 9.2.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: 16.11.0 lodash: 4.17.21 @@ -15079,7 +15053,7 @@ snapshots: '@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)': 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@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-tools/delegate': 9.0.35(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 @@ -15093,15 +15067,15 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphprotocol/client-cli@2.2.22(@babel/core@7.27.4)(@envelop/core@3.0.6)(@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.0.24(graphql@16.11.0))(@graphql-tools/utils@9.2.1(graphql@16.11.0))(@graphql-tools/wrap@9.4.2(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.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)': 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@9.2.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@9.2.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.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@3.0.6)(@graphql-tools/merge@9.0.24(graphql@16.11.0))(graphql@16.11.0) - '@graphql-mesh/cli': 0.82.35(@babel/core@7.27.4)(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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@9.2.1(graphql@16.11.0))(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(tslib@2.8.1)(utf-8-validate@5.0.10) + '@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) graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: @@ -15126,10 +15100,10 @@ snapshots: - supports-color - utf-8-validate - '@graphprotocol/client-polling-live@1.1.1(@envelop/core@3.0.6)(@graphql-tools/merge@9.0.24(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)': dependencies: - '@envelop/core': 3.0.6 - '@graphql-tools/merge': 9.0.24(graphql@16.11.0) + '@envelop/core': 5.3.1 + '@graphql-tools/merge': 9.1.1(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 graphql: 16.11.0 tslib: 2.8.1 @@ -15209,7 +15183,7 @@ snapshots: '@graphprotocol/contracts@2.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - console-table-printer: 2.14.1 + console-table-printer: 2.14.6 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -15217,7 +15191,7 @@ snapshots: '@graphprotocol/contracts@5.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - console-table-printer: 2.14.1 + console-table-printer: 2.14.6 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -15234,7 +15208,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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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 @@ -15242,12 +15216,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.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(supports-color@9.4.0) + '@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)) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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-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)) inquirer: 8.0.0 lodash: 4.17.21 yaml: 1.10.2 @@ -15416,13 +15390,13 @@ snapshots: '@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@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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: 16.11.0 localforage: 1.10.0 tslib: 2.8.1 - '@graphql-mesh/cli@0.82.35(@babel/core@7.27.4)(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql-tag@2.12.6(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.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)': 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) @@ -15430,19 +15404,19 @@ 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.27.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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/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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-tools/utils': 9.2.1(graphql@16.11.0) ajv: 8.17.1 change-case: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.2) dnscache: 1.0.2 - dotenv: 16.5.0 + dotenv: 16.6.1 graphql: 16.11.0 graphql-import-node: 0.0.5(graphql@16.11.0) graphql-ws: 5.16.2(graphql@16.11.0) @@ -15452,11 +15426,11 @@ snapshots: open: 7.4.2 pascal-case: 3.1.2 rimraf: 5.0.10 - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) tsconfig-paths: 4.2.0 tslib: 2.8.1 - typescript: 5.8.3 - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + typescript: 5.9.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - '@babel/core' @@ -15471,18 +15445,18 @@ snapshots: - supports-color - utf-8-validate - '@graphql-mesh/config@0.93.1(@babel/core@7.27.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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@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)': 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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)) + '@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/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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.27.4)(graphql@16.11.0) + '@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-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) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) @@ -15496,27 +15470,38 @@ snapshots: - '@babel/core' - supports-color - '@graphql-mesh/cross-helpers@0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))': + '@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))': + dependencies: + '@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/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))': dependencies: '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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@9.2.1(graphql@16.11.0))(@types/node@20.17.58)(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.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)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)) - '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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/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@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-tools/delegate': 9.0.35(graphql@16.11.0) - '@graphql-tools/url-loader': 7.17.18(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.11.0)(utf-8-validate@5.0.10) - '@graphql-tools/utils': 9.2.1(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/utils': 10.9.1(graphql@16.11.0) '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) graphql: 16.11.0 lodash.get: 4.4.2 @@ -15527,12 +15512,12 @@ snapshots: - encoding - utf-8-validate - '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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@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)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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) fets: 0.1.5 graphql: 16.11.0 graphql-yoga: 3.9.1(graphql@16.11.0) @@ -15541,8 +15526,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@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-tools/schema': 9.0.19(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 @@ -15552,9 +15537,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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-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) @@ -15563,29 +15548,39 @@ 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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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/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)': 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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)) + '@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@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-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': 9.2.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) '@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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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@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)': dependencies: '@graphql-inspector/core': 3.3.0(graphql@16.11.0) - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-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)': + 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-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 @@ -15600,16 +15595,26 @@ snapshots: '@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)': dependencies: - '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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-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)': + 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-tools/utils': 10.9.1(graphql@16.11.0) + '@graphql-typed-document-node/core': 3.2.0(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)': dependencies: - '@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.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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@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-tools/utils': 9.2.1(graphql@16.11.0) @@ -15617,11 +15622,26 @@ 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@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.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-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)': dependencies: - '@graphql-mesh/cross-helpers': 0.3.4(@graphql-tools/utils@9.2.1(graphql@16.11.0))(graphql@16.11.0)(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)) + '@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@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-tools/delegate': 9.0.35(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) + 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 + 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)': + 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) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) dset: 3.1.4 @@ -15649,9 +15669,9 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 - '@graphql-tools/code-file-loader@7.3.23(@babel/core@7.27.4)(graphql@16.11.0)': + '@graphql-tools/code-file-loader@7.3.23(@babel/core@7.28.4)(graphql@16.11.0)': dependencies: - '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.27.4)(graphql@16.11.0) + '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.28.4)(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) globby: 11.1.0 graphql: 16.11.0 @@ -15686,7 +15706,7 @@ snapshots: - bufferutil - utf-8-validate - '@graphql-tools/executor-http@0.1.10(@types/node@20.17.58)(graphql@16.11.0)': + '@graphql-tools/executor-http@0.1.10(@types/node@20.19.14)(graphql@16.11.0)': dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 @@ -15694,7 +15714,7 @@ snapshots: dset: 3.1.4 extract-files: 11.0.0 graphql: 16.11.0 - meros: 1.3.0(@types/node@20.17.58) + meros: 1.3.2(@types/node@20.19.14) tslib: 2.8.1 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -15730,9 +15750,9 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 - '@graphql-tools/executor@1.4.7(graphql@16.11.0)': + '@graphql-tools/executor@1.4.9(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 10.8.6(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 @@ -15749,12 +15769,12 @@ snapshots: tslib: 2.8.1 unixify: 1.0.0 - '@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.27.4)(graphql@16.11.0)': + '@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.28.4)(graphql@16.11.0)': dependencies: - '@babel/parser': 7.27.5 - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.4 + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 '@graphql-tools/utils': 9.2.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 @@ -15783,9 +15803,9 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/merge@9.0.24(graphql@16.11.0)': + '@graphql-tools/merge@9.1.1(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 @@ -15804,10 +15824,10 @@ snapshots: - encoding - supports-color - '@graphql-tools/schema@10.0.23(graphql@16.11.0)': + '@graphql-tools/schema@10.0.25(graphql@16.11.0)': dependencies: - '@graphql-tools/merge': 9.0.24(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(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: 16.11.0 tslib: 2.8.1 @@ -15839,29 +15859,29 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/url-loader@7.17.18(@types/node@20.17.58)(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.14)(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.17.58)(graphql@16.11.0) + '@graphql-tools/executor-http': 0.1.10(@types/node@20.19.14)(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) '@types/ws': 8.18.1 '@whatwg-node/fetch': 0.8.8 graphql: 16.11.0 - isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isomorphic-ws: 5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tslib: 2.8.1 value-or-promise: 1.0.12 - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/node' - bufferutil - encoding - utf-8-validate - '@graphql-tools/utils@10.8.6(graphql@16.11.0)': + '@graphql-tools/utils@10.9.1(graphql@16.11.0)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 @@ -15906,11 +15926,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@graphql-yoga/plugin-persisted-operations@3.13.6(graphql-yoga@5.13.5(graphql@16.11.0))(graphql@16.11.0)': + '@graphql-yoga/plugin-persisted-operations@3.15.2(graphql-yoga@5.15.2(graphql@16.11.0))(graphql@16.11.0)': dependencies: '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.11.0 - graphql-yoga: 5.13.5(graphql@16.11.0) + graphql-yoga: 5.15.2(graphql@16.11.0) '@graphql-yoga/subscription@3.1.0': dependencies: @@ -15938,15 +15958,15 @@ snapshots: '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -15957,15 +15977,26 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} + '@inquirer/external-editor@1.0.2(@types/node@20.19.14)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 20.19.14 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -15990,14 +16021,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.14 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.17.58 + '@types/node': 20.19.14 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -16008,9 +16039,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -16031,36 +16062,38 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/yargs': 17.0.33 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@ledgerhq/cryptoassets@5.53.0': dependencies: @@ -16080,7 +16113,7 @@ snapshots: '@ledgerhq/cryptoassets': 5.53.0 '@ledgerhq/errors': 5.50.0 '@ledgerhq/hw-transport': 5.26.0 - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 rlp: 2.2.7 '@ledgerhq/hw-transport-node-hid-noevents@5.51.1': @@ -16136,14 +16169,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.6 - '@types/node': 20.17.58 + '@babel/runtime': 7.28.4 + '@types/node': 20.19.14 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -16192,44 +16225,20 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nomicfoundation/edr-darwin-arm64@0.11.0': {} - '@nomicfoundation/edr-darwin-arm64@0.11.3': {} - '@nomicfoundation/edr-darwin-x64@0.11.0': {} - '@nomicfoundation/edr-darwin-x64@0.11.3': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.0': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': {} - '@nomicfoundation/edr-linux-arm64-musl@0.11.0': {} - '@nomicfoundation/edr-linux-arm64-musl@0.11.3': {} - '@nomicfoundation/edr-linux-x64-gnu@0.11.0': {} - '@nomicfoundation/edr-linux-x64-gnu@0.11.3': {} - '@nomicfoundation/edr-linux-x64-musl@0.11.0': {} - '@nomicfoundation/edr-linux-x64-musl@0.11.3': {} - '@nomicfoundation/edr-win32-x64-msvc@0.11.0': {} - '@nomicfoundation/edr-win32-x64-msvc@0.11.3': {} - '@nomicfoundation/edr@0.11.0': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.0 - '@nomicfoundation/edr-darwin-x64': 0.11.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.0 - '@nomicfoundation/edr-linux-x64-musl': 0.11.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.0 - '@nomicfoundation/edr@0.11.3': dependencies: '@nomicfoundation/edr-darwin-arm64': 0.11.3 @@ -16247,144 +16256,95 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - ordinal: 1.0.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@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))': 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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)) '@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.17.58)(typescript@5.8.3))(typescript@5.8.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) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.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)))(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))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.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)) '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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))': dependencies: - debug: 4.4.1(supports-color@9.4.0) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(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@8.10.2(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@9.4.0) + 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(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) 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@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.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))': dependencies: - debug: 4.4.1(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-ethers@3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - debug: 4.4.1(supports-color@9.4.0) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.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))': dependencies: - debug: 4.4.1(supports-color@9.4.0) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.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.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - picocolors: 1.1.1 - - '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': - dependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) - fs-extra: 10.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - json5: 2.2.3 - prompts: 2.4.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(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) + 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))': + 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/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@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.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)': dependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(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.1(supports-color@9.4.0) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -16392,99 +16352,79 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.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) - '@nomicfoundation/hardhat-toolbox@4.0.0(418f442e9ae8e9c553b9d925825153d3)': + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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-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': 10.0.10 - '@types/node': 20.17.58 + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 - - '@nomicfoundation/hardhat-toolbox@4.0.0(639b455d9367db27d2db58403e8352ae)': - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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(d35e8d65535ba70c86963f53cf6ab913)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.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)))(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.1.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-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': 10.0.10 - '@types/node': 20.17.58 + '@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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 - - '@nomicfoundation/hardhat-toolbox@5.0.0(34987977931eb7f67aaf635190f51b0d)': - 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.8.3))(typescript@5.8.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.8.3))(typescript@5.8.3))(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3)) + 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@5.0.0(388c65bfd887f02655892c196bace5c8)': + 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-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-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': 10.0.10 - '@types/node': 20.17.58 + '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 - - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.1(supports-color@9.4.0) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - lodash.clonedeep: 4.5.0 - picocolors: 1.1.1 - semver: 6.3.1 - table: 6.9.0 - undici: 5.29.0 - transitivePeerDependencies: - - supports-color + 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-verify@2.1.1(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@9.4.0) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -16493,13 +16433,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 - debug: 4.4.1(supports-color@9.4.0) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + 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) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -16513,7 +16453,7 @@ snapshots: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -16530,7 +16470,7 @@ snapshots: dependencies: '@bytecodealliance/preview2-shim': 0.17.0 - '@nomicfoundation/slang@1.1.0': + '@nomicfoundation/slang@1.2.0': dependencies: '@bytecodealliance/preview2-shim': 0.17.2 @@ -16565,41 +16505,20 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/address': 5.8.0 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.4.1(supports-color@9.4.0) - fs-extra: 7.0.1 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - lodash: 4.17.21 - semver: 6.3.1 - table: 6.9.0 - undici: 5.29.0 - transitivePeerDependencies: - - supports-color + 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.17.58)(typescript@5.8.3))(typescript@5.8.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))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.4.1(supports-color@9.4.0) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash: 4.17.21 semver: 6.3.1 table: 6.9.0 @@ -16607,33 +16526,25 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.8.3) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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@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))': 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.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.8.3)(utf-8-validate@5.0.10) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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))': 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.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.8.3) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) '@npmcli/agent@2.2.2': dependencies: - agent-base: 7.1.3 + agent-base: 7.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 10.4.3 @@ -16649,23 +16560,21 @@ snapshots: '@openzeppelin/contracts-upgradeable@3.4.2': {} - '@openzeppelin/contracts-upgradeable@5.3.0(@openzeppelin/contracts@5.3.0)': + '@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0)': dependencies: - '@openzeppelin/contracts': 5.3.0 + '@openzeppelin/contracts': 5.4.0 '@openzeppelin/contracts@3.4.1': {} - '@openzeppelin/contracts@3.4.2': {} - '@openzeppelin/contracts@4.9.6': {} - '@openzeppelin/contracts@5.3.0': {} + '@openzeppelin/contracts@5.4.0': {} - '@openzeppelin/defender-base-client@1.54.6(debug@4.4.1)(encoding@0.1.13)': + '@openzeppelin/defender-base-client@1.54.6(debug@4.4.3)(encoding@0.1.13)': dependencies: amazon-cognito-identity-js: 6.3.15(encoding@0.1.13) async-retry: 1.3.3 - axios: 1.9.0(debug@4.4.1) + axios: 1.12.2(debug@4.4.3) lodash: 4.17.21 node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: @@ -16675,9 +16584,9 @@ snapshots: '@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13)': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) - '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) - '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) - dotenv: 16.5.0 + '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.3)(encoding@0.1.13) + '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.3)(encoding@0.1.13) + dotenv: 16.6.1 minimist: 1.2.8 transitivePeerDependencies: - aws-crt @@ -16686,27 +16595,27 @@ snapshots: '@openzeppelin/defender-sdk-base-client@2.7.0(encoding@0.1.13)': dependencies: - '@aws-sdk/client-lambda': 3.891.0 + '@aws-sdk/client-lambda': 3.888.0 amazon-cognito-identity-js: 6.3.15(encoding@0.1.13) async-retry: 1.3.3 transitivePeerDependencies: - aws-crt - encoding - '@openzeppelin/defender-sdk-deploy-client@2.7.0(debug@4.4.1)(encoding@0.1.13)': + '@openzeppelin/defender-sdk-deploy-client@2.7.0(debug@4.4.3)(encoding@0.1.13)': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) - axios: 1.9.0(debug@4.4.1) + axios: 1.12.2(debug@4.4.3) lodash: 4.17.21 transitivePeerDependencies: - aws-crt - debug - encoding - '@openzeppelin/defender-sdk-network-client@2.7.0(debug@4.4.1)(encoding@0.1.13)': + '@openzeppelin/defender-sdk-network-client@2.7.0(debug@4.4.3)(encoding@0.1.13)': dependencies: '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) - axios: 1.9.0(debug@4.4.1) + axios: 1.12.2(debug@4.4.3) lodash: 4.17.21 transitivePeerDependencies: - aws-crt @@ -16718,64 +16627,48 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.1)(encoding@0.1.13) - '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.1)(encoding@0.1.13) - '@openzeppelin/upgrades-core': 1.44.1 - chalk: 4.1.2 - debug: 4.4.1(supports-color@9.4.0) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - proper-lockfile: 4.1.2 - transitivePeerDependencies: - - encoding - - supports-color - - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.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))': 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.1)(encoding@0.1.13) - '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.1)(encoding@0.1.13) + '@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/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.1(supports-color@9.4.0) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) proper-lockfile: 4.1.2 transitivePeerDependencies: - encoding - supports-color - '@openzeppelin/hardhat-upgrades@3.9.1(@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@3.9.1(@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.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)))(encoding@0.1.13)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10))': dependencies: - '@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.17.58)(typescript@5.8.3))(typescript@5.8.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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) '@openzeppelin/defender-sdk-base-client': 2.7.0(encoding@0.1.13) - '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) - '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.1)(encoding@0.1.13) + '@openzeppelin/defender-sdk-deploy-client': 2.7.0(debug@4.4.3)(encoding@0.1.13) + '@openzeppelin/defender-sdk-network-client': 2.7.0(debug@4.4.3)(encoding@0.1.13) '@openzeppelin/upgrades-core': 1.44.1 chalk: 4.1.2 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) ethereumjs-util: 7.1.5 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.17.58)(typescript@5.8.3))(typescript@5.8.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) proper-lockfile: 4.1.2 undici: 6.21.3 optionalDependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - aws-crt - encoding - supports-color - '@openzeppelin/platform-deploy-client@0.8.0(debug@4.4.1)(encoding@0.1.13)': + '@openzeppelin/platform-deploy-client@0.8.0(debug@4.4.3)(encoding@0.1.13)': dependencies: '@ethersproject/abi': 5.8.0 - '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.1)(encoding@0.1.13) - axios: 0.21.4(debug@4.4.1) + '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.3)(encoding@0.1.13) + axios: 0.21.4(debug@4.4.3) lodash: 4.17.21 node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: @@ -16785,20 +16678,20 @@ snapshots: '@openzeppelin/upgrades-core@1.44.1': dependencies: '@nomicfoundation/slang': 0.18.3 - bignumber.js: 9.3.0 - cbor: 10.0.3 + bignumber.js: 9.3.1 + cbor: 10.0.11 chalk: 4.1.2 compare-versions: 6.1.1 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) ethereumjs-util: 7.1.5 minimatch: 9.0.5 minimist: 1.2.8 proper-lockfile: 4.1.2 - solidity-ast: 0.4.60 + solidity-ast: 0.4.61 transitivePeerDependencies: - supports-color - '@peculiar/asn1-schema@2.3.15': + '@peculiar/asn1-schema@2.5.0': dependencies: asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -16810,7 +16703,7 @@ snapshots: '@peculiar/webcrypto@1.5.0': dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -16819,7 +16712,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.7': {} + '@pkgr/core@0.2.9': {} '@pnpm/config.env-replace@1.1.0': {} @@ -16833,42 +16726,42 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@react-native/assets-registry@0.79.3': {} + '@react-native/assets-registry@0.81.4': {} - '@react-native/codegen@0.79.3(@babel/core@7.27.4)': + '@react-native/codegen@0.81.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 glob: 7.2.3 - hermes-parser: 0.25.1 + hermes-parser: 0.29.1 invariant: 2.2.4 nullthrows: 1.1.1 yargs: 17.7.2 - '@react-native/community-cli-plugin@0.79.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@react-native/community-cli-plugin@0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: - '@react-native/dev-middleware': 0.79.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - chalk: 4.1.2 - debug: 2.6.9 + '@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.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-config: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.82.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 semver: 7.7.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.79.3': {} + '@react-native/debugger-frontend@0.81.4': {} - '@react-native/dev-middleware@0.79.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@react-native/dev-middleware@0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.79.3 + '@react-native/debugger-frontend': 0.81.4 chrome-launcher: 0.15.2 chromium-edge-launcher: 0.2.0 connect: 3.7.0 - debug: 2.6.9 + debug: 4.4.3(supports-color@9.4.0) invariant: 2.2.4 nullthrows: 1.1.1 open: 7.4.2 @@ -16879,18 +16772,18 @@ snapshots: - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.79.3': {} + '@react-native/gradle-plugin@0.81.4': {} - '@react-native/js-polyfills@0.79.3': {} + '@react-native/js-polyfills@0.81.4': {} - '@react-native/normalize-colors@0.79.3': {} + '@react-native/normalize-colors@0.81.4': {} - '@react-native/virtualized-lists@0.79.3(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)': + '@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)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 19.1.0 - react-native: 0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10) + 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) '@repeaterjs/repeater@3.0.4': {} @@ -17078,7 +16971,7 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/core@3.11.1': + '@smithy/core@3.11.0': dependencies: '@smithy/middleware-serde': 4.1.1 '@smithy/protocol-http': 5.2.1 @@ -17086,7 +16979,7 @@ snapshots: '@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.2 + '@smithy/util-stream': 4.3.1 '@smithy/util-utf8': 4.1.0 '@types/uuid': 9.0.8 tslib: 2.8.1 @@ -17164,9 +17057,9 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.3': + '@smithy/middleware-endpoint@4.2.2': dependencies: - '@smithy/core': 3.11.1 + '@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 @@ -17175,15 +17068,15 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.2.4': + '@smithy/middleware-retry@4.2.2': dependencies: '@smithy/node-config-provider': 4.2.2 '@smithy/protocol-http': 5.2.1 - '@smithy/service-error-classification': 4.1.2 - '@smithy/smithy-client': 4.6.3 + '@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.2 + '@smithy/util-retry': 4.1.1 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 @@ -17235,7 +17128,7 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.1.2': + '@smithy/service-error-classification@4.1.1': dependencies: '@smithy/types': 4.5.0 @@ -17255,18 +17148,14 @@ snapshots: '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.3': + '@smithy/smithy-client@4.6.2': dependencies: - '@smithy/core': 3.11.1 - '@smithy/middleware-endpoint': 4.2.3 + '@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.2 - tslib: 2.8.1 - - '@smithy/types@4.3.1': - dependencies: + '@smithy/util-stream': 4.3.1 tslib: 2.8.1 '@smithy/types@4.5.0': @@ -17307,21 +17196,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.3': + '@smithy/util-defaults-mode-browser@4.1.2': dependencies: '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.2 '@smithy/types': 4.5.0 bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.1.3': + '@smithy/util-defaults-mode-node@4.1.2': 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.3 + '@smithy/smithy-client': 4.6.2 '@smithy/types': 4.5.0 tslib: 2.8.1 @@ -17340,13 +17229,13 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-retry@4.1.2': + '@smithy/util-retry@4.1.1': dependencies: - '@smithy/service-error-classification': 4.1.2 + '@smithy/service-error-classification': 4.1.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/util-stream@4.3.2': + '@smithy/util-stream@4.3.1': dependencies: '@smithy/fetch-http-handler': 5.2.1 '@smithy/node-http-handler': 4.2.1 @@ -17381,8 +17270,6 @@ snapshots: dependencies: antlr4ts: 0.5.0-alpha.4 - '@solidity-parser/parser@0.20.1': {} - '@solidity-parser/parser@0.20.2': {} '@szmarczak/http-timer@1.1.2': @@ -17399,35 +17286,35 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tenderly/api-client@1.1.0(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)': + '@tenderly/api-client@1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2)': dependencies: axios: 0.27.2 cli-table3: 0.6.5 commander: 9.5.0 - dotenv: 16.5.0 + dotenv: 16.6.1 js-yaml: 4.1.0 open: 8.4.2 prompts: 2.4.2 tslog: 4.9.3 optionalDependencies: - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) - typescript: 5.8.3 + ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - debug - '@tenderly/hardhat-integration@1.1.1(@types/node@20.17.58)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-integration@1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.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)': dependencies: - '@tenderly/api-client': 1.1.0(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3) - axios: 1.9.0(debug@4.4.1) - dotenv: 16.5.0 + '@tenderly/api-client': 1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2))(typescript@5.9.2) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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-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.17.58)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) tslog: 4.9.3 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -17437,15 +17324,15 @@ snapshots: - supports-color - utf-8-validate - '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.17.58)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.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)': 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.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)) '@openzeppelin/upgrades-core': 1.44.1 - '@tenderly/hardhat-integration': 1.1.1(@types/node@20.17.58)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - dotenv: 16.5.0 + '@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) + dotenv: 16.6.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@nomiclabs/harhdat-etherscan' @@ -17472,127 +17359,109 @@ 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.8.3))(typescript@5.8.3)': + '@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)': 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) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 + ts-essentials: 7.0.3(typescript@5.9.2) + 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.8.3))(typescript@5.8.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)': 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.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 + ts-essentials: 7.0.3(typescript@5.9.2) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + 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.8.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))': dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - typechain: 3.0.0(typescript@5.8.3) + typechain: 3.0.0(typescript@5.9.2) - '@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.8.3))(typescript@5.8.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)': dependencies: ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.3 + ts-essentials: 7.0.3(typescript@5.9.2) + 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.8.3))(typescript@5.8.3)': + '@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.2))(typescript@5.9.2)': dependencies: 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.8.3) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) - typescript: 5.8.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.8.3))(typescript@5.8.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3) - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + ts-essentials: 7.0.3(typescript@5.9.2) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) + 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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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))': 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.8.3))(typescript@5.8.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) 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.8.3))(typescript@5.8.3) - ethers: 6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10) - fs-extra: 9.1.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + 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.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3))(typescript@5.8.3))(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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))': 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.8.3))(typescript@5.8.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) ethers: 6.13.7(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + 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.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.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.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.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))': dependencies: - '@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.8.3))(typescript@5.8.3) + '@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.2))(typescript@5.9.2) 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3) + 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/abstract-leveldown@7.2.5': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/bn.js@5.2.0': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/responselike': 1.0.3 optional: true @@ -17604,35 +17473,35 @@ snapshots: '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/form-data@0.0.33': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/glob@7.2.0': dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.17.58 + '@types/minimatch': 6.0.0 + '@types/node': 20.19.14 '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/http-cache-semantics@4.0.4': {} @@ -17658,7 +17527,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 optional: true '@types/level-errors@3.0.2': {} @@ -17667,9 +17536,7 @@ snapshots: dependencies: '@types/abstract-leveldown': 7.2.5 '@types/level-errors': 3.0.2 - '@types/node': 20.17.58 - - '@types/lru-cache@5.1.1': {} + '@types/node': 20.19.14 '@types/mdast@3.0.15': dependencies: @@ -17677,11 +17544,15 @@ snapshots: '@types/minimatch@5.1.2': {} + '@types/minimatch@6.0.0': + dependencies: + minimatch: 10.0.3 + '@types/minimist@1.2.5': {} '@types/mkdirp@0.5.2': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/mocha@10.0.10': {} @@ -17689,14 +17560,14 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node-fetch@2.6.12': + '@types/node-fetch@2.6.13': dependencies: - '@types/node': 20.17.58 - form-data: 4.0.3 + '@types/node': 20.19.14 + form-data: 4.0.4 - '@types/node@20.17.58': + '@types/node@20.19.14': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 '@types/normalize-package-data@2.4.4': {} @@ -17704,7 +17575,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/prettier@2.7.3': {} @@ -17712,16 +17583,16 @@ snapshots: '@types/resolve@0.0.8': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 optional: true '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/sinon-chai@3.2.12': dependencies: @@ -17742,11 +17613,11 @@ snapshots: '@types/uuid@9.0.8': {} - '@types/validator@13.15.1': {} + '@types/validator@13.15.3': {} '@types/ws@8.18.1': dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/yargs-parser@21.0.3': {} @@ -17754,97 +17625,98 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.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)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - eslint: 9.28.0(jiti@2.4.2) + '@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) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.1(supports-color@9.4.0) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 + '@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 + debug: 4.4.3(supports-color@9.4.0) + eslint: 9.35.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': + '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) - '@typescript-eslint/types': 8.33.1 - debug: 4.4.1(supports-color@9.4.0) - typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) + '@typescript-eslint/types': 8.44.0 + debug: 4.4.3(supports-color@9.4.0) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.33.1': + '@typescript-eslint/scope-manager@8.44.0': dependencies: - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/visitor-keys': 8.33.1 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 - '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.1(supports-color@9.4.0) - eslint: 9.28.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@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) + 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 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.33.1': {} + '@typescript-eslint/types@8.44.0': {} - '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.1(supports-color@9.4.0) + '@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 + 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.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 + '@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 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.33.1': + '@typescript-eslint/visitor-keys@8.44.0': dependencies: - '@typescript-eslint/types': 8.33.1 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.44.0 + eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -17871,28 +17743,28 @@ snapshots: graphql: 16.8.0 wonka: 6.3.5 - '@wagmi/cli@2.5.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@wagmi/cli@2.5.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - abitype: 1.1.0(typescript@5.8.3)(zod@3.25.51) - bundle-require: 5.1.0(esbuild@0.25.10) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) + bundle-require: 5.1.0(esbuild@0.25.9) cac: 6.7.14 change-case: 5.4.4 chokidar: 4.0.1 dedent: 0.7.0 - dotenv: 16.5.0 + dotenv: 16.6.1 dotenv-expand: 10.0.0 - esbuild: 0.25.10 + esbuild: 0.25.9 escalade: 3.2.0 - fdir: 6.4.5(picomatch@3.0.1) + fdir: 6.5.0(picomatch@3.0.1) nanospinner: 1.2.2 pathe: 1.1.2 picocolors: 1.1.1 picomatch: 3.0.1 - prettier: 3.5.3 - viem: 2.37.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51) - zod: 3.25.51 + 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 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -17915,9 +17787,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@whatwg-node/fetch@0.10.8': + '@whatwg-node/fetch@0.10.10': dependencies: - '@whatwg-node/node-fetch': 0.7.21 + '@whatwg-node/node-fetch': 0.7.25 urlpattern-polyfill: 10.1.0 '@whatwg-node/fetch@0.8.8': @@ -17936,9 +17808,9 @@ snapshots: fast-url-parser: 1.1.3 tslib: 2.8.1 - '@whatwg-node/node-fetch@0.7.21': + '@whatwg-node/node-fetch@0.7.25': dependencies: - '@fastify/busboy': 3.1.1 + '@fastify/busboy': 3.2.0 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 @@ -17947,11 +17819,11 @@ snapshots: dependencies: tslib: 2.8.1 - '@whatwg-node/server@0.10.10': + '@whatwg-node/server@0.10.12': dependencies: '@envelop/instrumentation': 1.0.0 '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/fetch': 0.10.8 + '@whatwg-node/fetch': 0.10.10 '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 @@ -17969,16 +17841,16 @@ snapshots: abbrev@1.0.9: {} - abitype@0.7.1(typescript@5.8.3)(zod@3.25.51): + abitype@0.7.1(typescript@5.9.2)(zod@3.25.76): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 optionalDependencies: - zod: 3.25.51 + zod: 3.25.76 - abitype@1.1.0(typescript@5.8.3)(zod@3.25.51): + abitype@1.1.0(typescript@5.9.2)(zod@3.25.76): optionalDependencies: - typescript: 5.8.3 - zod: 3.25.51 + typescript: 5.9.2 + zod: 3.25.76 abort-controller@3.0.0: dependencies: @@ -18021,15 +17893,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} adm-zip@0.4.16: {} @@ -18042,11 +17914,11 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) transitivePeerDependencies: - supports-color - agent-base@7.1.3: {} + agent-base@7.1.4: {} aggregate-error@3.1.0: dependencies: @@ -18078,7 +17950,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -18107,7 +17979,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.0.0: + ansi-escapes@7.1.0: dependencies: environment: 1.1.0 @@ -18119,7 +17991,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@2.2.1: {} @@ -18133,7 +18005,7 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} antlr4@4.13.2: {} @@ -18152,9 +18024,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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10): + 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): dependencies: - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) transitivePeerDependencies: - bufferutil - supports-color @@ -18352,23 +18224,23 @@ snapshots: aws4@1.13.2: {} - axios@0.21.4(debug@4.4.1): + axios@0.21.4(debug@4.4.3): dependencies: - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.11(debug@4.4.3) transitivePeerDependencies: - debug axios@0.27.2: dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.3 + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.4 transitivePeerDependencies: - debug - axios@1.9.0(debug@4.4.1): + axios@1.12.2(debug@4.4.3): dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.3 + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -18507,13 +18379,13 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.27.4): + babel-jest@29.7.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.27.4) + babel-preset-jest: 29.6.3(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -18541,17 +18413,17 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 babel-plugin-syntax-async-functions@6.13.0: {} babel-plugin-syntax-exponentiation-operator@6.13.0: {} - babel-plugin-syntax-hermes-parser@0.25.1: + babel-plugin-syntax-hermes-parser@0.29.1: dependencies: - hermes-parser: 0.25.1 + hermes-parser: 0.29.1 babel-plugin-syntax-trailing-function-commas@6.22.0: {} @@ -18726,24 +18598,24 @@ snapshots: babel-runtime: 6.26.0 babel-types: 6.26.0 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) babel-preset-env@1.7.0: dependencies: @@ -18780,44 +18652,44 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-fbjs@3.4.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + babel-preset-fbjs@3.4.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.4) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color - babel-preset-jest@29.6.3(@babel/core@7.27.4): + babel-preset-jest@29.6.3(@babel/core@7.28.4): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) babel-register@6.26.0: dependencies: @@ -18902,6 +18774,8 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 + baseline-browser-mapping@2.8.4: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -18925,7 +18799,7 @@ snapshots: dependencies: is-windows: 1.0.2 - bignumber.js@9.3.0: {} + bignumber.js@9.3.1: {} binary-extensions@1.13.1: {} @@ -18941,16 +18815,16 @@ snapshots: bip39@2.5.0: dependencies: create-hash: 1.2.0 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 randombytes: 2.1.0 safe-buffer: 5.2.1 unorm: 1.6.0 bip39@3.0.4: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 create-hash: 1.2.0 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 randombytes: 2.1.0 bl@4.1.0: @@ -19065,12 +18939,12 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -19152,15 +19026,16 @@ snapshots: browserslist@3.2.8: dependencies: - caniuse-lite: 1.0.30001721 - electron-to-chromium: 1.5.165 + caniuse-lite: 1.0.30001741 + electron-to-chromium: 1.5.218 - browserslist@4.25.0: + browserslist@4.26.0: dependencies: - caniuse-lite: 1.0.30001721 - electron-to-chromium: 1.5.165 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + 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) bs58@4.0.1: dependencies: @@ -19213,9 +19088,9 @@ snapshots: dependencies: node-gyp-build: 4.8.4 - bundle-require@5.1.0(esbuild@0.25.10): + bundle-require@5.1.0(esbuild@0.25.9): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.9 load-tsconfig: 0.2.5 busboy@1.6.0: @@ -19276,7 +19151,7 @@ snapshots: http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.1.0 responselike: 3.0.0 cacheable-request@6.1.0: @@ -19354,7 +19229,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001721: {} + caniuse-lite@1.0.30001741: {} capital-case@1.0.4: dependencies: @@ -19364,7 +19239,7 @@ snapshots: caseless@0.12.0: {} - cbor@10.0.3: + cbor@10.0.11: dependencies: nofilter: 3.1.0 @@ -19410,7 +19285,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} + chalk@5.6.2: {} change-case-all@1.0.14: dependencies: @@ -19469,6 +19344,8 @@ snapshots: chardet@0.7.0: {} + chardet@2.1.0: {} + charenc@0.0.2: {} check-error@1.0.3: @@ -19521,7 +19398,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -19530,7 +19407,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -19607,6 +19484,11 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + cli-truncate@5.0.0: + dependencies: + slice-ansi: 7.1.2 + string-width: 8.1.0 + cli-width@3.0.0: {} cliui@3.2.0: @@ -19672,7 +19554,7 @@ snapshots: color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 + simple-swizzle: 0.2.4 color@3.2.1: dependencies: @@ -19720,6 +19602,8 @@ snapshots: commander@13.1.0: {} + commander@14.0.1: {} + commander@2.11.0: {} commander@2.20.3: {} @@ -19771,9 +19655,9 @@ snapshots: console-control-strings@1.1.0: optional: true - console-table-printer@2.14.1: + console-table-printer@2.14.6: dependencies: - simple-wcswidth: 1.0.1 + simple-wcswidth: 1.1.2 constant-case@3.0.4: dependencies: @@ -19847,7 +19731,7 @@ snapshots: copy-descriptor@0.1.1: {} - core-js-pure@3.42.0: {} + core-js-pure@3.45.1: {} core-js@2.6.12: {} @@ -19860,22 +19744,22 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@2.0.2(@types/node@20.17.58)(cosmiconfig@7.1.0)(typescript@5.8.3): + cosmiconfig-typescript-loader@2.0.2(@types/node@20.19.14)(cosmiconfig@7.1.0)(typescript@5.9.2): dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 cosmiconfig: 7.1.0 - ts-node: 10.9.2(@types/node@20.17.58)(typescript@5.8.3) - typescript: 5.8.3 + ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - cosmiconfig-typescript-loader@6.1.0(@types/node@20.17.58)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.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.17.58 - cosmiconfig: 9.0.0(typescript@5.8.3) - jiti: 2.4.2 - typescript: 5.8.3 + '@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: @@ -19892,23 +19776,23 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.8.3): + cosmiconfig@8.3.6(typescript@5.9.2): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 crc-32@1.2.2: {} @@ -19918,13 +19802,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 inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 - sha.js: 2.4.11 + sha.js: 2.4.12 create-hmac@1.1.7: dependencies: @@ -19933,7 +19824,7 @@ snapshots: inherits: 2.0.4 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 create-require@1.1.1: {} @@ -19950,6 +19841,12 @@ snapshots: transitivePeerDependencies: - encoding + cross-fetch@3.2.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + cross-fetch@4.0.0(encoding@0.1.13): dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -19991,7 +19888,7 @@ snapshots: create-hmac: 1.1.7 diffie-hellman: 5.0.3 inherits: 2.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 @@ -20054,13 +19951,13 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 - debug@4.4.1(supports-color@9.4.0): + debug@4.4.3(supports-color@9.4.0): dependencies: ms: 2.1.3 optionalDependencies: @@ -20075,9 +19972,9 @@ snapshots: decamelize@4.0.0: {} - decimal.js@10.5.0: {} + decimal.js@10.6.0: {} - decode-named-character-reference@1.1.0: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -20258,7 +20155,7 @@ snapshots: dotenv-expand@10.0.0: {} - dotenv@16.5.0: {} + dotenv@16.6.1: {} dotignore@0.1.2: dependencies: @@ -20279,7 +20176,7 @@ snapshots: duplexify@4.1.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 @@ -20293,7 +20190,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.165: {} + electron-to-chromium@1.5.218: {} elliptic@6.5.4: dependencies: @@ -20317,7 +20214,7 @@ snapshots: emittery@0.10.0: {} - emoji-regex@10.4.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} @@ -20350,7 +20247,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -20373,7 +20270,7 @@ snapshots: dependencies: prr: 1.0.1 - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -20483,34 +20380,34 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild@0.25.10: + esbuild@0.25.9: optionalDependencies: - '@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 + '@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 escalade@3.2.0: {} @@ -20531,9 +20428,9 @@ snapshots: optionalDependencies: source-map: 0.2.0 - eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)): + eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.5.1)): dependencies: - eslint: 9.28.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.5.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -20543,17 +20440,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.28.0(jiti@2.4.2)): + 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)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) + '@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-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)): + 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)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -20562,9 +20459,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.28.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.28.0(jiti@2.4.2)) + 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)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -20576,21 +20473,21 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@50.7.1(eslint@9.28.0(jiti@2.4.2)): + 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.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) escape-string-regexp: 4.0.0 - eslint: 9.28.0(jiti@2.4.2) - espree: 10.3.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 @@ -20598,42 +20495,42 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-markdown@5.1.0(eslint@9.28.0(jiti@2.4.2)): + eslint-plugin-markdown@5.1.0(eslint@9.35.0(jiti@2.5.1)): dependencies: - eslint: 9.28.0(jiti@2.4.2) + 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.28.0(jiti@2.4.2)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.35.0(jiti@2.5.1)): dependencies: - eslint: 9.28.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.5.1) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)): + 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)): dependencies: - eslint: 9.28.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.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) eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@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 @@ -20644,7 +20541,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -20674,29 +20571,29 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.28.0(jiti@2.4.2): + eslint@9.35.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.2 - '@eslint/core': 0.14.0 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.28.0 - '@eslint/plugin-kit': 0.3.1 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.35.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -20712,7 +20609,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color @@ -20723,16 +20620,16 @@ snapshots: event-emitter: 0.3.5 type: 2.7.3 - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@2.7.3: {} @@ -20775,7 +20672,7 @@ snapshots: eth-gas-reporter@0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.9.0(debug@4.4.1) + axios: 1.12.2(debug@4.4.3) cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -20804,7 +20701,7 @@ snapshots: eth-json-rpc-middleware@1.6.0: dependencies: - async: 2.6.4 + async: 2.6.2 eth-query: 2.1.2 eth-tx-summary: 3.2.4 ethereumjs-block: 1.7.1 @@ -20862,10 +20759,10 @@ snapshots: eth-tx-summary@3.2.4: dependencies: - async: 2.6.4 + async: 2.6.2 clone: 2.1.2 concat-stream: 1.6.2 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 eth-query: 2.1.2 ethereumjs-block: 1.7.1 ethereumjs-tx: 1.3.7 @@ -20875,7 +20772,7 @@ snapshots: ethashjs@0.0.8: dependencies: - async: 2.6.4 + async: 2.6.2 buffer-xor: 2.0.2 ethereumjs-util: 7.1.5 miller-rabin: 4.0.1 @@ -20899,7 +20796,7 @@ snapshots: create-hmac: 1.1.7 hash.js: 1.1.7 keccak: 3.0.4 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 randombytes: 2.1.0 safe-buffer: 5.2.1 scrypt-js: 3.0.1 @@ -20920,10 +20817,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.8.3)(utf-8-validate@5.0.10): + ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(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.8.3)(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/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) @@ -20934,15 +20831,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.8.3): + 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): 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.8.3))(typescript@5.8.3) + '@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/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.8.3) + typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2) transitivePeerDependencies: - '@ensdomains/ens' - '@ensdomains/resolver' @@ -20982,7 +20879,7 @@ snapshots: ethereumjs-block@1.7.1: dependencies: - async: 2.6.4 + async: 2.6.2 ethereum-common: 0.2.0 ethereumjs-tx: 1.3.7 ethereumjs-util: 5.2.1 @@ -20990,7 +20887,7 @@ snapshots: ethereumjs-block@2.2.2: dependencies: - async: 2.6.4 + async: 2.6.2 ethereumjs-common: 1.5.0 ethereumjs-tx: 2.1.2 ethereumjs-util: 5.2.1 @@ -20998,7 +20895,7 @@ snapshots: ethereumjs-blockchain@4.0.4: dependencies: - async: 2.6.4 + async: 2.6.2 ethashjs: 0.0.8 ethereumjs-block: 2.2.2 ethereumjs-common: 1.5.0 @@ -21067,7 +20964,7 @@ snapshots: ethereumjs-vm@2.6.0: dependencies: - async: 2.6.4 + async: 2.6.2 async-eventemitter: 0.2.4 ethereumjs-account: 2.0.5 ethereumjs-block: 2.2.2 @@ -21081,9 +20978,9 @@ snapshots: ethereumjs-vm@4.2.0: dependencies: - async: 2.6.4 + async: 2.6.2 async-eventemitter: 0.2.4 - core-js-pure: 3.42.0 + core-js-pure: 3.45.1 ethereumjs-account: 3.0.0 ethereumjs-block: 2.2.2 ethereumjs-blockchain: 4.0.4 @@ -21259,7 +21156,7 @@ snapshots: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@types/node': 20.17.58 + '@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) @@ -21272,7 +21169,7 @@ snapshots: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@types/node': 20.17.58 + '@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) @@ -21316,7 +21213,10 @@ snapshots: event-target-shim@5.0.1: {} - eventemitter3@4.0.4: {} + eventemitter3@4.0.4: + optional: true + + eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} @@ -21582,7 +21482,7 @@ snapshots: fast-redact@3.5.0: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fast-url-parser@1.1.3: dependencies: @@ -21606,23 +21506,23 @@ snapshots: fbjs@3.0.5(encoding@0.1.13): dependencies: - cross-fetch: 3.1.5(encoding@0.1.13) + cross-fetch: 3.2.0(encoding@0.1.13) fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 1.0.40 + ua-parser-js: 1.0.41 transitivePeerDependencies: - encoding - fdir@6.4.5(picomatch@3.0.1): + fdir@6.5.0(picomatch@3.0.1): optionalDependencies: picomatch: 3.0.1 - fdir@6.4.5(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fecha@4.2.3: {} @@ -21642,8 +21542,8 @@ snapshots: json-schema-to-ts: 2.12.0 openapi-types: 12.1.3 tslib: 2.8.1 - zod: 3.25.51 - zod-to-json-schema: 3.24.5(zod@3.25.51) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) figures@3.2.0: dependencies: @@ -21795,9 +21695,9 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.9(debug@4.4.1): + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) for-each@0.3.5: dependencies: @@ -21828,22 +21728,24 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - form-data@2.5.3: + form-data@2.5.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 safe-buffer: 5.2.1 - form-data@3.0.3: + form-data@3.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - form-data@4.0.3: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -21875,13 +21777,13 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.0: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@4.0.3: @@ -21906,7 +21808,7 @@ snapshots: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-minipass@1.2.7: @@ -21929,7 +21831,7 @@ snapshots: fsevents@1.2.13: dependencies: bindings: 1.5.0 - nan: 2.22.2 + nan: 2.23.0 optional: true fsevents@2.3.3: @@ -22011,7 +21913,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.3.0: {} + get-east-asian-width@1.4.0: {} get-func-name@2.0.2: {} @@ -22041,12 +21943,12 @@ snapshots: get-stream@4.1.0: dependencies: - pump: 3.0.2 + pump: 3.0.3 optional: true get-stream@5.2.0: dependencies: - pump: 3.0.2 + pump: 3.0.3 optional: true get-stream@6.0.1: {} @@ -22113,11 +22015,11 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.2: + glob@11.0.3: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.0.1 + minimatch: 10.0.3 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -22202,15 +22104,13 @@ snapshots: min-document: 2.19.0 process: 0.11.10 - globals@11.12.0: {} - globals@13.24.0: dependencies: type-fest: 0.20.2 globals@14.0.0: {} - globals@16.1.0: {} + globals@16.4.0: {} globals@9.18.0: {} @@ -22336,18 +22236,18 @@ snapshots: lru-cache: 7.18.3 tslib: 2.8.1 - graphql-yoga@5.13.5(graphql@16.11.0): + graphql-yoga@5.15.2(graphql@16.11.0): dependencies: - '@envelop/core': 5.2.3 + '@envelop/core': 5.3.1 '@envelop/instrumentation': 1.0.0 - '@graphql-tools/executor': 1.4.7(graphql@16.11.0) - '@graphql-tools/schema': 10.0.23(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(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) '@graphql-yoga/logger': 2.0.1 '@graphql-yoga/subscription': 5.0.5 - '@whatwg-node/fetch': 0.10.8 + '@whatwg-node/fetch': 0.10.10 '@whatwg-node/promise-helpers': 1.3.2 - '@whatwg-node/server': 0.10.10 + '@whatwg-node/server': 0.10.12 dset: 3.1.4 graphql: 16.11.0 lru-cache: 10.4.3 @@ -22379,30 +22279,17 @@ snapshots: hard-rejection@2.1.0: {} - hardhat-abi-exporter@2.11.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - '@ethersproject/abi': 5.8.0 - delete-empty: 3.0.0 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - hardhat-contract-sizer@2.10.0(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - chalk: 4.1.2 - cli-table3: 0.6.5 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - strip-ansi: 6.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-contract-sizer@2.10.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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)): 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.17.58)(typescript@5.8.3))(typescript@5.8.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) strip-ansi: 6.0.1 hardhat-deploy@0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10): @@ -22419,13 +22306,13 @@ snapshots: '@ethersproject/transactions': 5.8.0 '@ethersproject/wallet': 5.8.0 '@types/qs': 6.14.0 - axios: 0.21.4(debug@4.4.1) + axios: 0.21.4(debug@4.4.3) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@9.4.0) + 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) - form-data: 4.0.3 + form-data: 4.0.4 fs-extra: 10.1.0 match-all: 1.2.7 murmur-128: 0.2.1 @@ -22436,7 +22323,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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-deploy@0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.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): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 @@ -22450,13 +22337,13 @@ snapshots: '@ethersproject/transactions': 5.8.0 '@ethersproject/wallet': 5.8.0 '@types/qs': 6.14.0 - axios: 0.21.4(debug@4.4.1) + axios: 0.21.4(debug@4.4.3) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.4.1(supports-color@9.4.0) - form-data: 3.0.3 + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) match-all: 1.2.7 murmur-128: 0.2.1 qs: 6.14.0 @@ -22465,23 +22352,11 @@ snapshots: - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - sha1: 1.1.1 - transitivePeerDependencies: - - '@codechecks/client' - - bufferutil - - debug - - 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.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): 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.17.58)(typescript@5.8.3))(typescript@5.8.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) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -22489,155 +22364,85 @@ 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - lodash.clonedeep: 4.5.0 - prompt-sync: 4.2.0 - transitivePeerDependencies: - - supports-color - - 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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.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)): 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(supports-color@9.4.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)) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + 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)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(supports-color@9.4.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)) + 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.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.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) 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)))(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + 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)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.7(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(supports-color@9.4.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@8.10.2(typescript@5.9.2))(typescript@5.9.2)(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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.3)(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) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.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)))(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)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(supports-color@9.4.0) + '@nomicfoundation/hardhat-ethers': 3.1.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)) + 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.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.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.17.58)(typescript@5.8.3))(typescript@5.8.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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): dependencies: - '@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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)) - debug: 4.4.1(supports-color@9.4.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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)) + debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 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.17.58)(typescript@5.8.3))(typescript@5.8.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) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-storage-layout@0.1.7(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - console-table-printer: 2.14.1 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - console-table-printer: 2.14.1 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - - hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): dependencies: - '@ethereumjs/util': 9.1.0 - '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 - '@nomicfoundation/solidity-analyzer': 0.1.2 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.2.0 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chokidar: 4.0.3 - ci-info: 2.0.0 - debug: 4.4.1(supports-color@9.4.0) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - find-up: 5.0.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - immutable: 4.3.7 - io-ts: 1.10.4 - json-stream-stringify: 3.1.6 - keccak: 3.0.4 - lodash: 4.17.21 - micro-eth-signer: 0.14.0 - mnemonist: 0.38.5 - mocha: 10.8.2 - p-map: 4.0.0 - picocolors: 1.1.1 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 - tsort: 0.0.1 - undici: 5.29.0 - 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.17.58)(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + 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.24.2(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.8.3))(typescript@5.8.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): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.0 + '@nomicfoundation/edr': 0.11.3 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.2.0 - '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -22657,23 +22462,23 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) + solc: 0.8.26(debug@4.4.3) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tsort: 0.0.1 undici: 5.29.0 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.8.3) - typescript: 5.8.3 + ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 @@ -22686,7 +22491,7 @@ snapshots: boxen: 5.1.2 chokidar: 4.0.3 ci-info: 2.0.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -22706,17 +22511,17 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.4.1) + solc: 0.8.26(debug@4.4.3) source-map-support: 0.5.21 stacktrace-parser: 0.1.11 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tsort: 0.0.1 undici: 5.29.0 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.17.58)(typescript@5.8.3) - typescript: 5.8.3 + ts-node: 8.10.2(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - supports-color @@ -22774,6 +22579,10 @@ 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 @@ -22814,17 +22623,11 @@ snapshots: helmet@7.0.0: {} - hermes-estree@0.25.1: {} - - hermes-estree@0.28.1: {} + hermes-estree@0.29.1: {} - hermes-parser@0.25.1: + hermes-parser@0.29.1: dependencies: - hermes-estree: 0.25.1 - - hermes-parser@0.28.1: - dependencies: - hermes-estree: 0.28.1 + hermes-estree: 0.29.1 hmac-drbg@1.0.1: dependencies: @@ -22883,14 +22686,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.3 - debug: 4.4.1(supports-color@9.4.0) + agent-base: 7.1.4 + debug: 4.4.3(supports-color@9.4.0) transitivePeerDependencies: - supports-color http-response-object@3.0.2: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 http-signature@1.2.0: dependencies: @@ -22912,14 +22715,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.3 - debug: 4.4.1(supports-color@9.4.0) + agent-base: 7.1.4 + debug: 4.4.3(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -22941,6 +22744,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + idna-uts46-hx@2.3.1: dependencies: punycode: 2.1.0 @@ -22979,7 +22786,7 @@ snapshots: import-from@4.0.0: {} - import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} imul@1.0.1: {} @@ -23038,10 +22845,7 @@ snapshots: dependencies: fp-ts: 1.19.3 - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ip-address@10.0.1: {} ipaddr.js@1.9.1: {} @@ -23081,7 +22885,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} + is-arrayish@0.3.4: {} is-async-function@2.1.1: dependencies: @@ -23187,9 +22991,9 @@ snapshots: is-fullwidth-code-point@4.0.0: {} - is-fullwidth-code-point@5.0.0: + is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.4.0 is-function@1.0.2: {} @@ -23370,9 +23174,9 @@ snapshots: dependencies: ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isomorphic-ws@5.0.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: @@ -23384,8 +23188,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.27.5 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -23407,7 +23211,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.14 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -23417,7 +23221,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.58 + '@types/node': 20.19.14 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -23444,7 +23248,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.14 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -23452,7 +23256,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.58 + '@types/node': 20.19.14 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -23469,12 +23273,12 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.4.2: {} + jiti@2.5.1: {} js-cookie@2.2.1: {} @@ -23499,8 +23303,6 @@ snapshots: jsbn@0.1.1: {} - jsbn@1.1.0: {} - jsc-safe-url@0.2.4: {} jsdoc-type-pratt-parser@4.1.0: {} @@ -23517,7 +23319,7 @@ snapshots: json-bigint@1.0.0: dependencies: - bignumber.js: 9.3.0 + bignumber.js: 9.3.1 json-buffer@3.0.0: optional: true @@ -23534,7 +23336,7 @@ snapshots: json-rpc-engine@3.8.0: dependencies: - async: 2.6.4 + async: 2.6.2 babel-preset-env: 1.7.0 babelify: 7.3.0 json-rpc-error: 2.0.0 @@ -23551,7 +23353,7 @@ snapshots: json-schema-to-ts@2.12.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@types/json-schema': 7.0.15 ts-algebra: 1.2.2 @@ -23595,7 +23397,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -23832,7 +23634,7 @@ snapshots: cli-truncate: 3.1.0 colorette: 2.0.20 commander: 9.5.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) execa: 5.1.1 lilconfig: 2.0.5 listr2: 4.0.5(enquirer@2.4.1) @@ -23848,31 +23650,46 @@ snapshots: lint-staged@15.5.2: dependencies: - chalk: 5.4.1 + chalk: 5.6.2 commander: 13.1.0 - debug: 4.4.1(supports-color@9.4.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.0 + yaml: 2.8.1 transitivePeerDependencies: - supports-color lint-staged@16.0.0: dependencies: - chalk: 5.4.1 + chalk: 5.6.2 commander: 13.1.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 - nano-spawn: 1.0.2 + nano-spawn: 1.0.3 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.8.1 + transitivePeerDependencies: + - supports-color + + lint-staged@16.1.6: + 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.0 + yaml: 2.8.1 transitivePeerDependencies: - supports-color @@ -23896,7 +23713,16 @@ snapshots: eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 + + listr2@9.0.4: + dependencies: + cli-truncate: 5.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 load-json-file@1.1.0: dependencies: @@ -23983,11 +23809,11 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.0.0 + ansi-escapes: 7.1.0 cli-cursor: 5.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 logform@2.7.0: dependencies: @@ -24028,7 +23854,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.1: {} lru-cache@3.2.0: dependencies: @@ -24102,14 +23928,14 @@ snapshots: markdownlint-cli@0.45.0: dependencies: commander: 13.1.0 - glob: 11.0.2 + glob: 11.0.3 ignore: 7.0.5 js-yaml: 4.1.0 jsonc-parser: 3.3.1 jsonpointer: 5.0.1 markdown-it: 14.1.0 markdownlint: 0.38.0 - minimatch: 10.0.1 + minimatch: 10.0.3 run-con: 1.3.2 smol-toml: 1.3.4 transitivePeerDependencies: @@ -24233,7 +24059,7 @@ snapshots: merkle-patricia-tree@3.0.0: dependencies: - async: 2.6.4 + async: 2.6.2 ethereumjs-util: 5.2.1 level-mem: 3.0.1 level-ws: 1.0.0 @@ -24250,58 +24076,58 @@ snapshots: readable-stream: 3.6.2 semaphore-async-await: 1.5.1 - meros@1.3.0(@types/node@20.17.58): + meros@1.3.2(@types/node@20.19.14): optionalDependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 methods@1.1.2: {} - metro-babel-transformer@0.82.4: + metro-babel-transformer@0.83.1: dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.4 flow-enums-runtime: 0.0.6 - hermes-parser: 0.28.1 + hermes-parser: 0.29.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.82.4: + metro-cache-key@0.83.1: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.82.4: + metro-cache@0.83.1: dependencies: exponential-backoff: 3.1.2 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.82.4 + metro-core: 0.83.1 transitivePeerDependencies: - supports-color - metro-config@0.82.4(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): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-cache: 0.82.4 - metro-core: 0.82.4 - metro-runtime: 0.82.4 + 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 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.82.4: + metro-core@0.83.1: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.82.4 + metro-resolver: 0.83.1 - metro-file-map@0.82.4: + metro-file-map@0.83.1: dependencies: - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) fb-watchman: 2.0.2 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -24313,112 +24139,112 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.82.4: + metro-minify-terser@0.83.1: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.41.0 + terser: 5.44.0 - metro-resolver@0.82.4: + metro-resolver@0.83.1: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.82.4: + metro-runtime@0.83.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 flow-enums-runtime: 0.0.6 - metro-source-map@0.82.4: + metro-source-map@0.83.1: dependencies: - '@babel/traverse': 7.27.4 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.27.4' - '@babel/types': 7.27.6 + '@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.82.4 + metro-symbolicate: 0.83.1 nullthrows: 1.1.1 - ob1: 0.82.4 + ob1: 0.83.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.82.4: + metro-symbolicate@0.83.1: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.82.4 + metro-source-map: 0.83.1 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.82.4: + metro-transform-plugins@0.83.1: dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.4 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro-transform-worker@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@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.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-babel-transformer: 0.82.4 - metro-cache: 0.82.4 - metro-cache-key: 0.82.4 - metro-minify-terser: 0.82.4 - metro-source-map: 0.82.4 - metro-transform-plugins: 0.82.4 + 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 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + metro@0.83.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 connect: 3.7.0 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 - hermes-parser: 0.28.1 + hermes-parser: 0.29.1 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.82.4 - metro-cache: 0.82.4 - metro-cache-key: 0.82.4 - metro-config: 0.82.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - metro-core: 0.82.4 - metro-file-map: 0.82.4 - metro-resolver: 0.82.4 - metro-runtime: 0.82.4 - metro-source-map: 0.82.4 - metro-symbolicate: 0.82.4 - metro-transform-plugins: 0.82.4 - metro-transform-worker: 0.82.4(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-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) mime-types: 2.1.35 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -24445,7 +24271,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -24595,7 +24421,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -24603,8 +24429,8 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@9.4.0) - decode-named-character-reference: 1.1.0 + debug: 4.4.3(supports-color@9.4.0) + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -24702,21 +24528,21 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} - minimatch@10.0.1: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist-options@4.1.0: dependencies: @@ -24810,7 +24636,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -24913,13 +24739,13 @@ snapshots: mute-stream@0.0.8: {} - nan@2.22.2: + nan@2.23.0: optional: true nano-json-stream-parser@0.1.2: optional: true - nano-spawn@1.0.2: {} + nano-spawn@1.0.3: {} nanomatch@1.2.13: dependencies: @@ -25022,7 +24848,7 @@ snapshots: node-hid@1.3.0: dependencies: bindings: 1.5.0 - nan: 2.22.2 + nan: 2.23.0 node-abi: 2.30.1 prebuild-install: 5.3.6 optional: true @@ -25036,7 +24862,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.19: {} + node-releases@2.0.21: {} nofilter@3.1.0: {} @@ -25073,7 +24899,7 @@ snapshots: normalize-url@6.1.0: optional: true - normalize-url@8.0.1: {} + normalize-url@8.1.0: {} npm-package-arg@11.0.3: dependencies: @@ -25126,7 +24952,7 @@ snapshots: oauth-sign@0.9.0: {} - ob1@0.82.4: + ob1@0.83.1: dependencies: flow-enums-runtime: 0.0.6 @@ -25299,7 +25125,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.9.3(typescript@5.8.3)(zod@3.25.51): + ox@0.9.3(typescript@5.9.2)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -25307,10 +25133,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.8.3)(zod@3.25.51) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - zod @@ -25368,7 +25194,7 @@ snapshots: p-queue@6.6.2: dependencies: - eventemitter3: 4.0.4 + eventemitter3: 4.0.7 p-timeout: 3.2.0 p-timeout@3.2.0: @@ -25390,7 +25216,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.10 + quansync: 0.2.11 packet-reader@1.0.0: {} @@ -25409,7 +25235,7 @@ snapshots: browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 hash-base: 3.0.5 - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 safe-buffer: 5.2.1 optional: true @@ -25429,7 +25255,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -25455,17 +25281,17 @@ snapshots: parse-json@2.2.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 parse-json@4.0.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-better-errors: 1.0.2 parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -25556,7 +25382,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.1 minipass: 7.1.2 path-starts-with@2.0.1: {} @@ -25578,22 +25404,23 @@ snapshots: pathval@1.1.1: {} - pbkdf2@3.1.2: + pbkdf2@3.1.3: dependencies: - create-hash: 1.2.0 + create-hash: 1.1.3 create-hmac: 1.1.7 - ripemd160: 2.0.2 + ripemd160: 2.0.1 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 + to-buffer: 1.2.1 pegjs@0.10.0: {} performance-now@2.1.0: {} - pg-cloudflare@1.2.5: + pg-cloudflare@1.2.7: optional: true - pg-connection-string@2.9.0: {} + pg-connection-string@2.9.1: {} pg-hstore@2.3.4: dependencies: @@ -25601,15 +25428,15 @@ snapshots: pg-int8@1.0.1: {} - pg-pool@3.10.0(pg@8.11.3): + pg-pool@3.10.1(pg@8.11.3): dependencies: pg: 8.11.3 - pg-pool@3.10.0(pg@8.7.3): + pg-pool@3.10.1(pg@8.7.3): dependencies: pg: 8.7.3 - pg-protocol@1.10.0: {} + pg-protocol@1.10.3: {} pg-types@2.2.0: dependencies: @@ -25623,21 +25450,21 @@ snapshots: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.9.0 - pg-pool: 3.10.0(pg@8.11.3) - pg-protocol: 1.10.0 + pg-connection-string: 2.9.1 + pg-pool: 3.10.1(pg@8.11.3) + pg-protocol: 1.10.3 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.2.5 + pg-cloudflare: 1.2.7 pg@8.7.3: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.9.0 - pg-pool: 3.10.0(pg@8.7.3) - pg-protocol: 1.10.0 + pg-connection-string: 2.9.1 + pg-pool: 3.10.1(pg@8.7.3) + pg-protocol: 1.10.3 pg-types: 2.2.0 pgpass: 1.0.5 @@ -25651,7 +25478,7 @@ snapshots: picomatch@3.0.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.5.0: {} @@ -25722,7 +25549,7 @@ snapshots: node-abi: 2.30.1 noop-logger: 0.1.1 npmlog: 4.1.2 - pump: 3.0.2 + pump: 3.0.3 rc: 1.2.8 simple-get: 3.1.1 tar-fs: 2.1.3 @@ -25740,7 +25567,7 @@ snapshots: napi-build-utils: 1.0.2 node-abi: 2.30.1 npmlog: 4.1.2 - pump: 3.0.2 + pump: 3.0.3 rc: 1.2.8 simple-get: 3.1.1 tar-fs: 2.1.3 @@ -25758,14 +25585,14 @@ snapshots: preserve@0.2.0: {} - prettier-plugin-solidity@2.0.0(prettier@3.5.3): + prettier-plugin-solidity@2.1.0(prettier@3.6.2): dependencies: - '@nomicfoundation/slang': 1.1.0 - '@solidity-parser/parser': 0.20.1 - prettier: 3.5.3 + '@nomicfoundation/slang': 1.2.0 + '@solidity-parser/parser': 0.20.2 + prettier: 3.6.2 semver: 7.7.2 - prettier@3.5.3: {} + prettier@3.6.2: {} pretty-format@29.7.0: dependencies: @@ -25773,14 +25600,14 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-quick@4.2.2(prettier@3.5.3): + pretty-quick@4.2.2(prettier@3.6.2): dependencies: - '@pkgr/core': 0.2.7 + '@pkgr/core': 0.2.9 ignore: 7.0.5 mri: 1.2.0 picocolors: 1.1.1 - picomatch: 4.0.2 - prettier: 3.5.3 + picomatch: 4.0.3 + prettier: 3.6.2 tinyexec: 0.3.2 tslib: 2.8.1 @@ -25887,16 +25714,16 @@ snapshots: dependencies: looper: 2.0.0 - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 pumpify@2.0.1: dependencies: duplexify: 4.1.3 inherits: 2.0.4 - pump: 3.0.2 + pump: 3.0.3 punycode.js@2.3.1: {} @@ -25933,7 +25760,7 @@ snapshots: qs@6.9.7: {} - quansync@0.2.10: {} + quansync@0.2.11: {} query-string@5.1.1: dependencies: @@ -26007,7 +25834,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + react-devtools-core@6.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.3 ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -26017,48 +25844,46 @@ snapshots: react-is@18.3.1: {} - react-native-fs@2.20.0(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(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.1.1)(utf-8-validate@5.0.10)): dependencies: base-64: 0.1.0 - react-native: 0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10) + react-native: 0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10) utf8: 3.0.0 react-native-path@0.0.5: {} - react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10): + react-native@0.81.4(@babel/core@7.28.4)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native/assets-registry': 0.79.3 - '@react-native/codegen': 0.79.3(@babel/core@7.27.4) - '@react-native/community-cli-plugin': 0.79.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@react-native/gradle-plugin': 0.79.3 - '@react-native/js-polyfills': 0.79.3 - '@react-native/normalize-colors': 0.79.3 - '@react-native/virtualized-lists': 0.79.3(react-native@0.79.3(@babel/core@7.27.4)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0) + '@react-native/assets-registry': 0.81.4 + '@react-native/codegen': 0.81.4(@babel/core@7.28.4) + '@react-native/community-cli-plugin': 0.81.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@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) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.27.4) - babel-plugin-syntax-hermes-parser: 0.25.1 + babel-jest: 29.7.0(@babel/core@7.28.4) + babel-plugin-syntax-hermes-parser: 0.29.1 base64-js: 1.5.1 - chalk: 4.1.2 commander: 12.1.0 - event-target-shim: 5.0.1 flow-enums-runtime: 0.0.6 glob: 7.2.3 invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.82.4 - metro-source-map: 0.82.4 + metro-runtime: 0.83.1 + metro-source-map: 0.83.1 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 - react: 19.1.0 - react-devtools-core: 6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + react: 19.1.1 + 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 - scheduler: 0.25.0 + scheduler: 0.26.0 semver: 7.7.2 stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 @@ -26067,13 +25892,14 @@ snapshots: transitivePeerDependencies: - '@babel/core' - '@react-native-community/cli' + - '@react-native/metro-config' - bufferutil - supports-color - utf-8-validate react-refresh@0.14.2: {} - react@19.1.0: {} + react@19.1.1: {} read-pkg-up@1.0.1: dependencies: @@ -26230,7 +26056,7 @@ snapshots: relay-runtime@12.0.0(encoding@0.1.13): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 fbjs: 3.0.5(encoding@0.1.13) invariant: 2.2.4 transitivePeerDependencies: @@ -26368,6 +26194,11 @@ snapshots: dependencies: glob: 10.4.5 + ripemd160@2.0.1: + dependencies: + hash-base: 2.0.2 + inherits: 2.0.4 + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 @@ -26456,13 +26287,13 @@ snapshots: which: 1.3.1 wordwrap: 1.0.0 - scheduler@0.25.0: {} + scheduler@0.26.0: {} scrypt-js@3.0.1: {} scryptsy@1.2.1: dependencies: - pbkdf2: 3.1.2 + pbkdf2: 3.1.3 optional: true secp256k1@4.0.4: @@ -26558,14 +26389,14 @@ snapshots: sequelize@6.19.0(pg-hstore@2.3.4)(pg@8.7.3): dependencies: '@types/debug': 4.1.12 - '@types/validator': 13.15.1 - debug: 4.4.1(supports-color@9.4.0) + '@types/validator': 13.15.3 + debug: 4.4.3(supports-color@9.4.0) dottie: 2.0.6 inflection: 1.13.4 lodash: 4.17.21 moment: 2.30.1 moment-timezone: 0.5.48 - pg-connection-string: 2.9.0 + pg-connection-string: 2.9.1 retry-as-promised: 5.0.0 semver: 7.7.2 sequelize-pool: 7.1.0 @@ -26582,14 +26413,14 @@ snapshots: sequelize@6.33.0(pg-hstore@2.3.4)(pg@8.11.3): dependencies: '@types/debug': 4.1.12 - '@types/validator': 13.15.1 - debug: 4.4.1(supports-color@9.4.0) + '@types/validator': 13.15.3 + debug: 4.4.3(supports-color@9.4.0) dottie: 2.0.6 inflection: 1.13.4 lodash: 4.17.21 moment: 2.30.1 moment-timezone: 0.5.48 - pg-connection-string: 2.9.0 + pg-connection-string: 2.9.1 retry-as-promised: 7.1.1 semver: 7.7.2 sequelize-pool: 7.1.0 @@ -26684,10 +26515,11 @@ snapshots: setprototypeof@1.2.0: {} - sha.js@2.4.11: + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.1 sha1@1.1.1: dependencies: @@ -26765,11 +26597,11 @@ snapshots: simple-concat: 1.0.1 optional: true - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 - simple-wcswidth@1.0.1: {} + simple-wcswidth@1.1.2: {} sisteransi@1.0.5: {} @@ -26793,13 +26625,13 @@ snapshots: slice-ansi@5.0.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 - slice-ansi@7.1.0: + slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 smart-buffer@4.2.0: {} @@ -26835,33 +26667,33 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.3 - debug: 4.4.1(supports-color@9.4.0) - socks: 2.8.4 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@9.4.0) + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.8.4: + socks@2.8.7: dependencies: - ip-address: 9.0.5 + ip-address: 10.0.1 smart-buffer: 4.2.0 sol-digger@0.0.2: {} sol-explore@1.6.1: {} - solc-typed-ast@18.2.4(typescript@5.8.3)(zod@3.25.51): + solc-typed-ast@18.2.4(typescript@5.9.2)(zod@3.25.76): dependencies: - axios: 1.9.0(debug@4.4.1) + axios: 1.12.2(debug@4.4.3) commander: 12.1.0 - decimal.js: 10.5.0 + decimal.js: 10.6.0 findup-sync: 5.0.0 - fs-extra: 11.3.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.8.3)(zod@3.25.51) + web3-eth-abi: 4.4.1(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - debug - typescript @@ -26890,7 +26722,7 @@ snapshots: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.11(debug@4.4.3) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -26902,7 +26734,7 @@ snapshots: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.11(debug@4.4.3) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -26910,11 +26742,11 @@ snapshots: transitivePeerDependencies: - debug - solc@0.8.26(debug@4.4.1): + solc@0.8.26(debug@4.4.3): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.11(debug@4.4.3) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -26922,15 +26754,15 @@ snapshots: transitivePeerDependencies: - debug - solhint@5.1.0(typescript@5.8.3): + solhint@5.1.0(typescript@5.9.2): dependencies: - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.20.2 ajv: 6.12.6 antlr4: 4.13.2 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.2) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.2 @@ -26943,11 +26775,11 @@ snapshots: table: 6.9.0 text-table: 0.2.0 optionalDependencies: - prettier: 3.5.3 + prettier: 3.6.2 transitivePeerDependencies: - typescript - solhint@6.0.1(typescript@5.8.3): + solhint@6.0.1(typescript@5.9.2): dependencies: '@solidity-parser/parser': 0.20.2 ajv: 6.12.6 @@ -26957,7 +26789,7 @@ snapshots: better-ajv-errors: 2.0.2(ajv@6.12.6) chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.2) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.2 @@ -26969,39 +26801,16 @@ snapshots: table: 6.9.0 text-table: 0.2.0 optionalDependencies: - prettier: 3.5.3 + prettier: 3.6.2 transitivePeerDependencies: - typescript - solidity-ast@0.4.60: {} - - solidity-coverage@0.8.16(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)): - dependencies: - '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 - chalk: 2.4.2 - death: 1.1.0 - difflib: 0.2.4 - fs-extra: 8.1.0 - ghost-testrpc: 0.0.2 - global-modules: 2.0.0 - globby: 10.0.2 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - jsonschema: 1.5.0 - lodash: 4.17.21 - mocha: 10.8.2 - node-emoji: 1.11.0 - pify: 4.0.1 - recursive-readdir: 2.2.3 - sc-istanbul: 0.4.6 - semver: 7.7.2 - shelljs: 0.8.5 - web3-utils: 1.10.4 + 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.17.58)(typescript@5.8.3))(typescript@5.8.3)(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)): dependencies: '@ethersproject/abi': 5.8.0 - '@solidity-parser/parser': 0.20.1 + '@solidity-parser/parser': 0.20.2 chalk: 2.4.2 death: 1.1.0 difflib: 0.2.4 @@ -27009,7 +26818,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.17.58)(typescript@5.8.3))(typescript@5.8.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) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -27021,11 +26830,11 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-docgen@0.6.0-beta.36(hardhat@2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(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.14)(typescript@5.9.2))(typescript@5.9.2)(utf-8-validate@5.0.10)): dependencies: handlebars: 4.7.8 - hardhat: 2.24.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) - solidity-ast: 0.4.60 + 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-ast: 0.4.61 solium-plugin-security@0.1.1(solium@1.2.5): dependencies: @@ -27100,21 +26909,21 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.22 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.22 spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.21: {} + spdx-license-ids@3.0.22: {} split-string@3.1.0: dependencies: @@ -27132,8 +26941,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - src-location@1.1.0: {} sshpk@1.18.0: @@ -27215,13 +27022,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 string.prototype.trim@1.2.10: dependencies: @@ -27272,9 +27084,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@2.0.0: dependencies: @@ -27399,14 +27211,14 @@ snapshots: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.2 + pump: 3.0.3 tar-stream: 2.2.0 optional: true tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 @@ -27438,10 +27250,10 @@ snapshots: term-size@2.2.1: {} - terser@5.41.0: + terser@5.44.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -27470,11 +27282,11 @@ snapshots: dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 - '@types/node': 20.17.58 + '@types/node': 20.19.14 '@types/qs': 6.14.0 caseless: 0.12.0 concat-stream: 1.6.2 - form-data: 2.5.3 + form-data: 2.5.5 http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 @@ -27511,10 +27323,10 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.5(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 title-case@3.0.3: dependencies: @@ -27530,6 +27342,12 @@ snapshots: tmpl@1.0.5: {} + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-fast-properties@1.0.3: {} to-object-path@0.3.0: @@ -27584,9 +27402,9 @@ snapshots: ts-algebra@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 ts-command-line-args@2.5.1: dependencies: @@ -27597,13 +27415,13 @@ snapshots: ts-essentials@1.0.4: {} - ts-essentials@6.0.7(typescript@5.8.3): + ts-essentials@6.0.7(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - ts-essentials@7.0.3(typescript@5.8.3): + ts-essentials@7.0.3(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 ts-generator@0.1.1: dependencies: @@ -27613,35 +27431,35 @@ snapshots: chalk: 2.4.2 glob: 7.2.3 mkdirp: 0.5.6 - prettier: 3.5.3 + prettier: 3.6.2 resolve: 1.22.10 ts-essentials: 1.0.4 - ts-node@10.9.2(@types/node@20.17.58)(typescript@5.8.3): + ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.2): 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.17.58 - acorn: 8.14.1 + '@types/node': 20.19.14 + 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.8.3 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@8.10.2(typescript@5.8.3): + ts-node@8.10.2(typescript@5.9.2): dependencies: arg: 4.1.3 diff: 4.0.2 make-error: 1.3.6 source-map-support: 0.5.21 - typescript: 5.8.3 + typescript: 5.9.2 yn: 3.1.1 tsconfig-paths@3.15.0: @@ -27712,32 +27530,32 @@ snapshots: type@2.7.3: {} - typechain@3.0.0(typescript@5.8.3): + typechain@3.0.0(typescript@5.9.2): dependencies: command-line-args: 4.0.7 - debug: 4.4.1(supports-color@9.4.0) + 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.8.3) + ts-essentials: 6.0.7(typescript@5.9.2) ts-generator: 0.1.1 transitivePeerDependencies: - supports-color - typescript - typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.8.3): + typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.2): dependencies: '@types/prettier': 2.7.3 - debug: 4.4.1(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 lodash: 4.17.21 mkdirp: 1.0.4 - prettier: 3.5.3 + prettier: 3.6.2 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.8.3) - typescript: 5.8.3 + ts-essentials: 7.0.3(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -27780,17 +27598,18 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.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/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 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} + typescript@5.9.2: {} typewise-core@1.2.0: {} @@ -27808,7 +27627,7 @@ snapshots: u2f-api@0.2.7: {} - ua-parser-js@1.0.40: {} + ua-parser-js@1.0.41: {} uc.micro@2.1.0: {} @@ -27832,7 +27651,7 @@ snapshots: underscore@1.9.1: optional: true - undici-types@6.19.8: {} + undici-types@6.21.0: {} undici@5.29.0: dependencies: @@ -27880,9 +27699,9 @@ snapshots: has-value: 0.3.1 isobject: 3.0.1 - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.1.3(browserslist@4.26.0): dependencies: - browserslist: 4.25.0 + browserslist: 4.26.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -27996,18 +27815,18 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - viem@2.37.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.51): + viem@2.37.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): 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.8.3)(zod@3.25.51) + abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.9.3(typescript@5.8.3)(zod@3.25.51) + ox: 0.9.3(typescript@5.9.2)(zod@3.25.76) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -28023,7 +27842,7 @@ snapshots: web3-bzz@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 got: 9.6.0 swarm-js: 0.1.42(bufferutil@4.0.9)(utf-8-validate@5.0.10) underscore: 1.9.1 @@ -28076,8 +27895,8 @@ snapshots: web3-core@1.2.11: dependencies: '@types/bn.js': 4.11.6 - '@types/node': 20.17.58 - bignumber.js: 9.3.0 + '@types/node': 20.19.14 + bignumber.js: 9.3.1 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 web3-core-requestmanager: 1.2.11 @@ -28097,9 +27916,9 @@ snapshots: web3-utils: 1.2.11 optional: true - web3-eth-abi@4.4.1(typescript@5.8.3)(zod@3.25.51): + web3-eth-abi@4.4.1(typescript@5.9.2)(zod@3.25.76): dependencies: - abitype: 0.7.1(typescript@5.8.3)(zod@3.25.51) + 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 @@ -28163,7 +27982,7 @@ snapshots: web3-eth-personal@1.2.11: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 web3-core: 1.2.11 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 @@ -28203,7 +28022,7 @@ snapshots: web3-provider-engine@14.2.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - async: 2.6.4 + async: 2.6.2 backoff: 2.5.0 clone: 2.1.2 cross-fetch: 2.2.6(encoding@0.1.13) @@ -28301,7 +28120,7 @@ snapshots: util: 0.12.5 web3-errors: 1.3.1 web3-types: 1.10.0 - zod: 3.25.51 + zod: 3.25.76 web3@1.2.11(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: @@ -28320,7 +28139,7 @@ snapshots: webcrypto-core@1.8.1: dependencies: - '@peculiar/asn1-schema': 2.3.15 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -28437,7 +28256,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 20.17.58 + '@types/node': 20.19.14 wonka@4.0.15: {} @@ -28473,15 +28292,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 - wrap-ansi@9.0.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -28601,7 +28420,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@18.1.3: dependencies: @@ -28704,8 +28523,8 @@ snapshots: dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - zod-to-json-schema@3.24.5(zod@3.25.51): + zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: - zod: 3.25.51 + zod: 3.25.76 - zod@3.25.51: {} + zod@3.25.76: {} From a03c9bd9ba5214fa838eb951f2bb362dfafa2891 Mon Sep 17 00:00:00 2001 From: Rembrandt Kuipers Date: Fri, 19 Sep 2025 13:48:19 +0000 Subject: [PATCH 25/28] feat: remove hardhat-dependency-compiler from contracts/test Remove hardhat-dependency-compiler plugin as it's no longer needed. The hardhat-dependency-compiler plugin was a historical workaround that is no longer necessary for the current codebase structure. Changes: - Remove hardhat-dependency-compiler import and configuration from packages/contracts/test/hardhat.config.ts - Remove getContractPaths() and findSolidityFiles() helper functions - Remove hardhat-dependency-compiler dependency from packages/contracts/test/package.json - Clean up hardhat-dependency-compiler directory reference from packages/contracts/package.json clean script - Clean up unused imports (fs) --- packages/contracts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index ed460cc19..fb14983ef 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -35,7 +35,7 @@ ], "scripts": { "prepack": "pnpm build", - "clean": "rm -rf artifacts/ cache/ types/ abis/ build/ dist/ contracts/hardhat-dependency-compiler/", + "clean": "rm -rf artifacts/ cache/ types/ abis/ build/ dist/", "build": "pnpm build:self", "build:self": "pnpm compile", "compile": "hardhat compile", From 310db0bd4260b8badeb920a3db55bbbae0030ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Fri, 19 Sep 2025 11:42:47 -0300 Subject: [PATCH 26/28] release: interfaces 0.6.3 and toolshed 0.6.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- packages/interfaces/CHANGELOG.md | 18 ++++++++++++++++++ packages/interfaces/package.json | 2 +- packages/toolshed/CHANGELOG.md | 22 ++++++++++++++++++++++ packages/toolshed/package.json | 2 +- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/interfaces/CHANGELOG.md b/packages/interfaces/CHANGELOG.md index 336f3ec11..3bd87c616 100644 --- a/packages/interfaces/CHANGELOG.md +++ b/packages/interfaces/CHANGELOG.md @@ -1,5 +1,23 @@ # @graphprotocol/interfaces +## 0.6.3 + +### Patch Changes + +- Add LegacyRewardsManager interface + +## 0.6.2 + +### Patch Changes + +- Ensure ServiceRegistry loads the correct interface + +## 0.6.1 + +### Patch Changes + +- Add ServiceRegistered to LegacyServiceRegistry interface + ## 0.6.0 ### Minor Changes diff --git a/packages/interfaces/package.json b/packages/interfaces/package.json index 8de3a67b5..a4a35c3ab 100644 --- a/packages/interfaces/package.json +++ b/packages/interfaces/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/interfaces", - "version": "0.6.0", + "version": "0.6.3", "publishConfig": { "access": "public" }, diff --git a/packages/toolshed/CHANGELOG.md b/packages/toolshed/CHANGELOG.md index cbca76216..0c6a97768 100644 --- a/packages/toolshed/CHANGELOG.md +++ b/packages/toolshed/CHANGELOG.md @@ -1,5 +1,27 @@ # @graphprotocol/toolshed +## 0.6.16 + +### Patch Changes + +- Add LegacyRewardsManager interface +- Updated dependencies + - @graphprotocol/interfaces@0.6.3 + +## 0.6.15 + +### Patch Changes + +- Ensure ServiceRegistry loads the correct interface +- Updated dependencies + - @graphprotocol/interfaces@0.6.2 + +## 0.6.14 + +### Patch Changes + +- Update to latest interfaces package + ## 0.6.13 ### Patch Changes diff --git a/packages/toolshed/package.json b/packages/toolshed/package.json index e5051ab0b..b44dd2ef0 100644 --- a/packages/toolshed/package.json +++ b/packages/toolshed/package.json @@ -1,6 +1,6 @@ { "name": "@graphprotocol/toolshed", - "version": "0.6.13", + "version": "0.6.16", "publishConfig": { "access": "public" }, From 960e25c95c1b8d12a4b3c5bc9c8713281b4aeb82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Migone?= Date: Fri, 19 Sep 2025 11:36:59 -0300 Subject: [PATCH 27/28] feat: add LegacyRewardsManager to interfaces and horizon contracts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Migone --- .../rewards/ILegacyRewardsManager.sol | 8 +++++ packages/interfaces/src/types/horizon.ts | 33 +++++++++++++++++++ .../src/deployments/horizon/address-book.ts | 10 +++++- .../src/deployments/horizon/contracts.ts | 2 ++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol create mode 100644 packages/interfaces/src/types/horizon.ts diff --git a/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol b/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol new file mode 100644 index 000000000..aae740095 --- /dev/null +++ b/packages/interfaces/contracts/contracts/rewards/ILegacyRewardsManager.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.7.6 || 0.8.27; + +interface ILegacyRewardsManager { + function getRewards(address allocationID) external view returns (uint256); +} + diff --git a/packages/interfaces/src/types/horizon.ts b/packages/interfaces/src/types/horizon.ts new file mode 100644 index 000000000..1e78414c9 --- /dev/null +++ b/packages/interfaces/src/types/horizon.ts @@ -0,0 +1,33 @@ +import type { + IControllerToolshed, + IEpochManagerToolshed, + IL2GNSToolshed, + IGraphPayments, + IGraphProxyAdmin, + IGraphTallyCollectorToolshed, + IGraphToken, + IHorizonStakingToolshed, + IL2CurationToolshed, + IPaymentsEscrowToolshed, + IRewardsManagerToolshed, + IStaking, + ISubgraphNFT, + ILegacyRewardsManager, +} from '../../types' + +export { + IControllerToolshed as Controller, + IEpochManagerToolshed as EpochManager, + IGraphPayments as GraphPayments, + IGraphProxyAdmin as GraphProxyAdmin, + IGraphTallyCollectorToolshed as GraphTallyCollector, + IHorizonStakingToolshed as HorizonStaking, + IL2CurationToolshed as L2Curation, + IL2GNSToolshed as L2GNS, + IGraphToken as L2GraphToken, + IStaking as LegacyStaking, + IPaymentsEscrowToolshed as PaymentsEscrow, + IRewardsManagerToolshed as RewardsManager, + ISubgraphNFT as SubgraphNFT, + ILegacyRewardsManager as LegacyRewardsManager, +} diff --git a/packages/toolshed/src/deployments/horizon/address-book.ts b/packages/toolshed/src/deployments/horizon/address-book.ts index fbf72aa98..8a3db914e 100644 --- a/packages/toolshed/src/deployments/horizon/address-book.ts +++ b/packages/toolshed/src/deployments/horizon/address-book.ts @@ -1,4 +1,4 @@ -import type { LegacyStaking } from '@graphprotocol/interfaces' +import type { LegacyRewardsManager, LegacyStaking } from '@graphprotocol/interfaces' import { getInterface } from '@graphprotocol/interfaces' import { Provider, Signer } from 'ethers' import { Contract } from 'ethers' @@ -35,6 +35,14 @@ export class GraphHorizonAddressBook extends AddressBook Date: Thu, 18 Sep 2025 13:47:20 -0300 Subject: [PATCH 28/28] chore: add subgraph service to allowed locked verifier in migrate script (#1225) --- packages/horizon/ignition/modules/core/HorizonStaking.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/horizon/ignition/modules/core/HorizonStaking.ts b/packages/horizon/ignition/modules/core/HorizonStaking.ts index 59735cce2..c4044b0af 100644 --- a/packages/horizon/ignition/modules/core/HorizonStaking.ts +++ b/packages/horizon/ignition/modules/core/HorizonStaking.ts @@ -44,6 +44,7 @@ export default buildModule('HorizonStaking', (m) => { artifact: HorizonStakingArtifact, }) m.call(HorizonStaking, 'setMaxThawingPeriod', [maxThawingPeriod]) + m.call(HorizonStaking, 'setAllowedLockedVerifier', [subgraphServiceAddress, true]) return { HorizonStaking, HorizonStakingImplementation } }) @@ -88,6 +89,7 @@ export const MigrateHorizonStakingGovernorModule = buildModule('HorizonStakingGo const graphProxyAdminAddress = m.getParameter('graphProxyAdminAddress') const horizonStakingAddress = m.getParameter('horizonStakingAddress') const horizonStakingImplementationAddress = m.getParameter('horizonStakingImplementationAddress') + const subgraphServiceAddress = m.getParameter('subgraphServiceAddress') const HorizonStakingImplementation = m.contractAt( 'HorizonStakingImplementation', @@ -103,6 +105,7 @@ export const MigrateHorizonStakingGovernorModule = buildModule('HorizonStakingGo artifact: HorizonStakingArtifact, }) m.call(HorizonStaking, 'setMaxThawingPeriod', [maxThawingPeriod]) + m.call(HorizonStaking, 'setAllowedLockedVerifier', [subgraphServiceAddress, true]) return { HorizonStaking, HorizonStakingImplementation } })